From 0e2f048e4f4790ecc5e7a86bf035b4edc9a949d1 Mon Sep 17 00:00:00 2001 From: Syrent Date: Sun, 4 May 2025 17:55:34 +0330 Subject: [PATCH 01/67] wip --- .../org/sayandev/sayanvanish/api/BasicUser.kt | 55 -- .../org/sayandev/sayanvanish/api/Platform.kt | 1 + .../org/sayandev/sayanvanish/api/Queue.kt | 16 + .../sayanvanish/api/SayanVanishAPI.kt | 24 +- .../org/sayandev/sayanvanish/api/User.kt | 103 ++-- .../sayandev/sayanvanish/api/VanishUser.kt | 141 +++++ .../sayanvanish/api/database/Database.kt | 57 +- .../api/database/DatabaseConfig.kt | 17 +- .../api/database/TransactionDatabase.kt | 186 +++++++ .../api/database/TransactionType.kt | 35 ++ .../api/database/TransactionTypes.kt | 22 + .../api/database/redis/RedisDatabase.kt | 224 ++++---- .../sayanvanish/api/database/sql/SQLConfig.kt | 2 + .../api/database/sql/SQLDatabase.kt | 499 ++++++++---------- .../sayanvanish/api/feature/Feature.kt | 4 +- .../sayanvanish/api/feature/Features.kt | 6 +- .../sayanvanish/bukkit/VanishManager.kt | 8 +- .../{BukkitUser.kt => BukkitVanishUser.kt} | 18 +- .../bukkit/api/SayanVanishBukkitAPI.kt | 22 +- .../api/event/BukkitUserUnVanishEvent.kt | 4 +- .../bukkit/api/event/BukkitUserVanishEvent.kt | 4 +- .../bukkit/command/SayanVanishCommand.kt | 6 +- .../sayanvanish/bukkit/feature/HookFeature.kt | 4 +- .../bukkit/feature/features/FeatureState.kt | 5 +- .../features/hook/AdvancedServerListImpl.kt | 5 +- .../hook/FeatureHookMiniPlaceholders.kt | 5 +- .../hook/FeatureHookPlaceholderAPI.kt | 4 +- .../feature/features/hook/FeatureHookTAB.kt | 4 +- .../prevent/FeaturePreventTabComplete.kt | 6 +- .../sayanvanish/bungeecord/SayanVanish.kt | 4 +- .../sayanvanish/bungeecord/VanishManager.kt | 6 +- .../{BungeeUser.kt => BungeeVanishUser.kt} | 19 +- .../bungeecord/api/SayanVanishBungeeAPI.kt | 19 +- .../event/BungeeUserUnVanishEvent.kt | 4 +- .../bungeecord/event/BungeeUserVanishEvent.kt | 4 +- .../bungeecord/feature/HookFeature.kt | 4 +- .../feature/features/FeatureSyncEvents.kt | 2 +- .../prevent/FeaturePreventTabComplete.kt | 6 +- .../sayanvanish/velocity/SayanVanish.kt | 4 +- .../sayanvanish/velocity/VanishManager.kt | 6 +- .../velocity/api/SayanVanishVelocityAPI.kt | 19 +- ...{VelocityUser.kt => VelocityVanishUser.kt} | 18 +- .../event/VelocityUserUnVanishEvent.kt | 4 +- .../velocity/event/VelocityUserVanishEvent.kt | 4 +- .../velocity/feature/HookFeature.kt | 4 +- .../feature/features/FeatureSyncEvents.kt | 2 +- .../feature/features/FeatureUpdatePing.kt | 2 +- .../hook/FeatureHookAdvancedServerList.kt | 4 +- .../hook/FeatureHookMiniPlaceholders.kt | 8 +- .../feature/features/hook/FeatureHookTAB.kt | 4 +- .../prevent/FeaturePreventTabComplete.kt | 6 +- 51 files changed, 932 insertions(+), 708 deletions(-) delete mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/BasicUser.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/{BukkitUser.kt => BukkitVanishUser.kt} (94%) rename sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/{BungeeUser.kt => BungeeVanishUser.kt} (84%) rename sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/{VelocityUser.kt => VelocityVanishUser.kt} (88%) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/BasicUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/BasicUser.kt deleted file mode 100644 index 9584d623..00000000 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/BasicUser.kt +++ /dev/null @@ -1,55 +0,0 @@ -package org.sayandev.sayanvanish.api - -import com.google.gson.Gson -import com.google.gson.JsonObject -import com.google.gson.JsonParser -import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException -import java.util.* - -interface BasicUser { - - val uniqueId: UUID - var username: String - var serverId: String - - fun hasPermission(permission: String): Boolean { - throw UnsupportedPlatformException("hasPermission") - } - - fun hasPermission(permission: Permission): Boolean { - return hasPermission(permission.permission()) - } - - fun save() { - SayanVanishAPI.getInstance().database.addBasicUser(this) - } - - fun toJson(): String { - val json = JsonObject() - json.addProperty("unique-id", uniqueId.toString()) - json.addProperty("username", username) - json.addProperty("server-id", serverId) - return Gson().toJson(json) - } - - companion object { - @JvmStatic - fun fromJson(serialized: String): BasicUser { - val json = JsonParser.parseString(serialized).asJsonObject - val uniqueId = json.get("unique-id").asString - val username = json.get("username").asString - val serverId = json.get("server-id").asString - return create(UUID.fromString(uniqueId), username, serverId) - } - - @JvmStatic - fun create(uniqueId: UUID, username: String, serverId: String?): BasicUser { - return object : BasicUser { - override val uniqueId: UUID = uniqueId - override var username: String = username - override var serverId: String = serverId ?: Platform.get().serverId - } - } - } - -} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index 22654582..bae99f1f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -6,6 +6,7 @@ import java.util.logging.Logger data class Platform( val id: String, + val pluginName: String, val logger: Logger, var rootDirectory: File, var serverId: String, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt new file mode 100644 index 00000000..3bdaaec1 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt @@ -0,0 +1,16 @@ +package org.sayandev.sayanvanish.api + +import org.jetbrains.exposed.sql.Table +import java.util.UUID + +class Queue( + val uniqueId: UUID, + val vanished: Boolean, +) { + object Schema : Table("${Platform.get().pluginName.lowercase()}_queue") { + val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() + val vanished = bool("vanished").default(false) + + override val primaryKey = PrimaryKey(uniqueId) + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index 90f9a836..b389df8b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -6,8 +6,8 @@ import org.sayandev.sayanvanish.api.database.redis.RedisDatabase import org.sayandev.sayanvanish.api.database.sql.SQLDatabase import java.util.* -open class SayanVanishAPI(val type: Class) { - constructor(): this(User::class.java) +open class SayanVanishAPI(val type: Class) { + constructor(): this(VanishUser::class.java) var databaseConnected: Boolean = true @@ -39,11 +39,11 @@ open class SayanVanishAPI(val type: Class) { } init { - for (user in database.getUsers().filter { user -> user.serverId == Platform.get().serverId }) { + for (user in database.getVanishUsers().filter { user -> user.serverId == Platform.get().serverId }) { user.isOnline = false user.save() } - database.purgeBasic(Platform.get().serverId) + database.purgeUsers(Platform.get().serverId) } fun getPlatform(): Platform { @@ -51,11 +51,11 @@ open class SayanVanishAPI(val type: Class) { } fun isVanished(uniqueId: UUID, useCache: Boolean = true): Boolean { - return database.getUser(uniqueId, useCache)?.isVanished == true + return database.getVanishUser(uniqueId, useCache)?.isVanished == true } fun isVanished(uniqueId: UUID): Boolean { - return database.getUser(uniqueId, true)?.isVanished == true + return database.getVanishUser(uniqueId, true)?.isVanished == true } fun canSee(user: U?, target: U): Boolean { @@ -65,7 +65,7 @@ open class SayanVanishAPI(val type: Class) { } fun getUser(uniqueId: UUID, useCache: Boolean = true): U? { - return database.getUser(uniqueId, useCache) + return database.getVanishUser(uniqueId, useCache) } fun getUser(uniqueId: UUID): U? { @@ -73,11 +73,11 @@ open class SayanVanishAPI(val type: Class) { } fun getOnlineUsers(): List { - return database.getUsers().filter { it.isOnline } + return database.getVanishUsers().filter { it.isOnline } } fun getVanishedUsers(): List { - return database.getUsers().filter { it.isVanished } + return database.getVanishUsers().filter { it.isVanished } } private fun logDatabaseError() { @@ -89,15 +89,15 @@ open class SayanVanishAPI(val type: Class) { } companion object { - private val defaultInstance = SayanVanishAPI() + private val defaultInstance = SayanVanishAPI() @JvmStatic - fun getInstance(): SayanVanishAPI { + fun getInstance(): SayanVanishAPI { return defaultInstance } @JvmStatic - fun UUID.user(): User? { + fun UUID.user(): VanishUser? { return getInstance().getUser(this) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 40720cb6..894bc9c0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -3,105 +3,64 @@ package org.sayandev.sayanvanish.api import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParser -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.jetbrains.exposed.sql.Table import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import java.util.* -interface User : BasicUser { +interface User { - var currentOptions: VanishOptions - var isVanished: Boolean + val uniqueId: UUID + var username: String var isOnline: Boolean - var vanishLevel: Int + var serverId: String - fun vanish(options: VanishOptions) { - isVanished = true - save() + fun hasPermission(permission: String): Boolean { + throw UnsupportedPlatformException("hasPermission") } - fun vanish() { - vanish(VanishOptions.defaultOptions()) + fun hasPermission(permission: Permission): Boolean { + return hasPermission(permission.permission()) } - fun unVanish(options: VanishOptions) { - isVanished = false - save() - } - - fun unVanish() { - unVanish(VanishOptions.defaultOptions()) - } - - fun toggleVanish(options: VanishOptions) { - if (isVanished) unVanish(options) else vanish(options) - } - - fun toggleVanish() { - toggleVanish(VanishOptions.defaultOptions()) - } - - fun sendComponent(content: String, vararg placeholder: TagResolver) { - throw UnsupportedPlatformException("sendMessage") - } - - fun sendActionbar(content: String, vararg placeholder: TagResolver) { - throw UnsupportedPlatformException("sendActionbar") - } - - /** - * @param otherUser The user to check if this user can see - * */ - fun canSee(otherUser: User): Boolean { - if (!otherUser.isVanished) return true - if (this.uniqueId == otherUser.uniqueId) return true - val canSee = vanishLevel >= otherUser.vanishLevel - return canSee - } - - override fun save() { - serverId = Platform.get().serverId + suspend fun save() { SayanVanishAPI.getInstance().database.addUser(this) } - fun delete() { - SayanVanishAPI.getInstance().database.removeUser(uniqueId) - } - - override fun toJson(): String { + fun toJson(): String { val json = JsonObject() json.addProperty("unique-id", uniqueId.toString()) json.addProperty("username", username) - json.addProperty("is-vanished", isVanished) - json.addProperty("is-online", isOnline) - json.addProperty("vanish-level", vanishLevel) - json.addProperty("current-options", currentOptions.toJson()) + json.addProperty("server-id", serverId) return Gson().toJson(json) } + object Schema : Table("${Platform.get().pluginName.lowercase()}_users") { + val uniqueId = uuid("unique_id").uniqueIndex() + val username = varchar("username", 16) + val isOnline = bool("is_online").default(false) + val serverId = varchar("server_id", 36) + + override val primaryKey = PrimaryKey(uniqueId) + } + companion object { @JvmStatic fun fromJson(serialized: String): User { val json = JsonParser.parseString(serialized).asJsonObject val uniqueId = json.get("unique-id").asString val username = json.get("username").asString - val isVanished = json.get("is-vanished").asBoolean - val isOnline = json.get("is-online").asBoolean - val vanishLevel = json.get("vanish-level").asInt - val currentOptions = VanishOptions.fromJson(json.get("current-options").asString) - return object : User { - override val uniqueId = UUID.fromString(uniqueId) - override var username = username - override var isVanished = isVanished - override var isOnline = isOnline - override var vanishLevel = vanishLevel - override var currentOptions = currentOptions - override var serverId = Platform.get().id - } + val serverId = json.get("server-id").asString + return of(UUID.fromString(uniqueId), username, serverId) } - fun User.convert(to: Class): Any { - val instance = to.getDeclaredMethod("fromUser", User::class.java).invoke(null, this) - return instance + @JvmStatic + fun of(uniqueId: UUID, username: String, isOnline: Boolean, serverId: String?): User { + return object : User { + override val uniqueId: UUID = uniqueId + override var username: String = username + override var isOnline: Boolean = isOnline + override var serverId: String = serverId ?: Platform.get().serverId + } } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt new file mode 100644 index 00000000..7f453d56 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -0,0 +1,141 @@ +package org.sayandev.sayanvanish.api + +import com.google.gson.Gson +import com.google.gson.JsonObject +import com.google.gson.JsonParser +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.jetbrains.exposed.sql.Table +import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException +import java.util.* + +interface VanishUser : User { + var currentOptions: VanishOptions + var isVanished: Boolean + var vanishLevel: Int + + suspend fun vanish(options: VanishOptions) { + isVanished = true + save() + } + + suspend fun vanish() { + vanish(VanishOptions.defaultOptions()) + } + + suspend fun unVanish(options: VanishOptions) { + isVanished = false + save() + } + + suspend fun unVanish() { + unVanish(VanishOptions.defaultOptions()) + } + + suspend fun toggleVanish(options: VanishOptions) { + if (isVanished) unVanish(options) else vanish(options) + } + + suspend fun toggleVanish() { + toggleVanish(VanishOptions.defaultOptions()) + } + + fun sendComponent(content: String, vararg placeholder: TagResolver) + + fun sendActionbar(content: String, vararg placeholder: TagResolver) + + /** + * @param otherVanishUser The user to check if this user can see + * */ + fun canSee(otherVanishUser: VanishUser): Boolean { + if (!otherVanishUser.isVanished) return true + if (this.uniqueId == otherVanishUser.uniqueId) return true + val canSee = vanishLevel >= otherVanishUser.vanishLevel + return canSee + } + + override suspend fun save() { + serverId = Platform.get().serverId + SayanVanishAPI.getInstance().database.addVanishUser(this) + } + + suspend fun delete() { + SayanVanishAPI.getInstance().database.removeVanishUser(uniqueId) + } + + override fun toJson(): String { + val json = JsonObject() + json.addProperty("unique-id", uniqueId.toString()) + json.addProperty("username", username) + json.addProperty("is-online", isOnline) + json.addProperty("is-vanished", isVanished) + json.addProperty("vanish-level", vanishLevel) + json.addProperty("current-options", currentOptions.toJson()) + return Gson().toJson(json) + } + + object Schema : Table("${Platform.get().pluginName.lowercase()}_vanish_users") { + val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() + val isVanished = bool("is_vanished") + val vanishLevel = integer("vanish_level") + val currentOptions = varchar("current_options", 255) + + override val primaryKey = PrimaryKey(uniqueId) + } + + companion object { + @JvmStatic + fun fromJson(serialized: String): VanishUser { + val json = JsonParser.parseString(serialized).asJsonObject + + val uniqueId = json.get("unique-id").asString + val username = json.get("username").asString + val isOnline = json.get("is-online").asBoolean + val isVanished = json.get("is-vanished").asBoolean + val vanishLevel = json.get("vanish-level").asInt + val currentOptions = json.get("current-options").asString + + return of( + UUID.fromString(uniqueId), + username, + isVanished, + isOnline, + vanishLevel, + VanishOptions.fromJson(currentOptions) + ) + } + + fun of( + uniqueId: UUID, + username: String, + serverId: String = Platform.get().serverId, + isVanished: Boolean = false, + isOnline: Boolean = false, + vanishLevel: Int = 1, + currentOptions: VanishOptions = VanishOptions.defaultOptions() + ): VanishUser { + return object : VanishUser { + override val uniqueId: UUID = uniqueId + override var username: String = username + override var serverId: String = serverId + override var currentOptions: VanishOptions = currentOptions + override var isVanished: Boolean = isVanished + override var isOnline: Boolean = isOnline + override var vanishLevel: Int = vanishLevel + override fun sendComponent( + content: String, + vararg placeholder: TagResolver + ) { + throw UnsupportedPlatformException("sendComponent") + } + + override fun sendActionbar( + content: String, + vararg placeholder: TagResolver + ) { + throw UnsupportedPlatformException("sendActionbar") + } + } + } + } + +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt index 13f949cf..6ae8aa5a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt @@ -1,53 +1,42 @@ package org.sayandev.sayanvanish.api.database -import org.sayandev.sayanvanish.api.BasicUser +import kotlinx.coroutines.Deferred import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser import java.util.* -interface Database { +interface Database { - var cache: MutableMap - var useCache: Boolean + suspend fun initialize(): Deferred - fun initialize() + suspend fun connect(): Deferred - fun connect() + suspend fun disconnect(): Deferred - fun disconnect() + suspend fun addVanishUser(vanishUser: VanishUser): Deferred - fun addUser(user: U) + suspend fun hasVanishUser(uniqueId: UUID): Deferred - fun hasUser(uniqueId: UUID): Boolean + suspend fun updateVanishUser(vanishUser: VanishUser): Deferred - fun updateUser(user: U) + suspend fun removeVanishUser(uniqueId: UUID): Deferred - fun removeUser(uniqueId: UUID) + suspend fun getVanishUser(uniqueId: UUID): Deferred - fun getUser(uniqueId: UUID, useCache: Boolean = true): U? + suspend fun getVanishUsers(): Deferred> - fun getUser(uniqueId: UUID): U? { - return getUser(uniqueId, true) - } + suspend fun getUsers(): Deferred> - fun getUsers(): List - fun getUsersAsync(result: (List) -> Unit) + suspend fun addUser(user: User): Deferred + suspend fun hasUser(uniqueId: UUID): Deferred + suspend fun updateUser(user: User): Deferred + suspend fun removeUser(uniqueId: UUID): Deferred - fun getBasicUsers(useCache: Boolean): List - fun getBasicUsersAsync(result: (List) -> Unit) - - fun addBasicUser(user: BasicUser) - fun hasBasicUser(uniqueId: UUID, useCache: Boolean): Boolean - fun updateBasicUser(user: BasicUser) - fun removeBasicUser(uniqueId: UUID) - - fun isInQueue(uniqueId: UUID, result: (Boolean) -> Unit) - fun addToQueue(uniqueId: UUID, vanished: Boolean) - fun getFromQueue(uniqueId: UUID, result: (Boolean) -> Unit) - fun removeFromQueue(uniqueId: UUID) - - fun purge() - fun purgeCache() - fun purgeBasic() - fun purgeBasic(serverId: String) + suspend fun isInQueue(uniqueId: UUID): Deferred + suspend fun addToQueue(uniqueId: UUID, vanished: Boolean): Deferred + suspend fun getFromQueue(uniqueId: UUID): Deferred + suspend fun removeFromQueue(uniqueId: UUID): Deferred + suspend fun purgeAllTables(): Deferred + suspend fun purgeUsers(): Deferred } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt index ab4dc9ed..6cd01c75 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt @@ -6,21 +6,24 @@ import org.sayandev.sayanvanish.api.database.sql.SQLConfig import org.sayandev.stickynote.core.configuration.Config import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment +import org.spongepowered.configurate.serialize.TypeSerializer +import org.spongepowered.configurate.serialize.TypeSerializerCollection import java.io.File public var databaseConfig = DatabaseConfig.fromConfig() ?: DatabaseConfig.defaultConfig() @ConfigSerializable class DatabaseConfig( + val sqlDispatcherThreadCount: Int = 5, + val redisDispatcherThreadCount: Int = 5, @Comment("Configuration for the database, including method, SQL, Redis, and caching options.") val method: DatabaseMethod = DatabaseMethod.SQL, @Comment("Configuration for SQL database") val sql: SQLConfig = SQLConfig(), @Comment("Configuration for Redis database") val redis: RedisConfig = RedisConfig(), - @Comment("Whether to use cache when available") - val useCacheWhenAvailable: Boolean = true, -) : Config(Platform.get().rootDirectory, fileName) { + val transactionTypes: List = TransactionTypes.entries, +) : Config(Platform.get().rootDirectory, fileName, serializers()) { companion object { private val fileName = "database.yml" @@ -31,7 +34,13 @@ class DatabaseConfig( @JvmStatic fun fromConfig(): DatabaseConfig? { - return fromConfig(File(Platform.get().rootDirectory, fileName)) + return fromConfig(File(Platform.get().rootDirectory, fileName), serializers()) + } + + fun serializers(): TypeSerializerCollection { + return TypeSerializerCollection.builder() + .register(TransactionType::class.java, TransactionType.Serializer) + .build() } } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt new file mode 100644 index 00000000..e26fe71c --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt @@ -0,0 +1,186 @@ +package org.sayandev.sayanvanish.api.database + +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.isActive +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.database.redis.RedisDatabase +import org.sayandev.sayanvanish.api.database.sql.SQLDatabase +import java.util.* + +class TransactionDatabase: Database { + + val databaseTypes = mutableMapOf() + var databaseConnected: Boolean = true + + override suspend fun initialize(): Deferred { + val transactionMethods = databaseConfig.transactionTypes.map { it.method }.distinct() + for (method in transactionMethods) { + when (method) { + DatabaseMethod.SQL -> { + databaseTypes[DatabaseMethod.SQL] = try { + SQLDatabase(databaseConfig).apply { + this.connect() + this.initialize() + } + } catch (e: Exception) { + databaseConnected = false + logDatabaseError() + throw e + } + } + DatabaseMethod.REDIS -> { + databaseTypes[DatabaseMethod.REDIS] = try { + RedisDatabase(databaseConfig).apply { + this.initialize() + this.connect() + } + } catch (e: Exception) { + databaseConnected = false + logDatabaseError() + throw e + } + } + } + } + return CompletableDeferred(true) + } + + override suspend fun connect(): Deferred { + return CompletableDeferred(databaseConnected) + } + + override suspend fun disconnect(): Deferred { + databaseTypes.forEach { (_, database) -> + database.disconnect() + } + return CompletableDeferred(true) + } + + override suspend fun addVanishUser(vanishUser: VanishUser): Deferred { + val database = database(TransactionTypes.ADD_VANISH_USER) + return database.addVanishUser(vanishUser) + } + + override suspend fun hasVanishUser(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.HAS_VANISH_USER) + return database.hasVanishUser(uniqueId) + } + + override suspend fun updateVanishUser(vanishUser: VanishUser): Deferred { + val database = database(TransactionTypes.UPDATE_VANISH_USER) + return database.updateVanishUser(vanishUser) + } + + override suspend fun removeVanishUser(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.REMOVE_VANISH_USER) + return database.removeVanishUser(uniqueId) + } + + override suspend fun getVanishUser(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.GET_VANISH_USER) + return database.getVanishUser(uniqueId) + } + + override suspend fun getVanishUsers(): Deferred> { + val database = database(TransactionTypes.GET_VANISH_USERS) + return database.getVanishUsers() + } + + override suspend fun getUsers(): Deferred> { + val database = database(TransactionTypes.GET_USERS) + return database.getUsers() + } + + override suspend fun addUser(user: User): Deferred { + val database = database(TransactionTypes.ADD_USER) + return database.addUser(user) + } + + override suspend fun hasUser(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.HAS_USER) + return database.hasUser(uniqueId) + } + + override suspend fun updateUser(user: User): Deferred { + val database = database(TransactionTypes.UPDATE_USER) + return database.updateUser(user) + } + + override suspend fun removeUser(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.REMOVE_USER) + return database.removeUser(uniqueId) + } + + override suspend fun isInQueue(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.IS_IN_QUEUE) + return database.isInQueue(uniqueId) + } + + override suspend fun addToQueue( + uniqueId: UUID, + vanished: Boolean + ): Deferred { + val database = database(TransactionTypes.ADD_TO_QUEUE) + return database.addToQueue(uniqueId, vanished) + } + + override suspend fun getFromQueue(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.GET_FROM_QUEUE) + return database.getFromQueue(uniqueId) + } + + override suspend fun removeFromQueue(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.REMOVE_FROM_QUEUE) + return database.removeFromQueue(uniqueId) + } + + override suspend fun purgeAllTables(): Deferred { + return CompletableDeferred().apply { + + } + } + + override suspend fun purgeUsers(): Deferred { + TODO("Not yet implemented") + } + + fun database(method: DatabaseMethod): Database { + return databaseTypes[method] ?: let { + val (fallbackMethod, fallbackDatabase) = databaseTypes.entries.first() + Platform.Companion.get().logger.warning("Tried to get a database of type $method, but it was not initialized. falling back to ${fallbackMethod} database method.") + fallbackDatabase + } + } + + fun database(transactionType: TransactionType): Database { + return database(transactionType.method) + } + + private fun logDatabaseError() { + Platform.Companion.get().logger.severe("Database connection failed. Disabling the plugin.") + Platform.Companion.get().logger.severe("Please check the following:") + Platform.Companion.get().logger.severe("- Make sure your database server is not misconfigured.") + Platform.Companion.get().logger.severe("- Make sure your database server is running.") + Platform.Companion.get().logger.severe("Here's the full error trace:") + } + + + fun async( + block: suspend CoroutineScope.() -> T + ): Deferred { + val session = CoroutineScope(redisDispatcher) + if (!session.isActive) { + return CompletableDeferred().apply { cancel() } + } + + return session.async(redisDispatcher, CoroutineStart.DEFAULT, block) + } + +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt new file mode 100644 index 00000000..880776ac --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt @@ -0,0 +1,35 @@ +package org.sayandev.sayanvanish.api.database + +import org.spongepowered.configurate.ConfigurationNode +import org.spongepowered.configurate.serialize.TypeSerializer +import java.lang.reflect.Type + +interface TransactionType { + val id: String + val method: DatabaseMethod + + object Serializer : TypeSerializer { + override fun deserialize( + type: Type, + node: ConfigurationNode + ): TransactionType { + return object : TransactionType { + override val id: String = node.node("id").string!! + override val method: DatabaseMethod = node.node("method").get(DatabaseMethod::class.java)!! + } + } + + override fun serialize( + type: Type, + obj: TransactionType?, + node: ConfigurationNode + ) { + if (obj == null) { + node.raw(null) + return + } + node.node("id").set(obj.id) + node.node("method").set(obj.method) + } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt new file mode 100644 index 00000000..3540b2de --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt @@ -0,0 +1,22 @@ +package org.sayandev.sayanvanish.api.database + +enum class TransactionTypes( + override val id: String, + override val method: DatabaseMethod, +) : TransactionType { + ADD_VANISH_USER("add_vanish_user", DatabaseMethod.SQL), + HAS_VANISH_USER("has_vanish_user", DatabaseMethod.SQL), + UPDATE_VANISH_USER("update_vanish_user", DatabaseMethod.SQL), + REMOVE_VANISH_USER("remove_vanish_user", DatabaseMethod.SQL), + GET_VANISH_USER("get_vanish_user", DatabaseMethod.SQL), + GET_VANISH_USERS("get_vanish_users", DatabaseMethod.SQL), + GET_USERS("get_users", DatabaseMethod.SQL), + ADD_USER("add_user", DatabaseMethod.SQL), + HAS_USER("has_user", DatabaseMethod.SQL), + UPDATE_USER("update_user", DatabaseMethod.SQL), + REMOVE_USER("remove_user", DatabaseMethod.SQL), + ADD_TO_QUEUE("add_to_queue", DatabaseMethod.SQL), + IS_IN_QUEUE("is_in_queue", DatabaseMethod.SQL), + GET_FROM_QUEUE("get_from_queue", DatabaseMethod.SQL), + REMOVE_FROM_QUEUE("remove_from_queue", DatabaseMethod.SQL), +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt index 45400473..e245d2bc 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt @@ -1,190 +1,182 @@ package org.sayandev.sayanvanish.api.database.redis -import org.sayandev.sayanvanish.api.BasicUser +import kotlinx.coroutines.* +import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.api.User.Companion.convert +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.database.Database +import org.sayandev.sayanvanish.api.database.DatabaseConfig +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import redis.clients.jedis.DefaultJedisClientConfig import redis.clients.jedis.HostAndPort import redis.clients.jedis.JedisPooled import java.util.* import java.util.concurrent.Executors -import kotlin.reflect.safeCast +class RedisDatabase( + val config: DatabaseConfig, +) : Database { -class RedisDatabase( - val config: RedisConfig, - val type: Class, - override var useCache: Boolean = true -) : Database { - - override var cache = mutableMapOf() - var basicCache = mutableMapOf() + private val redisDispatcher = + AsyncDispatcher( + "${Platform.get().pluginName.lowercase()}-redis-thread", + config.redisDispatcherThreadCount, + ) private val thread = Executors.newSingleThreadExecutor() lateinit var redis: JedisPooled - override fun initialize() { - redis = when (config.type) { + override suspend fun initialize(): Deferred { + redis = when (config.redis.type) { RedisConfig.RedisType.STANDALONE -> { - val address = HostAndPort(config.standalone.host, config.standalone.port) - val config = DefaultJedisClientConfig.builder().apply { - if (config.standalone.user.isNotEmpty()) { - user(config.standalone.user) + val address = HostAndPort(config.redis.standalone.host, config.redis.standalone.port) + JedisPooled(address, DefaultJedisClientConfig.builder().apply { + if (config.redis.standalone.user.isNotEmpty()) { + user(config.redis.standalone.user) } - if (config.standalone.password.isNotEmpty()) { - password(config.standalone.password) + if (config.redis.standalone.password.isNotEmpty()) { + password(config.redis.standalone.password) } - if (config.standalone.ssl) { - ssl(config.standalone.ssl) + if (config.redis.standalone.ssl) { + ssl(config.redis.standalone.ssl) } - }.build() - JedisPooled(address, config) + }.build()) } } + return CompletableDeferred(true) } - override fun connect() { + override suspend fun connect(): Deferred { + return CompletableDeferred(true) } - override fun disconnect() { + override suspend fun disconnect(): Deferred { redis.close() + return CompletableDeferred(true) } - override fun getUser(uniqueId: UUID, useCache: Boolean): U? { - val cacheUser = cache[uniqueId] - if (this.useCache && useCache) { - if (cacheUser == null) { - return null - } - return (type.kotlin.safeCast(cacheUser) as? U) ?: (cacheUser.convert(type) as U) - } - - val user = redis.hget("users", uniqueId.toString()) - return if (user != null) { - val user = User.fromJson(user) - val typedUser = (type.kotlin.safeCast(user) as? U) ?: (user.convert(type) as U) - cache[uniqueId] = typedUser - typedUser - } else { - null + override suspend fun getVanishUser(uniqueId: UUID): Deferred { + return async { + redis + .hget("vanish_users", uniqueId.toString()) + ?.let { + VanishUser.fromJson(it) + } } } - override fun getUsersAsync(result: (List) -> Unit) { - thread.submit { - val users = getUsers() - result(users) + override suspend fun getVanishUsers(): Deferred> { + return async { + redis + .hgetAll("vanish_users") + .map { + VanishUser.fromJson(it.value) + } } } - override fun getUsers(): List { - if (useCache) { - return cache.values.toList() - } - - val users = redis.hgetAll("users") - return users.map { - val user = User.fromJson(it.value) - (type.kotlin.safeCast(user) as? U) ?: (user.convert(type) as U) + override suspend fun getUsers(): Deferred> { + return async { + redis + .hgetAll("users") + .map { User.fromJson(it.value) } } } - override fun getBasicUsers(useCache: Boolean): List { - if (useCache) { - return basicCache.values.toList() + override suspend fun addVanishUser(user: VanishUser): Deferred { + return async { + redis.hset("vanish_users", user.uniqueId.toString(), user.toJson()) != 0L } - - val users = redis.hgetAll("basic_users") - return users.map { BasicUser.fromJson(it.value) } } - override fun getBasicUsersAsync(result: (List) -> Unit) { - thread.submit { - val users = getBasicUsers(true) - result(users) + override suspend fun hasVanishUser(uniqueId: UUID): Deferred { + return async { + redis.hexists("vanish_users", uniqueId.toString()) } } - override fun addUser(user: U) { - cache[user.uniqueId] = user - redis.hset("users", user.uniqueId.toString(), user.toJson()) - } - - override fun addBasicUser(user: BasicUser) { - basicCache[user.uniqueId] = user - redis.hset("basic_users", user.uniqueId.toString(), user.toJson()) - } - - override fun hasUser(uniqueId: UUID): Boolean { - return redis.hexists("users", uniqueId.toString()) + override suspend fun addUser(user: User): Deferred { + return async { + redis.hset("users", user.uniqueId.toString(), user.toJson()) != 0L + } } - override fun hasBasicUser(uniqueId: UUID, useCache: Boolean): Boolean { - if (useCache) { - return basicCache.contains(uniqueId) + override suspend fun hasUser(uniqueId: UUID): Deferred { + return async { + redis.hexists("users", uniqueId.toString()) } - return redis.hexists("basic_users", uniqueId.toString()) } - override fun removeUser(uniqueId: UUID) { - cache.remove(uniqueId) - redis.hdel("users", uniqueId.toString()) + override suspend fun removeVanishUser(uniqueId: UUID): Deferred { + return async { + redis.hdel("vanish_users", uniqueId.toString()) != 0L + } } - override fun removeBasicUser(uniqueId: UUID) { - basicCache.remove(uniqueId) - redis.hdel("basic_users", uniqueId.toString()) + override suspend fun removeUser(uniqueId: UUID): Deferred { + return async { + redis.hdel("users", uniqueId.toString()) != 0L + } } - override fun updateUser(user: U) { - cache[user.uniqueId] = user - addUser(user) + override suspend fun updateVanishUser(user: VanishUser): Deferred { + return addVanishUser(user) } - override fun updateBasicUser(user: BasicUser) { - basicCache[user.uniqueId] = user - addBasicUser(user) + override suspend fun updateUser(user: User): Deferred { + return addUser(user) } - override fun isInQueue(uniqueId: UUID, result: (Boolean) -> Unit) { - thread.submit { - redis.get("queue:$uniqueId")?.let { result(true) } ?: result(false) + override suspend fun isInQueue(uniqueId: UUID): Deferred { + return async { + redis.get("queue:$uniqueId")?.toBoolean() ?: false } } - override fun addToQueue(uniqueId: UUID, vanished: Boolean) { - redis.set("queue:$uniqueId", vanished.toString()) + override suspend fun addToQueue(uniqueId: UUID, vanished: Boolean): Deferred { + return async { + redis.set("queue:$uniqueId", vanished.toString()) != null + } } - override fun removeFromQueue(uniqueId: UUID) { - redis.del("queue:$uniqueId") + override suspend fun removeFromQueue(uniqueId: UUID): Deferred { + return async { + redis.del("queue:$uniqueId") != 0L + } } - override fun getFromQueue(uniqueId: UUID, result: (Boolean) -> Unit) { - thread.submit { - redis.get("queue:$uniqueId")?.let { result(it.toBoolean()) } ?: result(false) + override suspend fun getFromQueue(uniqueId: UUID): Deferred { + return async { + redis.get("queue:$uniqueId")?.toBoolean() ?: false } } - override fun purgeCache() { - cache.clear() - basicCache.clear() + override suspend fun purgeAllTables(): Deferred { + return async { + redis.del("users") + redis.del("basic_users") + redis.del("queue") + true + } } - override fun purge() { - redis.del("users") - redis.del("basic_users") - redis.del("queue") + override suspend fun purgeUsers(): Deferred { + return async { + redis.del("basic_users") + redis.del("queue") + true + } } - override fun purgeBasic() { - redis.del("basic_users") - redis.del("queue") - } + fun async( + block: suspend CoroutineScope.() -> T + ): Deferred { + val session = CoroutineScope(redisDispatcher) + if (!session.isActive) { + return CompletableDeferred().apply { cancel() } + } - override fun purgeBasic(serverId: String) { - redis.hdel("basic_users", serverId) + return session.async(redisDispatcher, CoroutineStart.DEFAULT, block) } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt index f0f0a41c..c9a9e4f1 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt @@ -41,10 +41,12 @@ class SQLConfig( val verifyServerCertificate: Boolean = false, @Comment("Whether to allow public key retrieval") val allowPublicKeyRetrieval: Boolean = true, + val maxLifetime: Long = 1800000, ) enum class SQLMethod { MYSQL, + MARIADB, SQLITE } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt index 4a44fdf1..6b62d515 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt @@ -1,342 +1,279 @@ package org.sayandev.sayanvanish.api.database.sql -import org.sayandev.sayanvanish.api.BasicUser +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.awaitAll +import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.transactions.TransactionManager +import org.jetbrains.exposed.sql.transactions.experimental.suspendedTransactionAsync import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.Queue import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.api.User.Companion.convert -import org.sayandev.sayanvanish.api.VanishOptions +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.database.Database -import org.sayandev.sayanvanish.api.database.DatabaseMethod -import org.sayandev.stickynote.core.database.Query -import org.sayandev.stickynote.core.database.mysql.MySQLCredentials -import org.sayandev.stickynote.core.database.mysql.MySQLDatabase -import org.sayandev.stickynote.core.database.sqlite.SQLiteDatabase -import java.io.File +import org.sayandev.sayanvanish.api.database.DatabaseConfig +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import java.util.* -import kotlin.reflect.safeCast - -class SQLDatabase( - val config: SQLConfig, - val type: Class, - override var useCache: Boolean = true -) : Database { - - override var cache = mutableMapOf() - var basicCache = mutableMapOf() - val database: org.sayandev.stickynote.core.database.Database = when (config.method) { - SQLConfig.SQLMethod.MYSQL -> { - MySQLDatabase( - MySQLCredentials.Companion.mySQLCredentials(config.host, config.port, config.database, config.poolProperties.useSSL, config.username, config.password), - config.poolProperties.maximumPoolSize, - config.poolProperties.verifyServerCertificate, - let { - try { - Class.forName("com.mysql.cj.jdbc.Driver") - "com.mysql.cj.jdbc.Driver" - } catch (e: ClassNotFoundException) { - Class.forName("com.mysql.jdbc.Driver") - "com.mysql.jdbc.Driver" - } - }, - config.poolProperties.keepaliveTime, - config.poolProperties.connectionTimeout, - config.poolProperties.minimumIdle, - config.poolProperties.maximumLifetime, - config.poolProperties.allowPublicKeyRetrieval - ) - } - SQLConfig.SQLMethod.SQLITE -> { - SQLiteDatabase( - File(Platform.get().rootDirectory, "storage.db"), Platform.get().logger, config.poolProperties.maximumPoolSize) - } - else -> { - throw NullPointerException("Database method with id `${config.method.name}` doesn't exist, available database types: ${DatabaseMethod.entries.map { it.name.lowercase() }}") - } - } - - override fun initialize() { - database.runQuery(Query.query("CREATE TABLE IF NOT EXISTS ${config.tablePrefix}users (UUID VARCHAR(64),username VARCHAR(16),server VARCHAR(128),is_vanished INT,is_online INT,vanish_level INT,PRIMARY KEY (UUID));")).result?.close() - database.runQuery(Query.query("CREATE TABLE IF NOT EXISTS ${config.tablePrefix}basic_users (UUID VARCHAR(64),username VARCHAR(16),server VARCHAR(128),PRIMARY KEY (UUID));")).result?.close() - database.runQuery(Query.query("CREATE TABLE IF NOT EXISTS ${config.tablePrefix}queue (UUID VARCHAR(64), vanished VARCHAR(16),PRIMARY KEY (UUID));")).result?.close() +import java.util.concurrent.TimeUnit + +class SQLDatabase( + val config: DatabaseConfig, +) : Database { + private val databaseDispatcher = + AsyncDispatcher( + "${Platform.get().pluginName.lowercase()}-${config.sql.method}-thread", + config.sqlDispatcherThreadCount, + ) + + val tables = listOf( + User.Schema, + VanishUser.Schema, + Queue.Schema, + ) + + lateinit var database: org.jetbrains.exposed.sql.Database + + override suspend fun initialize(): Deferred { + SchemaUtils.createMissingTablesAndColumns( + *tables.toTypedArray(), + withLogs = false, + ) + return CompletableDeferred(true) } - override fun connect() { - cache.clear() - database.connect() + override suspend fun connect(): Deferred { + val hikariConfig = + HikariConfig().apply { + jdbcUrl = + when (config.sql.method) { + SQLConfig.SQLMethod.SQLITE -> "jdbc:sqlite:${Platform.get().rootDirectory.absolutePath}/database" + SQLConfig.SQLMethod.MARIADB -> "jdbc:mariadb://${config.sql.host}:${config.sql.port}/${config.sql.database}?autoReconnect=true" + SQLConfig.SQLMethod.MYSQL -> "jdbc:mysql://${config.sql.host}:${config.sql.port}/${config.sql.database}?autoReconnect=true" + } + driverClassName = + when (config.sql.method) { + SQLConfig.SQLMethod.SQLITE -> "org.sqlite.JDBC" + SQLConfig.SQLMethod.MARIADB -> "org.mariadb.jdbc.Driver" + SQLConfig.SQLMethod.MYSQL -> "com.mysql.cj.jdbc.Driver" + } + username = config.sql.username + password = config.sql.password + maximumPoolSize = config.sql.poolProperties.maximumPoolSize + this.minimumIdle = config.sql.poolProperties.minimumIdle + this.keepaliveTime = config.sql.poolProperties.keepaliveTime + if (config.sql.method != SQLConfig.SQLMethod.SQLITE) { + this.connectionTimeout = config.sql.poolProperties.connectionTimeout + } + this.maxLifetime = config.sql.poolProperties.maxLifetime + + this.addDataSourceProperty("socketTimeout", TimeUnit.SECONDS.toMillis(30).toString()) + this.addDataSourceProperty("cachePrepStmts", "true") + this.addDataSourceProperty("prepStmtCacheSize", "250") + this.addDataSourceProperty("prepStmtCacheSqlLimit", "2048") + this.addDataSourceProperty("useServerPrepStmts", "true") + this.addDataSourceProperty("useLocalSessionState", "true") + this.addDataSourceProperty("rewriteBatchedStatements", "true") + this.addDataSourceProperty("cacheResultSetMetadata", "true") + this.addDataSourceProperty("cacheServerConfiguration", "true") + this.addDataSourceProperty("elideSetAutoCommits", "true") + this.addDataSourceProperty("maintainTimeStats", "false") + this.addDataSourceProperty("alwaysSendSetIsolation", "false") + this.addDataSourceProperty("cacheCallableStmts", "true") + this.addDataSourceProperty("characterEncoding", "utf8") + this.addDataSourceProperty("allowPublicKeyRetrieval", "true") + } + val dataSource = HikariDataSource(hikariConfig) + database = org.jetbrains.exposed.sql.Database.connect(dataSource) + TransactionManager.defaultDatabase = database + return CompletableDeferred(true) } - override fun disconnect() { - database.shutdown() - cache.clear() + override suspend fun disconnect(): Deferred { + TransactionManager.closeAndUnregister(database) + return CompletableDeferred(true) } - override fun getUser(uniqueId: UUID, useCache: Boolean): U? { - val cacheUser = cache[uniqueId] - if (this.useCache && useCache) { - if (cacheUser == null) { - return null - } - return (type.kotlin.safeCast(cacheUser) as? U) ?: (cacheUser.convert(type) as U) - } - - val result = database.runQuery(Query.query("SELECT * FROM ${config.tablePrefix}users WHERE UUID = ?;").setStatementValue(1, uniqueId.toString())).result ?: return null - if (!result.next()) return null - val user = object : User { - override val uniqueId: UUID = UUID.fromString(result.getString("UUID")) - override var username: String = result.getString("username") - override var serverId: String = result.getString("server") - override var currentOptions: VanishOptions = VanishOptions.defaultOptions() - - override var isVanished: Boolean = result.getBoolean("is_vanished") - override var isOnline: Boolean = result.getBoolean("is_online") - override var vanishLevel: Int = result.getInt("vanish_level") + override suspend fun getVanishUser(uniqueId: UUID): Deferred { + return async { + (VanishUser.Schema innerJoin User.Schema) + .selectAll() + .firstOrNull { it[VanishUser.Schema.uniqueId] == uniqueId } + ?.let { result -> + VanishUser.of( + result[VanishUser.Schema.uniqueId], + result[User.Schema.username], + result[User.Schema.serverId], + result[VanishUser.Schema.isVanished], + result[User.Schema.isOnline], + result[VanishUser.Schema.vanishLevel] + ) + } } - val typedUser = (type.kotlin.safeCast(user) as? U) ?: (user.convert(type) as U) - cache[uniqueId] = typedUser - result.close() - return typedUser } - override fun getUsersAsync(result: (List) -> Unit) { - database.queueQuery(Query.query("SELECT * FROM ${config.tablePrefix}users;")).completableFuture.whenComplete { resultSet, error -> - error?.printStackTrace() - - val users = mutableListOf() - while (resultSet.next()) { - val user = object : User { - override val uniqueId: UUID = UUID.fromString(resultSet.getString("UUID")) - override var username: String = resultSet.getString("username") - override var serverId: String = resultSet.getString("server") - override var currentOptions: VanishOptions = VanishOptions.defaultOptions() - - override var isVanished: Boolean = resultSet.getBoolean("is_vanished") - override var isOnline: Boolean = resultSet.getBoolean("is_online") - override var vanishLevel: Int = resultSet.getInt("vanish_level") + override suspend fun getVanishUsers(): Deferred> { + return async { + (VanishUser.Schema innerJoin User.Schema) + .selectAll() + .map { result -> + VanishUser.of( + result[VanishUser.Schema.uniqueId], + result[User.Schema.username], + result[User.Schema.serverId], + result[VanishUser.Schema.isVanished], + result[User.Schema.isOnline], + result[VanishUser.Schema.vanishLevel] + ) } - users.add((type.kotlin.safeCast(user) as? U) ?: (user.convert(type) as U)) - } - resultSet.close() - - result(users) } } - override fun getUsers(): List { - if (useCache) { - return cache.values.toList() - } - - val result = database.runQuery(Query.query("SELECT * FROM ${config.tablePrefix}users;")).result ?: return emptyList() - val users = mutableListOf() - while (result.next()) { - val user = object : User { - override val uniqueId: UUID = UUID.fromString(result.getString("UUID")) - override var username: String = result.getString("username") - override var serverId: String = result.getString("server") - override var currentOptions: VanishOptions = VanishOptions.defaultOptions() - - override var isVanished: Boolean = result.getBoolean("is_vanished") - override var isOnline: Boolean = result.getBoolean("is_online") - override var vanishLevel: Int = result.getInt("vanish_level") - } - users.add((type.kotlin.safeCast(user) as? U) ?: (user.convert(type) as U)) + override suspend fun getUsers(): Deferred> { + return async { + User.Schema + .selectAll() + .map { result -> + User.of( + result[User.Schema.uniqueId], + result[User.Schema.username], + result[User.Schema.isOnline], + result[User.Schema.serverId] + ) + } } - result.close() - - return users } - override fun getBasicUsers(useCache: Boolean): List { - if (useCache) { - return basicCache.values.toList() + override suspend fun addVanishUser(vanishUser: VanishUser): Deferred { + return async { + VanishUser.Schema.upsert { row -> + row[uniqueId] = vanishUser.uniqueId + row[isVanished] = vanishUser.isVanished + row[vanishLevel] = vanishUser.vanishLevel + }.isIgnore } - - val result = database.runQuery(Query.query("SELECT * FROM ${config.tablePrefix}basic_users;")).result ?: return emptyList() - val users = mutableListOf() - while (result.next()) { - val user = BasicUser.create( - UUID.fromString(result.getString("UUID")), - result.getString("username"), - result.getString("server") - ) - users.add(user) - } - result.close() - - return users } - override fun getBasicUsersAsync(result: (List) -> Unit) { - database.queueQuery(Query.query("SELECT * FROM ${config.tablePrefix}basic_users;")).completableFuture.whenComplete { resultSet, error -> - error?.printStackTrace() - - val users = mutableListOf() - while (resultSet.next()) { - val user = BasicUser.create( - UUID.fromString(resultSet.getString("UUID")), - resultSet.getString("username"), - resultSet.getString("server") - ) - users.add(user) - } - resultSet.close() - - result(users) + override suspend fun addUser(user: User): Deferred { + return async { + User.Schema.upsert { row -> + row[uniqueId] = user.uniqueId + row[username] = user.username + row[serverId] = user.serverId + row[isOnline] = user.isOnline + }.isIgnore } } - override fun addUser(user: U) { - cache[user.uniqueId] = user - if (!hasUser(user.uniqueId)) { - val insertQuery = if (config.method == SQLConfig.SQLMethod.SQLITE) { - "INSERT OR REPLACE INTO ${config.tablePrefix}users (UUID, username, server, is_vanished, is_online, vanish_level) VALUES (?,?,?,?,?,?);" - } else { - "INSERT IGNORE INTO ${config.tablePrefix}users (UUID, username, server, is_vanished, is_online, vanish_level) VALUES (?,?,?,?,?,?);" - } - - database.runQuery( - Query.query(insertQuery) - .setStatementValue(1, user.uniqueId.toString()) - .setStatementValue(2, user.username) - .setStatementValue(3, user.serverId) - .setStatementValue(4, user.isVanished) - .setStatementValue(5, user.isOnline) - .setStatementValue(6, user.vanishLevel) - ).result?.close() - } else { - updateUser(user) + override suspend fun hasVanishUser(uniqueId: UUID): Deferred { + return async { + VanishUser.Schema + .selectAll() + .any { it[VanishUser.Schema.uniqueId] == uniqueId } } } - override fun addBasicUser(user: BasicUser) { - basicCache[user.uniqueId] = user - if (!hasBasicUser(user.uniqueId, false)) { - // Create proper query based on database type - val insertQuery = if (config.method == SQLConfig.SQLMethod.SQLITE) { - "INSERT OR REPLACE INTO ${config.tablePrefix}basic_users (UUID, username, server) VALUES (?,?,?);" - } else { - "INSERT IGNORE INTO ${config.tablePrefix}basic_users (UUID, username, server) VALUES (?,?,?);" - } - - database.runQuery( - Query.query(insertQuery) - .setStatementValue(1, user.uniqueId.toString()) - .setStatementValue(2, user.username) - .setStatementValue(3, user.serverId) - ).result?.close() - } else { - if (user.serverId != Platform.get().serverId) { - updateBasicUser(user) - } + override suspend fun hasUser(uniqueId: UUID): Deferred { + return async { + User.Schema + .selectAll() + .any { it[User.Schema.uniqueId] == uniqueId } } } - override fun hasUser(uniqueId: UUID): Boolean { - val queryResult = database.runQuery(Query.query("SELECT * FROM ${config.tablePrefix}users WHERE UUID = ?;").setStatementValue(1, uniqueId.toString())) - val result = queryResult.result ?: return false - val hasNext = result.next() - result.close() - return hasNext - } - - override fun hasBasicUser(uniqueId: UUID, useCache: Boolean): Boolean { - if (useCache) { - return basicCache.contains(uniqueId) + override suspend fun removeVanishUser(uniqueId: UUID): Deferred { + return async { + VanishUser.Schema + .deleteWhere { VanishUser.Schema.uniqueId eq uniqueId } + true } - val queryResult = database.runQuery(Query.query("SELECT * FROM ${config.tablePrefix}basic_users WHERE UUID = ?;").setStatementValue(1, uniqueId.toString())) - val result = queryResult.result ?: return false - val hasNext = result.next() - result.close() - return hasNext } - override fun removeUser(uniqueId: UUID) { - cache.remove(uniqueId) - database.runQuery(Query.query("DELETE FROM ${config.tablePrefix}users WHERE UUID = ?;").setStatementValue(1, uniqueId.toString())).result?.close() - } - - override fun removeBasicUser(uniqueId: UUID) { - basicCache.remove(uniqueId) - database.runQuery(Query.query("DELETE FROM ${config.tablePrefix}basic_users WHERE UUID = ?;").setStatementValue(1, uniqueId.toString())).result?.close() - } - - override fun updateUser(user: U) { - cache[user.uniqueId] = user - database.runQuery( - Query.query("UPDATE ${config.tablePrefix}users SET username = ?, is_vanished = ?, is_online = ?, vanish_level = ? WHERE UUID = ?;") - .setStatementValue(1, user.username) - .setStatementValue(2, user.isVanished) - .setStatementValue(3, user.isOnline) - .setStatementValue(4, user.vanishLevel) - .setStatementValue(5, user.uniqueId.toString()) - ).result?.close() + override suspend fun removeUser(uniqueId: UUID): Deferred { + return async { + User.Schema + .deleteWhere { User.Schema.uniqueId eq uniqueId } + true + } } - override fun updateBasicUser(user: BasicUser) { - basicCache[user.uniqueId] = user - database.runQuery( - Query.query("UPDATE ${config.tablePrefix}basic_users SET username = ?, server = ? WHERE UUID = ?;") - .setStatementValue(1, user.username) - .setStatementValue(2, user.serverId) - .setStatementValue(3, user.uniqueId.toString()) - ).result?.close() + override suspend fun updateVanishUser(user: VanishUser): Deferred { + return async { + VanishUser.Schema.upsert { row -> + row[uniqueId] = user.uniqueId + row[isVanished] = user.isVanished + row[vanishLevel] = user.vanishLevel + row[currentOptions] = user.currentOptions.toJson() + }.isIgnore + } } - override fun isInQueue(uniqueId: UUID, inQueue: (Boolean) -> Unit) { - database.queueQuery(Query.query("SELECT * FROM ${config.tablePrefix}queue WHERE UUID = ?;").setStatementValue(1, uniqueId.toString())).completableFuture.whenComplete { result, error -> - error?.printStackTrace() - - val hasNext = result.next() - inQueue(hasNext) + override suspend fun updateUser(user: User): Deferred { + return async { + User.Schema.upsert { row -> + row[uniqueId] = user.uniqueId + row[username] = user.username + row[serverId] = user.serverId + row[isOnline] = user.isOnline + }.isIgnore } } - override fun addToQueue(uniqueId: UUID, vanished: Boolean) { - isInQueue(uniqueId) { inQueue -> - if (!inQueue) { - val insertQuery = if (config.method == SQLConfig.SQLMethod.SQLITE) { - "INSERT OR REPLACE INTO ${config.tablePrefix}queue (UUID, vanished) VALUES (?,?);" - } else { - "INSERT IGNORE INTO ${config.tablePrefix}queue (UUID, vanished) VALUES (?,?);" - } - database.queueQuery(Query.query(insertQuery).setStatementValue(1, uniqueId.toString()).setStatementValue(2, vanished.toString())) - } else { - database.queueQuery(Query.query("UPDATE ${config.tablePrefix}queue SET vanished = ? WHERE UUID = ?;").setStatementValue(1, vanished.toString()).setStatementValue(2, uniqueId.toString())) - } + override suspend fun isInQueue(uniqueId: UUID): Deferred { + return async { + Queue.Schema + .selectAll() + .any { it[Queue.Schema.uniqueId] == uniqueId } } } - override fun getFromQueue(uniqueId: UUID, result: (Boolean) -> Unit) { - database.queueQuery(Query.query("SELECT * FROM ${config.tablePrefix}queue WHERE UUID = ?;").setStatementValue(1, uniqueId.toString())).completableFuture.whenComplete { resultSet, error -> - error?.printStackTrace() - - if (!resultSet.next()) result(false) - result(resultSet.getString("vanished").toBoolean()) + override suspend fun addToQueue(uniqueId: UUID, vanished: Boolean): Deferred { + return async { + Queue.Schema.upsert { row -> + row[Queue.Schema.uniqueId] = uniqueId + row[Queue.Schema.vanished] = vanished + }.isIgnore } } - override fun removeFromQueue(uniqueId: UUID) { - database.queueQuery(Query.query("DELETE FROM ${config.tablePrefix}queue WHERE UUID = ?;").setStatementValue(1, uniqueId.toString())) + override suspend fun getFromQueue(uniqueId: UUID): Deferred { + return async { + Queue.Schema + .selectAll() + .where { Queue.Schema.uniqueId eq uniqueId } + .firstOrNull() + ?.getOrNull(Queue.Schema.vanished) ?: false + } } - override fun purgeCache() { - cache.clear() - basicCache.clear() + override suspend fun removeFromQueue(uniqueId: UUID): Deferred { + return async { + Queue.Schema + .deleteWhere { Queue.Schema.uniqueId eq uniqueId } + true + } } - override fun purge() { - database.runQuery(Query.query("DELETE FROM ${config.tablePrefix}users;")).result?.close() - database.runQuery(Query.query("DELETE FROM ${config.tablePrefix}basic_users;")).result?.close() - database.runQuery(Query.query("DELETE FROM ${config.tablePrefix}queue;")).result?.close() + override suspend fun purgeAllTables(): Deferred { + tables.map { table -> async { table.deleteAll() } }.awaitAll() + return CompletableDeferred(true) } - override fun purgeBasic() { - database.runQuery(Query.query("DELETE FROM ${config.tablePrefix}basic_users;")).result?.close() - database.runQuery(Query.query("DELETE FROM ${config.tablePrefix}queue;")).result?.close() + override suspend fun purgeUsers(): Deferred { + return async { + User.Schema.deleteAll() + true + } } - override fun purgeBasic(serverId: String) { - database.runQuery(Query.query("DELETE FROM ${config.tablePrefix}basic_users WHERE server = ?;").setStatementValue(1, serverId)).result?.close() + suspend fun async(statement: suspend Transaction.() -> T): Deferred { + return suspendedTransactionAsync( + databaseDispatcher, + database, + statement = statement, + ) } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt index 571b8135..d86b5d3a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.api.feature -import org.sayandev.sayanvanish.api.BasicUser +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.core.configuration.Config @@ -26,7 +26,7 @@ abstract class Feature( return enabled && condition } - open fun isActive(user: BasicUser): Boolean { + open fun isActive(user: User): Boolean { return !user.hasPermission("sayanvanish.feature.disable.${id}") && Features.userFeatures(user).find { it.id == this.id }?.enabled != false && isActive() } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt index 2fc9cbf7..d3d2310d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.api.feature -import org.sayandev.sayanvanish.api.BasicUser +import org.sayandev.sayanvanish.api.User import java.util.UUID object Features { @@ -18,7 +18,7 @@ object Features { } @JvmStatic - inline fun getUserFeature(user: BasicUser): T { + inline fun getUserFeature(user: User): T { return getUserFeature(user.uniqueId) } @@ -32,7 +32,7 @@ object Features { return features } - fun userFeatures(user: BasicUser): List { + fun userFeatures(user: User): List { return userFeatures.getOrPut(user.uniqueId) { features() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt index 0b8aee48..91c30260 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt @@ -5,7 +5,7 @@ import org.bukkit.event.EventPriority import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent -import org.sayandev.sayanvanish.api.BasicUser +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.config.settings @@ -22,7 +22,7 @@ object VanishManager : Listener { if (settings.general.proxyMode) return val player = event.player - SayanVanishAPI.getInstance().database.addBasicUser(BasicUser.create(player.uniqueId, player.name, null)) + SayanVanishAPI.getInstance().database.addUser(User.of(player.uniqueId, player.name, null)) } @EventHandler @@ -31,12 +31,12 @@ object VanishManager : Listener { val player = event.player SayanVanishAPI.getInstance().database.cache.remove(player.uniqueId) - SayanVanishAPI.getInstance().database.removeBasicUser(player.uniqueId) + SayanVanishAPI.getInstance().database.removeUser(player.uniqueId) } @EventHandler(priority = EventPriority.LOWEST) private fun hideVanishedPlayersOnJoin(event: PlayerJoinEvent) { - for (user in SayanVanishBukkitAPI.getInstance().database.getUsers().filter { it.isVanished && it.player() != null }) { + for (user in SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { it.isVanished && it.player() != null }) { user.hideUser(event.player) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt similarity index 94% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt rename to sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 6d4f800c..8cf2fff5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -9,7 +9,7 @@ import org.bukkit.metadata.FixedMetadataValue import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser @@ -29,10 +29,10 @@ import org.sayandev.stickynote.bukkit.server import org.sayandev.stickynote.bukkit.utils.ServerVersion import java.util.* -open class BukkitUser( +open class BukkitVanishUser( override val uniqueId: UUID, override var username: String -) : User { +) : VanishUser { override var serverId = settings.general.serverId override var currentOptions = VanishOptions.defaultOptions() @@ -40,7 +40,7 @@ open class BukkitUser( override var isOnline: Boolean = if (!settings.general.proxyMode) { Bukkit.getPlayer(uniqueId) != null } else { - SayanVanishAPI.getInstance().database.hasBasicUser(uniqueId, true) + SayanVanishAPI.getInstance().database.hasUser(uniqueId, true) } override var vanishLevel: Int = 0 get() = if (Features.getFeature().levelMethod == FeatureLevel.LevelMethod.PERMISSION) { @@ -184,11 +184,11 @@ open class BukkitUser( companion object { @JvmStatic - fun fromUser(user: User): BukkitUser { - return BukkitUser(user.uniqueId, user.username).apply { - this.isOnline = user.isOnline - this.isVanished = user.isVanished - this.vanishLevel = user.vanishLevel + fun fromUser(vanishUser: VanishUser): BukkitVanishUser { + return BukkitVanishUser(vanishUser.uniqueId, vanishUser.username).apply { + this.isOnline = vanishUser.isOnline + this.isVanished = vanishUser.isVanished + this.vanishLevel = vanishUser.vanishLevel } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt index 4c855986..5e90a188 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt @@ -3,11 +3,9 @@ package org.sayandev.sayanvanish.bukkit.api import org.bukkit.OfflinePlayer import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.database.databaseConfig -import org.sayandev.sayanvanish.bukkit.config.settings import java.util.* -class SayanVanishBukkitAPI : SayanVanishAPI(BukkitUser::class.java) { +class SayanVanishBukkitAPI : SayanVanishAPI(BukkitVanishUser::class.java) { fun canSee(player: Player?, otherPlayer: Player): Boolean { val vanishLevel = player?.getOrCreateUser()?.vanishLevel ?: -1 @@ -18,30 +16,30 @@ class SayanVanishBukkitAPI : SayanVanishAPI(BukkitUser::class.java) private val defaultInstance = SayanVanishBukkitAPI() @JvmStatic - fun getInstance(): SayanVanishAPI { + fun getInstance(): SayanVanishAPI { return defaultInstance } @JvmStatic - fun UUID.bukkitUser(): BukkitUser? { + fun UUID.bukkitUser(): BukkitVanishUser? { return getInstance().getUser(this) } @JvmStatic - fun OfflinePlayer.user(): BukkitUser? { - return getInstance().database.getUser(this.uniqueId) + fun OfflinePlayer.user(): BukkitVanishUser? { + return getInstance().database.getVanishUser(this.uniqueId) } @JvmStatic - fun OfflinePlayer.getOrCreateUser(): BukkitUser { - return getInstance().getUser(this.uniqueId) ?: BukkitUser(this.uniqueId, this.name ?: "N/A") + fun OfflinePlayer.getOrCreateUser(): BukkitVanishUser { + return getInstance().getUser(this.uniqueId) ?: BukkitVanishUser(this.uniqueId, this.name ?: "N/A") } @JvmStatic - fun OfflinePlayer.getOrAddUser(): BukkitUser { + fun OfflinePlayer.getOrAddUser(): BukkitVanishUser { return getInstance().getUser(this.uniqueId) ?: let { - val newUser = BukkitUser(this.uniqueId, this.name ?: "N/A") - getInstance().database.addUser(newUser) + val newUser = BukkitVanishUser(this.uniqueId, this.name ?: "N/A") + getInstance().database.addVanishUser(newUser) newUser } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt index 9cd8adf3..24e2a08c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt @@ -4,10 +4,10 @@ import org.bukkit.event.Cancellable import org.bukkit.event.Event import org.bukkit.event.HandlerList import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bukkit.api.BukkitUser +import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser class BukkitUserUnVanishEvent( - val user: BukkitUser, + val user: BukkitVanishUser, val options: VanishOptions, ) : Event(), Cancellable { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserVanishEvent.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserVanishEvent.kt index 1095636e..78e958ee 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserVanishEvent.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserVanishEvent.kt @@ -4,10 +4,10 @@ import org.bukkit.event.Cancellable import org.bukkit.event.Event import org.bukkit.event.HandlerList import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bukkit.api.BukkitUser +import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser class BukkitUserVanishEvent( - val user: BukkitUser, + val user: BukkitVanishUser, val options: VanishOptions, ) : Event(), Cancellable { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 7929159d..6fa9f421 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -31,8 +31,6 @@ import org.sayandev.sayanvanish.bukkit.config.LanguageConfig import org.sayandev.sayanvanish.bukkit.config.SettingsConfig import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.config.settings -import org.sayandev.sayanvanish.bukkit.feature.HookFeature -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureFakeMessage import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel import org.sayandev.sayanvanish.bukkit.feature.features.FeatureUpdate import org.sayandev.sayanvanish.bukkit.health.HealthCache @@ -472,7 +470,7 @@ class SayanVanishCommand : BukkitCommand(settings.command.name, *settings.comman database.useCache = false } - val users = database.getUsers() + val users = database.getVanishUsers() val limitedUsers = users.take(limit) @@ -516,7 +514,7 @@ class SayanVanishCommand : BukkitCommand(settings.command.name, *settings.comman counter.start() sender.sendComponent("[${it + 1}] Trying ${amount} Get Users from data storage") repeat(amount) { - database.getUsers() + database.getVanishUsers() } counter.stop() sender.sendComponent("[${it + 1}] Took ${counter.get()}ms") diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt index 7f94ba3f..9268f3ba 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature -import org.sayandev.sayanvanish.api.BasicUser +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bukkit.hasPlugin import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -21,7 +21,7 @@ abstract class HookFeature( return super.isActive() && hasPlugin() } - override fun isActive(user: BasicUser): Boolean { + override fun isActive(user: User): Boolean { return super.isActive(user) && hasPlugin() } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index a1b2366e..a4529111 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -11,7 +11,6 @@ import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature @@ -77,7 +76,7 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { - for (vanishedUser in SayanVanishBukkitAPI.getInstance().database.getUsers().filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { + for (vanishedUser in SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { vanishedUser.sendComponent(language.vanish.joinedTheServerWhileVanished, Placeholder.unparsed("player", user.username)) } } @@ -94,7 +93,7 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { - for (vanishedUser in SayanVanishBukkitAPI.getInstance().database.getUsers().filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { + for (vanishedUser in SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { vanishedUser.sendComponent(language.vanish.leftTheServerWhileVanished, Placeholder.unparsed("player", user.username)) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt index ccc1856b..8a57034e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt @@ -11,7 +11,6 @@ import org.sayandev.stickynote.bukkit.onlinePlayers import ch.andre601.advancedserverlist.api.PlaceholderProvider import ch.andre601.advancedserverlist.api.AdvancedServerListAPI import ch.andre601.advancedserverlist.api.exceptions.InvalidPlaceholderProviderException -import kotlin.text.get class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { fun register() { @@ -37,7 +36,7 @@ class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { } if (placeholder.equals("count", true)) { - return SayanVanishBukkitAPI.getInstance().database.getUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() + return SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() } if (placeholder.equals("vanish_prefix", true)) { @@ -50,7 +49,7 @@ class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { if (placeholder.startsWith("online_")) { val type = placeholder.substring(7) - val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } return if (type.equals("here", true)) { onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username }.contains(onlinePlayer.name) }.size.toString() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt index 86777a89..77fb9863 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -4,7 +4,6 @@ import io.github.miniplaceholders.api.Expansion import io.github.miniplaceholders.api.utils.TagsUtils import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.SayanVanishAPI.Companion.user import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user @@ -51,7 +50,7 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) } builder.globalPlaceholder("count") { queue, context -> - TagsUtils.staticTag(SayanVanishBukkitAPI.getInstance().database.getUsers().filter { user -> user.isOnline && user.isVanished }.size.toString()) + TagsUtils.staticTag(SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString()) } builder.audiencePlaceholder("vanish_prefix") { audience, queue, context -> @@ -67,7 +66,7 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) return@globalPlaceholder TagsUtils.EMPTY_TAG } - val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } val serverName = queue.pop().value() val result = when (serverName) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt index 4f2f9bea..ec2c9ac1 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -95,7 +95,7 @@ private class HookPlaceholderAPI : PlaceholderExpansion() { } if (params.equals("count", true)) { - return SayanVanishBukkitAPI.getInstance().database.getUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() + return SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() } if (params.equals("vanish_prefix", true)) { @@ -110,7 +110,7 @@ private class HookPlaceholderAPI : PlaceholderExpansion() { if (params.startsWith("online_")) { val type = params.removePrefix("online_") - val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } return if (type.equals("here", true)) { onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username }.contains(onlinePlayer.name) }.size.toString() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt index fdc4f84d..e59057aa 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt @@ -3,7 +3,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import me.neznamy.tab.api.TabPlayer import me.neznamy.tab.api.integration.VanishIntegration import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.BukkitUser +import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.plugin @@ -38,7 +38,7 @@ private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegrati override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { if (viewer.uniqueId == target.uniqueId) return true - val viewerUser = SayanVanishBukkitAPI.getInstance().getUser(viewer.uniqueId, feature.useCacheData) ?: BukkitUser(viewer.uniqueId, viewer.name) + val viewerUser = SayanVanishBukkitAPI.getInstance().getUser(viewer.uniqueId, feature.useCacheData) ?: BukkitVanishUser(viewer.uniqueId, viewer.name) val targetUser = SayanVanishBukkitAPI.getInstance().getUser(target.uniqueId, feature.useCacheData) ?: return true return SayanVanishBukkitAPI.getInstance().canSee(viewerUser, targetUser) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt index a409291d..a364fc30 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt @@ -5,7 +5,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.server.TabCompleteEvent import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories @@ -31,14 +31,14 @@ class FeaturePreventTabComplete( val completions = event.completions.toMutableSet() if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { event.completions = completions - .filter { completion -> !vanishedUsers.map(User::username).contains(completion) } + .filter { completion -> !vanishedUsers.map(VanishUser::username).contains(completion) } return } event.completions = completions.filter { completion -> !vanishedUsers .filter { vanishedUser -> vanishedUser.vanishLevel > user.vanishLevel } - .map(User::username).contains(completion) + .map(VanishUser::username).contains(completion) } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt index 3581743d..d6f775d0 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt @@ -31,9 +31,9 @@ class SayanVanish : Plugin() { if (settings.general.purgeOnlineHistoryOnStartup) { for (onlineServer in server.servers) { - SayanVanishBungeeAPI.getInstance().database.purgeBasic(onlineServer.value.name) + SayanVanishBungeeAPI.getInstance().database.purgeUsers(onlineServer.value.name) } - SayanVanishBungeeAPI.getInstance().database.purgeBasic(settings.general.serverId) + SayanVanishBungeeAPI.getInstance().database.purgeUsers(settings.general.serverId) } StickyNote.run({ diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt index 90062056..2d424e9c 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt @@ -4,7 +4,7 @@ import net.md_5.bungee.api.event.PlayerDisconnectEvent import net.md_5.bungee.api.event.ServerConnectedEvent import net.md_5.bungee.api.plugin.Listener import net.md_5.bungee.event.EventHandler -import org.sayandev.sayanvanish.api.BasicUser +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI.Companion.getOrCreateUser @@ -14,13 +14,13 @@ object VanishManager : Listener { @EventHandler fun onPostLogin(event: ServerConnectedEvent) { val player = event.player ?: return - SayanVanishBungeeAPI.getInstance().database.addBasicUser(BasicUser.create(player.uniqueId, player.name, player.server.info.name ?: Platform.get().id)) + SayanVanishBungeeAPI.getInstance().database.addUser(User.of(player.uniqueId, player.name, player.server.info.name ?: Platform.get().id)) val user = player.getOrCreateUser() } fun onDisconnect(event: PlayerDisconnectEvent) { val player = event.player ?: return - SayanVanishBungeeAPI.getInstance().database.removeBasicUser(player.uniqueId) + SayanVanishBungeeAPI.getInstance().database.removeUser(player.uniqueId) } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt similarity index 84% rename from sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt rename to sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt index 7424c5a3..87e2910f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt @@ -3,29 +3,28 @@ package org.sayandev.sayanvanish.bungeecord.api import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import net.md_5.bungee.api.connection.ProxiedPlayer import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.bungeecord.event.BungeeUserUnVanishEvent import org.sayandev.sayanvanish.bungeecord.event.BungeeUserVanishEvent import org.sayandev.sayanvanish.bungeecord.utils.PlayerUtils.sendComponent import org.sayandev.sayanvanish.proxy.config.settings import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.component -import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.sendMessage import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.sendActionbar import org.sayandev.stickynote.bungeecord.StickyNote import org.sayandev.stickynote.bungeecord.plugin import java.util.UUID -open class BungeeUser( +open class BungeeVanishUser( override val uniqueId: UUID, override var username: String -) : User { +) : VanishUser { override var serverId = settings.general.serverId override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false - override var isOnline: Boolean = SayanVanishAPI.getInstance().database.hasBasicUser(uniqueId, true) + override var isOnline: Boolean = SayanVanishAPI.getInstance().database.hasUser(uniqueId, true) override var vanishLevel: Int = 1 fun stateText(isVanished: Boolean = this.isVanished) = if (isVanished) "ON" else "OFF" @@ -68,11 +67,11 @@ open class BungeeUser( companion object { @JvmStatic - fun fromUser(user: User): BungeeUser { - return BungeeUser(user.uniqueId, user.username).apply { - this.isOnline = user.isOnline - this.isVanished = user.isVanished - this.vanishLevel = user.vanishLevel + fun fromUser(vanishUser: VanishUser): BungeeVanishUser { + return BungeeVanishUser(vanishUser.uniqueId, vanishUser.username).apply { + this.isOnline = vanishUser.isOnline + this.isVanished = vanishUser.isVanished + this.vanishLevel = vanishUser.vanishLevel } } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt index c5986e3d..f698dfce 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt @@ -2,40 +2,39 @@ package org.sayandev.sayanvanish.bungeecord.api import net.md_5.bungee.api.connection.ProxiedPlayer import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.database.databaseConfig import java.util.UUID val database = SayanVanishBungeeAPI.getInstance().database -class SayanVanishBungeeAPI : SayanVanishAPI(BungeeUser::class.java) { +class SayanVanishBungeeAPI : SayanVanishAPI(BungeeVanishUser::class.java) { companion object { private val defaultInstance = SayanVanishBungeeAPI() @JvmStatic - fun getInstance(): SayanVanishAPI { + fun getInstance(): SayanVanishAPI { return defaultInstance } @JvmStatic - public fun UUID.user(): BungeeUser? { + public fun UUID.user(): BungeeVanishUser? { return getInstance().getUser(this) } @JvmStatic - public fun ProxiedPlayer.user(): BungeeUser? { + public fun ProxiedPlayer.user(): BungeeVanishUser? { return getInstance().getUser(this.uniqueId) } @JvmStatic - fun ProxiedPlayer.getOrCreateUser(): BungeeUser { - return getInstance().getUser(this.uniqueId) ?: BungeeUser(this.uniqueId, this.name ?: "N/A") + fun ProxiedPlayer.getOrCreateUser(): BungeeVanishUser { + return getInstance().getUser(this.uniqueId) ?: BungeeVanishUser(this.uniqueId, this.name ?: "N/A") } @JvmStatic - fun ProxiedPlayer.getOrAddUser(): BungeeUser { + fun ProxiedPlayer.getOrAddUser(): BungeeVanishUser { return getInstance().getUser(this.uniqueId) ?: let { - val newUser = BungeeUser(this.uniqueId, this.name ?: "N/A") - getInstance().database.addUser(newUser) + val newUser = BungeeVanishUser(this.uniqueId, this.name ?: "N/A") + getInstance().database.addVanishUser(newUser) newUser } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserUnVanishEvent.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserUnVanishEvent.kt index 3791b77f..9f1ed270 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserUnVanishEvent.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserUnVanishEvent.kt @@ -3,9 +3,9 @@ package org.sayandev.sayanvanish.bungeecord.event import net.md_5.bungee.api.plugin.Cancellable import net.md_5.bungee.api.plugin.Event import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bungeecord.api.BungeeUser +import org.sayandev.sayanvanish.bungeecord.api.BungeeVanishUser -class BungeeUserUnVanishEvent(val user: BungeeUser, val options: VanishOptions): Event(), Cancellable { +class BungeeUserUnVanishEvent(val user: BungeeVanishUser, val options: VanishOptions): Event(), Cancellable { private var cancelled = false override fun isCancelled(): Boolean { diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserVanishEvent.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserVanishEvent.kt index 8260c36d..1318a78f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserVanishEvent.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserVanishEvent.kt @@ -3,9 +3,9 @@ package org.sayandev.sayanvanish.bungeecord.event import net.md_5.bungee.api.plugin.Cancellable import net.md_5.bungee.api.plugin.Event import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bungeecord.api.BungeeUser +import org.sayandev.sayanvanish.bungeecord.api.BungeeVanishUser -class BungeeUserVanishEvent(val user: BungeeUser, val options: VanishOptions): Event(), Cancellable { +class BungeeUserVanishEvent(val user: BungeeVanishUser, val options: VanishOptions): Event(), Cancellable { private var cancelled = false override fun isCancelled(): Boolean { diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt index 1695be68..bf55d2c8 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bungeecord.feature -import org.sayandev.sayanvanish.api.BasicUser +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bungeecord.hasPlugin import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -21,7 +21,7 @@ abstract class HookFeature( return super.isActive() && hasPlugin() } - override fun isActive(user: BasicUser): Boolean { + override fun isActive(user: User): Boolean { return super.isActive(user) && hasPlugin() } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt index 2e449d62..e1bfa48a 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt @@ -21,7 +21,7 @@ class FeatureSyncEvents( override fun enable() { StickyNote.run({ - for (user in SayanVanishBungeeAPI.getInstance().database.getUsers()) { + for (user in SayanVanishBungeeAPI.getInstance().database.getVanishUsers()) { if (previousUsers[user.uniqueId] == null) { previousUsers[user.uniqueId] = user.isVanished continue diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt index 83ac1275..1784991a 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt @@ -5,7 +5,7 @@ import net.md_5.bungee.api.event.TabCompleteEvent import net.md_5.bungee.event.EventHandler import net.md_5.bungee.event.EventPriority import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories @@ -28,14 +28,14 @@ class FeaturePreventTabComplete( val vanishedUsers = SayanVanishBungeeAPI.getInstance().getVanishedUsers() if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { event.suggestions - .removeIf { suggestion -> vanishedUsers.map(User::username).contains(suggestion) } + .removeIf { suggestion -> vanishedUsers.map(VanishUser::username).contains(suggestion) } return } event.suggestions.removeIf { suggestion -> vanishedUsers .filter { vanishedUser -> vanishedUser.vanishLevel > user.vanishLevel } - .map(User::username).contains(suggestion) + .map(VanishUser::username).contains(suggestion) } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt index c019e7c5..0a8f782e 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt @@ -66,9 +66,9 @@ class SayanVanish @Inject constructor( if (settings.general.purgeOnlineHistoryOnStartup) { for (onlineServer in server.allServers) { - SayanVanishVelocityAPI.getInstance().database.purgeBasic(onlineServer.serverInfo.name) + SayanVanishVelocityAPI.getInstance().database.purgeUsers(onlineServer.serverInfo.name) } - SayanVanishVelocityAPI.getInstance().database.purgeBasic(settings.general.serverId) + SayanVanishVelocityAPI.getInstance().database.purgeUsers(settings.general.serverId) } if (settings.general.purgeUsersOnStartup) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt index 82b0013f..0563f93f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt @@ -3,7 +3,7 @@ package org.sayandev.sayanvanish.velocity import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.connection.DisconnectEvent import com.velocitypowered.api.event.player.ServerPostConnectEvent -import org.sayandev.sayanvanish.api.BasicUser +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateUser @@ -17,7 +17,7 @@ object VanishManager { @Subscribe private fun onPostLogin(event: ServerPostConnectEvent) { val player = event.player ?: return - SayanVanishVelocityAPI.getInstance().database.addBasicUser(BasicUser.create(player.uniqueId, player.username, player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id)) + SayanVanishVelocityAPI.getInstance().database.addUser(User.of(player.uniqueId, player.username, player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id)) val user = player.getOrCreateUser() if (user.isVanished) { server.eventManager.fireAndForget(VelocityUserVanishEvent(user, user.currentOptions)) @@ -29,7 +29,7 @@ object VanishManager { @Subscribe private fun onDisconnect(event: DisconnectEvent) { val player = event.player ?: return - SayanVanishVelocityAPI.getInstance().database.removeBasicUser(player.uniqueId) + SayanVanishVelocityAPI.getInstance().database.removeUser(player.uniqueId) } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt index 2019b8ff..af85a19f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt @@ -2,40 +2,39 @@ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.database.databaseConfig import java.util.UUID val database = SayanVanishVelocityAPI.getInstance().database -class SayanVanishVelocityAPI() : SayanVanishAPI(VelocityUser::class.java) { +class SayanVanishVelocityAPI() : SayanVanishAPI(VelocityVanishUser::class.java) { companion object { private val defaultInstance = SayanVanishVelocityAPI() @JvmStatic - fun getInstance(): SayanVanishAPI { + fun getInstance(): SayanVanishAPI { return defaultInstance } @JvmStatic - public fun UUID.user(): VelocityUser? { + public fun UUID.user(): VelocityVanishUser? { return getInstance().getUser(this) } @JvmStatic - public fun Player.user(): VelocityUser? { + public fun Player.user(): VelocityVanishUser? { return getInstance().getUser(this.uniqueId) } @JvmStatic - fun Player.getOrCreateUser(): VelocityUser { - return getInstance().getUser(this.uniqueId) ?: VelocityUser(this.uniqueId, this.username ?: "N/A") + fun Player.getOrCreateUser(): VelocityVanishUser { + return getInstance().getUser(this.uniqueId) ?: VelocityVanishUser(this.uniqueId, this.username ?: "N/A") } @JvmStatic - fun Player.getOrAddUser(): VelocityUser { + fun Player.getOrAddUser(): VelocityVanishUser { return getInstance().getUser(this.uniqueId) ?: let { - val newUser = VelocityUser(this.uniqueId, this.username ?: "N/A") - getInstance().database.addUser(newUser) + val newUser = VelocityVanishUser(this.uniqueId, this.username ?: "N/A") + getInstance().database.addVanishUser(newUser) newUser } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt similarity index 88% rename from sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt rename to sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index 00e76163..529f8813 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -4,7 +4,7 @@ import com.velocitypowered.api.proxy.Player import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.proxy.config.settings @@ -19,17 +19,17 @@ import java.util.* import kotlin.jvm.optionals.getOrNull -open class VelocityUser( +open class VelocityVanishUser( override val uniqueId: UUID, override var username: String -) : User { +) : VanishUser { override var serverId: String get() = StickyNote.getPlayer(uniqueId)?.currentServer?.getOrNull()?.serverInfo?.name ?: settings.general.serverId set(_) {} override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false - override var isOnline: Boolean = SayanVanishAPI.getInstance().database.hasBasicUser(uniqueId, true) + override var isOnline: Boolean = SayanVanishAPI.getInstance().database.hasUser(uniqueId, true) override var vanishLevel: Int = 0 get() = player()?.let { player -> val luckPermsHook = Features.getFeature() @@ -87,11 +87,11 @@ open class VelocityUser( companion object { @JvmStatic - fun fromUser(user: User): VelocityUser { - return VelocityUser(user.uniqueId, user.username).apply { - this.isOnline = user.isOnline - this.isVanished = user.isVanished - this.vanishLevel = user.vanishLevel + fun fromUser(vanishUser: VanishUser): VelocityVanishUser { + return VelocityVanishUser(vanishUser.uniqueId, vanishUser.username).apply { + this.isOnline = vanishUser.isOnline + this.isVanished = vanishUser.isVanished + this.vanishLevel = vanishUser.vanishLevel } } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserUnVanishEvent.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserUnVanishEvent.kt index ba2cc1fc..78cee747 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserUnVanishEvent.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserUnVanishEvent.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.velocity.event import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.velocity.api.VelocityUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser -class VelocityUserUnVanishEvent(val user: VelocityUser, val options: VanishOptions) \ No newline at end of file +class VelocityUserUnVanishEvent(val user: VelocityVanishUser, val options: VanishOptions) \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserVanishEvent.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserVanishEvent.kt index cc43023c..7d9f2637 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserVanishEvent.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserVanishEvent.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.velocity.event import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.velocity.api.VelocityUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser -class VelocityUserVanishEvent(val user: VelocityUser, val options: VanishOptions) \ No newline at end of file +class VelocityUserVanishEvent(val user: VelocityVanishUser, val options: VanishOptions) \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt index 4e09e8ef..771e2f16 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.velocity.feature -import org.sayandev.sayanvanish.api.BasicUser +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.sayandev.stickynote.velocity.hasPlugin @@ -21,7 +21,7 @@ abstract class HookFeature( return super.isActive() && hasPlugin() } - override fun isActive(user: BasicUser): Boolean { + override fun isActive(user: User): Boolean { return super.isActive(user) && hasPlugin() } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt index 7ebd5601..9d124e94 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt @@ -23,7 +23,7 @@ class FeatureSyncEvents( override fun enable() { StickyNote.run({ - for (user in SayanVanishVelocityAPI.getInstance().database.getUsers()) { + for (user in SayanVanishVelocityAPI.getInstance().database.getVanishUsers()) { if (previousUsers[user.uniqueId] == null) { previousUsers[user.uniqueId] = user.isVanished continue diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt index 5b6dfcc2..803b0cfb 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt @@ -17,7 +17,7 @@ class FeatureUpdatePing : ListenedFeature("update_ping") { fun onProxyPing(event: ProxyPingEvent) { if (!isActive()) return val pingPlayers = event.ping.players.getOrNull() ?: return - val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } val nonVanishedPlayersCount = SayanVanishVelocityAPI.getInstance().database.getBasicUsers(true).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size val nonVanishedPlayersSample = pingPlayers.sample.filter { !vanishedOnlineUsers.map { it.username }.contains(it.name) } event.ping = event.ping diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt index 3f64c6a4..51bedf8f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -49,7 +49,7 @@ private class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { } if (placeholder.equals("count", true)) { - return SayanVanishVelocityAPI.getInstance().database.getUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() + return SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() } if (placeholder.equals("vanish_prefix", true)) { @@ -62,7 +62,7 @@ private class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { if (placeholder.startsWith("online_")) { val type = placeholder.substring(7) - val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } return if (type.equals("total", true)) { SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt index 15cd0e1c..a26db05d 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -50,7 +50,7 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) } builder.globalPlaceholder("count") { queue, context -> - TagsUtils.staticTag(SayanVanishVelocityAPI.getInstance().database.getUsers().filter { user -> user.isOnline && user.isVanished }.size.toString()) + TagsUtils.staticTag(SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString()) } builder.audiencePlaceholder("vanish_prefix") { audience, queue, context -> @@ -63,19 +63,19 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) for (server in plugin.server.allServers) { builder.globalPlaceholder("online_${server.serverInfo.name.lowercase()}") { queue, context -> - val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } TagsUtils.staticTag(SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { it.serverId.lowercase() == server.serverInfo.name.lowercase() && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) } } builder.audiencePlaceholder("online_here") { audience, queue, context -> val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("0") - val currentServerVanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getUsers().filter { user -> user.isVanished && user.isOnline && user.serverId == player.currentServer.getOrNull()?.serverInfo?.name } + val currentServerVanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline && user.serverId == player.currentServer.getOrNull()?.serverInfo?.name } TagsUtils.staticTag(SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !currentServerVanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) } builder.globalPlaceholder("online_total") { queue, context -> - val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } TagsUtils.staticTag(SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt index 3d14ff72..0762db09 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt @@ -4,7 +4,7 @@ import me.neznamy.tab.api.TabPlayer import me.neznamy.tab.api.integration.VanishIntegration import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.VelocityUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.plugin import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -39,7 +39,7 @@ private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegrati override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { if (viewer.uniqueId == target.uniqueId) return true - val viewerUser = SayanVanishVelocityAPI.getInstance().getUser(viewer.uniqueId, feature.useCacheData) ?: VelocityUser(viewer.uniqueId, viewer.name) + val viewerUser = SayanVanishVelocityAPI.getInstance().getUser(viewer.uniqueId, feature.useCacheData) ?: VelocityVanishUser(viewer.uniqueId, viewer.name) val targetUser = SayanVanishVelocityAPI.getInstance().getUser(target.uniqueId, feature.useCacheData) ?: return true return SayanVanishVelocityAPI.getInstance().canSee(viewerUser, targetUser) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt index ac5e3f8b..29481af8 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt @@ -4,7 +4,7 @@ import com.velocitypowered.api.event.PostOrder import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.player.TabCompleteEvent import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories @@ -29,14 +29,14 @@ class FeaturePreventTabComplete( val vanishedUsers = SayanVanishVelocityAPI.getInstance().getVanishedUsers() if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { event.suggestions - .removeIf { suggestion -> vanishedUsers.map(User::username).contains(suggestion) } + .removeIf { suggestion -> vanishedUsers.map(VanishUser::username).contains(suggestion) } return } event.suggestions.removeIf { suggestion -> vanishedUsers .filter { vanishedUser -> vanishedUser.vanishLevel > user.vanishLevel } - .map(User::username).contains(suggestion) + .map(VanishUser::username).contains(suggestion) } } From b887bb34b666499929a510ebd2012f94e915789e Mon Sep 17 00:00:00 2001 From: Syrent Date: Mon, 5 May 2025 17:01:39 +0330 Subject: [PATCH 02/67] wip --- README.md | 4 +- .../org/sayandev/sayanvanish/api/Platform.kt | 15 +- .../sayanvanish/api/PlatformAdapter.kt | 5 + .../sayanvanish/api/SayanVanishAPI.kt | 124 ++++++--------- .../org/sayandev/sayanvanish/api/User.kt | 6 +- .../sayandev/sayanvanish/api/VanishUser.kt | 15 +- .../sayanvanish/api/database/Database.kt | 148 ++++++++++++++++++ .../api/database/TransactionDatabase.kt | 50 ++++-- .../api/database/redis/RedisDatabase.kt | 21 ++- .../api/database/sql/SQLDatabase.kt | 26 ++- .../sayanvanish/bukkit/SayanVanish.kt | 5 +- .../sayanvanish/bukkit/VanishManager.kt | 7 +- .../bukkit/api/BukkitVanishUser.kt | 3 +- .../bukkit/api/SayanVanishBukkitAPI.kt | 1 - .../bukkit/command/SayanVanishCommand.kt | 7 +- .../features/hook/AdvancedServerListImpl.kt | 10 +- .../features/hook/FeatureHookEssentials.kt | 5 +- .../hook/FeatureHookMiniPlaceholders.kt | 5 +- .../hook/FeatureHookPlaceholderAPI.kt | 5 +- .../feature/features/hook/FeatureHookTAB.kt | 2 +- .../src/main/kotlin/BungeePlatformAdapter.kt | 14 ++ .../sayanvanish/bungeecord/SayanVanish.kt | 39 ++--- .../sayanvanish/bungeecord/VanishManager.kt | 15 +- .../bungeecord/api/BungeeVanishUser.kt | 17 +- .../bungeecord/api/SayanVanishBungeeAPI.kt | 54 +++---- .../feature/features/FeatureSyncEvents.kt | 37 +++-- .../prevent/FeaturePreventTabComplete.kt | 5 +- .../sayanvanish/velocity/SayanVanish.kt | 5 +- .../velocity/api/SayanVanishVelocityAPI.kt | 1 - .../velocity/api/VelocityVanishUser.kt | 3 +- .../hook/FeatureHookAdvancedServerList.kt | 5 +- .../hook/FeatureHookEnhancedVelocity.kt | 2 +- .../hook/FeatureHookMiniPlaceholders.kt | 7 +- .../feature/features/hook/FeatureHookTAB.kt | 2 +- settings.gradle.kts | 2 +- 35 files changed, 430 insertions(+), 242 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt create mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/BungeePlatformAdapter.kt diff --git a/README.md b/README.md index ce54363c..8efe4487 100644 --- a/README.md +++ b/README.md @@ -159,7 +159,7 @@ compileOnly("org.sayandev:sayanvanish-bukkit:[get version from github]") You can access the SayanVanish API like this: ```java -SayanVanishAPI.getInstance(); +SayanVanishAPI; ``` Or you can use a platform-specific user type like this: @@ -177,7 +177,7 @@ SayanVanishBukkitAPI.getInstance(); From this class, you can access and modify everything. For example, to add a new user: ```java -SayanVanishAPI.getInstance().getDatabase().addUser(User); +SayanVanishAPI.getDatabase().addUser(User); ``` #### Events diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index bae99f1f..3d47f3d4 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -1,5 +1,7 @@ package org.sayandev.sayanvanish.api +import com.mysql.cj.jdbc.exceptions.OperationNotSupportedException +import org.sayandev.sayanvanish.api.database.TransactionDatabase import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import java.io.File import java.util.logging.Logger @@ -10,10 +12,15 @@ data class Platform( val logger: Logger, var rootDirectory: File, var serverId: String, + val adapter: PlatformAdapter<*>, ) { companion object { - private var currentPlatform = Platform("default", Logger.getGlobal(), File("."), "unknown") + private var currentPlatform = Platform("default", "SayanVanish", Logger.getGlobal(), File("."), "unknown", object : PlatformAdapter { + override fun adapt(user: VanishUser): VanishUser { + throw OperationNotSupportedException("Default platform doesn't support vanish user adapt") + } + }) @JvmStatic fun setPlatform(platform: Platform) { @@ -29,8 +36,10 @@ data class Platform( fun setAndRegister(platform: Platform): Boolean { setPlatform(platform) - if (!SayanVanishAPI.getInstance().databaseConnected) { - return false + (SayanVanishAPI.getDatabase() as? TransactionDatabase)?.let { + if (!it.databaseConnected) { + return false + } } register() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt new file mode 100644 index 00000000..3095f1e2 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt @@ -0,0 +1,5 @@ +package org.sayandev.sayanvanish.api + +interface PlatformAdapter { + fun adapt(user: VanishUser): V +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index b389df8b..cb1ad73b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -1,109 +1,83 @@ package org.sayandev.sayanvanish.api -import org.sayandev.sayanvanish.api.database.DatabaseMethod -import org.sayandev.sayanvanish.api.database.databaseConfig -import org.sayandev.sayanvanish.api.database.redis.RedisDatabase -import org.sayandev.sayanvanish.api.database.sql.SQLDatabase +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.runBlocking +import org.sayandev.sayanvanish.api.database.Database +import org.sayandev.sayanvanish.api.database.TransactionDatabase +import org.sayandev.stickynote.core.utils.launch import java.util.* -open class SayanVanishAPI(val type: Class) { - constructor(): this(VanishUser::class.java) +object SayanVanishAPI : VanishAPI { - var databaseConnected: Boolean = true + private val database = TransactionDatabase() - val database = when (databaseConfig.method) { - DatabaseMethod.SQL -> { - try { - SQLDatabase(databaseConfig.sql, type, databaseConfig.useCacheWhenAvailable).apply { - this.connect() - this.initialize() - } - } catch (e: Exception) { - databaseConnected = false - logDatabaseError() - throw e - } - } - DatabaseMethod.REDIS -> { - try { - RedisDatabase(databaseConfig.redis, type, databaseConfig.useCacheWhenAvailable).apply { - this.initialize() - this.connect() - } - } catch (e: Exception) { - databaseConnected = false - logDatabaseError() - throw e - } - } + override fun getDatabase(): Database { + return database } init { - for (user in database.getVanishUsers().filter { user -> user.serverId == Platform.get().serverId }) { - user.isOnline = false - user.save() + launch(database.dispatcher) { + for (user in database.getVanishUsers().await().filter { user -> user.serverId == Platform.get().serverId }) { + user.isOnline = false + user.save() + } + database.purgeUsers(Platform.get().serverId) } - database.purgeUsers(Platform.get().serverId) } - fun getPlatform(): Platform { + override fun getPlatform(): Platform { return Platform.get() } - fun isVanished(uniqueId: UUID, useCache: Boolean = true): Boolean { - return database.getVanishUser(uniqueId, useCache)?.isVanished == true + override fun isVanished(uniqueId: UUID): Deferred { + return CompletableDeferred().apply { + launch(database.dispatcher) { + complete(database.getVanishUser(uniqueId).await()?.isVanished == true) + } + } } - fun isVanished(uniqueId: UUID): Boolean { - return database.getVanishUser(uniqueId, true)?.isVanished == true + override fun isVanishedSync(uniqueId: UUID): Boolean { + return runBlocking { isVanished(uniqueId).await() } } - fun canSee(user: U?, target: U): Boolean { + override fun canSee(user: VanishUser?, target: VanishUser): Boolean { if (!target.isVanished) return true val vanishLevel = user?.vanishLevel ?: -1 return vanishLevel >= target.vanishLevel } - fun getUser(uniqueId: UUID, useCache: Boolean = true): U? { - return database.getVanishUser(uniqueId, useCache) - } - - fun getUser(uniqueId: UUID): U? { - return getUser(uniqueId, true) + override fun getOnlineVanishUsers(): Deferred> { + return CompletableDeferred>().apply { + launch(database.dispatcher) { + complete(database.getVanishUsers().await().filter { it.isOnline }) + } + } } - fun getOnlineUsers(): List { - return database.getVanishUsers().filter { it.isOnline } + override fun getOnlineVanishedUsers(): Deferred> { + return CompletableDeferred>().apply { + launch(database.dispatcher) { + complete(database.getVanishUsers().await().filter { it.isOnline && it.isVanished }) + } + } } - fun getVanishedUsers(): List { - return database.getVanishUsers().filter { it.isVanished } + override fun getVanishedUsers(): Deferred> { + return CompletableDeferred>().apply { + launch(database.dispatcher) { + complete(database.getVanishUsers().await().filter { it.isVanished }) + } + } } - private fun logDatabaseError() { - Platform.get().logger.severe("Database connection failed. Disabling the plugin.") - Platform.get().logger.severe("Please check the following:") - Platform.get().logger.severe("- Make sure your database server is not misconfigured.") - Platform.get().logger.severe("- Make sure your database server is running.") - Platform.get().logger.severe("Here's the full error trace:") + suspend fun UUID.user(): VanishUser? { + return getDatabase().getVanishUser(this).await() } - companion object { - private val defaultInstance = SayanVanishAPI() - - @JvmStatic - fun getInstance(): SayanVanishAPI { - return defaultInstance - } - - @JvmStatic - fun UUID.user(): VanishUser? { - return getInstance().getUser(this) - } - - /*fun UUID.asyncUser(result: (User?) -> Unit) { - getInstance().getUserAsync(this, result) - }*/ + @JvmStatic + fun get(): SayanVanishAPI { + return this } - } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 894bc9c0..410f40f6 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -23,13 +23,14 @@ interface User { } suspend fun save() { - SayanVanishAPI.getInstance().database.addUser(this) + SayanVanishAPI.getDatabase().addUser(this) } fun toJson(): String { val json = JsonObject() json.addProperty("unique-id", uniqueId.toString()) json.addProperty("username", username) + json.addProperty("is-online", isOnline) json.addProperty("server-id", serverId) return Gson().toJson(json) } @@ -49,8 +50,9 @@ interface User { val json = JsonParser.parseString(serialized).asJsonObject val uniqueId = json.get("unique-id").asString val username = json.get("username").asString + val isOnline = json.get("is-online").asBoolean val serverId = json.get("server-id").asString - return of(UUID.fromString(uniqueId), username, serverId) + return of(UUID.fromString(uniqueId), username, isOnline, serverId) } @JvmStatic diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 7f453d56..a26e92c3 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -39,9 +39,13 @@ interface VanishUser : User { toggleVanish(VanishOptions.defaultOptions()) } - fun sendComponent(content: String, vararg placeholder: TagResolver) + fun sendComponent(content: String, vararg placeholder: TagResolver) { + Platform.get().adapter.adapt(this).sendComponent(content, *placeholder) + } - fun sendActionbar(content: String, vararg placeholder: TagResolver) + fun sendActionbar(content: String, vararg placeholder: TagResolver) { + Platform.get().adapter.adapt(this).sendActionbar(content, *placeholder) + } /** * @param otherVanishUser The user to check if this user can see @@ -55,11 +59,11 @@ interface VanishUser : User { override suspend fun save() { serverId = Platform.get().serverId - SayanVanishAPI.getInstance().database.addVanishUser(this) + SayanVanishAPI.getDatabase().addVanishUser(this) } suspend fun delete() { - SayanVanishAPI.getInstance().database.removeVanishUser(uniqueId) + SayanVanishAPI.getDatabase().removeVanishUser(uniqueId) } override fun toJson(): String { @@ -67,6 +71,7 @@ interface VanishUser : User { json.addProperty("unique-id", uniqueId.toString()) json.addProperty("username", username) json.addProperty("is-online", isOnline) + json.addProperty("server-id", serverId) json.addProperty("is-vanished", isVanished) json.addProperty("vanish-level", vanishLevel) json.addProperty("current-options", currentOptions.toJson()) @@ -90,6 +95,7 @@ interface VanishUser : User { val uniqueId = json.get("unique-id").asString val username = json.get("username").asString val isOnline = json.get("is-online").asBoolean + val serverId = json.get("server-id").asString val isVanished = json.get("is-vanished").asBoolean val vanishLevel = json.get("vanish-level").asInt val currentOptions = json.get("current-options").asString @@ -97,6 +103,7 @@ interface VanishUser : User { return of( UUID.fromString(uniqueId), username, + serverId, isVanished, isOnline, vanishLevel, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt index 6ae8aa5a..9fc0e709 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt @@ -1,12 +1,19 @@ package org.sayandev.sayanvanish.api.database import kotlinx.coroutines.Deferred +import kotlinx.coroutines.future.asCompletableFuture +import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher +import org.sayandev.stickynote.core.utils.async import java.util.* +import java.util.concurrent.CompletableFuture interface Database { + val dispatcher: AsyncDispatcher + suspend fun initialize(): Deferred suspend fun connect(): Deferred @@ -15,28 +22,169 @@ interface Database { suspend fun addVanishUser(vanishUser: VanishUser): Deferred + fun addVanishUserFuture(vanishUser: VanishUser): CompletableFuture { + return async(dispatcher) { addVanishUser(vanishUser).await() }.asCompletableFuture() + } + + fun addVanishUserSync(vanishUser: VanishUser): Boolean { + return runBlocking { addVanishUser(vanishUser).await() } + } + suspend fun hasVanishUser(uniqueId: UUID): Deferred + fun hasVanishUserFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { hasVanishUser(uniqueId).await() }.asCompletableFuture() + } + + fun hasVanishUserSync(uniqueId: UUID): Boolean { + return runBlocking { hasVanishUser(uniqueId).await() } + } + suspend fun updateVanishUser(vanishUser: VanishUser): Deferred + fun updateVanishUserFuture(vanishUser: VanishUser): CompletableFuture { + return async(dispatcher) { updateVanishUser(vanishUser).await() }.asCompletableFuture() + } + + fun updateVanishUserSync(vanishUser: VanishUser): Boolean { + return runBlocking { updateVanishUser(vanishUser).await() } + } + suspend fun removeVanishUser(uniqueId: UUID): Deferred + fun removeVanishUserFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { removeVanishUser(uniqueId).await() }.asCompletableFuture() + } + + fun removeVanishUserSync(uniqueId: UUID): Boolean { + return runBlocking { removeVanishUser(uniqueId).await() } + } + suspend fun getVanishUser(uniqueId: UUID): Deferred + fun getVanishUserFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { getVanishUser(uniqueId).await() }.asCompletableFuture() + } + + fun getVanishUserSync(uniqueId: UUID): VanishUser? { + return runBlocking { getVanishUser(uniqueId).await() } + } + suspend fun getVanishUsers(): Deferred> + fun getVanishUsersFuture(): CompletableFuture> { + return async(dispatcher) { getVanishUsers().await() }.asCompletableFuture() + } + + fun getVanishUsersSync(): List { + return runBlocking { getVanishUsers().await() } + } + suspend fun getUsers(): Deferred> + fun getUsersFuture(): CompletableFuture> { + return async(dispatcher) { getUsers().await() }.asCompletableFuture() + } + + fun getUsersSync(): List { + return runBlocking { getUsers().await() } + } + suspend fun addUser(user: User): Deferred + + fun addUserFuture(user: User): CompletableFuture { + return async(dispatcher) { addUser(user).await() }.asCompletableFuture() + } + + fun addUserSync(user: User): Boolean { + return runBlocking { addUser(user).await() } + } + suspend fun hasUser(uniqueId: UUID): Deferred + + fun hasUserFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { hasUser(uniqueId).await() }.asCompletableFuture() + } + + fun hasUserSync(uniqueId: UUID): Boolean { + return runBlocking { hasUser(uniqueId).await() } + } + suspend fun updateUser(user: User): Deferred + + fun updateUserFuture(user: User): CompletableFuture { + return async(dispatcher) { updateUser(user).await() }.asCompletableFuture() + } + + fun updateUserSync(user: User): Boolean { + return runBlocking { updateUser(user).await() } + } + suspend fun removeUser(uniqueId: UUID): Deferred + fun removeUserFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { removeUser(uniqueId).await() }.asCompletableFuture() + } + + fun removeUserSync(uniqueId: UUID): Boolean { + return runBlocking { removeUser(uniqueId).await() } + } + suspend fun isInQueue(uniqueId: UUID): Deferred + + fun isInQueueFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { isInQueue(uniqueId).await() }.asCompletableFuture() + } + + fun isInQueueSync(uniqueId: UUID): Boolean { + return runBlocking { isInQueue(uniqueId).await() } + } + suspend fun addToQueue(uniqueId: UUID, vanished: Boolean): Deferred + + fun addToQueueFuture(uniqueId: UUID, vanished: Boolean): CompletableFuture { + return async(dispatcher) { addToQueue(uniqueId, vanished).await() }.asCompletableFuture() + } + + fun addToQueueSync(uniqueId: UUID, vanished: Boolean): Boolean { + return runBlocking { addToQueue(uniqueId, vanished).await() } + } + suspend fun getFromQueue(uniqueId: UUID): Deferred + + fun getFromQueueFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { getFromQueue(uniqueId).await() }.asCompletableFuture() + } + + fun getFromQueueSync(uniqueId: UUID): Boolean { + return runBlocking { getFromQueue(uniqueId).await() } + } + suspend fun removeFromQueue(uniqueId: UUID): Deferred + fun removeFromQueueFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { removeFromQueue(uniqueId).await() }.asCompletableFuture() + } + + fun removeFromQueueSync(uniqueId: UUID): Boolean { + return runBlocking { removeFromQueue(uniqueId).await() } + } + suspend fun purgeAllTables(): Deferred + + fun purgeAllTablesFuture(): CompletableFuture { + return async(dispatcher) { purgeAllTables().await() }.asCompletableFuture() + } + suspend fun purgeUsers(): Deferred + + fun purgeUsersFuture(): CompletableFuture { + return async(dispatcher) { purgeUsers().await() }.asCompletableFuture() + } + + suspend fun purgeUsers(serverId: String): Deferred + + fun purgeUsersFuture(serverId: String): CompletableFuture { + return async(dispatcher) { purgeUsers(serverId).await() }.asCompletableFuture() + } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt index e26fe71c..3a8305ee 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt @@ -9,13 +9,22 @@ import kotlinx.coroutines.awaitAll import kotlinx.coroutines.isActive import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.PlatformAdapter import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.database.redis.RedisDatabase import org.sayandev.sayanvanish.api.database.sql.SQLDatabase +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import java.util.* class TransactionDatabase: Database { + override val dispatcher = + AsyncDispatcher( + "${Platform.get().pluginName.lowercase()}-transaction-thread", + // TODO: get thread count from config + 5, + ) + val databaseTypes = mutableMapOf() var databaseConnected: Boolean = true @@ -143,12 +152,35 @@ class TransactionDatabase: Database { override suspend fun purgeAllTables(): Deferred { return CompletableDeferred().apply { - + databaseTypes.values.map { database -> + async { + database.purgeAllTables() + } + }.awaitAll() + complete(true) } } override suspend fun purgeUsers(): Deferred { - TODO("Not yet implemented") + return CompletableDeferred().apply { + databaseTypes.values.map { database -> + async { + database.purgeUsers() + } + }.awaitAll() + complete(true) + } + } + + override suspend fun purgeUsers(serverId: String): Deferred { + return CompletableDeferred().apply { + databaseTypes.values.map { database -> + async { + database.purgeUsers(serverId) + } + }.awaitAll() + complete(true) + } } fun database(method: DatabaseMethod): Database { @@ -164,23 +196,23 @@ class TransactionDatabase: Database { } private fun logDatabaseError() { - Platform.Companion.get().logger.severe("Database connection failed. Disabling the plugin.") - Platform.Companion.get().logger.severe("Please check the following:") - Platform.Companion.get().logger.severe("- Make sure your database server is not misconfigured.") - Platform.Companion.get().logger.severe("- Make sure your database server is running.") - Platform.Companion.get().logger.severe("Here's the full error trace:") + Platform.get().logger.severe("Database connection failed. Disabling the plugin.") + Platform.get().logger.severe("Please check the following:") + Platform.get().logger.severe("- Make sure your database server is not misconfigured.") + Platform.get().logger.severe("- Make sure your database server is running.") + Platform.get().logger.severe("Here's the full error trace:") } fun async( block: suspend CoroutineScope.() -> T ): Deferred { - val session = CoroutineScope(redisDispatcher) + val session = CoroutineScope(dispatcher) if (!session.isActive) { return CompletableDeferred().apply { cancel() } } - return session.async(redisDispatcher, CoroutineStart.DEFAULT, block) + return session.async(dispatcher, CoroutineStart.DEFAULT, block) } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt index e245d2bc..b1749ee9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt @@ -11,18 +11,16 @@ import redis.clients.jedis.DefaultJedisClientConfig import redis.clients.jedis.HostAndPort import redis.clients.jedis.JedisPooled import java.util.* -import java.util.concurrent.Executors class RedisDatabase( val config: DatabaseConfig, ) : Database { - private val redisDispatcher = + override val dispatcher = AsyncDispatcher( "${Platform.get().pluginName.lowercase()}-redis-thread", config.redisDispatcherThreadCount, ) - private val thread = Executors.newSingleThreadExecutor() lateinit var redis: JedisPooled @@ -153,8 +151,8 @@ class RedisDatabase( override suspend fun purgeAllTables(): Deferred { return async { + redis.del("vanish_users") redis.del("users") - redis.del("basic_users") redis.del("queue") true } @@ -162,8 +160,15 @@ class RedisDatabase( override suspend fun purgeUsers(): Deferred { return async { - redis.del("basic_users") - redis.del("queue") + redis.del("users") + true + } + } + + override suspend fun purgeUsers(serverId: String): Deferred { + return async { + // TODO: only remove users from this server id + redis.del("users") true } } @@ -171,12 +176,12 @@ class RedisDatabase( fun async( block: suspend CoroutineScope.() -> T ): Deferred { - val session = CoroutineScope(redisDispatcher) + val session = CoroutineScope(dispatcher) if (!session.isActive) { return CompletableDeferred().apply { cancel() } } - return session.async(redisDispatcher, CoroutineStart.DEFAULT, block) + return session.async(dispatcher, CoroutineStart.DEFAULT, block) } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt index 6b62d515..dba90310 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt @@ -10,19 +10,22 @@ import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.transactions.TransactionManager import org.jetbrains.exposed.sql.transactions.experimental.suspendedTransactionAsync import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.PlatformAdapter import org.sayandev.sayanvanish.api.Queue import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.database.Database import org.sayandev.sayanvanish.api.database.DatabaseConfig import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher +import org.sayandev.stickynote.core.utils.CoroutineUtils +import org.sayandev.stickynote.core.utils.launch import java.util.* import java.util.concurrent.TimeUnit class SQLDatabase( val config: DatabaseConfig, ) : Database { - private val databaseDispatcher = + override val dispatcher = AsyncDispatcher( "${Platform.get().pluginName.lowercase()}-${config.sql.method}-thread", config.sqlDispatcherThreadCount, @@ -268,12 +271,21 @@ class SQLDatabase( } } - suspend fun async(statement: suspend Transaction.() -> T): Deferred { - return suspendedTransactionAsync( - databaseDispatcher, - database, - statement = statement, - ) + override suspend fun purgeUsers(serverId: String): Deferred { + return async { + User.Schema.deleteWhere { User.Schema.serverId eq serverId } + true + } + } + + fun async(statement: suspend Transaction.() -> T): Deferred { + return CoroutineUtils.async(dispatcher) { + suspendedTransactionAsync( + dispatcher, + database, + statement = statement, + ).await() + } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt index e9dfb610..960aac20 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt @@ -3,7 +3,6 @@ package org.sayandev.sayanvanish.bukkit import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.database.DatabaseMethod import org.sayandev.sayanvanish.api.database.databaseConfig import org.sayandev.sayanvanish.api.database.sql.SQLConfig @@ -54,7 +53,7 @@ open class SayanVanish : JavaPlugin() { runAsync({ SayanVanishBukkitAPI.getInstance().database.getUsersAsync { users -> SayanVanishBukkitAPI.getInstance().database.cache = users.associateBy { it.uniqueId }.toMutableMap() - SayanVanishAPI.getInstance().database.cache = users.associateBy { it.uniqueId }.toMutableMap() + SayanVanishAPI.getDatabase().cache = users.associateBy { it.uniqueId }.toMutableMap() } }, 0, settings.general.cacheUpdatePeriodTicks) @@ -62,7 +61,7 @@ open class SayanVanish : JavaPlugin() { if (databaseConfig.method == DatabaseMethod.SQL) { SayanVanishBukkitAPI.getInstance().database.getBasicUsersAsync { users -> (SayanVanishBukkitAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() - (SayanVanishAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() + (SayanVanishAPI.getDatabase() as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() } } }, 0, settings.general.basicCacheUpdatePeriodTicks) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt index 91c30260..268eadbb 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt @@ -6,7 +6,6 @@ import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.config.settings import org.sayandev.stickynote.bukkit.registerListener @@ -22,7 +21,7 @@ object VanishManager : Listener { if (settings.general.proxyMode) return val player = event.player - SayanVanishAPI.getInstance().database.addUser(User.of(player.uniqueId, player.name, null)) + SayanVanishAPI.getDatabase().addUser(User.of(player.uniqueId, player.name, null)) } @EventHandler @@ -30,8 +29,8 @@ object VanishManager : Listener { if (settings.general.proxyMode) return val player = event.player - SayanVanishAPI.getInstance().database.cache.remove(player.uniqueId) - SayanVanishAPI.getInstance().database.removeUser(player.uniqueId) + SayanVanishAPI.getDatabase().cache.remove(player.uniqueId) + SayanVanishAPI.getDatabase().removeUser(player.uniqueId) } @EventHandler(priority = EventPriority.LOWEST) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 8cf2fff5..b6dfa6a9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -8,7 +8,6 @@ import org.bukkit.entity.Player import org.bukkit.metadata.FixedMetadataValue import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features @@ -40,7 +39,7 @@ open class BukkitVanishUser( override var isOnline: Boolean = if (!settings.general.proxyMode) { Bukkit.getPlayer(uniqueId) != null } else { - SayanVanishAPI.getInstance().database.hasUser(uniqueId, true) + SayanVanishAPI.getDatabase().hasUser(uniqueId, true) } override var vanishLevel: Int = 0 get() = if (Features.getFeature().levelMethod == FeatureLevel.LevelMethod.PERMISSION) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt index 5e90a188..4e70cce6 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt @@ -2,7 +2,6 @@ package org.sayandev.sayanvanish.bukkit.api import org.bukkit.OfflinePlayer import org.bukkit.entity.Player -import org.sayandev.sayanvanish.api.SayanVanishAPI import java.util.* class SayanVanishBukkitAPI : SayanVanishAPI(BukkitVanishUser::class.java) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 6fa9f421..9f80e8bf 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -16,7 +16,6 @@ import org.incendo.cloud.parser.standard.StringParser import org.incendo.cloud.setting.ManagerSetting import org.incendo.cloud.suggestion.Suggestion import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.database.DatabaseConfig import org.sayandev.sayanvanish.api.database.databaseConfig @@ -450,7 +449,7 @@ class SayanVanishCommand : BukkitCommand(settings.command.name, *settings.comman literalWithPermission("users") handler { context -> val sender = context.sender().platformSender() - sender.sendComponent("Vanished Users: ${SayanVanishAPI.getInstance().getVanishedUsers().map { it.username }}") + sender.sendComponent("Vanished Users: ${SayanVanishAPI.getVanishedUsers().map { it.username }}") } } @@ -465,7 +464,7 @@ class SayanVanishCommand : BukkitCommand(settings.command.name, *settings.comman handler { context -> val sender = context.sender().platformSender() val limit = context.get("limit") - val database = SayanVanishAPI.getInstance().database + val database = SayanVanishAPI.getDatabase() if (context.flags().hasFlag("no-cache")) { database.useCache = false } @@ -504,7 +503,7 @@ class SayanVanishCommand : BukkitCommand(settings.command.name, *settings.comman handler { context -> val sender = context.sender().platformSender() val amount = context.get("amount") - val database = SayanVanishAPI.getInstance().database + val database = SayanVanishAPI.getDatabase() if (context.flags().hasFlag("no-cache")) { database.useCache = false } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt index 8a57034e..b8b189cd 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt @@ -2,8 +2,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import ch.andre601.advancedserverlist.api.objects.GenericPlayer import ch.andre601.advancedserverlist.api.objects.GenericServer -import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.SayanVanishAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.config.settings @@ -40,11 +38,11 @@ class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { } if (placeholder.equals("vanish_prefix", true)) { - return if (player?.uuid?.user()?.isVanished == true) language.vanish.placeholderPrefix else "" + return if (player?.uuid?.vanishUser()?.isVanished == true) language.vanish.placeholderPrefix else "" } if (placeholder.equals("vanish_suffix", true)) { - return if (player?.uuid?.user()?.isVanished == true) language.vanish.placeholderSuffix else "" + return if (player?.uuid?.vanishUser()?.isVanished == true) language.vanish.placeholderSuffix else "" } if (placeholder.startsWith("online_")) { @@ -57,12 +55,12 @@ class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { if (!settings.general.proxyMode) { return "PROXY_MODE IS NOT ENABLED!" } - SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } else { if (!settings.general.proxyMode) { return "PROXY_MODE IS NOT ENABLED!" } - SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt index 11cff522..bad84e16 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt @@ -4,7 +4,6 @@ import net.ess3.api.events.AfkStatusChangeEvent import net.ess3.api.events.PrivateMessagePreSendEvent import org.bukkit.event.EventHandler import org.bukkit.event.Listener -import org.sayandev.sayanvanish.api.SayanVanishAPI.Companion.user import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.feature.HookFeature @@ -42,7 +41,7 @@ private class EssentialsHookImpl(val feature: FeatureHookEssentials): Listener { @EventHandler private fun preventAfkStatusChange(event: AfkStatusChangeEvent) { if (!feature.preventAfkStatusChange) return - val user = event.affected.uuid?.user() ?: return + val user = event.affected.uuid?.vanishUser() ?: return if (!feature.isActive(user)) return if (!user.isVanished) return event.isCancelled = true @@ -51,7 +50,7 @@ private class EssentialsHookImpl(val feature: FeatureHookEssentials): Listener { @EventHandler private fun preventPrivateMessage(event: PrivateMessagePreSendEvent) { if (!feature.preventPrivateMessage) return - val user = event.recipient.uuid?.user() ?: return + val user = event.recipient.uuid?.vanishUser() ?: return if (!feature.isActive(user)) return if (user.isVanished) { event.sender.sendMessage(com.earth2me.essentials.I18n.tl("errorWithMessage", com.earth2me.essentials.I18n.tl("playerNotFound"))) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt index 77fb9863..83be446a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -3,7 +3,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import io.github.miniplaceholders.api.Expansion import io.github.miniplaceholders.api.utils.TagsUtils import org.bukkit.entity.Player -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user @@ -77,14 +76,14 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) if (!settings.general.proxyMode) { "PROXY_MODE IS NOT ENABLED!" } else { - SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } } else -> { if (!settings.general.proxyMode) { "PROXY_MODE IS NOT ENABLED!" } else { - SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { it.serverId == serverName && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId == serverName && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt index ec2c9ac1..12daf8f4 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -2,7 +2,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import me.clip.placeholderapi.expansion.PlaceholderExpansion import org.bukkit.OfflinePlayer -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI @@ -118,12 +117,12 @@ private class HookPlaceholderAPI : PlaceholderExpansion() { if (!settings.general.proxyMode) { return "PROXY_MODE IS NOT ENABLED!" } - return SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + return SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } else { if (!settings.general.proxyMode) { return "PROXY_MODE IS NOT ENABLED!" } - return SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + return SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt index e59057aa..305e2941 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt @@ -33,7 +33,7 @@ class FeatureHookTAB( private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegration(plugin.name) { override fun isVanished(player: TabPlayer): Boolean { - return SayanVanishBukkitAPI.getInstance().isVanished(player.uniqueId, feature.useCacheData) + return SayanVanishBukkitAPI.getInstance().isVanishedAsync(player.uniqueId, feature.useCacheData) } override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/BungeePlatformAdapter.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/BungeePlatformAdapter.kt new file mode 100644 index 00000000..74ebfcee --- /dev/null +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/BungeePlatformAdapter.kt @@ -0,0 +1,14 @@ +import org.sayandev.sayanvanish.api.PlatformAdapter +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.bungeecord.api.BungeeVanishUser + +object BungeePlatformAdapter : PlatformAdapter { + override fun adapt(user: VanishUser): BungeeVanishUser { + return BungeeVanishUser.fromUser(user) + } + + @JvmStatic + fun get(): BungeePlatformAdapter { + return BungeePlatformAdapter + } +} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt index d6f775d0..127bdff8 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt @@ -1,20 +1,15 @@ package org.sayandev.sayanvanish.bungeecord +import BungeePlatformAdapter +import kotlinx.coroutines.runBlocking import net.md_5.bungee.api.plugin.Plugin import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.database.DatabaseMethod -import org.sayandev.sayanvanish.api.database.databaseConfig -import org.sayandev.sayanvanish.api.database.sql.SQLDatabase import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI import org.sayandev.sayanvanish.proxy.config.settings -import org.sayandev.sayanvanish.velocity.VanishManager -import org.sayandev.stickynote.bungeecord.StickyNote import org.sayandev.stickynote.bungeecord.dataDirectory import org.sayandev.stickynote.bungeecord.registerListener import org.sayandev.stickynote.bungeecord.server import org.sayandev.stickynote.loader.bungee.StickyNoteBungeeLoader -import java.util.concurrent.TimeUnit class SayanVanish : Plugin() { @@ -22,34 +17,20 @@ class SayanVanish : Plugin() { StickyNoteBungeeLoader(this) // Do NOT set server id here, SettingsConfig can't be used because it depends on Platform rootDirectory Platform.get().rootDirectory = dataDirectory - if (!Platform.setAndRegister(Platform("bungeecord", logger, dataDirectory, ""))) return + if (!Platform.setAndRegister(Platform("bungeecord", this.description.name, logger, dataDirectory, "", BungeePlatformAdapter))) return Platform.get().serverId = settings.general.serverId - SayanVanishBungeeAPI() + SayanVanishBungeeAPI registerListener(VanishManager) - if (settings.general.purgeOnlineHistoryOnStartup) { - for (onlineServer in server.servers) { - SayanVanishBungeeAPI.getInstance().database.purgeUsers(onlineServer.value.name) - } - SayanVanishBungeeAPI.getInstance().database.purgeUsers(settings.general.serverId) - } - - StickyNote.run({ - SayanVanishBungeeAPI.getInstance().database.getUsersAsync { users -> - SayanVanishBungeeAPI.getInstance().database.cache = users.associateBy { it.uniqueId }.toMutableMap() - SayanVanishAPI.getInstance().database.cache = users.associateBy { it.uniqueId }.toMutableMap() - } - }, settings.general.basicCacheUpdatePeriodMillis, settings.general.basicCacheUpdatePeriodMillis, TimeUnit.MILLISECONDS) - - StickyNote.run({ - if (databaseConfig.method == DatabaseMethod.SQL) { - SayanVanishBungeeAPI.getInstance().database.getBasicUsersAsync { users -> - (SayanVanishBungeeAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() - (SayanVanishAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() + runBlocking { + if (settings.general.purgeOnlineHistoryOnStartup) { + for (onlineServer in server.servers) { + SayanVanishBungeeAPI.getDatabase().purgeUsers(onlineServer.value.name) } + SayanVanishBungeeAPI.getDatabase().purgeUsers(settings.general.serverId) } - }, settings.general.cacheUpdatePeriodMillis, settings.general.cacheUpdatePeriodMillis, TimeUnit.MILLISECONDS) + } } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt index 2d424e9c..9cb08788 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.velocity +package org.sayandev.sayanvanish.bungeecord import net.md_5.bungee.api.event.PlayerDisconnectEvent import net.md_5.bungee.api.event.ServerConnectedEvent @@ -7,20 +7,25 @@ import net.md_5.bungee.event.EventHandler import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI.Companion.getOrCreateUser +import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI.getOrCreateUser +import org.sayandev.stickynote.bungeecord.launch object VanishManager : Listener { @EventHandler fun onPostLogin(event: ServerConnectedEvent) { val player = event.player ?: return - SayanVanishBungeeAPI.getInstance().database.addUser(User.of(player.uniqueId, player.name, player.server.info.name ?: Platform.get().id)) - val user = player.getOrCreateUser() + launch { + SayanVanishBungeeAPI.getDatabase().addUser(User.of(player.uniqueId, player.name, true, player.server.info.name ?: Platform.get().id)) + player.getOrCreateUser() + } } fun onDisconnect(event: PlayerDisconnectEvent) { val player = event.player ?: return - SayanVanishBungeeAPI.getInstance().database.removeUser(player.uniqueId) + launch { + SayanVanishBungeeAPI.getDatabase().removeUser(player.uniqueId) + } } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt index 87e2910f..f31d6255 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt @@ -12,6 +12,7 @@ import org.sayandev.sayanvanish.proxy.config.settings import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.component import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.sendActionbar import org.sayandev.stickynote.bungeecord.StickyNote +import org.sayandev.stickynote.bungeecord.launch import org.sayandev.stickynote.bungeecord.plugin import java.util.UUID @@ -24,32 +25,38 @@ open class BungeeVanishUser( override var serverId = settings.general.serverId override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false - override var isOnline: Boolean = SayanVanishAPI.getInstance().database.hasUser(uniqueId, true) + override var isOnline: Boolean = false override var vanishLevel: Int = 1 + init { + launch { + isOnline = SayanVanishAPI.getDatabase().hasUser(uniqueId).await() + } + } + fun stateText(isVanished: Boolean = this.isVanished) = if (isVanished) "ON" else "OFF" fun player(): ProxiedPlayer? = StickyNote.getPlayer(uniqueId) - override fun vanish(options: VanishOptions) { + override suspend fun vanish(options: VanishOptions) { val vanishEvent = plugin.proxy.pluginManager.callEvent(BungeeUserVanishEvent(this, options)) if (vanishEvent.isCancelled) return val options = vanishEvent.options currentOptions = options - database.addToQueue(uniqueId, true) + SayanVanishAPI.getDatabase().addToQueue(uniqueId, true) super.vanish(options) } - override fun unVanish(options: VanishOptions) { + override suspend fun unVanish(options: VanishOptions) { val vanishEvent = plugin.proxy.pluginManager.callEvent(BungeeUserUnVanishEvent(this, options)) if (vanishEvent.isCancelled) return val options = vanishEvent.options currentOptions = options - database.addToQueue(uniqueId, false) + SayanVanishAPI.getDatabase().addToQueue(uniqueId, false) super.unVanish(options) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt index f698dfce..6bbb3133 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt @@ -1,42 +1,36 @@ package org.sayandev.sayanvanish.bungeecord.api +import BungeePlatformAdapter import net.md_5.bungee.api.connection.ProxiedPlayer +import org.sayandev.sayanvanish.api.PlatformAdapter import org.sayandev.sayanvanish.api.SayanVanishAPI +import org.sayandev.sayanvanish.api.SayanVanishAPI.user +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.api.VanishUser import java.util.UUID -val database = SayanVanishBungeeAPI.getInstance().database - -class SayanVanishBungeeAPI : SayanVanishAPI(BungeeVanishUser::class.java) { - companion object { - private val defaultInstance = SayanVanishBungeeAPI() - - @JvmStatic - fun getInstance(): SayanVanishAPI { - return defaultInstance - } - - @JvmStatic - public fun UUID.user(): BungeeVanishUser? { - return getInstance().getUser(this) - } +object SayanVanishBungeeAPI : VanishAPI by SayanVanishAPI, PlatformAdapter by BungeePlatformAdapter { + @JvmStatic + fun get(): SayanVanishBungeeAPI { + return this + } - @JvmStatic - public fun ProxiedPlayer.user(): BungeeVanishUser? { - return getInstance().getUser(this.uniqueId) - } + @JvmStatic + suspend fun ProxiedPlayer.user(): VanishUser? { + return this.uniqueId.user() + } - @JvmStatic - fun ProxiedPlayer.getOrCreateUser(): BungeeVanishUser { - return getInstance().getUser(this.uniqueId) ?: BungeeVanishUser(this.uniqueId, this.name ?: "N/A") - } + @JvmStatic + suspend fun ProxiedPlayer.getOrCreateUser(): VanishUser { + return getDatabase().getVanishUser(this.uniqueId).await() ?: VanishUser.of(this.uniqueId, this.name ?: "N/A") + } - @JvmStatic - fun ProxiedPlayer.getOrAddUser(): BungeeVanishUser { - return getInstance().getUser(this.uniqueId) ?: let { - val newUser = BungeeVanishUser(this.uniqueId, this.name ?: "N/A") - getInstance().database.addVanishUser(newUser) - newUser - } + @JvmStatic + suspend fun ProxiedPlayer.getOrAddUser(): VanishUser { + return getDatabase().getVanishUser(this.uniqueId).await() ?: let { + val newUser = BungeeVanishUser(this.uniqueId, this.name ?: "N/A") + getDatabase().addVanishUser(newUser).await() + newUser } } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt index e1bfa48a..0d70fdb1 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt @@ -1,11 +1,13 @@ package org.sayandev.sayanvanish.bungeecord.feature.features +import kotlinx.coroutines.delay import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI import org.sayandev.sayanvanish.bungeecord.event.BungeeUserUnVanishEvent import org.sayandev.sayanvanish.bungeecord.event.BungeeUserVanishEvent import org.sayandev.sayanvanish.bungeecord.feature.ListenedFeature import org.sayandev.stickynote.bungeecord.StickyNote +import org.sayandev.stickynote.bungeecord.launch import org.sayandev.stickynote.bungeecord.plugin import org.spongepowered.configurate.objectmapping.ConfigSerializable import java.util.* @@ -14,30 +16,35 @@ import java.util.concurrent.TimeUnit @RegisteredFeature @ConfigSerializable class FeatureSyncEvents( - val checkPeriodMillis: Long = 50 + // TODO: previous time was 50millis, think of something to ignore/reset previous value + val checkPeriodMillis: Long = 1000L ) : ListenedFeature("sync_events") { @Transient val previousUsers = mutableMapOf() override fun enable() { - StickyNote.run({ - for (user in SayanVanishBungeeAPI.getInstance().database.getVanishUsers()) { - if (previousUsers[user.uniqueId] == null) { - previousUsers[user.uniqueId] = user.isVanished - continue - } + launch { + delay(checkPeriodMillis) + while (isActive()) { + for (user in SayanVanishBungeeAPI.getDatabase().getVanishUsers().await()) { + if (previousUsers[user.uniqueId] == null) { + previousUsers[user.uniqueId] = user.isVanished + continue + } - if (previousUsers[user.uniqueId] == false && user.isVanished) { - previousUsers[user.uniqueId] = true - plugin.proxy.pluginManager.callEvent(BungeeUserVanishEvent(user, user.currentOptions)) - } + if (previousUsers[user.uniqueId] == false && user.isVanished) { + previousUsers[user.uniqueId] = true + plugin.proxy.pluginManager.callEvent(BungeeUserVanishEvent(SayanVanishBungeeAPI.adapt(user), user.currentOptions)) + } - if (previousUsers[user.uniqueId] == true && !user.isVanished) { - previousUsers[user.uniqueId] = false - plugin.proxy.pluginManager.callEvent(BungeeUserUnVanishEvent(user, user.currentOptions)) + if (previousUsers[user.uniqueId] == true && !user.isVanished) { + previousUsers[user.uniqueId] = false + plugin.proxy.pluginManager.callEvent(BungeeUserUnVanishEvent(SayanVanishBungeeAPI.adapt(user), user.currentOptions)) + } } + delay(checkPeriodMillis) } - }, checkPeriodMillis, checkPeriodMillis, TimeUnit.MILLISECONDS) + } super.enable() } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt index 1784991a..07a5a389 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt @@ -10,7 +10,7 @@ import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI.Companion.getOrCreateUser +import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI.getOrCreateUser import org.sayandev.sayanvanish.bungeecord.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -23,9 +23,10 @@ class FeaturePreventTabComplete( @EventHandler(priority = EventPriority.HIGHEST) fun onTabComplete(event: TabCompleteEvent) { val player = event.sender as? ProxiedPlayer ?: return + // TODO: We really need a cache for tabcomplete, not time based cache. it needs to only update the cache if needed. but we don't have redis messaging val user = player.getOrCreateUser() if (!isActive(user)) return - val vanishedUsers = SayanVanishBungeeAPI.getInstance().getVanishedUsers() + val vanishedUsers = SayanVanishBungeeAPI.getVanishedUsers() if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { event.suggestions .removeIf { suggestion -> vanishedUsers.map(VanishUser::username).contains(suggestion) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt index 0a8f782e..5578408e 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt @@ -7,7 +7,6 @@ import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.plugin.annotation.DataDirectory import com.velocitypowered.api.proxy.ProxyServer import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.database.DatabaseMethod import org.sayandev.sayanvanish.api.database.databaseConfig import org.sayandev.sayanvanish.api.database.sql.SQLDatabase @@ -82,7 +81,7 @@ class SayanVanish @Inject constructor( if (databaseConfig.method == DatabaseMethod.SQL) { SayanVanishVelocityAPI.getInstance().database.getBasicUsersAsync { users -> (SayanVanishVelocityAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() - (SayanVanishAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() + (SayanVanishAPI.getDatabase() as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() } } }, settings.general.basicCacheUpdatePeriodMillis, TimeUnit.MILLISECONDS, settings.general.basicCacheUpdatePeriodMillis, TimeUnit.MILLISECONDS) @@ -90,7 +89,7 @@ class SayanVanish @Inject constructor( StickyNote.run({ SayanVanishVelocityAPI.getInstance().database.getUsersAsync { users -> SayanVanishVelocityAPI.getInstance().database.cache = users.associateBy { it.uniqueId }.toMutableMap() - SayanVanishAPI.getInstance().database.cache = users.associateBy { it.uniqueId }.toMutableMap() + SayanVanishAPI.getDatabase().cache = users.associateBy { it.uniqueId }.toMutableMap() } }, settings.general.cacheUpdatePeriodMillis, TimeUnit.MILLISECONDS, settings.general.cacheUpdatePeriodMillis, TimeUnit.MILLISECONDS) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt index af85a19f..53ed0b37 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt @@ -1,7 +1,6 @@ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player -import org.sayandev.sayanvanish.api.SayanVanishAPI import java.util.UUID val database = SayanVanishVelocityAPI.getInstance().database diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index 529f8813..98839140 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -3,7 +3,6 @@ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features @@ -29,7 +28,7 @@ open class VelocityVanishUser( set(_) {} override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false - override var isOnline: Boolean = SayanVanishAPI.getInstance().database.hasUser(uniqueId, true) + override var isOnline: Boolean = SayanVanishAPI.getDatabase().hasUser(uniqueId, true) override var vanishLevel: Int = 0 get() = player()?.let { player -> val luckPermsHook = Features.getFeature() diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt index 51bedf8f..f60e588d 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -5,7 +5,6 @@ import ch.andre601.advancedserverlist.api.PlaceholderProvider import ch.andre601.advancedserverlist.api.exceptions.InvalidPlaceholderProviderException import ch.andre601.advancedserverlist.api.objects.GenericPlayer import ch.andre601.advancedserverlist.api.objects.GenericServer -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI @@ -65,9 +64,9 @@ private class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } return if (type.equals("total", true)) { - SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } else { - SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt index 0a08ed30..f113b15f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt @@ -23,7 +23,7 @@ class FeatureHookEnhancedVelocity : HookFeature("hook_enhancedvelocity", "enhanc private class EnhancedVelocityImpl : VanishHook { override fun setIsVanished(uniqueId: UUID): Boolean { - return SayanVanishVelocityAPI.getInstance().isVanished(uniqueId) + return SayanVanishVelocityAPI.getInstance().isVanishedAsync(uniqueId) } override fun setVanished(uniqueId: UUID) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt index a26db05d..e9eb1eed 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -3,7 +3,6 @@ package org.sayandev.sayanvanish.velocity.feature.features.hook import com.velocitypowered.api.proxy.Player import io.github.miniplaceholders.api.Expansion import io.github.miniplaceholders.api.utils.TagsUtils -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI @@ -64,19 +63,19 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) for (server in plugin.server.allServers) { builder.globalPlaceholder("online_${server.serverInfo.name.lowercase()}") { queue, context -> val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } - TagsUtils.staticTag(SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { it.serverId.lowercase() == server.serverInfo.name.lowercase() && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) + TagsUtils.staticTag(SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId.lowercase() == server.serverInfo.name.lowercase() && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) } } builder.audiencePlaceholder("online_here") { audience, queue, context -> val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("0") val currentServerVanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline && user.serverId == player.currentServer.getOrNull()?.serverInfo?.name } - TagsUtils.staticTag(SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !currentServerVanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) + TagsUtils.staticTag(SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !currentServerVanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) } builder.globalPlaceholder("online_total") { queue, context -> val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } - TagsUtils.staticTag(SayanVanishAPI.getInstance().database.getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) + TagsUtils.staticTag(SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) } builder.build().register() diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt index 0762db09..786301c7 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt @@ -34,7 +34,7 @@ class FeatureHookTAB( private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegration(plugin.container.description.name.get()) { override fun isVanished(player: TabPlayer): Boolean { - return SayanVanishVelocityAPI.getInstance().isVanished(player.uniqueId, feature.useCacheData) + return SayanVanishVelocityAPI.getInstance().isVanishedAsync(player.uniqueId, feature.useCacheData) } override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { diff --git a/settings.gradle.kts b/settings.gradle.kts index 5b166b7a..0ff308ef 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,7 +9,7 @@ pluginManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" - id("org.sayandev.stickynote.settings") version "1.9.1" + id("org.sayandev.stickynote.settings") version "1.9.1.9" } rootProject.name = "SayanVanish" From 4d582ff8f3932e4582cffdf125646bb549a6e896 Mon Sep 17 00:00:00 2001 From: Syrent Date: Wed, 7 May 2025 11:23:41 +0330 Subject: [PATCH 03/67] wip --- .../org/sayandev/sayanvanish/api/VanishAPI.kt | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt new file mode 100644 index 00000000..86b3f762 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt @@ -0,0 +1,55 @@ +package org.sayandev.sayanvanish.api + +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.future.asCompletableFuture +import kotlinx.coroutines.runBlocking +import org.sayandev.sayanvanish.api.database.Database +import java.util.* +import java.util.concurrent.CompletableFuture + +interface VanishAPI { + fun getDatabase(): Database + + fun getPlatform(): Platform + + fun isVanished(uniqueId: UUID): Deferred + + fun isVanishedFuture(uniqueId: UUID): CompletableFuture { + return isVanished(uniqueId).asCompletableFuture() + } + + fun isVanishedSync(uniqueId: UUID): Boolean { + return runBlocking { isVanished(uniqueId).await() } + } + + fun canSee(user: VanishUser?, target: VanishUser): Boolean + + fun getOnlineVanishUsers(): Deferred> + + fun getOnlineVanishUsersFuture(): CompletableFuture> { + return getOnlineVanishUsers().asCompletableFuture() + } + + fun getOnlineVanishedUsers(): Deferred> + + fun getVanishedUsersFuture(): CompletableFuture> { + return getVanishedUsers().asCompletableFuture() + } + + fun getVanishedUsers(): Deferred> + + companion object { + private val defaultInstance = SayanVanishAPI + + @JvmStatic + fun get(): SayanVanishAPI { + return defaultInstance + } + + @JvmStatic + suspend fun UUID.vanishUser(): VanishUser? { + return get().getDatabase().getVanishUser(this).await() + } + } + +} \ No newline at end of file From 2cf925e66e64518c8646e52dcf4225acdfe605ed Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 12 Jun 2025 12:05:15 +0330 Subject: [PATCH 04/67] wip --- TODO.md | 5 ++ .../org/sayandev/sayanvanish/api/Queue.kt | 2 +- .../sayanvanish/api/SayanVanishAPI.kt | 1 + .../org/sayandev/sayanvanish/api/User.kt | 2 +- .../sayandev/sayanvanish/api/VanishUser.kt | 16 +++--- .../sayandev/sayanvanish/api/cache/Cache.kt | 9 +++ .../sayanvanish/api/cache/UserCountCache.kt | 7 +++ .../sayanvanish/api/cache/VanishUserCache.kt | 6 ++ .../sayanvanish/api/database/Database.kt | 40 +++++++++++++ .../api/database/TransactionDatabase.kt | 5 ++ .../api/database/TransactionTypes.kt | 1 + .../api/database/redis/RedisDatabase.kt | 10 ++++ .../api/database/sql/SQLDatabase.kt | 45 ++++++++++++--- .../sayanvanish/bukkit/api/BukkitUser.kt | 18 ++++++ .../bukkit/api/BukkitVanishUser.kt | 4 +- .../bukkit/command/SayanVanishCommand.kt | 4 +- .../bukkit/config/SettingsConfig.kt | 5 ++ .../features/FeatureProxyVanishQueue.kt | 5 +- .../bukkit/feature/features/FeatureState.kt | 8 +-- .../sayanvanish/bungeecord/api/BungeeUser.kt | 27 +++++++++ .../bungeecord/api/BungeeVanishUser.kt | 8 +-- .../prevent/FeaturePreventTabComplete.kt | 16 +++--- .../sayanvanish/velocity/SayanVanish.kt | 41 +++++-------- .../sayanvanish/velocity/VanishManager.kt | 27 +++++---- .../velocity/VelocityPlatformAdapter.kt | 12 ++++ .../velocity/api/SayanVanishVelocityAPI.kt | 40 +------------ .../sayanvanish/velocity/api/VelocityUser.kt | 18 ++++++ .../velocity/api/VelocityVanishUser.kt | 57 +++++++++++-------- .../SayanVanishProxyCommandVelocity.kt | 46 ++++++++------- .../feature/features/FeatureSyncEvents.kt | 39 ++++++++----- .../feature/features/FeatureUpdate.kt | 21 ++++--- .../feature/features/FeatureUpdatePing.kt | 6 +- .../hook/FeatureHookAdvancedServerList.kt | 25 ++++---- .../hook/FeatureHookEnhancedVelocity.kt | 18 ++++-- .../hook/FeatureHookMiniPlaceholders.kt | 33 +++++++---- .../feature/features/hook/FeatureHookTAB.kt | 9 +-- .../features/hook/FeatureHookVelocitab.kt | 11 ++-- settings.gradle.kts | 2 +- 38 files changed, 424 insertions(+), 225 deletions(-) create mode 100644 TODO.md create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/UserCountCache.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/VanishUserCache.kt create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt create mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt create mode 100644 sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt create mode 100644 sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt diff --git a/TODO.md b/TODO.md new file mode 100644 index 00000000..1b2714d5 --- /dev/null +++ b/TODO.md @@ -0,0 +1,5 @@ +v2 TODO List: +- [ ] Implement new database using exposed +- [ ] Implement new user api +- [ ] Implement a complete caching api +- [ ] Implement a complete messaging api (requires new messaging api in stickynote) \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt index 3bdaaec1..f890c9a4 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.api -import org.jetbrains.exposed.sql.Table +import org.jetbrains.exposed.v1.core.Table import java.util.UUID class Queue( diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index cb1ad73b..8f07a97f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -3,6 +3,7 @@ package org.sayandev.sayanvanish.api import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.runBlocking +import org.sayandev.sayanvanish.api.cache.VanishUserCache import org.sayandev.sayanvanish.api.database.Database import org.sayandev.sayanvanish.api.database.TransactionDatabase import org.sayandev.stickynote.core.utils.launch diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 410f40f6..bc0f1e03 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -3,7 +3,7 @@ package org.sayandev.sayanvanish.api import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParser -import org.jetbrains.exposed.sql.Table +import org.jetbrains.exposed.v1.core.Table import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import java.util.* diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index a26e92c3..e5df6759 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -4,7 +4,7 @@ import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParser import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver -import org.jetbrains.exposed.sql.Table +import org.jetbrains.exposed.v1.core.Table import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import java.util.* @@ -13,26 +13,26 @@ interface VanishUser : User { var isVanished: Boolean var vanishLevel: Int - suspend fun vanish(options: VanishOptions) { + suspend fun disappear(options: VanishOptions) { isVanished = true save() } - suspend fun vanish() { - vanish(VanishOptions.defaultOptions()) + suspend fun disappear() { + disappear(VanishOptions.defaultOptions()) } - suspend fun unVanish(options: VanishOptions) { + suspend fun appear(options: VanishOptions) { isVanished = false save() } - suspend fun unVanish() { - unVanish(VanishOptions.defaultOptions()) + suspend fun appear() { + appear(VanishOptions.defaultOptions()) } suspend fun toggleVanish(options: VanishOptions) { - if (isVanished) unVanish(options) else vanish(options) + if (isVanished) appear(options) else disappear(options) } suspend fun toggleVanish() { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt new file mode 100644 index 00000000..449b1578 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt @@ -0,0 +1,9 @@ +package org.sayandev.sayanvanish.api.cache + +abstract class Cache( + id: String +) : MutableMap by mutableMapOf() { + fun getValue(key: K): V? { + return this[key] + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/UserCountCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/UserCountCache.kt new file mode 100644 index 00000000..77084894 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/UserCountCache.kt @@ -0,0 +1,7 @@ +package org.sayandev.sayanvanish.api.cache + +class UserCountCache : Cache("user_count") { + fun totalCount(): Int { + return values.sumOf { it } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/VanishUserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/VanishUserCache.kt new file mode 100644 index 00000000..df3a5426 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/VanishUserCache.kt @@ -0,0 +1,6 @@ +package org.sayandev.sayanvanish.api.cache + +import org.sayandev.sayanvanish.api.VanishUser +import java.util.UUID + +class VanishUserCache : Cache("vanish_users") \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt index 9fc0e709..1bb2124d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt @@ -5,6 +5,8 @@ import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.cache.UserCountCache +import org.sayandev.sayanvanish.api.cache.VanishUserCache import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import org.sayandev.stickynote.core.utils.async import java.util.* @@ -80,6 +82,12 @@ interface Database { return runBlocking { getVanishUsers().await() } } + suspend fun getUser(uniqueId: UUID): Deferred + + fun getUserFuture(uniqueId: UUID): CompletableFuture { + return async(dispatcher) { getUser(uniqueId).await() }.asCompletableFuture() + } + suspend fun getUsers(): Deferred> fun getUsersFuture(): CompletableFuture> { @@ -187,4 +195,36 @@ interface Database { fun purgeUsersFuture(serverId: String): CompletableFuture { return async(dispatcher) { purgeUsers(serverId).await() }.asCompletableFuture() } + + fun getCachedVanishUsers(): VanishUserCache { + return vanishUserCache + } + + fun getCachedVanishUser(uniqueId: UUID): VanishUser? { + return vanishUserCache[uniqueId] + } + + fun getVanishUserCache(uniqueId: UUID): VanishUser? { + return vanishUserCache[uniqueId] + } + + fun getCachedUserCount(): UserCountCache { + return userCountCache + } + + fun getServerUserCountCache(serverId: String): Int { + return userCountCache[serverId] ?: 0 + } + + companion object { + @JvmStatic + val vanishUserCache: VanishUserCache by lazy { + VanishUserCache() + } + + @JvmStatic + val userCountCache: UserCountCache by lazy { + UserCountCache() + } + } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt index 3a8305ee..6e5e51fb 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt @@ -102,6 +102,11 @@ class TransactionDatabase: Database { return database.getVanishUsers() } + override suspend fun getUser(uniqueId: UUID): Deferred { + val database = database(TransactionTypes.GET_USER) + return database.getUser(uniqueId) + } + override suspend fun getUsers(): Deferred> { val database = database(TransactionTypes.GET_USERS) return database.getUsers() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt index 3540b2de..4bdd009b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt @@ -10,6 +10,7 @@ enum class TransactionTypes( REMOVE_VANISH_USER("remove_vanish_user", DatabaseMethod.SQL), GET_VANISH_USER("get_vanish_user", DatabaseMethod.SQL), GET_VANISH_USERS("get_vanish_users", DatabaseMethod.SQL), + GET_USER("get_user", DatabaseMethod.SQL), GET_USERS("get_users", DatabaseMethod.SQL), ADD_USER("add_user", DatabaseMethod.SQL), HAS_USER("has_user", DatabaseMethod.SQL), diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt index b1749ee9..8bc1088f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt @@ -73,6 +73,16 @@ class RedisDatabase( } } + override suspend fun getUser(uniqueId: UUID): Deferred { + return async { + redis + .hget("users", uniqueId.toString()) + ?.let { + User.fromJson(it) + } + } + } + override suspend fun getUsers(): Deferred> { return async { redis diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt index dba90310..786f2f20 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt @@ -5,12 +5,14 @@ import com.zaxxer.hikari.HikariDataSource import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.awaitAll -import org.jetbrains.exposed.sql.* -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.transactions.TransactionManager -import org.jetbrains.exposed.sql.transactions.experimental.suspendedTransactionAsync +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import org.jetbrains.exposed.v1.core.SqlExpressionBuilder.eq +import org.jetbrains.exposed.v1.core.Transaction +import org.jetbrains.exposed.v1.jdbc.* +import org.jetbrains.exposed.v1.jdbc.transactions.TransactionManager +import org.jetbrains.exposed.v1.jdbc.transactions.experimental.suspendedTransactionAsync import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.PlatformAdapter import org.sayandev.sayanvanish.api.Queue import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser @@ -31,13 +33,16 @@ class SQLDatabase( config.sqlDispatcherThreadCount, ) + // TODO: implement new caching api + var users = mutableMapOf() + val tables = listOf( User.Schema, VanishUser.Schema, Queue.Schema, ) - lateinit var database: org.jetbrains.exposed.sql.Database + lateinit var database: org.jetbrains.exposed.v1.jdbc.Database override suspend fun initialize(): Deferred { SchemaUtils.createMissingTablesAndColumns( @@ -89,8 +94,18 @@ class SQLDatabase( this.addDataSourceProperty("allowPublicKeyRetrieval", "true") } val dataSource = HikariDataSource(hikariConfig) - database = org.jetbrains.exposed.sql.Database.connect(dataSource) + database = org.jetbrains.exposed.v1.jdbc.Database.connect(dataSource) TransactionManager.defaultDatabase = database + + // TODO: Implement a proper cache system + // TODO: probably update the cache on every update using messaging api + launch(dispatcher) { + while (isActive) { + users = getVanishUsers().await().associateBy { it.uniqueId }.toMutableMap() + delay(1000) + } + } + return CompletableDeferred(true) } @@ -134,6 +149,22 @@ class SQLDatabase( } } + override suspend fun getUser(uniqueId: UUID): Deferred { + return async { + User.Schema + .selectAll() + .firstOrNull { it[User.Schema.uniqueId] == uniqueId } + ?.let { result -> + User.of( + result[User.Schema.uniqueId], + result[User.Schema.username], + result[User.Schema.isOnline], + result[User.Schema.serverId] + ) + } + } + } + override suspend fun getUsers(): Deferred> { return async { User.Schema diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt new file mode 100644 index 00000000..65d3e363 --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -0,0 +1,18 @@ +package org.sayandev.sayanvanish.bukkit.api + +import org.bukkit.entity.Player +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.bukkit.config.settings + +class BukkitUser { + companion object { + fun Player.generateUser(): User { + return User.of( + this.uniqueId, + this.name, + this.isOnline, + settings.serverId() + ) + } + } +} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index b6dfa6a9..352a2f1c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -75,7 +75,7 @@ open class BukkitVanishUser( player()?.setMetadata("vanished", FixedMetadataValue(plugin, true)) - super.vanish(options) + super.disappear(options) // order matters - don't move hideUser before vanish (hideUser have a canSee check for vanish state notify) hideUser() @@ -98,7 +98,7 @@ open class BukkitVanishUser( player()?.removeMetadata("vanished", plugin) showUser() - super.unVanish(options) + super.appear(options) sendComponent(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index c6264893..707b8641 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -100,8 +100,8 @@ class SayanVanishCommand : BukkitCommand(settings.vanishCommand.name, *settings. } when (state) { - "on" -> user.vanish(options) - "off" -> user.unVanish(options) + "on" -> user.disappear(options) + "off" -> user.appear(options) else -> user.toggleVanish(options) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt index 664c6d7a..f5b0950b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt @@ -65,6 +65,11 @@ class SettingsConfig( ) ) + fun serverId(): String { + // TODO: use proxy server name on proxy servers + return general.serverId + } + companion object { private val fileName = "settings.yml" val settingsFile = File(pluginDirectory, fileName) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureProxyVanishQueue.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureProxyVanishQueue.kt index 70f63ec1..bfc247cd 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureProxyVanishQueue.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureProxyVanishQueue.kt @@ -9,7 +9,6 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrA import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.runSync -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -38,9 +37,9 @@ class FeatureProxyVanishQueue( this.sendMessage = false } if (isVanished) { - user.vanish(options) + user.disappear(options) } else { - user.unVanish(options) + user.appear(options) } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index a4529111..2a3ccccc 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -54,7 +54,7 @@ class FeatureState( if (tempUser.hasPermission(Permission.VANISH_ON_JOIN) || vanishOnJoin) { tempUser.isVanished = true - tempUser.vanish(vanishJoinOptions) + tempUser.disappear(vanishJoinOptions) tempUser.save() } return @@ -64,14 +64,14 @@ class FeatureState( if (checkPermissionOnJoin && !user.hasPermission(Permission.VANISH)) { user.sendComponent(language.vanish.noPermissionToKeepVanished, Placeholder.unparsed("permission", Permission.VANISH.permission())) - user.unVanish(vanishJoinOptions) + user.appear(vanishJoinOptions) user.delete() return } if (user.hasPermission(Permission.VANISH_ON_JOIN) || (user.isVanished && remember) || vanishOnJoin) { user.isVanished = true - user.vanish(vanishJoinOptions) + user.disappear(vanishJoinOptions) } if (user.isVanished) { @@ -100,7 +100,7 @@ class FeatureState( } if ((reappearOnQuit && user.isVanished) || (checkPermissionOnQuit && !user.hasPermission(Permission.VANISH))) { - user.unVanish(VanishOptions.Builder().isOnQuit(true).build()) + user.appear(VanishOptions.Builder().isOnQuit(true).build()) } user.isOnline = false diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt new file mode 100644 index 00000000..679a1206 --- /dev/null +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt @@ -0,0 +1,27 @@ +package org.sayandev.sayanvanish.bungeecord.api + +import net.md_5.bungee.api.connection.ProxiedPlayer +import org.sayandev.sayanvanish.api.SayanVanishAPI +import org.sayandev.sayanvanish.api.User +import org.sayandev.stickynote.bungeecord.launch + +class BungeeUser { + companion object { + fun ProxiedPlayer.generateUser(): User { + return User.of( + this.uniqueId, + this.name, + this.isConnected, + this.server?.info?.name + ) + } + + fun ProxiedPlayer.generateAndSaveUser(): User { + val user = this.generateUser() + launch { + SayanVanishAPI.get().getDatabase().addUser(user) + } + return user + } + } +} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt index f31d6255..10f1cb83 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt @@ -38,7 +38,7 @@ open class BungeeVanishUser( fun player(): ProxiedPlayer? = StickyNote.getPlayer(uniqueId) - override suspend fun vanish(options: VanishOptions) { + override suspend fun disappear(options: VanishOptions) { val vanishEvent = plugin.proxy.pluginManager.callEvent(BungeeUserVanishEvent(this, options)) if (vanishEvent.isCancelled) return @@ -46,10 +46,10 @@ open class BungeeVanishUser( currentOptions = options SayanVanishAPI.getDatabase().addToQueue(uniqueId, true) - super.vanish(options) + super.disappear(options) } - override suspend fun unVanish(options: VanishOptions) { + override suspend fun appear(options: VanishOptions) { val vanishEvent = plugin.proxy.pluginManager.callEvent(BungeeUserUnVanishEvent(this, options)) if (vanishEvent.isCancelled) return @@ -57,7 +57,7 @@ open class BungeeVanishUser( currentOptions = options SayanVanishAPI.getDatabase().addToQueue(uniqueId, false) - super.unVanish(options) + super.appear(options) } override fun hasPermission(permission: String): Boolean { diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt index 07a5a389..69bcdb99 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt @@ -5,12 +5,13 @@ import net.md_5.bungee.api.event.TabCompleteEvent import net.md_5.bungee.event.EventHandler import net.md_5.bungee.event.EventPriority import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bungeecord.api.BungeeUser.Companion.generateAndSaveUser import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI.getOrCreateUser import org.sayandev.sayanvanish.bungeecord.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -23,19 +24,20 @@ class FeaturePreventTabComplete( @EventHandler(priority = EventPriority.HIGHEST) fun onTabComplete(event: TabCompleteEvent) { val player = event.sender as? ProxiedPlayer ?: return - // TODO: We really need a cache for tabcomplete, not time based cache. it needs to only update the cache if needed. but we don't have redis messaging - val user = player.getOrCreateUser() + val user = VanishAPI.get().getDatabase().getUserCache(player.uniqueId) ?: player.generateAndSaveUser() if (!isActive(user)) return - val vanishedUsers = SayanVanishBungeeAPI.getVanishedUsers() + val vanishUsers = SayanVanishBungeeAPI.getDatabase().getCachedVanishUsers().values if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { event.suggestions - .removeIf { suggestion -> vanishedUsers.map(VanishUser::username).contains(suggestion) } + .removeIf { suggestion -> vanishUsers.map(VanishUser::username).contains(suggestion) } return } + + val vanishUser = vanishUsers.firstOrNull { it.uniqueId == user.uniqueId } event.suggestions.removeIf { suggestion -> - vanishedUsers - .filter { vanishedUser -> vanishedUser.vanishLevel > user.vanishLevel } + vanishUsers + .filter { otherVanishUser -> otherVanishUser.vanishLevel > (vanishUser?.vanishLevel ?: -1) } .map(VanishUser::username).contains(suggestion) } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt index 5578408e..d2206cd3 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt @@ -7,6 +7,7 @@ import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.plugin.annotation.DataDirectory import com.velocitypowered.api.proxy.ProxyServer import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.database.DatabaseMethod import org.sayandev.sayanvanish.api.database.databaseConfig import org.sayandev.sayanvanish.api.database.sql.SQLDatabase @@ -18,6 +19,7 @@ import org.sayandev.sayanvanish.velocity.health.HealthCheckMessageSubscriber import org.sayandev.sayanvanish.velocity.health.ServerInfoPublisher import org.sayandev.stickynote.loader.velocity.StickyNoteVelocityLoader import org.sayandev.stickynote.velocity.StickyNote +import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.registerListener import org.slf4j.Logger import java.io.File @@ -46,7 +48,7 @@ class SayanVanish @Inject constructor( sayanvanish = this Platform.get().rootDirectory = dataDirectory.toFile() - if (!Platform.setAndRegister(Platform("velocity", java.util.logging.Logger.getLogger("sayanvanish"), dataDirectory.toFile(), ""))) return + if (!Platform.setAndRegister(Platform("velocity", PLUGIN_ID, java.util.logging.Logger.getLogger("sayanvanish"), dataDirectory.toFile(), "", VelocityPlatformAdapter))) return settings language @@ -63,35 +65,22 @@ class SayanVanish @Inject constructor( registerListener(VanishManager) - if (settings.general.purgeOnlineHistoryOnStartup) { - for (onlineServer in server.allServers) { - SayanVanishVelocityAPI.getInstance().database.purgeUsers(onlineServer.serverInfo.name) - } - SayanVanishVelocityAPI.getInstance().database.purgeUsers(settings.general.serverId) - } - - if (settings.general.purgeUsersOnStartup) { - for (user in SayanVanishVelocityAPI.getInstance().getOnlineUsers()) { - user.isOnline = false - user.save() - } - } - - StickyNote.run({ - if (databaseConfig.method == DatabaseMethod.SQL) { - SayanVanishVelocityAPI.getInstance().database.getBasicUsersAsync { users -> - (SayanVanishVelocityAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() - (SayanVanishAPI.getDatabase() as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() + // TODO: move this somewhere else. it's not something to be on main class and the main initialization method + launch { + if (settings.general.purgeOnlineHistoryOnStartup) { + for (onlineServer in server.allServers) { + VanishAPI.get().getDatabase().purgeUsers(onlineServer.serverInfo.name) } + VanishAPI.get().getDatabase().purgeUsers(settings.general.serverId) } - }, settings.general.basicCacheUpdatePeriodMillis, TimeUnit.MILLISECONDS, settings.general.basicCacheUpdatePeriodMillis, TimeUnit.MILLISECONDS) - StickyNote.run({ - SayanVanishVelocityAPI.getInstance().database.getUsersAsync { users -> - SayanVanishVelocityAPI.getInstance().database.cache = users.associateBy { it.uniqueId }.toMutableMap() - SayanVanishAPI.getDatabase().cache = users.associateBy { it.uniqueId }.toMutableMap() + if (settings.general.purgeUsersOnStartup) { + for (user in VanishAPI.get().getDatabase().getUsers().await()) { + user.isOnline = false + user.save() + } } - }, settings.general.cacheUpdatePeriodMillis, TimeUnit.MILLISECONDS, settings.general.cacheUpdatePeriodMillis, TimeUnit.MILLISECONDS) + } } fun pluginFile(): File? { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt index 0563f93f..78de065b 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt @@ -3,12 +3,14 @@ package org.sayandev.sayanvanish.velocity import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.connection.DisconnectEvent import com.velocitypowered.api.event.player.ServerPostConnectEvent -import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateUser +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent +import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.server import kotlin.jvm.optionals.getOrNull @@ -17,19 +19,24 @@ object VanishManager { @Subscribe private fun onPostLogin(event: ServerPostConnectEvent) { val player = event.player ?: return - SayanVanishVelocityAPI.getInstance().database.addUser(User.of(player.uniqueId, player.username, player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id)) - val user = player.getOrCreateUser() - if (user.isVanished) { - server.eventManager.fireAndForget(VelocityUserVanishEvent(user, user.currentOptions)) - } else { - server.eventManager.fireAndForget(VelocityUserUnVanishEvent(user, user.currentOptions)) + launch { + VanishAPI.get().getDatabase().addUser(User.of(player.uniqueId, player.username, true, player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id)) + + val user = player.getVanishUser() ?: player.generateVanishUser() + if (user.isVanished) { + server.eventManager.fireAndForget(VelocityUserVanishEvent(user, user.currentOptions)) + } else { + server.eventManager.fireAndForget(VelocityUserUnVanishEvent(user, user.currentOptions)) + } } } @Subscribe private fun onDisconnect(event: DisconnectEvent) { val player = event.player ?: return - SayanVanishVelocityAPI.getInstance().database.removeUser(player.uniqueId) + launch { + VanishAPI.get().getDatabase().removeUser(player.uniqueId) + } } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt new file mode 100644 index 00000000..4adc1f86 --- /dev/null +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt @@ -0,0 +1,12 @@ +package org.sayandev.sayanvanish.velocity + +import org.sayandev.sayanvanish.api.PlatformAdapter +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.velocity.api.VelocityUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser + +object VelocityPlatformAdapter : PlatformAdapter { + override fun adapt(user: VanishUser): VelocityVanishUser { + return VelocityVanishUser(user.uniqueId, user.username) + } +} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt index 53ed0b37..978aa023 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt @@ -1,41 +1,5 @@ package org.sayandev.sayanvanish.velocity.api -import com.velocitypowered.api.proxy.Player -import java.util.UUID +import org.sayandev.sayanvanish.api.VanishAPI -val database = SayanVanishVelocityAPI.getInstance().database - -class SayanVanishVelocityAPI() : SayanVanishAPI(VelocityVanishUser::class.java) { - companion object { - private val defaultInstance = SayanVanishVelocityAPI() - - @JvmStatic - fun getInstance(): SayanVanishAPI { - return defaultInstance - } - - @JvmStatic - public fun UUID.user(): VelocityVanishUser? { - return getInstance().getUser(this) - } - - @JvmStatic - public fun Player.user(): VelocityVanishUser? { - return getInstance().getUser(this.uniqueId) - } - - @JvmStatic - fun Player.getOrCreateUser(): VelocityVanishUser { - return getInstance().getUser(this.uniqueId) ?: VelocityVanishUser(this.uniqueId, this.username ?: "N/A") - } - - @JvmStatic - fun Player.getOrAddUser(): VelocityVanishUser { - return getInstance().getUser(this.uniqueId) ?: let { - val newUser = VelocityVanishUser(this.uniqueId, this.username ?: "N/A") - getInstance().database.addVanishUser(newUser) - newUser - } - } - } -} \ No newline at end of file +object SayanVanishVelocityAPI : VanishAPI by VanishAPI.get() \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt new file mode 100644 index 00000000..eb67fbc6 --- /dev/null +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt @@ -0,0 +1,18 @@ +package org.sayandev.sayanvanish.velocity.api + +import com.velocitypowered.api.proxy.Player +import org.sayandev.sayanvanish.api.User +import kotlin.jvm.optionals.getOrNull + +class VelocityUser { + companion object { + fun Player.generateUser(): User { + return User.of( + this.uniqueId, + this.username, + true, + this.currentServer.getOrNull()?.serverInfo?.name + ) + } + } +} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index 98839140..43cc19c2 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -1,12 +1,15 @@ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player +import kotlinx.coroutines.future.await import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.proxy.config.settings +import org.sayandev.sayanvanish.velocity.VelocityPlatformAdapter import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.sayanvanish.velocity.feature.features.hook.FeatureLuckPermsHook @@ -17,18 +20,17 @@ import org.sayandev.stickynote.velocity.utils.AdventureUtils.component import java.util.* import kotlin.jvm.optionals.getOrNull - open class VelocityVanishUser( override val uniqueId: UUID, override var username: String ) : VanishUser { override var serverId: String - get() = StickyNote.getPlayer(uniqueId)?.currentServer?.getOrNull()?.serverInfo?.name ?: settings.general.serverId + get() = player()?.currentServer?.getOrNull()?.serverInfo?.name ?: settings.general.serverId set(_) {} override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false - override var isOnline: Boolean = SayanVanishAPI.getDatabase().hasUser(uniqueId, true) + override var isOnline: Boolean = player() != null override var vanishLevel: Int = 0 get() = player()?.let { player -> val luckPermsHook = Features.getFeature() @@ -48,28 +50,20 @@ open class VelocityVanishUser( fun player(): Player? = StickyNote.getPlayer(uniqueId) - override fun vanish(options: VanishOptions) { - server.eventManager.fire(VelocityUserVanishEvent(this, options)).whenComplete { event, error -> - error?.printStackTrace() - - val options = event.options - currentOptions = options - - database.addToQueue(uniqueId, true) - super.vanish(options) - } + override suspend fun disappear(options: VanishOptions) { + val event = server.eventManager.fire(VelocityUserVanishEvent(this, options)).await() + val newOptions = event.options + currentOptions = newOptions + VanishAPI.get().getDatabase().addToQueue(uniqueId, true) + super.disappear(newOptions) } - override fun unVanish(options: VanishOptions) { - server.eventManager.fire(VelocityUserUnVanishEvent(this, options)).whenComplete { event, error -> - error?.printStackTrace() - - val options = event.options - currentOptions = options - - database.addToQueue(uniqueId, false) - super.unVanish(options) - } + override suspend fun appear(options: VanishOptions) { + val event = server.eventManager.fire(VelocityUserUnVanishEvent(this, options)).await() + val newOptions = event.options + currentOptions = newOptions + VanishAPI.get().getDatabase().addToQueue(uniqueId, false) + super.appear(newOptions) } override fun hasPermission(permission: String): Boolean { @@ -93,6 +87,23 @@ open class VelocityVanishUser( this.vanishLevel = vanishUser.vanishLevel } } + + @JvmStatic + suspend fun Player.getVanishUser(): VelocityVanishUser? { + val player = this + return VanishAPI.get().getDatabase().getVanishUser(player.uniqueId).await()?.let { VelocityPlatformAdapter.adapt(it) } + } + + @JvmStatic + fun Player.generateVanishUser(): VelocityVanishUser { + val player = this + return VelocityVanishUser(player.uniqueId, player.username) + } + + @JvmStatic + fun VanishUser.adapt(): VelocityVanishUser { + return VelocityPlatformAdapter.adapt(this) + } } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt index 71f666d1..f4108099 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt @@ -8,21 +8,20 @@ import org.incendo.cloud.description.Description import org.incendo.cloud.kotlin.MutableCommandBuilder import org.incendo.cloud.parser.standard.StringParser import org.incendo.cloud.suggestion.Suggestion -import org.incendo.cloud.velocity.VelocityCommandManager import org.incendo.cloud.velocity.parser.PlayerParser import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features -import org.sayandev.sayanvanish.proxy.command.SayanVanishProxyCommand import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.proxy.config.settings -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrAddUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.feature.features.FeatureUpdate import org.sayandev.sayanvanish.velocity.utils.PlayerUtils.sendComponent import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.command.VelocityCommand import org.sayandev.stickynote.velocity.command.VelocitySender -import org.sayandev.stickynote.velocity.command.commandManager +import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.plugin import org.sayandev.stickynote.velocity.utils.AdventureUtils.component import java.util.concurrent.CompletableFuture @@ -62,30 +61,33 @@ class SayanVanishProxyCommandVelocity : VelocityCommand(settings.command.name, * } val player = if (target.isPresent) context.optional("player").get() else context.sender().player() ?: return - val user = player.getOrAddUser() - if (!user.hasPermission(Permission.VANISH)) { - user.sendComponent(language.general.dontHavePermission, Placeholder.unparsed("permission", Permission.VANISH.permission())) - return - } + launch { + val user = player.getVanishUser() ?: player.generateVanishUser() - val options = VanishOptions.defaultOptions().apply { - if (context.flags().hasFlag("silent")) { - this.sendMessage = false + if (!user.hasPermission(Permission.VANISH)) { + user.sendComponent(language.general.dontHavePermission, Placeholder.unparsed("permission", Permission.VANISH.permission())) + return@launch } - } - val targetPlayer = target.getOrNull() ?: sender as? Player ?: let { - sender.sendMessage(language.general.haveToProvidePlayer.component()) - return - } + val options = VanishOptions.defaultOptions().apply { + if (context.flags().hasFlag("silent")) { + this.sendMessage = false + } + } - when (state) { - "on" -> user.vanish(options) - "off" -> user.unVanish(options) - else -> user.toggleVanish(options) + val targetPlayer = target.getOrNull() ?: sender as? Player ?: let { + sender.sendMessage(language.general.haveToProvidePlayer.component()) + return@launch + } + + when (state) { + "on" -> user.disappear(options) + "off" -> user.appear(options) + else -> user.toggleVanish(options) + } + context.sender().platformSender().sendComponent(language.vanish.vanishToggle.component(Placeholder.unparsed("player", targetPlayer.username), Placeholder.parsed("state", user.stateText(!user.isVanished)))) } - context.sender().platformSender().sendComponent(language.vanish.vanishToggle.component(Placeholder.unparsed("player", targetPlayer.username), Placeholder.parsed("state", user.stateText(!user.isVanished)))) } init { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt index 9d124e94..713fe72f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt @@ -1,12 +1,19 @@ package org.sayandev.sayanvanish.velocity.feature.features +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.velocity.VelocityPlatformAdapter import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.adapt import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.sayanvanish.velocity.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.sayandev.stickynote.velocity.StickyNote +import org.sayandev.stickynote.velocity.launch +import org.sayandev.stickynote.velocity.plugin import org.sayandev.stickynote.velocity.server import org.spongepowered.configurate.objectmapping.meta.Comment import java.util.UUID @@ -22,24 +29,28 @@ class FeatureSyncEvents( @Transient val previousUsers = mutableMapOf() override fun enable() { - StickyNote.run({ - for (user in SayanVanishVelocityAPI.getInstance().database.getVanishUsers()) { - if (previousUsers[user.uniqueId] == null) { - previousUsers[user.uniqueId] = user.isVanished - continue - } + launch { + // TODO: rewrite this so it uses messaging to call events + while (isActive) { + for (vanishUser in VanishAPI.get().getDatabase().getVanishUsers().await()) { + if (previousUsers[vanishUser.uniqueId] == null) { + previousUsers[vanishUser.uniqueId] = vanishUser.isVanished + continue + } - if (previousUsers[user.uniqueId] == false && user.isVanished) { - previousUsers[user.uniqueId] = true - server.eventManager.fireAndForget(VelocityUserVanishEvent(user, user.currentOptions)) - } + if (previousUsers[vanishUser.uniqueId] == false && vanishUser.isVanished) { + previousUsers[vanishUser.uniqueId] = true + server.eventManager.fireAndForget(VelocityUserVanishEvent(vanishUser.adapt(), vanishUser.currentOptions)) + } - if (previousUsers[user.uniqueId] == true && !user.isVanished) { - previousUsers[user.uniqueId] = false - server.eventManager.fireAndForget(VelocityUserUnVanishEvent(user, user.currentOptions)) + if (previousUsers[vanishUser.uniqueId] == true && !vanishUser.isVanished) { + previousUsers[vanishUser.uniqueId] = false + server.eventManager.fireAndForget(VelocityUserUnVanishEvent(vanishUser.adapt(), vanishUser.currentOptions)) + } } + delay(checkPeriodMillis) } - }, checkPeriodMillis, TimeUnit.MILLISECONDS, checkPeriodMillis, TimeUnit.MILLISECONDS) + } super.enable() } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt index 6aa8c0be..8e645ccc 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt @@ -9,12 +9,13 @@ import org.sayandev.sayanvanish.api.utils.DownloadUtils import org.sayandev.sayanvanish.api.utils.HangarUtils import org.sayandev.sayanvanish.api.utils.VersionInfo import org.sayandev.sayanvanish.proxy.config.settings -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.user +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.feature.ListenedFeature import org.sayandev.sayanvanish.velocity.sayanvanish import org.sayandev.sayanvanish.velocity.utils.PlayerUtils.sendComponent import org.sayandev.sayanvanish.velocity.utils.PlayerUtils.sendRawComponent import org.sayandev.stickynote.velocity.StickyNote +import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.log import org.sayandev.stickynote.velocity.plugin import org.sayandev.stickynote.velocity.utils.AdventureUtils.component @@ -85,14 +86,16 @@ class FeatureUpdate( @Subscribe private fun onLogin(event: PostLoginEvent) { val player = event.player - val user = player.user() ?: return - if (!isActive(user)) return - if (player.hasPermission(notifyBypassPermission)) return - if (notifyOnJoin && latestRelease != null && latestSnapshot != null) { - sendUpdateNotification(player) - - if (autoUpdateNotification) { - sendUpdateRequest(player) + launch { + val user = player.getVanishUser() ?: return@launch + if (!isActive(user)) return@launch + if (player.hasPermission(notifyBypassPermission)) return@launch + if (notifyOnJoin && latestRelease != null && latestSnapshot != null) { + sendUpdateNotification(player) + + if (autoUpdateNotification) { + sendUpdateRequest(player) + } } } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt index 803b0cfb..a9311ea8 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt @@ -3,8 +3,8 @@ package org.sayandev.sayanvanish.velocity.feature.features import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyPingEvent import com.velocitypowered.api.proxy.server.ServerPing +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable import kotlin.jvm.optionals.getOrNull @@ -17,8 +17,8 @@ class FeatureUpdatePing : ListenedFeature("update_ping") { fun onProxyPing(event: ProxyPingEvent) { if (!isActive()) return val pingPlayers = event.ping.players.getOrNull() ?: return - val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } - val nonVanishedPlayersCount = SayanVanishVelocityAPI.getInstance().database.getBasicUsers(true).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size + val vanishedOnlineUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { vanishUser -> vanishUser.isVanished && vanishUser.isOnline } + val nonVanishedPlayersCount = pingPlayers.online - vanishedOnlineUsers.size val nonVanishedPlayersSample = pingPlayers.sample.filter { !vanishedOnlineUsers.map { it.username }.contains(it.name) } event.ping = event.ping .asBuilder() diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt index f60e588d..de3c9669 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -5,10 +5,9 @@ import ch.andre601.advancedserverlist.api.PlaceholderProvider import ch.andre601.advancedserverlist.api.exceptions.InvalidPlaceholderProviderException import ch.andre601.advancedserverlist.api.objects.GenericPlayer import ch.andre601.advancedserverlist.api.objects.GenericServer +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.proxy.config.language -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.user import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.sayandev.stickynote.velocity.registerListener @@ -34,39 +33,37 @@ private class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { override fun parsePlaceholder( placeholder: String, - player: GenericPlayer?, - server: GenericServer? + player: GenericPlayer, + server: GenericServer ): String? { if (placeholder.equals("vanished", true)) { - if (player == null) return "false" - return if (SayanVanishVelocityAPI.getInstance().getVanishedUsers().map { it.username }.contains(player.name)) "true" else "false" + return if (VanishAPI.get().getDatabase().getVanishUserCache(player.uuid)?.isVanished == true) "true" else "false" } if (placeholder.equals("level", true)) { - if (player == null) return "0" - return player.uuid.user()?.vanishLevel?.toString() ?: "0" + return VanishAPI.get().getDatabase().getVanishUserCache(player.uuid)?.vanishLevel?.toString() ?: "0" } if (placeholder.equals("count", true)) { - return SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() + return VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { user -> user.isOnline && user.isVanished }.size.toString() } if (placeholder.equals("vanish_prefix", true)) { - return if (player?.uuid?.user()?.isVanished == true) language.vanish.placeholderPrefix else "" + return if (VanishAPI.get().getDatabase().getVanishUserCache(player.uuid)?.isVanished == true) language.vanish.placeholderPrefix else "" } if (placeholder.equals("vanish_suffix", true)) { - return if (player?.uuid?.user()?.isVanished == true) language.vanish.placeholderSuffix else "" + return if (VanishAPI.get().getDatabase().getVanishUserCache(player.uuid)?.isVanished == true) language.vanish.placeholderSuffix else "" } if (placeholder.startsWith("online_")) { val type = placeholder.substring(7) - val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { user -> user.isVanished && user.isOnline } return if (type.equals("total", true)) { - SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + VanishAPI.get().getDatabase().getCachedUserCount().totalCount().minus(vanishedOnlineUsers.size).toString() } else { - SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + VanishAPI.get().getDatabase().getCachedUserCount()[type.lowercase()].toString() } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt index f113b15f..8fca506f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt @@ -1,12 +1,14 @@ package org.sayandev.sayanvanish.velocity.feature.features.hook import ir.syrent.enhancedvelocity.api.VanishHook +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.velocity.feature.HookFeature -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrAddUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.sayandev.stickynote.velocity.StickyNote +import org.sayandev.stickynote.velocity.launch import java.util.UUID @RegisteredFeature @@ -23,14 +25,20 @@ class FeatureHookEnhancedVelocity : HookFeature("hook_enhancedvelocity", "enhanc private class EnhancedVelocityImpl : VanishHook { override fun setIsVanished(uniqueId: UUID): Boolean { - return SayanVanishVelocityAPI.getInstance().isVanishedAsync(uniqueId) + return VanishAPI.get().isVanishedSync(uniqueId) } override fun setVanished(uniqueId: UUID) { - StickyNote.getPlayer(uniqueId)?.getOrAddUser()?.vanish() + val player = StickyNote.getPlayer(uniqueId) ?: return + launch { + player.getVanishUser()?.disappear() ?: player.generateVanishUser().disappear() + } } override fun setUnVanished(uniqueId: UUID) { - StickyNote.getPlayer(uniqueId)?.getOrAddUser()?.unVanish() + val player = StickyNote.getPlayer(uniqueId) ?: return + launch { + player.getVanishUser()?.appear() ?: player.generateVanishUser().appear() + } } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt index e9eb1eed..fc3c53db 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -3,11 +3,12 @@ package org.sayandev.sayanvanish.velocity.feature.features.hook import com.velocitypowered.api.proxy.Player import io.github.miniplaceholders.api.Expansion import io.github.miniplaceholders.api.utils.TagsUtils +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.user import org.sayandev.sayanvanish.velocity.feature.HookFeature +import org.sayandev.stickynote.velocity.onlinePlayers import org.sayandev.stickynote.velocity.plugin import org.spongepowered.configurate.objectmapping.ConfigSerializable import kotlin.jvm.optionals.getOrNull @@ -40,42 +41,50 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) builder.audiencePlaceholder("vanished") { audience, queue, context -> val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.EMPTY_TAG - return@audiencePlaceholder TagsUtils.staticTag(if (player.user()?.isVanished == true) "true" else "false") + return@audiencePlaceholder TagsUtils.staticTag(if (VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.isVanished == true) "true" else "false") } builder.audiencePlaceholder("level") { audience, queue, context -> val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("0") - return@audiencePlaceholder TagsUtils.staticTag(player.user()?.vanishLevel?.toString() ?: "0") +// return@audiencePlaceholder TagsUtils.staticTag(player.user()?.vanishLevel?.toString() ?: "0") + return@audiencePlaceholder TagsUtils.staticTag(VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.vanishLevel?.toString() ?: "0") } builder.globalPlaceholder("count") { queue, context -> - TagsUtils.staticTag(SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString()) + TagsUtils.staticTag(VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { user -> user.isOnline && user.isVanished }.size.toString()) } builder.audiencePlaceholder("vanish_prefix") { audience, queue, context -> - TagsUtils.staticTag(if ((audience as? Player)?.user()?.isVanished == true) language.vanish.placeholderPrefix else "") + val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("") + TagsUtils.staticTag(if (VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.isVanished == true) language.vanish.placeholderPrefix else "") } builder.audiencePlaceholder("vanish_suffix") { audience, queue, context -> - TagsUtils.staticTag(if ((audience as? Player)?.user()?.isVanished == true) language.vanish.placeholderSuffix else "") + val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("") + TagsUtils.staticTag(if (VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.isVanished == true) language.vanish.placeholderSuffix else "") } for (server in plugin.server.allServers) { builder.globalPlaceholder("online_${server.serverInfo.name.lowercase()}") { queue, context -> - val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } - TagsUtils.staticTag(SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId.lowercase() == server.serverInfo.name.lowercase() && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) + val vanishedOnlineUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { vanishUser -> vanishUser.isVanished && vanishUser.isOnline } + TagsUtils.staticTag(VanishAPI.get().getDatabase().getCachedUserCount().getValue(server.serverInfo.name.lowercase()).toString()) } } builder.audiencePlaceholder("online_here") { audience, queue, context -> val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("0") - val currentServerVanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline && user.serverId == player.currentServer.getOrNull()?.serverInfo?.name } - TagsUtils.staticTag(SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !currentServerVanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) + val currentServerVanishedOnlineUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { vanishUser -> + vanishUser.isVanished && vanishUser.isOnline && vanishUser.serverId == player.currentServer.getOrNull()?.serverInfo?.name + } + val currentServerPlayerCount = player.currentServer.getOrNull()?.server?.playersConnected?.size ?: currentServerVanishedOnlineUsers.size + TagsUtils.staticTag((currentServerPlayerCount - currentServerVanishedOnlineUsers.size).toString()) } builder.globalPlaceholder("online_total") { queue, context -> - val vanishedOnlineUsers = SayanVanishVelocityAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } - TagsUtils.staticTag(SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString()) + val onlineVanishedUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { vanishUser -> + vanishUser.isVanished && vanishUser.isOnline + } + TagsUtils.staticTag((plugin.server.playerCount - onlineVanishedUsers.size).toString()) } builder.build().register() diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt index 786301c7..2df5104c 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt @@ -2,6 +2,7 @@ package org.sayandev.sayanvanish.velocity.feature.features.hook import me.neznamy.tab.api.TabPlayer import me.neznamy.tab.api.integration.VanishIntegration +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser @@ -34,13 +35,13 @@ class FeatureHookTAB( private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegration(plugin.container.description.name.get()) { override fun isVanished(player: TabPlayer): Boolean { - return SayanVanishVelocityAPI.getInstance().isVanishedAsync(player.uniqueId, feature.useCacheData) + return VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.isVanished == true } override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { if (viewer.uniqueId == target.uniqueId) return true - val viewerUser = SayanVanishVelocityAPI.getInstance().getUser(viewer.uniqueId, feature.useCacheData) ?: VelocityVanishUser(viewer.uniqueId, viewer.name) - val targetUser = SayanVanishVelocityAPI.getInstance().getUser(target.uniqueId, feature.useCacheData) ?: return true - return SayanVanishVelocityAPI.getInstance().canSee(viewerUser, targetUser) + val viewerUser = VanishAPI.get().getDatabase().getVanishUserCache(viewer.uniqueId) ?: VelocityVanishUser(viewer.uniqueId, viewer.name) + val targetUser = VanishAPI.get().getDatabase().getVanishUserCache(target.uniqueId) ?: return true + return VanishAPI.get().canSee(viewerUser, targetUser) } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt index 51cb400a..8e359d53 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt @@ -7,10 +7,11 @@ import com.velocitypowered.api.event.player.ServerPostConnectEvent import com.velocitypowered.api.proxy.Player import net.william278.velocitab.api.VelocitabAPI import net.william278.velocitab.vanish.VanishIntegration +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateUser -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.user +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.sayanvanish.velocity.feature.HookFeature @@ -47,15 +48,15 @@ private class VelocitabImpl(val feature: FeatureHookVelocitab) : VanishIntegrati override fun canSee(name: String, otherName: String): Boolean { val player = StickyNote.getPlayer(name) ?: return true val otherPlayer = StickyNote.getPlayer(otherName) ?: return true - val user = player.getOrCreateUser() - val otherUser = otherPlayer.getOrCreateUser() + val user = VanishAPI.get().getDatabase().getVanishUserCache(player.uniqueId) ?: player.generateVanishUser() + val otherUser = VanishAPI.get().getDatabase().getVanishUserCache(otherPlayer.uniqueId) ?: otherPlayer.generateVanishUser() return if (user.isVanished && otherUser.isVanished && user.vanishLevel >= otherUser.vanishLevel) true else if (otherUser.isVanished) false else true } override fun isVanished(name: String): Boolean { - return StickyNote.getPlayer(name)?.getOrCreateUser()?.isVanished == true + return StickyNote.getPlayer(name)?.let { VanishAPI.get().getDatabase().getCachedVanishUsers().values.find { it.username == name } }?.isVanished == true } @Subscribe diff --git a/settings.gradle.kts b/settings.gradle.kts index 3947e0b4..b097f46f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,7 +9,7 @@ pluginManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" - id("org.sayandev.stickynote.settings") version "1.9.1.10" + id("org.sayandev.stickynote.settings") version "1.10.0" } rootProject.name = "SayanVanish" From 425eafd604aa9a12b1527fc2343b2ed7caebbef9 Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 10 Jul 2025 01:19:39 +0330 Subject: [PATCH 05/67] feat: start working on messaging service --- .../sayanvanish/api/SayanVanishAPI.kt | 6 +- .../sayanvanish/api/database/Database.kt | 2 + .../api/database/DatabaseConfig.kt | 5 +- .../{DatabaseMethod.kt => DatabaseType.kt} | 2 +- .../api/database/TransactionDatabase.kt | 83 ++++++----- .../api/database/TransactionType.kt | 6 +- .../api/database/TransactionTypes.kt | 22 +-- .../api/database/redis/RedisConfig.kt | 1 + .../api/database/redis/RedisConnection.kt | 47 ++++++ .../api/database/redis/RedisDatabase.kt | 134 ++++++++++-------- .../sayanvanish/api/database/sql/SQLConfig.kt | 1 + .../api/database/sql/SQLDatabase.kt | 49 ++----- .../sayanvanish/api/health/HealthCheckData.kt | 6 +- .../sayanvanish/api/message/MessageConfig.kt | 39 +++++ .../api/message/MessagingCategoryType.kt | 35 +++++ .../api/message/MessagingCategoryTypes.kt | 10 ++ .../api/message/MessagingService.kt | 34 +++++ .../sayanvanish/api/message/MessagingType.kt | 32 +++++ .../sayanvanish/api/message/MessagingTypes.kt | 8 ++ .../api/message/TypedMessagingService.kt | 79 +++++++++++ .../message/types/RedisMessagingService.kt | 78 ++++++++++ .../sayanvanish/bukkit/SayanVanish.kt | 6 +- .../sayanvanish/bukkit/health/HealthCache.kt | 12 +- .../sayanvanish/velocity/SayanVanish.kt | 5 - .../health/HealthCheckMessageSubscriber.kt | 4 +- 25 files changed, 532 insertions(+), 174 deletions(-) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/{DatabaseMethod.kt => DatabaseType.kt} (70%) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConnection.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingType.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index 8f07a97f..b32c243f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -12,8 +12,9 @@ import java.util.* object SayanVanishAPI : VanishAPI { private val database = TransactionDatabase() + private val - override fun getDatabase(): Database { + override fun getDatabase(): TransactionDatabase { return database } @@ -77,6 +78,9 @@ object SayanVanishAPI : VanishAPI { return getDatabase().getVanishUser(this).await() } + /** + * Only for java usage + */ @JvmStatic fun get(): SayanVanishAPI { return this diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt index 1bb2124d..414f5e8d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt @@ -16,6 +16,8 @@ interface Database { val dispatcher: AsyncDispatcher + var connected: Boolean + suspend fun initialize(): Deferred suspend fun connect(): Deferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt index 6cd01c75..1d9d1a77 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt @@ -6,7 +6,6 @@ import org.sayandev.sayanvanish.api.database.sql.SQLConfig import org.sayandev.stickynote.core.configuration.Config import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment -import org.spongepowered.configurate.serialize.TypeSerializer import org.spongepowered.configurate.serialize.TypeSerializerCollection import java.io.File @@ -14,10 +13,8 @@ public var databaseConfig = DatabaseConfig.fromConfig() ?: DatabaseConfig.defaul @ConfigSerializable class DatabaseConfig( - val sqlDispatcherThreadCount: Int = 5, - val redisDispatcherThreadCount: Int = 5, @Comment("Configuration for the database, including method, SQL, Redis, and caching options.") - val method: DatabaseMethod = DatabaseMethod.SQL, + val method: DatabaseType = DatabaseType.SQL, @Comment("Configuration for SQL database") val sql: SQLConfig = SQLConfig(), @Comment("Configuration for Redis database") diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseMethod.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseType.kt similarity index 70% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseMethod.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseType.kt index 50897974..65e606b3 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseMethod.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseType.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.api.database -enum class DatabaseMethod { +enum class DatabaseType { SQL, REDIS, } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt index 6e5e51fb..8666592a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt @@ -9,7 +9,6 @@ import kotlinx.coroutines.awaitAll import kotlinx.coroutines.isActive import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.PlatformAdapter import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.database.redis.RedisDatabase import org.sayandev.sayanvanish.api.database.sql.SQLDatabase @@ -18,6 +17,8 @@ import java.util.* class TransactionDatabase: Database { + override var connected = false + override val dispatcher = AsyncDispatcher( "${Platform.get().pluginName.lowercase()}-transaction-thread", @@ -25,18 +26,18 @@ class TransactionDatabase: Database { 5, ) - val databaseTypes = mutableMapOf() + val databaseTypes = mutableMapOf() var databaseConnected: Boolean = true override suspend fun initialize(): Deferred { - val transactionMethods = databaseConfig.transactionTypes.map { it.method }.distinct() + val transactionMethods = databaseConfig.transactionTypes.map { it.type }.distinct() for (method in transactionMethods) { when (method) { - DatabaseMethod.SQL -> { - databaseTypes[DatabaseMethod.SQL] = try { - SQLDatabase(databaseConfig).apply { - this.connect() - this.initialize() + DatabaseType.SQL -> { + databaseTypes[DatabaseType.SQL] = try { + SQLDatabase(databaseConfig).also { sqlDatabase -> + sqlDatabase.connect() + sqlDatabase.initialize() } } catch (e: Exception) { databaseConnected = false @@ -44,11 +45,11 @@ class TransactionDatabase: Database { throw e } } - DatabaseMethod.REDIS -> { - databaseTypes[DatabaseMethod.REDIS] = try { - RedisDatabase(databaseConfig).apply { - this.initialize() - this.connect() + DatabaseType.REDIS -> { + databaseTypes[DatabaseType.REDIS] = try { + RedisDatabase(databaseConfig).also { redisDatabase -> + redisDatabase.initialize() + redisDatabase.connect() } } catch (e: Exception) { databaseConnected = false @@ -58,82 +59,89 @@ class TransactionDatabase: Database { } } } - return CompletableDeferred(true) + connected = databaseTypes.values.all { it.connected } + return CompletableDeferred(connected) + } + + inline fun getByType(): D { + return databaseTypes.values.filterIsInstance().firstOrNull() + ?: throw IllegalArgumentException("Received database with type `${D::class.simpleName}` but it isn't registered in the TransactionDatabase database types.") } override suspend fun connect(): Deferred { - return CompletableDeferred(databaseConnected) + return CompletableDeferred(connected) } override suspend fun disconnect(): Deferred { databaseTypes.forEach { (_, database) -> database.disconnect() } - return CompletableDeferred(true) + connected = false + return CompletableDeferred(connected) } override suspend fun addVanishUser(vanishUser: VanishUser): Deferred { - val database = database(TransactionTypes.ADD_VANISH_USER) + val database = database(TransactionTypes.VANISH_USER) return database.addVanishUser(vanishUser) } override suspend fun hasVanishUser(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.HAS_VANISH_USER) + val database = database(TransactionTypes.VANISH_USER) return database.hasVanishUser(uniqueId) } override suspend fun updateVanishUser(vanishUser: VanishUser): Deferred { - val database = database(TransactionTypes.UPDATE_VANISH_USER) + val database = database(TransactionTypes.VANISH_USER) return database.updateVanishUser(vanishUser) } override suspend fun removeVanishUser(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.REMOVE_VANISH_USER) + val database = database(TransactionTypes.VANISH_USER) return database.removeVanishUser(uniqueId) } override suspend fun getVanishUser(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.GET_VANISH_USER) + val database = database(TransactionTypes.VANISH_USER) return database.getVanishUser(uniqueId) } override suspend fun getVanishUsers(): Deferred> { - val database = database(TransactionTypes.GET_VANISH_USERS) + val database = database(TransactionTypes.VANISH_USER) return database.getVanishUsers() } override suspend fun getUser(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.GET_USER) + val database = database(TransactionTypes.USER) return database.getUser(uniqueId) } override suspend fun getUsers(): Deferred> { - val database = database(TransactionTypes.GET_USERS) + val database = database(TransactionTypes.USER) return database.getUsers() } override suspend fun addUser(user: User): Deferred { - val database = database(TransactionTypes.ADD_USER) + val database = database(TransactionTypes.USER) return database.addUser(user) } override suspend fun hasUser(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.HAS_USER) + val database = database(TransactionTypes.USER) return database.hasUser(uniqueId) } override suspend fun updateUser(user: User): Deferred { - val database = database(TransactionTypes.UPDATE_USER) + val database = database(TransactionTypes.USER) return database.updateUser(user) } override suspend fun removeUser(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.REMOVE_USER) + val database = database(TransactionTypes.USER) return database.removeUser(uniqueId) } override suspend fun isInQueue(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.IS_IN_QUEUE) + val database = database(TransactionTypes.QUEUE) return database.isInQueue(uniqueId) } @@ -141,17 +149,17 @@ class TransactionDatabase: Database { uniqueId: UUID, vanished: Boolean ): Deferred { - val database = database(TransactionTypes.ADD_TO_QUEUE) + val database = database(TransactionTypes.QUEUE) return database.addToQueue(uniqueId, vanished) } override suspend fun getFromQueue(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.GET_FROM_QUEUE) + val database = database(TransactionTypes.QUEUE) return database.getFromQueue(uniqueId) } override suspend fun removeFromQueue(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.REMOVE_FROM_QUEUE) + val database = database(TransactionTypes.QUEUE) return database.removeFromQueue(uniqueId) } @@ -188,7 +196,7 @@ class TransactionDatabase: Database { } } - fun database(method: DatabaseMethod): Database { + fun database(method: DatabaseType): Database { return databaseTypes[method] ?: let { val (fallbackMethod, fallbackDatabase) = databaseTypes.entries.first() Platform.Companion.get().logger.warning("Tried to get a database of type $method, but it was not initialized. falling back to ${fallbackMethod} database method.") @@ -197,18 +205,21 @@ class TransactionDatabase: Database { } fun database(transactionType: TransactionType): Database { - return database(transactionType.method) + return database(transactionType.type) } private fun logDatabaseError() { - Platform.get().logger.severe("Database connection failed. Disabling the plugin.") + Platform.get().logger.severe("Database connection failed. Disabling the plugin...") Platform.get().logger.severe("Please check the following:") Platform.get().logger.severe("- Make sure your database server is not misconfigured.") Platform.get().logger.severe("- Make sure your database server is running.") + Platform.get().logger.severe("Your active database types:") + for (type in databaseTypes) { + Platform.get().logger.severe("- ${type.key.name} (${type.value::class.simpleName})") + } Platform.get().logger.severe("Here's the full error trace:") } - fun async( block: suspend CoroutineScope.() -> T ): Deferred { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt index 880776ac..9ea1bb09 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt @@ -6,7 +6,7 @@ import java.lang.reflect.Type interface TransactionType { val id: String - val method: DatabaseMethod + val type: DatabaseType object Serializer : TypeSerializer { override fun deserialize( @@ -15,7 +15,7 @@ interface TransactionType { ): TransactionType { return object : TransactionType { override val id: String = node.node("id").string!! - override val method: DatabaseMethod = node.node("method").get(DatabaseMethod::class.java)!! + override val type: DatabaseType = node.node("type").get(DatabaseType::class.java)!! } } @@ -29,7 +29,7 @@ interface TransactionType { return } node.node("id").set(obj.id) - node.node("method").set(obj.method) + node.node("type").set(obj.type) } } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt index 4bdd009b..6da59b75 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt @@ -2,22 +2,10 @@ package org.sayandev.sayanvanish.api.database enum class TransactionTypes( override val id: String, - override val method: DatabaseMethod, + override val type: DatabaseType, ) : TransactionType { - ADD_VANISH_USER("add_vanish_user", DatabaseMethod.SQL), - HAS_VANISH_USER("has_vanish_user", DatabaseMethod.SQL), - UPDATE_VANISH_USER("update_vanish_user", DatabaseMethod.SQL), - REMOVE_VANISH_USER("remove_vanish_user", DatabaseMethod.SQL), - GET_VANISH_USER("get_vanish_user", DatabaseMethod.SQL), - GET_VANISH_USERS("get_vanish_users", DatabaseMethod.SQL), - GET_USER("get_user", DatabaseMethod.SQL), - GET_USERS("get_users", DatabaseMethod.SQL), - ADD_USER("add_user", DatabaseMethod.SQL), - HAS_USER("has_user", DatabaseMethod.SQL), - UPDATE_USER("update_user", DatabaseMethod.SQL), - REMOVE_USER("remove_user", DatabaseMethod.SQL), - ADD_TO_QUEUE("add_to_queue", DatabaseMethod.SQL), - IS_IN_QUEUE("is_in_queue", DatabaseMethod.SQL), - GET_FROM_QUEUE("get_from_queue", DatabaseMethod.SQL), - REMOVE_FROM_QUEUE("remove_from_queue", DatabaseMethod.SQL), + USER("user", DatabaseType.SQL), + VANISH_USER("vanish_user", DatabaseType.SQL), + // TODO: Change default to plugin message or implement WebSocket + QUEUE("queue", DatabaseType.REDIS), } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConfig.kt index ebe5d194..758c73c7 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConfig.kt @@ -5,6 +5,7 @@ import org.spongepowered.configurate.objectmapping.meta.Comment @ConfigSerializable class RedisConfig( + val threadCount: Int = 5, @Comment("The type of Redis configuration. Available types: STANDALONE") val type: RedisType = RedisType.STANDALONE, @Comment("Configuration for standalone Redis setup") diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConnection.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConnection.kt new file mode 100644 index 00000000..259df0e1 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConnection.kt @@ -0,0 +1,47 @@ +package org.sayandev.sayanvanish.api.database.redis + +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher +import redis.clients.jedis.DefaultJedisClientConfig +import redis.clients.jedis.HostAndPort +import redis.clients.jedis.JedisPool + +class RedisConnection( + val config: RedisConfig, + val dispatcher: AsyncDispatcher, +) { + var connected = false + + lateinit var redis: JedisPool + + suspend fun initialize(): Deferred { + redis = when (config.type) { + RedisConfig.RedisType.STANDALONE -> { + val address = HostAndPort(config.standalone.host, config.standalone.port) + JedisPool(address, DefaultJedisClientConfig.builder().apply { + if (config.standalone.user.isNotEmpty()) { + user(config.standalone.user) + } + if (config.standalone.password.isNotEmpty()) { + password(config.standalone.password) + } + if (config.standalone.ssl) { + ssl(config.standalone.ssl) + } + }.build()) + } + } + connected = true + return CompletableDeferred(true) + } + + fun connect(): Deferred { + return CompletableDeferred(true) + } + + fun disconnect(): Deferred { + redis.close() + return CompletableDeferred(true) + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt index 8bc1088f..d2cf0dc7 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt @@ -9,6 +9,7 @@ import org.sayandev.sayanvanish.api.database.DatabaseConfig import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import redis.clients.jedis.DefaultJedisClientConfig import redis.clients.jedis.HostAndPort +import redis.clients.jedis.JedisPool import redis.clients.jedis.JedisPooled import java.util.* @@ -16,114 +17,123 @@ class RedisDatabase( val config: DatabaseConfig, ) : Database { - override val dispatcher = - AsyncDispatcher( - "${Platform.get().pluginName.lowercase()}-redis-thread", - config.redisDispatcherThreadCount, - ) + val connection = RedisConnection(config.redis, AsyncDispatcher( + "${Platform.get().pluginName.lowercase()}-redis-thread", + config.redis.threadCount + )) - lateinit var redis: JedisPooled + override var connected = false + + override val dispatcher = connection.dispatcher + + lateinit var redis: JedisPool override suspend fun initialize(): Deferred { - redis = when (config.redis.type) { - RedisConfig.RedisType.STANDALONE -> { - val address = HostAndPort(config.redis.standalone.host, config.redis.standalone.port) - JedisPooled(address, DefaultJedisClientConfig.builder().apply { - if (config.redis.standalone.user.isNotEmpty()) { - user(config.redis.standalone.user) - } - if (config.redis.standalone.password.isNotEmpty()) { - password(config.redis.standalone.password) - } - if (config.redis.standalone.ssl) { - ssl(config.redis.standalone.ssl) - } - }.build()) - } - } - return CompletableDeferred(true) + connection.initialize() + redis = connection.redis + connected = connection.connected + return CompletableDeferred(connected) } override suspend fun connect(): Deferred { - return CompletableDeferred(true) + return CompletableDeferred(connected) } override suspend fun disconnect(): Deferred { redis.close() - return CompletableDeferred(true) + connected = false + return CompletableDeferred(connected) } override suspend fun getVanishUser(uniqueId: UUID): Deferred { return async { - redis - .hget("vanish_users", uniqueId.toString()) - ?.let { - VanishUser.fromJson(it) - } + redis.resource.use { + it.hget("vanish_users", uniqueId.toString()) + ?.let { + VanishUser.fromJson(it) + } + } } } override suspend fun getVanishUsers(): Deferred> { return async { - redis - .hgetAll("vanish_users") - .map { - VanishUser.fromJson(it.value) - } + redis.resource.use { + it.hgetAll("vanish_users") + .map { + VanishUser.fromJson(it.value) + } + } } } override suspend fun getUser(uniqueId: UUID): Deferred { return async { - redis - .hget("users", uniqueId.toString()) - ?.let { - User.fromJson(it) - } + redis.resource.use { + it + .hget("users", uniqueId.toString()) + ?.let { + User.fromJson(it) + } + } } } override suspend fun getUsers(): Deferred> { return async { - redis - .hgetAll("users") - .map { User.fromJson(it.value) } + redis.resource.use { + it + .hgetAll("users") + .map { User.fromJson(it.value) } + } } } override suspend fun addVanishUser(user: VanishUser): Deferred { return async { - redis.hset("vanish_users", user.uniqueId.toString(), user.toJson()) != 0L + redis.resource.use { + it.hset("vanish_users", user.uniqueId.toString(), user.toJson()) != 0L + } } } override suspend fun hasVanishUser(uniqueId: UUID): Deferred { return async { - redis.hexists("vanish_users", uniqueId.toString()) + redis.resource.use { + it.hexists("vanish_users", uniqueId.toString()) + } } } override suspend fun addUser(user: User): Deferred { return async { - redis.hset("users", user.uniqueId.toString(), user.toJson()) != 0L + redis.resource.use { + it.hset("users", user.uniqueId.toString(), user.toJson()) != 0L + } } } override suspend fun hasUser(uniqueId: UUID): Deferred { return async { - redis.hexists("users", uniqueId.toString()) + redis.resource.use { + it.hexists("users", uniqueId.toString()) + } } } override suspend fun removeVanishUser(uniqueId: UUID): Deferred { return async { - redis.hdel("vanish_users", uniqueId.toString()) != 0L + redis.resource.use { + it.hdel("vanish_users", uniqueId.toString()) != 0L + } } } override suspend fun removeUser(uniqueId: UUID): Deferred { return async { - redis.hdel("users", uniqueId.toString()) != 0L + redis.resource.use { + it.hdel("users", uniqueId.toString()) != 0L + } } } @@ -137,40 +147,48 @@ class RedisDatabase( override suspend fun isInQueue(uniqueId: UUID): Deferred { return async { - redis.get("queue:$uniqueId")?.toBoolean() ?: false + redis.resource.use { + it.get("queue:$uniqueId")?.toBoolean() ?: false + } } } override suspend fun addToQueue(uniqueId: UUID, vanished: Boolean): Deferred { return async { - redis.set("queue:$uniqueId", vanished.toString()) != null + redis.resource.use { + it.set("queue:$uniqueId", vanished.toString()) != null + } } } override suspend fun removeFromQueue(uniqueId: UUID): Deferred { return async { - redis.del("queue:$uniqueId") != 0L + redis.resource.use { + it.del("queue:$uniqueId") != 0L + } } } override suspend fun getFromQueue(uniqueId: UUID): Deferred { return async { - redis.get("queue:$uniqueId")?.toBoolean() ?: false + redis.resource.use { + it.get("queue:$uniqueId")?.toBoolean() ?: false + } } } override suspend fun purgeAllTables(): Deferred { return async { - redis.del("vanish_users") - redis.del("users") - redis.del("queue") + redis.resource.use { it.del("vanish_users") } + redis.resource.use { it.del("users") } + redis.resource.use { it.del("queue") } true } } override suspend fun purgeUsers(): Deferred { return async { - redis.del("users") + redis.resource.use { it.del("users") } true } } @@ -178,7 +196,7 @@ class RedisDatabase( override suspend fun purgeUsers(serverId: String): Deferred { return async { // TODO: only remove users from this server id - redis.del("users") + redis.resource.use { it.del("users") } true } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt index c9a9e4f1..5677ecf1 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt @@ -6,6 +6,7 @@ import org.spongepowered.configurate.objectmapping.meta.Setting @ConfigSerializable class SQLConfig( + val threadCount: Int = 5, @Comment("The method to use for the database. Available methods: MYSQL, SQLITE") val method: SQLMethod = SQLMethod.SQLITE, @Comment("The host address of the SQL database. If it's an IP address (x.x.x.x), ensure it is enclosed in double quotes (`\"`).") diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt index 786f2f20..1f7e2a27 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt @@ -23,14 +23,18 @@ import org.sayandev.stickynote.core.utils.CoroutineUtils import org.sayandev.stickynote.core.utils.launch import java.util.* import java.util.concurrent.TimeUnit +import kotlin.text.get class SQLDatabase( val config: DatabaseConfig, ) : Database { + + override var connected = false + override val dispatcher = AsyncDispatcher( "${Platform.get().pluginName.lowercase()}-${config.sql.method}-thread", - config.sqlDispatcherThreadCount, + config.sql.threadCount, ) // TODO: implement new caching api @@ -53,48 +57,23 @@ class SQLDatabase( } override suspend fun connect(): Deferred { - val hikariConfig = - HikariConfig().apply { - jdbcUrl = + database = + org.jetbrains.exposed.v1.jdbc.Database.connect( + url = when (config.sql.method) { SQLConfig.SQLMethod.SQLITE -> "jdbc:sqlite:${Platform.get().rootDirectory.absolutePath}/database" SQLConfig.SQLMethod.MARIADB -> "jdbc:mariadb://${config.sql.host}:${config.sql.port}/${config.sql.database}?autoReconnect=true" SQLConfig.SQLMethod.MYSQL -> "jdbc:mysql://${config.sql.host}:${config.sql.port}/${config.sql.database}?autoReconnect=true" - } - driverClassName = + }, + driver = when (config.sql.method) { SQLConfig.SQLMethod.SQLITE -> "org.sqlite.JDBC" SQLConfig.SQLMethod.MARIADB -> "org.mariadb.jdbc.Driver" SQLConfig.SQLMethod.MYSQL -> "com.mysql.cj.jdbc.Driver" - } - username = config.sql.username - password = config.sql.password - maximumPoolSize = config.sql.poolProperties.maximumPoolSize - this.minimumIdle = config.sql.poolProperties.minimumIdle - this.keepaliveTime = config.sql.poolProperties.keepaliveTime - if (config.sql.method != SQLConfig.SQLMethod.SQLITE) { - this.connectionTimeout = config.sql.poolProperties.connectionTimeout - } - this.maxLifetime = config.sql.poolProperties.maxLifetime - - this.addDataSourceProperty("socketTimeout", TimeUnit.SECONDS.toMillis(30).toString()) - this.addDataSourceProperty("cachePrepStmts", "true") - this.addDataSourceProperty("prepStmtCacheSize", "250") - this.addDataSourceProperty("prepStmtCacheSqlLimit", "2048") - this.addDataSourceProperty("useServerPrepStmts", "true") - this.addDataSourceProperty("useLocalSessionState", "true") - this.addDataSourceProperty("rewriteBatchedStatements", "true") - this.addDataSourceProperty("cacheResultSetMetadata", "true") - this.addDataSourceProperty("cacheServerConfiguration", "true") - this.addDataSourceProperty("elideSetAutoCommits", "true") - this.addDataSourceProperty("maintainTimeStats", "false") - this.addDataSourceProperty("alwaysSendSetIsolation", "false") - this.addDataSourceProperty("cacheCallableStmts", "true") - this.addDataSourceProperty("characterEncoding", "utf8") - this.addDataSourceProperty("allowPublicKeyRetrieval", "true") - } - val dataSource = HikariDataSource(hikariConfig) - database = org.jetbrains.exposed.v1.jdbc.Database.connect(dataSource) + }, + user = config.sql.username, + password = config.sql.password, + ) TransactionManager.defaultDatabase = database // TODO: Implement a proper cache system diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt index 14a93e5f..9e2de75c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.api.health -import org.sayandev.sayanvanish.api.database.DatabaseMethod +import org.sayandev.sayanvanish.api.database.DatabaseType import org.sayandev.sayanvanish.api.database.sql.SQLConfig data class HealthCheckData( @@ -9,7 +9,7 @@ data class HealthCheckData( ) { data class ProxyInfo( - val databaseMethod: DatabaseMethod, + val databaseType: DatabaseType, val sqlMethod: SQLConfig.SQLMethod, ) @@ -17,7 +17,7 @@ data class HealthCheckData( val id: String?, var name: String?, val enabledProxyMode: Boolean, - val databaseMethod: DatabaseMethod, + val databaseType: DatabaseType, val sqlMethod: SQLConfig.SQLMethod, val timestamp: Long ) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt new file mode 100644 index 00000000..994dbee0 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt @@ -0,0 +1,39 @@ +package org.sayandev.sayanvanish.api.message + +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.database.redis.RedisConfig +import org.sayandev.stickynote.core.configuration.Config +import org.spongepowered.configurate.objectmapping.ConfigSerializable +import org.spongepowered.configurate.objectmapping.meta.Comment +import org.spongepowered.configurate.serialize.TypeSerializerCollection +import java.io.File + +public var messageConfig = MessageConfig.fromConfig() ?: MessageConfig.defaultConfig() + +@ConfigSerializable +class MessageConfig( + @Comment("Configuration for Redis database") + val threadCount: Int = 5, + val redis: RedisConfig = RedisConfig(), + val categoryTypes: List = MessagingCategoryTypes.entries, +) : Config(Platform.get().rootDirectory, fileName, serializers()) { + companion object { + private val fileName = "database.yml" + + @JvmStatic + fun defaultConfig(): MessageConfig { + return MessageConfig().also { it.save() } + } + + @JvmStatic + fun fromConfig(): MessageConfig? { + return fromConfig(File(Platform.get().rootDirectory, fileName), serializers()) + } + + fun serializers(): TypeSerializerCollection { + return TypeSerializerCollection.builder() + .register(MessagingCategoryType::class.java, MessagingCategoryType.Serializer) + .build() + } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt new file mode 100644 index 00000000..2340939d --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt @@ -0,0 +1,35 @@ +package org.sayandev.sayanvanish.api.message + +import org.spongepowered.configurate.ConfigurationNode +import org.spongepowered.configurate.serialize.TypeSerializer +import java.lang.reflect.Type + +interface MessagingCategoryType { + val id: String + val type: MessagingTypes + + object Serializer : TypeSerializer { + override fun deserialize( + type: Type, + node: ConfigurationNode + ): MessagingCategoryType { + return object : MessagingCategoryType { + override val id: String = node.node("id").string!! + override val type: MessagingTypes = node.node("type").get(MessagingTypes::class.java)!! + } + } + + override fun serialize( + type: Type, + obj: MessagingCategoryType?, + node: ConfigurationNode + ) { + if (obj == null) { + node.raw(null) + return + } + node.node("id").set(obj.id) + node.node("type").set(obj.type) + } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt new file mode 100644 index 00000000..a04f2923 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt @@ -0,0 +1,10 @@ +package org.sayandev.sayanvanish.api.message + +enum class MessagingCategoryTypes( + override val id: String, + override val type: MessagingTypes, +) : MessagingCategoryType { + // TODO: Change default to plugin message or implement WebSocket + SYNC_USER("sync_user", MessagingTypes.REDIS), + SYNC_VANISH_USER("sync_vanish_user", MessagingTypes.REDIS), +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt new file mode 100644 index 00000000..26939d1e --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt @@ -0,0 +1,34 @@ +package org.sayandev.sayanvanish.api.message + +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.future.asCompletableFuture +import kotlinx.coroutines.runBlocking +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher +import org.sayandev.stickynote.core.utils.async +import java.util.concurrent.CompletableFuture + +interface MessagingService { + val dispatcher: AsyncDispatcher + + suspend fun syncUser(user: User): Deferred + + fun syncUserFuture(user: User): CompletableFuture { + return async(dispatcher) { syncUser(user).await() }.asCompletableFuture() + } + + fun syncUserSync(user: User): Boolean { + return runBlocking { syncUser(user).await() } + } + + suspend fun syncVanishUser(vanishUser: VanishUser): Deferred + + fun syncVanishUserFuture(vanishUser: VanishUser): CompletableFuture { + return async(dispatcher) { syncVanishUser(vanishUser).await() }.asCompletableFuture() + } + + fun syncVanishUserSync(vanishUser: VanishUser): Boolean { + return runBlocking { syncVanishUser(vanishUser).await() } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingType.kt new file mode 100644 index 00000000..9b0f092d --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingType.kt @@ -0,0 +1,32 @@ +package org.sayandev.sayanvanish.api.message + +import org.spongepowered.configurate.ConfigurationNode +import org.spongepowered.configurate.serialize.TypeSerializer +import java.lang.reflect.Type + +interface MessagingType { + val id: String + + object Serializer : TypeSerializer { + override fun deserialize( + type: Type, + node: ConfigurationNode + ): MessagingType { + return object : MessagingType { + override val id: String = node.node("id").string!! + } + } + + override fun serialize( + type: Type, + obj: MessagingType?, + node: ConfigurationNode + ) { + if (obj == null) { + node.raw(null) + return + } + node.node("id").set(obj.id) + } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt new file mode 100644 index 00000000..6b61ac5a --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt @@ -0,0 +1,8 @@ +package org.sayandev.sayanvanish.api.message + +enum class MessagingTypes( + override val id: String +) : MessagingType { + PLUGIN_MESSAGE("plugin_message"), + REDIS("redis"), +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt new file mode 100644 index 00000000..4ad57d6a --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt @@ -0,0 +1,79 @@ +package org.sayandev.sayanvanish.api.message + +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.message.types.RedisMessagingService +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher + +class TypedMessagingService: MessagingService { + override val dispatcher = + AsyncDispatcher( + "${Platform.get().pluginName.lowercase()}-messaging-thread", + messageConfig.threadCount + ) + + val messageTypes = mutableMapOf() + var messagingConnected: Boolean = true + + suspend fun initialize(): Deferred { + val messagingTypes = messageConfig.categoryTypes.map { it.type }.distinct() + for (method in messagingTypes) { + when { + method == MessagingTypes.REDIS -> { + messageTypes[MessagingTypes.REDIS] = try { + RedisMessagingService(messageConfig.redis, dispatcher).also { redisMessaging -> + redisMessaging.connection.connect() + redisMessaging.connection.initialize() + } + } catch (e: Exception) { + messagingConnected = false + logMessagingConnectionError() + throw e + } + } + // MessagingTypes.PLUGIN_MESSAGE Will be added on bukkit/proxy side in minecraft platform + } + } + return CompletableDeferred(true) + } + + inline fun getByType(): M { + return messageTypes.values.filterIsInstance().firstOrNull() + ?: throw IllegalArgumentException("Received database with type `${M::class.simpleName}` but it isn't registered in the TransactionDatabase database types.") + } + + override suspend fun syncUser(user: User): Deferred { + return service(MessagingCategoryTypes.SYNC_USER).syncUser(user) + } + + override suspend fun syncVanishUser(vanishUser: VanishUser): Deferred { + return service(MessagingCategoryTypes.SYNC_USER).syncUser(vanishUser) + } + + fun service(type: MessagingType): MessagingService { + return messageTypes[type] ?: let { + val (fallbackMethod, fallbackService) = messageTypes.entries.first() + Platform.get().logger.warning("Tried to get a messaging service of type $type, but it was not initialized. falling back to ${fallbackMethod} database method.") + fallbackService + } + } + + fun service(categoryType: MessagingCategoryType): MessagingService { + return service(categoryType.type) + } + + private fun logMessagingConnectionError() { + Platform.get().logger.severe("Connection to messaging service failed. Disabling the plugin...") + Platform.get().logger.severe("Please check the following:") + Platform.get().logger.severe("- Make sure your messaging service server is not misconfigured.") + Platform.get().logger.severe("- Make sure your messaging service server is running.") + Platform.get().logger.severe("Your active messaging services:") + for (service in messageTypes) { + Platform.get().logger.severe("- ${service.key.name} (${service.value::class.simpleName})") + } + Platform.get().logger.severe("Here's the full error trace:") + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt new file mode 100644 index 00000000..7272c7f9 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -0,0 +1,78 @@ +package org.sayandev.sayanvanish.api.message.types + +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.database.redis.RedisConfig +import org.sayandev.sayanvanish.api.database.redis.RedisConnection +import org.sayandev.sayanvanish.api.message.MessagingCategoryTypes +import org.sayandev.sayanvanish.api.message.MessagingService +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher +import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper +import org.sayandev.stickynote.core.messaging.publisher.RedisPublisher + +class RedisMessagingService( + val config: RedisConfig, + override val dispatcher: AsyncDispatcher +) : MessagingService { + val connection = RedisConnection(config, dispatcher) + + val syncUserPublisher = SyncUserPublisher() + val syncVanishUserPublisher = SyncVanishUserPublisher() + + override suspend fun syncUser(user: User): Deferred { + return syncUserPublisher.sync(user) + } + + override suspend fun syncVanishUser(vanishUser: VanishUser): Deferred { + return syncVanishUserPublisher.sync(vanishUser) + } + + inner class SyncUserPublisher : RedisPublisher( + dispatcher, + connection.redis, + Platform.Companion.get().id.lowercase(), + MessagingCategoryTypes.SYNC_USER.id, + User::class.java, + Boolean::class.java, + Platform.Companion.get().logger + ) { + override fun handle(payload: User): Boolean? { + TODO("Set user in cache") + } + + suspend fun sync(user: User): CompletableDeferred { + return publish( + PayloadWrapper( + user, + PayloadWrapper.State.FORWARD + ) + ) + } + } + + inner class SyncVanishUserPublisher : RedisPublisher( + dispatcher, + connection.redis, + Platform.Companion.get().id.lowercase(), + MessagingCategoryTypes.SYNC_VANISH_USER.id, + VanishUser::class.java, + Boolean::class.java, + Platform.Companion.get().logger + ) { + override fun handle(payload: VanishUser): Boolean? { + TODO("Set vanish user in cache") + } + + suspend fun sync(vanishUser: VanishUser): CompletableDeferred { + return publish( + PayloadWrapper( + vanishUser, + PayloadWrapper.State.FORWARD + ) + ) + } + } +} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt index 960aac20..d399f006 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt @@ -3,7 +3,7 @@ package org.sayandev.sayanvanish.bukkit import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.database.DatabaseMethod +import org.sayandev.sayanvanish.api.database.DatabaseType import org.sayandev.sayanvanish.api.database.databaseConfig import org.sayandev.sayanvanish.api.database.sql.SQLConfig import org.sayandev.sayanvanish.api.database.sql.SQLDatabase @@ -40,7 +40,7 @@ open class SayanVanish : JavaPlugin() { ServerInfoPublisher settings - if (settings.general.proxyMode && databaseConfig.method == DatabaseMethod.SQL && databaseConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { + if (settings.general.proxyMode && databaseConfig.method == DatabaseType.SQL && databaseConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { error("The `proxy-mode` is enabled, but the database method is set to SQLite, which might lead to unexpected results. If you're using proxies such as Velocity or BungeeCord, make sure to use a different database method, such as MySQL or Redis.") } @@ -58,7 +58,7 @@ open class SayanVanish : JavaPlugin() { }, 0, settings.general.cacheUpdatePeriodTicks) runAsync({ - if (databaseConfig.method == DatabaseMethod.SQL) { + if (databaseConfig.method == DatabaseType.SQL) { SayanVanishBukkitAPI.getInstance().database.getBasicUsersAsync { users -> (SayanVanishBukkitAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() (SayanVanishAPI.getDatabase() as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt index d4569a62..91823dc3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt @@ -2,7 +2,7 @@ package org.sayandev.sayanvanish.bukkit.health import org.bukkit.command.CommandSender import org.bukkit.entity.Player -import org.sayandev.sayanvanish.api.database.DatabaseMethod +import org.sayandev.sayanvanish.api.database.DatabaseType import org.sayandev.sayanvanish.api.database.sql.SQLConfig import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.health.HealthCheckData @@ -67,8 +67,8 @@ object HealthCache { val proxy = healthData.proxy sender.sendComponent("Proxy:") - sender.sendComponent(" - Database Method: ${proxy.databaseMethod}") - if (proxy.databaseMethod == DatabaseMethod.SQL) { + sender.sendComponent(" - Database Method: ${proxy.databaseType}") + if (proxy.databaseType == DatabaseType.SQL) { sender.sendComponent(" - SQL Method: ${proxy.sqlMethod}") } @@ -82,8 +82,8 @@ object HealthCache { } sender.sendComponent(" - ${server.name} (${timeAgo(server.timestamp)} since last update)") sender.sendComponent(" - Proxy Mode: ${server.enabledProxyMode}") - sender.sendComponent(" - Database Method: ${server.databaseMethod}") - if (server.databaseMethod == DatabaseMethod.SQL) { + sender.sendComponent(" - Database Method: ${server.databaseType}") + if (server.databaseType == DatabaseType.SQL) { sender.sendComponent(" - SQL Method: ${server.sqlMethod}") } } @@ -107,7 +107,7 @@ object HealthCache { sender.sendComponent("Make sure to change the server id in your `settings.yml` file.") } - val sqliteServers = reachableServers.filter { it.databaseMethod == DatabaseMethod.SQL && it.sqlMethod == SQLConfig.SQLMethod.SQLITE } + val sqliteServers = reachableServers.filter { it.databaseType == DatabaseType.SQL && it.sqlMethod == SQLConfig.SQLMethod.SQLITE } if (sqliteServers.isNotEmpty()) { sender.sendComponent("Found servers using SQLite as their database method.") for (server in sqliteServers) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt index d2206cd3..ab9f67f9 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt @@ -8,9 +8,6 @@ import com.velocitypowered.api.plugin.annotation.DataDirectory import com.velocitypowered.api.proxy.ProxyServer import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.api.database.DatabaseMethod -import org.sayandev.sayanvanish.api.database.databaseConfig -import org.sayandev.sayanvanish.api.database.sql.SQLDatabase import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.proxy.config.settings import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI @@ -18,13 +15,11 @@ import org.sayandev.sayanvanish.velocity.command.SayanVanishProxyCommandVelocity import org.sayandev.sayanvanish.velocity.health.HealthCheckMessageSubscriber import org.sayandev.sayanvanish.velocity.health.ServerInfoPublisher import org.sayandev.stickynote.loader.velocity.StickyNoteVelocityLoader -import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.registerListener import org.slf4j.Logger import java.io.File import java.nio.file.Path -import java.util.concurrent.TimeUnit lateinit var sayanvanish: SayanVanish diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/HealthCheckMessageSubscriber.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/HealthCheckMessageSubscriber.kt index b8e53f3a..07ef20c7 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/HealthCheckMessageSubscriber.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/HealthCheckMessageSubscriber.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.velocity.health import kotlinx.coroutines.CompletableDeferred -import org.sayandev.sayanvanish.api.database.DatabaseMethod +import org.sayandev.sayanvanish.api.database.DatabaseType import org.sayandev.sayanvanish.api.database.databaseConfig import org.sayandev.sayanvanish.api.database.sql.SQLConfig import org.sayandev.sayanvanish.api.health.HealthCheckData @@ -30,7 +30,7 @@ class HealthCheckMessageSubscriber: ProxySubscriber( null, server.serverInfo.name, false, - DatabaseMethod.SQL, + DatabaseType.SQL, SQLConfig.SQLMethod.SQLITE, System.currentTimeMillis() ) From b84fede96331ac371e9458b8fa2c6fac3d416e31 Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 10 Jul 2025 02:09:09 +0330 Subject: [PATCH 06/67] api: new methods for User interface --- .../sayanvanish/api/SayanVanishAPI.kt | 10 +- .../org/sayandev/sayanvanish/api/User.kt | 160 +++++++++++++++--- .../org/sayandev/sayanvanish/api/VanishAPI.kt | 3 + .../sayanvanish/api/database/PlatformTable.kt | 6 + .../sayandev/sayanvanish/api/utils/Gson.kt | 48 ++++++ 5 files changed, 196 insertions(+), 31 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/PlatformTable.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index b32c243f..d5f15a08 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -3,21 +3,25 @@ package org.sayandev.sayanvanish.api import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.runBlocking -import org.sayandev.sayanvanish.api.cache.VanishUserCache -import org.sayandev.sayanvanish.api.database.Database import org.sayandev.sayanvanish.api.database.TransactionDatabase +import org.sayandev.sayanvanish.api.message.MessagingService +import org.sayandev.sayanvanish.api.message.TypedMessagingService import org.sayandev.stickynote.core.utils.launch import java.util.* object SayanVanishAPI : VanishAPI { private val database = TransactionDatabase() - private val + private val messagingService = TypedMessagingService() override fun getDatabase(): TransactionDatabase { return database } + override fun getMessagingService(): MessagingService { + return messagingService + } + init { launch(database.dispatcher) { for (user in database.getVanishUsers().await().filter { user -> user.serverId == Platform.get().serverId }) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index bc0f1e03..72840b78 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -1,12 +1,20 @@ package org.sayandev.sayanvanish.api -import com.google.gson.Gson -import com.google.gson.JsonObject -import com.google.gson.JsonParser -import org.jetbrains.exposed.v1.core.Table +import com.google.gson.* +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.future.asCompletableFuture +import kotlinx.coroutines.runBlocking +import org.sayandev.sayanvanish.api.database.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException +import org.sayandev.sayanvanish.api.utils.Gson.fromJson +import org.sayandev.sayanvanish.api.utils.Gson.jsonObject +import org.sayandev.stickynote.core.utils.async +import java.lang.reflect.Type import java.util.* +import java.util.concurrent.CompletableFuture +@Suppress("unused") interface User { val uniqueId: UUID @@ -22,20 +30,78 @@ interface User { return hasPermission(permission.permission()) } - suspend fun save() { - SayanVanishAPI.getDatabase().addUser(this) + @JvmSynthetic + suspend fun save(): Deferred { + return SayanVanishAPI.getDatabase().addUser(this) } - fun toJson(): String { - val json = JsonObject() - json.addProperty("unique-id", uniqueId.toString()) - json.addProperty("username", username) - json.addProperty("is-online", isOnline) - json.addProperty("server-id", serverId) - return Gson().toJson(json) + fun saveBlocking(): Boolean { + return runBlocking { save().await() } } - object Schema : Table("${Platform.get().pluginName.lowercase()}_users") { + fun saveFuture(): CompletableFuture { + return async(SayanVanishAPI.get().getDatabase().dispatcher) { + save().await() + }.asCompletableFuture() + } + + @JvmSynthetic + suspend fun sync(): Deferred { + return SayanVanishAPI.getMessagingService().syncUser(this) + } + + fun syncBlocking(): Boolean { + return runBlocking { sync().await() } + } + + fun syncFuture(): CompletableFuture { + return async(SayanVanishAPI.get().getMessagingService().dispatcher) { + sync().await() + }.asCompletableFuture() + } + + @JvmSynthetic + suspend fun saveAndSync(): List> { + return listOf( + save(), + sync() + ) + } + + fun saveAndSyncBlocking(): List { + return runBlocking { saveAndSync().map { it.await() } } + } + + @JvmSynthetic + suspend fun asVanishUser(): Deferred { + return CompletableDeferred().apply { + async(SayanVanishAPI.get().getDatabase().dispatcher) { + SayanVanishAPI.getDatabase().getVanishUser(uniqueId).await() ?: VanishUser.of(uniqueId, username, serverId) + }.let { complete(it.await()) } + } + } + + fun asVanishUserBlocking(): VanishUser { + return runBlocking { asVanishUser().await() } + } + + fun asVanishUserFuture(): CompletableFuture { + return async(SayanVanishAPI.get().getDatabase().dispatcher) { + asVanishUser().await() + }.asCompletableFuture() + } + + class JsonAdapter : JsonSerializer, JsonDeserializer { + override fun serialize(src: User, typeOfSrc: Type, context: JsonSerializationContext): JsonObject { + return JsonParser.parseString(Gson().toJson(src)).asJsonObject + } + + override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): User { + return Gson().fromJson(json, Generic::class.java) + } + } + + object Schema : PlatformTable("users") { val uniqueId = uuid("unique_id").uniqueIndex() val username = varchar("username", 16) val isOnline = bool("is_online").default(false) @@ -44,25 +110,63 @@ interface User { override val primaryKey = PrimaryKey(uniqueId) } + data class Generic( + override val uniqueId: UUID, + override var username: String, + override var isOnline: Boolean, + override var serverId: String + ) : User + + fun asGeneric(): Generic { + return Generic( + uniqueId, + username, + isOnline, + serverId + ) + } + companion object { @JvmStatic - fun fromJson(serialized: String): User { - val json = JsonParser.parseString(serialized).asJsonObject - val uniqueId = json.get("unique-id").asString - val username = json.get("username").asString - val isOnline = json.get("is-online").asBoolean - val serverId = json.get("server-id").asString - return of(UUID.fromString(uniqueId), username, isOnline, serverId) + fun of(uniqueId: UUID, username: String, isOnline: Boolean, serverId: String?): User { + return Generic( + uniqueId, + username, + isOnline, + serverId ?: Platform.get().serverId + ) } @JvmStatic - fun of(uniqueId: UUID, username: String, isOnline: Boolean, serverId: String?): User { - return object : User { - override val uniqueId: UUID = uniqueId - override var username: String = username - override var isOnline: Boolean = isOnline - override var serverId: String = serverId ?: Platform.get().serverId - } + fun UUID.userFromCache(): User? { + TODO("Cache is not implemented yet") + } + + @JvmSynthetic + suspend fun UUID.user(): Deferred { + return SayanVanishAPI.getDatabase().getUser(this) + } + + @JvmSynthetic + fun UUID.userBlocking(): User? { + return runBlocking { user().await() } + } + + @JvmStatic + fun getUserBlocking(uniqueId: UUID): User? { + return uniqueId.userBlocking() + } + + @JvmSynthetic + fun UUID.userFuture(): CompletableFuture { + return async(SayanVanishAPI.get().getDatabase().dispatcher) { + user().await() + }.asCompletableFuture() + } + + @JvmStatic + fun getUserFuture(uniqueId: UUID): CompletableFuture { + return uniqueId.userFuture() } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt index 86b3f762..db8f9f55 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt @@ -4,12 +4,15 @@ import kotlinx.coroutines.Deferred import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.database.Database +import org.sayandev.sayanvanish.api.message.MessagingService import java.util.* import java.util.concurrent.CompletableFuture interface VanishAPI { fun getDatabase(): Database + fun getMessagingService(): MessagingService + fun getPlatform(): Platform fun isVanished(uniqueId: UUID): Deferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/PlatformTable.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/PlatformTable.kt new file mode 100644 index 00000000..996c3fab --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/PlatformTable.kt @@ -0,0 +1,6 @@ +package org.sayandev.sayanvanish.api.database + +import org.jetbrains.exposed.v1.core.Table +import org.sayandev.sayanvanish.api.Platform + +open class PlatformTable(name: String) : Table("${Platform.get().id.lowercase()}_${name}") \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt new file mode 100644 index 00000000..d7a03a01 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt @@ -0,0 +1,48 @@ +package org.sayandev.sayanvanish.api.utils + +import com.google.gson.JsonElement +import com.google.gson.JsonObject + +object Gson { + fun Any.jsonObject(): JsonObject { + if (this::class.isData) { + return com.google.gson.Gson().toJsonTree(this).asJsonObject + } else { + return JsonObject().apply { + this.javaClass.declaredFields.map { field -> + field.isAccessible = true + val name = field.name.replaceFirstChar { char -> char.lowercase() } + when (field.type) { + String::class.java -> addProperty(name, field.get(this) as String) + Number::class.java -> addProperty(name, field.get(this) as Number) + Boolean::class.java -> addProperty(name, field.get(this) as Boolean) + Char::class.java -> addProperty(name, field.get(this) as Char) + else -> addProperty(name, field.get(this).toString()) + } + } + } + } + } + + inline fun JsonObject.fromJson(): T { + if (T::class.isData) { + return com.google.gson.Gson().fromJson(this, T::class.java) + } else if (!T::class.java.isInterface) { + val clazz = T::class.java + val constructor = clazz.constructors.firstOrNull { constructor -> + constructor.parameters.all { parameter -> this.get(parameter.name) != null } + } ?: throw IllegalArgumentException("Tried to generate instance of type ${T::class.java.simpleName} but no suitable constructor was found for provided JsonObject.") + val args = constructor.parameters.map { parameter -> + val jsonElement: JsonElement? = this.get(parameter.name) + when (parameter.type) { + String::class.java -> jsonElement?.asString ?: "" + Number::class.java -> jsonElement?.asNumber ?: 0 + Boolean::class.java -> jsonElement?.asBoolean ?: false + Char::class.java -> jsonElement?.asString?.firstOrNull() ?: ' ' + else -> throw IllegalArgumentException("Unsupported type ${parameter.type} for parameter ${parameter.name}") + } + }.toTypedArray() + return constructor.newInstance(*args) as T + } + } +} \ No newline at end of file From 200585b05689fd64717be4f03a304886bcaa1905 Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 10 Jul 2025 02:16:51 +0330 Subject: [PATCH 07/67] chore: rename `Sync` to `Blocking` in runBlocking version of suspending functions name --- .../sayanvanish/api/SayanVanishAPI.kt | 2 +- .../org/sayandev/sayanvanish/api/User.kt | 4 +- .../org/sayandev/sayanvanish/api/VanishAPI.kt | 2 +- .../sayanvanish/api/database/Database.kt | 46 +++++++++---------- .../api/database/TransactionDatabase.kt | 8 ++-- .../api/database/redis/RedisDatabase.kt | 9 ++-- .../api/database/sql/SQLDatabase.kt | 4 +- .../sayanvanish/bungeecord/VanishManager.kt | 2 +- .../sayanvanish/bungeecord/api/BungeeUser.kt | 2 +- .../bungeecord/api/BungeeVanishUser.kt | 4 +- .../sayanvanish/velocity/VanishManager.kt | 2 +- .../velocity/api/VelocityVanishUser.kt | 4 +- .../hook/FeatureHookEnhancedVelocity.kt | 2 +- 13 files changed, 43 insertions(+), 48 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index d5f15a08..fabc4c7e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -44,7 +44,7 @@ object SayanVanishAPI : VanishAPI { } } - override fun isVanishedSync(uniqueId: UUID): Boolean { + override fun isVanishedBlocking(uniqueId: UUID): Boolean { return runBlocking { isVanished(uniqueId).await() } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 72840b78..05aa8416 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -7,8 +7,6 @@ import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.database.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException -import org.sayandev.sayanvanish.api.utils.Gson.fromJson -import org.sayandev.sayanvanish.api.utils.Gson.jsonObject import org.sayandev.stickynote.core.utils.async import java.lang.reflect.Type import java.util.* @@ -32,7 +30,7 @@ interface User { @JvmSynthetic suspend fun save(): Deferred { - return SayanVanishAPI.getDatabase().addUser(this) + return SayanVanishAPI.getDatabase().saveUser(this) } fun saveBlocking(): Boolean { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt index db8f9f55..7167f0f9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt @@ -21,7 +21,7 @@ interface VanishAPI { return isVanished(uniqueId).asCompletableFuture() } - fun isVanishedSync(uniqueId: UUID): Boolean { + fun isVanishedBlocking(uniqueId: UUID): Boolean { return runBlocking { isVanished(uniqueId).await() } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt index 414f5e8d..9b6fcf51 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt @@ -30,7 +30,7 @@ interface Database { return async(dispatcher) { addVanishUser(vanishUser).await() }.asCompletableFuture() } - fun addVanishUserSync(vanishUser: VanishUser): Boolean { + fun addVanishUserBlocking(vanishUser: VanishUser): Boolean { return runBlocking { addVanishUser(vanishUser).await() } } @@ -40,7 +40,7 @@ interface Database { return async(dispatcher) { hasVanishUser(uniqueId).await() }.asCompletableFuture() } - fun hasVanishUserSync(uniqueId: UUID): Boolean { + fun hasVanishUserBlocking(uniqueId: UUID): Boolean { return runBlocking { hasVanishUser(uniqueId).await() } } @@ -50,7 +50,7 @@ interface Database { return async(dispatcher) { updateVanishUser(vanishUser).await() }.asCompletableFuture() } - fun updateVanishUserSync(vanishUser: VanishUser): Boolean { + fun updateVanishUserBlocking(vanishUser: VanishUser): Boolean { return runBlocking { updateVanishUser(vanishUser).await() } } @@ -60,7 +60,7 @@ interface Database { return async(dispatcher) { removeVanishUser(uniqueId).await() }.asCompletableFuture() } - fun removeVanishUserSync(uniqueId: UUID): Boolean { + fun removeVanishUserBlocking(uniqueId: UUID): Boolean { return runBlocking { removeVanishUser(uniqueId).await() } } @@ -70,7 +70,7 @@ interface Database { return async(dispatcher) { getVanishUser(uniqueId).await() }.asCompletableFuture() } - fun getVanishUserSync(uniqueId: UUID): VanishUser? { + fun getVanishUserBlocking(uniqueId: UUID): VanishUser? { return runBlocking { getVanishUser(uniqueId).await() } } @@ -80,7 +80,7 @@ interface Database { return async(dispatcher) { getVanishUsers().await() }.asCompletableFuture() } - fun getVanishUsersSync(): List { + fun getVanishUsersBlocking(): List { return runBlocking { getVanishUsers().await() } } @@ -96,18 +96,18 @@ interface Database { return async(dispatcher) { getUsers().await() }.asCompletableFuture() } - fun getUsersSync(): List { + fun getUsersBlocking(): List { return runBlocking { getUsers().await() } } - suspend fun addUser(user: User): Deferred + suspend fun saveUser(user: User): Deferred - fun addUserFuture(user: User): CompletableFuture { - return async(dispatcher) { addUser(user).await() }.asCompletableFuture() + fun saveUserFuture(user: User): CompletableFuture { + return async(dispatcher) { saveUser(user).await() }.asCompletableFuture() } - fun addUserSync(user: User): Boolean { - return runBlocking { addUser(user).await() } + fun saveUserBlocking(user: User): Boolean { + return runBlocking { saveUser(user).await() } } suspend fun hasUser(uniqueId: UUID): Deferred @@ -116,7 +116,7 @@ interface Database { return async(dispatcher) { hasUser(uniqueId).await() }.asCompletableFuture() } - fun hasUserSync(uniqueId: UUID): Boolean { + fun hasUserBlocking(uniqueId: UUID): Boolean { return runBlocking { hasUser(uniqueId).await() } } @@ -126,7 +126,7 @@ interface Database { return async(dispatcher) { updateUser(user).await() }.asCompletableFuture() } - fun updateUserSync(user: User): Boolean { + fun updateUserBlocking(user: User): Boolean { return runBlocking { updateUser(user).await() } } @@ -136,7 +136,7 @@ interface Database { return async(dispatcher) { removeUser(uniqueId).await() }.asCompletableFuture() } - fun removeUserSync(uniqueId: UUID): Boolean { + fun removeUserBlocking(uniqueId: UUID): Boolean { return runBlocking { removeUser(uniqueId).await() } } @@ -146,18 +146,18 @@ interface Database { return async(dispatcher) { isInQueue(uniqueId).await() }.asCompletableFuture() } - fun isInQueueSync(uniqueId: UUID): Boolean { + fun isInQueueBlocking(uniqueId: UUID): Boolean { return runBlocking { isInQueue(uniqueId).await() } } - suspend fun addToQueue(uniqueId: UUID, vanished: Boolean): Deferred + suspend fun saveToQueue(uniqueId: UUID, vanished: Boolean): Deferred - fun addToQueueFuture(uniqueId: UUID, vanished: Boolean): CompletableFuture { - return async(dispatcher) { addToQueue(uniqueId, vanished).await() }.asCompletableFuture() + fun saveToQueueFuture(uniqueId: UUID, vanished: Boolean): CompletableFuture { + return async(dispatcher) { saveToQueue(uniqueId, vanished).await() }.asCompletableFuture() } - fun addToQueueSync(uniqueId: UUID, vanished: Boolean): Boolean { - return runBlocking { addToQueue(uniqueId, vanished).await() } + fun saveToQueueBlocking(uniqueId: UUID, vanished: Boolean): Boolean { + return runBlocking { saveToQueue(uniqueId, vanished).await() } } suspend fun getFromQueue(uniqueId: UUID): Deferred @@ -166,7 +166,7 @@ interface Database { return async(dispatcher) { getFromQueue(uniqueId).await() }.asCompletableFuture() } - fun getFromQueueSync(uniqueId: UUID): Boolean { + fun getFromQueueBlocking(uniqueId: UUID): Boolean { return runBlocking { getFromQueue(uniqueId).await() } } @@ -176,7 +176,7 @@ interface Database { return async(dispatcher) { removeFromQueue(uniqueId).await() }.asCompletableFuture() } - fun removeFromQueueSync(uniqueId: UUID): Boolean { + fun removeFromQueueBlocking(uniqueId: UUID): Boolean { return runBlocking { removeFromQueue(uniqueId).await() } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt index 8666592a..3eb551e6 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt @@ -120,9 +120,9 @@ class TransactionDatabase: Database { return database.getUsers() } - override suspend fun addUser(user: User): Deferred { + override suspend fun saveUser(user: User): Deferred { val database = database(TransactionTypes.USER) - return database.addUser(user) + return database.saveUser(user) } override suspend fun hasUser(uniqueId: UUID): Deferred { @@ -145,12 +145,12 @@ class TransactionDatabase: Database { return database.isInQueue(uniqueId) } - override suspend fun addToQueue( + override suspend fun saveToQueue( uniqueId: UUID, vanished: Boolean ): Deferred { val database = database(TransactionTypes.QUEUE) - return database.addToQueue(uniqueId, vanished) + return database.saveToQueue(uniqueId, vanished) } override suspend fun getFromQueue(uniqueId: UUID): Deferred { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt index d2cf0dc7..f57d189a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt @@ -7,10 +7,7 @@ import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.database.Database import org.sayandev.sayanvanish.api.database.DatabaseConfig import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher -import redis.clients.jedis.DefaultJedisClientConfig -import redis.clients.jedis.HostAndPort import redis.clients.jedis.JedisPool -import redis.clients.jedis.JedisPooled import java.util.* class RedisDatabase( @@ -105,7 +102,7 @@ class RedisDatabase( } } - override suspend fun addUser(user: User): Deferred { + override suspend fun saveUser(user: User): Deferred { return async { redis.resource.use { it.hset("users", user.uniqueId.toString(), user.toJson()) != 0L @@ -142,7 +139,7 @@ class RedisDatabase( } override suspend fun updateUser(user: User): Deferred { - return addUser(user) + return saveUser(user) } override suspend fun isInQueue(uniqueId: UUID): Deferred { @@ -153,7 +150,7 @@ class RedisDatabase( } } - override suspend fun addToQueue(uniqueId: UUID, vanished: Boolean): Deferred { + override suspend fun saveToQueue(uniqueId: UUID, vanished: Boolean): Deferred { return async { redis.resource.use { it.set("queue:$uniqueId", vanished.toString()) != null diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt index 1f7e2a27..1f23ffd4 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt @@ -169,7 +169,7 @@ class SQLDatabase( } } - override suspend fun addUser(user: User): Deferred { + override suspend fun saveUser(user: User): Deferred { return async { User.Schema.upsert { row -> row[uniqueId] = user.uniqueId @@ -242,7 +242,7 @@ class SQLDatabase( } } - override suspend fun addToQueue(uniqueId: UUID, vanished: Boolean): Deferred { + override suspend fun saveToQueue(uniqueId: UUID, vanished: Boolean): Deferred { return async { Queue.Schema.upsert { row -> row[Queue.Schema.uniqueId] = uniqueId diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt index 9cb08788..46e6d89d 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt @@ -16,7 +16,7 @@ object VanishManager : Listener { fun onPostLogin(event: ServerConnectedEvent) { val player = event.player ?: return launch { - SayanVanishBungeeAPI.getDatabase().addUser(User.of(player.uniqueId, player.name, true, player.server.info.name ?: Platform.get().id)) + SayanVanishBungeeAPI.getDatabase().saveUser(User.of(player.uniqueId, player.name, true, player.server.info.name ?: Platform.get().id)) player.getOrCreateUser() } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt index 679a1206..19e72313 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt @@ -19,7 +19,7 @@ class BungeeUser { fun ProxiedPlayer.generateAndSaveUser(): User { val user = this.generateUser() launch { - SayanVanishAPI.get().getDatabase().addUser(user) + SayanVanishAPI.get().getDatabase().saveUser(user) } return user } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt index 10f1cb83..d67081c3 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt @@ -45,7 +45,7 @@ open class BungeeVanishUser( val options = vanishEvent.options currentOptions = options - SayanVanishAPI.getDatabase().addToQueue(uniqueId, true) + SayanVanishAPI.getDatabase().saveToQueue(uniqueId, true) super.disappear(options) } @@ -56,7 +56,7 @@ open class BungeeVanishUser( val options = vanishEvent.options currentOptions = options - SayanVanishAPI.getDatabase().addToQueue(uniqueId, false) + SayanVanishAPI.getDatabase().saveToQueue(uniqueId, false) super.appear(options) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt index 78de065b..50638d72 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt @@ -20,7 +20,7 @@ object VanishManager { private fun onPostLogin(event: ServerPostConnectEvent) { val player = event.player ?: return launch { - VanishAPI.get().getDatabase().addUser(User.of(player.uniqueId, player.username, true, player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id)) + VanishAPI.get().getDatabase().saveUser(User.of(player.uniqueId, player.username, true, player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id)) val user = player.getVanishUser() ?: player.generateVanishUser() if (user.isVanished) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index 43cc19c2..e68c8f09 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -54,7 +54,7 @@ open class VelocityVanishUser( val event = server.eventManager.fire(VelocityUserVanishEvent(this, options)).await() val newOptions = event.options currentOptions = newOptions - VanishAPI.get().getDatabase().addToQueue(uniqueId, true) + VanishAPI.get().getDatabase().saveToQueue(uniqueId, true) super.disappear(newOptions) } @@ -62,7 +62,7 @@ open class VelocityVanishUser( val event = server.eventManager.fire(VelocityUserUnVanishEvent(this, options)).await() val newOptions = event.options currentOptions = newOptions - VanishAPI.get().getDatabase().addToQueue(uniqueId, false) + VanishAPI.get().getDatabase().saveToQueue(uniqueId, false) super.appear(newOptions) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt index 8fca506f..231a3c85 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt @@ -25,7 +25,7 @@ class FeatureHookEnhancedVelocity : HookFeature("hook_enhancedvelocity", "enhanc private class EnhancedVelocityImpl : VanishHook { override fun setIsVanished(uniqueId: UUID): Boolean { - return VanishAPI.get().isVanishedSync(uniqueId) + return VanishAPI.get().isVanishedBlocking(uniqueId) } override fun setVanished(uniqueId: UUID) { From 351a2e4aa313146d83b4b6229eb40cc4edcd91cc Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 10 Jul 2025 02:17:58 +0330 Subject: [PATCH 08/67] refactor: use new PlatformTable instead of native Table class in exposed --- .../src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt | 3 ++- .../src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt index f890c9a4..52a71d55 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt @@ -1,13 +1,14 @@ package org.sayandev.sayanvanish.api import org.jetbrains.exposed.v1.core.Table +import org.sayandev.sayanvanish.api.database.PlatformTable import java.util.UUID class Queue( val uniqueId: UUID, val vanished: Boolean, ) { - object Schema : Table("${Platform.get().pluginName.lowercase()}_queue") { + object Schema : PlatformTable("queue") { val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() val vanished = bool("vanished").default(false) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index e5df6759..e2cbfd5c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -5,6 +5,7 @@ import com.google.gson.JsonObject import com.google.gson.JsonParser import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.jetbrains.exposed.v1.core.Table +import org.sayandev.sayanvanish.api.database.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import java.util.* @@ -78,7 +79,7 @@ interface VanishUser : User { return Gson().toJson(json) } - object Schema : Table("${Platform.get().pluginName.lowercase()}_vanish_users") { + object Schema : PlatformTable("vanish_users") { val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() val isVanished = bool("is_vanished") val vanishLevel = integer("vanish_level") From a4e15f9c81bd95377098058bb5d8fa0fec44f871 Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 10 Jul 2025 02:31:28 +0330 Subject: [PATCH 09/67] doc: add documentation for User interface --- .../org/sayandev/sayanvanish/api/Queue.kt | 3 +- .../org/sayandev/sayanvanish/api/User.kt | 190 +++++++++++++++++- 2 files changed, 190 insertions(+), 3 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt index 52a71d55..eb17c3a9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt @@ -1,8 +1,7 @@ package org.sayandev.sayanvanish.api -import org.jetbrains.exposed.v1.core.Table import org.sayandev.sayanvanish.api.database.PlatformTable -import java.util.UUID +import java.util.* class Queue( val uniqueId: UUID, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 05aa8416..a5d21201 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -12,52 +12,138 @@ import java.lang.reflect.Type import java.util.* import java.util.concurrent.CompletableFuture +/** + * Represents a basic user with essential data such as unique ID and username. + * This interface is the building block for more specific user types like [VanishUser]. + * + * The [User] interface is commonly used for features such as online counter placeholders + * and provides basic user information and permission checks. + * + * @property uniqueId The unique identifier for the user. + * @property username The username of the user. + * @property isOnline Whether the user is currently online. + * @property serverId The ID of the server the user is connected to. + * + * @since 1.0.0 + */ @Suppress("unused") interface User { - + /** + * The unique identifier for the user. + */ val uniqueId: UUID + + /** + * The username of the user. + */ var username: String + + /** + * Whether the user is currently online. + */ var isOnline: Boolean + + /** + * The ID of the server the user is connected to. + */ var serverId: String + /** + * Checks if the user has the specified permission string. + * + * @param permission The permission string to check. + * @return True if the user has the permission, false otherwise. + * @throws UnsupportedPlatformException If the platform does not support permission checks. + * @since 1.0.0 + */ fun hasPermission(permission: String): Boolean { throw UnsupportedPlatformException("hasPermission") } + /** + * Checks if the user has the specified [Permission] object. + * + * @param permission The [Permission] to check. + * @return True if the user has the permission, false otherwise. + * @since 1.0.0 + */ fun hasPermission(permission: Permission): Boolean { return hasPermission(permission.permission()) } + /** + * Saves the user asynchronously to the database. + * + * @see org.sayandev.sayanvanish.api.database.Database.saveUser + * @return A [Deferred] indicating the result of the save operation. + * @since 2.0.0 + */ @JvmSynthetic suspend fun save(): Deferred { return SayanVanishAPI.getDatabase().saveUser(this) } + /** + * Saves the user to the database in a blocking manner. + * + * @return True if the save was successful, false otherwise. + * @since 2.0.0 + */ fun saveBlocking(): Boolean { return runBlocking { save().await() } } + /** + * Saves the user to the database and returns a [CompletableFuture] for the result. + * + * @return A [CompletableFuture] indicating the result of the save operation. + * @since 2.0.0 + */ fun saveFuture(): CompletableFuture { return async(SayanVanishAPI.get().getDatabase().dispatcher) { save().await() }.asCompletableFuture() } + /** + * Synchronizes the user data with the messaging service asynchronously. + * + * @return A [Deferred] indicating the result of the sync operation. + * @since 2.0.0 + */ @JvmSynthetic suspend fun sync(): Deferred { return SayanVanishAPI.getMessagingService().syncUser(this) } + /** + * Synchronizes the user data with the messaging service in a blocking manner. + * + * @return True if the sync was successful, false otherwise. + * @since 2.0.0 + */ fun syncBlocking(): Boolean { return runBlocking { sync().await() } } + /** + * Synchronizes the user data with the messaging service and returns a [CompletableFuture] for the result. + * + * @return A [CompletableFuture] indicating the result of the sync operation. + * @since 2.0.0 + */ fun syncFuture(): CompletableFuture { return async(SayanVanishAPI.get().getMessagingService().dispatcher) { sync().await() }.asCompletableFuture() } + /** + * Saves and synchronizes the user data. + * + * @return A list of [Deferred] objects indicating the results of the save and sync operations. + * @since 2.0.0 + */ @JvmSynthetic suspend fun saveAndSync(): List> { return listOf( @@ -66,10 +152,22 @@ interface User { ) } + /** + * Saves and synchronizes the user data in a blocking manner. + * + * @return A list of Boolean values indicating the results of the save and sync operations. + * @since 2.0.0 + */ fun saveAndSyncBlocking(): List { return runBlocking { saveAndSync().map { it.await() } } } + /** + * Asynchronously retrieves the [VanishUser] representation of this user. + * + * @return A [Deferred] containing the [VanishUser] instance. + * @since 2.0.0 + */ @JvmSynthetic suspend fun asVanishUser(): Deferred { return CompletableDeferred().apply { @@ -79,16 +177,32 @@ interface User { } } + /** + * Retrieves the [VanishUser] representation of this user in a blocking manner. + * + * @return The [VanishUser] instance. + * @since 2.0.0 + */ fun asVanishUserBlocking(): VanishUser { return runBlocking { asVanishUser().await() } } + /** + * Asynchronously retrieves the [VanishUser] representation of this user and returns a [CompletableFuture]. + * + * @return A [CompletableFuture] containing the [VanishUser] instance. + * @since 2.0.0 + */ fun asVanishUserFuture(): CompletableFuture { return async(SayanVanishAPI.get().getDatabase().dispatcher) { asVanishUser().await() }.asCompletableFuture() } + /** + * @since 2.0.0 + */ + // TODO: use kotlinx-serialization-gson? class JsonAdapter : JsonSerializer, JsonDeserializer { override fun serialize(src: User, typeOfSrc: Type, context: JsonSerializationContext): JsonObject { return JsonParser.parseString(Gson().toJson(src)).asJsonObject @@ -99,6 +213,13 @@ interface User { } } + /** + * Represents the database schema for the [User] entity. + * + * Defines the columns and primary key for the users table. + * + * @since 2.0.0 + */ object Schema : PlatformTable("users") { val uniqueId = uuid("unique_id").uniqueIndex() val username = varchar("username", 16) @@ -108,6 +229,15 @@ interface User { override val primaryKey = PrimaryKey(uniqueId) } + /** + * Generic implementation of the [User] interface. + * + * @property uniqueId The unique identifier for the user. + * @property username The username of the user. + * @property isOnline Whether the user is currently online. + * @property serverId The ID of the server the user is connected to. + * @since 2.0.0 + */ data class Generic( override val uniqueId: UUID, override var username: String, @@ -115,6 +245,12 @@ interface User { override var serverId: String ) : User + /** + * Converts this [User] to a [Generic] implementation. + * + * @return A [Generic] user instance with the same properties as this user. + * @since 2.0.0 + */ fun asGeneric(): Generic { return Generic( uniqueId, @@ -125,6 +261,16 @@ interface User { } companion object { + /** + * Creates a new [User] instance with the given properties. + * + * @param uniqueId The unique identifier for the user. + * @param username The username of the user. + * @param isOnline Whether the user is currently online. + * @param serverId The ID of the server the user is connected to. If null, uses the platform's default server ID. + * @return A new [User] instance. + * @since 1.6.0 + */ @JvmStatic fun of(uniqueId: UUID, username: String, isOnline: Boolean, serverId: String?): User { return Generic( @@ -135,26 +281,61 @@ interface User { ) } + /** + * Retrieves a [User] from the cache by [UUID]. + * + * @receiver The [UUID] of the user to retrieve. + * @return The [User] if found in cache, or null if not found. + * @since 2.0.0 + */ @JvmStatic fun UUID.userFromCache(): User? { TODO("Cache is not implemented yet") } + /** + * Asynchronously retrieves a [User] by [UUID] from the database. + * + * @receiver The [UUID] of the user to retrieve. + * @return A [Deferred] containing the [User] if found, or null if not found. + * @since 2.0.0 + */ @JvmSynthetic suspend fun UUID.user(): Deferred { return SayanVanishAPI.getDatabase().getUser(this) } + /** + * Retrieves a [User] by [UUID] from the database in a blocking manner. + * + * @receiver The [UUID] of the user to retrieve. + * @return The [User] if found, or null if not found. + * @since 2.0.0 + */ @JvmSynthetic fun UUID.userBlocking(): User? { return runBlocking { user().await() } } + /** + * Retrieves a [User] by [UUID] from the database in a blocking manner. + * + * @param uniqueId The [UUID] of the user to retrieve. + * @return The [User] if found, or null if not found. + * @since 2.0.0 + */ @JvmStatic fun getUserBlocking(uniqueId: UUID): User? { return uniqueId.userBlocking() } + /** + * Asynchronously retrieves a [User] by [UUID] from the database and returns a [CompletableFuture]. + * + * @receiver The [UUID] of the user to retrieve. + * @return A [CompletableFuture] containing the [User] if found, or null if not found. + * @since 2.0.0 + */ @JvmSynthetic fun UUID.userFuture(): CompletableFuture { return async(SayanVanishAPI.get().getDatabase().dispatcher) { @@ -162,6 +343,13 @@ interface User { }.asCompletableFuture() } + /** + * Retrieves a [User] by [UUID] from the database and returns a [CompletableFuture]. + * + * @param uniqueId The [UUID] of the user to retrieve. + * @return A [CompletableFuture] containing the [User] if found, or null if not found. + * @since 2.0.0 + */ @JvmStatic fun getUserFuture(uniqueId: UUID): CompletableFuture { return uniqueId.userFuture() From b93693899169dd55dabba9a8266d3f19f3be13b3 Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 15:18:54 +0330 Subject: [PATCH 10/67] feat: add cache service --- .../org/sayandev/sayanvanish/api/Platform.kt | 2 +- .../org/sayandev/sayanvanish/api/Queue.kt | 2 +- .../sayanvanish/api/SayanVanishAPI.kt | 9 ++- .../org/sayandev/sayanvanish/api/User.kt | 4 +- .../org/sayandev/sayanvanish/api/VanishAPI.kt | 5 +- .../sayandev/sayanvanish/api/VanishUser.kt | 3 +- .../sayandev/sayanvanish/api/cache/Cache.kt | 7 +- .../sayanvanish/api/cache/CacheService.kt | 10 +++ .../sayandev/sayanvanish/api/cache/ICache.kt | 5 ++ .../api/cache/MemoryCacheService.kt | 14 ++++ .../sayanvanish/api/cache/UserCountCache.kt | 7 -- .../sayanvanish/api/cache/VanishUserCache.kt | 6 -- .../api/database/DatabaseConfig.kt | 43 ----------- .../sayanvanish/api/health/HealthCheckData.kt | 4 +- .../sayanvanish/api/message/MessageConfig.kt | 4 +- .../api/message/MessagingService.kt | 4 +- .../sayanvanish/api/message/MessagingTypes.kt | 2 +- .../api/message/TypedMessagingService.kt | 10 +++ .../message/types/RedisMessagingService.kt | 46 ++++++------ .../types/WebSocketMessagingService.kt | 74 +++++++++++++++++++ .../api/{database => storage}/Database.kt | 4 +- .../api/{database => storage}/DatabaseType.kt | 2 +- .../{database => storage}/PlatformTable.kt | 2 +- .../sayanvanish/api/storage/StorageConfig.kt | 57 ++++++++++++++ .../TransactionDatabase.kt | 12 +-- .../{database => storage}/TransactionType.kt | 2 +- .../{database => storage}/TransactionTypes.kt | 2 +- .../redis/RedisConfig.kt | 4 +- .../redis/RedisConnection.kt | 2 +- .../redis/RedisDatabase.kt | 8 +- .../{database => storage}/sql/SQLConfig.kt | 2 +- .../{database => storage}/sql/SQLDatabase.kt | 12 +-- .../api/storage/websocket/WebSocketConfig.kt | 10 +++ .../sayanvanish/bukkit/SayanVanish.kt | 14 ++-- .../bukkit/command/SayanVanishCommand.kt | 10 +-- .../sayanvanish/bukkit/health/HealthCache.kt | 4 +- .../bukkit/health/ServerInfoPublisher.kt | 6 +- .../health/HealthCheckMessageSubscriber.kt | 10 +-- settings.gradle.kts | 2 +- 39 files changed, 277 insertions(+), 149 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/ICache.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt delete mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/UserCountCache.kt delete mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/VanishUserCache.kt delete mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/Database.kt (97%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/DatabaseType.kt (51%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/PlatformTable.kt (79%) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/TransactionDatabase.kt (95%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/TransactionType.kt (95%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/TransactionTypes.kt (87%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/redis/RedisConfig.kt (93%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/redis/RedisConnection.kt (96%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/redis/RedisDatabase.kt (96%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/sql/SQLConfig.kt (97%) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{database => storage}/sql/SQLDatabase.kt (96%) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index 3d47f3d4..261f8aa2 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.api import com.mysql.cj.jdbc.exceptions.OperationNotSupportedException -import org.sayandev.sayanvanish.api.database.TransactionDatabase +import org.sayandev.sayanvanish.api.storage.TransactionDatabase import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import java.io.File import java.util.logging.Logger diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt index eb17c3a9..bbac694d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.api -import org.sayandev.sayanvanish.api.database.PlatformTable +import org.sayandev.sayanvanish.api.storage.PlatformTable import java.util.* class Queue( diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index fabc4c7e..0d615d0b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -3,7 +3,9 @@ package org.sayandev.sayanvanish.api import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.runBlocking -import org.sayandev.sayanvanish.api.database.TransactionDatabase +import org.sayandev.sayanvanish.api.cache.CacheService +import org.sayandev.sayanvanish.api.cache.MemoryCacheService +import org.sayandev.sayanvanish.api.storage.TransactionDatabase import org.sayandev.sayanvanish.api.message.MessagingService import org.sayandev.sayanvanish.api.message.TypedMessagingService import org.sayandev.stickynote.core.utils.launch @@ -13,6 +15,7 @@ object SayanVanishAPI : VanishAPI { private val database = TransactionDatabase() private val messagingService = TypedMessagingService() + private val cacheService = MemoryCacheService() override fun getDatabase(): TransactionDatabase { return database @@ -22,6 +25,10 @@ object SayanVanishAPI : VanishAPI { return messagingService } + override fun getCacheService(): CacheService { + return cacheService + } + init { launch(database.dispatcher) { for (user in database.getVanishUsers().await().filter { user -> user.serverId == Platform.get().serverId }) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index a5d21201..0e54072e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking -import org.sayandev.sayanvanish.api.database.PlatformTable +import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import org.sayandev.stickynote.core.utils.async import java.lang.reflect.Type @@ -74,7 +74,7 @@ interface User { /** * Saves the user asynchronously to the database. * - * @see org.sayandev.sayanvanish.api.database.Database.saveUser + * @see org.sayandev.sayanvanish.api.storage.Database.saveUser * @return A [Deferred] indicating the result of the save operation. * @since 2.0.0 */ diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt index 7167f0f9..6b06fb1e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt @@ -3,7 +3,8 @@ package org.sayandev.sayanvanish.api import kotlinx.coroutines.Deferred import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking -import org.sayandev.sayanvanish.api.database.Database +import org.sayandev.sayanvanish.api.cache.CacheService +import org.sayandev.sayanvanish.api.storage.Database import org.sayandev.sayanvanish.api.message.MessagingService import java.util.* import java.util.concurrent.CompletableFuture @@ -13,6 +14,8 @@ interface VanishAPI { fun getMessagingService(): MessagingService + fun getCacheService(): CacheService + fun getPlatform(): Platform fun isVanished(uniqueId: UUID): Deferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index e2cbfd5c..8bfe7475 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -4,8 +4,7 @@ import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParser import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver -import org.jetbrains.exposed.v1.core.Table -import org.sayandev.sayanvanish.api.database.PlatformTable +import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import java.util.* diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt index 449b1578..d7e3135d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt @@ -1,8 +1,9 @@ package org.sayandev.sayanvanish.api.cache -abstract class Cache( - id: String -) : MutableMap by mutableMapOf() { +class Cache( + override val id: String +) : ICache, MutableMap by mutableMapOf() { + fun getValue(key: K): V? { return this[key] } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt new file mode 100644 index 00000000..fc029118 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt @@ -0,0 +1,10 @@ +package org.sayandev.sayanvanish.api.cache + +import org.sayandev.sayanvanish.api.User +import java.util.UUID + +interface CacheService { + fun getUsers(): ICache + fun getVanishUsers(): ICache + fun getUsersCount(): ICache +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/ICache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/ICache.kt new file mode 100644 index 00000000..582673a0 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/ICache.kt @@ -0,0 +1,5 @@ +package org.sayandev.sayanvanish.api.cache + +interface ICache : MutableMap { + val id: String +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt new file mode 100644 index 00000000..6dd303bb --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt @@ -0,0 +1,14 @@ +package org.sayandev.sayanvanish.api.cache + +import org.sayandev.sayanvanish.api.User +import java.util.UUID + +class MemoryCacheService : CacheService { + object Users : ICache by Cache("users") + object VanishUsers : ICache by Cache("vanish_users") + object UsersCount : ICache by Cache("users_count") + + override fun getUsers() = Users + override fun getVanishUsers() = VanishUsers + override fun getUsersCount() = UsersCount +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/UserCountCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/UserCountCache.kt deleted file mode 100644 index 77084894..00000000 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/UserCountCache.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.sayandev.sayanvanish.api.cache - -class UserCountCache : Cache("user_count") { - fun totalCount(): Int { - return values.sumOf { it } - } -} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/VanishUserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/VanishUserCache.kt deleted file mode 100644 index df3a5426..00000000 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/VanishUserCache.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.sayandev.sayanvanish.api.cache - -import org.sayandev.sayanvanish.api.VanishUser -import java.util.UUID - -class VanishUserCache : Cache("vanish_users") \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt deleted file mode 100644 index 1d9d1a77..00000000 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseConfig.kt +++ /dev/null @@ -1,43 +0,0 @@ -package org.sayandev.sayanvanish.api.database - -import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.database.redis.RedisConfig -import org.sayandev.sayanvanish.api.database.sql.SQLConfig -import org.sayandev.stickynote.core.configuration.Config -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment -import org.spongepowered.configurate.serialize.TypeSerializerCollection -import java.io.File - -public var databaseConfig = DatabaseConfig.fromConfig() ?: DatabaseConfig.defaultConfig() - -@ConfigSerializable -class DatabaseConfig( - @Comment("Configuration for the database, including method, SQL, Redis, and caching options.") - val method: DatabaseType = DatabaseType.SQL, - @Comment("Configuration for SQL database") - val sql: SQLConfig = SQLConfig(), - @Comment("Configuration for Redis database") - val redis: RedisConfig = RedisConfig(), - val transactionTypes: List = TransactionTypes.entries, -) : Config(Platform.get().rootDirectory, fileName, serializers()) { - companion object { - private val fileName = "database.yml" - - @JvmStatic - fun defaultConfig(): DatabaseConfig { - return DatabaseConfig().also { it.save() } - } - - @JvmStatic - fun fromConfig(): DatabaseConfig? { - return fromConfig(File(Platform.get().rootDirectory, fileName), serializers()) - } - - fun serializers(): TypeSerializerCollection { - return TypeSerializerCollection.builder() - .register(TransactionType::class.java, TransactionType.Serializer) - .build() - } - } -} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt index 9e2de75c..8d185c3a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.api.health -import org.sayandev.sayanvanish.api.database.DatabaseType -import org.sayandev.sayanvanish.api.database.sql.SQLConfig +import org.sayandev.sayanvanish.api.storage.DatabaseType +import org.sayandev.sayanvanish.api.storage.sql.SQLConfig data class HealthCheckData( val proxy: ProxyInfo, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt index 994dbee0..31f6016b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt @@ -1,7 +1,8 @@ package org.sayandev.sayanvanish.api.message import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.database.redis.RedisConfig +import org.sayandev.sayanvanish.api.storage.redis.RedisConfig +import org.sayandev.sayanvanish.api.storage.websocket.WebSocketConfig import org.sayandev.stickynote.core.configuration.Config import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment @@ -15,6 +16,7 @@ class MessageConfig( @Comment("Configuration for Redis database") val threadCount: Int = 5, val redis: RedisConfig = RedisConfig(), + val webSocketConfig: WebSocketConfig = WebSocketConfig(), val categoryTypes: List = MessagingCategoryTypes.entries, ) : Config(Platform.get().rootDirectory, fileName, serializers()) { companion object { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt index 26939d1e..ae7ef5a1 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt @@ -18,7 +18,7 @@ interface MessagingService { return async(dispatcher) { syncUser(user).await() }.asCompletableFuture() } - fun syncUserSync(user: User): Boolean { + fun syncUserBlocking(user: User): Boolean { return runBlocking { syncUser(user).await() } } @@ -28,7 +28,7 @@ interface MessagingService { return async(dispatcher) { syncVanishUser(vanishUser).await() }.asCompletableFuture() } - fun syncVanishUserSync(vanishUser: VanishUser): Boolean { + fun syncVanishUserBlocking(vanishUser: VanishUser): Boolean { return runBlocking { syncVanishUser(vanishUser).await() } } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt index 6b61ac5a..5748ce83 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt @@ -3,6 +3,6 @@ package org.sayandev.sayanvanish.api.message enum class MessagingTypes( override val id: String ) : MessagingType { - PLUGIN_MESSAGE("plugin_message"), REDIS("redis"), + WEBSOCKET("websocket"), } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt index 4ad57d6a..48b09348 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt @@ -6,6 +6,7 @@ import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.message.types.RedisMessagingService +import org.sayandev.sayanvanish.api.message.types.WebSocketMessagingService import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher class TypedMessagingService: MessagingService { @@ -34,6 +35,15 @@ class TypedMessagingService: MessagingService { throw e } } + method == MessagingTypes.WEBSOCKET -> { + messageTypes[MessagingTypes.WEBSOCKET] = try { + WebSocketMessagingService(messageConfig.webSocketConfig, dispatcher) + } catch (e: Exception) { + messagingConnected = false + logMessagingConnectionError() + throw e + } + } // MessagingTypes.PLUGIN_MESSAGE Will be added on bukkit/proxy side in minecraft platform } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index 7272c7f9..bdbb13c9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -3,15 +3,19 @@ package org.sayandev.sayanvanish.api.message.types import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.api.database.redis.RedisConfig -import org.sayandev.sayanvanish.api.database.redis.RedisConnection +import org.sayandev.sayanvanish.api.storage.redis.RedisConfig +import org.sayandev.sayanvanish.api.storage.redis.RedisConnection import org.sayandev.sayanvanish.api.message.MessagingCategoryTypes import org.sayandev.sayanvanish.api.message.MessagingService import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher -import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper -import org.sayandev.stickynote.core.messaging.publisher.RedisPublisher +import org.sayandev.stickynote.core.messaging.MessageMeta +import org.sayandev.stickynote.core.messaging.PayloadBehaviour +import org.sayandev.stickynote.core.messaging.PayloadWrapper +import org.sayandev.stickynote.core.messaging.redis.RedisConnectionMeta +import org.sayandev.stickynote.core.messaging.redis.RedisPublisher class RedisMessagingService( val config: RedisConfig, @@ -19,8 +23,8 @@ class RedisMessagingService( ) : MessagingService { val connection = RedisConnection(config, dispatcher) - val syncUserPublisher = SyncUserPublisher() - val syncVanishUserPublisher = SyncVanishUserPublisher() + val syncUserPublisher = SyncUserPublisher().apply { this.register() } + val syncVanishUserPublisher = SyncVanishUserPublisher().apply { this.register() } override suspend fun syncUser(user: User): Deferred { return syncUserPublisher.sync(user) @@ -31,46 +35,40 @@ class RedisMessagingService( } inner class SyncUserPublisher : RedisPublisher( - dispatcher, - connection.redis, - Platform.Companion.get().id.lowercase(), - MessagingCategoryTypes.SYNC_USER.id, - User::class.java, - Boolean::class.java, - Platform.Companion.get().logger + MessageMeta.create(Platform.get().id.lowercase(), MessagingCategoryTypes.SYNC_USER.id), + RedisConnectionMeta(connection.redis, dispatcher), + Platform.get().logger ) { override fun handle(payload: User): Boolean? { - TODO("Set user in cache") + SayanVanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) + return true } suspend fun sync(user: User): CompletableDeferred { return publish( PayloadWrapper( user, - PayloadWrapper.State.FORWARD + PayloadBehaviour.FORWARD ) ) } } inner class SyncVanishUserPublisher : RedisPublisher( - dispatcher, - connection.redis, - Platform.Companion.get().id.lowercase(), - MessagingCategoryTypes.SYNC_VANISH_USER.id, - VanishUser::class.java, - Boolean::class.java, - Platform.Companion.get().logger + MessageMeta.create(Platform.get().id.lowercase(), MessagingCategoryTypes.SYNC_VANISH_USER.id), + RedisConnectionMeta(connection.redis, dispatcher), + Platform.get().logger ) { override fun handle(payload: VanishUser): Boolean? { - TODO("Set vanish user in cache") + SayanVanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) + return true } suspend fun sync(vanishUser: VanishUser): CompletableDeferred { return publish( PayloadWrapper( vanishUser, - PayloadWrapper.State.FORWARD + PayloadBehaviour.FORWARD ) ) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt new file mode 100644 index 00000000..d1d188cc --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -0,0 +1,74 @@ +package org.sayandev.sayanvanish.api.message.types + +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.SayanVanishAPI +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.message.MessagingCategoryTypes +import org.sayandev.sayanvanish.api.message.MessagingService +import org.sayandev.sayanvanish.api.storage.websocket.WebSocketConfig +import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher +import org.sayandev.stickynote.core.messaging.MessageMeta +import org.sayandev.stickynote.core.messaging.PayloadBehaviour +import org.sayandev.stickynote.core.messaging.PayloadWrapper +import org.sayandev.stickynote.core.messaging.websocket.WebSocketConnectionMeta +import org.sayandev.stickynote.core.messaging.websocket.WebSocketPublisher +import java.net.URI + +class WebSocketMessagingService( + val config: WebSocketConfig, + override val dispatcher: AsyncDispatcher +) : MessagingService { + val syncUserPublisher = SyncUserPublisher().apply { this.register() } + val syncVanishUserPublisher = SyncVanishUserPublisher().apply { this.register() } + + override suspend fun syncUser(user: User): Deferred { + return syncUserPublisher.sync(user) + } + + override suspend fun syncVanishUser(vanishUser: VanishUser): Deferred { + return syncVanishUserPublisher.sync(vanishUser) + } + + inner class SyncUserPublisher : WebSocketPublisher( + MessageMeta.create(Platform.get().id.lowercase(), MessagingCategoryTypes.SYNC_USER.id), + WebSocketConnectionMeta(URI.create(config.uri), dispatcher), + Platform.get().logger + ) { + override fun handle(payload: User): Boolean? { + SayanVanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) + return true + } + + suspend fun sync(user: User): CompletableDeferred { + return publish( + PayloadWrapper( + user, + PayloadBehaviour.FORWARD + ) + ) + } + } + + inner class SyncVanishUserPublisher : WebSocketPublisher( + MessageMeta.create(Platform.get().id.lowercase(), MessagingCategoryTypes.SYNC_VANISH_USER.id), + WebSocketConnectionMeta(URI.create(config.uri), dispatcher), + Platform.get().logger + ) { + override fun handle(payload: VanishUser): Boolean? { + SayanVanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) + return true + } + + suspend fun sync(vanishUser: VanishUser): CompletableDeferred { + return publish( + PayloadWrapper( + vanishUser, + PayloadBehaviour.FORWARD + ) + ) + } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt similarity index 97% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt index 9b6fcf51..28a606e1 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt @@ -1,12 +1,10 @@ -package org.sayandev.sayanvanish.api.database +package org.sayandev.sayanvanish.api.storage import kotlinx.coroutines.Deferred import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.api.cache.UserCountCache -import org.sayandev.sayanvanish.api.cache.VanishUserCache import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import org.sayandev.stickynote.core.utils.async import java.util.* diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt similarity index 51% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseType.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt index 65e606b3..6393d441 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/DatabaseType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.api.database +package org.sayandev.sayanvanish.api.storage enum class DatabaseType { SQL, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/PlatformTable.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt similarity index 79% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/PlatformTable.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt index 996c3fab..198dd1e4 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/PlatformTable.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.api.database +package org.sayandev.sayanvanish.api.storage import org.jetbrains.exposed.v1.core.Table import org.sayandev.sayanvanish.api.Platform diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt new file mode 100644 index 00000000..7ffff1af --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt @@ -0,0 +1,57 @@ +package org.sayandev.sayanvanish.api.storage + +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.storage.redis.RedisConfig +import org.sayandev.sayanvanish.api.storage.sql.SQLConfig +import org.sayandev.sayanvanish.api.storage.websocket.WebSocketConfig +import org.sayandev.stickynote.core.configuration.Config +import org.spongepowered.configurate.objectmapping.ConfigSerializable +import org.spongepowered.configurate.objectmapping.meta.Comment +import org.spongepowered.configurate.serialize.TypeSerializerCollection +import java.io.File + +public var storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultConfig() + +@ConfigSerializable +class StorageConfig( + @Comment("Configuration for the database, including method, SQL, Redis, and caching options.") + val method: DatabaseType = DatabaseType.SQL, + @Comment("Configuration for SQL database") + val sql: SQLConfig = SQLConfig(), + @Comment("Configuration for Redis database") + val redis: RedisConfig = RedisConfig(), + val transactionTypes: MutableList = TransactionTypes.entries.toMutableList(), +) : Config(Platform.get().rootDirectory, FILE_NAME, serializers()) { + + init { + // Make sure to add missing transaction types to configuration file + var addedNewType = false + for (missingType in TransactionTypes.entries.filter { !transactionTypes.contains(it) }) { + transactionTypes.add(missingType) + addedNewType = true + } + if (addedNewType) { + save() + } + } + + companion object { + private const val FILE_NAME = "storage.yml" + + @JvmStatic + fun defaultConfig(): StorageConfig { + return StorageConfig().also { it.save() } + } + + @JvmStatic + fun fromConfig(): StorageConfig? { + return fromConfig(File(Platform.get().rootDirectory, FILE_NAME), serializers()) + } + + fun serializers(): TypeSerializerCollection { + return TypeSerializerCollection.builder() + .register(TransactionType::class.java, TransactionType.Serializer) + .build() + } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt similarity index 95% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt index 3eb551e6..4b83133f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.api.database +package org.sayandev.sayanvanish.api.storage import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope @@ -10,8 +10,8 @@ import kotlinx.coroutines.isActive import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.api.database.redis.RedisDatabase -import org.sayandev.sayanvanish.api.database.sql.SQLDatabase +import org.sayandev.sayanvanish.api.storage.redis.RedisDatabase +import org.sayandev.sayanvanish.api.storage.sql.SQLDatabase import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import java.util.* @@ -30,12 +30,12 @@ class TransactionDatabase: Database { var databaseConnected: Boolean = true override suspend fun initialize(): Deferred { - val transactionMethods = databaseConfig.transactionTypes.map { it.type }.distinct() + val transactionMethods = storageConfig.transactionTypes.map { it.type }.distinct() for (method in transactionMethods) { when (method) { DatabaseType.SQL -> { databaseTypes[DatabaseType.SQL] = try { - SQLDatabase(databaseConfig).also { sqlDatabase -> + SQLDatabase(storageConfig).also { sqlDatabase -> sqlDatabase.connect() sqlDatabase.initialize() } @@ -47,7 +47,7 @@ class TransactionDatabase: Database { } DatabaseType.REDIS -> { databaseTypes[DatabaseType.REDIS] = try { - RedisDatabase(databaseConfig).also { redisDatabase -> + RedisDatabase(storageConfig).also { redisDatabase -> redisDatabase.initialize() redisDatabase.connect() } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt similarity index 95% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt index 9ea1bb09..59ce911a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.api.database +package org.sayandev.sayanvanish.api.storage import org.spongepowered.configurate.ConfigurationNode import org.spongepowered.configurate.serialize.TypeSerializer diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt similarity index 87% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt index 6da59b75..d7993ed2 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/TransactionTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.api.database +package org.sayandev.sayanvanish.api.storage enum class TransactionTypes( override val id: String, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt similarity index 93% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConfig.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt index 758c73c7..8f85bd39 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt @@ -1,10 +1,10 @@ -package org.sayandev.sayanvanish.api.database.redis +package org.sayandev.sayanvanish.api.storage.redis import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment @ConfigSerializable -class RedisConfig( +data class RedisConfig( val threadCount: Int = 5, @Comment("The type of Redis configuration. Available types: STANDALONE") val type: RedisType = RedisType.STANDALONE, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConnection.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConnection.kt similarity index 96% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConnection.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConnection.kt index 259df0e1..e6d4c1d0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisConnection.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConnection.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.api.database.redis +package org.sayandev.sayanvanish.api.storage.redis import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt similarity index 96% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt index f57d189a..3cd74572 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt @@ -1,17 +1,17 @@ -package org.sayandev.sayanvanish.api.database.redis +package org.sayandev.sayanvanish.api.storage.redis import kotlinx.coroutines.* import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.api.database.Database -import org.sayandev.sayanvanish.api.database.DatabaseConfig +import org.sayandev.sayanvanish.api.storage.Database +import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import redis.clients.jedis.JedisPool import java.util.* class RedisDatabase( - val config: DatabaseConfig, + val config: StorageConfig, ) : Database { val connection = RedisConnection(config.redis, AsyncDispatcher( diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt similarity index 97% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt index 5677ecf1..ce84b3e7 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.api.database.sql +package org.sayandev.sayanvanish.api.storage.sql import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt similarity index 96% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index 1f23ffd4..0bede9e2 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/database/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -1,7 +1,5 @@ -package org.sayandev.sayanvanish.api.database.sql +package org.sayandev.sayanvanish.api.storage.sql -import com.zaxxer.hikari.HikariConfig -import com.zaxxer.hikari.HikariDataSource import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.awaitAll @@ -16,17 +14,15 @@ import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.Queue import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.api.database.Database -import org.sayandev.sayanvanish.api.database.DatabaseConfig +import org.sayandev.sayanvanish.api.storage.Database +import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import org.sayandev.stickynote.core.utils.CoroutineUtils import org.sayandev.stickynote.core.utils.launch import java.util.* -import java.util.concurrent.TimeUnit -import kotlin.text.get class SQLDatabase( - val config: DatabaseConfig, + val config: StorageConfig, ) : Database { override var connected = false diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt new file mode 100644 index 00000000..79e903ba --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt @@ -0,0 +1,10 @@ +package org.sayandev.sayanvanish.api.storage.websocket + +import org.spongepowered.configurate.objectmapping.ConfigSerializable +import org.spongepowered.configurate.objectmapping.meta.Comment + +@ConfigSerializable +class WebSocketConfig( + val threadCount: Int = 5, + val uri: String = "ws://localhost:8083" +) \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt index d399f006..3eff5bfe 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt @@ -3,10 +3,10 @@ package org.sayandev.sayanvanish.bukkit import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.database.DatabaseType -import org.sayandev.sayanvanish.api.database.databaseConfig -import org.sayandev.sayanvanish.api.database.sql.SQLConfig -import org.sayandev.sayanvanish.api.database.sql.SQLDatabase +import org.sayandev.sayanvanish.api.storage.DatabaseType +import org.sayandev.sayanvanish.api.storage.storageConfig +import org.sayandev.sayanvanish.api.storage.sql.SQLConfig +import org.sayandev.sayanvanish.api.storage.sql.SQLDatabase import org.sayandev.sayanvanish.bukkit.api.Metrics import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.command.SayanVanishCommand @@ -40,7 +40,7 @@ open class SayanVanish : JavaPlugin() { ServerInfoPublisher settings - if (settings.general.proxyMode && databaseConfig.method == DatabaseType.SQL && databaseConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { + if (settings.general.proxyMode && storageConfig.method == DatabaseType.SQL && storageConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { error("The `proxy-mode` is enabled, but the database method is set to SQLite, which might lead to unexpected results. If you're using proxies such as Velocity or BungeeCord, make sure to use a different database method, such as MySQL or Redis.") } @@ -58,7 +58,7 @@ open class SayanVanish : JavaPlugin() { }, 0, settings.general.cacheUpdatePeriodTicks) runAsync({ - if (databaseConfig.method == DatabaseType.SQL) { + if (storageConfig.method == DatabaseType.SQL) { SayanVanishBukkitAPI.getInstance().database.getBasicUsersAsync { users -> (SayanVanishBukkitAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() (SayanVanishAPI.getDatabase() as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() @@ -75,7 +75,7 @@ open class SayanVanish : JavaPlugin() { if (settings.general.proxyMode) "On Proxy" else "No Proxy" }) this.addCustomChart(Metrics.SimplePie("database_method") { - databaseConfig.method.name + storageConfig.method.name }) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 707b8641..ea64d844 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -17,8 +17,8 @@ import org.incendo.cloud.setting.ManagerSetting import org.incendo.cloud.suggestion.Suggestion import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.api.database.DatabaseConfig -import org.sayandev.sayanvanish.api.database.databaseConfig +import org.sayandev.sayanvanish.api.storage.StorageConfig +import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler @@ -159,7 +159,7 @@ class SayanVanishCommand : BukkitCommand(settings.vanishCommand.name, *settings. "username", "password", ) - Paste("yaml", databaseConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().whenComplete { databaseKey, databaseError -> + Paste("yaml", storageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().whenComplete { databaseKey, databaseError -> sendPasteError(sender, databaseError) Paste("yaml", SettingsConfig.settingsFile.readLines()).post().whenComplete { settingsKey, settingsError -> @@ -208,7 +208,7 @@ class SayanVanishCommand : BukkitCommand(settings.vanishCommand.name, *settings. Features.userFeatures.clear() RegisteredFeatureHandler.process() settings = SettingsConfig.fromConfig() ?: SettingsConfig.defaultConfig() - databaseConfig = DatabaseConfig.fromConfig() ?: DatabaseConfig.defaultConfig() + storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultConfig() sender.sendComponent(language.general.reloaded) } } @@ -537,7 +537,7 @@ class SayanVanishCommand : BukkitCommand(settings.vanishCommand.name, *settings. private fun generateMainPaste(sender: CommandSender, otherKeys: Map) { Paste("json", listOf(ServerUtils.getServerData( mutableMapOf( - "database-type" to databaseConfig.method.toString(), + "database-type" to storageConfig.method.toString(), ).apply { this.putAll(otherKeys) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt index 91823dc3..ec340434 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt @@ -2,8 +2,8 @@ package org.sayandev.sayanvanish.bukkit.health import org.bukkit.command.CommandSender import org.bukkit.entity.Player -import org.sayandev.sayanvanish.api.database.DatabaseType -import org.sayandev.sayanvanish.api.database.sql.SQLConfig +import org.sayandev.sayanvanish.api.storage.DatabaseType +import org.sayandev.sayanvanish.api.storage.sql.SQLConfig import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.health.HealthCheckData import org.sayandev.sayanvanish.bukkit.config.settings diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/ServerInfoPublisher.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/ServerInfoPublisher.kt index 106fb756..5a4668c7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/ServerInfoPublisher.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/ServerInfoPublisher.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.health -import org.sayandev.sayanvanish.api.database.databaseConfig +import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.api.health.HealthCheckData import org.sayandev.sayanvanish.bukkit.config.settings import org.sayandev.stickynote.bukkit.messaging.publisher.PluginMessagePublisher @@ -18,8 +18,8 @@ object ServerInfoPublisher : PluginMessagePublisher( override suspend fun onSubscribe(payload: Unit): CompletableDeferred { val proxyInfo = HealthCheckData.ProxyInfo( - databaseConfig.method, - databaseConfig.sql.method + storageConfig.method, + storageConfig.sql.method ) val servers = HealthCheckData.Servers(mutableListOf()) diff --git a/settings.gradle.kts b/settings.gradle.kts index b097f46f..42be3765 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,7 +9,7 @@ pluginManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" - id("org.sayandev.stickynote.settings") version "1.10.0" + id("org.sayandev.stickynote.settings") version "1.10.5.pubsub1" } rootProject.name = "SayanVanish" From a524d0b9ef9a67baef31b5e62f3c4d7f072ffb06 Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 15:19:40 +0330 Subject: [PATCH 11/67] chore: remove TODO.md --- TODO.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 TODO.md diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 1b2714d5..00000000 --- a/TODO.md +++ /dev/null @@ -1,5 +0,0 @@ -v2 TODO List: -- [ ] Implement new database using exposed -- [ ] Implement new user api -- [ ] Implement a complete caching api -- [ ] Implement a complete messaging api (requires new messaging api in stickynote) \ No newline at end of file From 454c9be4c9f8e91e0cea44297b477d4b19b2f17a Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 15:23:54 +0330 Subject: [PATCH 12/67] chore: remove healthcheck feature for now to implement a new one later --- .../bukkit/command/SayanVanishCommand.kt | 13 -- .../sayanvanish/bukkit/health/HealthCache.kt | 140 ------------------ .../health/HealthCheckRequestPublisher.kt | 12 -- .../bukkit/health/ServerInfoPublisher.kt | 26 ---- .../health/HealthCheckMessageSubscriber.kt | 42 ------ .../velocity/health/ServerInfoPublisher.kt | 19 --- 6 files changed, 252 deletions(-) delete mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt delete mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCheckRequestPublisher.kt delete mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/ServerInfoPublisher.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/HealthCheckMessageSubscriber.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/ServerInfoPublisher.kt diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index ea64d844..a7d0ddb5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -432,19 +432,6 @@ class SayanVanishCommand : BukkitCommand(settings.vanishCommand.name, *settings. literalWithPermission("test") } - testLiteral.registerCopy { - literalWithPermission("health") - handler { context -> - val sender = context.sender().platformSender() - launch { - if (!ServerVersion.supports(9)) { - sender.sendComponent("This feature might not work as expected in your server version!") - } - HealthCache.sendHealthReport(sender) - } - } - } - testLiteral.registerCopy { literalWithPermission("users") handler { context -> diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt deleted file mode 100644 index ec340434..00000000 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCache.kt +++ /dev/null @@ -1,140 +0,0 @@ -package org.sayandev.sayanvanish.bukkit.health - -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player -import org.sayandev.sayanvanish.api.storage.DatabaseType -import org.sayandev.sayanvanish.api.storage.sql.SQLConfig -import org.sayandev.sayanvanish.api.feature.Features -import org.sayandev.sayanvanish.api.health.HealthCheckData -import org.sayandev.sayanvanish.bukkit.config.settings -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent -import org.sayandev.stickynote.bukkit.log -import org.sayandev.stickynote.bukkit.onlinePlayers -import org.sayandev.stickynote.bukkit.warn -import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper -import org.sayandev.stickynote.core.utils.CoroutineUtils.awaitWithTimeout - -object HealthCache { - var cache: HealthCheckData? = null - - suspend fun updateCache(player: Player?): HealthCheckData? { - val player = player ?: onlinePlayers.firstOrNull() - if (player == null) { - if (cache != null) { - log("Couldn't find any online player to update the cache. Using the previous cache.") - return cache - } else { - warn("Couldn't find any online player to update the cache.") - return null - } - } - val healthData = HealthCheckRequestPublisher.publish(player, PayloadWrapper(Unit, PayloadWrapper.State.PROXY)).awaitWithTimeout(5000) ?: let { - return null - } - cache?.let { validCache -> - for (server in healthData.servers.servers.toList()) { - if (server.id == null) { - val cacheServer = validCache.servers.servers.find { it.name == server.name } ?: continue - healthData.servers.servers.remove(server) - healthData.servers.servers.add(cacheServer) - } - } - } - cache = healthData - return healthData - } - - suspend fun sendHealthReport(sender: CommandSender) { - val disabledCriticalFeatures = Features.features().filter { it.critical && !it.enabled } - if (disabledCriticalFeatures.isNotEmpty()) { - sender.sendComponent("Found disabled critical features.") - for (feature in disabledCriticalFeatures) { - sender.sendComponent(" - ${feature.id}") - } - sender.sendComponent("Make sure to enable these features. otherwise plugin may not work properly.") - } - - if (!settings.general.proxyMode) { - sender.sendComponent("You need to enable `proxy-mode` to get full health check. Make sure you've checked the installation guide at SayanVanish docs") - return - } - - val healthData = updateCache(sender as? Player) - if (healthData == null) { - sender.sendComponent("Couldn't get any response from your proxy. This feature only works with Velocity proxies. If you're using Velocity as your proxy please report this issue on SayanVanish github page.") - return - } - - val proxy = healthData.proxy - sender.sendComponent("Proxy:") - sender.sendComponent(" - Database Method: ${proxy.databaseType}") - if (proxy.databaseType == DatabaseType.SQL) { - sender.sendComponent(" - SQL Method: ${proxy.sqlMethod}") - } - - val servers = healthData.servers.servers - if (servers.isNotEmpty()) { - sender.sendComponent("Servers:") - for (server in servers) { - if (server.id == null) { - sender.sendComponent(" - ${server.name} (UNRECHABLE)") - continue - } - sender.sendComponent(" - ${server.name} (${timeAgo(server.timestamp)} since last update)") - sender.sendComponent(" - Proxy Mode: ${server.enabledProxyMode}") - sender.sendComponent(" - Database Method: ${server.databaseType}") - if (server.databaseType == DatabaseType.SQL) { - sender.sendComponent(" - SQL Method: ${server.sqlMethod}") - } - } - - val unreachableServers = servers.filter { it.id == null } - if (unreachableServers.isNotEmpty()) { - sender.sendComponent("Found servers that are unreachable.") - for (server in unreachableServers) { - sender.sendComponent(" - ${server.name}") - } - sender.sendComponent("These server either don't have SayanVanish installed or is offline or there's no player on this servers. SayanVanish can only check servers which have player on them") - } - - val reachableServers = servers.filter { it.id != null } - val duplicateServers = reachableServers.groupBy { it.id }.filter { it.value.size > 1 } - for (duplicateServer in duplicateServers) { - sender.sendComponent("Found duplicate servers with id ${duplicateServer.key}") - for (server in duplicateServer.value) { - sender.sendComponent(" - ${server.name}") - } - sender.sendComponent("Make sure to change the server id in your `settings.yml` file.") - } - - val sqliteServers = reachableServers.filter { it.databaseType == DatabaseType.SQL && it.sqlMethod == SQLConfig.SQLMethod.SQLITE } - if (sqliteServers.isNotEmpty()) { - sender.sendComponent("Found servers using SQLite as their database method.") - for (server in sqliteServers) { - sender.sendComponent(" - ${server.name}") - } - sender.sendComponent("SQLite will not sync data between servers. Make sure to change the database method to MySQL or Redis.") - } - } else { - sender.sendComponent("No servers found.") - } - } - - private fun timeAgo(time: Long): String { - val diff = System.currentTimeMillis() - time - val hours = diff / 3600000 - val minutes = (diff % 3600000) / 60000 - val seconds = (diff % 60000) / 1000 - val builder = StringBuilder() - if (hours > 0) { - builder.append("${hours}h ") - } - if (minutes > 0) { - builder.append("${minutes}m ") - } - if (seconds > 0) { - builder.append("${seconds}s") - } - return builder.toString() - } -} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCheckRequestPublisher.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCheckRequestPublisher.kt deleted file mode 100644 index 2a0137cd..00000000 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/HealthCheckRequestPublisher.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.sayandev.sayanvanish.bukkit.health - -import org.sayandev.sayanvanish.api.health.HealthCheckData -import org.sayandev.stickynote.bukkit.messaging.publisher.ProxyPluginMessagePublisher -import org.sayandev.stickynote.bukkit.plugin - -object HealthCheckRequestPublisher : ProxyPluginMessagePublisher( - plugin.name.lowercase(), - "hc", - Unit::class.java, - HealthCheckData::class.java -) \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/ServerInfoPublisher.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/ServerInfoPublisher.kt deleted file mode 100644 index 5a4668c7..00000000 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/health/ServerInfoPublisher.kt +++ /dev/null @@ -1,26 +0,0 @@ -package org.sayandev.sayanvanish.bukkit.health - -import org.sayandev.sayanvanish.api.storage.storageConfig -import org.sayandev.sayanvanish.api.health.HealthCheckData -import org.sayandev.sayanvanish.bukkit.config.settings -import org.sayandev.stickynote.bukkit.messaging.publisher.PluginMessagePublisher -import org.sayandev.stickynote.bukkit.plugin - -object ServerInfoPublisher : PluginMessagePublisher( - plugin.name.lowercase(), - "info", - Unit::class.java, - HealthCheckData.ServerInfo::class.java, - true -) { - override fun handle(payload: Unit): HealthCheckData.ServerInfo { - return HealthCheckData.ServerInfo( - settings.general.serverId, - null, - settings.general.proxyMode, - storageConfig.method, - storageConfig.sql.method, - System.currentTimeMillis() - ) - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/HealthCheckMessageSubscriber.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/HealthCheckMessageSubscriber.kt deleted file mode 100644 index 7af098c9..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/HealthCheckMessageSubscriber.kt +++ /dev/null @@ -1,42 +0,0 @@ -package org.sayandev.sayanvanish.velocity.health - -import kotlinx.coroutines.CompletableDeferred -import org.sayandev.sayanvanish.api.storage.DatabaseType -import org.sayandev.sayanvanish.api.storage.storageConfig -import org.sayandev.sayanvanish.api.storage.sql.SQLConfig -import org.sayandev.sayanvanish.api.health.HealthCheckData -import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper -import org.sayandev.stickynote.core.utils.CoroutineUtils.awaitWithTimeout -import org.sayandev.stickynote.velocity.messaging.ProxySubscriber -import org.sayandev.stickynote.velocity.plugin - -class HealthCheckMessageSubscriber: ProxySubscriber( - plugin.container.description.name.get().lowercase(), - "hc", - Unit::class.java -) { - - override suspend fun onSubscribe(payload: Unit): CompletableDeferred { - val proxyInfo = HealthCheckData.ProxyInfo( - storageConfig.method, - storageConfig.sql.method - ) - - val servers = HealthCheckData.Servers(mutableListOf()) - - for (server in plugin.server.allServers) { - servers.servers.add((ServerInfoPublisher.publish(server, PayloadWrapper(Unit, PayloadWrapper.State.FORWARD)).awaitWithTimeout(1000) ?: let { - HealthCheckData.ServerInfo( - null, - server.serverInfo.name, - false, - DatabaseType.SQL, - SQLConfig.SQLMethod.SQLITE, - System.currentTimeMillis() - ) - }).apply { this.name = server.serverInfo.name }) - } - - return CompletableDeferred(HealthCheckData(proxyInfo, servers)) - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/ServerInfoPublisher.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/ServerInfoPublisher.kt deleted file mode 100644 index 42a1650a..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/health/ServerInfoPublisher.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.sayandev.sayanvanish.velocity.health - -import org.sayandev.sayanvanish.api.health.HealthCheckData -import org.sayandev.stickynote.velocity.messaging.PluginMessagePublisher -import org.sayandev.stickynote.velocity.plugin - -object ServerInfoPublisher: PluginMessagePublisher( - plugin.container.description.name.get().lowercase(), - "info", - HealthCheckData.ServerInfo::class.java -) { - init { - register(this) - } - - override fun handle(payload: Unit): HealthCheckData.ServerInfo? { - return null - } -} \ No newline at end of file From fd91d54b210feaef929f977bebcfee3c4c100b7a Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 15:24:36 +0330 Subject: [PATCH 13/67] chore: change default messaging type to websocket --- .../sayanvanish/api/message/MessagingCategoryTypes.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt index a04f2923..ba014cf9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt @@ -4,7 +4,6 @@ enum class MessagingCategoryTypes( override val id: String, override val type: MessagingTypes, ) : MessagingCategoryType { - // TODO: Change default to plugin message or implement WebSocket - SYNC_USER("sync_user", MessagingTypes.REDIS), - SYNC_VANISH_USER("sync_vanish_user", MessagingTypes.REDIS), + SYNC_USER("sync_user", MessagingTypes.WEBSOCKET), + SYNC_VANISH_USER("sync_vanish_user", MessagingTypes.WEBSOCKET), } \ No newline at end of file From 492631f2cffd4e0a70887966739756c3ee8d414f Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 15:26:25 +0330 Subject: [PATCH 14/67] chore: remove HealthCheckData.kt --- .../sayanvanish/api/feature/Feature.kt | 2 +- .../sayanvanish/api/health/HealthCheckData.kt | 29 ------------------- 2 files changed, 1 insertion(+), 30 deletions(-) delete mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt index d86b5d3a..b18d6bd5 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.api.feature -import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.core.configuration.Config import org.spongepowered.configurate.objectmapping.ConfigSerializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt deleted file mode 100644 index 8d185c3a..00000000 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/health/HealthCheckData.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.sayandev.sayanvanish.api.health - -import org.sayandev.sayanvanish.api.storage.DatabaseType -import org.sayandev.sayanvanish.api.storage.sql.SQLConfig - -data class HealthCheckData( - val proxy: ProxyInfo, - val servers: Servers, -) { - - data class ProxyInfo( - val databaseType: DatabaseType, - val sqlMethod: SQLConfig.SQLMethod, - ) - - data class ServerInfo( - val id: String?, - var name: String?, - val enabledProxyMode: Boolean, - val databaseType: DatabaseType, - val sqlMethod: SQLConfig.SQLMethod, - val timestamp: Long - ) - - data class Servers( - val servers: MutableList - ) - -} \ No newline at end of file From 165d35016bab1ef025d02ade47234ebbcdb63fdb Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 15:33:53 +0330 Subject: [PATCH 15/67] chore: remove queue implementation as it's not a good way of handling it --- .../org/sayandev/sayanvanish/api/Queue.kt | 16 ----- .../org/sayandev/sayanvanish/api/User.kt | 2 +- .../sayanvanish/api/message/MessageConfig.kt | 1 + .../sayanvanish/api/storage/Database.kt | 72 ------------------- .../sayanvanish/api/storage/StorageConfig.kt | 1 + .../api/storage/TransactionDatabase.kt | 26 +------ .../api/storage/TransactionTypes.kt | 2 - .../api/storage/redis/RedisDatabase.kt | 41 ++--------- .../api/storage/sql/SQLDatabase.kt | 48 ------------- .../sayandev/sayanvanish/api/utils/Gson.kt | 11 +++ 10 files changed, 20 insertions(+), 200 deletions(-) delete mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt deleted file mode 100644 index bbac694d..00000000 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Queue.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.sayandev.sayanvanish.api - -import org.sayandev.sayanvanish.api.storage.PlatformTable -import java.util.* - -class Queue( - val uniqueId: UUID, - val vanished: Boolean, -) { - object Schema : PlatformTable("queue") { - val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() - val vanished = bool("vanished").default(false) - - override val primaryKey = PrimaryKey(uniqueId) - } -} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 0e54072e..b0b70d06 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -290,7 +290,7 @@ interface User { */ @JvmStatic fun UUID.userFromCache(): User? { - TODO("Cache is not implemented yet") + return SayanVanishAPI.get().getCacheService().getUsers()[this] } /** diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt index 31f6016b..69b3e9d3 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt @@ -9,6 +9,7 @@ import org.spongepowered.configurate.objectmapping.meta.Comment import org.spongepowered.configurate.serialize.TypeSerializerCollection import java.io.File +// TODO: use a singleton or something, i don't want global scope variables like this anymore public var messageConfig = MessageConfig.fromConfig() ?: MessageConfig.defaultConfig() @ConfigSerializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt index 28a606e1..9b9f969b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt @@ -138,46 +138,6 @@ interface Database { return runBlocking { removeUser(uniqueId).await() } } - suspend fun isInQueue(uniqueId: UUID): Deferred - - fun isInQueueFuture(uniqueId: UUID): CompletableFuture { - return async(dispatcher) { isInQueue(uniqueId).await() }.asCompletableFuture() - } - - fun isInQueueBlocking(uniqueId: UUID): Boolean { - return runBlocking { isInQueue(uniqueId).await() } - } - - suspend fun saveToQueue(uniqueId: UUID, vanished: Boolean): Deferred - - fun saveToQueueFuture(uniqueId: UUID, vanished: Boolean): CompletableFuture { - return async(dispatcher) { saveToQueue(uniqueId, vanished).await() }.asCompletableFuture() - } - - fun saveToQueueBlocking(uniqueId: UUID, vanished: Boolean): Boolean { - return runBlocking { saveToQueue(uniqueId, vanished).await() } - } - - suspend fun getFromQueue(uniqueId: UUID): Deferred - - fun getFromQueueFuture(uniqueId: UUID): CompletableFuture { - return async(dispatcher) { getFromQueue(uniqueId).await() }.asCompletableFuture() - } - - fun getFromQueueBlocking(uniqueId: UUID): Boolean { - return runBlocking { getFromQueue(uniqueId).await() } - } - - suspend fun removeFromQueue(uniqueId: UUID): Deferred - - fun removeFromQueueFuture(uniqueId: UUID): CompletableFuture { - return async(dispatcher) { removeFromQueue(uniqueId).await() }.asCompletableFuture() - } - - fun removeFromQueueBlocking(uniqueId: UUID): Boolean { - return runBlocking { removeFromQueue(uniqueId).await() } - } - suspend fun purgeAllTables(): Deferred fun purgeAllTablesFuture(): CompletableFuture { @@ -195,36 +155,4 @@ interface Database { fun purgeUsersFuture(serverId: String): CompletableFuture { return async(dispatcher) { purgeUsers(serverId).await() }.asCompletableFuture() } - - fun getCachedVanishUsers(): VanishUserCache { - return vanishUserCache - } - - fun getCachedVanishUser(uniqueId: UUID): VanishUser? { - return vanishUserCache[uniqueId] - } - - fun getVanishUserCache(uniqueId: UUID): VanishUser? { - return vanishUserCache[uniqueId] - } - - fun getCachedUserCount(): UserCountCache { - return userCountCache - } - - fun getServerUserCountCache(serverId: String): Int { - return userCountCache[serverId] ?: 0 - } - - companion object { - @JvmStatic - val vanishUserCache: VanishUserCache by lazy { - VanishUserCache() - } - - @JvmStatic - val userCountCache: UserCountCache by lazy { - UserCountCache() - } - } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt index 7ffff1af..5c3fa31a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt @@ -14,6 +14,7 @@ public var storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultCo @ConfigSerializable class StorageConfig( + val transactionThreadCount: Int = 5, @Comment("Configuration for the database, including method, SQL, Redis, and caching options.") val method: DatabaseType = DatabaseType.SQL, @Comment("Configuration for SQL database") diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt index 4b83133f..3d9e9685 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt @@ -22,8 +22,7 @@ class TransactionDatabase: Database { override val dispatcher = AsyncDispatcher( "${Platform.get().pluginName.lowercase()}-transaction-thread", - // TODO: get thread count from config - 5, + storageConfig.transactionThreadCount, ) val databaseTypes = mutableMapOf() @@ -140,29 +139,6 @@ class TransactionDatabase: Database { return database.removeUser(uniqueId) } - override suspend fun isInQueue(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.QUEUE) - return database.isInQueue(uniqueId) - } - - override suspend fun saveToQueue( - uniqueId: UUID, - vanished: Boolean - ): Deferred { - val database = database(TransactionTypes.QUEUE) - return database.saveToQueue(uniqueId, vanished) - } - - override suspend fun getFromQueue(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.QUEUE) - return database.getFromQueue(uniqueId) - } - - override suspend fun removeFromQueue(uniqueId: UUID): Deferred { - val database = database(TransactionTypes.QUEUE) - return database.removeFromQueue(uniqueId) - } - override suspend fun purgeAllTables(): Deferred { return CompletableDeferred().apply { databaseTypes.values.map { database -> diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt index d7993ed2..f9c5b672 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt @@ -6,6 +6,4 @@ enum class TransactionTypes( ) : TransactionType { USER("user", DatabaseType.SQL), VANISH_USER("vanish_user", DatabaseType.SQL), - // TODO: Change default to plugin message or implement WebSocket - QUEUE("queue", DatabaseType.REDIS), } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt index 3cd74572..5a1e04a8 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt @@ -1,11 +1,13 @@ package org.sayandev.sayanvanish.api.storage.redis +import com.google.gson.JsonParser import kotlinx.coroutines.* import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.storage.Database import org.sayandev.sayanvanish.api.storage.StorageConfig +import org.sayandev.sayanvanish.api.utils.Gson import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import redis.clients.jedis.JedisPool import java.util.* @@ -70,7 +72,7 @@ class RedisDatabase( it .hget("users", uniqueId.toString()) ?.let { - User.fromJson(it) + Gson.get().fromJson(JsonParser.parseString(it), User::class.java) } } } @@ -81,7 +83,7 @@ class RedisDatabase( redis.resource.use { it .hgetAll("users") - .map { User.fromJson(it.value) } + .map { Gson.get().fromJson(JsonParser.parseString(it.value), User::class.java) } } } } @@ -105,7 +107,7 @@ class RedisDatabase( override suspend fun saveUser(user: User): Deferred { return async { redis.resource.use { - it.hset("users", user.uniqueId.toString(), user.toJson()) != 0L + it.hset("users", user.uniqueId.toString(), Gson.get().toJson(user)) != 0L } } } @@ -142,43 +144,10 @@ class RedisDatabase( return saveUser(user) } - override suspend fun isInQueue(uniqueId: UUID): Deferred { - return async { - redis.resource.use { - it.get("queue:$uniqueId")?.toBoolean() ?: false - } - } - } - - override suspend fun saveToQueue(uniqueId: UUID, vanished: Boolean): Deferred { - return async { - redis.resource.use { - it.set("queue:$uniqueId", vanished.toString()) != null - } - } - } - - override suspend fun removeFromQueue(uniqueId: UUID): Deferred { - return async { - redis.resource.use { - it.del("queue:$uniqueId") != 0L - } - } - } - - override suspend fun getFromQueue(uniqueId: UUID): Deferred { - return async { - redis.resource.use { - it.get("queue:$uniqueId")?.toBoolean() ?: false - } - } - } - override suspend fun purgeAllTables(): Deferred { return async { redis.resource.use { it.del("vanish_users") } redis.resource.use { it.del("users") } - redis.resource.use { it.del("queue") } true } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index 0bede9e2..c92260b6 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -11,7 +11,6 @@ import org.jetbrains.exposed.v1.jdbc.* import org.jetbrains.exposed.v1.jdbc.transactions.TransactionManager import org.jetbrains.exposed.v1.jdbc.transactions.experimental.suspendedTransactionAsync import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.Queue import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.storage.Database @@ -33,9 +32,6 @@ class SQLDatabase( config.sql.threadCount, ) - // TODO: implement new caching api - var users = mutableMapOf() - val tables = listOf( User.Schema, VanishUser.Schema, @@ -72,15 +68,6 @@ class SQLDatabase( ) TransactionManager.defaultDatabase = database - // TODO: Implement a proper cache system - // TODO: probably update the cache on every update using messaging api - launch(dispatcher) { - while (isActive) { - users = getVanishUsers().await().associateBy { it.uniqueId }.toMutableMap() - delay(1000) - } - } - return CompletableDeferred(true) } @@ -230,41 +217,6 @@ class SQLDatabase( } } - override suspend fun isInQueue(uniqueId: UUID): Deferred { - return async { - Queue.Schema - .selectAll() - .any { it[Queue.Schema.uniqueId] == uniqueId } - } - } - - override suspend fun saveToQueue(uniqueId: UUID, vanished: Boolean): Deferred { - return async { - Queue.Schema.upsert { row -> - row[Queue.Schema.uniqueId] = uniqueId - row[Queue.Schema.vanished] = vanished - }.isIgnore - } - } - - override suspend fun getFromQueue(uniqueId: UUID): Deferred { - return async { - Queue.Schema - .selectAll() - .where { Queue.Schema.uniqueId eq uniqueId } - .firstOrNull() - ?.getOrNull(Queue.Schema.vanished) ?: false - } - } - - override suspend fun removeFromQueue(uniqueId: UUID): Deferred { - return async { - Queue.Schema - .deleteWhere { Queue.Schema.uniqueId eq uniqueId } - true - } - } - override suspend fun purgeAllTables(): Deferred { tables.map { table -> async { table.deleteAll() } }.awaitAll() return CompletableDeferred(true) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt index d7a03a01..b9a957b0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt @@ -1,9 +1,20 @@ package org.sayandev.sayanvanish.api.utils +import com.google.gson.Gson +import com.google.gson.GsonBuilder import com.google.gson.JsonElement import com.google.gson.JsonObject object Gson { + private val gson = GsonBuilder() + .setPrettyPrinting() + .create() + + @JvmStatic + fun get(): Gson { + return gson + } + fun Any.jsonObject(): JsonObject { if (this::class.isData) { return com.google.gson.Gson().toJsonTree(this).asJsonObject From cad2a3975544a449fdab1890a85643bf070e6e0f Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 15:35:18 +0330 Subject: [PATCH 16/67] chore: remove `Any.jsonObject()` and `JsonObject.fromJson()` --- .../api/storage/sql/SQLDatabase.kt | 1 - .../sayandev/sayanvanish/api/utils/Gson.kt | 44 ------------------- 2 files changed, 45 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index c92260b6..b8c411d6 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -35,7 +35,6 @@ class SQLDatabase( val tables = listOf( User.Schema, VanishUser.Schema, - Queue.Schema, ) lateinit var database: org.jetbrains.exposed.v1.jdbc.Database diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt index b9a957b0..d24e3f50 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt @@ -2,8 +2,6 @@ package org.sayandev.sayanvanish.api.utils import com.google.gson.Gson import com.google.gson.GsonBuilder -import com.google.gson.JsonElement -import com.google.gson.JsonObject object Gson { private val gson = GsonBuilder() @@ -14,46 +12,4 @@ object Gson { fun get(): Gson { return gson } - - fun Any.jsonObject(): JsonObject { - if (this::class.isData) { - return com.google.gson.Gson().toJsonTree(this).asJsonObject - } else { - return JsonObject().apply { - this.javaClass.declaredFields.map { field -> - field.isAccessible = true - val name = field.name.replaceFirstChar { char -> char.lowercase() } - when (field.type) { - String::class.java -> addProperty(name, field.get(this) as String) - Number::class.java -> addProperty(name, field.get(this) as Number) - Boolean::class.java -> addProperty(name, field.get(this) as Boolean) - Char::class.java -> addProperty(name, field.get(this) as Char) - else -> addProperty(name, field.get(this).toString()) - } - } - } - } - } - - inline fun JsonObject.fromJson(): T { - if (T::class.isData) { - return com.google.gson.Gson().fromJson(this, T::class.java) - } else if (!T::class.java.isInterface) { - val clazz = T::class.java - val constructor = clazz.constructors.firstOrNull { constructor -> - constructor.parameters.all { parameter -> this.get(parameter.name) != null } - } ?: throw IllegalArgumentException("Tried to generate instance of type ${T::class.java.simpleName} but no suitable constructor was found for provided JsonObject.") - val args = constructor.parameters.map { parameter -> - val jsonElement: JsonElement? = this.get(parameter.name) - when (parameter.type) { - String::class.java -> jsonElement?.asString ?: "" - Number::class.java -> jsonElement?.asNumber ?: 0 - Boolean::class.java -> jsonElement?.asBoolean ?: false - Char::class.java -> jsonElement?.asString?.firstOrNull() ?: ' ' - else -> throw IllegalArgumentException("Unsupported type ${parameter.type} for parameter ${parameter.name}") - } - }.toTypedArray() - return constructor.newInstance(*args) as T - } - } } \ No newline at end of file From 3c4b32c11b539782e75c033da506ee8fc496ec5c Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 15:45:16 +0330 Subject: [PATCH 17/67] chore: change SayanVanishAPI usage to VanishAPI.get() --- .../sayandev/sayanvanish/api/Permission.kt | 2 +- .../org/sayandev/sayanvanish/api/Platform.kt | 2 +- .../sayanvanish/api/SayanVanishAPI.kt | 6 ++- .../org/sayandev/sayanvanish/api/User.kt | 20 ++++----- .../org/sayandev/sayanvanish/api/VanishAPI.kt | 17 +++++++- .../sayandev/sayanvanish/api/VanishUser.kt | 43 +++---------------- .../message/types/RedisMessagingService.kt | 5 ++- .../types/WebSocketMessagingService.kt | 5 ++- 8 files changed, 44 insertions(+), 56 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt index 7a471259..d598583c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt @@ -10,6 +10,6 @@ enum class Permission(val value: String) { FLY("action.vanish.fly"); fun permission(): String { - return "sayanvanish.${value}" + return "${Platform.get().id.lowercase()}.${value}" } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index 261f8aa2..eea8d978 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -36,7 +36,7 @@ data class Platform( fun setAndRegister(platform: Platform): Boolean { setPlatform(platform) - (SayanVanishAPI.getDatabase() as? TransactionDatabase)?.let { + (VanishAPI.get().getDatabase() as? TransactionDatabase)?.let { if (!it.databaseConnected) { return false } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index 0d615d0b..d836924e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -90,7 +90,11 @@ object SayanVanishAPI : VanishAPI { } /** - * Only for java usage + * Don't use this method directly, use [VanishAPI.get] instead. + * + * This method is only meant to be used by the API itself as a fallback api. + * + * @see VanishAPI.get */ @JvmStatic fun get(): SayanVanishAPI { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index b0b70d06..c1b22a11 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -80,7 +80,7 @@ interface User { */ @JvmSynthetic suspend fun save(): Deferred { - return SayanVanishAPI.getDatabase().saveUser(this) + return VanishAPI.get().getDatabase().saveUser(this) } /** @@ -100,7 +100,7 @@ interface User { * @since 2.0.0 */ fun saveFuture(): CompletableFuture { - return async(SayanVanishAPI.get().getDatabase().dispatcher) { + return async(VanishAPI.get().getDatabase().dispatcher) { save().await() }.asCompletableFuture() } @@ -113,7 +113,7 @@ interface User { */ @JvmSynthetic suspend fun sync(): Deferred { - return SayanVanishAPI.getMessagingService().syncUser(this) + return VanishAPI.get().getMessagingService().syncUser(this) } /** @@ -133,7 +133,7 @@ interface User { * @since 2.0.0 */ fun syncFuture(): CompletableFuture { - return async(SayanVanishAPI.get().getMessagingService().dispatcher) { + return async(VanishAPI.get().getMessagingService().dispatcher) { sync().await() }.asCompletableFuture() } @@ -171,8 +171,8 @@ interface User { @JvmSynthetic suspend fun asVanishUser(): Deferred { return CompletableDeferred().apply { - async(SayanVanishAPI.get().getDatabase().dispatcher) { - SayanVanishAPI.getDatabase().getVanishUser(uniqueId).await() ?: VanishUser.of(uniqueId, username, serverId) + async(VanishAPI.get().getDatabase().dispatcher) { + VanishAPI.get().getDatabase().getVanishUser(uniqueId).await() ?: VanishUser.of(uniqueId, username, serverId) }.let { complete(it.await()) } } } @@ -194,7 +194,7 @@ interface User { * @since 2.0.0 */ fun asVanishUserFuture(): CompletableFuture { - return async(SayanVanishAPI.get().getDatabase().dispatcher) { + return async(VanishAPI.get().getDatabase().dispatcher) { asVanishUser().await() }.asCompletableFuture() } @@ -290,7 +290,7 @@ interface User { */ @JvmStatic fun UUID.userFromCache(): User? { - return SayanVanishAPI.get().getCacheService().getUsers()[this] + return VanishAPI.get().getCacheService().getUsers()[this] } /** @@ -302,7 +302,7 @@ interface User { */ @JvmSynthetic suspend fun UUID.user(): Deferred { - return SayanVanishAPI.getDatabase().getUser(this) + return VanishAPI.get().getDatabase().getUser(this) } /** @@ -338,7 +338,7 @@ interface User { */ @JvmSynthetic fun UUID.userFuture(): CompletableFuture { - return async(SayanVanishAPI.get().getDatabase().dispatcher) { + return async(VanishAPI.get().getDatabase().dispatcher) { user().await() }.asCompletableFuture() } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt index 6b06fb1e..d36db21d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt @@ -45,13 +45,26 @@ interface VanishAPI { fun getVanishedUsers(): Deferred> companion object { - private val defaultInstance = SayanVanishAPI + private var defaultInstance: VanishAPI = SayanVanishAPI @JvmStatic - fun get(): SayanVanishAPI { + fun getDefault(): SayanVanishAPI { + return SayanVanishAPI + } + + @JvmStatic + fun get(): VanishAPI { return defaultInstance } + @JvmStatic + fun set(instance: VanishAPI, platform: Platform) { + Platform.get().logger.info("New API instance has been initialized from ${platform.id}") + Platform.setAndRegister(platform) + defaultInstance = instance + Platform.get().logger.info("Platform has been set to ${platform.id} with plugin name ${platform.pluginName}") + } + @JvmStatic suspend fun UUID.vanishUser(): VanishUser? { return get().getDatabase().getVanishUser(this).await() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 8bfe7475..454f46e2 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -3,6 +3,7 @@ package org.sayandev.sayanvanish.api import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParser +import kotlinx.coroutines.Deferred import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException @@ -57,26 +58,16 @@ interface VanishUser : User { return canSee } - override suspend fun save() { + override suspend fun save(): Deferred { serverId = Platform.get().serverId - SayanVanishAPI.getDatabase().addVanishUser(this) + return VanishAPI.get().getDatabase().addVanishUser(this) } suspend fun delete() { - SayanVanishAPI.getDatabase().removeVanishUser(uniqueId) + VanishAPI.get().getDatabase().removeVanishUser(uniqueId) } - override fun toJson(): String { - val json = JsonObject() - json.addProperty("unique-id", uniqueId.toString()) - json.addProperty("username", username) - json.addProperty("is-online", isOnline) - json.addProperty("server-id", serverId) - json.addProperty("is-vanished", isVanished) - json.addProperty("vanish-level", vanishLevel) - json.addProperty("current-options", currentOptions.toJson()) - return Gson().toJson(json) - } + // TODO: implement a json type adapter for this class object Schema : PlatformTable("vanish_users") { val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() @@ -88,29 +79,7 @@ interface VanishUser : User { } companion object { - @JvmStatic - fun fromJson(serialized: String): VanishUser { - val json = JsonParser.parseString(serialized).asJsonObject - - val uniqueId = json.get("unique-id").asString - val username = json.get("username").asString - val isOnline = json.get("is-online").asBoolean - val serverId = json.get("server-id").asString - val isVanished = json.get("is-vanished").asBoolean - val vanishLevel = json.get("vanish-level").asInt - val currentOptions = json.get("current-options").asString - - return of( - UUID.fromString(uniqueId), - username, - serverId, - isVanished, - isOnline, - vanishLevel, - VanishOptions.fromJson(currentOptions) - ) - } - + // TODO: implement a generic type like User.Generic() to replace VanishUser.of() and use it for json type adapter fun of( uniqueId: UUID, username: String, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index bdbb13c9..8d770475 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.Deferred import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.storage.redis.RedisConfig import org.sayandev.sayanvanish.api.storage.redis.RedisConnection @@ -40,7 +41,7 @@ class RedisMessagingService( Platform.get().logger ) { override fun handle(payload: User): Boolean? { - SayanVanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) + VanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) return true } @@ -60,7 +61,7 @@ class RedisMessagingService( Platform.get().logger ) { override fun handle(payload: VanishUser): Boolean? { - SayanVanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) + VanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) return true } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt index d1d188cc..a4bbfc72 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.Deferred import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.message.MessagingCategoryTypes import org.sayandev.sayanvanish.api.message.MessagingService @@ -38,7 +39,7 @@ class WebSocketMessagingService( Platform.get().logger ) { override fun handle(payload: User): Boolean? { - SayanVanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) + VanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) return true } @@ -58,7 +59,7 @@ class WebSocketMessagingService( Platform.get().logger ) { override fun handle(payload: VanishUser): Boolean? { - SayanVanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) + VanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) return true } From 96cfb6ac58fb75385d313c12dabe5fd6367aef21 Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 16:05:28 +0330 Subject: [PATCH 18/67] chore: add sendMessage capability to User --- .../org/sayandev/sayanvanish/api/Platform.kt | 9 +++++-- .../sayanvanish/api/PlatformAdapter.kt | 6 ++++- .../org/sayandev/sayanvanish/api/User.kt | 9 +++++++ .../sayandev/sayanvanish/api/VanishUser.kt | 5 +--- .../sayanvanish/bukkit/api/BukkitUser.kt | 4 ++-- .../bukkit/api/BukkitVanishUser.kt | 24 ++++++++++--------- .../api/event/BukkitUserUnVanishEvent.kt | 1 + .../bukkit/config/LanguageConfig.kt | 4 ++-- .../bukkit/config/SettingsConfig.kt | 21 ++++++++++++---- 9 files changed, 56 insertions(+), 27 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index eea8d978..e2a429d1 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -1,6 +1,7 @@ package org.sayandev.sayanvanish.api import com.mysql.cj.jdbc.exceptions.OperationNotSupportedException +import net.kyori.adventure.text.Component import org.sayandev.sayanvanish.api.storage.TransactionDatabase import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import java.io.File @@ -12,14 +13,18 @@ data class Platform( val logger: Logger, var rootDirectory: File, var serverId: String, - val adapter: PlatformAdapter<*>, + val adapter: PlatformAdapter, ) { companion object { - private var currentPlatform = Platform("default", "SayanVanish", Logger.getGlobal(), File("."), "unknown", object : PlatformAdapter { + private var currentPlatform = Platform("default", "SayanVanish", Logger.getGlobal(), File("."), "unknown", object : PlatformAdapter { override fun adapt(user: VanishUser): VanishUser { throw OperationNotSupportedException("Default platform doesn't support vanish user adapt") } + + override fun sendMessage(user: User, message: Component) { + throw OperationNotSupportedException("Default platform doesn't support sending message to user") + } }) @JvmStatic diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt index 3095f1e2..201a77d6 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt @@ -1,5 +1,9 @@ package org.sayandev.sayanvanish.api -interface PlatformAdapter { +import net.kyori.adventure.text.Component + +interface PlatformAdapter { fun adapt(user: VanishUser): V + + fun sendMessage(user: U, message: Component) } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index c1b22a11..a3665718 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking +import net.kyori.adventure.text.Component import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import org.sayandev.stickynote.core.utils.async @@ -71,6 +72,10 @@ interface User { return hasPermission(permission.permission()) } + fun sendMessage(component: Component) { + Platform.get().adapter.sendMessage(this, component) + } + /** * Saves the user asynchronously to the database. * @@ -199,6 +204,10 @@ interface User { }.asCompletableFuture() } + fun asEmptyVanishUser(): VanishUser { + return VanishUser.of(uniqueId, username, serverId) + } + /** * @since 2.0.0 */ diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 454f46e2..81ce73cc 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -1,12 +1,9 @@ package org.sayandev.sayanvanish.api -import com.google.gson.Gson -import com.google.gson.JsonObject -import com.google.gson.JsonParser import kotlinx.coroutines.Deferred import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver -import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException +import org.sayandev.sayanvanish.api.storage.PlatformTable import java.util.* interface VanishUser : User { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index 65d3e363..3c0a1899 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -2,7 +2,7 @@ package org.sayandev.sayanvanish.bukkit.api import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.bukkit.config.settings +import org.sayandev.sayanvanish.bukkit.config.SettingsConfig class BukkitUser { companion object { @@ -11,7 +11,7 @@ class BukkitUser { this.uniqueId, this.name, this.isOnline, - settings.serverId() + SettingsConfig.get().serverId() ) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 352a2f1c..bac29b07 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -8,15 +8,16 @@ import org.bukkit.entity.Player import org.bukkit.metadata.FixedMetadataValue import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent +import org.sayandev.sayanvanish.bukkit.config.SettingsConfig import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.config.settings import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel import org.sayandev.sayanvanish.bukkit.feature.features.hook.FeatureLuckPermsHook import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent @@ -25,6 +26,7 @@ import org.sayandev.stickynote.bukkit.hasPlugin import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.server +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.sayandev.stickynote.bukkit.utils.ServerVersion import java.util.* @@ -33,13 +35,13 @@ open class BukkitVanishUser( override var username: String ) : VanishUser { - override var serverId = settings.general.serverId + override var serverId = SettingsConfig.get().general.serverId override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false - override var isOnline: Boolean = if (!settings.general.proxyMode) { + override var isOnline: Boolean = if (!SettingsConfig.get().general.proxyMode) { Bukkit.getPlayer(uniqueId) != null } else { - SayanVanishAPI.getDatabase().hasUser(uniqueId, true) + VanishAPI.get().getCacheService().getUsers()[uniqueId]?.isOnline ?: false } override var vanishLevel: Int = 0 get() = if (Features.getFeature().levelMethod == FeatureLevel.LevelMethod.PERMISSION) { @@ -61,7 +63,7 @@ open class BukkitVanishUser( fun player(): Player? = Bukkit.getPlayer(uniqueId) fun offlinePlayer(): OfflinePlayer = Bukkit.getOfflinePlayer(uniqueId) - override fun vanish(options: VanishOptions) { + override suspend fun disappear(options: VanishOptions) { val vanishEvent = BukkitUserVanishEvent(this, options) server.pluginManager.callEvent(vanishEvent) if (vanishEvent.isCancelled) return @@ -83,7 +85,7 @@ open class BukkitVanishUser( sendComponent(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } - override fun unVanish(options: VanishOptions) { + override suspend fun appear(options: VanishOptions) { val unVanishEvent = BukkitUserUnVanishEvent(this, options) server.pluginManager.callEvent(unVanishEvent) if (unVanishEvent.isCancelled) return @@ -144,8 +146,8 @@ open class BukkitVanishUser( hideUser(onlinePlayer) } if (currentOptions.notifyStatusChangeToOthers) { - for (otherUsers in SayanVanishBukkitAPI.getInstance().getOnlineUsers().filter { it.username != username && it.canSee(this) }) { - otherUsers.sendComponent(language.vanish.vanishStateOther, Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(true))) + for (otherUser in VanishAPI.get().getCacheService().getUsers().values.filter { it.isOnline }.filter { it.username != username && it.asEmptyVanishUser().canSee(this) }) { + otherUser.sendMessage(language.vanish.vanishStateOther.component(Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(true)))) } } } @@ -161,8 +163,8 @@ open class BukkitVanishUser( showUser(onlinePlayer) } if (currentOptions.notifyStatusChangeToOthers) { - for (otherUsers in SayanVanishBukkitAPI.getInstance().getOnlineUsers().filter { it.username != this.username && it.canSee(this) }) { - otherUsers.sendComponent(language.vanish.vanishStateOther, Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(false))) + for (otherUser in VanishAPI.get().getCacheService().getUsers().values.filter { it.isOnline }.filter { it.username != this.username && it.asEmptyVanishUser().canSee(this) }) { + otherUser.sendMessage(language.vanish.vanishStateOther.component(Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(false)))) } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt index 24e2a08c..ded94ac2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt @@ -6,6 +6,7 @@ import org.bukkit.event.HandlerList import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser +// TODO: Implement a universal event api class BukkitUserUnVanishEvent( val user: BukkitVanishUser, val options: VanishOptions, diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt index 951015c7..94425ab0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt @@ -13,7 +13,7 @@ class LanguageConfig( val vanish: Vanish = Vanish(), val feature: Feature = Feature(), val paste: Paste = Paste() -) : Config(languageDirectory, "${settings.general.language}.yml") { +) : Config(languageDirectory, "${SettingsConfig.get().general.language}.yml") { @ConfigSerializable data class General( @@ -86,7 +86,7 @@ class LanguageConfig( @JvmStatic fun fromConfig(): LanguageConfig? { - return fromConfig(File(languageDirectory, "${settings.general.language}.yml")) + return fromConfig(File(languageDirectory, "${SettingsConfig.get().general.language}.yml")) } } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt index f5b0950b..95b40910 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt @@ -8,8 +8,6 @@ import org.spongepowered.configurate.objectmapping.meta.Comment import java.io.File import java.util.* -public var settings: SettingsConfig = SettingsConfig.fromConfig() ?: SettingsConfig.defaultConfig() - @ConfigSerializable class SettingsConfig( @Comment(""" @@ -24,7 +22,7 @@ class SettingsConfig( val vanishCommand: Command = Command(), ) : Config( pluginDirectory, - fileName, + FILE_NAME, ) { @ConfigSerializable @@ -46,6 +44,7 @@ class SettingsConfig( You will also need to install the SayanVanish proxy plugin on your proxy server. WARNING: You need to use MySQL or Redis as the database for this feature to work properly. """) + // TODO: add auto detect for proxy mode initial value (do NOT remove the option just set the initial value) val proxyMode: Boolean = false, @Comment("Cache update period in ticks. low values may cause performance issues.") val cacheUpdatePeriodTicks: Long = 20, @@ -71,8 +70,10 @@ class SettingsConfig( } companion object { - private val fileName = "settings.yml" - val settingsFile = File(pluginDirectory, fileName) + private const val FILE_NAME = "settings.yml" + + val settingsFile = File(pluginDirectory, FILE_NAME) + var config = fromConfig() ?: defaultConfig() @JvmStatic fun defaultConfig(): SettingsConfig { @@ -83,5 +84,15 @@ class SettingsConfig( fun fromConfig(): SettingsConfig? { return fromConfig(settingsFile) } + + @JvmStatic + fun reload() { + config = fromConfig() ?: defaultConfig() + } + + @JvmStatic + fun get(): SettingsConfig { + return config + } } } \ No newline at end of file From 40b5c25b7f724350c20fafd30f0dd43f92467911 Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 16:07:40 +0330 Subject: [PATCH 19/67] chore: add new todo --- .../kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt index fc029118..5b68db6c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt @@ -3,6 +3,7 @@ package org.sayandev.sayanvanish.api.cache import org.sayandev.sayanvanish.api.User import java.util.UUID +// TODO: this is not what i want from a cache system. i want each cache to have its own unique methods. for example i want the getUsers method to have a getUsers().getOnline() sub method. so its probably better to create a seperated class for each type of cache interface CacheService { fun getUsers(): ICache fun getVanishUsers(): ICache From abbc55df475493ea1d98e9c4f1e8eec03c24d07d Mon Sep 17 00:00:00 2001 From: Syren Date: Wed, 16 Jul 2025 20:46:09 +0330 Subject: [PATCH 20/67] chore: update cache implementation --- .../org/sayandev/sayanvanish/api/User.kt | 2 +- .../sayandev/sayanvanish/api/VanishUser.kt | 2 +- .../sayanvanish/api/cache/CacheService.kt | 10 +- .../api/cache/MemoryCacheService.kt | 12 +- .../api/cache/caches/IUserCache.kt | 17 +++ .../api/cache/caches/IVanishUserCache.kt | 22 ++++ .../sayanvanish/api/cache/caches/UserCache.kt | 44 +++++++ .../api/cache/caches/VanishUserCache.kt | 64 +++++++++ .../sayanvanish/api/storage/Database.kt | 14 +- .../api/storage/TransactionDatabase.kt | 4 +- .../api/storage/redis/RedisDatabase.kt | 4 +- .../api/storage/sql/SQLDatabase.kt | 2 +- .../bukkit/api/BukkitVanishUser.kt | 4 +- .../bukkit/api/SayanVanishBukkitAPI.kt | 124 ++++++++++++++---- .../bukkit/command/SayanVanishCommand.kt | 51 +++---- .../bungeecord/api/SayanVanishBungeeAPI.kt | 3 +- 16 files changed, 301 insertions(+), 78 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IUserCache.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IVanishUserCache.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/UserCache.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/VanishUserCache.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index a3665718..4fbf63be 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -204,7 +204,7 @@ interface User { }.asCompletableFuture() } - fun asEmptyVanishUser(): VanishUser { + fun generatedVanishUser(): VanishUser { return VanishUser.of(uniqueId, username, serverId) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 81ce73cc..5fad5c9a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -57,7 +57,7 @@ interface VanishUser : User { override suspend fun save(): Deferred { serverId = Platform.get().serverId - return VanishAPI.get().getDatabase().addVanishUser(this) + return VanishAPI.get().getDatabase().saveVanishUser(this) } suspend fun delete() { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt index 5b68db6c..01eecb43 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt @@ -1,11 +1,9 @@ package org.sayandev.sayanvanish.api.cache -import org.sayandev.sayanvanish.api.User -import java.util.UUID +import org.sayandev.sayanvanish.api.cache.caches.IUserCache +import org.sayandev.sayanvanish.api.cache.caches.IVanishUserCache -// TODO: this is not what i want from a cache system. i want each cache to have its own unique methods. for example i want the getUsers method to have a getUsers().getOnline() sub method. so its probably better to create a seperated class for each type of cache interface CacheService { - fun getUsers(): ICache - fun getVanishUsers(): ICache - fun getUsersCount(): ICache + fun getUsers(): IUserCache + fun getVanishUsers(): IVanishUserCache } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt index 6dd303bb..2c241fe6 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt @@ -1,14 +1,14 @@ package org.sayandev.sayanvanish.api.cache -import org.sayandev.sayanvanish.api.User -import java.util.UUID +import org.sayandev.sayanvanish.api.cache.caches.IUserCache +import org.sayandev.sayanvanish.api.cache.caches.IVanishUserCache +import org.sayandev.sayanvanish.api.cache.caches.UserCache +import org.sayandev.sayanvanish.api.cache.caches.VanishUserCache class MemoryCacheService : CacheService { - object Users : ICache by Cache("users") - object VanishUsers : ICache by Cache("vanish_users") - object UsersCount : ICache by Cache("users_count") + object Users : IUserCache by UserCache() + object VanishUsers : IVanishUserCache by VanishUserCache() override fun getUsers() = Users override fun getVanishUsers() = VanishUsers - override fun getUsersCount() = UsersCount } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IUserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IUserCache.kt new file mode 100644 index 00000000..cdbc9d3e --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IUserCache.kt @@ -0,0 +1,17 @@ +package org.sayandev.sayanvanish.api.cache.caches + +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.cache.ICache +import java.util.UUID + +interface IUserCache : ICache { + fun getUser(uniqueId: UUID): User? + fun getOnline(): List + fun getByServer(serverId: String): List + fun getCountByServer(serverId: String): Int + fun getOnlineCountByServer(serverId: String): Int + fun getOnlineCount(): Int + fun getCount(): Int + fun getOnlineUsersByServerId(serverId: String): List + fun getOnlineCountByServerId(serverId: String): Int +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IVanishUserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IVanishUserCache.kt new file mode 100644 index 00000000..eaca563d --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IVanishUserCache.kt @@ -0,0 +1,22 @@ +package org.sayandev.sayanvanish.api.cache.caches + +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.cache.ICache +import java.util.* + +interface IVanishUserCache : ICache { + fun getVanishUser(uniqueId: UUID): VanishUser? + fun hasVanishUser(uniqueId: UUID): Boolean + fun getOnline(): List + fun getByServer(serverId: String): List + fun getCountByServer(serverId: String): Int + fun getOnlineCountByServer(serverId: String): Int + fun getOnlineCount(): Int + fun getCount(): Int + fun getOnlineUsersByServerId(serverId: String): List + fun getOnlineCountByServerId(serverId: String): Int + fun getVanished(): List + fun getOnlineVanished(): List + fun getVanishedCount(): Int + fun getOnlineVanishedCount(): Int +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/UserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/UserCache.kt new file mode 100644 index 00000000..b4169bd2 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/UserCache.kt @@ -0,0 +1,44 @@ +package org.sayandev.sayanvanish.api.cache.caches + +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.cache.Cache +import org.sayandev.sayanvanish.api.cache.ICache +import java.util.UUID + +class UserCache: IUserCache, ICache by Cache("users") { + override fun getUser(uniqueId: UUID): User? { + return this[uniqueId] + } + + override fun getOnline(): List { + return this.values.filter { it.isOnline } + } + + override fun getByServer(serverId: String): List { + return this.values.filter { it.serverId == serverId } + } + + override fun getCountByServer(serverId: String): Int { + return this.getByServer(serverId).size + } + + override fun getOnlineCountByServer(serverId: String): Int { + return this.getByServer(serverId).count { it.isOnline } + } + + override fun getOnlineCount(): Int { + return this.values.count { it.isOnline } + } + + override fun getCount(): Int { + return this.values.size + } + + override fun getOnlineUsersByServerId(serverId: String): List { + return this.getByServer(serverId).filter { it.isOnline } + } + + override fun getOnlineCountByServerId(serverId: String): Int { + return this.getOnlineUsersByServerId(serverId).size + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/VanishUserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/VanishUserCache.kt new file mode 100644 index 00000000..0a3792cc --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/VanishUserCache.kt @@ -0,0 +1,64 @@ +package org.sayandev.sayanvanish.api.cache.caches + +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.cache.Cache +import org.sayandev.sayanvanish.api.cache.ICache +import java.util.* + +class VanishUserCache: IVanishUserCache, ICache by Cache("vanish_user") { + override fun getVanishUser(uniqueId: UUID): VanishUser? { + return this[uniqueId] + } + + override fun hasVanishUser(uniqueId: UUID): Boolean { + return this.containsKey(uniqueId) + } + + override fun getOnline(): List { + return this.values.filter { it.isOnline } + } + + override fun getByServer(serverId: String): List { + return this.values.filter { it.serverId == serverId } + } + + override fun getCountByServer(serverId: String): Int { + return this.getByServer(serverId).size + } + + override fun getOnlineCountByServer(serverId: String): Int { + return this.getByServer(serverId).count { it.isOnline } + } + + override fun getOnlineCount(): Int { + return this.values.count { it.isOnline } + } + + override fun getCount(): Int { + return this.values.size + } + + override fun getOnlineUsersByServerId(serverId: String): List { + return this.getByServer(serverId).filter { it.isOnline } + } + + override fun getOnlineCountByServerId(serverId: String): Int { + return this.getOnlineUsersByServerId(serverId).size + } + + override fun getVanished(): List { + return this.values.filter { it.isVanished } + } + + override fun getOnlineVanished(): List { + return this.getVanished().filter { it.isOnline } + } + + override fun getVanishedCount(): Int { + return this.getVanished().size + } + + override fun getOnlineVanishedCount(): Int { + return this.getOnlineVanished().size + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt index 9b9f969b..1993b429 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt @@ -22,14 +22,14 @@ interface Database { suspend fun disconnect(): Deferred - suspend fun addVanishUser(vanishUser: VanishUser): Deferred + suspend fun saveVanishUser(vanishUser: VanishUser): Deferred - fun addVanishUserFuture(vanishUser: VanishUser): CompletableFuture { - return async(dispatcher) { addVanishUser(vanishUser).await() }.asCompletableFuture() + fun saveVanishUserFuture(vanishUser: VanishUser): CompletableFuture { + return async(dispatcher) { saveVanishUser(vanishUser).await() }.asCompletableFuture() } - fun addVanishUserBlocking(vanishUser: VanishUser): Boolean { - return runBlocking { addVanishUser(vanishUser).await() } + fun saveVanishUserBlocking(vanishUser: VanishUser): Boolean { + return runBlocking { saveVanishUser(vanishUser).await() } } suspend fun hasVanishUser(uniqueId: UUID): Deferred @@ -88,6 +88,10 @@ interface Database { return async(dispatcher) { getUser(uniqueId).await() }.asCompletableFuture() } + fun getUserBlocking(uniqueId: UUID): User? { + return runBlocking { getUser(uniqueId).await() } + } + suspend fun getUsers(): Deferred> fun getUsersFuture(): CompletableFuture> { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt index 3d9e9685..faeec1ae 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt @@ -79,9 +79,9 @@ class TransactionDatabase: Database { return CompletableDeferred(connected) } - override suspend fun addVanishUser(vanishUser: VanishUser): Deferred { + override suspend fun saveVanishUser(vanishUser: VanishUser): Deferred { val database = database(TransactionTypes.VANISH_USER) - return database.addVanishUser(vanishUser) + return database.saveVanishUser(vanishUser) } override suspend fun hasVanishUser(uniqueId: UUID): Deferred { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt index 5a1e04a8..399919d9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt @@ -88,7 +88,7 @@ class RedisDatabase( } } - override suspend fun addVanishUser(user: VanishUser): Deferred { + override suspend fun saveVanishUser(user: VanishUser): Deferred { return async { redis.resource.use { it.hset("vanish_users", user.uniqueId.toString(), user.toJson()) != 0L @@ -137,7 +137,7 @@ class RedisDatabase( } override suspend fun updateVanishUser(user: VanishUser): Deferred { - return addVanishUser(user) + return saveVanishUser(user) } override suspend fun updateUser(user: User): Deferred { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index b8c411d6..67c4d6a0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -141,7 +141,7 @@ class SQLDatabase( } } - override suspend fun addVanishUser(vanishUser: VanishUser): Deferred { + override suspend fun saveVanishUser(vanishUser: VanishUser): Deferred { return async { VanishUser.Schema.upsert { row -> row[uniqueId] = vanishUser.uniqueId diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index bac29b07..57287d4e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -146,7 +146,7 @@ open class BukkitVanishUser( hideUser(onlinePlayer) } if (currentOptions.notifyStatusChangeToOthers) { - for (otherUser in VanishAPI.get().getCacheService().getUsers().values.filter { it.isOnline }.filter { it.username != username && it.asEmptyVanishUser().canSee(this) }) { + for (otherUser in VanishAPI.get().getCacheService().getUsers().getOnline().filter { it.username != username && it.generatedVanishUser().canSee(this) }) { otherUser.sendMessage(language.vanish.vanishStateOther.component(Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(true)))) } } @@ -163,7 +163,7 @@ open class BukkitVanishUser( showUser(onlinePlayer) } if (currentOptions.notifyStatusChangeToOthers) { - for (otherUser in VanishAPI.get().getCacheService().getUsers().values.filter { it.isOnline }.filter { it.username != this.username && it.asEmptyVanishUser().canSee(this) }) { + for (otherUser in VanishAPI.get().getCacheService().getUsers().getOnline().filter { it.username != this.username && it.generatedVanishUser().canSee(this) }) { otherUser.sendMessage(language.vanish.vanishStateOther.component(Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(false)))) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt index 4e70cce6..0ac3a7fb 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt @@ -1,46 +1,118 @@ package org.sayandev.sayanvanish.bukkit.api +import kotlinx.coroutines.Deferred +import org.bukkit.Bukkit import org.bukkit.OfflinePlayer -import org.bukkit.entity.Player +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.bukkit.config.SettingsConfig import java.util.* -class SayanVanishBukkitAPI : SayanVanishAPI(BukkitVanishUser::class.java) { +class SayanVanishBukkitAPI { + companion object { + suspend fun UUID.user(): Deferred { + return VanishAPI.get().getDatabase().getUser(this) + } - fun canSee(player: Player?, otherPlayer: Player): Boolean { - val vanishLevel = player?.getOrCreateUser()?.vanishLevel ?: -1 - return vanishLevel >= (otherPlayer.user()?.vanishLevel ?: -1) - } + suspend fun UUID.getOrCreateUser(): User { + val offlinePlayer = Bukkit.getOfflinePlayer(this) + val player = offlinePlayer.player + return VanishAPI.get().getDatabase().getUser(this).await() ?: User.of( + this, + offlinePlayer.name ?: this.toString(), + player != null, + SettingsConfig.get().serverId() + ) + } - companion object { - private val defaultInstance = SayanVanishBukkitAPI() + suspend fun UUID.getOrAddUser(): User { + val user = this.getOrCreateUser() + VanishAPI.get().getDatabase().saveUser(user).await() + return user + } - @JvmStatic - fun getInstance(): SayanVanishAPI { - return defaultInstance + fun UUID.cachedUser(): User? { + return VanishAPI.get().getCacheService().getUsers().getUser(this) } - @JvmStatic - fun UUID.bukkitUser(): BukkitVanishUser? { - return getInstance().getUser(this) + fun UUID.getCachedOrCreateUser(): User { + return VanishAPI.get().getCacheService().getUsers().getUser(this) ?: User.of( + this, + Bukkit.getOfflinePlayer(this).name ?: "N/A", + false, + SettingsConfig.get().serverId() + ) } - @JvmStatic - fun OfflinePlayer.user(): BukkitVanishUser? { - return getInstance().database.getVanishUser(this.uniqueId) + suspend fun UUID.vanishUser(): Deferred { + return VanishAPI.get().getDatabase().getVanishUser(this) } - @JvmStatic - fun OfflinePlayer.getOrCreateUser(): BukkitVanishUser { - return getInstance().getUser(this.uniqueId) ?: BukkitVanishUser(this.uniqueId, this.name ?: "N/A") + suspend fun UUID.getOrCreateVanishUser(): VanishUser { + return VanishAPI.get().getDatabase().getVanishUser(this).await() ?: VanishUser.of( + this, + Bukkit.getOfflinePlayer(this).name ?: "N/A", + ) } - @JvmStatic - fun OfflinePlayer.getOrAddUser(): BukkitVanishUser { - return getInstance().getUser(this.uniqueId) ?: let { - val newUser = BukkitVanishUser(this.uniqueId, this.name ?: "N/A") - getInstance().database.addVanishUser(newUser) - newUser + suspend fun UUID.getOrAddVanishUser(): VanishUser { + val vanishUser = this.getOrCreateVanishUser() + if (!VanishAPI.get().getCacheService().getVanishUsers().hasVanishUser(this)) { + VanishAPI.get().getDatabase().saveVanishUser(vanishUser).await() } + return vanishUser + } + + fun UUID.cachedVanishUser(): VanishUser? { + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) + } + + fun UUID.getCachedOrCreateVanishUser(): VanishUser { + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) ?: VanishUser.of( + this, + Bukkit.getOfflinePlayer(this).name ?: "N/A", + ) + } + + suspend fun OfflinePlayer.user(): Deferred { + return this.uniqueId.user() + } + + suspend fun OfflinePlayer.getOrCreateUser(): User { + return this.uniqueId.getOrCreateUser() + } + + suspend fun OfflinePlayer.getOrAddUser(): User { + return this.uniqueId.getOrAddUser() + } + + fun OfflinePlayer.cachedUser(): User? { + return this.uniqueId.cachedUser() + } + + fun OfflinePlayer.getCachedOrCreateUser(): User { + return this.uniqueId.getCachedOrCreateUser() + } + + suspend fun OfflinePlayer.vanishUser(): Deferred { + return this.uniqueId.vanishUser() + } + + suspend fun OfflinePlayer.getOrCreateVanishUser(): VanishUser { + return this.uniqueId.getOrCreateVanishUser() + } + + suspend fun OfflinePlayer.getOrAddVanishUser(): VanishUser { + return this.uniqueId.getOrAddVanishUser() + } + + fun OfflinePlayer.cachedVanishUser(): VanishUser? { + return this.uniqueId.cachedVanishUser() + } + + fun OfflinePlayer.getCachedOrCreateVanishUser(): VanishUser { + return this.uniqueId.getCachedOrCreateVanishUser() } } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index a7d0ddb5..a8f28909 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -17,29 +17,28 @@ import org.incendo.cloud.setting.ManagerSetting import org.incendo.cloud.suggestion.Suggestion import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.api.storage.StorageConfig -import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler +import org.sayandev.sayanvanish.api.storage.StorageConfig +import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.api.utils.Paste import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.LanguageConfig import org.sayandev.sayanvanish.bukkit.config.SettingsConfig import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.config.settings import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel import org.sayandev.sayanvanish.bukkit.feature.features.FeatureUpdate -import org.sayandev.sayanvanish.bukkit.health.HealthCache +import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent import org.sayandev.sayanvanish.bukkit.utils.ServerUtils import org.sayandev.stickynote.bukkit.* import org.sayandev.stickynote.bukkit.command.BukkitCommand import org.sayandev.stickynote.bukkit.command.BukkitSender import org.sayandev.stickynote.bukkit.command.required -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.sayandev.stickynote.core.utils.MilliCounter import java.io.File import java.util.concurrent.CompletableFuture @@ -47,7 +46,7 @@ import kotlin.jvm.optionals.getOrNull import kotlin.reflect.KProperty1 import kotlin.reflect.full.memberProperties -class SayanVanishCommand : BukkitCommand(settings.vanishCommand.name, *settings.vanishCommand.aliases.toTypedArray()) { +class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name, *SettingsConfig.get().vanishCommand.aliases.toTypedArray()) { override fun rootBuilder(builder: MutableCommandBuilder) { builder.permission("${plugin.name}.commands.use") @@ -80,29 +79,33 @@ class SayanVanishCommand : BukkitCommand(settings.vanishCommand.name, *settings. } val player = if (target.isPresent) context.optional("player").get() else context.sender().player() ?: return - val user = player.getOrAddUser() + launch { + val user = player.getOrAddUser() - if (!user.hasPermission(Permission.VANISH)) { - user.sendComponent(language.vanish.dontHaveUsePermission, Placeholder.unparsed("permission", Permission.VANISH.permission())) - } + if (!user.hasPermission(Permission.VANISH)) { + user.sendMessage(language.vanish.dontHaveUsePermission.component(Placeholder.unparsed("permission", Permission.VANISH.permission()))) + } + + val vanishUser = player.getOrAddVanishUser() - val options = VanishOptions.defaultOptions().apply { - if (context.flags().hasFlag("silent")) { - this.sendMessage = false + val options = VanishOptions.defaultOptions().apply { + if (context.flags().hasFlag("silent")) { + this.sendMessage = false + } } - } - if (target.isPresent) { - if (!player.isOnline) { - sender.sendComponent(language.vanish.offlineOnVanish, Placeholder.unparsed("player", player.name ?: "N/A"), Placeholder.parsed("state", user.stateText())) - options.sendMessage = false + if (target.isPresent) { + if (!player.isOnline) { + sender.sendMessage(language.vanish.offlineOnVanish.component(Placeholder.unparsed("player", player.name ?: "N/A"), Placeholder.parsed("state", user.stateText()))) + options.sendMessage = false + } } - } - when (state) { - "on" -> user.disappear(options) - "off" -> user.appear(options) - else -> user.toggleVanish(options) + when (state) { + "on" -> user.disappear(options) + "off" -> user.appear(options) + else -> user.toggleVanish(options) + } } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt index 6bbb3133..58d3ebc9 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt @@ -7,7 +7,6 @@ import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.SayanVanishAPI.user import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser -import java.util.UUID object SayanVanishBungeeAPI : VanishAPI by SayanVanishAPI, PlatformAdapter by BungeePlatformAdapter { @JvmStatic @@ -29,7 +28,7 @@ object SayanVanishBungeeAPI : VanishAPI by SayanVanishAPI, PlatformAdapter Date: Thu, 17 Jul 2025 17:33:05 +0330 Subject: [PATCH 21/67] feat: add more api methods for VanishUser interface --- .../org/sayandev/sayanvanish/api/Platform.kt | 9 +- .../sayanvanish/api/PlatformAdapter.kt | 6 +- .../org/sayandev/sayanvanish/api/User.kt | 53 ++---- .../sayandev/sayanvanish/api/VanishUser.kt | 160 +++++++++++++----- .../serializers/gson/UUIDJsonAdapter.kt | 18 ++ .../sayandev/sayanvanish/api/utils/Gson.kt | 6 + .../bukkit/api/BukkitVanishUser.kt | 6 +- .../bukkit/feature/features/FeatureFly.kt | 2 +- .../bungeecord/api/BungeeVanishUser.kt | 2 +- .../velocity/api/VelocityVanishUser.kt | 2 +- .../SayanVanishProxyCommandVelocity.kt | 2 +- 11 files changed, 166 insertions(+), 100 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/serializers/gson/UUIDJsonAdapter.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index e2a429d1..1919a944 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -17,13 +17,14 @@ data class Platform( ) { companion object { + // TODO: make a generic platform class private var currentPlatform = Platform("default", "SayanVanish", Logger.getGlobal(), File("."), "unknown", object : PlatformAdapter { - override fun adapt(user: VanishUser): VanishUser { - throw OperationNotSupportedException("Default platform doesn't support vanish user adapt") + override fun adapt(user: User): User { + return user } - override fun sendMessage(user: User, message: Component) { - throw OperationNotSupportedException("Default platform doesn't support sending message to user") + override fun adapt(vanishUser: VanishUser): VanishUser { + return vanishUser } }) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt index 201a77d6..39908ca0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt @@ -1,9 +1,7 @@ package org.sayandev.sayanvanish.api -import net.kyori.adventure.text.Component - interface PlatformAdapter { - fun adapt(user: VanishUser): V + fun adapt(user: User): U - fun sendMessage(user: U, message: Component) + fun adapt(vanishUser: VanishUser): V } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 4fbf63be..4972cbf0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -3,9 +3,11 @@ package org.sayandev.sayanvanish.api import com.google.gson.* import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred +import kotlinx.coroutines.awaitAll import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import org.sayandev.stickynote.core.utils.async @@ -72,8 +74,12 @@ interface User { return hasPermission(permission.permission()) } - fun sendMessage(component: Component) { - Platform.get().adapter.sendMessage(this, component) + fun sendMessage(content: Component) { + Platform.get().adapter.adapt(this).sendMessage(content) + } + + fun sendActionbar(content: Component) { + Platform.get().adapter.adapt(this).sendActionbar(content) } /** @@ -164,7 +170,7 @@ interface User { * @since 2.0.0 */ fun saveAndSyncBlocking(): List { - return runBlocking { saveAndSync().map { it.await() } } + return runBlocking { saveAndSync().awaitAll() } } /** @@ -177,7 +183,7 @@ interface User { suspend fun asVanishUser(): Deferred { return CompletableDeferred().apply { async(VanishAPI.get().getDatabase().dispatcher) { - VanishAPI.get().getDatabase().getVanishUser(uniqueId).await() ?: VanishUser.of(uniqueId, username, serverId) + VanishAPI.get().getDatabase().getVanishUser(uniqueId).await() ?: VanishUser.Generic(uniqueId, username, serverId) }.let { complete(it.await()) } } } @@ -205,7 +211,7 @@ interface User { } fun generatedVanishUser(): VanishUser { - return VanishUser.of(uniqueId, username, serverId) + return VanishUser.Generic(uniqueId, username, serverId) } /** @@ -254,42 +260,7 @@ interface User { override var serverId: String ) : User - /** - * Converts this [User] to a [Generic] implementation. - * - * @return A [Generic] user instance with the same properties as this user. - * @since 2.0.0 - */ - fun asGeneric(): Generic { - return Generic( - uniqueId, - username, - isOnline, - serverId - ) - } - companion object { - /** - * Creates a new [User] instance with the given properties. - * - * @param uniqueId The unique identifier for the user. - * @param username The username of the user. - * @param isOnline Whether the user is currently online. - * @param serverId The ID of the server the user is connected to. If null, uses the platform's default server ID. - * @return A new [User] instance. - * @since 1.6.0 - */ - @JvmStatic - fun of(uniqueId: UUID, username: String, isOnline: Boolean, serverId: String?): User { - return Generic( - uniqueId, - username, - isOnline, - serverId ?: Platform.get().serverId - ) - } - /** * Retrieves a [User] from the cache by [UUID]. * @@ -297,7 +268,7 @@ interface User { * @return The [User] if found in cache, or null if not found. * @since 2.0.0 */ - @JvmStatic + @JvmSynthetic fun UUID.userFromCache(): User? { return VanishAPI.get().getCacheService().getUsers()[this] } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 5fad5c9a..c591244e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -1,14 +1,24 @@ package org.sayandev.sayanvanish.api +import com.google.gson.* +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver -import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.future.asCompletableFuture +import kotlinx.coroutines.runBlocking +import org.sayandev.sayanvanish.api.User.Companion.user import org.sayandev.sayanvanish.api.storage.PlatformTable +import org.sayandev.stickynote.core.utils.async +import java.lang.reflect.Type import java.util.* +import java.util.concurrent.CompletableFuture interface VanishUser : User { + var currentOptions: VanishOptions + var isVanished: Boolean + var vanishLevel: Int suspend fun disappear(options: VanishOptions) { @@ -37,14 +47,6 @@ interface VanishUser : User { toggleVanish(VanishOptions.defaultOptions()) } - fun sendComponent(content: String, vararg placeholder: TagResolver) { - Platform.get().adapter.adapt(this).sendComponent(content, *placeholder) - } - - fun sendActionbar(content: String, vararg placeholder: TagResolver) { - Platform.get().adapter.adapt(this).sendActionbar(content, *placeholder) - } - /** * @param otherVanishUser The user to check if this user can see * */ @@ -55,16 +57,78 @@ interface VanishUser : User { return canSee } + @JvmSynthetic override suspend fun save(): Deferred { serverId = Platform.get().serverId - return VanishAPI.get().getDatabase().saveVanishUser(this) + val deferred = CompletableDeferred() + async(VanishAPI.get().getDatabase().dispatcher) { + listOf( + super.save(), + VanishAPI.get().getDatabase().saveVanishUser(this@VanishUser) + ).awaitAll() + deferred.complete(true) + } + return deferred + } + + override fun saveBlocking(): Boolean { + return runBlocking { save().await() } + } + + override fun saveFuture(): CompletableFuture { + return async(VanishAPI.get().getDatabase().dispatcher) { + save().await() + }.asCompletableFuture() } suspend fun delete() { VanishAPI.get().getDatabase().removeVanishUser(uniqueId) } - // TODO: implement a json type adapter for this class + @JvmSynthetic + override suspend fun sync(): Deferred { + val deferred = CompletableDeferred() + async(VanishAPI.get().getDatabase().dispatcher) { + listOf( + super.sync(), + VanishAPI.get().getMessagingService().syncVanishUser(this@VanishUser) + ).awaitAll() + deferred.complete(true) + } + return deferred + } + + override fun syncBlocking(): Boolean { + return runBlocking { sync().await() } + } + + override fun syncFuture(): CompletableFuture { + return async(VanishAPI.get().getDatabase().dispatcher) { + sync().await() + }.asCompletableFuture() + } + + @JvmSynthetic + override suspend fun saveAndSync(): List> { + return listOf( + save(), + sync() + ) + } + + override fun saveAndSyncBlocking(): List { + return runBlocking { saveAndSync().awaitAll() } + } + + class JsonAdapter : JsonSerializer, JsonDeserializer { + override fun serialize(src: VanishUser, typeOfSrc: Type, context: JsonSerializationContext): JsonObject { + return JsonParser.parseString(Gson().toJson(src)).asJsonObject + } + + override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): VanishUser { + return Gson().fromJson(json, Generic::class.java) + } + } object Schema : PlatformTable("vanish_users") { val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() @@ -75,39 +139,47 @@ interface VanishUser : User { override val primaryKey = PrimaryKey(uniqueId) } + data class Generic( + override val uniqueId: UUID, + override var username: String, + override var serverId: String = Platform.get().serverId, + override var isVanished: Boolean = false, + override var isOnline: Boolean = false, + override var vanishLevel: Int = 1, + override var currentOptions: VanishOptions = VanishOptions.defaultOptions() + ): VanishUser + companion object { - // TODO: implement a generic type like User.Generic() to replace VanishUser.of() and use it for json type adapter - fun of( - uniqueId: UUID, - username: String, - serverId: String = Platform.get().serverId, - isVanished: Boolean = false, - isOnline: Boolean = false, - vanishLevel: Int = 1, - currentOptions: VanishOptions = VanishOptions.defaultOptions() - ): VanishUser { - return object : VanishUser { - override val uniqueId: UUID = uniqueId - override var username: String = username - override var serverId: String = serverId - override var currentOptions: VanishOptions = currentOptions - override var isVanished: Boolean = isVanished - override var isOnline: Boolean = isOnline - override var vanishLevel: Int = vanishLevel - override fun sendComponent( - content: String, - vararg placeholder: TagResolver - ) { - throw UnsupportedPlatformException("sendComponent") - } - - override fun sendActionbar( - content: String, - vararg placeholder: TagResolver - ) { - throw UnsupportedPlatformException("sendActionbar") - } - } + @JvmSynthetic + fun UUID.vanishUserFromCache(): VanishUser? { + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) + } + + @JvmSynthetic + suspend fun UUID.vanishUser(): Deferred { + return VanishAPI.get().getDatabase().getVanishUser(this) + } + + @JvmSynthetic + fun UUID.vanishUserBlocking(): VanishUser? { + return runBlocking { vanishUser().await() } + } + + @JvmStatic + fun getUserBlocking(uniqueId: UUID): VanishUser? { + return uniqueId.vanishUserBlocking() + } + + @JvmSynthetic + fun UUID.vanishUserFuture(): CompletableFuture { + return async(VanishAPI.get().getDatabase().dispatcher) { + vanishUser().await() + }.asCompletableFuture() + } + + @JvmStatic + fun getVanishUserFuture(uniqueId: UUID): CompletableFuture { + return uniqueId.vanishUserFuture() } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/serializers/gson/UUIDJsonAdapter.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/serializers/gson/UUIDJsonAdapter.kt new file mode 100644 index 00000000..920af424 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/serializers/gson/UUIDJsonAdapter.kt @@ -0,0 +1,18 @@ +package org.sayandev.sayanvanish.api.storage.serializers.gson + +import com.google.gson.* +import java.lang.reflect.Type +import java.util.* + +class UUIDJsonAdapter : JsonSerializer, JsonDeserializer { + override fun serialize(src: UUID, typeOfSrc: Type, context: JsonSerializationContext): JsonObject { + return JsonObject().apply { + this.addProperty("value", src.toString()) + } + } + + override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): UUID { + return json.asJsonObject.get("value")?.asString?.let { UUID.fromString(it) } + ?: throw IllegalArgumentException("Invalid UUID format in JSON: $json") + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt index d24e3f50..6e547dc9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt @@ -2,9 +2,15 @@ package org.sayandev.sayanvanish.api.utils import com.google.gson.Gson import com.google.gson.GsonBuilder +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.storage.serializers.gson.UUIDJsonAdapter +import java.util.UUID object Gson { private val gson = GsonBuilder() + .registerTypeAdapter(UUID::class.java, UUIDJsonAdapter()) + .registerTypeAdapter(VanishUser::class.java, VanishUser.JsonAdapter()) + .registerTypeAdapter(VanishUser::class.java, VanishUser.JsonAdapter()) .setPrettyPrinting() .create() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 57287d4e..aa3e829f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -82,7 +82,7 @@ open class BukkitVanishUser( // order matters - don't move hideUser before vanish (hideUser have a canSee check for vanish state notify) hideUser() - sendComponent(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) + sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } override suspend fun appear(options: VanishOptions) { @@ -102,7 +102,7 @@ open class BukkitVanishUser( super.appear(options) - sendComponent(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) + sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } override fun hasPermission(permission: String): Boolean { @@ -133,7 +133,7 @@ open class BukkitVanishUser( } } - override fun sendComponent(content: String, vararg placeholder: TagResolver) { + override fun sendMessage(content: String, vararg placeholder: TagResolver) { player()?.sendComponent(content, *placeholder) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt index e4bc22c2..2ebf39db 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt @@ -33,7 +33,7 @@ class FeatureFly( val user = event.user if (!isActive(user)) return if (!user.hasPermission(Permission.FLY_KEEP_AFTER_REAPPEAR) && disableOnReappear) { - user.sendComponent(language.feature.flyDisabled) + user.sendMessage(language.feature.flyDisabled) user.player()?.allowFlight = false user.player()?.isFlying = false } diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt index d67081c3..82e2ac84 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt @@ -64,7 +64,7 @@ open class BungeeVanishUser( return player()?.hasPermission(permission) == true } - override fun sendComponent(content: String, vararg placeholder: TagResolver) { + override fun sendMessage(content: String, vararg placeholder: TagResolver) { player()?.sendComponent(content.component()) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index e68c8f09..d0e016cf 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -70,7 +70,7 @@ open class VelocityVanishUser( return player()?.hasPermission(permission) == true } - override fun sendComponent(content: String, vararg placeholder: TagResolver) { + override fun sendMessage(content: String, vararg placeholder: TagResolver) { player()?.sendComponent(content, *placeholder) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt index f4108099..0847881a 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt @@ -66,7 +66,7 @@ class SayanVanishProxyCommandVelocity : VelocityCommand(settings.command.name, * val user = player.getVanishUser() ?: player.generateVanishUser() if (!user.hasPermission(Permission.VANISH)) { - user.sendComponent(language.general.dontHavePermission, Placeholder.unparsed("permission", Permission.VANISH.permission())) + user.sendMessage(language.general.dontHavePermission, Placeholder.unparsed("permission", Permission.VANISH.permission())) return@launch } From fc6d729dd6781a17455d885d0d77043fd183b451 Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 17 Jul 2025 17:35:53 +0330 Subject: [PATCH 22/67] feat: add APIPlatformAdapter.kt --- .../sayanvanish/api/APIPlatformAdapter.kt | 11 ++++++++++ .../org/sayandev/sayanvanish/api/Platform.kt | 22 ++++++++++--------- 2 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/APIPlatformAdapter.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/APIPlatformAdapter.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/APIPlatformAdapter.kt new file mode 100644 index 00000000..218a2a10 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/APIPlatformAdapter.kt @@ -0,0 +1,11 @@ +package org.sayandev.sayanvanish.api + +class APIPlatformAdapter : PlatformAdapter { + override fun adapt(user: User): User { + return user + } + + override fun adapt(vanishUser: VanishUser): VanishUser { + return vanishUser + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index 1919a944..5fe4a02d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -17,16 +17,18 @@ data class Platform( ) { companion object { - // TODO: make a generic platform class - private var currentPlatform = Platform("default", "SayanVanish", Logger.getGlobal(), File("."), "unknown", object : PlatformAdapter { - override fun adapt(user: User): User { - return user - } - - override fun adapt(vanishUser: VanishUser): VanishUser { - return vanishUser - } - }) + private var currentPlatform = Platform( + "sayanvanish", + "SayanVanish", + Logger.getGlobal(), + File(".", "sayanvanish").apply { + if (!this.exists()) { + this.mkdirs() + } + }, + "sayanvanish-virtual-server", + APIPlatformAdapter() + ) @JvmStatic fun setPlatform(platform: Platform) { From 78dd0e22931b426f1209e0398f64b2b2a822bca6 Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 17 Jul 2025 18:08:18 +0330 Subject: [PATCH 23/67] chore: resolve all compile errors in bukkit module except features --- .../org/sayandev/sayanvanish/api/Platform.kt | 13 +- .../sayandev/sayanvanish/api/VanishUser.kt | 3 + .../api/message/TypedMessagingService.kt | 10 +- .../sayandev/sayanvanish/api/utils/Paste.kt | 10 +- .../sayanvanish/bukkit/BukkitPlatform.kt | 16 ++ .../sayanvanish/bukkit/SayanVanish.kt | 93 ----------- .../sayanvanish/bukkit/SayanVanishPlugin.kt | 84 ++++++++++ .../bukkit/api/BukkitPlatformAdapter.kt | 23 +++ .../sayanvanish/bukkit/api/BukkitUser.kt | 26 ++- .../bukkit/api/BukkitVanishUser.kt | 21 +-- .../bukkit/api/SayanVanishBukkitAPI.kt | 28 +++- .../bukkit/command/SayanVanishCommand.kt | 151 +++++++----------- .../bukkit/feature/features/FeatureUpdate.kt | 22 ++- .../sayanvanish/bukkit/utils/PlayerUtils.kt | 6 +- .../sayanvanish/bukkit/utils/ServerUtils.kt | 5 +- 15 files changed, 274 insertions(+), 237 deletions(-) create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt delete mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitPlatformAdapter.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index 5fe4a02d..01935a3c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -1,21 +1,25 @@ package org.sayandev.sayanvanish.api -import com.mysql.cj.jdbc.exceptions.OperationNotSupportedException -import net.kyori.adventure.text.Component import org.sayandev.sayanvanish.api.storage.TransactionDatabase import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import java.io.File import java.util.logging.Logger -data class Platform( +open class Platform( val id: String, val pluginName: String, val logger: Logger, var rootDirectory: File, var serverId: String, - val adapter: PlatformAdapter, + val adapter: PlatformAdapter, ) { + open suspend fun register() { } + + open suspend fun unregister() { + VanishAPI.get().getDatabase().disconnect().await() + } + companion object { private var currentPlatform = Platform( "sayanvanish", @@ -43,6 +47,7 @@ data class Platform( @JvmStatic fun setAndRegister(platform: Platform): Boolean { setPlatform(platform) + platform.register() (VanishAPI.get().getDatabase() as? TransactionDatabase)?.let { if (!it.databaseConnected) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index c591244e..e15c5254 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -21,6 +21,9 @@ interface VanishUser : User { var vanishLevel: Int + // TODO: better implementation for this + fun stateText(isVanished: Boolean = this.isVanished) = if (isVanished) "ON" else "OFF" + suspend fun disappear(options: VanishOptions) { isVanished = true save() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt index 48b09348..e3d138ed 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt @@ -56,14 +56,14 @@ class TypedMessagingService: MessagingService { } override suspend fun syncUser(user: User): Deferred { - return service(MessagingCategoryTypes.SYNC_USER).syncUser(user) + return messagingService(MessagingCategoryTypes.SYNC_USER).syncUser(user) } override suspend fun syncVanishUser(vanishUser: VanishUser): Deferred { - return service(MessagingCategoryTypes.SYNC_USER).syncUser(vanishUser) + return messagingService(MessagingCategoryTypes.SYNC_USER).syncUser(vanishUser) } - fun service(type: MessagingType): MessagingService { + fun messagingService(type: MessagingType): MessagingService { return messageTypes[type] ?: let { val (fallbackMethod, fallbackService) = messageTypes.entries.first() Platform.get().logger.warning("Tried to get a messaging service of type $type, but it was not initialized. falling back to ${fallbackMethod} database method.") @@ -71,8 +71,8 @@ class TypedMessagingService: MessagingService { } } - fun service(categoryType: MessagingCategoryType): MessagingService { - return service(categoryType.type) + fun messagingService(categoryType: MessagingCategoryType): MessagingService { + return messagingService(categoryType.type) } private fun logMessagingConnectionError() { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt index a5cc2518..10d06d14 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt @@ -1,6 +1,8 @@ package org.sayandev.sayanvanish.api.utils import com.google.gson.JsonParser +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader @@ -15,8 +17,8 @@ class Paste( val content: List, ) { - fun post(): CompletableFuture { - val future = CompletableFuture() + suspend fun post(): Deferred { + val deferred = CompletableDeferred() val url = URL(POST_URL) val connection = url.openConnection() as HttpURLConnection @@ -43,8 +45,8 @@ class Paste( val key = JsonParser.parseString(response.toString()).asJsonObject.get("key").asString - future.complete(key) - return future + deferred.complete(key) + return deferred } } else { throw IOException("Failed to upload content, HTTP response code: $responseCode") diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt new file mode 100644 index 00000000..abc15c5d --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt @@ -0,0 +1,16 @@ +package org.sayandev.sayanvanish.bukkit + +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter +import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.stickynote.bukkit.plugin +import org.sayandev.stickynote.bukkit.pluginDirectory + +class BukkitPlatform : Platform( + "bukkit", + plugin.name, + plugin.logger, + pluginDirectory, + SettingsConfig.get().general.serverId, + BukkitPlatformAdapter +) \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt deleted file mode 100644 index 3eff5bfe..00000000 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanish.kt +++ /dev/null @@ -1,93 +0,0 @@ -package org.sayandev.sayanvanish.bukkit - -import org.bukkit.Bukkit -import org.bukkit.plugin.java.JavaPlugin -import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.storage.DatabaseType -import org.sayandev.sayanvanish.api.storage.storageConfig -import org.sayandev.sayanvanish.api.storage.sql.SQLConfig -import org.sayandev.sayanvanish.api.storage.sql.SQLDatabase -import org.sayandev.sayanvanish.bukkit.api.Metrics -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI -import org.sayandev.sayanvanish.bukkit.command.SayanVanishCommand -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.config.settings -import org.sayandev.sayanvanish.bukkit.health.HealthCheckRequestPublisher -import org.sayandev.sayanvanish.bukkit.health.ServerInfoPublisher -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.error -import org.sayandev.stickynote.bukkit.pluginDirectory -import org.sayandev.stickynote.bukkit.runAsync -import org.sayandev.stickynote.loader.bukkit.StickyNoteBukkitLoader -import java.io.File - -public lateinit var sayanvanish: SayanVanish - -open class SayanVanish : JavaPlugin() { - - override fun onEnable() { - StickyNoteBukkitLoader(this) - sayanvanish = this - - if (!Platform.setAndRegister(Platform("bukkit", logger, pluginDirectory, settings.general.serverId))) { - Bukkit.getPluginManager().disablePlugin(this) - return - } - - SayanVanishBukkitAPI() - - HealthCheckRequestPublisher - ServerInfoPublisher - - settings - if (settings.general.proxyMode && storageConfig.method == DatabaseType.SQL && storageConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { - error("The `proxy-mode` is enabled, but the database method is set to SQLite, which might lead to unexpected results. If you're using proxies such as Velocity or BungeeCord, make sure to use a different database method, such as MySQL or Redis.") - } - - language - - VanishManager - - SayanVanishCommand() - - runAsync({ - SayanVanishBukkitAPI.getInstance().database.getUsersAsync { users -> - SayanVanishBukkitAPI.getInstance().database.cache = users.associateBy { it.uniqueId }.toMutableMap() - SayanVanishAPI.getDatabase().cache = users.associateBy { it.uniqueId }.toMutableMap() - } - }, 0, settings.general.cacheUpdatePeriodTicks) - - runAsync({ - if (storageConfig.method == DatabaseType.SQL) { - SayanVanishBukkitAPI.getInstance().database.getBasicUsersAsync { users -> - (SayanVanishBukkitAPI.getInstance().database as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() - (SayanVanishAPI.getDatabase() as SQLDatabase).basicCache = users.associateBy { it.uniqueId }.toMutableMap() - } - } - }, 0, settings.general.basicCacheUpdatePeriodTicks) - - if (settings.general.bstats) { - Metrics(this, 23914).apply { - this.addCustomChart(Metrics.SingleLineChart("vanished") { - SayanVanishBukkitAPI.getInstance().getVanishedUsers().count() - }) - this.addCustomChart(Metrics.SimplePie("proxied") { - if (settings.general.proxyMode) "On Proxy" else "No Proxy" - }) - this.addCustomChart(Metrics.SimplePie("database_method") { - storageConfig.method.name - }) - } - } - } - - override fun onDisable() { - SayanVanishBukkitAPI.getInstance().database.disconnect() - StickyNote.shutdown() - } - - fun pluginFile(): File { - return this.file - } - -} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt new file mode 100644 index 00000000..51620277 --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt @@ -0,0 +1,84 @@ +package org.sayandev.sayanvanish.bukkit + +import kotlinx.coroutines.runBlocking +import org.bukkit.Bukkit +import org.bukkit.plugin.java.JavaPlugin +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.api.storage.DatabaseType +import org.sayandev.sayanvanish.api.storage.sql.SQLConfig +import org.sayandev.sayanvanish.api.storage.storageConfig +import org.sayandev.sayanvanish.bukkit.api.Metrics +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.command.SayanVanishCommand +import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.language +import org.sayandev.stickynote.bukkit.StickyNote +import org.sayandev.stickynote.bukkit.error +import org.sayandev.stickynote.loader.bukkit.StickyNoteBukkitLoader +import java.io.File + +class SayanVanishPlugin : JavaPlugin() { + + override fun onEnable() { + StickyNoteBukkitLoader(this) + setInstance(this) + + if (!Platform.setAndRegister(BukkitPlatform())) { + Bukkit.getPluginManager().disablePlugin(this) + return + } + + SayanVanishBukkitAPI() + + SettingsConfig.reload() + + if (SettingsConfig.get().general.proxyMode && storageConfig.method == DatabaseType.SQL && storageConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { + error("The `proxy-mode` is enabled, but the database method is set to SQLite, which might lead to unexpected results. If you're using proxies such as Velocity or BungeeCord, make sure to use a different database method, such as MySQL or Redis.") + } + + language + + VanishManager + + SayanVanishCommand() + + if (SettingsConfig.get().general.bstats) { + Metrics(this, 23914).apply { + this.addCustomChart(Metrics.SingleLineChart("vanished") { + VanishAPI.get().getDatabase().getVanishUsersBlocking().filter { it.isVanished }.size + }) + this.addCustomChart(Metrics.SimplePie("proxied") { + if (SettingsConfig.get().general.proxyMode) "On Proxy" else "No Proxy" + }) + this.addCustomChart(Metrics.SimplePie("database_method") { + storageConfig.method.name + }) + } + } + } + + override fun onDisable() { + runBlocking { + Platform.get().unregister() + } + StickyNote.shutdown() + } + + fun pluginFile(): File { + return this.file + } + + companion object { + private lateinit var instance: SayanVanishPlugin + + fun getInstance(): SayanVanishPlugin { + return instance + } + + private fun setInstance(plugin: SayanVanishPlugin) { + instance = plugin + } + } + +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitPlatformAdapter.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitPlatformAdapter.kt new file mode 100644 index 00000000..795ca006 --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitPlatformAdapter.kt @@ -0,0 +1,23 @@ +package org.sayandev.sayanvanish.bukkit.api + +import org.sayandev.sayanvanish.api.PlatformAdapter +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser + +object BukkitPlatformAdapter : PlatformAdapter { + override fun adapt(user: User): BukkitUser { + return BukkitUser(user.uniqueId, user.username, user.isOnline, user.serverId) + } + + override fun adapt(vanishUser: VanishUser): BukkitVanishUser { + return BukkitVanishUser(vanishUser.uniqueId, vanishUser.username).also { + it.currentOptions = vanishUser.currentOptions + it.isVanished = vanishUser.isVanished + it.vanishLevel = vanishUser.vanishLevel + } + } + + fun get(): BukkitPlatformAdapter { + return this + } +} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index 3c0a1899..2ca5ba35 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -1,13 +1,35 @@ package org.sayandev.sayanvanish.bukkit.api +import net.kyori.adventure.text.Component +import org.bukkit.Bukkit import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.stickynote.bukkit.utils.AdventureUtils +import java.util.UUID + +class BukkitUser( + override val uniqueId: UUID, + override var username: String, + override var isOnline: Boolean, + override var serverId: String +) : User { + + fun player() = Bukkit.getPlayer(uniqueId) + + fun audience() = player()?.let { AdventureUtils.senderAudience(it) } + + override fun sendMessage(content: Component) { + audience()?.sendMessage(content) + } + + override fun sendActionbar(content: Component) { + audience()?.sendActionBar(content) + } -class BukkitUser { companion object { fun Player.generateUser(): User { - return User.of( + return User.Generic( this.uniqueId, this.name, this.isOnline, diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index aa3e829f..cf03f607 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -12,6 +12,8 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Features +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent @@ -57,9 +59,6 @@ open class BukkitVanishUser( field } - - fun stateText(isVanished: Boolean = this.isVanished) = if (isVanished) "ON" else "OFF" - fun player(): Player? = Bukkit.getPlayer(uniqueId) fun offlinePlayer(): OfflinePlayer = Bukkit.getOfflinePlayer(uniqueId) @@ -82,7 +81,7 @@ open class BukkitVanishUser( // order matters - don't move hideUser before vanish (hideUser have a canSee check for vanish state notify) hideUser() - sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) + sendMessage(language.vanish.vanishStateUpdate.component(Placeholder.parsed("state", stateText()))) } override suspend fun appear(options: VanishOptions) { @@ -102,7 +101,7 @@ open class BukkitVanishUser( super.appear(options) - sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) + sendMessage(language.vanish.vanishStateUpdate.component(Placeholder.parsed("state", stateText()))) } override fun hasPermission(permission: String): Boolean { @@ -133,14 +132,6 @@ open class BukkitVanishUser( } } - override fun sendMessage(content: String, vararg placeholder: TagResolver) { - player()?.sendComponent(content, *placeholder) - } - - override fun sendActionbar(content: String, vararg placeholder: TagResolver) { - player()?.sendComponentActionbar(content, *placeholder) - } - fun hideUser() { for (onlinePlayer in onlinePlayers) { hideUser(onlinePlayer) @@ -153,8 +144,8 @@ open class BukkitVanishUser( } fun hideUser(target: Player) { - if (target.user() == null && (target.isOp || target.hasPermission(Permission.VANISH.permission()))) { - target.getOrCreateUser() + if (target.cachedUser() == null && (target.isOp || target.hasPermission(Permission.VANISH.permission()))) { + target.getCachedOrCreateUser() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt index 0ac3a7fb..180bfd2e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt @@ -11,14 +11,16 @@ import java.util.* class SayanVanishBukkitAPI { companion object { + @JvmSynthetic suspend fun UUID.user(): Deferred { return VanishAPI.get().getDatabase().getUser(this) } + @JvmSynthetic suspend fun UUID.getOrCreateUser(): User { val offlinePlayer = Bukkit.getOfflinePlayer(this) val player = offlinePlayer.player - return VanishAPI.get().getDatabase().getUser(this).await() ?: User.of( + return VanishAPI.get().getDatabase().getUser(this).await() ?: User.Generic( this, offlinePlayer.name ?: this.toString(), player != null, @@ -26,18 +28,21 @@ class SayanVanishBukkitAPI { ) } + @JvmSynthetic suspend fun UUID.getOrAddUser(): User { val user = this.getOrCreateUser() VanishAPI.get().getDatabase().saveUser(user).await() return user } + @JvmSynthetic fun UUID.cachedUser(): User? { return VanishAPI.get().getCacheService().getUsers().getUser(this) } + @JvmSynthetic fun UUID.getCachedOrCreateUser(): User { - return VanishAPI.get().getCacheService().getUsers().getUser(this) ?: User.of( + return VanishAPI.get().getCacheService().getUsers().getUser(this) ?: User.Generic( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", false, @@ -45,17 +50,20 @@ class SayanVanishBukkitAPI { ) } + @JvmSynthetic suspend fun UUID.vanishUser(): Deferred { return VanishAPI.get().getDatabase().getVanishUser(this) } + @JvmSynthetic suspend fun UUID.getOrCreateVanishUser(): VanishUser { - return VanishAPI.get().getDatabase().getVanishUser(this).await() ?: VanishUser.of( + return VanishAPI.get().getDatabase().getVanishUser(this).await() ?: VanishUser.Generic( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", ) } + @JvmSynthetic suspend fun UUID.getOrAddVanishUser(): VanishUser { val vanishUser = this.getOrCreateVanishUser() if (!VanishAPI.get().getCacheService().getVanishUsers().hasVanishUser(this)) { @@ -64,53 +72,65 @@ class SayanVanishBukkitAPI { return vanishUser } + @JvmSynthetic fun UUID.cachedVanishUser(): VanishUser? { return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) } + @JvmSynthetic fun UUID.getCachedOrCreateVanishUser(): VanishUser { - return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) ?: VanishUser.of( + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) ?: VanishUser.Generic( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", ) } + @JvmSynthetic suspend fun OfflinePlayer.user(): Deferred { return this.uniqueId.user() } + @JvmSynthetic suspend fun OfflinePlayer.getOrCreateUser(): User { return this.uniqueId.getOrCreateUser() } + @JvmSynthetic suspend fun OfflinePlayer.getOrAddUser(): User { return this.uniqueId.getOrAddUser() } + @JvmSynthetic fun OfflinePlayer.cachedUser(): User? { return this.uniqueId.cachedUser() } + @JvmSynthetic fun OfflinePlayer.getCachedOrCreateUser(): User { return this.uniqueId.getCachedOrCreateUser() } + @JvmSynthetic suspend fun OfflinePlayer.vanishUser(): Deferred { return this.uniqueId.vanishUser() } + @JvmSynthetic suspend fun OfflinePlayer.getOrCreateVanishUser(): VanishUser { return this.uniqueId.getOrCreateVanishUser() } + @JvmSynthetic suspend fun OfflinePlayer.getOrAddVanishUser(): VanishUser { return this.uniqueId.getOrAddVanishUser() } + @JvmSynthetic fun OfflinePlayer.cachedVanishUser(): VanishUser? { return this.uniqueId.cachedVanishUser() } + @JvmSynthetic fun OfflinePlayer.getCachedOrCreateVanishUser(): VanishUser { return this.uniqueId.getCachedOrCreateVanishUser() } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index a8f28909..8f7329cd 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -16,6 +16,7 @@ import org.incendo.cloud.parser.standard.StringParser import org.incendo.cloud.setting.ManagerSetting import org.incendo.cloud.suggestion.Suggestion import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.Features @@ -23,9 +24,8 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.api.utils.Paste -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.LanguageConfig import org.sayandev.sayanvanish.bukkit.config.SettingsConfig @@ -80,13 +80,13 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name val player = if (target.isPresent) context.optional("player").get() else context.sender().player() ?: return launch { - val user = player.getOrAddUser() + val user = player.getOrAddVanishUser() if (!user.hasPermission(Permission.VANISH)) { user.sendMessage(language.vanish.dontHaveUsePermission.component(Placeholder.unparsed("permission", Permission.VANISH.permission()))) } - val vanishUser = player.getOrAddVanishUser() + player.getOrAddVanishUser() val options = VanishOptions.defaultOptions().apply { if (context.flags().hasFlag("silent")) { @@ -137,7 +137,7 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name runSync { if (isSuccessful) { sender.sendComponent(language.general.updated, Placeholder.unparsed("version", updateFeature.latestVersion())) - if (settings.general.proxyMode && updateFeature.willAffectProxy()) { + if (SettingsConfig.get().general.proxyMode && updateFeature.willAffectProxy()) { sender.sendComponent(language.general.proxyUpdateWarning) } } else { @@ -151,10 +151,10 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name rawCommandBuilder().registerCopy { literalWithPermission("paste") - handler { context -> + suspendingHandler { context -> val sender = context.sender().platformSender() sender.sendComponent(language.paste.generating) - runAsync { + async { val blockedWords = listOf( "host", "port", @@ -162,35 +162,25 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name "username", "password", ) - Paste("yaml", storageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().whenComplete { databaseKey, databaseError -> - sendPasteError(sender, databaseError) - - Paste("yaml", SettingsConfig.settingsFile.readLines()).post().whenComplete { settingsKey, settingsError -> - sendPasteError(sender, settingsError) - - val latestLogFile = File(File(pluginDirectory.parentFile.parentFile, "logs"), "latest.log") - if (latestLogFile.exists()) { - Paste("log", latestLogFile.readLines()).post().whenComplete { logKey, logError -> - - val featurePastes = mutableMapOf>() - for (feature in Features.features()) { - featurePastes[feature.id] = feature.file.readLines() - } - Paste("yaml", featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }).post().whenComplete { featureKey, featureError -> - sendPasteError(sender, featureError) - generateMainPaste(sender, mapOf( - "database.yml" to "${Paste.PASTE_URL}/$databaseKey", - "settings.yml" to "${Paste.PASTE_URL}/$settingsKey", - "latest.log" to "${Paste.PASTE_URL}/$logKey", - "features" to "${Paste.PASTE_URL}/$featureKey" - )) - } - sendPasteError(sender, logError) - } - } else { - generateMainPaste(sender, mapOf("settings.yml" to "${Paste.PASTE_URL}/$settingsKey")) - } + val databaseKey = Paste("yaml", storageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().await() + val settingsKey = Paste("yaml", SettingsConfig.settingsFile.readLines()).post().await() + val latestLogFile = File(File(pluginDirectory.parentFile.parentFile, "logs"), "latest.log") + if (latestLogFile.exists()) { + val logKey = Paste("log", latestLogFile.readLines()).post().await() + + val featurePastes = mutableMapOf>() + for (feature in Features.features()) { + featurePastes[feature.id] = feature.file.readLines() } + val featureKey = Paste("yaml", featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }).post().await() + generateMainPaste(sender, mapOf( + "database.yml" to "${Paste.PASTE_URL}/$databaseKey", + "settings.yml" to "${Paste.PASTE_URL}/$settingsKey", + "latest.log" to "${Paste.PASTE_URL}/$logKey", + "features" to "${Paste.PASTE_URL}/$featureKey" + )) + } else { + generateMainPaste(sender, mapOf("settings.yml" to "${Paste.PASTE_URL}/$settingsKey")) } } } @@ -210,7 +200,7 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name Features.features.clear() Features.userFeatures.clear() RegisteredFeatureHandler.process() - settings = SettingsConfig.fromConfig() ?: SettingsConfig.defaultConfig() + SettingsConfig.reload() storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultConfig() sender.sendComponent(language.general.reloaded) } @@ -224,22 +214,22 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name literalWithPermission("set") required("player", OfflinePlayerParser.offlinePlayerParser()) required("level", IntegerParser.integerParser(0)) - handler { context -> + suspendingHandler { context -> val sender = context.sender().platformSender() val target = context.get("player") if (!target.hasPlayedBefore()) { sender.sendComponent(language.general.playerNotFound) - return@handler + return@suspendingHandler } - val user = target.getOrAddUser() + val user = target.getOrAddVanishUser() user.vanishLevel = context.get("level") user.save() if (Features.getFeature().levelMethod == FeatureLevel.LevelMethod.PERMISSION) { sender.sendComponent(language.feature.permissionLevelMethodWarning, Placeholder.unparsed("method", FeatureLevel.LevelMethod.PERMISSION.name), Placeholder.unparsed("methods", FeatureLevel.LevelMethod.entries.joinToString(", ") { it.name })) - return@handler + return@suspendingHandler } sender.sendComponent(language.vanish.levelSet, Placeholder.unparsed("level", user.vanishLevel.toString()), Placeholder.unparsed("player", user.username)) @@ -249,16 +239,16 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name levelLiteral.registerCopy { literalWithPermission("get") required("player", OfflinePlayerParser.offlinePlayerParser()) - handler { context -> + suspendingHandler { context -> val sender = context.sender().platformSender() val target = context.get("player") if (!target.hasPlayedBefore()) { sender.sendComponent(language.general.playerNotFound) - return@handler + return@suspendingHandler } - val user = target.getOrCreateUser() + val user = target.getOrCreateVanishUser() sender.sendComponent(language.vanish.levelGet, Placeholder.unparsed("player", target.name ?: "N/A"), Placeholder.unparsed("level", user.vanishLevel.toString())) } @@ -272,37 +262,37 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name val togglePlayerLiteral = featureLiteral.registerCopy { literalWithPermission("toggleplayer") optional("player", PlayerParser.playerParser()) - handler { context -> + suspendingHandler { context -> val targetArg = context.optional("player").getOrNull() val sender = context.sender().platformSender() if (targetArg != null && !sender.hasPermission(Permission.FEATURE_PLAYER_TOGGLE.permission())) { sender.sendComponent(language.feature.togglePlayerOther) - return@handler + return@suspendingHandler } if (targetArg == null && sender !is Player) { sender.sendComponent(language.general.haveToProvidePlayer) - return@handler + return@suspendingHandler } val target = targetArg ?: sender as Player val feature = Features.features.find { it.id == context.get("feature") } ?: let { sender.sendComponent(language.feature.notFound) - return@handler + return@suspendingHandler } - val user = target.user() ?: let { + val user = target.user().await() ?: let { sender.sendComponent(language.general.userNotFound, Placeholder.unparsed("player", target.name)) - return@handler + return@suspendingHandler } val userFeature = Features.userFeatures(user).find { it.id == feature.id }!! userFeature.toggle() sender.sendComponent(language.feature.togglePlayer, Placeholder.unparsed("player", target.name), Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("state", if (userFeature.enabled) "enabled" else "disabled")) - return@handler + return@suspendingHandler } } manager.command(manager.commandBuilder("togglefeature").proxies(togglePlayerLiteral.build())) @@ -437,9 +427,12 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name testLiteral.registerCopy { literalWithPermission("users") - handler { context -> + suspendingHandler { context -> + // TODO: better implementation? val sender = context.sender().platformSender() - sender.sendComponent("Vanished Users: ${SayanVanishAPI.getVanishedUsers().map { it.username }}") + sender.sendComponent("Fetching vanish users from database...") + sender.sendComponent("Database Vanished Users: ${VanishAPI.get().getVanishedUsers().await().map { it.username }}") + sender.sendComponent("Cache Vanished Users: ${VanishAPI.get().getCacheService().getVanishUsers().values.map { it.username }}") } } @@ -450,21 +443,19 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name testDatabaseLiteral.registerCopy { literalWithPermission("data") optional("limit", IntegerParser.integerParser(1, 10000)) - flag("no-cache") - handler { context -> + suspendingHandler { context -> + // TODO: better implementation? val sender = context.sender().platformSender() val limit = context.get("limit") - val database = SayanVanishAPI.getDatabase() - if (context.flags().hasFlag("no-cache")) { - database.useCache = false - } + val database = VanishAPI.get().getDatabase() - val users = database.getVanishUsers() + val counter = MilliCounter() + counter.start() + + val users = database.getVanishUsers().await() val limitedUsers = users.take(limit) - val counter = MilliCounter() - counter.start() for ((index, user) in limitedUsers.withIndex()) { val userProperties = user::class.memberProperties .filterIsInstance>() @@ -480,8 +471,6 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name } counter.stop() sender.sendComponent("Took ${counter.get()}ms") - - database.useCache = true } } @@ -489,55 +478,35 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name literalWithPermission("performance") optional("amount", IntegerParser.integerParser(1, 10000)) optional("tries", IntegerParser.integerParser(1, 10)) - flag("no-cache") - handler { context -> + suspendingHandler { context -> + // TODO: better implementation? val sender = context.sender().platformSender() val amount = context.get("amount") - val database = SayanVanishAPI.getDatabase() - if (context.flags().hasFlag("no-cache")) { - database.useCache = false - } + val database = VanishAPI.get().getDatabase() repeat(context.get("tries")) { val counter = MilliCounter() counter.start() sender.sendComponent("[${it + 1}] Trying ${amount} Get Users from data storage") repeat(amount) { - database.getVanishUsers() + database.getVanishUsers().await() } counter.stop() sender.sendComponent("[${it + 1}] Took ${counter.get()}ms") } - - database.useCache = true } } } - private fun sendPasteError(sender: CommandSender, error: Throwable?) { - if (error != null) { - runSync { - sender.sendComponent(language.paste.failedToGenerate) - } - error.printStackTrace() - } - } - - private fun generateMainPaste(sender: CommandSender, otherKeys: Map) { - Paste("json", listOf(ServerUtils.getServerData( + private suspend fun generateMainPaste(sender: CommandSender, otherKeys: Map) { + val key = Paste("json", listOf(ServerUtils.getServerData( mutableMapOf( "database-type" to storageConfig.method.toString(), ).apply { this.putAll(otherKeys) } - )) - ).post().whenComplete { key, generalError -> - sendPasteError(sender, generalError) - - runSync { - sender.sendComponent(language.paste.use.replace("", key ?: "N/A")) - } - } + ))).post().await() + sender.sendComponent(language.paste.use.replace("", key ?: "N/A")) } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt index 072e3190..2f5f33e7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt @@ -10,17 +10,13 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.utils.DownloadUtils import org.sayandev.sayanvanish.api.utils.HangarUtils import org.sayandev.sayanvanish.api.utils.VersionInfo +import org.sayandev.sayanvanish.bukkit.SayanVanishPlugin import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.config.settings +import org.sayandev.sayanvanish.bukkit.config.SettingsConfig import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanvanish.bukkit.sayanvanish import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendRawComponent -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.log -import org.sayandev.stickynote.bukkit.plugin -import org.sayandev.stickynote.bukkit.runAsync -import org.sayandev.stickynote.bukkit.runSync +import org.sayandev.stickynote.bukkit.* import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment import java.io.File @@ -52,7 +48,7 @@ class FeatureUpdate( @Comment("The content of the update request message") val updateRequestContent: List = listOf( "A new version of SayanVanish is available!", - "Click to update'>You can install version by clicking on this message", + "Click to update'>You can install version by clicking on this message", "Make sure to read the changelog before doing any update to prevent unexpected behaviors", ) ) : ListenedFeature("update") { @@ -91,7 +87,7 @@ class FeatureUpdate( val user = player.user() ?: return if (!isActive(user)) return if (notifyOnJoin && player.hasPermission(notifyPermission) && latestRelease != null && latestSnapshot != null) { - if (!settings.general.proxyMode) { + if (!SettingsConfig.get().general.proxyMode) { sendUpdateNotification(player) } @@ -102,7 +98,7 @@ class FeatureUpdate( } private fun sendUpdateNotification(sender: CommandSender) { - if (!isNewerVersionAvailable(notifyForSnapshotBuilds) || settings.general.proxyMode) return + if (!isNewerVersionAvailable(notifyForSnapshotBuilds) || SettingsConfig.get().general.proxyMode) return for (line in updateNotificationContent) { sender.sendRawComponent(line @@ -145,11 +141,11 @@ class FeatureUpdate( val future = CompletableFuture() if (!isNewerVersionAvailable(notifyForSnapshotBuilds)) future.complete(false) - val updateDirectory = File(sayanvanish.dataFolder.parentFile, "update") + val updateDirectory = File(plugin.dataFolder.parentFile, "update") val updatedFile = if (StickyNote.isPaper) { if (!updateDirectory.exists()) { updateDirectory.mkdirs() } - File(updateDirectory, sayanvanish.pluginFile().name) - } else sayanvanish.pluginFile() + File(updateDirectory, SayanVanishPlugin.getInstance().pluginFile().name) + } else SayanVanishPlugin.getInstance().pluginFile() if (plugin.description.version.contains("SNAPSHOT")) { latestSnapshot?.let { snapshot -> diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt index 5f67729d..8db8a7f2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt @@ -1,12 +1,10 @@ package org.sayandev.sayanvanish.bukkit.utils import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver -import org.bukkit.OfflinePlayer import org.bukkit.command.CommandSender +import org.sayandev.sayanvanish.bukkit.config.SettingsConfig import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.config.settings import org.sayandev.stickynote.bukkit.utils.AdventureUtils -import org.sayandev.stickynote.bukkit.warn object PlayerUtils { @@ -14,7 +12,7 @@ object PlayerUtils { if (content.isBlank()) return val prefix = language.general.prefix - AdventureUtils.sendComponent(this, if (settings.general.includePrefixInMessages) { + AdventureUtils.sendComponent(this, if (SettingsConfig.get().general.includePrefixInMessages) { prefix + content } else { content diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/ServerUtils.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/ServerUtils.kt index d3d46df0..bd4b59d3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/ServerUtils.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/ServerUtils.kt @@ -4,6 +4,7 @@ import com.google.gson.GsonBuilder import com.google.gson.JsonArray import com.google.gson.JsonObject import org.bukkit.plugin.Plugin +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.plugin @@ -15,7 +16,7 @@ object ServerUtils { val gson = GsonBuilder().setPrettyPrinting().create() - fun getServerData(additionalData: Map = emptyMap()): String { + suspend fun getServerData(additionalData: Map = emptyMap()): String { val jsonObject = JsonObject() jsonObject.add("paste-info", JsonObject().apply { this.addProperty("instant", Instant.now().toString()) @@ -45,7 +46,7 @@ object ServerUtils { }) jsonObject.add("vanished-users", JsonArray().apply { - SayanVanishBukkitAPI.getInstance().getVanishedUsers().map { it.username }.forEach(this::add) + VanishAPI.get().getDatabase().getVanishUsers().await().map { it.username }.forEach(this::add) }) jsonObject.add("plugin", serializePlugin(plugin)) From df95a2e973fa8aeab77962c8adfe3d402fea7d13 Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 17 Jul 2025 18:14:43 +0330 Subject: [PATCH 24/67] chore: update some todos --- .../kotlin/org/sayandev/sayanvanish/api/Platform.kt | 11 ++++++++++- .../api/message/types/RedisMessagingService.kt | 1 + .../sayanvanish/bukkit/config/SettingsConfig.kt | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index 01935a3c..f2c018c6 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.api +import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.storage.TransactionDatabase import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import java.io.File @@ -16,10 +17,18 @@ open class Platform( open suspend fun register() { } + fun registerBlocking() { + runBlocking { register() } + } + open suspend fun unregister() { VanishAPI.get().getDatabase().disconnect().await() } + fun unregisterBlocking() { + runBlocking { unregister() } + } + companion object { private var currentPlatform = Platform( "sayanvanish", @@ -47,7 +56,7 @@ open class Platform( @JvmStatic fun setAndRegister(platform: Platform): Boolean { setPlatform(platform) - platform.register() + platform.registerBlocking() (VanishAPI.get().getDatabase() as? TransactionDatabase)?.let { if (!it.databaseConnected) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index 8d770475..bb709d0e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -18,6 +18,7 @@ import org.sayandev.stickynote.core.messaging.PayloadWrapper import org.sayandev.stickynote.core.messaging.redis.RedisConnectionMeta import org.sayandev.stickynote.core.messaging.redis.RedisPublisher +// TODO: can't you merge some parts of publisher in another class since both redis and websocket has the same publisher interface? class RedisMessagingService( val config: RedisConfig, override val dispatcher: AsyncDispatcher diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt index 95b40910..9bff8726 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt @@ -8,6 +8,8 @@ import org.spongepowered.configurate.objectmapping.meta.Comment import java.io.File import java.util.* +// TODO: Rename SettingsConfig to just `Settings` maybe? +// TODO: switch to kotlinx-serialization for yaml too? @ConfigSerializable class SettingsConfig( @Comment(""" From 9436fa49c03537665ff761a0c8b125a4d7353f77 Mon Sep 17 00:00:00 2001 From: Syren Date: Thu, 17 Jul 2025 18:15:21 +0330 Subject: [PATCH 25/67] chore: make suspending register/unregister methods inside Platform JvmSynthetic --- .../src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index f2c018c6..d3971b7c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -15,12 +15,14 @@ open class Platform( val adapter: PlatformAdapter, ) { + @JvmSynthetic open suspend fun register() { } fun registerBlocking() { runBlocking { register() } } + @JvmSynthetic open suspend fun unregister() { VanishAPI.get().getDatabase().disconnect().await() } From e78c040704412198ed1731d5097e0a6c4e9b6e8d Mon Sep 17 00:00:00 2001 From: Syren Date: Fri, 18 Jul 2025 12:35:39 +0330 Subject: [PATCH 26/67] chore: the project compiles for bukkit module --- .../org/sayandev/sayanvanish/api/User.kt | 21 +++++++- .../sayandev/sayanvanish/api/VanishUser.kt | 30 ++++++++--- .../message/types/RedisMessagingService.kt | 17 +++++- .../api/storage/redis/RedisDatabase.kt | 6 +-- .../api/storage/sql/SQLDatabase.kt | 9 ++-- .../sayanvanish/bukkit/BukkitPlatform.kt | 4 +- .../sayanvanish/bukkit/SayanVanishPlugin.kt | 10 ++-- .../sayanvanish/bukkit/VanishManager.kt | 30 +++++++---- .../sayanvanish/bukkit/api/BukkitUser.kt | 4 +- .../bukkit/api/BukkitVanishUser.kt | 15 ++---- .../bukkit/api/SayanVanishBukkitAPI.kt | 6 +-- .../bukkit/command/SayanVanishCommand.kt | 10 ++-- .../bukkit/config/LanguageConfig.kt | 4 +- .../config/{SettingsConfig.kt => Settings.kt} | 12 ++--- .../feature/features/FeatureActionbar.kt | 11 ++-- .../feature/features/FeatureFakeMessage.kt | 9 ++-- .../bukkit/feature/features/FeatureFly.kt | 3 +- .../feature/features/FeatureGameMode.kt | 5 +- .../features/FeatureInventoryInspect.kt | 5 +- .../bukkit/feature/features/FeatureLevel.kt | 29 ++++++----- .../features/FeatureProxyVanishQueue.kt | 52 ------------------- .../feature/features/FeatureRideEntity.kt | 6 ++- .../features/FeatureSilentContainer.kt | 5 +- .../bukkit/feature/features/FeatureState.kt | 41 ++++++++++----- .../bukkit/feature/features/FeatureUpdate.kt | 11 ++-- .../features/hook/AdvancedServerListImpl.kt | 37 ++++++------- .../features/hook/FeatureHookCitizens.kt | 9 +++- .../features/hook/FeatureHookEssentials.kt | 5 +- .../hook/FeatureHookMiniPlaceholders.kt | 29 ++++------- .../hook/FeatureHookPlaceholderAPI.kt | 27 ++++------ .../feature/features/hook/FeatureHookTAB.kt | 15 +++--- .../features/hook/FeatureLuckPermsHook.kt | 3 +- .../FeaturePreventAdvancementAnnounce.kt | 4 +- .../prevent/FeaturePreventBlockBreak.kt | 3 +- .../prevent/FeaturePreventBlockGrief.kt | 3 +- .../prevent/FeaturePreventBlockPlace.kt | 3 +- .../features/prevent/FeaturePreventChat.kt | 6 ++- .../prevent/FeaturePreventCreatureTarget.kt | 3 +- .../features/prevent/FeaturePreventDamage.kt | 3 +- .../prevent/FeaturePreventInteract.kt | 7 +-- .../features/prevent/FeaturePreventPickup.kt | 5 +- .../prevent/FeaturePreventRaidTrigger.kt | 3 +- .../features/prevent/FeaturePreventSculk.kt | 5 +- .../prevent/FeaturePreventServerPing.kt | 4 +- .../prevent/FeaturePreventSpawnerSpawn.kt | 3 +- .../prevent/FeaturePreventTabComplete.kt | 6 ++- .../prevent/PreventFoodLevelChange.kt | 3 +- .../sayanvanish/bukkit/utils/PlayerUtils.kt | 4 +- 48 files changed, 290 insertions(+), 255 deletions(-) rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/{SettingsConfig.kt => Settings.kt} (92%) delete mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureProxyVanishQueue.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 4972cbf0..afb27737 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -7,7 +7,6 @@ import kotlinx.coroutines.awaitAll import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking import net.kyori.adventure.text.Component -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import org.sayandev.stickynote.core.utils.async @@ -116,6 +115,26 @@ interface User { }.asCompletableFuture() } + suspend fun delete(): Deferred { + val deferred = CompletableDeferred() + async(VanishAPI.get().getDatabase().dispatcher) { + VanishAPI.get().getDatabase().removeUser(uniqueId).await() + VanishAPI.get().getMessagingService().syncUser(this@User).await() + VanishAPI.get().getCacheService().getUsers().remove(uniqueId) + + val vanishedUser = VanishAPI.get().getDatabase().getVanishUser(uniqueId).await() + if (vanishedUser != null) { + VanishAPI.get().getDatabase().removeVanishUser(uniqueId).await() + VanishAPI.get().getMessagingService().syncVanishUser(vanishedUser).await() + VanishAPI.get().getCacheService().getVanishUsers().remove(uniqueId) + } + + deferred.complete(true) + } + + return deferred + } + /** * Synchronizes the user data with the messaging service asynchronously. * diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index e15c5254..707247ee 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.User.Companion.user import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.stickynote.core.utils.async +import org.sayandev.stickynote.core.utils.launch import java.lang.reflect.Type import java.util.* import java.util.concurrent.CompletableFuture @@ -24,21 +25,25 @@ interface VanishUser : User { // TODO: better implementation for this fun stateText(isVanished: Boolean = this.isVanished) = if (isVanished) "ON" else "OFF" - suspend fun disappear(options: VanishOptions) { + fun disappear(options: VanishOptions) { isVanished = true - save() + launch(VanishAPI.get().getDatabase().dispatcher) { + save() + } } - suspend fun disappear() { + fun disappear() { disappear(VanishOptions.defaultOptions()) } - suspend fun appear(options: VanishOptions) { + fun appear(options: VanishOptions) { isVanished = false - save() + launch(VanishAPI.get().getDatabase().dispatcher) { + save() + } } - suspend fun appear() { + fun appear() { appear(VanishOptions.defaultOptions()) } @@ -84,8 +89,17 @@ interface VanishUser : User { }.asCompletableFuture() } - suspend fun delete() { - VanishAPI.get().getDatabase().removeVanishUser(uniqueId) + override suspend fun delete(): Deferred { + val deferred = CompletableDeferred() + async(VanishAPI.get().getDatabase().dispatcher) { + VanishAPI.get().getDatabase().removeVanishUser(uniqueId).await() + VanishAPI.get().getMessagingService().syncVanishUser(this@VanishUser).await() + VanishAPI.get().getCacheService().getVanishUsers().remove(uniqueId) + + deferred.complete(true) + } + + return deferred } @JvmSynthetic diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index bb709d0e..b9162fdf 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -17,6 +17,7 @@ import org.sayandev.stickynote.core.messaging.PayloadBehaviour import org.sayandev.stickynote.core.messaging.PayloadWrapper import org.sayandev.stickynote.core.messaging.redis.RedisConnectionMeta import org.sayandev.stickynote.core.messaging.redis.RedisPublisher +import org.sayandev.stickynote.core.utils.async // TODO: can't you merge some parts of publisher in another class since both redis and websocket has the same publisher interface? class RedisMessagingService( @@ -42,7 +43,13 @@ class RedisMessagingService( Platform.get().logger ) { override fun handle(payload: User): Boolean? { - VanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) + async(VanishAPI.get().getDatabase().dispatcher) { + if (VanishAPI.get().getDatabase().hasUser(payload.uniqueId).await()) { + VanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) + } else { + VanishAPI.get().getCacheService().getUsers().remove(payload.uniqueId) + } + } return true } @@ -62,7 +69,13 @@ class RedisMessagingService( Platform.get().logger ) { override fun handle(payload: VanishUser): Boolean? { - VanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) + async(VanishAPI.get().getDatabase().dispatcher) { + if (VanishAPI.get().getDatabase().hasVanishUser(payload.uniqueId).await()) { + VanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) + } else { + VanishAPI.get().getCacheService().getVanishUsers().remove(payload.uniqueId) + } + } return true } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt index 399919d9..4d3b0995 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt @@ -49,7 +49,7 @@ class RedisDatabase( redis.resource.use { it.hget("vanish_users", uniqueId.toString()) ?.let { - VanishUser.fromJson(it) + Gson.get().fromJson(JsonParser.parseString(it), VanishUser::class.java) } } } @@ -60,7 +60,7 @@ class RedisDatabase( redis.resource.use { it.hgetAll("vanish_users") .map { - VanishUser.fromJson(it.value) + Gson.get().fromJson(JsonParser.parseString(it.value), VanishUser::class.java) } } } @@ -91,7 +91,7 @@ class RedisDatabase( override suspend fun saveVanishUser(user: VanishUser): Deferred { return async { redis.resource.use { - it.hset("vanish_users", user.uniqueId.toString(), user.toJson()) != 0L + it.hset("vanish_users", user.uniqueId.toString(), Gson.get().toJson(user)) != 0L } } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index 67c4d6a0..042f4555 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -81,7 +81,7 @@ class SQLDatabase( .selectAll() .firstOrNull { it[VanishUser.Schema.uniqueId] == uniqueId } ?.let { result -> - VanishUser.of( + VanishUser.Generic( result[VanishUser.Schema.uniqueId], result[User.Schema.username], result[User.Schema.serverId], @@ -98,7 +98,8 @@ class SQLDatabase( (VanishUser.Schema innerJoin User.Schema) .selectAll() .map { result -> - VanishUser.of( + // TODO: maybe add a fromResult method to VanishUser and User? + VanishUser.Generic( result[VanishUser.Schema.uniqueId], result[User.Schema.username], result[User.Schema.serverId], @@ -116,7 +117,7 @@ class SQLDatabase( .selectAll() .firstOrNull { it[User.Schema.uniqueId] == uniqueId } ?.let { result -> - User.of( + User.Generic( result[User.Schema.uniqueId], result[User.Schema.username], result[User.Schema.isOnline], @@ -131,7 +132,7 @@ class SQLDatabase( User.Schema .selectAll() .map { result -> - User.of( + User.Generic( result[User.Schema.uniqueId], result[User.Schema.username], result[User.Schema.isOnline], diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt index abc15c5d..8fa53283 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt @@ -2,7 +2,7 @@ package org.sayandev.sayanvanish.bukkit import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter -import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.pluginDirectory @@ -11,6 +11,6 @@ class BukkitPlatform : Platform( plugin.name, plugin.logger, pluginDirectory, - SettingsConfig.get().general.serverId, + Settings.get().general.serverId, BukkitPlatformAdapter ) \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt index 51620277..28425267 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt @@ -11,7 +11,7 @@ import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.bukkit.api.Metrics import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.command.SayanVanishCommand -import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.error @@ -31,9 +31,9 @@ class SayanVanishPlugin : JavaPlugin() { SayanVanishBukkitAPI() - SettingsConfig.reload() + Settings.reload() - if (SettingsConfig.get().general.proxyMode && storageConfig.method == DatabaseType.SQL && storageConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { + if (Settings.get().general.proxyMode && storageConfig.method == DatabaseType.SQL && storageConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { error("The `proxy-mode` is enabled, but the database method is set to SQLite, which might lead to unexpected results. If you're using proxies such as Velocity or BungeeCord, make sure to use a different database method, such as MySQL or Redis.") } @@ -43,13 +43,13 @@ class SayanVanishPlugin : JavaPlugin() { SayanVanishCommand() - if (SettingsConfig.get().general.bstats) { + if (Settings.get().general.bstats) { Metrics(this, 23914).apply { this.addCustomChart(Metrics.SingleLineChart("vanished") { VanishAPI.get().getDatabase().getVanishUsersBlocking().filter { it.isVanished }.size }) this.addCustomChart(Metrics.SimplePie("proxied") { - if (SettingsConfig.get().general.proxyMode) "On Proxy" else "No Proxy" + if (Settings.get().general.proxyMode) "On Proxy" else "No Proxy" }) this.addCustomChart(Metrics.SimplePie("database_method") { storageConfig.method.name diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt index 268eadbb..71c38516 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt @@ -5,9 +5,13 @@ import org.bukkit.event.EventPriority import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent -import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI -import org.sayandev.sayanvanish.bukkit.config.settings +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser +import org.sayandev.sayanvanish.bukkit.config.Settings +import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.registerListener object VanishManager : Listener { @@ -17,25 +21,31 @@ object VanishManager : Listener { } @EventHandler - private fun addBasicUserOnJoin(event: PlayerJoinEvent) { - if (settings.general.proxyMode) return + private fun addUserOnJoin(event: PlayerJoinEvent) { + if (Settings.get().general.proxyMode) return val player = event.player - SayanVanishAPI.getDatabase().addUser(User.of(player.uniqueId, player.name, null)) + launch { + player.getOrAddUser() + } } @EventHandler - private fun removeBasicUserOnQuit(event: PlayerQuitEvent) { - if (settings.general.proxyMode) return + private fun makeUserOfflineOnQuit(event: PlayerQuitEvent) { + if (Settings.get().general.proxyMode) return val player = event.player - SayanVanishAPI.getDatabase().cache.remove(player.uniqueId) - SayanVanishAPI.getDatabase().removeUser(player.uniqueId) + + launch { + val user = player.getCachedOrCreateUser() + user.isOnline = false + user.save() + } } @EventHandler(priority = EventPriority.LOWEST) private fun hideVanishedPlayersOnJoin(event: PlayerJoinEvent) { - for (user in SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { it.isVanished && it.player() != null }) { + for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().map { BukkitPlatformAdapter.adapt(it) }.filter { it.player() != null }) { user.hideUser(event.player) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index 2ca5ba35..e22acf2a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component import org.bukkit.Bukkit import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.stickynote.bukkit.utils.AdventureUtils import java.util.UUID @@ -33,7 +33,7 @@ class BukkitUser( this.uniqueId, this.name, this.isOnline, - SettingsConfig.get().serverId() + Settings.get().serverId() ) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index cf03f607..0b0e4d81 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -1,7 +1,6 @@ package org.sayandev.sayanvanish.bukkit.api import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.Bukkit import org.bukkit.OfflinePlayer import org.bukkit.entity.Player @@ -14,16 +13,12 @@ import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel import org.sayandev.sayanvanish.bukkit.feature.features.hook.FeatureLuckPermsHook -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent -import org.sayandev.stickynote.bukkit.extension.sendComponentActionbar import org.sayandev.stickynote.bukkit.hasPlugin import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.plugin @@ -37,10 +32,10 @@ open class BukkitVanishUser( override var username: String ) : VanishUser { - override var serverId = SettingsConfig.get().general.serverId + override var serverId = Settings.get().general.serverId override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false - override var isOnline: Boolean = if (!SettingsConfig.get().general.proxyMode) { + override var isOnline: Boolean = if (!Settings.get().general.proxyMode) { Bukkit.getPlayer(uniqueId) != null } else { VanishAPI.get().getCacheService().getUsers()[uniqueId]?.isOnline ?: false @@ -62,7 +57,7 @@ open class BukkitVanishUser( fun player(): Player? = Bukkit.getPlayer(uniqueId) fun offlinePlayer(): OfflinePlayer = Bukkit.getOfflinePlayer(uniqueId) - override suspend fun disappear(options: VanishOptions) { + override fun disappear(options: VanishOptions) { val vanishEvent = BukkitUserVanishEvent(this, options) server.pluginManager.callEvent(vanishEvent) if (vanishEvent.isCancelled) return @@ -84,7 +79,7 @@ open class BukkitVanishUser( sendMessage(language.vanish.vanishStateUpdate.component(Placeholder.parsed("state", stateText()))) } - override suspend fun appear(options: VanishOptions) { + override fun appear(options: VanishOptions) { val unVanishEvent = BukkitUserUnVanishEvent(this, options) server.pluginManager.callEvent(unVanishEvent) if (unVanishEvent.isCancelled) return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt index 180bfd2e..4979ae3d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt @@ -6,7 +6,7 @@ import org.bukkit.OfflinePlayer import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.Settings import java.util.* class SayanVanishBukkitAPI { @@ -24,7 +24,7 @@ class SayanVanishBukkitAPI { this, offlinePlayer.name ?: this.toString(), player != null, - SettingsConfig.get().serverId() + Settings.get().serverId() ) } @@ -46,7 +46,7 @@ class SayanVanishBukkitAPI { this, Bukkit.getOfflinePlayer(this).name ?: "N/A", false, - SettingsConfig.get().serverId() + Settings.get().serverId() ) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 8f7329cd..9afbd7e1 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -28,7 +28,7 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrA import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.LanguageConfig -import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel import org.sayandev.sayanvanish.bukkit.feature.features.FeatureUpdate @@ -46,7 +46,7 @@ import kotlin.jvm.optionals.getOrNull import kotlin.reflect.KProperty1 import kotlin.reflect.full.memberProperties -class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name, *SettingsConfig.get().vanishCommand.aliases.toTypedArray()) { +class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Settings.get().vanishCommand.aliases.toTypedArray()) { override fun rootBuilder(builder: MutableCommandBuilder) { builder.permission("${plugin.name}.commands.use") @@ -137,7 +137,7 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name runSync { if (isSuccessful) { sender.sendComponent(language.general.updated, Placeholder.unparsed("version", updateFeature.latestVersion())) - if (SettingsConfig.get().general.proxyMode && updateFeature.willAffectProxy()) { + if (Settings.get().general.proxyMode && updateFeature.willAffectProxy()) { sender.sendComponent(language.general.proxyUpdateWarning) } } else { @@ -163,7 +163,7 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name "password", ) val databaseKey = Paste("yaml", storageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().await() - val settingsKey = Paste("yaml", SettingsConfig.settingsFile.readLines()).post().await() + val settingsKey = Paste("yaml", Settings.settingsFile.readLines()).post().await() val latestLogFile = File(File(pluginDirectory.parentFile.parentFile, "logs"), "latest.log") if (latestLogFile.exists()) { val logKey = Paste("log", latestLogFile.readLines()).post().await() @@ -200,7 +200,7 @@ class SayanVanishCommand : BukkitCommand(SettingsConfig.get().vanishCommand.name Features.features.clear() Features.userFeatures.clear() RegisteredFeatureHandler.process() - SettingsConfig.reload() + Settings.reload() storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultConfig() sender.sendComponent(language.general.reloaded) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt index 94425ab0..e18c021b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt @@ -13,7 +13,7 @@ class LanguageConfig( val vanish: Vanish = Vanish(), val feature: Feature = Feature(), val paste: Paste = Paste() -) : Config(languageDirectory, "${SettingsConfig.get().general.language}.yml") { +) : Config(languageDirectory, "${Settings.get().general.language}.yml") { @ConfigSerializable data class General( @@ -86,7 +86,7 @@ class LanguageConfig( @JvmStatic fun fromConfig(): LanguageConfig? { - return fromConfig(File(languageDirectory, "${SettingsConfig.get().general.language}.yml")) + return fromConfig(File(languageDirectory, "${Settings.get().general.language}.yml")) } } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt similarity index 92% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt rename to sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt index 9bff8726..ad35e1b4 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/SettingsConfig.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt @@ -11,7 +11,7 @@ import java.util.* // TODO: Rename SettingsConfig to just `Settings` maybe? // TODO: switch to kotlinx-serialization for yaml too? @ConfigSerializable -class SettingsConfig( +class Settings( @Comment(""" Do NOT copy and paste the SayanVanish directory across multiple servers. The server-id is generated during the plugin's first startup. @@ -78,13 +78,13 @@ class SettingsConfig( var config = fromConfig() ?: defaultConfig() @JvmStatic - fun defaultConfig(): SettingsConfig { - return SettingsConfig().also { it.save() } + fun defaultConfig(): Settings { + return Settings().also { it.save() } } @JvmStatic - fun fromConfig(): SettingsConfig? { - return fromConfig(settingsFile) + fun fromConfig(): Settings? { + return fromConfig(settingsFile) } @JvmStatic @@ -93,7 +93,7 @@ class SettingsConfig( } @JvmStatic - fun get(): SettingsConfig { + fun get(): Settings { return config } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt index ce64a8f5..81543868 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt @@ -1,15 +1,18 @@ package org.sayandev.sayanvanish.bukkit.feature.features +import net.kyori.adventure.text.Component import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote.runSync import org.sayandev.stickynote.bukkit.onlinePlayers +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment @@ -28,21 +31,21 @@ class FeatureActionbar( private fun onVanish(event: BukkitUserVanishEvent) { val user = event.user if (!isActive(user)) return - user.sendActionbar(content) + user.sendActionbar(content.component()) } @EventHandler private fun onUnVanish(event: BukkitUserUnVanishEvent) { val user = event.user if (!isActive(user)) return - user.sendActionbar("") + user.sendActionbar(Component.empty()) } override fun enable() { runSync({ - for (user in onlinePlayers.filter { it.hasPermission(Permission.VANISH.permission()) }.mapNotNull { it.user() }.filter { it.isVanished }) { + for (user in onlinePlayers.filter { it.hasPermission(Permission.VANISH.permission()) }.mapNotNull { it.cachedVanishUser() }.filter { it.isVanished }) { if (!isActive(user)) continue - user.sendActionbar(content) + user.sendActionbar(content.component()) } }, delay, period) super.enable() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt index 4ea431f1..f6e20a7b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt @@ -9,6 +9,7 @@ import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent @@ -55,7 +56,7 @@ class FeatureFakeMessage( @EventHandler(priority = EventPriority.LOWEST) private fun onJoin(event: PlayerJoinEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (!user.isVanished && !user.hasPermission(Permission.VANISH_ON_JOIN)) return if (disableJoinMessageIfVanished) { @@ -65,7 +66,7 @@ class FeatureFakeMessage( @EventHandler(priority = EventPriority.LOWEST) private fun onQuit(event: PlayerQuitEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (!user.isVanished) return if (disableQuitMessageIfVanished) { @@ -75,7 +76,7 @@ class FeatureFakeMessage( @EventHandler(priority = EventPriority.HIGHEST) private fun onJoinLast(event: PlayerJoinEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (!user.isVanished && !user.hasPermission(Permission.VANISH_ON_JOIN)) return if (disableJoinMessageIfVanished) { @@ -85,7 +86,7 @@ class FeatureFakeMessage( @EventHandler(priority = EventPriority.HIGHEST) private fun onQuitLast(event: PlayerQuitEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (!user.isVanished) return if (disableQuitMessageIfVanished) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt index 2ebf39db..158d7afa 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt @@ -8,6 +8,7 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment @@ -33,7 +34,7 @@ class FeatureFly( val user = event.user if (!isActive(user)) return if (!user.hasPermission(Permission.FLY_KEEP_AFTER_REAPPEAR) && disableOnReappear) { - user.sendMessage(language.feature.flyDisabled) + user.sendMessage(language.feature.flyDisabled.component()) user.player()?.allowFlight = false user.player()?.isFlying = false } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt index ac68b238..3e5b65e7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt @@ -6,6 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerGameModeChangeEvent import org.bukkit.event.player.PlayerToggleSneakEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote.runSync import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user @@ -33,7 +34,7 @@ class FeatureGameMode( private fun onToggleSneak(event: PlayerToggleSneakEvent) { if (!checkToggleSneak) return val player = event.player - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!player.isSneaking || !user.isVanished || !isActive(user)) return if (sneakList.contains(player)) { if (player.gameMode == GameMode.SPECTATOR) { @@ -61,7 +62,7 @@ class FeatureGameMode( private fun onGameModeChange(event: PlayerGameModeChangeEvent) { if (!checkGameModeChange) return val player = event.player - if (player.user()?.isVanished != false) return + if (player.cachedVanishUser()?.isVanished != false) return sneakMap[player] = event.newGameMode } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt index 39365493..f5eecd10 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt @@ -9,6 +9,7 @@ import org.bukkit.event.inventory.InventoryType import org.bukkit.event.player.PlayerInteractAtEntityEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.plugin @@ -26,7 +27,7 @@ class FeatureInventoryInspect( @EventHandler(priority = EventPriority.HIGHEST) private fun onInteractPlayer(event: PlayerInteractAtEntityEvent) { val player = event.player - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!isActive(user)) return if (player.openInventory.type != InventoryType.CRAFTING) return if (!user.isVanished) return @@ -39,7 +40,7 @@ class FeatureInventoryInspect( @EventHandler private fun onClickPlayerInventory(event: InventoryClickEvent) { val player = event.whoClicked as? Player ?: return - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!isActive(user)) return if (!playerInventoryMap.contains(player.uniqueId)) return if (player.hasPermission(modificationPermission)) return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt index 03c7898f..b6111622 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt @@ -6,9 +6,12 @@ import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerGameModeChangeEvent import org.bukkit.event.player.PlayerJoinEvent import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent @@ -45,7 +48,7 @@ class FeatureLevel( if (!isActive(user)) return runSync({ for (onlinePlayer in onlinePlayers.filter { it.uniqueId != user.uniqueId }) { - val playerVanishLevel = onlinePlayer.user()?.vanishLevel ?: -1 + val playerVanishLevel = onlinePlayer.cachedVanishUser()?.vanishLevel ?: -1 if (playerVanishLevel < user.vanishLevel || !onlinePlayer.hasPermission(Permission.VANISH.permission())) { user.player()?.let { player -> hidePlayer(onlinePlayer, player) @@ -66,7 +69,7 @@ class FeatureLevel( if (!isActive(user) || !seeAsSpectator) return runSync({ for (onlinePlayer in onlinePlayers.filter { it.uniqueId != user.uniqueId }) { - val playerVanishLevel = onlinePlayer.user()?.vanishLevel ?: -1 + val playerVanishLevel = onlinePlayer.cachedVanishUser()?.vanishLevel ?: -1 if (playerVanishLevel >= user.vanishLevel) { user.player()?.let { player -> onlinePlayer.sendPacket(PacketUtils.getUpdateGameModePacket(NMSUtils.getServerPlayer(player), player.gameMode)) } } @@ -77,11 +80,11 @@ class FeatureLevel( @EventHandler private fun onGameModeChange(event: PlayerGameModeChangeEvent) { val player = event.player - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user) || !seeAsSpectator) return if (!user.isVanished) return for (onlinePlayer in onlinePlayers.filter { it.uniqueId != user.uniqueId }) { - val playerVanishLevel = onlinePlayer.user()?.vanishLevel ?: -1 + val playerVanishLevel = onlinePlayer.cachedVanishUser()?.vanishLevel ?: -1 if (playerVanishLevel >= user.vanishLevel) { runSync({ onlinePlayer.sendPacket(PacketUtils.getUpdateGameModePacket(NMSUtils.getServerPlayer(player), GameMode.SPECTATOR)) @@ -96,12 +99,12 @@ class FeatureLevel( @EventHandler private fun onPlayerJoin(event: PlayerJoinEvent) { val player = event.player - val user = player.user() - if (((user != null && !isActive(user) || !isActive())) || !seeAsSpectator) return + val vanishUser = player.cachedVanishUser() + if (((vanishUser != null && !isActive(vanishUser) || !isActive())) || !seeAsSpectator) return runSync({ - val playerVanishLevel = player.user()?.vanishLevel ?: -1 - for (user in SayanVanishBukkitAPI.getInstance().getVanishedUsers().filter { it.player() != null && it.uniqueId != player.uniqueId }) { - val vanishedPlayer = user.player() ?: continue + val playerVanishLevel = player.cachedVanishUser()?.vanishLevel ?: -1 + for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { BukkitPlatformAdapter.adapt(it).player() != null && it.uniqueId != player.uniqueId }) { + val vanishedPlayer = BukkitPlatformAdapter.adapt(user).player() ?: continue if (playerVanishLevel >= user.vanishLevel && user.hasPermission(Permission.VANISH.permission())) { player.sendPacket(PacketUtils.getUpdateGameModePacket(NMSUtils.getServerPlayer(vanishedPlayer), GameMode.SPECTATOR)) } @@ -112,12 +115,12 @@ class FeatureLevel( @EventHandler private fun hideOthersOnJoin(event: PlayerJoinEvent) { val player = event.player - val user = player.user() + val user = player.cachedVanishUser() if ((user != null && !isActive(user)) || !isActive()) return runSync({ - val playerVanishLevel = player.user()?.vanishLevel ?: -1 - for (user in SayanVanishBukkitAPI.getInstance().getVanishedUsers().filter { it.player() != null && it.uniqueId != player.uniqueId }) { - val vanishedPlayer = user.player() ?: continue + val playerVanishLevel = player.cachedVanishUser()?.vanishLevel ?: -1 + for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { BukkitPlatformAdapter.adapt(it).player() != null && it.uniqueId != player.uniqueId }) { + val vanishedPlayer = BukkitPlatformAdapter.adapt(user).player() ?: continue if (playerVanishLevel < user.vanishLevel || !player.hasPermission(Permission.VANISH.permission())) { hidePlayer(player, vanishedPlayer) player.sendPacket(PacketUtils.getRemoveEntitiesPacket(vanishedPlayer.entityId)) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureProxyVanishQueue.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureProxyVanishQueue.kt deleted file mode 100644 index bfc247cd..00000000 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureProxyVanishQueue.kt +++ /dev/null @@ -1,52 +0,0 @@ -package org.sayandev.sayanvanish.bukkit.feature.features - -import org.sayandev.sayanvanish.api.feature.Configurable -import org.sayandev.sayanvanish.api.feature.Feature -import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.stickynote.bukkit.onlinePlayers -import org.sayandev.stickynote.bukkit.runSync -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment - -@RegisteredFeature -@ConfigSerializable -class FeatureProxyVanishQueue( - @Comment("The time in milliseconds between each check for players in the queue. low values may cause performance issues.") - @Configurable val checkEvery: Long = 100 -) : Feature("proxy_vanish_queue", category = FeatureCategories.PROXY) { - - override fun enable() { - runSync({ - for (player in onlinePlayers) { - val user = player.user() - if (((user != null && !isActive(user)) || !isActive())) return@runSync - SayanVanishBukkitAPI.getInstance().database.isInQueue(player.uniqueId) { inQueue -> - if (inQueue) { - SayanVanishBukkitAPI.getInstance().database.getFromQueue(player.uniqueId) { isVanished -> - SayanVanishBukkitAPI.getInstance().database.removeFromQueue(player.uniqueId) - runSync { - val user = player.getOrAddUser() - user.sendComponent(language.vanish.vanishFromQueue, Placeholder.parsed("state", user.stateText(isVanished))) - val options = user.currentOptions.apply { - this.sendMessage = false - } - if (isVanished) { - user.disappear(options) - } else { - user.appear(options) - } - } - } - } - } - } - }, checkEvery, checkEvery) - super.enable() - } -} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt index 383106b4..1907dd09 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt @@ -5,6 +5,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerInteractEntityEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent @@ -23,9 +25,9 @@ class FeatureRideEntity( val targetEntity = event.rightClicked val vanishedPassengers = targetEntity.passengers .filterIsInstance() - .mapNotNull { player -> player.user() } + .mapNotNull { player -> player.cachedVanishUser() } .filter { it.isVanished } - .mapNotNull { it.player() } + .mapNotNull { BukkitPlatformAdapter.adapt(it).player() } for (vanishedPassenger in vanishedPassengers) { vanishedPassenger.leaveVehicle() vanishedPassenger.sendComponent(exitMessage) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt index ab101ad6..0582d88c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt @@ -14,6 +14,7 @@ import org.bukkit.event.player.PlayerTeleportEvent import org.bukkit.inventory.CraftingInventory import org.bukkit.util.Vector import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature @@ -42,7 +43,7 @@ class FeatureSilentContainer: ListenedFeature("silent_container") { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) private fun onPlayerInteract(event: PlayerInteractEvent) { val player = event.player - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!isActive(user)) return if (event.action != Action.RIGHT_CLICK_BLOCK) return val clickedBlock = event.clickedBlock ?: return @@ -98,7 +99,7 @@ class FeatureSilentContainer: ListenedFeature("silent_container") { @EventHandler private fun onInventoryClose(event: InventoryCloseEvent) { val player = event.player as? Player ?: return - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!user.isVanished) return if (event.inventory is CraftingInventory) return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index 2a3ccccc..dac8918e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -6,14 +6,20 @@ import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.stickynote.bukkit.launch +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment @@ -40,7 +46,7 @@ class FeatureState( @EventHandler(priority = EventPriority.LOWEST) private fun onJoin(event: PlayerJoinEvent) { val player = event.player - val user = player.user() + val user = player.cachedVanishUser() if ((user != null && !isActive(user)) || !isActive()) return val vanishJoinOptions = VanishOptions.Builder().sendMessage(false).notifyStatusChangeToOthers(false).isOnJoin(true).build() @@ -49,13 +55,15 @@ class FeatureState( return } - val tempUser = player.getOrAddUser() + val tempUser = player.getCachedOrCreateVanishUser() tempUser.isOnline = true if (tempUser.hasPermission(Permission.VANISH_ON_JOIN) || vanishOnJoin) { tempUser.isVanished = true - tempUser.disappear(vanishJoinOptions) - tempUser.save() + launch { + tempUser.disappear(vanishJoinOptions) + tempUser.save() + } } return } @@ -63,9 +71,11 @@ class FeatureState( user.isOnline = true if (checkPermissionOnJoin && !user.hasPermission(Permission.VANISH)) { - user.sendComponent(language.vanish.noPermissionToKeepVanished, Placeholder.unparsed("permission", Permission.VANISH.permission())) + user.sendMessage(language.vanish.noPermissionToKeepVanished.component(Placeholder.unparsed("permission", Permission.VANISH.permission()))) user.appear(vanishJoinOptions) - user.delete() + launch { + user.delete() + } return } @@ -76,25 +86,28 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { - for (vanishedUser in SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { - vanishedUser.sendComponent(language.vanish.joinedTheServerWhileVanished, Placeholder.unparsed("player", user.username)) + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { + vanishedUser.sendMessage(language.vanish.joinedTheServerWhileVanished.component(Placeholder.unparsed("player", user.username))) } } } - user.save() + launch { + user.save() + } + return } @EventHandler(priority = EventPriority.LOWEST) private fun updateUserOnQuit(event: PlayerQuitEvent) { val player = event.player - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { - for (vanishedUser in SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { - vanishedUser.sendComponent(language.vanish.leftTheServerWhileVanished, Placeholder.unparsed("player", user.username)) + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { + vanishedUser.sendMessage(language.vanish.leftTheServerWhileVanished.component(Placeholder.unparsed("player", user.username))) } } } @@ -104,7 +117,9 @@ class FeatureState( } user.isOnline = false - user.save() + launch { + user.save() + } } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt index 2f5f33e7..3db5aaed 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt @@ -11,8 +11,9 @@ import org.sayandev.sayanvanish.api.utils.DownloadUtils import org.sayandev.sayanvanish.api.utils.HangarUtils import org.sayandev.sayanvanish.api.utils.VersionInfo import org.sayandev.sayanvanish.bukkit.SayanVanishPlugin +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendRawComponent @@ -48,7 +49,7 @@ class FeatureUpdate( @Comment("The content of the update request message") val updateRequestContent: List = listOf( "A new version of SayanVanish is available!", - "Click to update'>You can install version by clicking on this message", + "Click to update'>You can install version by clicking on this message", "Make sure to read the changelog before doing any update to prevent unexpected behaviors", ) ) : ListenedFeature("update") { @@ -84,10 +85,10 @@ class FeatureUpdate( @EventHandler(priority = EventPriority.HIGH) private fun onJoin(event: PlayerJoinEvent) { val player = event.player - val user = player.user() ?: return + val user = player.cachedUser() ?: return if (!isActive(user)) return if (notifyOnJoin && player.hasPermission(notifyPermission) && latestRelease != null && latestSnapshot != null) { - if (!SettingsConfig.get().general.proxyMode) { + if (!Settings.get().general.proxyMode) { sendUpdateNotification(player) } @@ -98,7 +99,7 @@ class FeatureUpdate( } private fun sendUpdateNotification(sender: CommandSender) { - if (!isNewerVersionAvailable(notifyForSnapshotBuilds) || SettingsConfig.get().general.proxyMode) return + if (!isNewerVersionAvailable(notifyForSnapshotBuilds) || Settings.get().general.proxyMode) return for (line in updateNotificationContent) { sender.sendRawComponent(line diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt index b8b189cd..baa06de2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt @@ -1,15 +1,17 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook +import ch.andre601.advancedserverlist.api.AdvancedServerListAPI +import ch.andre601.advancedserverlist.api.PlaceholderProvider +import ch.andre601.advancedserverlist.api.exceptions.InvalidPlaceholderProviderException import ch.andre601.advancedserverlist.api.objects.GenericPlayer import ch.andre601.advancedserverlist.api.objects.GenericServer -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.api.SayanVanishAPI +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.config.settings import org.sayandev.stickynote.bukkit.onlinePlayers -import ch.andre601.advancedserverlist.api.PlaceholderProvider -import ch.andre601.advancedserverlist.api.AdvancedServerListAPI -import ch.andre601.advancedserverlist.api.exceptions.InvalidPlaceholderProviderException +// TODO: we have so many placeholder providers, maybe we should create a common base class for them? class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { fun register() { try { @@ -25,42 +27,37 @@ class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { ): String? { if (placeholder.equals("vanished", true)) { if (player == null) return "false" - return if (SayanVanishBukkitAPI.getInstance().getVanishedUsers().map { it.username }.contains(player.name)) "true" else "false" + return if (player.uuid.getCachedOrCreateVanishUser().isVanished) "true" else "false" } if (placeholder.equals("level", true)) { if (player == null) return "0" - return SayanVanishBukkitAPI.getInstance().getUser(player.uuid)?.vanishLevel?.toString() ?: "0" + return player.uuid.getCachedOrCreateVanishUser().vanishLevel.toString() } if (placeholder.equals("count", true)) { - return SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() + return VanishAPI.get().getCacheService().getVanishUsers().getVanishedCount().toString() } if (placeholder.equals("vanish_prefix", true)) { - return if (player?.uuid?.vanishUser()?.isVanished == true) language.vanish.placeholderPrefix else "" + return if (player?.uuid?.getCachedOrCreateVanishUser()?.isVanished == true) language.vanish.placeholderPrefix else "" } if (placeholder.equals("vanish_suffix", true)) { - return if (player?.uuid?.vanishUser()?.isVanished == true) language.vanish.placeholderSuffix else "" + return if (player?.uuid?.getCachedOrCreateVanishUser()?.isVanished == true) language.vanish.placeholderSuffix else "" } if (placeholder.startsWith("online_")) { val type = placeholder.substring(7) - val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().getOnlineVanished() + val vanishedOnlineUserNames = vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username } return if (type.equals("here", true)) { - onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username }.contains(onlinePlayer.name) }.size.toString() + onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUserNames.contains(onlinePlayer.name) }.size.toString() } else if (type.equals("total", true)) { - if (!settings.general.proxyMode) { - return "PROXY_MODE IS NOT ENABLED!" - } - SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + SayanVanishAPI.get().getCacheService().getUsers().values.filter { user -> !vanishedOnlineUserNames.contains(user.username) }.size.toString() } else { - if (!settings.general.proxyMode) { - return "PROXY_MODE IS NOT ENABLED!" - } - SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + VanishAPI.get().getCacheService().getUsers().getByServer(type).filter { it.isOnline && !vanishedOnlineUserNames.contains(it.username) }.size.toString() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt index 293b69af..f2abaadf 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt @@ -6,8 +6,13 @@ import net.citizensnpcs.api.ai.speech.event.SpeechEvent import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.stickynote.bukkit.registerListener @@ -53,14 +58,14 @@ private class CitizensHookImpl(val feature: FeatureHookCitizens): Listener { } private fun checkContext(context: SpeechContext): Boolean { - val contains = SayanVanishBukkitAPI.getInstance().getVanishedUsers().filter { it.isOnline }.mapNotNull { it.player() }.any { context.message.contains(it.name) } + val contains = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { it.isOnline }.mapNotNull { BukkitPlatformAdapter.adapt(it).player() }.any { context.message.contains(it.name) } if (contains) return false val iterator = context.iterator() while (iterator.hasNext()) { val recipient = iterator.next() val player = recipient.getEntity() as? Player ?: continue - val user = player.user() ?: continue + val user = player.cachedVanishUser() ?: continue if (user.isVanished) { iterator.remove(); } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt index bad84e16..185ea439 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt @@ -6,6 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -41,7 +42,7 @@ private class EssentialsHookImpl(val feature: FeatureHookEssentials): Listener { @EventHandler private fun preventAfkStatusChange(event: AfkStatusChangeEvent) { if (!feature.preventAfkStatusChange) return - val user = event.affected.uuid?.vanishUser() ?: return + val user = event.affected.uuid?.cachedVanishUser() ?: return if (!feature.isActive(user)) return if (!user.isVanished) return event.isCancelled = true @@ -50,7 +51,7 @@ private class EssentialsHookImpl(val feature: FeatureHookEssentials): Listener { @EventHandler private fun preventPrivateMessage(event: PrivateMessagePreSendEvent) { if (!feature.preventPrivateMessage) return - val user = event.recipient.uuid?.vanishUser() ?: return + val user = event.recipient.uuid?.cachedVanishUser() ?: return if (!feature.isActive(user)) return if (user.isVanished) { event.sender.sendMessage(com.earth2me.essentials.I18n.tl("errorWithMessage", com.earth2me.essentials.I18n.tl("playerNotFound"))) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt index 83be446a..8231c5a8 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -3,11 +3,10 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import io.github.miniplaceholders.api.Expansion import io.github.miniplaceholders.api.utils.TagsUtils import org.bukkit.entity.Player +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.config.settings import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.onlinePlayers import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -40,24 +39,24 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) builder.audiencePlaceholder("vanished") { audience, queue, context -> val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.EMPTY_TAG - return@audiencePlaceholder TagsUtils.staticTag(if (player.user()?.isVanished == true) "true" else "false") + return@audiencePlaceholder TagsUtils.staticTag(if (player.cachedVanishUser()?.isVanished == true) "true" else "false") } builder.audiencePlaceholder("level") { audience, queue, context -> val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("0") - return@audiencePlaceholder TagsUtils.staticTag(player.user()?.vanishLevel?.toString() ?: "0") + return@audiencePlaceholder TagsUtils.staticTag(player.cachedVanishUser()?.vanishLevel?.toString() ?: "0") } builder.globalPlaceholder("count") { queue, context -> - TagsUtils.staticTag(SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString()) + TagsUtils.staticTag(VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { user -> user.isOnline }.size.toString()) } builder.audiencePlaceholder("vanish_prefix") { audience, queue, context -> - TagsUtils.staticTag(if ((audience as? Player)?.user()?.isVanished == true) language.vanish.placeholderPrefix else "") + TagsUtils.staticTag(if ((audience as? Player)?.cachedVanishUser()?.isVanished == true) language.vanish.placeholderPrefix else "") } builder.audiencePlaceholder("vanish_suffix") { audience, queue, context -> - TagsUtils.staticTag(if ((audience as? Player)?.user()?.isVanished == true) language.vanish.placeholderSuffix else "") + TagsUtils.staticTag(if ((audience as? Player)?.cachedVanishUser()?.isVanished == true) language.vanish.placeholderSuffix else "") } builder.globalPlaceholder("online") { queue, context -> @@ -65,7 +64,7 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) return@globalPlaceholder TagsUtils.EMPTY_TAG } - val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { user -> user.isOnline } val serverName = queue.pop().value() val result = when (serverName) { @@ -73,18 +72,10 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username }.contains(onlinePlayer.name) }.size.toString() } "total" -> { - if (!settings.general.proxyMode) { - "PROXY_MODE IS NOT ENABLED!" - } else { - SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() - } + VanishAPI.get().getCacheService().getUsers().values.filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } else -> { - if (!settings.general.proxyMode) { - "PROXY_MODE IS NOT ENABLED!" - } else { - SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId == serverName && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() - } + VanishAPI.get().getCacheService().getUsers().getByServer(serverName).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt index 12daf8f4..c3d11c5b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -2,12 +2,11 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import me.clip.placeholderapi.expansion.PlaceholderExpansion import org.bukkit.OfflinePlayer +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.config.settings import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook @@ -85,44 +84,38 @@ private class HookPlaceholderAPI : PlaceholderExpansion() { override fun onRequest(player: OfflinePlayer?, params: String): String? { if (params.equals("vanished", true)) { if (player == null) return "false" - return if (SayanVanishBukkitAPI.getInstance().getVanishedUsers().map { it.username }.contains(player.name)) "true" else "false" + return if (VanishAPI.get().getCacheService().getVanishUsers().getVanished().map { it.username }.contains(player.name)) "true" else "false" } if (params.equals("level", true)) { if (player == null) return "0" - return player.user()?.vanishLevel?.toString() ?: "0" + return player.cachedVanishUser()?.vanishLevel?.toString() ?: "0" } if (params.equals("count", true)) { - return SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isOnline && user.isVanished }.size.toString() + return VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { user -> user.isOnline }.size.toString() } if (params.equals("vanish_prefix", true)) { if (player == null) return "" - return if (player.user()?.isVanished == true) language.vanish.placeholderPrefix else "" + return if (player.cachedVanishUser()?.isVanished == true) language.vanish.placeholderPrefix else "" } if (params.equals("vanish_suffix", true)) { if (player == null) return "" - return if (player.user()?.isVanished == true) language.vanish.placeholderSuffix else "" + return if (player.cachedVanishUser()?.isVanished == true) language.vanish.placeholderSuffix else "" } if (params.startsWith("online_")) { val type = params.removePrefix("online_") - val vanishedOnlineUsers = SayanVanishBukkitAPI.getInstance().database.getVanishUsers().filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { user -> user.isOnline } return if (type.equals("here", true)) { onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username }.contains(onlinePlayer.name) }.size.toString() } else if (type.equals("total", true)) { - if (!settings.general.proxyMode) { - return "PROXY_MODE IS NOT ENABLED!" - } - return SayanVanishAPI.getDatabase().getBasicUsers(false).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + return VanishAPI.get().getCacheService().getUsers().values.filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } else { - if (!settings.general.proxyMode) { - return "PROXY_MODE IS NOT ENABLED!" - } - return SayanVanishAPI.getDatabase().getBasicUsers(false).filter { it.serverId == type && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + return VanishAPI.get().getCacheService().getUsers().getByServer(type).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt index 305e2941..fcafc84f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt @@ -2,9 +2,11 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import me.neznamy.tab.api.TabPlayer import me.neznamy.tab.api.integration.VanishIntegration +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.plugin import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -12,10 +14,7 @@ import org.spongepowered.configurate.objectmapping.meta.Comment @RegisteredFeature @ConfigSerializable -class FeatureHookTAB( - @Comment("Whether to use cache data for vanish status. This will improve performance but may cause a small delay in tablist removal after join.") - val useCacheData: Boolean = true -): HookFeature("hook_tab", "TAB") { +class FeatureHookTAB: HookFeature("hook_tab", "TAB") { override fun enable() { if (hasPlugin()) { VanishIntegrationTAB(this).register() @@ -33,13 +32,13 @@ class FeatureHookTAB( private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegration(plugin.name) { override fun isVanished(player: TabPlayer): Boolean { - return SayanVanishBukkitAPI.getInstance().isVanishedAsync(player.uniqueId, feature.useCacheData) + return player.uniqueId.cachedVanishUser()?.isVanished ?: false } override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { if (viewer.uniqueId == target.uniqueId) return true - val viewerUser = SayanVanishBukkitAPI.getInstance().getUser(viewer.uniqueId, feature.useCacheData) ?: BukkitVanishUser(viewer.uniqueId, viewer.name) - val targetUser = SayanVanishBukkitAPI.getInstance().getUser(target.uniqueId, feature.useCacheData) ?: return true - return SayanVanishBukkitAPI.getInstance().canSee(viewerUser, targetUser) + val viewerUser = viewer.uniqueId.cachedVanishUser() ?: BukkitVanishUser(viewer.uniqueId, viewer.name) + val targetUser = target.uniqueId.cachedVanishUser() ?: return true + return viewerUser.canSee(targetUser) } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureLuckPermsHook.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureLuckPermsHook.kt index 88bd077a..af29d6d6 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureLuckPermsHook.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureLuckPermsHook.kt @@ -12,6 +12,7 @@ import org.bukkit.Bukkit import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.warn @@ -73,7 +74,7 @@ class FeatureLuckPermsHook( class VanishedContext: ContextCalculator { override fun calculate(target: Player, contextConsumer: ContextConsumer) { - contextConsumer.accept("vanished", target.getOrCreateUser().isVanished.toString()) + contextConsumer.accept("vanished", target.getCachedOrCreateVanishUser().isVanished.toString()) } override fun estimatePotentialContexts(): ContextSet { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt index a72dd340..b7df8c71 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt @@ -5,6 +5,8 @@ import org.bukkit.event.player.PlayerAdvancementDoneEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote @@ -26,7 +28,7 @@ class FeaturePreventAdvancementAnnounce( @EventHandler private fun onAdvancementDone(event: PlayerAdvancementDoneEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { if (disableMessage) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt index 410d9c20..e306e20c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt @@ -5,6 +5,7 @@ import org.bukkit.event.EventPriority import org.bukkit.event.block.BlockBreakEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -15,7 +16,7 @@ class FeaturePreventBlockBreak: ListenedFeature("prevent_block_break", false, ca @EventHandler(priority = EventPriority.HIGHEST) private fun onBlockBreak(event: BlockBreakEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt index 2a1d9633..88406201 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt @@ -5,6 +5,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityChangeBlockEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -15,7 +16,7 @@ class FeaturePreventBlockGrief: ListenedFeature("prevent_block_grief", category @EventHandler private fun onChangeBlock(event: EntityChangeBlockEvent) { - val user = (event.entity as? Player)?.user() ?: return + val user = (event.entity as? Player)?.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt index 9d69a133..9e795c88 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt @@ -5,6 +5,7 @@ import org.bukkit.event.EventPriority import org.bukkit.event.block.BlockPlaceEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -15,7 +16,7 @@ class FeaturePreventBlockPlace: ListenedFeature("prevent_block_place", false, ca @EventHandler(priority = EventPriority.HIGHEST) private fun onBlockPlace(event: BlockPlaceEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt index 02108eed..f427f9fd 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt @@ -9,11 +9,13 @@ import org.bukkit.event.player.AsyncPlayerChatEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.plugin +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment @@ -34,14 +36,14 @@ class FeaturePreventChat( { listener: Listener, event: Event -> if (event !is AsyncPlayerChatEvent) return@registerEvent if (event.isCancelled) return@registerEvent - val user = event.player.user() ?: return@registerEvent + val user = event.player.cachedVanishUser() ?: return@registerEvent if (!isActive(user)) return@registerEvent if (!user.isVanished) return@registerEvent val message = event.message if (message.startsWith(bypassChar)) { event.message = message.removePrefix(bypassChar) } else { - user.sendComponent(language.vanish.cantChatWhileVanished, Placeholder.unparsed("char", bypassChar)) + user.sendMessage(language.vanish.cantChatWhileVanished.component(Placeholder.unparsed("char", bypassChar))) event.isCancelled = true } }, diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt index c639cc2d..146ddf32 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt @@ -6,6 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityTargetEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature @@ -28,7 +29,7 @@ class FeaturePreventCreatureTarget: ListenedFeature("prevent_creature_target", c @EventHandler private fun onEntityTarget(event: EntityTargetEvent) { val target = event.target as? Player ?: return - val user = target.user() ?: return + val user = target.cachedVanishUser() ?: return if (!isActive(user)) return if (!user.isVanished) return event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt index 46a5b44a..ac9821e9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt @@ -5,6 +5,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityDamageByEntityEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -15,7 +16,7 @@ class FeaturePreventDamage: ListenedFeature("prevent_damage", category = Feature @EventHandler private fun onEntityDamage(event: EntityDamageByEntityEvent) { - val user = (event.entity as? Player)?.user() ?: return + val user = (event.entity as? Player)?.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt index cc9e4a45..efabf20b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt @@ -9,6 +9,7 @@ import org.bukkit.event.player.PlayerInteractEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion @@ -33,7 +34,7 @@ class FeaturePreventInteract( if (ServerVersion.supports(13)) { if (event.clickedBlock?.state is Container) return } - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { val isPressurePlate = pressurePlateTrigger && event.action == Action.PHYSICAL && event.clickedBlock?.type?.name?.contains("PLATE") == true @@ -51,7 +52,7 @@ class FeaturePreventInteract( if (event.action != Action.PHYSICAL) return if (block.type != XMaterial.TRIPWIRE.get()!! && block.type != XMaterial.STRING.get()!!) return val player = event.player - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!isActive(user)) return if (!user.isVanished) return event.isCancelled = true @@ -64,7 +65,7 @@ class FeaturePreventInteract( if (event.action != Action.RIGHT_CLICK_BLOCK) return if (!block.type.name.contains("BUTTON")) return val player = event.player - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!isActive(user)) return if (!user.isVanished) return event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt index d66283cd..a56b4050 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt @@ -6,6 +6,7 @@ import org.bukkit.event.entity.EntityPickupItemEvent import org.bukkit.event.player.PlayerPickupItemEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion @@ -19,7 +20,7 @@ class FeaturePreventPickup: ListenedFeature("prevent_pickup", category = Feature @EventHandler private fun onPickupItem(event: EntityPickupItemEvent) { - val user = (event.entity as? Player)?.user() ?: return + val user = (event.entity as? Player)?.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { event.isCancelled = true @@ -36,7 +37,7 @@ class FeatureLegacyPreventPickup: ListenedFeature("legacy_prevent_pickup", categ @EventHandler @Suppress("DEPRECATION") private fun onPickupItem(event: PlayerPickupItemEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt index 39858f68..361cfc94 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt @@ -4,6 +4,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.raid.RaidTriggerEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.event.registerListener @@ -19,7 +20,7 @@ class FeaturePreventRaidTrigger: ListenedFeature("prevent_raid_trigger", categor @EventHandler private fun onRaidTrigger(event: RaidTriggerEvent) { - val user = event.player.user() ?: return + val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt index 8f4df764..a26e2f31 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt @@ -9,6 +9,7 @@ import org.bukkit.event.player.PlayerInteractEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion @@ -34,7 +35,7 @@ class FeaturePreventSculk( private fun cancelSculkSensor(event: BlockReceiveGameEvent) { if (!preventSculkSensor) return val player = event.entity as? Player ?: return - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!user.isVanished) return if (!isActive(user)) return event.isCancelled = true @@ -47,7 +48,7 @@ class FeaturePreventSculk( if (event.action != Action.PHYSICAL) return if (!sculkBlocks.contains(block.type.name)) return val player = event.player - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!user.isVanished) return if (!isActive(user)) return event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt index d8319c88..b6022439 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt @@ -2,8 +2,10 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent import com.destroystokyo.paper.event.server.PaperServerListPingEvent import org.bukkit.event.EventHandler +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote @@ -17,7 +19,7 @@ class FeaturePreventServerPing: ListenedFeature("prevent_server_ping", category @EventHandler private fun onPing(event: PaperServerListPingEvent) { if (!isActive()) return - val vanishedPlayers = SayanVanishBukkitAPI.getInstance().getVanishedUsers().filter { it.player() != null } + val vanishedPlayers = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { BukkitPlatformAdapter.adapt(it).player() != null } event.numPlayers -= vanishedPlayers.count() if (StickyNote.isPaper && ServerVersion.supports(21)) { event.listedPlayers.removeIf { profile -> vanishedPlayers.map { vanishedPlayer -> vanishedPlayer.uniqueId }.contains(profile.id) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt index 97d0c695..5bbf261e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt @@ -6,6 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote @@ -28,7 +29,7 @@ class FeaturePreventSpawnerSpawn: ListenedFeature("prevent_spawner_spawn", categ if (!isActive()) return val nearPlayers = onlinePlayers .filter { player -> player.gameMode != GameMode.SPECTATOR && player.world == event.spawnerLocation.world && player.location.distance(event.spawnerLocation) <= 256 } - val allIsVanished = nearPlayers.all { it.user()?.isVanished == true } + val allIsVanished = nearPlayers.all { it.cachedVanishUser()?.isVanished == true } if (allIsVanished) { event.isCancelled = true } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt index a364fc30..89f65db7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt @@ -5,11 +5,13 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.server.TabCompleteEvent import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -25,9 +27,9 @@ class FeaturePreventTabComplete( @EventHandler(priority = EventPriority.HIGHEST) private fun onTabComplete(event: TabCompleteEvent) { val player = event.sender as? Player ?: return - val user = player.getOrCreateUser() + val user = player.getCachedOrCreateVanishUser() if (!isActive(user)) return - val vanishedUsers = SayanVanishBukkitAPI.getInstance().getVanishedUsers() + val vanishedUsers = VanishAPI.get().getCacheService().getVanishUsers().getVanished() val completions = event.completions.toMutableSet() if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { event.completions = completions diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/PreventFoodLevelChange.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/PreventFoodLevelChange.kt index be11a5ec..e6b6c58c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/PreventFoodLevelChange.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/PreventFoodLevelChange.kt @@ -5,6 +5,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.FoodLevelChangeEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -19,7 +20,7 @@ class PreventFoodLevelChange( private fun onBlockBreak(event: FoodLevelChangeEvent) { if (ignoreIfIncrease && event.foodLevel > event.entity.foodLevel) return val player = event.entity as? Player ?: return - val user = player.user() ?: return + val user = player.cachedVanishUser() ?: return if (!isActive(user)) return if (user.isVanished) { event.isCancelled = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt index 8db8a7f2..1015eb67 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt @@ -2,7 +2,7 @@ package org.sayandev.sayanvanish.bukkit.utils import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.command.CommandSender -import org.sayandev.sayanvanish.bukkit.config.SettingsConfig +import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.stickynote.bukkit.utils.AdventureUtils @@ -12,7 +12,7 @@ object PlayerUtils { if (content.isBlank()) return val prefix = language.general.prefix - AdventureUtils.sendComponent(this, if (SettingsConfig.get().general.includePrefixInMessages) { + AdventureUtils.sendComponent(this, if (Settings.get().general.includePrefixInMessages) { prefix + content } else { content From 31604cf3401f2609ed7fc40e393a893fa1b042ba Mon Sep 17 00:00:00 2001 From: Syren Date: Fri, 18 Jul 2025 13:48:25 +0330 Subject: [PATCH 27/67] chore: it somewhat working now --- build.gradle.kts | 5 ++- .../sayanvanish/api/SayanVanishAPI.kt | 7 +++- .../org/sayandev/sayanvanish/api/User.kt | 11 ++++-- .../sayandev/sayanvanish/api/VanishOptions.kt | 25 ------------ .../sayandev/sayanvanish/api/VanishUser.kt | 9 +++-- .../sayanvanish/api/message/MessageConfig.kt | 2 +- .../message/types/RedisMessagingService.kt | 15 +++++-- .../types/WebSocketMessagingService.kt | 33 ++++++++++++---- .../api/storage/TransactionDatabase.kt | 2 +- .../api/storage/redis/RedisDatabase.kt | 3 +- .../sayanvanish/api/storage/sql/SQLConfig.kt | 1 + .../api/storage/sql/SQLDatabase.kt | 39 ++++++++++++------- sayanvanish-bukkit/build.gradle.kts | 8 ++-- .../sayanvanish/bukkit/VanishManager.kt | 7 ++-- .../sayanvanish/bukkit/api/BukkitUser.kt | 21 +++++----- .../bukkit/api/BukkitVanishUser.kt | 6 +++ .../bukkit/command/SayanVanishCommand.kt | 10 ++--- .../sayanvanish/bukkit/config/Settings.kt | 2 +- .../feature/features/FeatureActionbar.kt | 27 ++++++++----- .../bukkit/feature/features/FeatureLevel.kt | 9 ++--- .../feature/features/FeatureRideEntity.kt | 5 +-- .../bukkit/feature/features/FeatureState.kt | 7 +++- .../features/hook/FeatureHookCitizens.kt | 8 +--- .../prevent/FeaturePreventServerPing.kt | 5 +-- 24 files changed, 152 insertions(+), 115 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 7d45f5bb..2711438d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,7 +31,10 @@ fun lastCommitMessages(): String { val connection = url.openConnection() as HttpURLConnection connection.requestMethod = "GET" connection.setRequestProperty("Accept", "application/vnd.github.v3+json") - val response = connection.inputStream.bufferedReader().use { it.readText() } + val response = runCatching { connection.inputStream.bufferedReader().use { it.readText() } }.getOrNull() ?: let { + println("Failed to fetch last commit messages from GitHub Actions API: ${connection.responseCode} ${connection.responseMessage}") + return "No recent commits found." + } val sha = JsonParser.parseString(response).asJsonObject.getAsJsonArray("workflow_runs").get(0).asJsonObject.get("head_sha").asString return executeGitCommand("log", "--pretty=format:%C(auto)%h %s %C(blue)<%an>", "$sha..HEAD") diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index d836924e..1c1267be 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -30,10 +30,15 @@ object SayanVanishAPI : VanishAPI { } init { + runBlocking { + database.initialize().await() + messagingService.initialize().await() + } + launch(database.dispatcher) { for (user in database.getVanishUsers().await().filter { user -> user.serverId == Platform.get().serverId }) { user.isOnline = false - user.save() + user.saveAndSync() } database.purgeUsers(Platform.get().serverId) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index afb27737..0cf34c54 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -8,7 +8,6 @@ import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking import net.kyori.adventure.text.Component import org.sayandev.sayanvanish.api.storage.PlatformTable -import org.sayandev.sayanvanish.api.exception.UnsupportedPlatformException import org.sayandev.stickynote.core.utils.async import java.lang.reflect.Type import java.util.* @@ -55,11 +54,11 @@ interface User { * * @param permission The permission string to check. * @return True if the user has the permission, false otherwise. - * @throws UnsupportedPlatformException If the platform does not support permission checks. + * @throws StackOverflowError If the platform does not support permission checks. * @since 1.0.0 */ fun hasPermission(permission: String): Boolean { - throw UnsupportedPlatformException("hasPermission") + return Platform.get().adapter.adapt(this).hasPermission(permission) } /** @@ -233,6 +232,10 @@ interface User { return VanishUser.Generic(uniqueId, username, serverId) } + fun adapt(): User { + return Platform.get().adapter.adapt(this) + } + /** * @since 2.0.0 */ @@ -258,7 +261,7 @@ interface User { val uniqueId = uuid("unique_id").uniqueIndex() val username = varchar("username", 16) val isOnline = bool("is_online").default(false) - val serverId = varchar("server_id", 36) + val serverId = varchar("server_id", 256) override val primaryKey = PrimaryKey(uniqueId) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt index 6ebd174d..07792b3c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt @@ -1,9 +1,5 @@ package org.sayandev.sayanvanish.api -import com.google.gson.Gson -import com.google.gson.JsonObject -import com.google.gson.JsonParser - data class VanishOptions( var sendMessage: Boolean = true, var notifyStatusChangeToOthers: Boolean = true, @@ -49,28 +45,7 @@ data class VanishOptions( } } - fun toJson(): String { - val json = JsonObject() - json.addProperty("send-message", sendMessage) - json.addProperty("notify-status-change-to-others", notifyStatusChangeToOthers) - json.addProperty("notify-join-quit-vanished", notifyJoinQuitVanished) - json.addProperty("is-on-join", isOnJoin) - json.addProperty("is-on-quit", isOnQuit) - return Gson().toJson(json) - } - companion object { - @JvmStatic - fun fromJson(serialized: String): VanishOptions { - val json = JsonParser.parseString(serialized).asJsonObject - return VanishOptions( - json.get("send-message").asBoolean, - json.get("notify-status-change-to-others").asBoolean, - json.get("notify-join-quit-vanished").asBoolean, - json.get("is-on-join").asBoolean - ) - } - @JvmStatic fun defaultOptions(): VanishOptions { return VanishOptions() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 707247ee..24df9d8a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -28,7 +28,7 @@ interface VanishUser : User { fun disappear(options: VanishOptions) { isVanished = true launch(VanishAPI.get().getDatabase().dispatcher) { - save() + saveAndSync() } } @@ -39,7 +39,7 @@ interface VanishUser : User { fun appear(options: VanishOptions) { isVanished = false launch(VanishAPI.get().getDatabase().dispatcher) { - save() + saveAndSync() } } @@ -67,7 +67,6 @@ interface VanishUser : User { @JvmSynthetic override suspend fun save(): Deferred { - serverId = Platform.get().serverId val deferred = CompletableDeferred() async(VanishAPI.get().getDatabase().dispatcher) { listOf( @@ -137,6 +136,10 @@ interface VanishUser : User { return runBlocking { saveAndSync().awaitAll() } } + override fun adapt(): VanishUser { + return Platform.get().adapter.adapt(this) + } + class JsonAdapter : JsonSerializer, JsonDeserializer { override fun serialize(src: VanishUser, typeOfSrc: Type, context: JsonSerializationContext): JsonObject { return JsonParser.parseString(Gson().toJson(src)).asJsonObject diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt index 69b3e9d3..95dc7d29 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt @@ -21,7 +21,7 @@ class MessageConfig( val categoryTypes: List = MessagingCategoryTypes.entries, ) : Config(Platform.get().rootDirectory, fileName, serializers()) { companion object { - private val fileName = "database.yml" + private val fileName = "message.yml" @JvmStatic fun defaultConfig(): MessageConfig { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index b9162fdf..c04a91fe 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -18,6 +18,7 @@ import org.sayandev.stickynote.core.messaging.PayloadWrapper import org.sayandev.stickynote.core.messaging.redis.RedisConnectionMeta import org.sayandev.stickynote.core.messaging.redis.RedisPublisher import org.sayandev.stickynote.core.utils.async +import java.util.UUID // TODO: can't you merge some parts of publisher in another class since both redis and websocket has the same publisher interface? class RedisMessagingService( @@ -54,10 +55,13 @@ class RedisMessagingService( } suspend fun sync(user: User): CompletableDeferred { + handle(user) return publish( PayloadWrapper( - user, - PayloadBehaviour.FORWARD + uniqueId = UUID.randomUUID(), + payload = user, + behaviour = PayloadBehaviour.FORWARD, + excludeSource = true ) ) } @@ -80,10 +84,13 @@ class RedisMessagingService( } suspend fun sync(vanishUser: VanishUser): CompletableDeferred { + handle(vanishUser) return publish( PayloadWrapper( - vanishUser, - PayloadBehaviour.FORWARD + uniqueId = UUID.randomUUID(), + payload = vanishUser, + behaviour = PayloadBehaviour.FORWARD, + excludeSource = true ) ) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt index a4bbfc72..094b6a87 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -3,7 +3,6 @@ package org.sayandev.sayanvanish.api.message.types import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser @@ -16,7 +15,9 @@ import org.sayandev.stickynote.core.messaging.PayloadBehaviour import org.sayandev.stickynote.core.messaging.PayloadWrapper import org.sayandev.stickynote.core.messaging.websocket.WebSocketConnectionMeta import org.sayandev.stickynote.core.messaging.websocket.WebSocketPublisher +import org.sayandev.stickynote.core.utils.async import java.net.URI +import java.util.* class WebSocketMessagingService( val config: WebSocketConfig, @@ -39,15 +40,24 @@ class WebSocketMessagingService( Platform.get().logger ) { override fun handle(payload: User): Boolean? { - VanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) + async(VanishAPI.get().getDatabase().dispatcher) { + if (VanishAPI.get().getDatabase().hasUser(payload.uniqueId).await()) { + VanishAPI.get().getCacheService().getUsers().put(payload.uniqueId, payload) + } else { + VanishAPI.get().getCacheService().getUsers().remove(payload.uniqueId) + } + } return true } suspend fun sync(user: User): CompletableDeferred { + handle(user) return publish( PayloadWrapper( - user, - PayloadBehaviour.FORWARD + uniqueId = UUID.randomUUID(), + payload = user, + behaviour = PayloadBehaviour.FORWARD, + excludeSource = true ) ) } @@ -59,15 +69,24 @@ class WebSocketMessagingService( Platform.get().logger ) { override fun handle(payload: VanishUser): Boolean? { - VanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) + async(VanishAPI.get().getDatabase().dispatcher) { + if (VanishAPI.get().getDatabase().hasVanishUser(payload.uniqueId).await()) { + VanishAPI.get().getCacheService().getVanishUsers().put(payload.uniqueId, payload) + } else { + VanishAPI.get().getCacheService().getVanishUsers().remove(payload.uniqueId) + } + } return true } suspend fun sync(vanishUser: VanishUser): CompletableDeferred { + handle(vanishUser) return publish( PayloadWrapper( - vanishUser, - PayloadBehaviour.FORWARD + uniqueId = UUID.randomUUID(), + payload = vanishUser, + behaviour = PayloadBehaviour.FORWARD, + excludeSource = true ) ) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt index faeec1ae..96286336 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt @@ -47,8 +47,8 @@ class TransactionDatabase: Database { DatabaseType.REDIS -> { databaseTypes[DatabaseType.REDIS] = try { RedisDatabase(storageConfig).also { redisDatabase -> - redisDatabase.initialize() redisDatabase.connect() + redisDatabase.initialize() } } catch (e: Exception) { databaseConnected = false diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt index 4d3b0995..81316198 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt @@ -51,6 +51,7 @@ class RedisDatabase( ?.let { Gson.get().fromJson(JsonParser.parseString(it), VanishUser::class.java) } + ?.adapt() } } } @@ -60,7 +61,7 @@ class RedisDatabase( redis.resource.use { it.hgetAll("vanish_users") .map { - Gson.get().fromJson(JsonParser.parseString(it.value), VanishUser::class.java) + Gson.get().fromJson(JsonParser.parseString(it.value), VanishUser::class.java).adapt() } } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt index ce84b3e7..51ca0b25 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt @@ -22,6 +22,7 @@ class SQLConfig( @Comment("Properties for the connection pool") val poolProperties: PoolProperties = PoolProperties(), @Comment("The prefix for the table names in the SQL database") + // TODO: use this? val tablePrefix: String = "sayanvanish_", ) { @ConfigSerializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index 042f4555..7fdbe051 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -3,21 +3,21 @@ package org.sayandev.sayanvanish.api.storage.sql import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.delay -import kotlinx.coroutines.isActive import org.jetbrains.exposed.v1.core.SqlExpressionBuilder.eq import org.jetbrains.exposed.v1.core.Transaction import org.jetbrains.exposed.v1.jdbc.* import org.jetbrains.exposed.v1.jdbc.transactions.TransactionManager import org.jetbrains.exposed.v1.jdbc.transactions.experimental.suspendedTransactionAsync +import org.jetbrains.exposed.v1.jdbc.transactions.transaction import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.storage.Database import org.sayandev.sayanvanish.api.storage.StorageConfig +import org.sayandev.sayanvanish.api.utils.Gson import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import org.sayandev.stickynote.core.utils.CoroutineUtils -import org.sayandev.stickynote.core.utils.launch import java.util.* class SQLDatabase( @@ -40,10 +40,12 @@ class SQLDatabase( lateinit var database: org.jetbrains.exposed.v1.jdbc.Database override suspend fun initialize(): Deferred { - SchemaUtils.createMissingTablesAndColumns( - *tables.toTypedArray(), - withLogs = false, - ) + transaction { + SchemaUtils.createMissingTablesAndColumns( + *tables.toTypedArray(), + withLogs = false, + ) + } return CompletableDeferred(true) } @@ -87,9 +89,14 @@ class SQLDatabase( result[User.Schema.serverId], result[VanishUser.Schema.isVanished], result[User.Schema.isOnline], - result[VanishUser.Schema.vanishLevel] + result[VanishUser.Schema.vanishLevel], + Gson.get().fromJson( + result[VanishUser.Schema.currentOptions], + VanishOptions::class.java + ) ) } + ?.adapt() } } @@ -106,7 +113,7 @@ class SQLDatabase( result[VanishUser.Schema.isVanished], result[User.Schema.isOnline], result[VanishUser.Schema.vanishLevel] - ) + ).adapt() } } } @@ -124,6 +131,7 @@ class SQLDatabase( result[User.Schema.serverId] ) } + ?.adapt() } } @@ -137,7 +145,7 @@ class SQLDatabase( result[User.Schema.username], result[User.Schema.isOnline], result[User.Schema.serverId] - ) + ).adapt() } } } @@ -148,6 +156,7 @@ class SQLDatabase( row[uniqueId] = vanishUser.uniqueId row[isVanished] = vanishUser.isVanished row[vanishLevel] = vanishUser.vanishLevel + row[currentOptions] = Gson.get().toJson(vanishUser.currentOptions) }.isIgnore } } @@ -195,13 +204,13 @@ class SQLDatabase( } } - override suspend fun updateVanishUser(user: VanishUser): Deferred { + override suspend fun updateVanishUser(vanishUser: VanishUser): Deferred { return async { VanishUser.Schema.upsert { row -> - row[uniqueId] = user.uniqueId - row[isVanished] = user.isVanished - row[vanishLevel] = user.vanishLevel - row[currentOptions] = user.currentOptions.toJson() + row[uniqueId] = vanishUser.uniqueId + row[isVanished] = vanishUser.isVanished + row[vanishLevel] = vanishUser.vanishLevel + row[currentOptions] = Gson.get().toJson(vanishUser.currentOptions) }.isIgnore } } diff --git a/sayanvanish-bukkit/build.gradle.kts b/sayanvanish-bukkit/build.gradle.kts index 1d7faf0f..034c1d51 100644 --- a/sayanvanish-bukkit/build.gradle.kts +++ b/sayanvanish-bukkit/build.gradle.kts @@ -57,10 +57,10 @@ tasks { } runServer { - minecraftVersion("1.21.5") + minecraftVersion("1.21.7") downloadPlugins { - hangar("ViaVersion", "5.0.4-SNAPSHOT+548") +// hangar("ViaVersion", "5.0.4-SNAPSHOT+548") hangar("PlaceholderAPI", "2.11.6") // hangar("AdvancedServerList", "5.4.1") // url("https://cdn.modrinth.com/data/qvdtDX3s/versions/TD9kTO2n/multiverse-inventories-4.2.7-pre.jar") @@ -72,7 +72,7 @@ tasks { // url("https://github.com/Insprill/custom-join-messages/releases/download/v17.5.0/custom-join-messages-17.5.0.jar") // url("https://github.com/NEZNAMY/TAB-Bridge/releases/download/6.0.1/TAB-Bridge.v6.0.1.jar") url("https://github.com/EssentialsX/Essentials/releases/download/2.20.1/EssentialsX-2.20.1.jar") - url("https://download.luckperms.net/1575/bukkit/loader/LuckPerms-Bukkit-5.4.158.jar") + url("https://download.luckperms.net/1594/bukkit/loader/LuckPerms-Bukkit-5.5.9.jar") } jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false") } @@ -92,7 +92,7 @@ bukkit { author = findProperty("author")!! as String defaultPermission = BukkitPluginDescription.Permission.Default.FALSE - main = "${rootProject.group}.${findProperty("slug")!! as String}.bukkit.${rootProject.name}" + main = "${rootProject.group}.${findProperty("slug")!! as String}.bukkit.${rootProject.name}Plugin" foliaSupported = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt index 71c38516..693ce9c9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt @@ -6,8 +6,7 @@ import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser import org.sayandev.sayanvanish.bukkit.config.Settings @@ -39,13 +38,13 @@ object VanishManager : Listener { launch { val user = player.getCachedOrCreateUser() user.isOnline = false - user.save() + user.saveAndSync() } } @EventHandler(priority = EventPriority.LOWEST) private fun hideVanishedPlayersOnJoin(event: PlayerJoinEvent) { - for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().map { BukkitPlatformAdapter.adapt(it) }.filter { it.player() != null }) { + for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().map { it.bukkitAdapt() }.filter { it.player() != null }) { user.hideUser(event.player) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index e22acf2a..561e0c74 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -2,11 +2,12 @@ package org.sayandev.sayanvanish.bukkit.api import net.kyori.adventure.text.Component import org.bukkit.Bukkit -import org.bukkit.entity.Player +import org.bukkit.permissions.Permission +import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.stickynote.bukkit.utils.AdventureUtils -import java.util.UUID +import org.sayandev.stickynote.bukkit.warn +import java.util.* class BukkitUser( override val uniqueId: UUID, @@ -19,6 +20,10 @@ class BukkitUser( fun audience() = player()?.let { AdventureUtils.senderAudience(it) } + override fun hasPermission(permission: String): Boolean { + return player()?.hasPermission(Permission(permission, PermissionDefault.FALSE)) == true + } + override fun sendMessage(content: Component) { audience()?.sendMessage(content) } @@ -28,13 +33,9 @@ class BukkitUser( } companion object { - fun Player.generateUser(): User { - return User.Generic( - this.uniqueId, - this.name, - this.isOnline, - Settings.get().serverId() - ) + @JvmSynthetic + fun User.bukkitAdapt(): BukkitUser { + return BukkitPlatformAdapter.adapt(this) } } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 0b0e4d81..7c2ce916 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -7,6 +7,7 @@ import org.bukkit.entity.Player import org.bukkit.metadata.FixedMetadataValue import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser @@ -178,6 +179,11 @@ open class BukkitVanishUser( this.vanishLevel = vanishUser.vanishLevel } } + + @JvmSynthetic + fun VanishUser.bukkitAdapt(): BukkitVanishUser { + return BukkitPlatformAdapter.adapt(this) + } } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 9afbd7e1..19668333 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -24,6 +24,8 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.api.utils.Paste +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user @@ -80,14 +82,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val player = if (target.isPresent) context.optional("player").get() else context.sender().player() ?: return launch { - val user = player.getOrAddVanishUser() + val user = player.getOrCreateVanishUser() if (!user.hasPermission(Permission.VANISH)) { user.sendMessage(language.vanish.dontHaveUsePermission.component(Placeholder.unparsed("permission", Permission.VANISH.permission()))) } - player.getOrAddVanishUser() - val options = VanishOptions.defaultOptions().apply { if (context.flags().hasFlag("silent")) { this.sendMessage = false @@ -174,7 +174,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set } val featureKey = Paste("yaml", featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }).post().await() generateMainPaste(sender, mapOf( - "database.yml" to "${Paste.PASTE_URL}/$databaseKey", + "storage.yml" to "${Paste.PASTE_URL}/$databaseKey", "settings.yml" to "${Paste.PASTE_URL}/$settingsKey", "latest.log" to "${Paste.PASTE_URL}/$logKey", "features" to "${Paste.PASTE_URL}/$featureKey" @@ -225,7 +225,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val user = target.getOrAddVanishUser() user.vanishLevel = context.get("level") - user.save() + user.saveAndSync() if (Features.getFeature().levelMethod == FeatureLevel.LevelMethod.PERMISSION) { sender.sendComponent(language.feature.permissionLevelMethodWarning, Placeholder.unparsed("method", FeatureLevel.LevelMethod.PERMISSION.name), Placeholder.unparsed("methods", FeatureLevel.LevelMethod.entries.joinToString(", ") { it.name })) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt index ad35e1b4..0c43322e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt @@ -46,7 +46,7 @@ class Settings( You will also need to install the SayanVanish proxy plugin on your proxy server. WARNING: You need to use MySQL or Redis as the database for this feature to work properly. """) - // TODO: add auto detect for proxy mode initial value (do NOT remove the option just set the initial value) + // TODO: Make a pinger or something to detect if the proxy mode is enabled or not val proxyMode: Boolean = false, @Comment("Cache update period in ticks. low values may cause performance issues.") val cacheUpdatePeriodTicks: Long = 20, diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt index 81543868..08f31c51 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt @@ -1,18 +1,22 @@ package org.sayandev.sayanvanish.bukkit.feature.features +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive import net.kyori.adventure.text.Component import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.StickyNote.runSync +import org.sayandev.stickynote.bukkit.StickyNote +import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component +import org.sayandev.stickynote.bukkit.warn import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment @@ -22,9 +26,9 @@ class FeatureActionbar( @Comment("The content of the actionbar message.") @Configurable val content: String = "You are currently vanished!", @Comment("The delay before the actionbar message is sent. doesn't really matter.") - @Configurable val delay: Long = 20, + @Configurable val delayMillis: Long = 1000, @Comment("The period between each actionbar message. values higher than 40 will make it not always visible.") - @Configurable val period: Long = 20, + @Configurable val periodMillis: Long = 1000, ) : ListenedFeature("actionbar") { @EventHandler @@ -42,12 +46,17 @@ class FeatureActionbar( } override fun enable() { - runSync({ - for (user in onlinePlayers.filter { it.hasPermission(Permission.VANISH.permission()) }.mapNotNull { it.cachedVanishUser() }.filter { it.isVanished }) { - if (!isActive(user)) continue - user.sendActionbar(content.component()) + launch { + delay(delayMillis) + while (StickyNote.plugin().isEnabled && enabled && isActive) { + warn("vanished users: ${VanishAPI.get().getCacheService().getVanishUsers().values.joinToString(" ,") { "${it.username}:${it.isVanished}" }}") + for (user in onlinePlayers.mapNotNull { it.cachedVanishUser() }.filter { it.isVanished }) { + if (!isActive(user)) continue + user.sendActionbar(content.component()) + } + delay(periodMillis) } - }, delay, period) + } super.enable() } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt index b6111622..2982512b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt @@ -10,9 +10,8 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature @@ -103,8 +102,8 @@ class FeatureLevel( if (((vanishUser != null && !isActive(vanishUser) || !isActive())) || !seeAsSpectator) return runSync({ val playerVanishLevel = player.cachedVanishUser()?.vanishLevel ?: -1 - for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { BukkitPlatformAdapter.adapt(it).player() != null && it.uniqueId != player.uniqueId }) { - val vanishedPlayer = BukkitPlatformAdapter.adapt(user).player() ?: continue + for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { it.bukkitAdapt().player() != null && it.uniqueId != player.uniqueId }) { + val vanishedPlayer = user.bukkitAdapt().player() ?: continue if (playerVanishLevel >= user.vanishLevel && user.hasPermission(Permission.VANISH.permission())) { player.sendPacket(PacketUtils.getUpdateGameModePacket(NMSUtils.getServerPlayer(vanishedPlayer), GameMode.SPECTATOR)) } @@ -119,7 +118,7 @@ class FeatureLevel( if ((user != null && !isActive(user)) || !isActive()) return runSync({ val playerVanishLevel = player.cachedVanishUser()?.vanishLevel ?: -1 - for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { BukkitPlatformAdapter.adapt(it).player() != null && it.uniqueId != player.uniqueId }) { + for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { it.bukkitAdapt().player() != null && it.uniqueId != player.uniqueId }) { val vanishedPlayer = BukkitPlatformAdapter.adapt(user).player() ?: continue if (playerVanishLevel < user.vanishLevel || !player.hasPermission(Permission.VANISH.permission())) { hidePlayer(player, vanishedPlayer) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt index 1907dd09..8360fc7b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt @@ -5,9 +5,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerInteractEntityEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter +import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -27,7 +26,7 @@ class FeatureRideEntity( .filterIsInstance() .mapNotNull { player -> player.cachedVanishUser() } .filter { it.isVanished } - .mapNotNull { BukkitPlatformAdapter.adapt(it).player() } + .mapNotNull { it.bukkitAdapt().player() } for (vanishedPassenger in vanishedPassengers) { vanishedPassenger.leaveVehicle() vanishedPassenger.sendComponent(exitMessage) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index dac8918e..c2c28d80 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -62,9 +62,12 @@ class FeatureState( tempUser.isVanished = true launch { tempUser.disappear(vanishJoinOptions) - tempUser.save() } } + + launch { + tempUser.saveAndSync() + } return } @@ -118,7 +121,7 @@ class FeatureState( user.isOnline = false launch { - user.save() + user.saveAndSync() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt index f2abaadf..da063e27 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt @@ -6,15 +6,11 @@ import net.citizensnpcs.api.ai.speech.event.SpeechEvent import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.Listener -import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.stickynote.bukkit.registerListener import org.spongepowered.configurate.objectmapping.ConfigSerializable import org.spongepowered.configurate.objectmapping.meta.Comment @@ -58,7 +54,7 @@ private class CitizensHookImpl(val feature: FeatureHookCitizens): Listener { } private fun checkContext(context: SpeechContext): Boolean { - val contains = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { it.isOnline }.mapNotNull { BukkitPlatformAdapter.adapt(it).player() }.any { context.message.contains(it.name) } + val contains = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { it.isOnline }.mapNotNull { it.bukkitAdapt().player() }.any { context.message.contains(it.name) } if (contains) return false val iterator = context.iterator() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt index b6022439..a5e02802 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt @@ -5,8 +5,7 @@ import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI +import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.utils.ServerVersion @@ -19,7 +18,7 @@ class FeaturePreventServerPing: ListenedFeature("prevent_server_ping", category @EventHandler private fun onPing(event: PaperServerListPingEvent) { if (!isActive()) return - val vanishedPlayers = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { BukkitPlatformAdapter.adapt(it).player() != null } + val vanishedPlayers = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { it.bukkitAdapt().player() != null } event.numPlayers -= vanishedPlayers.count() if (StickyNote.isPaper && ServerVersion.supports(21)) { event.listedPlayers.removeIf { profile -> vanishedPlayers.map { vanishedPlayer -> vanishedPlayer.uniqueId }.contains(profile.id) } From 146ebbbe0ac9bb19220ef4ad1143772dc8b9d3d1 Mon Sep 17 00:00:00 2001 From: Syren Date: Fri, 18 Jul 2025 17:51:25 +0330 Subject: [PATCH 28/67] chore: everything seems to work just fine on bukkit now --- build.gradle.kts | 4 ++++ .../kotlin/org/sayandev/sayanvanish/api/Permission.kt | 2 +- .../org/sayandev/sayanvanish/api/SayanVanishAPI.kt | 3 ++- .../sayandev/sayanvanish/api/cache/MemoryCacheService.kt | 8 ++++++++ .../sayanvanish/api/message/TypedMessagingService.kt | 9 ++++++++- .../api/message/types/RedisMessagingService.kt | 4 ++-- .../api/message/types/WebSocketMessagingService.kt | 4 ++-- .../sayandev/sayanvanish/api/storage/PlatformTable.kt | 2 +- .../org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt | 3 ++- .../bukkit/feature/features/FeatureActionbar.kt | 1 - 10 files changed, 30 insertions(+), 10 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2711438d..a7e97797 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -79,6 +79,10 @@ allprojects { plugins.apply("org.sayandev.stickynote.project") plugins.apply("com.modrinth.minotaur") + stickynote { + relocate(!gradle.startParameter.taskNames.any { it.startsWith("runServer") || it.startsWith("runVelocity") }) + } + repositories { mavenLocal() mavenCentral() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt index d598583c..db59c710 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt @@ -10,6 +10,6 @@ enum class Permission(val value: String) { FLY("action.vanish.fly"); fun permission(): String { - return "${Platform.get().id.lowercase()}.${value}" + return "${Platform.get().pluginName.lowercase()}.${value}" } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index 1c1267be..f9ff3871 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -29,10 +29,11 @@ object SayanVanishAPI : VanishAPI { return cacheService } - init { + fun initialize() { runBlocking { database.initialize().await() messagingService.initialize().await() + cacheService.fetchData() } launch(database.dispatcher) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt index 2c241fe6..2b0c09df 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt @@ -1,11 +1,19 @@ package org.sayandev.sayanvanish.api.cache +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.cache.caches.IUserCache import org.sayandev.sayanvanish.api.cache.caches.IVanishUserCache import org.sayandev.sayanvanish.api.cache.caches.UserCache import org.sayandev.sayanvanish.api.cache.caches.VanishUserCache class MemoryCacheService : CacheService { + suspend fun fetchData() { + Users.putAll(VanishAPI.get().getDatabase().getUsers().await().filter { it.isOnline }.associateBy(User::uniqueId)) + VanishUsers.putAll(VanishAPI.get().getDatabase().getVanishUsers().await().associateBy(VanishUser::uniqueId)) + } + object Users : IUserCache by UserCache() object VanishUsers : IVanishUserCache by VanishUserCache() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt index e3d138ed..dd558f5e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt @@ -7,7 +7,9 @@ import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.message.types.RedisMessagingService import org.sayandev.sayanvanish.api.message.types.WebSocketMessagingService +import org.sayandev.sayanvanish.api.utils.Gson import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher +import org.sayandev.stickynote.core.messaging.PayloadWrapper class TypedMessagingService: MessagingService { override val dispatcher = @@ -20,6 +22,11 @@ class TypedMessagingService: MessagingService { var messagingConnected: Boolean = true suspend fun initialize(): Deferred { + PayloadWrapper.registerSerializer(User::class.java, User.JsonAdapter()) + PayloadWrapper.registerDeserializer(User::class.java, User.JsonAdapter()) + PayloadWrapper.registerDeserializer(VanishUser::class.java, VanishUser.JsonAdapter()) + PayloadWrapper.registerDeserializer(VanishUser::class.java, VanishUser.JsonAdapter()) + val messagingTypes = messageConfig.categoryTypes.map { it.type }.distinct() for (method in messagingTypes) { when { @@ -60,7 +67,7 @@ class TypedMessagingService: MessagingService { } override suspend fun syncVanishUser(vanishUser: VanishUser): Deferred { - return messagingService(MessagingCategoryTypes.SYNC_USER).syncUser(vanishUser) + return messagingService(MessagingCategoryTypes.SYNC_VANISH_USER).syncVanishUser(vanishUser) } fun messagingService(type: MessagingType): MessagingService { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index c04a91fe..40f60119 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -39,7 +39,7 @@ class RedisMessagingService( } inner class SyncUserPublisher : RedisPublisher( - MessageMeta.create(Platform.get().id.lowercase(), MessagingCategoryTypes.SYNC_USER.id), + MessageMeta.create(Platform.get().pluginName.lowercase(), MessagingCategoryTypes.SYNC_USER.id), RedisConnectionMeta(connection.redis, dispatcher), Platform.get().logger ) { @@ -68,7 +68,7 @@ class RedisMessagingService( } inner class SyncVanishUserPublisher : RedisPublisher( - MessageMeta.create(Platform.get().id.lowercase(), MessagingCategoryTypes.SYNC_VANISH_USER.id), + MessageMeta.create(Platform.get().pluginName.lowercase(), MessagingCategoryTypes.SYNC_VANISH_USER.id), RedisConnectionMeta(connection.redis, dispatcher), Platform.get().logger ) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt index 094b6a87..61283076 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -35,7 +35,7 @@ class WebSocketMessagingService( } inner class SyncUserPublisher : WebSocketPublisher( - MessageMeta.create(Platform.get().id.lowercase(), MessagingCategoryTypes.SYNC_USER.id), + MessageMeta.create(Platform.get().pluginName.lowercase(), MessagingCategoryTypes.SYNC_USER.id), WebSocketConnectionMeta(URI.create(config.uri), dispatcher), Platform.get().logger ) { @@ -64,7 +64,7 @@ class WebSocketMessagingService( } inner class SyncVanishUserPublisher : WebSocketPublisher( - MessageMeta.create(Platform.get().id.lowercase(), MessagingCategoryTypes.SYNC_VANISH_USER.id), + MessageMeta.create(Platform.get().pluginName.lowercase(), MessagingCategoryTypes.SYNC_VANISH_USER.id), WebSocketConnectionMeta(URI.create(config.uri), dispatcher), Platform.get().logger ) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt index 198dd1e4..a25b59ce 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt @@ -3,4 +3,4 @@ package org.sayandev.sayanvanish.api.storage import org.jetbrains.exposed.v1.core.Table import org.sayandev.sayanvanish.api.Platform -open class PlatformTable(name: String) : Table("${Platform.get().id.lowercase()}_${name}") \ No newline at end of file +open class PlatformTable(name: String) : Table("${Platform.get().pluginName.lowercase()}_${name}") \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt index 28425267..921df086 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.runBlocking import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.storage.DatabaseType import org.sayandev.sayanvanish.api.storage.sql.SQLConfig @@ -29,7 +30,7 @@ class SayanVanishPlugin : JavaPlugin() { return } - SayanVanishBukkitAPI() + SayanVanishAPI.initialize() Settings.reload() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt index 08f31c51..9d5e7456 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt @@ -49,7 +49,6 @@ class FeatureActionbar( launch { delay(delayMillis) while (StickyNote.plugin().isEnabled && enabled && isActive) { - warn("vanished users: ${VanishAPI.get().getCacheService().getVanishUsers().values.joinToString(" ,") { "${it.username}:${it.isVanished}" }}") for (user in onlinePlayers.mapNotNull { it.cachedVanishUser() }.filter { it.isVanished }) { if (!isActive(user)) continue user.sendActionbar(content.component()) From 232f7bdd065e220f058f292513f2ea8ec8bd737c Mon Sep 17 00:00:00 2001 From: Syren Date: Sat, 19 Jul 2025 18:55:13 +0330 Subject: [PATCH 29/67] feat: update configuration system --- build.gradle.kts | 18 +++- gradle/wrapper/gradle-wrapper.properties | 2 +- .../org/sayandev/sayanvanish/api/Platform.kt | 9 +- .../org/sayandev/sayanvanish/api/User.kt | 2 +- .../sayanvanish/api/feature/Feature.kt | 32 +++---- .../api/feature/RegisteredFeatureHandler.kt | 2 + .../api/feature/category/FeatureCategories.kt | 3 + .../api/feature/category/FeatureCategory.kt | 4 - .../sayanvanish/api/message/MessageConfig.kt | 27 +++--- .../api/message/MessagingCategoryType.kt | 35 +++---- .../api/message/MessagingCategoryTypes.kt | 3 + .../sayanvanish/api/message/MessagingTypes.kt | 3 + .../sayanvanish/api/storage/DatabaseType.kt | 3 + .../sayanvanish/api/storage/PlatformTable.kt | 2 +- .../sayanvanish/api/storage/StorageConfig.kt | 29 +++--- .../api/storage/TransactionDatabase.kt | 3 + .../api/storage/TransactionType.kt | 35 +++---- .../api/storage/TransactionTypes.kt | 3 + .../api/storage/redis/RedisConfig.kt | 23 ++--- .../sayanvanish/api/storage/sql/SQLConfig.kt | 41 +++++---- .../api/storage/sql/SQLDatabase.kt | 22 +++-- .../api/storage/websocket/WebSocketConfig.kt | 6 +- .../sayanvanish/bukkit/BukkitPlatform.kt | 91 ++++++++++++++++++- .../sayanvanish/bukkit/SayanVanishPlugin.kt | 9 +- .../sayanvanish/bukkit/api/BukkitUser.kt | 2 +- .../bukkit/api/BukkitVanishUser.kt | 6 +- .../bukkit/command/SayanVanishCommand.kt | 10 +- .../bukkit/config/LanguageConfig.kt | 25 +++-- .../sayanvanish/bukkit/config/Settings.kt | 69 +++++++------- .../sayanvanish/bukkit/feature/HookFeature.kt | 13 +-- .../bukkit/feature/ListenedFeature.kt | 17 ++-- .../feature/features/FeatureActionbar.kt | 16 ++-- .../bukkit/feature/features/FeatureEffect.kt | 53 +++++++---- .../feature/features/FeatureFakeMessage.kt | 50 +++++----- .../bukkit/feature/features/FeatureFly.kt | 10 +- .../feature/features/FeatureGameMode.kt | 14 +-- .../features/FeatureInventoryInspect.kt | 10 +- .../features/FeatureInvulnerability.kt | 10 +- .../bukkit/feature/features/FeatureLevel.kt | 31 ++++--- .../feature/features/FeatureRideEntity.kt | 6 +- .../features/FeatureSilentContainer.kt | 7 +- .../bukkit/feature/features/FeatureState.kt | 30 +++--- .../bukkit/feature/features/FeatureUpdate.kt | 24 ++--- .../hook/FeatureHookAdvancedServerList.kt | 9 +- .../features/hook/FeatureHookCitizens.kt | 10 +- .../features/hook/FeatureHookDiscordSRV.kt | 16 ++-- .../features/hook/FeatureHookDynmap.kt | 6 +- .../features/hook/FeatureHookEssentials.kt | 12 ++- ...ckPermsHook.kt => FeatureHookLuckPerms.kt} | 29 +++--- .../hook/FeatureHookMiniPlaceholders.kt | 6 +- .../features/hook/FeatureHookPl3xMap.kt | 6 +- .../hook/FeatureHookPlaceholderAPI.kt | 29 +++--- .../features/hook/FeatureHookSquareMap.kt | 6 +- .../feature/features/hook/FeatureHookTAB.kt | 8 +- .../FeaturePreventAdvancementAnnounce.kt | 12 ++- .../prevent/FeaturePreventBlockBreak.kt | 6 +- .../prevent/FeaturePreventBlockGrief.kt | 6 +- .../prevent/FeaturePreventBlockPlace.kt | 6 +- .../features/prevent/FeaturePreventChat.kt | 14 +-- .../prevent/FeaturePreventCreatureTarget.kt | 6 +- .../features/prevent/FeaturePreventDamage.kt | 6 +- ...ge.kt => FeaturePreventFoodLevelChange.kt} | 9 +- .../prevent/FeaturePreventInteract.kt | 14 +-- .../features/prevent/FeaturePreventPickup.kt | 8 +- .../features/prevent/FeaturePreventPush.kt | 6 +- .../prevent/FeaturePreventRaidTrigger.kt | 6 +- .../features/prevent/FeaturePreventSculk.kt | 6 +- .../prevent/FeaturePreventServerPing.kt | 6 +- .../prevent/FeaturePreventSpawnerSpawn.kt | 6 +- .../prevent/FeaturePreventTabComplete.kt | 10 +- .../sayanvanish/bukkit/utils/PlayerUtils.kt | 2 +- .../bungeecord/api/BungeeVanishUser.kt | 2 +- .../bungeecord/feature/HookFeature.kt | 4 +- .../bungeecord/feature/ListenedFeature.kt | 4 +- .../feature/features/FeatureSyncEvents.kt | 4 +- .../prevent/FeaturePreventTabComplete.kt | 4 +- .../bungeecord/utils/PlayerUtils.kt | 4 +- .../velocity/api/VelocityVanishUser.kt | 2 +- .../SayanVanishProxyCommandVelocity.kt | 2 +- .../velocity/feature/HookFeature.kt | 4 +- .../velocity/feature/ListenedFeature.kt | 4 +- .../feature/features/FeatureSyncEvents.kt | 8 +- .../feature/features/FeatureUpdate.kt | 20 ++-- .../feature/features/FeatureUpdatePing.kt | 4 +- .../hook/FeatureHookAdvancedServerList.kt | 4 +- .../hook/FeatureHookEnhancedVelocity.kt | 4 +- .../hook/FeatureHookMiniPlaceholders.kt | 4 +- .../feature/features/hook/FeatureHookTAB.kt | 8 +- .../features/hook/FeatureHookVelocitab.kt | 12 +-- .../features/hook/FeatureLuckPermsHook.kt | 10 +- .../prevent/FeaturePreventTabComplete.kt | 8 +- .../sayanvanish/velocity/utils/PlayerUtils.kt | 4 +- .../proxy/config/LanguageConfig.kt | 19 ++-- .../proxy/config/SettingsConfig.kt | 32 +++---- settings.gradle.kts | 2 +- 95 files changed, 737 insertions(+), 512 deletions(-) rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/{FeatureLuckPermsHook.kt => FeatureHookLuckPerms.kt} (81%) rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/{PreventFoodLevelChange.kt => FeaturePreventFoodLevelChange.kt} (83%) diff --git a/build.gradle.kts b/build.gradle.kts index a7e97797..3ce0d147 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,8 +6,9 @@ import java.net.HttpURLConnection import java.net.URL plugins { - java kotlin("jvm") version "2.1.0" + kotlin("plugin.serialization") version "2.1.0" + java `maven-publish` id("io.papermc.hangar-publish-plugin") version "0.1.2" id("com.modrinth.minotaur") version "2.8.7" @@ -35,9 +36,19 @@ fun lastCommitMessages(): String { println("Failed to fetch last commit messages from GitHub Actions API: ${connection.responseCode} ${connection.responseMessage}") return "No recent commits found." } - val sha = JsonParser.parseString(response).asJsonObject.getAsJsonArray("workflow_runs").get(0).asJsonObject.get("head_sha").asString + val sha = JsonParser.parseString(response).asJsonObject.getAsJsonArray("workflow_runs").let { + if (it.size() == 0) { + null + } else { + it.get(0).asJsonObject.get("head_sha").asString + } + } - return executeGitCommand("log", "--pretty=format:%C(auto)%h %s %C(blue)<%an>", "$sha..HEAD") + return if (sha != null) { + executeGitCommand("log", "--pretty=format:%C(auto)%h %s %C(blue)<%an>", "$sha..HEAD") + } else { + "No changes" + } } fun lastReleaseCommitMessages(): String { @@ -78,6 +89,7 @@ allprojects { plugins.apply("kotlin") plugins.apply("org.sayandev.stickynote.project") plugins.apply("com.modrinth.minotaur") + plugins.apply("org.jetbrains.kotlin.plugin.serialization") stickynote { relocate(!gradle.startParameter.taskNames.any { it.startsWith("runServer") || it.startsWith("runVelocity") }) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cea7a793..d4081da4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index d3971b7c..14c64900 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -1,8 +1,11 @@ package org.sayandev.sayanvanish.api import kotlinx.coroutines.runBlocking -import org.sayandev.sayanvanish.api.storage.TransactionDatabase +import kotlinx.serialization.modules.EmptySerializersModule +import kotlinx.serialization.modules.SerializersModule import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler +import org.sayandev.sayanvanish.api.storage.TransactionDatabase +import org.sayandev.stickynote.core.configuration.Config import java.io.File import java.util.logging.Logger @@ -13,6 +16,7 @@ open class Platform( var rootDirectory: File, var serverId: String, val adapter: PlatformAdapter, + val serializers: SerializersModule = EmptySerializersModule() ) { @JvmSynthetic @@ -58,6 +62,9 @@ open class Platform( @JvmStatic fun setAndRegister(platform: Platform): Boolean { setPlatform(platform) + + Config.registerSerializersModule(platform.serializers) + platform.registerBlocking() (VanishAPI.get().getDatabase() as? TransactionDatabase)?.let { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 0cf34c54..64fe01df 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.Deferred import kotlinx.coroutines.awaitAll import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking -import net.kyori.adventure.text.Component +import org.sayandev.sayanventure.adventure.text.Component import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.stickynote.core.utils.async import java.lang.reflect.Type diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt index b18d6bd5..7314fcbe 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt @@ -1,25 +1,22 @@ package org.sayandev.sayanvanish.api.feature +import com.charleskorn.kaml.Yaml +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.core.configuration.Config -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.serialize.TypeSerializerCollection import java.io.File -@ConfigSerializable +@Serializable abstract class Feature( - val id: String, - open var enabled: Boolean = true, - @Transient val category: FeatureCategories = FeatureCategories.DEFAULT, - @Transient val additionalSerializers: TypeSerializerCollection = TypeSerializerCollection.defaults(), - @Transient val critical: Boolean = false -) : Config( - directory(category), - "${id}.yml", - additionalSerializers + @Transient open val id: String = "@transient", + open var enabled: Boolean, + @Transient open val category: FeatureCategories = FeatureCategories.DEFAULT, + @Transient open val critical: Boolean = false ) { + @Transient open var condition: Boolean = true open fun isActive(): Boolean { @@ -67,6 +64,10 @@ abstract class Feature( loadAndRegister(this) } + fun save() { + Config.save(File(directory(category), "${id}.yml"), this, Yaml(Platform.get().serializers, Config.yaml.configuration)) + } + companion object { fun directory(category: FeatureCategories) = when (category.directory) { @@ -83,15 +84,14 @@ abstract class Feature( return createFromInstance(freshInstance) } - fun createFromInstance(feature: Feature): Feature { + inline fun createFromInstance(feature: T): T { val category = feature.category - val instance = getConfigFromFile(File( + val instance = Config.fromFile(File( if (category.directory == null) { File(Platform.get().rootDirectory, "features") } else { File(File(Platform.get().rootDirectory, "features"), category.directory) - }, "${feature.id}.yml"), - feature.additionalSerializers)?.get(feature::class.java) ?: feature + }, "${feature.id}.yml"), Platform.get().serializers) ?: feature if (instance.enabled) { instance.enable() } else { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt index 6af12d59..89fb2c0e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt @@ -1,7 +1,9 @@ package org.sayandev.sayanvanish.api.feature +import kotlinx.serialization.modules.SerializersModule import org.reflections.Reflections import org.sayandev.sayanvanish.api.Platform +import org.sayandev.stickynote.core.configuration.Config import java.io.IOException import java.net.URL import java.security.CodeSource diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategories.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategories.kt index e2180e7b..bed8552f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategories.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategories.kt @@ -1,5 +1,8 @@ package org.sayandev.sayanvanish.api.feature.category +import kotlinx.serialization.Serializable + +@Serializable enum class FeatureCategories(override val directory: String?) : FeatureCategory { HOOK("hooks"), PREVENTION("preventions"), diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategory.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategory.kt index 4a675f40..cd5a822a 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategory.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategory.kt @@ -1,9 +1,5 @@ package org.sayandev.sayanvanish.api.feature.category -import org.spongepowered.configurate.objectmapping.ConfigSerializable - -@ConfigSerializable interface FeatureCategory { - val directory: String? } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt index 95dc7d29..1451722b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt @@ -4,24 +4,29 @@ import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.storage.redis.RedisConfig import org.sayandev.sayanvanish.api.storage.websocket.WebSocketConfig import org.sayandev.stickynote.core.configuration.Config -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment -import org.spongepowered.configurate.serialize.TypeSerializerCollection +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import java.io.File // TODO: use a singleton or something, i don't want global scope variables like this anymore public var messageConfig = MessageConfig.fromConfig() ?: MessageConfig.defaultConfig() -@ConfigSerializable +@Serializable class MessageConfig( - @Comment("Configuration for Redis database") + @YamlComment("Configuration for Redis database") val threadCount: Int = 5, val redis: RedisConfig = RedisConfig(), val webSocketConfig: WebSocketConfig = WebSocketConfig(), val categoryTypes: List = MessagingCategoryTypes.entries, -) : Config(Platform.get().rootDirectory, fileName, serializers()) { +) { + + fun save() { + Config.save(File(Platform.get().rootDirectory, FILE_NAME), this) + } + companion object { - private val fileName = "message.yml" + private const val FILE_NAME = "message.yml" @JvmStatic fun defaultConfig(): MessageConfig { @@ -30,13 +35,7 @@ class MessageConfig( @JvmStatic fun fromConfig(): MessageConfig? { - return fromConfig(File(Platform.get().rootDirectory, fileName), serializers()) - } - - fun serializers(): TypeSerializerCollection { - return TypeSerializerCollection.builder() - .register(MessagingCategoryType::class.java, MessagingCategoryType.Serializer) - .build() + return Config.fromFile(File(Platform.get().rootDirectory, FILE_NAME)) } } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt index 2340939d..32a1c9ca 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt @@ -1,35 +1,24 @@ package org.sayandev.sayanvanish.api.message -import org.spongepowered.configurate.ConfigurationNode -import org.spongepowered.configurate.serialize.TypeSerializer -import java.lang.reflect.Type +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +@Serializable(with = MessagingCategoryType.Serializer::class) interface MessagingCategoryType { val id: String val type: MessagingTypes - object Serializer : TypeSerializer { - override fun deserialize( - type: Type, - node: ConfigurationNode - ): MessagingCategoryType { - return object : MessagingCategoryType { - override val id: String = node.node("id").string!! - override val type: MessagingTypes = node.node("type").get(MessagingTypes::class.java)!! + object Serializer : KSerializer { + override val descriptor = MessagingCategoryTypes.serializer().descriptor + override fun serialize(encoder: Encoder, value: MessagingCategoryType) { + when (value) { + is MessagingCategoryTypes -> MessagingCategoryTypes.serializer().serialize(encoder, value) } } - - override fun serialize( - type: Type, - obj: MessagingCategoryType?, - node: ConfigurationNode - ) { - if (obj == null) { - node.raw(null) - return - } - node.node("id").set(obj.id) - node.node("type").set(obj.type) + override fun deserialize(decoder: Decoder): MessagingCategoryType { + return MessagingCategoryTypes.serializer().deserialize(decoder) } } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt index ba014cf9..15330176 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt @@ -1,5 +1,8 @@ package org.sayandev.sayanvanish.api.message +import kotlinx.serialization.Serializable + +@Serializable enum class MessagingCategoryTypes( override val id: String, override val type: MessagingTypes, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt index 5748ce83..83e75b67 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt @@ -1,5 +1,8 @@ package org.sayandev.sayanvanish.api.message +import kotlinx.serialization.Serializable + +@Serializable enum class MessagingTypes( override val id: String ) : MessagingType { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt index 6393d441..e0ba25a2 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt @@ -1,5 +1,8 @@ package org.sayandev.sayanvanish.api.storage +import kotlinx.serialization.Serializable + +@Serializable enum class DatabaseType { SQL, REDIS, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt index a25b59ce..1bdafd62 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.api.storage -import org.jetbrains.exposed.v1.core.Table +import org.jetbrains.exposed.sql.Table import org.sayandev.sayanvanish.api.Platform open class PlatformTable(name: String) : Table("${Platform.get().pluginName.lowercase()}_${name}") \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt index 5c3fa31a..7da352cb 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt @@ -5,24 +5,26 @@ import org.sayandev.sayanvanish.api.storage.redis.RedisConfig import org.sayandev.sayanvanish.api.storage.sql.SQLConfig import org.sayandev.sayanvanish.api.storage.websocket.WebSocketConfig import org.sayandev.stickynote.core.configuration.Config -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import com.charleskorn.kaml.YamlComment +import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import org.spongepowered.configurate.serialize.TypeSerializerCollection import java.io.File public var storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultConfig() -@ConfigSerializable +@Serializable class StorageConfig( val transactionThreadCount: Int = 5, - @Comment("Configuration for the database, including method, SQL, Redis, and caching options.") + @YamlComment("Configuration for the database, including method, SQL, Redis, and caching options.") val method: DatabaseType = DatabaseType.SQL, - @Comment("Configuration for SQL database") + @YamlComment("Configuration for SQL database") val sql: SQLConfig = SQLConfig(), - @Comment("Configuration for Redis database") + @YamlComment("Configuration for Redis database") val redis: RedisConfig = RedisConfig(), val transactionTypes: MutableList = TransactionTypes.entries.toMutableList(), -) : Config(Platform.get().rootDirectory, FILE_NAME, serializers()) { +) { init { // Make sure to add missing transaction types to configuration file @@ -36,8 +38,13 @@ class StorageConfig( } } + fun save() { + Config.save(file, this) + } + companion object { private const val FILE_NAME = "storage.yml" + val file = File(Platform.get().rootDirectory, FILE_NAME) @JvmStatic fun defaultConfig(): StorageConfig { @@ -46,13 +53,7 @@ class StorageConfig( @JvmStatic fun fromConfig(): StorageConfig? { - return fromConfig(File(Platform.get().rootDirectory, FILE_NAME), serializers()) - } - - fun serializers(): TypeSerializerCollection { - return TypeSerializerCollection.builder() - .register(TransactionType::class.java, TransactionType.Serializer) - .build() + return Config.fromFile(File(Platform.get().rootDirectory, FILE_NAME)) } } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt index 96286336..d73811d8 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt @@ -7,11 +7,14 @@ import kotlinx.coroutines.Deferred import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.isActive +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.storage.redis.RedisDatabase import org.sayandev.sayanvanish.api.storage.sql.SQLDatabase +import org.sayandev.stickynote.core.configuration.Config import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import java.util.* diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt index 59ce911a..253d03ea 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt @@ -1,35 +1,24 @@ package org.sayandev.sayanvanish.api.storage -import org.spongepowered.configurate.ConfigurationNode -import org.spongepowered.configurate.serialize.TypeSerializer -import java.lang.reflect.Type +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +@Serializable(with = TransactionType.Serializer::class) interface TransactionType { val id: String val type: DatabaseType - object Serializer : TypeSerializer { - override fun deserialize( - type: Type, - node: ConfigurationNode - ): TransactionType { - return object : TransactionType { - override val id: String = node.node("id").string!! - override val type: DatabaseType = node.node("type").get(DatabaseType::class.java)!! + object Serializer : KSerializer { + override val descriptor = TransactionTypes.serializer().descriptor + override fun serialize(encoder: Encoder, value: TransactionType) { + when (value) { + is TransactionTypes -> TransactionTypes.serializer().serialize(encoder, value) } } - - override fun serialize( - type: Type, - obj: TransactionType?, - node: ConfigurationNode - ) { - if (obj == null) { - node.raw(null) - return - } - node.node("id").set(obj.id) - node.node("type").set(obj.type) + override fun deserialize(decoder: Decoder): TransactionType { + return TransactionTypes.serializer().deserialize(decoder) } } } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt index f9c5b672..b0286bd8 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt @@ -1,5 +1,8 @@ package org.sayandev.sayanvanish.api.storage +import kotlinx.serialization.Serializable + +@Serializable enum class TransactionTypes( override val id: String, override val type: DatabaseType, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt index 8f85bd39..3aa73f83 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt @@ -1,31 +1,32 @@ package org.sayandev.sayanvanish.api.storage.redis -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment -@ConfigSerializable +@Serializable data class RedisConfig( val threadCount: Int = 5, - @Comment("The type of Redis configuration. Available types: STANDALONE") + @YamlComment("The type of Redis configuration. Available types: STANDALONE") val type: RedisType = RedisType.STANDALONE, - @Comment("Configuration for standalone Redis setup") + @YamlComment("Configuration for standalone Redis setup") val standalone: Standalone = Standalone(), ) { - @ConfigSerializable + @Serializable data class Standalone( - @Comment("The host address of the Redis database. If it's an IP address (x.x.x.x), ensure it is enclosed in double quotes (`\"`).") + @YamlComment("The host address of the Redis database. If it's an IP address (x.x.x.x), ensure it is enclosed in double quotes (`\"`).") val host: String = "127.0.0.1", - @Comment("The port number of the Redis server") + @YamlComment("The port number of the Redis server") val port: Int = 6379, - @Comment("The username for accessing the Redis server") + @YamlComment("The username for accessing the Redis server") val user: String = "", - @Comment("The password for accessing the Redis server") + @YamlComment("The password for accessing the Redis server") val password: String = "", - @Comment("Whether to use SSL for the connection") + @YamlComment("Whether to use SSL for the connection") val ssl: Boolean = false ) + @Serializable enum class RedisType { STANDALONE } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt index 51ca0b25..711d443f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt @@ -1,51 +1,52 @@ package org.sayandev.sayanvanish.api.storage.sql -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment import org.spongepowered.configurate.objectmapping.meta.Setting -@ConfigSerializable +@Serializable class SQLConfig( val threadCount: Int = 5, - @Comment("The method to use for the database. Available methods: MYSQL, SQLITE") + @YamlComment("The method to use for the database. Available methods: MYSQL, SQLITE") val method: SQLMethod = SQLMethod.SQLITE, - @Comment("The host address of the SQL database. If it's an IP address (x.x.x.x), ensure it is enclosed in double quotes (`\"`).") + @YamlComment("The host address of the SQL database. If it's an IP address (x.x.x.x), ensure it is enclosed in double quotes (`\"`).") val host: String = "127.0.0.1", - @Comment("The port number of the SQL database") + @YamlComment("The port number of the SQL database") val port: Int = 3306, - @Comment("The name of the SQL database") + @YamlComment("The name of the SQL database") val database: String = "sayanvanish", - @Comment("The username for accessing the SQL database") + @YamlComment("The username for accessing the SQL database") val username: String = "minecraft", - @Comment("The password for accessing the SQL database") + @YamlComment("The password for accessing the SQL database") val password: String = "", - @Comment("Properties for the connection pool") + @YamlComment("Properties for the connection pool") val poolProperties: PoolProperties = PoolProperties(), - @Comment("The prefix for the table names in the SQL database") + @YamlComment("The prefix for the table names in the SQL database") // TODO: use this? val tablePrefix: String = "sayanvanish_", ) { - @ConfigSerializable + @Serializable data class PoolProperties( - @Comment("The maximum number of connections in the pool") + @YamlComment("The maximum number of connections in the pool") val maximumPoolSize: Int = 5, - @Comment("The minimum number of idle connections in the pool") + @YamlComment("The minimum number of idle connections in the pool") val minimumIdle: Int = 5, - @Comment("The maximum lifetime of a connection in the pool (in milliseconds)") + @YamlComment("The maximum lifetime of a connection in the pool (in milliseconds)") val maximumLifetime: Long = 1800000, - @Comment("The keepalive time for a connection in the pool (in milliseconds)") + @YamlComment("The keepalive time for a connection in the pool (in milliseconds)") val keepaliveTime: Long = 0, - @Comment("The connection timeout (in milliseconds)") + @YamlComment("The connection timeout (in milliseconds)") val connectionTimeout: Long = 5000, - @Comment("Whether to use SSL for the connection") + @YamlComment("Whether to use SSL for the connection") @Setting("use-ssl") val useSSL: Boolean = false, - @Comment("Whether to verify the server certificate") + @YamlComment("Whether to verify the server certificate") val verifyServerCertificate: Boolean = false, - @Comment("Whether to allow public key retrieval") + @YamlComment("Whether to allow public key retrieval") val allowPublicKeyRetrieval: Boolean = true, val maxLifetime: Long = 1800000, ) + @Serializable enum class SQLMethod { MYSQL, MARIADB, diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index 7fdbe051..6d3b1d27 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -3,12 +3,16 @@ package org.sayandev.sayanvanish.api.storage.sql import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.awaitAll -import org.jetbrains.exposed.v1.core.SqlExpressionBuilder.eq -import org.jetbrains.exposed.v1.core.Transaction -import org.jetbrains.exposed.v1.jdbc.* -import org.jetbrains.exposed.v1.jdbc.transactions.TransactionManager -import org.jetbrains.exposed.v1.jdbc.transactions.experimental.suspendedTransactionAsync -import org.jetbrains.exposed.v1.jdbc.transactions.transaction +import org.jetbrains.exposed.sql.SchemaUtils +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.Transaction +import org.jetbrains.exposed.sql.deleteAll +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.selectAll +import org.jetbrains.exposed.sql.transactions.TransactionManager +import org.jetbrains.exposed.sql.transactions.experimental.suspendedTransactionAsync +import org.jetbrains.exposed.sql.transactions.transaction +import org.jetbrains.exposed.sql.upsert import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishOptions @@ -20,6 +24,8 @@ import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import org.sayandev.stickynote.core.utils.CoroutineUtils import java.util.* +typealias ExposedDatabase = org.jetbrains.exposed.sql.Database + class SQLDatabase( val config: StorageConfig, ) : Database { @@ -37,7 +43,7 @@ class SQLDatabase( VanishUser.Schema, ) - lateinit var database: org.jetbrains.exposed.v1.jdbc.Database + lateinit var database: ExposedDatabase override suspend fun initialize(): Deferred { transaction { @@ -51,7 +57,7 @@ class SQLDatabase( override suspend fun connect(): Deferred { database = - org.jetbrains.exposed.v1.jdbc.Database.connect( + ExposedDatabase.connect( url = when (config.sql.method) { SQLConfig.SQLMethod.SQLITE -> "jdbc:sqlite:${Platform.get().rootDirectory.absolutePath}/database" diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt index 79e903ba..a62b44f0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt @@ -1,9 +1,9 @@ package org.sayandev.sayanvanish.api.storage.websocket -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment -@ConfigSerializable +@Serializable class WebSocketConfig( val threadCount: Int = 5, val uri: String = "ws://localhost:8083" diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt index 8fa53283..fd0f7e49 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt @@ -1,8 +1,45 @@ package org.sayandev.sayanvanish.bukkit +import kotlinx.serialization.modules.PolymorphicModuleBuilder +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter import org.sayandev.sayanvanish.bukkit.config.Settings +import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureActionbar +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureEffect +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureFakeMessage +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureFly +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureGameMode +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureInventoryInspect +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureInvulnerability +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureRideEntity +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureSilentContainer +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureState +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureUpdate +import org.sayandev.sayanvanish.bukkit.feature.features.hook.* +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeatureLegacyPreventPickup +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventAdvancementAnnounce +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventBlockBreak +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventBlockGrief +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventBlockPlace +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventChat +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventCreatureTarget +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventDamage +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventFoodLevelChange +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventInteract +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventPickup +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventPush +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventRaidTrigger +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventSculk +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventServerPing +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventSpawnerSpawn +import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventTabComplete import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.pluginDirectory @@ -12,5 +49,57 @@ class BukkitPlatform : Platform( plugin.logger, pluginDirectory, Settings.get().general.serverId, - BukkitPlatformAdapter + BukkitPlatformAdapter, + SerializersModule { + fun PolymorphicModuleBuilder.registerProjectSubclasses() { + /* Hooks */ + subclass(FeatureHookAdvancedServerList::class) + subclass(FeatureHookCitizens::class) + subclass(FeatureHookDiscordSRV::class) + subclass(FeatureHookDynmap::class) + subclass(FeatureHookEssentials::class) + subclass(FeatureHookLuckPerms::class) + subclass(FeatureHookMiniPlaceholders::class) + subclass(FeatureHookPl3xMap::class) + subclass(FeatureHookPlaceholderAPI::class) + subclass(FeatureHookSquareMap::class) + subclass(FeatureHookTAB::class) + + /* Prevention */ + subclass(FeaturePreventAdvancementAnnounce::class) + subclass(FeaturePreventBlockBreak::class) + subclass(FeaturePreventBlockGrief::class) + subclass(FeaturePreventBlockPlace::class) + subclass(FeaturePreventChat::class) + subclass(FeaturePreventCreatureTarget::class) + subclass(FeaturePreventDamage::class) + subclass(FeaturePreventFoodLevelChange::class) + subclass(FeaturePreventInteract::class) + subclass(FeaturePreventPickup::class) + subclass(FeatureLegacyPreventPickup::class) + subclass(FeaturePreventPush::class) + subclass(FeaturePreventRaidTrigger::class) + subclass(FeaturePreventSculk::class) + subclass(FeaturePreventServerPing::class) + subclass(FeaturePreventSpawnerSpawn::class) + subclass(FeaturePreventTabComplete::class) + + /* General */ + subclass(FeatureActionbar::class) + subclass(FeatureEffect::class) + subclass(FeatureFakeMessage::class) + subclass(FeatureFly::class) + subclass(FeatureGameMode::class) + subclass(FeatureInventoryInspect::class) + subclass(FeatureInvulnerability::class) + subclass(FeatureLevel::class) + subclass(FeatureRideEntity::class) + subclass(FeatureSilentContainer::class) + subclass(FeatureState::class) + subclass(FeatureUpdate::class) + } + polymorphic(Feature::class) { + registerProjectSubclasses() + } + } ) \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt index 921df086..19e28248 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt @@ -1,6 +1,7 @@ package org.sayandev.sayanvanish.bukkit import kotlinx.coroutines.runBlocking +import kotlinx.serialization.Serializable import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin import org.sayandev.sayanvanish.api.Platform @@ -10,7 +11,6 @@ import org.sayandev.sayanvanish.api.storage.DatabaseType import org.sayandev.sayanvanish.api.storage.sql.SQLConfig import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.bukkit.api.Metrics -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.command.SayanVanishCommand import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language @@ -59,6 +59,8 @@ class SayanVanishPlugin : JavaPlugin() { } } + abstract class MozAb + override fun onDisable() { runBlocking { Platform.get().unregister() @@ -70,6 +72,11 @@ class SayanVanishPlugin : JavaPlugin() { return this.file } + @Serializable + data class MozeTest( + val testsss: String = "moz" + ) + companion object { private lateinit var instance: SayanVanishPlugin diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index 561e0c74..40e92426 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.api -import net.kyori.adventure.text.Component +import org.sayandev.sayanventure.adventure.text.Component import org.bukkit.Bukkit import org.bukkit.permissions.Permission import org.bukkit.permissions.PermissionDefault diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 7c2ce916..fca1d701 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.api -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.Bukkit import org.bukkit.OfflinePlayer import org.bukkit.entity.Player @@ -19,7 +19,7 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel -import org.sayandev.sayanvanish.bukkit.feature.features.hook.FeatureLuckPermsHook +import org.sayandev.sayanvanish.bukkit.feature.features.hook.FeatureHookLuckPerms import org.sayandev.stickynote.bukkit.hasPlugin import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.plugin @@ -102,7 +102,7 @@ open class BukkitVanishUser( override fun hasPermission(permission: String): Boolean { return if (hasPlugin("LuckPerms")) { - val luckPermsFeature = Features.getFeature() + val luckPermsFeature = Features.getFeature() /* * I have to check if the player is op or not and luckperms feature is enabled so it doesn't disable all feature for op players * (bukkit permission check return true for all permissions if the player is op) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 19668333..023b3c28 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.command -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.OfflinePlayer import org.bukkit.command.CommandSender import org.bukkit.entity.Player @@ -19,6 +19,7 @@ import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Configurable +import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import org.sayandev.sayanvanish.api.storage.StorageConfig @@ -96,7 +97,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set if (target.isPresent) { if (!player.isOnline) { - sender.sendMessage(language.vanish.offlineOnVanish.component(Placeholder.unparsed("player", player.name ?: "N/A"), Placeholder.parsed("state", user.stateText()))) + sender.sendComponent(language.vanish.offlineOnVanish, Placeholder.unparsed("player", player.name ?: "N/A"), Placeholder.parsed("state", user.stateText())) options.sendMessage = false } } @@ -111,7 +112,6 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set init { manager.settings().set(ManagerSetting.OVERRIDE_EXISTING_COMMANDS, true) - registerHelpLiteral() var forceUpdateConfirm = false rawCommandBuilder().registerCopy { @@ -162,7 +162,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set "username", "password", ) - val databaseKey = Paste("yaml", storageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().await() + val databaseKey = Paste("yaml", StorageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().await() val settingsKey = Paste("yaml", Settings.settingsFile.readLines()).post().await() val latestLogFile = File(File(pluginDirectory.parentFile.parentFile, "logs"), "latest.log") if (latestLogFile.exists()) { @@ -170,7 +170,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val featurePastes = mutableMapOf>() for (feature in Features.features()) { - featurePastes[feature.id] = feature.file.readLines() + featurePastes[feature.id] = File(Feature.directory(feature.category), "${feature.id}.yml").readLines() } val featureKey = Paste("yaml", featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }).post().await() generateMainPaste(sender, mapOf( diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt index e18c021b..b63d935c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt @@ -1,21 +1,23 @@ package org.sayandev.sayanvanish.bukkit.config +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import org.sayandev.stickynote.bukkit.pluginDirectory import org.sayandev.stickynote.core.configuration.Config -import org.spongepowered.configurate.objectmapping.ConfigSerializable import java.io.File public var language: LanguageConfig = LanguageConfig.fromConfig() ?: LanguageConfig.defaultConfig() -@ConfigSerializable -class LanguageConfig( +@Serializable +data class LanguageConfig( val general: General = General(), val vanish: Vanish = Vanish(), val feature: Feature = Feature(), val paste: Paste = Paste() -) : Config(languageDirectory, "${Settings.get().general.language}.yml") { +) { - @ConfigSerializable + @Serializable data class General( val prefix: String = "<#67e8f9>SayanVanish | ", val reloaded: String = "Plugin successfully reloaded. Please note that some changes may require a server restart to take effect. Subsequent reloads may cause issues.", @@ -30,7 +32,7 @@ class LanguageConfig( val updateFailed: String = "Failed to update the plugin. Please try again later." ) - @ConfigSerializable + @Serializable data class Feature( val notFound: String = "Feature not found", val enabled: String = " has been enabled.", @@ -48,7 +50,7 @@ class LanguageConfig( val flyDisabled: String = "You don't have keep fly after reappear permission, fly has been disabled.", ) - @ConfigSerializable + @Serializable data class Vanish( val placeholderPrefix: String = "&7[Vanished]&r ", val placeholderSuffix: String = " &r&7[Vanished]", @@ -65,13 +67,18 @@ class LanguageConfig( val noPermissionToKeepVanished: String = "You don't have permission to keep your vanish status.", ) - @ConfigSerializable + @Serializable data class Paste( val use: String = "Your paste key is , Make sure to check the content before sharing it with others and remove the data you don't want to share. '>(Click to open in pastes.dev)", val generating: String = "Generating paste, please wait...", val failedToGenerate: String = "Failed to generate paste, please try again later and make sure your machine is connected to internet.", ) + fun save() { + Config.save(File(languageDirectory, "${Settings.get().general.language}.yml"), this) + } + + @Serializable enum class Language(val id: String) { EN_US("en_US"), } @@ -86,7 +93,7 @@ class LanguageConfig( @JvmStatic fun fromConfig(): LanguageConfig? { - return fromConfig(File(languageDirectory, "${Settings.get().general.language}.yml")) + return Config.fromFile(File(languageDirectory, "${Settings.get().general.language}.yml")) } } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt index 0c43322e..046ce05b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt @@ -1,64 +1,58 @@ package org.sayandev.sayanvanish.bukkit.config +import com.charleskorn.kaml.YamlComment import org.sayandev.sayanvanish.api.Platform import org.sayandev.stickynote.bukkit.pluginDirectory import org.sayandev.stickynote.core.configuration.Config -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import java.io.File import java.util.* -// TODO: Rename SettingsConfig to just `Settings` maybe? // TODO: switch to kotlinx-serialization for yaml too? -@ConfigSerializable +@Serializable class Settings( - @Comment(""" - Do NOT copy and paste the SayanVanish directory across multiple servers. - The server-id is generated during the plugin's first startup. - Duplicating this file could lead to synchronization issues. - - General settings for the plugin - """) + @YamlComment( + "Do NOT copy and paste the SayanVanish directory across multiple servers.", + "The server-id is generated during the plugin's first startup.", + "Duplicating this file could lead to synchronization issues.", + "", + "General settings for the plugin", + ) val general: General = General(), - @Comment("Command settings for the plugin") + @YamlComment("Command settings for the plugin") val vanishCommand: Command = Command(), -) : Config( - pluginDirectory, - FILE_NAME, ) { - @ConfigSerializable + @Serializable data class General( - @Comment("Unique server identifier. used for server identification if proxy mode is not enabled!") + @YamlComment("Unique server identifier. used for server identification if proxy mode is not enabled!") val serverId: String = "${Platform.get().id}-${UUID.randomUUID()}", - @Comment(""" - Language name - Note: By default, it only includes the `en_US` language. - However, you can create and add your own custom languages. - """) + @YamlComment("Language name", "Note: By default, it only includes the `en_US` language.", "However, you can create and add your own custom languages.") val language: String = LanguageConfig.Language.EN_US.id, - @Comment("Whether to include prefix in messages, can be found in the language file.") + @YamlComment("Whether to include prefix in messages, can be found in the language file.") val includePrefixInMessages: Boolean = true, - @Comment("Enable or disable bStats metrics") + @YamlComment("Enable or disable bStats metrics") val bstats: Boolean = true, - @Comment(""" - If you want to synchronize the vanish status of players across multiple servers, enable this. - You will also need to install the SayanVanish proxy plugin on your proxy server. - WARNING: You need to use MySQL or Redis as the database for this feature to work properly. - """) + @YamlComment( + "If you want to synchronize the vanish status of players across multiple servers, enable this.", + "You will also need to install the SayanVanish proxy plugin on your proxy server.", + "WARNING: You need to use MySQL or Redis as the database for this feature to work properly.", + ) // TODO: Make a pinger or something to detect if the proxy mode is enabled or not val proxyMode: Boolean = false, - @Comment("Cache update period in ticks. low values may cause performance issues.") + @YamlComment("Cache update period in ticks. low values may cause performance issues.") val cacheUpdatePeriodTicks: Long = 20, - @Comment("Basic cache update period in ticks. low values may cause performance issues.") + @YamlComment("Basic cache update period in ticks. low values may cause performance issues.") val basicCacheUpdatePeriodTicks: Long = 20, ) - @ConfigSerializable + @Serializable data class Command( - @Comment("Name of the main command") + @YamlComment("Name of the main command") val name: String = "vanish", - @Comment("Aliases for the main command") + @YamlComment("Aliases for the main command") val aliases: List = listOf( "v", "sayanvanish", @@ -71,6 +65,11 @@ class Settings( return general.serverId } + + fun save() { + Config.save(settingsFile, this) + } + companion object { private const val FILE_NAME = "settings.yml" @@ -84,7 +83,7 @@ class Settings( @JvmStatic fun fromConfig(): Settings? { - return fromConfig(settingsFile) + return Config.fromFile(settingsFile) } @JvmStatic diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt index 9268f3ba..87df93a8 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt @@ -1,16 +1,17 @@ package org.sayandev.sayanvanish.bukkit.feature +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bukkit.hasPlugin -import org.spongepowered.configurate.objectmapping.ConfigSerializable -@ConfigSerializable +@Serializable abstract class HookFeature( - id: String, - @Transient val plugin: String, - enabled: Boolean = true, - category: FeatureCategories = FeatureCategories.HOOK, + @Transient override val id: String = "@transient", + @Transient val plugin: String = "@transient", + @Transient override var enabled: Boolean = true, + @Transient override val category: FeatureCategories = FeatureCategories.HOOK, ) : ListenedFeature(id, enabled, category) { fun hasPlugin(): Boolean { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt index 857c8320..573ddc89 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt @@ -1,21 +1,20 @@ package org.sayandev.sayanvanish.bukkit.feature +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bukkit.registerListener import org.sayandev.stickynote.bukkit.unregisterListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.serialize.TypeSerializerCollection -@ConfigSerializable +@Serializable abstract class ListenedFeature( - id: String, - enabled: Boolean = true, - category: FeatureCategories = FeatureCategories.DEFAULT, - additionalSerializers: TypeSerializerCollection = TypeSerializerCollection.defaults(), - critical: Boolean = false -) : Feature(id, enabled, category, additionalSerializers, critical), Listener { + @Transient override val id: String = "@transient", + @Transient override var enabled: Boolean = true, + @Transient override val category: FeatureCategories = FeatureCategories.DEFAULT, + @Transient override val critical: Boolean = false +) : Feature(id, enabled, category, critical), Listener { override fun enable() { if (!condition) return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt index 9d5e7456..6b2f91f0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt @@ -2,7 +2,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features import kotlinx.coroutines.delay import kotlinx.coroutines.isActive -import net.kyori.adventure.text.Component +import org.sayandev.sayanventure.adventure.text.Component import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishAPI @@ -17,17 +17,19 @@ import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.sayandev.stickynote.bukkit.warn -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("actionbar") class FeatureActionbar( - @Comment("The content of the actionbar message.") + @YamlComment("The content of the actionbar message.") @Configurable val content: String = "You are currently vanished!", - @Comment("The delay before the actionbar message is sent. doesn't really matter.") + @YamlComment("The delay before the actionbar message is sent. doesn't really matter.") @Configurable val delayMillis: Long = 1000, - @Comment("The period between each actionbar message. values higher than 40 will make it not always visible.") + @YamlComment("The period between each actionbar message. values higher than 40 will make it not always visible.") @Configurable val periodMillis: Long = 1000, ) : ListenedFeature("actionbar") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt index 3939d8b9..e73ddd6f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt @@ -1,5 +1,13 @@ package org.sayandev.sayanvanish.bukkit.feature.features +import kotlinx.serialization.Contextual +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder import org.bukkit.event.EventHandler import org.bukkit.potion.PotionEffect import org.bukkit.potion.PotionEffectType @@ -10,22 +18,20 @@ import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.nms.NMSUtils.sendPacket import org.sayandev.stickynote.bukkit.nms.PacketUtils import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.ConfigurationNode -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment -import org.spongepowered.configurate.serialize.TypeSerializer -import org.spongepowered.configurate.serialize.TypeSerializerCollection -import java.lang.reflect.Type +import org.sayandev.stickynote.core.configuration.Config +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("effect") @Suppress("DEPRECATION") data class FeatureEffect( - @Comment(""" - All effects will being sent using packets to prevent conflict with other plugins or desyncs. - List of effects to apply when a player vanishes - """) - val effects: List = listOf( + @YamlComment( + "All effects will being sent using packets to prevent conflict with other plugins or desyncs.", + "List of effects to apply when a player vanishes" + ) + @Contextual val effects: List = listOf( PotionEffectData( ServerVersion.supports(9), false, @@ -54,7 +60,7 @@ data class FeatureEffect( false, ) ) -) : ListenedFeature("effect", additionalSerializers = TypeSerializerCollection.builder().register(PotionEffectType::class.java, PotionEffectTypeSerializer()).build()) { +) : ListenedFeature("effect") { @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { @@ -86,9 +92,14 @@ data class FeatureEffect( } } + companion object { + init { + Config.registerSerializer(PotionEffectTypeSerializer) + } + } } -@ConfigSerializable +@Serializable class PotionEffectData( val usePacket: Boolean = true, val keepAfterAppear: Boolean = false, @@ -101,12 +112,16 @@ class PotionEffectData( fun toPotionEffect() = PotionEffect(PotionEffectType.getByName(type)!!, if (ServerVersion.supports(19) && duration == Int.MAX_VALUE) -1 else duration, amplifier, ambient, particles) } -class PotionEffectTypeSerializer : TypeSerializer { - override fun deserialize(type: Type, node: ConfigurationNode): PotionEffectType { - return PotionEffectType.getByName(node.string!!)!! +object PotionEffectTypeSerializer : KSerializer { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("name", PrimitiveKind.STRING) + + override fun deserialize(decoder: Decoder): PotionEffectType { + val name = decoder.decodeString() + return PotionEffectType.getByName(name) ?: throw IllegalArgumentException("Unknown PotionEffectType: $name") } - override fun serialize(type: Type, effectType: PotionEffectType?, node: ConfigurationNode) { - node.set(effectType?.name) + override fun serialize(encoder: Encoder, value: PotionEffectType) { + encoder.encodeString(value.name) } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt index f6e20a7b..8fad6900 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder +import org.sayandev.sayanventure.adventure.text.serializer.legacy.LegacyComponentSerializer import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent @@ -20,37 +20,39 @@ import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.AdventureUtils import org.sayandev.stickynote.bukkit.utils.AdventureUtils.sendComponent -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("fake_message") class FeatureFakeMessage( - @Comment("Whether to send a fake join message when a player vanishes") + @YamlComment("Whether to send a fake join message when a player vanishes") @Configurable val sendFakeJoinMessage: Boolean = false, - @Comment("The message to send when a player vanishes") + @YamlComment("The message to send when a player vanishes") @Configurable val sendFakeQuitMessage: Boolean = false, - @Comment(""" - The message to send when a player vanishes - - Note: All PlaceholderAPI placeholders are supported - Internal Placeholders: - - - the vanished player's name - """) + @YamlComment( + "The message to send when a player vanishes", + "", + "Note: All PlaceholderAPI placeholders are supported", + "Internal Placeholders:", + "- - the vanished player's name", + ) @Configurable val fakeJoinMessage: String = " joined the game", - @Comment(""" - The message to send when a player vanishes - - Note: All PlaceholderAPI placeholders are supported - Internal Placeholders: - - - the vanished player's name - """) + @YamlComment( + "The message to send when a player vanishes", + "", + "Note: All PlaceholderAPI placeholders are supported", + "Internal Placeholders:", + "- - the vanished player's name" + ) @Configurable val fakeQuitMessage: String = " left the game", - @Comment("Whether to use the legacy formatter for the fake messages (NOT RECOMMENDED)") + @YamlComment("Whether to use the legacy formatter for the fake messages (NOT RECOMMENDED)") @Configurable val useLegacyFormatter: Boolean = false, - @Comment("Whether to disable the join message if the player is vanished") + @YamlComment("Whether to disable the join message if the player is vanished") @Configurable val disableJoinMessageIfVanished: Boolean = true, - @Comment("Whether to disable the quit message if the player is vanished") + @YamlComment("Whether to disable the quit message if the player is vanished") @Configurable val disableQuitMessageIfVanished: Boolean = true, ) : ListenedFeature("fake_message") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt index 158d7afa..a766ae8e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt @@ -9,13 +9,15 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("fly") class FeatureFly( - @Comment("Disable fly when player reappears and don't have keep fly permission.") + @YamlComment("Disable fly when player reappears and don't have keep fly permission.") @Configurable val disableOnReappear: Boolean = true ) : ListenedFeature("fly") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt index 3e5b65e7..f89c3502 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt @@ -12,17 +12,19 @@ import org.sayandev.stickynote.bukkit.StickyNote.runSync import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("gamemode") class FeatureGameMode( - @Comment("The fallback gamemode when the player is not vanished and doesn't have in-memory gamemode.") + @YamlComment("The fallback gamemode when the player is not vanished and doesn't have in-memory gamemode.") val fallbackMode: GameMode = GameMode.SURVIVAL, - @Comment("Update gamemode history on gamemode change event.") + @YamlComment("Update gamemode history on gamemode change event.") val checkGameModeChange: Boolean = false, - @Comment("Change gamemode to spectator on double-sneak") + @YamlComment("Change gamemode to spectator on double-sneak") val checkToggleSneak: Boolean = true, val timeWindowTicks: Long = 8 ): ListenedFeature("gamemode") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt index f5eecd10..a6d244a6 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt @@ -1,5 +1,8 @@ package org.sayandev.sayanvanish.bukkit.feature.features +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority @@ -10,19 +13,18 @@ import org.bukkit.event.player.PlayerInteractAtEntityEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.plugin -import org.spongepowered.configurate.objectmapping.ConfigSerializable import java.util.* @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("inventory_inspect") class FeatureInventoryInspect( @Configurable val modificationPermission: String = "${plugin.name}.features.inventory_inspect.modify" ): ListenedFeature("inventory_inspect") { - val playerInventoryMap = mutableListOf() + @Transient val playerInventoryMap = mutableListOf() @EventHandler(priority = EventPriority.HIGHEST) private fun onInteractPlayer(event: PlayerInteractAtEntityEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt index 616c149e..53589fe5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt @@ -8,13 +8,15 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("invulnerability") class FeatureInvulnerability( - @Comment("Disable invulnerability when player reappears.") + @YamlComment("Disable invulnerability when player reappears.") @Configurable val disableOnReappear: Boolean = true ) : ListenedFeature("invulnerability") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt index 2982512b..f6dee2d4 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt @@ -20,24 +20,26 @@ import org.sayandev.stickynote.bukkit.nms.NMSUtils import org.sayandev.stickynote.bukkit.nms.NMSUtils.sendPacket import org.sayandev.stickynote.bukkit.nms.PacketUtils import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("level") class FeatureLevel( - @Comment(""" - This feature is a CRITICAL feature! do NOT disable this feature if you don't know what you're doing. - - If true, players will see vanished players as spectators. (ONLY WORKS ON MINECRAFT 1.9 AND ABOVE)""") + @YamlComment( + "This feature is a CRITICAL feature! do NOT disable this feature if you don't know what you're doing.", + "", + "If true, players will see vanished players as spectators. (ONLY WORKS ON MINECRAFT 1.9 AND ABOVE)") @Configurable val seeAsSpectator: Boolean = ServerVersion.supports(9), - @Comment(""" - The method to use to determine the vanish level of a player. - - Options: - - PERMISSION: The vanish level is determined by player permission (permission: sayanvanish.level.). - - DATABASE: The vanish level is determined by the vanish level stored in the database. (you can use plugin internal command to change database vanish level) - """) + @YamlComment( + "The method to use to determine the vanish level of a player.", + "", + "Options:", + "- PERMISSION: The vanish level is determined by player permission (permission: sayanvanish.level.).", + "- DATABASE: The vanish level is determined by the vanish level stored in the database. (you can use plugin internal command to change database vanish level)", + ) val levelMethod: LevelMethod = LevelMethod.PERMISSION ): ListenedFeature("level", critical = true) { @@ -136,6 +138,7 @@ class FeatureLevel( } } + @Serializable enum class LevelMethod { PERMISSION, DATABASE diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt index 8360fc7b..38645c38 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features +import kotlinx.serialization.SerialName import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority @@ -9,10 +10,11 @@ import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdap import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("ride_entity") class FeatureRideEntity( val leaveVehicleWhenOthersEnter: Boolean = true, val exitMessage: String = "You have been removed from the vehicle. because someone else entered it.", diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt index 0582d88c..83b75ef3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt @@ -1,6 +1,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features import com.cryptomorin.xseries.XMaterial +import kotlinx.serialization.SerialName import org.bukkit.GameMode import org.bukkit.block.Container import org.bukkit.entity.Player @@ -20,11 +21,13 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.runSync import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import java.util.* @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("silent_container") class FeatureSilentContainer: ListenedFeature("silent_container") { @Transient override var condition: Boolean = ServerVersion.supports(13) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index c2c28d80..1750f54c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent @@ -20,26 +20,28 @@ import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("state") class FeatureState( - @Comment(""" - This is a CRITICAL feature. It is responsible for handling the state of the player when they join or quit the server. - do NOT disable this feature if you don't know what you're doing. - - If true, players will be remembered when they join the server. (if they were vanished before quitting) - """) + @YamlComment( + "This is a CRITICAL feature. It is responsible for handling the state of the player when they join or quit the server.", + "do NOT disable this feature if you don't know what you're doing.", + "", + "If true, players will be remembered when they join the server. (if they were vanished before quitting)", + ) @Configurable val remember: Boolean = true, - @Comment("Whether to vanish players when they join the server (they also need vanish on join permission)") + @YamlComment("Whether to vanish players when they join the server (they also need vanish on join permission)") @Configurable val vanishOnJoin: Boolean = false, - @Comment("Whether to reappear players when they quit the server") + @YamlComment("Whether to reappear players when they quit the server") @Configurable val reappearOnQuit: Boolean = false, - @Comment("Whether to check permission when a player joins the server") + @YamlComment("Whether to check permission when a player joins the server") @Configurable val checkPermissionOnQuit: Boolean = true, - @Comment("Whether to check permission when a player quits the server") + @YamlComment("Whether to check permission when a player quits the server") @Configurable val checkPermissionOnJoin: Boolean = true, ) : ListenedFeature("state", critical = true) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt index 3db5aaed..af6a46c9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt @@ -12,31 +12,33 @@ import org.sayandev.sayanvanish.api.utils.HangarUtils import org.sayandev.sayanvanish.api.utils.VersionInfo import org.sayandev.sayanvanish.bukkit.SayanVanishPlugin import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendRawComponent import org.sayandev.stickynote.bukkit.* -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName import java.io.File import java.util.concurrent.CompletableFuture @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("update") class FeatureUpdate( - @Comment("The interval to check for updates in minutes") + @YamlComment("The interval to check for updates in minutes") @Configurable val checkEveryXMinutes: Int = 60 * 24, - @Comment("The permission required to receive update notifications") + @YamlComment("The permission required to receive update notifications") @Configurable val notifyPermission: String = "${plugin.name.lowercase()}.feature.update.notify", - @Comment("Whether to notify players if an update is available when they join the server") + @YamlComment("Whether to notify players if an update is available when they join the server") @Configurable val notifyOnJoin: Boolean = true, - @Comment("Whether to notify players if an update is available for snapshot builds") + @YamlComment("Whether to notify players if an update is available for snapshot builds") @Configurable val notifyForSnapshotBuilds: Boolean = true, - @Comment("Weather to ask players to do an automatic update when they join the server") + @YamlComment("Weather to ask players to do an automatic update when they join the server") @Configurable val autoUpdateNotification: Boolean = true, - @Comment("The content of the update notification message") + @YamlComment("The content of the update notification message") val updateNotificationContent: List = listOf( "A new version of SayanVanish is available!", " - Latest release: ", @@ -46,7 +48,7 @@ class FeatureUpdate( " - Click to download: '>Paper | '>Velocity | '>Waterfall", " - '>Click to see full changelog" ), - @Comment("The content of the update request message") + @YamlComment("The content of the update request message") val updateRequestContent: List = listOf( "A new version of SayanVanish is available!", "Click to update'>You can install version by clicking on this message", diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt index 40360673..5de667e8 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -1,12 +1,15 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook +import kotlinx.serialization.SerialName import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.feature.HookFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable -class FeatureHookAdvancedServerList : HookFeature("hook_advanced_server_list", "AdvancedServerList") { +@Serializable +@SerialName("hook_advanced_server_list") +class FeatureHookAdvancedServerList( +) : HookFeature("hook_advanced_server_list", "AdvancedServerList") { override fun enable() { if (hasPlugin()) { AdvancedServerListImpl().register() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt index da063e27..5810514e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt @@ -12,13 +12,15 @@ import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdap import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_citizens") class FeatureHookCitizens( - @Comment("Will cancel npc speech event if context of speech contains a vanished player") + @YamlComment("Will cancel npc speech event if context of speech contains a vanished player") val checkSpeech: Boolean = true, ): HookFeature("hook_citizens", "Citizens") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt index 154e9c8f..88d0a1d0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt @@ -9,19 +9,21 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_discordsrv") class FeatureHookDiscordSRV( - @Comment("Send quit message on vanish") + @YamlComment("Send quit message on vanish") @Configurable val sendQuitMessageOnVanish: Boolean = true, - @Comment("Send join message on unvanish") + @YamlComment("Send join message on unvanish") @Configurable val sendJoinMessageOnUnvanish: Boolean = true, - @Comment("Quit message format") + @YamlComment("Quit message format") @Configurable val quitMessage: String = "%player% left the server", - @Comment("Join message format") + @YamlComment("Join message format") @Configurable val joinMessage: String = "%player% joined the server", ): HookFeature("hook_discordsrv", "DiscordSRV") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt index 866175e0..1afb0ecf 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook +import kotlinx.serialization.SerialName import org.bukkit.Bukkit import org.bukkit.event.EventHandler import org.bukkit.event.Listener @@ -9,10 +10,11 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_dynmap") class FeatureHookDynmap: HookFeature("hook_dynmap", "dynmap") { override fun enable() { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt index 185ea439..b3395f1b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt @@ -9,16 +9,18 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName import java.util.* @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_essentials") class FeatureHookEssentials( - @Comment("Prevent Essentials from changing the AFK status of vanished players") + @YamlComment("Prevent Essentials from changing the AFK status of vanished players") @Configurable val preventAfkStatusChange: Boolean = true, - @Comment("Prevent players to send private messages to vanished players using Essentials") + @YamlComment("Prevent players to send private messages to vanished players using Essentials") @Configurable val preventPrivateMessage: Boolean = true, ) : HookFeature("hook_essentials", "Essentials") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureLuckPermsHook.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt similarity index 81% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureLuckPermsHook.kt rename to sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt index af29d6d6..2b0702ea 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureLuckPermsHook.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt @@ -1,5 +1,10 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.Contextual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import net.luckperms.api.LuckPermsProvider import net.luckperms.api.context.ContextCalculator import net.luckperms.api.context.ContextConsumer @@ -9,30 +14,28 @@ import net.luckperms.api.node.NodeEqualityPredicate import net.luckperms.api.node.types.PermissionNode import net.luckperms.api.query.QueryOptions import org.bukkit.Bukkit +import org.bukkit.Location import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.warn -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment import java.util.* - @RegisteredFeature -@ConfigSerializable -class FeatureLuckPermsHook( - @Comment(""" - Whether to register custom context for vanished players. - This will allow you to check if a player is vanished using the context "vanished". - This is useful for checking permissions based on the player's vanish status. - """) +@Serializable +@SerialName("hook_luckperms") +class FeatureHookLuckPerms( + @YamlComment( + "Whether to register custom context for vanished players.", + "This will allow you to check if a player is vanished using the context \"vanished\".", + "This is useful for checking permissions based on the player's vanish status.", + ) @Configurable val registerCustomContext: Boolean = true, - @Comment("Whether to check permission using LuckPerms. If false, it will fallback to bukkit permission check.") + @YamlComment("Whether to check permission using LuckPerms. If false, it will fallback to bukkit permission check.") @Configurable val checkPermissionViaLuckPerms: Boolean = false, - @Configurable val checkPermissionViaLuckPermsFeatures: Boolean = true + @Configurable val checkPermissionViaLuckPermsFeatures: Boolean = true, ): HookFeature("hook_luckperms", "LuckPerms") { @Transient var vanishContext: VanishedContext? = null diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt index 8231c5a8..e6fef119 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -2,6 +2,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import io.github.miniplaceholders.api.Expansion import io.github.miniplaceholders.api.utils.TagsUtils +import kotlinx.serialization.SerialName import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature @@ -9,10 +10,11 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.onlinePlayers -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_miniplaceholders") class FeatureHookMiniPlaceholders: HookFeature("hook_miniplaceholders", "MiniPlaceholders") { override fun enable() { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt index 3e645e28..6faf352d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook +import kotlinx.serialization.SerialName import net.pl3x.map.core.Pl3xMap import org.bukkit.event.EventHandler import org.bukkit.event.Listener @@ -8,10 +9,11 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_pl3xmap") class FeatureHookPl3xMap: HookFeature("hook_pl3xmap", "Pl3xMap") { override fun enable() { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt index c3d11c5b..ccbdb1dd 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -11,22 +11,25 @@ import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook import org.sayandev.stickynote.bukkit.onlinePlayers -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_placeholderapi") class FeatureHookPlaceholderAPI( - @Comment(""" - Inject placeholders into PlaceholderAPI - Available placeholders: - - %sayanvanish_vanished% - Returns true if the player is vanished - - %sayanvanish_level% - Returns the vanish level of the player - - %sayanvanish_count% - Returns the count of vanished players - - %sayanvanish_online_here% - Returns the count of online players that are not vanished - - %sayanvanish_online_total% - Returns the count of online players that are not vanished in the total network - - %sayanvanish_online_% - Returns the count of online players that are not vanished in the specified server - """) + @YamlComment( + "Inject placeholders into PlaceholderAPI", + "Available placeholders:", + "- %sayanvanish_vanished% - Returns true if the player is vanished", + "- %sayanvanish_level% - Returns the vanish level of the player", + "- %sayanvanish_count% - Returns the count of vanished players", + "- %sayanvanish_online_here% - Returns the count of online players that are not vanished", + "- %sayanvanish_online_total% - Returns the count of online players that are not vanished in the total network", + "- %sayanvanish_online_% - Returns the count of online players that are not vanished in the specified server", + ) @Configurable val injectPlaceholders: Boolean = true ): HookFeature("hook_placeholderapi", "PlaceholderAPI") { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt index a8de14cb..d752772b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook +import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.RegisteredFeature @@ -7,11 +8,12 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import xyz.jpenilla.squaremap.api.SquaremapProvider @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_squaremap") class FeatureHookSquareMap: HookFeature("hook_squaremap", "squaremap") { override fun enable() { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt index fcafc84f..9e7dac50 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt @@ -9,11 +9,13 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.plugin -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("hook_tab") class FeatureHookTAB: HookFeature("hook_tab", "TAB") { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt index b7df8c71..28e673cf 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt @@ -11,15 +11,17 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_advancement_announce") class FeaturePreventAdvancementAnnounce( - @Comment("Whether to disable the advancement announce message when the player is vanished.") + @YamlComment("Whether to disable the advancement announce message when the player is vanished.") @Configurable val disableMessage: Boolean = true, - @Comment("Whether to revoke the criteria when the player is vanished.") + @YamlComment("Whether to revoke the criteria when the player is vanished.") @Configurable val revokeCriteria: Boolean = false ): ListenedFeature("prevent_advancement_announce", category = FeatureCategories.PREVENTION) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt index e306e20c..6dc7f984 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.block.BlockBreakEvent @@ -8,10 +9,11 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_block_break") class FeaturePreventBlockBreak: ListenedFeature("prevent_block_break", false, category = FeatureCategories.PREVENTION) { @EventHandler(priority = EventPriority.HIGHEST) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt index 88406201..e0375ee9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityChangeBlockEvent @@ -8,10 +9,11 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_block_grief") class FeaturePreventBlockGrief: ListenedFeature("prevent_block_grief", category = FeatureCategories.PREVENTION) { @EventHandler diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt index 9e795c88..5288905e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.block.BlockPlaceEvent @@ -8,10 +9,11 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_block_place") class FeaturePreventBlockPlace: ListenedFeature("prevent_block_place", false, category = FeatureCategories.PREVENTION) { @EventHandler(priority = EventPriority.HIGHEST) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt index f427f9fd..b2d088a2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.Bukkit import org.bukkit.event.Event import org.bukkit.event.EventPriority @@ -16,15 +16,17 @@ import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_chat") class FeaturePreventChat( - @Comment("The character that vanished players can use to bypass the chat prevention.") + @YamlComment("The character that vanished players can use to bypass the chat prevention.") @Configurable val bypassChar: String = "!", - @Comment("Requires server restart to apply.") + @YamlComment("Requires server restart to apply.") val priority: EventPriority = EventPriority.HIGH, ): ListenedFeature("prevent_chat", category = FeatureCategories.PREVENTION) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt index 146ddf32..238d3c12 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.entity.Mob import org.bukkit.entity.Player import org.bukkit.event.EventHandler @@ -10,10 +11,11 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_creature_target") class FeaturePreventCreatureTarget: ListenedFeature("prevent_creature_target", category = FeatureCategories.PREVENTION) { @EventHandler diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt index ac9821e9..2fd8efe1 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityDamageByEntityEvent @@ -8,10 +9,11 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_damage") class FeaturePreventDamage: ListenedFeature("prevent_damage", category = FeatureCategories.PREVENTION) { @EventHandler diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/PreventFoodLevelChange.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt similarity index 83% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/PreventFoodLevelChange.kt rename to sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt index e6b6c58c..ab82e2fe 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/PreventFoodLevelChange.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt @@ -1,18 +1,19 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.entity.FoodLevelChangeEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable -class PreventFoodLevelChange( +@Serializable +@SerialName("prevent_food_level_change") +class FeaturePreventFoodLevelChange( val ignoreIfIncrease: Boolean = true ): ListenedFeature("prevent_food_level_change", category = FeatureCategories.PREVENTION) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt index efabf20b..3eea4875 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt @@ -13,17 +13,19 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_interact_event") class FeaturePreventInteract( - @Comment("Prevent players from activating pressure plates while vanished") + @YamlComment("Prevent players from activating pressure plates while vanished") @Configurable val pressurePlateTrigger: Boolean = true, - @Comment("Prevent players from interacting with big dripleaf while vanished") + @YamlComment("Prevent players from interacting with big dripleaf while vanished") @Configurable val dripLeaf: Boolean = true, - @Comment("Prevent players from interacting") + @YamlComment("Prevent players from interacting") @Configurable val interact: Boolean = false, @Configurable val tripwire: Boolean = true, @Configurable val button: Boolean = true, diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt index a56b4050..b2db2bef 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityPickupItemEvent @@ -10,10 +11,11 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_pickup") class FeaturePreventPickup: ListenedFeature("prevent_pickup", category = FeatureCategories.PREVENTION) { override var condition: Boolean = ServerVersion.supports(9) @@ -29,7 +31,7 @@ class FeaturePreventPickup: ListenedFeature("prevent_pickup", category = Feature } @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureLegacyPreventPickup: ListenedFeature("legacy_prevent_pickup", category = FeatureCategories.PREVENTION) { override var condition: Boolean = !ServerVersion.supports(9) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt index 71521809..53eadf9e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.bukkit.scoreboard.Team import org.sayandev.sayanvanish.api.feature.RegisteredFeature @@ -10,10 +11,11 @@ import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.hasPlugin import org.sayandev.stickynote.bukkit.warn -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_push") class FeaturePreventPush: ListenedFeature("prevent_push", enabled = false, category = FeatureCategories.PREVENTION) { @EventHandler diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt index 361cfc94..11172242 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.bukkit.event.raid.RaidTriggerEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature @@ -9,10 +10,11 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.event.registerListener import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_raid_trigger") class FeaturePreventRaidTrigger: ListenedFeature("prevent_raid_trigger", category = FeatureCategories.PREVENTION) { @Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt index a26e2f31..ab2b72b0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import kotlinx.serialization.SerialName import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority @@ -13,10 +14,11 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_sculk") class FeaturePreventSculk( @Configurable val preventSculkSensor: Boolean = true, @Configurable val preventShriek: Boolean = true diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt index a5e02802..464716a6 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt @@ -1,6 +1,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent import com.destroystokyo.paper.event.server.PaperServerListPingEvent +import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature @@ -9,10 +10,11 @@ import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdap import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_server_ping") class FeaturePreventServerPing: ListenedFeature("prevent_server_ping", category = FeatureCategories.PREVENTION) { @EventHandler diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt index 5bbf261e..2ed09e40 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt @@ -1,6 +1,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent import com.destroystokyo.paper.event.entity.PreSpawnerSpawnEvent +import kotlinx.serialization.SerialName import org.bukkit.GameMode import org.bukkit.event.EventHandler import org.bukkit.event.Listener @@ -12,10 +13,11 @@ import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.ServerVersion -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_spawner_spawn") class FeaturePreventSpawnerSpawn: ListenedFeature("prevent_spawner_spawn", category = FeatureCategories.PREVENTION) { @Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt index 89f65db7..0ea602dc 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt @@ -14,13 +14,15 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_tab_complete") class FeaturePreventTabComplete( - @Comment("Whether to keep vanished player in tab completion if the player that is getting the suggestion has a higher level of vanish.") + @YamlComment("Whether to keep vanished player in tab completion if the player that is getting the suggestion has a higher level of vanish.") @Configurable val checkVanishLevel: Boolean = false ): ListenedFeature("prevent_tab_complete", category = FeatureCategories.PREVENTION) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt index 1015eb67..d996afb7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.utils -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.command.CommandSender import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt index 82e2ac84..aebd636f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bungeecord.api -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver import net.md_5.bungee.api.connection.ProxiedPlayer import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishUser diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt index bf55d2c8..1bfab1df 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt @@ -3,9 +3,9 @@ package org.sayandev.sayanvanish.bungeecord.feature import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bungeecord.hasPlugin -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable -@ConfigSerializable +@Serializable abstract class HookFeature( id: String, @Transient val plugin: String, diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/ListenedFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/ListenedFeature.kt index 74db3378..3d149803 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/ListenedFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/ListenedFeature.kt @@ -4,10 +4,10 @@ import net.md_5.bungee.api.plugin.Listener import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bungeecord.StickyNote.registerListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import org.spongepowered.configurate.serialize.TypeSerializerCollection -@ConfigSerializable +@Serializable abstract class ListenedFeature( id: String, enabled: Boolean = true, diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt index 0d70fdb1..b7037187 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt @@ -9,12 +9,12 @@ import org.sayandev.sayanvanish.bungeecord.feature.ListenedFeature import org.sayandev.stickynote.bungeecord.StickyNote import org.sayandev.stickynote.bungeecord.launch import org.sayandev.stickynote.bungeecord.plugin -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import java.util.* import java.util.concurrent.TimeUnit @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureSyncEvents( // TODO: previous time was 50millis, think of something to ignore/reset previous value val checkPeriodMillis: Long = 1000L diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt index 69bcdb99..deb6d89e 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt @@ -13,10 +13,10 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bungeecord.api.BungeeUser.Companion.generateAndSaveUser import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI import org.sayandev.sayanvanish.bungeecord.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable @RegisteredFeature -@ConfigSerializable +@Serializable class FeaturePreventTabComplete( @Configurable val checkVanishLevel: Boolean = false ): ListenedFeature("prevent_tab_complete", category = FeatureCategories.PREVENTION) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/utils/PlayerUtils.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/utils/PlayerUtils.kt index 3624ae84..a94fa17c 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/utils/PlayerUtils.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/utils/PlayerUtils.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.bungeecord.utils -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.sayandev.sayanventure.adventure.text.Component +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver import net.md_5.bungee.api.CommandSender import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.proxy.config.settings diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index d0e016cf..3d02189d 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -2,7 +2,7 @@ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player import kotlinx.coroutines.future.await -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt index 0847881a..aa34b1fa 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.velocity.command import com.velocitypowered.api.proxy.Player -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder import org.incendo.cloud.component.CommandComponent import org.incendo.cloud.context.CommandContext import org.incendo.cloud.description.Description diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt index 771e2f16..a46781a7 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt @@ -2,10 +2,10 @@ package org.sayandev.sayanvanish.velocity.feature import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import org.sayandev.stickynote.velocity.hasPlugin -@ConfigSerializable +@Serializable abstract class HookFeature( id: String, @Transient val plugin: String, diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt index 5b2e63ff..fb8e52c0 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt @@ -2,11 +2,11 @@ package org.sayandev.sayanvanish.velocity.feature import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import org.sayandev.stickynote.velocity.registerListener import org.spongepowered.configurate.serialize.TypeSerializerCollection -@ConfigSerializable +@Serializable abstract class ListenedFeature( id: String, enabled: Boolean = true, diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt index 713fe72f..7434afce 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt @@ -10,19 +10,19 @@ import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.adapt import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.sayanvanish.velocity.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.plugin import org.sayandev.stickynote.velocity.server -import org.spongepowered.configurate.objectmapping.meta.Comment +import com.charleskorn.kaml.YamlComment import java.util.UUID import java.util.concurrent.TimeUnit @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureSyncEvents( - @Comment("The period of time to check for vanished players. low values may cause performance issues.") + @YamlComment("The period of time to check for vanished players. low values may cause performance issues.") val checkPeriodMillis: Long = 50 ) : ListenedFeature("sync_events") { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt index 8e645ccc..82368b09 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt @@ -19,25 +19,25 @@ import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.log import org.sayandev.stickynote.velocity.plugin import org.sayandev.stickynote.velocity.utils.AdventureUtils.component -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureUpdate( - @Comment("The period of time to check for updates.") + @YamlComment("The period of time to check for updates.") @Configurable val checkEveryXMinutes: Int = 60 * 24, - @Comment("The permission required to bypass update notifications.") + @YamlComment("The permission required to bypass update notifications.") @Configurable val notifyBypassPermission: String = "sayanvanish.feature.update.notify.exempt", - @Comment("Whether to notify players when they join the server.") + @YamlComment("Whether to notify players when they join the server.") @Configurable val notifyOnJoin: Boolean = true, - @Comment("Whether to notify players for snapshot builds.") + @YamlComment("Whether to notify players for snapshot builds.") @Configurable val notifyForSnapshotBuilds: Boolean = true, - @Comment("Weather to ask players to do an automatic update when they join the server") + @YamlComment("Weather to ask players to do an automatic update when they join the server") @Configurable val autoUpdateNotification: Boolean = true, - @Comment("The content of the update notification message") + @YamlComment("The content of the update notification message") val updateNotificationContent: List = listOf( "A new version of SayanVanish Velocity is available!", " - Latest release: ", @@ -47,7 +47,7 @@ class FeatureUpdate( " - Click to download: '>Paper | '>Velocity | '>Waterfall", " - '>Click to see full changelog" ), - @Comment("The content of the update request message") + @YamlComment("The content of the update request message") val updateRequestContent: List = listOf( "A new version of SayanVanish Velocity is available!", "Click to update'>You can install version by clicking on this message", diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt index a9311ea8..bb168748 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt @@ -6,11 +6,11 @@ import com.velocitypowered.api.proxy.server.ServerPing import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.velocity.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import kotlin.jvm.optionals.getOrNull @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureUpdatePing : ListenedFeature("update_ping") { @Subscribe diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt index de3c9669..9915d0ee 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -9,11 +9,11 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.velocity.feature.HookFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import org.sayandev.stickynote.velocity.registerListener @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureHookAdvancedServerList : HookFeature("hook_advanced_server_list", "advancedserverlist") { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt index 231a3c85..df4329d1 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt @@ -6,13 +6,13 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.launch import java.util.UUID @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureHookEnhancedVelocity : HookFeature("hook_enhancedvelocity", "enhancedvelocity") { override fun enable() { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt index fc3c53db..7fd434ce 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -10,11 +10,11 @@ import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.onlinePlayers import org.sayandev.stickynote.velocity.plugin -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable import kotlin.jvm.optionals.getOrNull @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureHookMiniPlaceholders: HookFeature("hook_miniplaceholders", "miniplaceholders") { override fun enable() { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt index 2df5104c..243bd9df 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt @@ -8,14 +8,14 @@ import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.plugin -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureHookTAB( - @Comment("Whether to use cache data for vanish status. This will improve performance but may cause a small delay in tablist removal after join.") + @YamlComment("Whether to use cache data for vanish status. This will improve performance but may cause a small delay in tablist removal after join.") val useCacheData: Boolean = false ): HookFeature("hook_tab", "TAB") { override fun enable() { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt index 8e359d53..d43a9995 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt @@ -17,18 +17,18 @@ import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.registerListener -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment import java.util.concurrent.TimeUnit @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureHookVelocitab( - @Comment("The delay in milliseconds to check on post server connect event. low values may cause issues.") + @YamlComment("The delay in milliseconds to check on post server connect event. low values may cause issues.") val checkOnPostServerConnectDelay: Long = 150, - @Comment("The delay in milliseconds to check on server switch. low values may cause issues.") + @YamlComment("The delay in milliseconds to check on server switch. low values may cause issues.") val checkOnServerConnectedDelay: Long = 150, - @Comment("The delay in milliseconds to check on post login event. low values may cause issues.") + @YamlComment("The delay in milliseconds to check on post login event. low values may cause issues.") val checkOnPostLoginDelay: Long = 150, ) : HookFeature("hook_velocitab", "velocitab") { override fun enable() { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureLuckPermsHook.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureLuckPermsHook.kt index 90771a0c..7d37060e 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureLuckPermsHook.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureLuckPermsHook.kt @@ -15,16 +15,16 @@ import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.ge import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.warn -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment import java.util.* @RegisteredFeature -@ConfigSerializable +@Serializable class FeatureLuckPermsHook( - @Comment("Register custom context for vanished players, this will allow you to check if a player is vanished using LuckPerms.") + @YamlComment("Register custom context for vanished players, this will allow you to check if a player is vanished using LuckPerms.") @Configurable val registerCustomContext: Boolean = true, - @Comment("Check permission using LuckPerms, if false, will fallback to velocity permission check.") + @YamlComment("Check permission using LuckPerms, if false, will fallback to velocity permission check.") @Configurable val checkPermissionViaLuckPerms: Boolean = true, ): HookFeature("hook_luckperms", "luckperms") { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt index 29481af8..5971577d 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt @@ -11,13 +11,13 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.velocity.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment @RegisteredFeature -@ConfigSerializable +@Serializable class FeaturePreventTabComplete( - @Comment("Whether to keep vanished player in tab completion if the player that is getting the suggestion has a higher level of vanish.") + @YamlComment("Whether to keep vanished player in tab completion if the player that is getting the suggestion has a higher level of vanish.") @Configurable val checkVanishLevel: Boolean = false ): ListenedFeature("prevent_tab_complete", category = FeatureCategories.PREVENTION) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt index d49f79cd..4cf8e8cd 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt @@ -1,8 +1,8 @@ package org.sayandev.sayanvanish.velocity.utils import com.velocitypowered.api.command.CommandSource -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.sayandev.sayanventure.adventure.text.Component +import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.proxy.config.LanguageConfig import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.proxy.config.settings diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt index c34d5450..64aa44c8 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt @@ -1,19 +1,21 @@ package org.sayandev.sayanvanish.proxy.config +import github.scarsz.discordsrv.dependencies.okhttp3.internal.http2.Settings import org.sayandev.sayanvanish.api.Platform import org.sayandev.stickynote.core.configuration.Config -import org.spongepowered.configurate.objectmapping.ConfigSerializable +import kotlinx.serialization.Serializable +import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import java.io.File public var language: LanguageConfig = LanguageConfig.fromConfig() ?: LanguageConfig.defaultConfig() -@ConfigSerializable +@Serializable class LanguageConfig( val general: General = General(), val vanish: Vanish = Vanish(), -) : Config(languageDirectory, "${settings.general.language}.yml") { +) { - @ConfigSerializable + @Serializable data class General( val prefix: String = "<#67e8f9>SayanVanish | ", val reloaded: String = "Plugin successfully reloaded. Please note that some changes may require a server restart to take effect. Subsequent reloads may cause issues.", @@ -28,17 +30,22 @@ class LanguageConfig( val updateFailed: String = "Failed to update the plugin. Please try again later." ) - @ConfigSerializable + @Serializable data class Vanish( val placeholderPrefix: String = "&7[Vanished]&r ", val placeholderSuffix: String = " &r&7[Vanished]", val vanishToggle: String = "Successfully updated vanish state to ", ) + @Serializable enum class Language(val id: String) { EN_US("en_US"), } + fun save() { + Config.save(File(languageDirectory, "${settings.general.language}.yml"), this) + } + companion object { val languageDirectory = File(Platform.get().rootDirectory, "languages") @@ -50,7 +57,7 @@ class LanguageConfig( @JvmStatic fun fromConfig(): LanguageConfig? { - return fromConfig(File(languageDirectory, "${settings.general.language}.yml")) + return Config.fromFile(File(languageDirectory, "${settings.general.language}.yml")) } } } \ No newline at end of file diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/SettingsConfig.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/SettingsConfig.kt index cbf40309..373a41c9 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/SettingsConfig.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/SettingsConfig.kt @@ -2,16 +2,16 @@ package org.sayandev.sayanvanish.proxy.config import org.sayandev.sayanvanish.api.Platform import org.sayandev.stickynote.core.configuration.Config -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment +import kotlinx.serialization.Serializable +import com.charleskorn.kaml.YamlComment import java.io.File import java.util.UUID public var settings: SettingsConfig = SettingsConfig.fromConfig() ?: SettingsConfig.defaultConfig() -@ConfigSerializable +@Serializable class SettingsConfig( - @Comment(""" + @YamlComment(""" Do NOT copy and paste the SayanVanish directory across multiple servers. The server-id is generated during the plugin's first startup. Duplicating this file could lead to synchronization issues. @@ -19,39 +19,39 @@ class SettingsConfig( General settings for the plugin """) val general: General = General(), - @Comment("Command settings for the plugin") + @YamlComment("Command settings for the plugin") val command: Command = Command() ) : Config( Platform.get().rootDirectory, fileName ) { - @ConfigSerializable + @Serializable data class General( - @Comment("Unique server identifier. doesn't do anything special yet.") + @YamlComment("Unique server identifier. doesn't do anything special yet.") val serverId: String = "${Platform.get().id}-${UUID.randomUUID()}", - @Comment(""" + @YamlComment(""" Language name Note: By default, it only includes the `en_US` language. However, you can create and add your own custom languages. """) val language: String = LanguageConfig.Language.EN_US.id, - @Comment("Weather to purge online history of users on startup.") + @YamlComment("Weather to purge online history of users on startup.") val purgeOnlineHistoryOnStartup: Boolean = true, val purgeUsersOnStartup: Boolean = true, - @Comment("Cache update period in milliseconds. low values may cause performance issues.") + @YamlComment("Cache update period in milliseconds. low values may cause performance issues.") val cacheUpdatePeriodMillis: Long = 300, - @Comment("Basic cache update period in milliseconds. low values may cause performance issues.") + @YamlComment("Basic cache update period in milliseconds. low values may cause performance issues.") val basicCacheUpdatePeriodMillis: Long = 5000, - @Comment("Whether to include prefix in messages, can be found in the language file.") + @YamlComment("Whether to include prefix in messages, can be found in the language file.") val includePrefixInMessages: Boolean = true, ) - @ConfigSerializable + @Serializable data class Command( - @Comment("Name of the main command") + @YamlComment("Name of the main command") val name: String = "sayanvanishproxy", - @Comment("Aliases for the main command") + @YamlComment("Aliases for the main command") val aliases: List = listOf( "vp", "vanishp", @@ -70,7 +70,7 @@ class SettingsConfig( @JvmStatic fun fromConfig(): SettingsConfig? { - return fromConfig(settingsFile) + return fromFile(settingsFile) } } } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 42be3765..612b1b87 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,7 +9,7 @@ pluginManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" - id("org.sayandev.stickynote.settings") version "1.10.5.pubsub1" + id("org.sayandev.stickynote.settings") version "1.10.5.kotlinx-serialization.8" } rootProject.name = "SayanVanish" From 604d42e3b611f55f3709f3e162a789d4f1c9dee2 Mon Sep 17 00:00:00 2001 From: Syren Date: Sat, 19 Jul 2025 21:36:56 +0330 Subject: [PATCH 30/67] chore: 1.21.7 support --- .../sayandev/sayanvanish/bukkit/api/BukkitUser.kt | 12 +++++++----- .../sayanvanish/bukkit/api/BukkitVanishUser.kt | 2 +- .../bukkit/feature/features/FeatureActionbar.kt | 13 ++++++------- .../sayanvanish/bukkit/utils/PlayerUtils.kt | 11 ++++++++--- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index 40e92426..1b59d336 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -1,12 +1,14 @@ package org.sayandev.sayanvanish.bukkit.api -import org.sayandev.sayanventure.adventure.text.Component import org.bukkit.Bukkit import org.bukkit.permissions.Permission import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanventure.adventure.audience.Audience +import org.sayandev.sayanventure.adventure.text.Component +import org.sayandev.stickynote.bukkit.extension.sendComponent +import org.sayandev.stickynote.bukkit.extension.sendComponentActionbar import org.sayandev.stickynote.bukkit.utils.AdventureUtils -import org.sayandev.stickynote.bukkit.warn import java.util.* class BukkitUser( @@ -18,18 +20,18 @@ class BukkitUser( fun player() = Bukkit.getPlayer(uniqueId) - fun audience() = player()?.let { AdventureUtils.senderAudience(it) } + fun audience(): Audience? = player()?.let { AdventureUtils.senderAudience(it) } override fun hasPermission(permission: String): Boolean { return player()?.hasPermission(Permission(permission, PermissionDefault.FALSE)) == true } override fun sendMessage(content: Component) { - audience()?.sendMessage(content) + player()?.sendComponent(content) } override fun sendActionbar(content: Component) { - audience()?.sendActionBar(content) + player()?.sendComponentActionbar(content) } companion object { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index fca1d701..d3e1beb8 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -47,7 +47,7 @@ open class BukkitVanishUser( player.effectivePermissions .filter { it.permission.startsWith("sayanvanish.level.") } .maxOfOrNull { it.permission.substringAfter("sayanvanish.level.").toIntOrNull() ?: field } - ?: if (hasPermission(Permission.VANISH)) 1 else { + ?: if (player.hasPermission(org.bukkit.permissions.Permission(Permission.VANISH.permission(), PermissionDefault.FALSE))) 1 else { if (isVanished) 1 else field } } ?: field diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt index 6b2f91f0..229e6a03 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt @@ -1,25 +1,22 @@ package org.sayandev.sayanvanish.bukkit.feature.features +import com.charleskorn.kaml.YamlComment import kotlinx.coroutines.delay import kotlinx.coroutines.isActive -import org.sayandev.sayanventure.adventure.text.Component +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import org.bukkit.event.EventHandler -import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanventure.adventure.text.Component import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component -import org.sayandev.stickynote.bukkit.warn -import kotlinx.serialization.Serializable -import com.charleskorn.kaml.YamlComment -import kotlinx.serialization.SerialName @RegisteredFeature @Serializable @@ -51,6 +48,8 @@ class FeatureActionbar( launch { delay(delayMillis) while (StickyNote.plugin().isEnabled && enabled && isActive) { + // TODO: remove this warning +// warn("vanished: ${VanishAPI.get().getCacheService().getVanishUsers().values.joinToString(" ,") { "${it.username}:${it.isVanished}" }}") for (user in onlinePlayers.mapNotNull { it.cachedVanishUser() }.filter { it.isVanished }) { if (!isActive(user)) continue user.sendActionbar(content.component()) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt index d996afb7..c1f05fe7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt @@ -2,9 +2,12 @@ package org.sayandev.sayanvanish.bukkit.utils import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.command.CommandSender +import org.bukkit.entity.Player import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language +import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook import org.sayandev.stickynote.bukkit.utils.AdventureUtils +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component object PlayerUtils { @@ -12,16 +15,18 @@ object PlayerUtils { if (content.isBlank()) return val prefix = language.general.prefix - AdventureUtils.sendComponent(this, if (Settings.get().general.includePrefixInMessages) { + val finalContent = if (Settings.get().general.includePrefixInMessages) { prefix + content } else { content - }, *placeholders) + } + + AdventureUtils.sendComponent(this, PlaceholderAPIHook.injectPlaceholders(this as? Player, finalContent).component(*placeholders)) } fun CommandSender.sendRawComponent(content: String, vararg placeholders: TagResolver) { if (content.isBlank()) return - AdventureUtils.sendComponent(this, content, *placeholders) + AdventureUtils.sendComponent(this, PlaceholderAPIHook.injectPlaceholders(this as? Player, content).component(*placeholders)) } } \ No newline at end of file From 5366000e901fd08e6402026b53caa5c617f667bf Mon Sep 17 00:00:00 2001 From: Syren Date: Sun, 20 Jul 2025 13:35:51 +0330 Subject: [PATCH 31/67] chore: tests work in progress --- .../sayanvanish/api/SayanVanishAPI.kt | 38 --- .../org/sayandev/sayanvanish/api/VanishAPI.kt | 30 +-- .../sayanvanish/api/feature/Feature.kt | 2 +- .../api/feature/RegisteredFeatureHandler.kt | 3 - .../sayanvanish/api/storage/sql/SQLConfig.kt | 2 +- .../api/storage/sql/SQLDatabase.kt | 26 +- .../sayanvanish/api/SimulationTest.kt | 239 ++++++++++++++++++ .../bukkit/command/SayanVanishCommand.kt | 2 +- .../feature/features/FeatureActionbar.kt | 3 +- .../bukkit/feature/features/FeatureEffect.kt | 3 +- .../feature/features/FeatureFakeMessage.kt | 3 +- .../bukkit/feature/features/FeatureFly.kt | 3 +- .../feature/features/FeatureGameMode.kt | 3 +- .../features/FeatureInventoryInspect.kt | 3 +- .../features/FeatureInvulnerability.kt | 3 +- .../bukkit/feature/features/FeatureLevel.kt | 3 +- .../feature/features/FeatureRideEntity.kt | 3 +- .../features/FeatureSilentContainer.kt | 4 +- .../bukkit/feature/features/FeatureState.kt | 3 +- .../bukkit/feature/features/FeatureUpdate.kt | 3 +- .../hook/FeatureHookAdvancedServerList.kt | 3 +- .../features/hook/FeatureHookCitizens.kt | 3 +- .../features/hook/FeatureHookDiscordSRV.kt | 3 +- .../features/hook/FeatureHookDynmap.kt | 4 +- .../features/hook/FeatureHookEssentials.kt | 3 +- .../features/hook/FeatureHookLuckPerms.kt | 3 +- .../hook/FeatureHookMiniPlaceholders.kt | 4 +- .../features/hook/FeatureHookPl3xMap.kt | 4 +- .../hook/FeatureHookPlaceholderAPI.kt | 3 +- .../features/hook/FeatureHookSquareMap.kt | 4 +- .../feature/features/hook/FeatureHookTAB.kt | 4 +- .../prevent/FeatureLegacyPreventPickup.kt | 31 +++ .../FeaturePreventAdvancementAnnounce.kt | 3 +- .../prevent/FeaturePreventBlockBreak.kt | 4 +- .../prevent/FeaturePreventBlockGrief.kt | 4 +- .../prevent/FeaturePreventBlockPlace.kt | 4 +- .../features/prevent/FeaturePreventChat.kt | 3 +- .../prevent/FeaturePreventCreatureTarget.kt | 4 +- .../features/prevent/FeaturePreventDamage.kt | 4 +- .../prevent/FeaturePreventFoodLevelChange.kt | 3 +- .../prevent/FeaturePreventInteract.kt | 3 +- .../features/prevent/FeaturePreventPickup.kt | 17 -- .../features/prevent/FeaturePreventPush.kt | 6 +- .../prevent/FeaturePreventRaidTrigger.kt | 4 +- .../features/prevent/FeaturePreventSculk.kt | 3 +- .../prevent/FeaturePreventServerPing.kt | 4 +- .../prevent/FeaturePreventSpawnerSpawn.kt | 4 +- .../prevent/FeaturePreventTabComplete.kt | 3 +- .../hook/FeatureHookEnhancedVelocity.kt | 3 +- 49 files changed, 387 insertions(+), 137 deletions(-) create mode 100644 sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index f9ff3871..88b933d9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -34,9 +34,7 @@ object SayanVanishAPI : VanishAPI { database.initialize().await() messagingService.initialize().await() cacheService.fetchData() - } - launch(database.dispatcher) { for (user in database.getVanishUsers().await().filter { user -> user.serverId == Platform.get().serverId }) { user.isOnline = false user.saveAndSync() @@ -49,48 +47,12 @@ object SayanVanishAPI : VanishAPI { return Platform.get() } - override fun isVanished(uniqueId: UUID): Deferred { - return CompletableDeferred().apply { - launch(database.dispatcher) { - complete(database.getVanishUser(uniqueId).await()?.isVanished == true) - } - } - } - - override fun isVanishedBlocking(uniqueId: UUID): Boolean { - return runBlocking { isVanished(uniqueId).await() } - } - override fun canSee(user: VanishUser?, target: VanishUser): Boolean { if (!target.isVanished) return true val vanishLevel = user?.vanishLevel ?: -1 return vanishLevel >= target.vanishLevel } - override fun getOnlineVanishUsers(): Deferred> { - return CompletableDeferred>().apply { - launch(database.dispatcher) { - complete(database.getVanishUsers().await().filter { it.isOnline }) - } - } - } - - override fun getOnlineVanishedUsers(): Deferred> { - return CompletableDeferred>().apply { - launch(database.dispatcher) { - complete(database.getVanishUsers().await().filter { it.isOnline && it.isVanished }) - } - } - } - - override fun getVanishedUsers(): Deferred> { - return CompletableDeferred>().apply { - launch(database.dispatcher) { - complete(database.getVanishUsers().await().filter { it.isVanished }) - } - } - } - suspend fun UUID.user(): VanishUser? { return getDatabase().getVanishUser(this).await() } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt index d36db21d..a41c2c49 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt @@ -1,13 +1,9 @@ package org.sayandev.sayanvanish.api -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.future.asCompletableFuture -import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.cache.CacheService -import org.sayandev.sayanvanish.api.storage.Database import org.sayandev.sayanvanish.api.message.MessagingService +import org.sayandev.sayanvanish.api.storage.Database import java.util.* -import java.util.concurrent.CompletableFuture interface VanishAPI { fun getDatabase(): Database @@ -18,32 +14,8 @@ interface VanishAPI { fun getPlatform(): Platform - fun isVanished(uniqueId: UUID): Deferred - - fun isVanishedFuture(uniqueId: UUID): CompletableFuture { - return isVanished(uniqueId).asCompletableFuture() - } - - fun isVanishedBlocking(uniqueId: UUID): Boolean { - return runBlocking { isVanished(uniqueId).await() } - } - fun canSee(user: VanishUser?, target: VanishUser): Boolean - fun getOnlineVanishUsers(): Deferred> - - fun getOnlineVanishUsersFuture(): CompletableFuture> { - return getOnlineVanishUsers().asCompletableFuture() - } - - fun getOnlineVanishedUsers(): Deferred> - - fun getVanishedUsersFuture(): CompletableFuture> { - return getVanishedUsers().asCompletableFuture() - } - - fun getVanishedUsers(): Deferred> - companion object { private var defaultInstance: VanishAPI = SayanVanishAPI diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt index 7314fcbe..59fddda5 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt @@ -12,7 +12,7 @@ import java.io.File @Serializable abstract class Feature( @Transient open val id: String = "@transient", - open var enabled: Boolean, + @Transient open var enabled: Boolean = true, @Transient open val category: FeatureCategories = FeatureCategories.DEFAULT, @Transient open val critical: Boolean = false ) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt index 89fb2c0e..f488406b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt @@ -1,16 +1,13 @@ package org.sayandev.sayanvanish.api.feature -import kotlinx.serialization.modules.SerializersModule import org.reflections.Reflections import org.sayandev.sayanvanish.api.Platform -import org.sayandev.stickynote.core.configuration.Config import java.io.IOException import java.net.URL import java.security.CodeSource import java.util.* import java.util.jar.JarEntry import java.util.jar.JarFile -import kotlin.collections.ArrayList object RegisteredFeatureHandler { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt index 711d443f..fbf57195 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt @@ -6,7 +6,7 @@ import org.spongepowered.configurate.objectmapping.meta.Setting @Serializable class SQLConfig( - val threadCount: Int = 5, + var threadCount: Int = 5, @YamlComment("The method to use for the database. Available methods: MYSQL, SQLITE") val method: SQLMethod = SQLMethod.SQLITE, @YamlComment("The host address of the SQL database. If it's an IP address (x.x.x.x), ensure it is enclosed in double quotes (`\"`).") diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index 6d3b1d27..0ccbd4a8 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.Deferred import kotlinx.coroutines.awaitAll import org.jetbrains.exposed.sql.SchemaUtils import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList import org.jetbrains.exposed.sql.Transaction import org.jetbrains.exposed.sql.deleteAll import org.jetbrains.exposed.sql.deleteWhere @@ -158,12 +159,13 @@ class SQLDatabase( override suspend fun saveVanishUser(vanishUser: VanishUser): Deferred { return async { + saveUser(vanishUser).await() VanishUser.Schema.upsert { row -> row[uniqueId] = vanishUser.uniqueId row[isVanished] = vanishUser.isVanished row[vanishLevel] = vanishUser.vanishLevel row[currentOptions] = Gson.get().toJson(vanishUser.currentOptions) - }.isIgnore + }.insertedCount == 1 } } @@ -174,7 +176,7 @@ class SQLDatabase( row[username] = user.username row[serverId] = user.serverId row[isOnline] = user.isOnline - }.isIgnore + }.insertedCount == 1 } } @@ -204,6 +206,7 @@ class SQLDatabase( override suspend fun removeUser(uniqueId: UUID): Deferred { return async { + removeVanishUser(uniqueId).await() User.Schema .deleteWhere { User.Schema.uniqueId eq uniqueId } true @@ -217,7 +220,7 @@ class SQLDatabase( row[isVanished] = vanishUser.isVanished row[vanishLevel] = vanishUser.vanishLevel row[currentOptions] = Gson.get().toJson(vanishUser.currentOptions) - }.isIgnore + }.insertedCount == 1 } } @@ -228,7 +231,7 @@ class SQLDatabase( row[username] = user.username row[serverId] = user.serverId row[isOnline] = user.isOnline - }.isIgnore + }.insertedCount == 1 } } @@ -239,15 +242,22 @@ class SQLDatabase( override suspend fun purgeUsers(): Deferred { return async { - User.Schema.deleteAll() - true + VanishUser.Schema.deleteAll() + User.Schema.deleteAll() > 0 } } override suspend fun purgeUsers(serverId: String): Deferred { return async { - User.Schema.deleteWhere { User.Schema.serverId eq serverId } - true + val userIds = User.Schema + .select(User.Schema.uniqueId) + .where { User.Schema.serverId eq serverId } + .map { it[User.Schema.uniqueId] } + + if (userIds.isNotEmpty()) { + (VanishUser.Schema.deleteWhere { uniqueId inList userIds } + User.Schema.deleteWhere { uniqueId inList userIds }) > 0 + } else { + true + } } } diff --git a/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt b/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt new file mode 100644 index 00000000..f7adaebc --- /dev/null +++ b/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt @@ -0,0 +1,239 @@ +package org.sayandev.sayanvanish.api + +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.* +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.sayandev.sayanvanish.api.storage.storageConfig +import java.io.File +import java.util.* +import java.util.concurrent.Executors +import java.util.logging.Logger + +@TestMethodOrder(MethodOrderer.OrderAnnotation::class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Execution(ExecutionMode.SAME_THREAD) +class SimulationTest { + + private val testDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher() + + companion object { + val uniqueId = UUID.fromString("6f7e7d15-89ee-4e09-afe0-ff316c66999f") + val testUser1 = User.Generic(uniqueId, "test-user-1", true, Platform.get().serverId) + val testUser2 = User.Generic(UUID.fromString("7f7e7d15-89ee-4e09-afe0-ff316c66999f"), "test-user-2", false, Platform.get().serverId) + + @BeforeAll + @JvmStatic + fun setPlatform() { + Platform.setAndRegister( + Platform( + "sayanvanish-test-suite", + "SayanVanish-Test", + Logger.getGlobal(), + File("./sayanvanish-test"), + "test-server", + APIPlatformAdapter() + ) + ) + storageConfig.sql.threadCount = 1 + SayanVanishAPI.initialize() + } + } + + @BeforeEach + fun setup() { + runBlocking(testDispatcher) { + VanishAPI.get().getDatabase().purgeAllTables().await() + } + } + + @Test + @Order(1) + fun `purgeUsers() removes all users`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + db.saveUser(testUser1).await() + db.saveUser(testUser2).await() + val purgeResult = db.purgeUsers().await() + val users = db.getUsers().await() + assert(purgeResult) { "purgeUsers should return true" } + assert(users.isEmpty()) { "All users should be removed after purgeUsers, found: ${users.map { it.username }}" } + } + + @Test + @Order(2) + fun `saveUser() and getUser() returns the saved user`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val saveResult = db.saveUser(testUser1).await() + val loaded = db.getUser(testUser1.uniqueId).await() + assert(saveResult) { "saveUser should return true" } + assert(loaded != null) { "getUser should return the saved user" } + assert(loaded == testUser1) { "Loaded user should match saved user" } + } + + @Test + @Order(3) + fun `getUsers() returns all users`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + db.saveUser(testUser1).await() + db.saveUser(testUser2).await() + val users = db.getUsers().await() + assert(users.size == 2) { "getUsers should return all users, expected 2, got ${users.size}" } + assert(users.any { it.uniqueId == testUser1.uniqueId }) { "testUser1 should be present in users" } + assert(users.any { it.uniqueId == testUser2.uniqueId }) { "testUser2 should be present in users" } + } + + @Test + @Order(4) + fun `hasUser() returns correctly for existing and non-existing users`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + db.saveUser(testUser1).await() + val hasUser1 = db.hasUser(testUser1.uniqueId).await() + val hasUser2 = db.hasUser(testUser2.uniqueId).await() + assert(hasUser1) { "hasUser should return true for existing user" } + assert(!hasUser2) { "hasUser should return false for non-existing user" } + } + + @Test + @Order(5) + fun `updateUser() updates user data correctly`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + db.saveUser(testUser1).await() + val updated = testUser1.copy(username = "updated-user") + val updateResult = db.updateUser(updated).await() + val loaded = db.getUser(updated.uniqueId).await() + assert(updateResult) { "updateUser should return true" } + assert(loaded != null && loaded.username == "updated-user") { "User should be updated in database" } + } + + @Test + @Order(6) + fun `removeUser() deletes the specified user`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + db.saveUser(testUser1).await() + val removeResult = db.removeUser(testUser1.uniqueId).await() + val loaded = db.getUser(testUser1.uniqueId).await() + assert(removeResult) { "removeUser should return true" } + assert(loaded == null) { "User should be removed from database" } + } + + @Test + @Order(7) + fun `purgeAllTables() removes all data from all tables`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + db.saveUser(testUser1).await() + db.saveUser(testUser2).await() + val purgeResult = db.purgeAllTables().await() + val users = db.getUsers().await() + assert(purgeResult) { "purgeAllTables should return true" } + assert(users.isEmpty()) { "All users should be removed after purgeAllTables" } + } + + @Test + @Order(8) + fun `purgeUsers(serverId) removes only users matching the serverId`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val otherServerId = "other-server" + val userOtherServer = User.Generic(UUID.randomUUID(), "other", false, otherServerId) + db.saveUser(testUser1).await() + db.saveUser(userOtherServer).await() + val purgeResult = db.purgeUsers(otherServerId).await() + val users = db.getUsers().await() + assert(purgeResult) { "purgeUsers(serverId) should return true" } + assert(users.any { it.uniqueId == testUser1.uniqueId }) { "User from different server should not be purged" } + assert(users.none { it.uniqueId == userOtherServer.uniqueId }) { "User from purged server should be removed" } + } + + // VanishUser related tests + @Test + @Order(9) + fun `saveVanishUser() and getVanishUser() returns the saved vanish user`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val vanishUser = VanishUser.Generic(testUser1.uniqueId, testUser1.username, testUser1.serverId) + val saveResult = db.saveVanishUser(vanishUser).await() + val loaded = db.getVanishUser(vanishUser.uniqueId).await() + assert(saveResult) { "saveVanishUser should return true" } + assert(loaded != null) { "getVanishUser should return the saved vanish user" } + assert(loaded!!.uniqueId == vanishUser.uniqueId) { "Loaded vanish user should match saved uniqueId" } + } + + @Test + @Order(10) + fun `getVanishUsers() returns all vanish users`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val vanishUser1 = VanishUser.Generic(testUser1.uniqueId, testUser1.username, testUser1.serverId) + val vanishUser2 = VanishUser.Generic(testUser2.uniqueId, testUser2.username, testUser2.serverId) + db.saveVanishUser(vanishUser1).await() + db.saveVanishUser(vanishUser2).await() + val vanishUsers = db.getVanishUsers().await() + assert(vanishUsers.size == 2) { "getVanishUsers should return all vanish users, expected 2, got ${vanishUsers.size}" } + } + + @Test + @Order(11) + fun `hasVanishUser() returns correctly for existing and non-existing vanish users`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val vanishUser = VanishUser.Generic(testUser1.uniqueId, testUser1.username, testUser1.serverId) + db.saveVanishUser(vanishUser).await() + val hasVanish = db.hasVanishUser(vanishUser.uniqueId).await() + val hasNotVanish = db.hasVanishUser(testUser2.uniqueId).await() + assert(hasVanish) { "hasVanishUser should return true for existing vanish user" } + assert(!hasNotVanish) { "hasVanishUser should return false for non-existing vanish user" } + } + + @Test + @Order(12) + fun `updateVanishUser() updates vanish user data correctly`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val vanishUser = VanishUser.Generic(testUser1.uniqueId, testUser1.username, testUser1.serverId, isVanished = false, vanishLevel = 1) + db.saveVanishUser(vanishUser).await() + val updated = vanishUser.copy(isVanished = true, vanishLevel = 5) + val updateResult = db.updateVanishUser(updated).await() + val loaded = db.getVanishUser(updated.uniqueId).await() + assert(updateResult) { "updateVanishUser should return true" } + assert(loaded != null && loaded.isVanished && loaded.vanishLevel == 5) { "VanishUser should be updated in database" } + } + + @Test + @Order(13) + fun `removeVanishUser() deletes the specified vanish user`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val vanishUser = VanishUser.Generic(testUser1.uniqueId, testUser1.username, testUser1.serverId) + db.saveVanishUser(vanishUser).await() + val removeResult = db.removeVanishUser(vanishUser.uniqueId).await() + val loaded = db.getVanishUser(vanishUser.uniqueId).await() + assert(removeResult) { "removeVanishUser should return true" } + assert(loaded == null) { "VanishUser should be removed from database" } + } + + @Test + @Order(14) + fun `syncUser() updates the cache`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val cache = VanishAPI.get().getCacheService() + val messaging = VanishAPI.get().getMessagingService() + + db.saveUser(testUser1).await() + messaging.syncUser(testUser1).await() + + val cachedUser = cache.getUsers()[testUser1.uniqueId] + assert(cachedUser != null) { "User should be in cache after sync" } + assert(cachedUser == testUser1) { "Cached user should match synced user" } + } + + @Test + @Order(15) + fun `syncVanishUser() updates the cache`() = runBlocking(testDispatcher) { + val db = VanishAPI.get().getDatabase() + val cache = VanishAPI.get().getCacheService() + val messaging = VanishAPI.get().getMessagingService() + val vanishUser = VanishUser.Generic(testUser1.uniqueId, testUser1.username, testUser1.serverId) + + db.saveVanishUser(vanishUser).await() + messaging.syncVanishUser(vanishUser).await() + + val cachedVanishUser = cache.getVanishUsers()[vanishUser.uniqueId] + assert(cachedVanishUser != null) { "VanishUser should be in cache after sync" } + assert(cachedVanishUser!!.uniqueId == vanishUser.uniqueId) { "Cached vanish user should match synced user" } + } +} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 023b3c28..a5f9e001 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -431,7 +431,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set // TODO: better implementation? val sender = context.sender().platformSender() sender.sendComponent("Fetching vanish users from database...") - sender.sendComponent("Database Vanished Users: ${VanishAPI.get().getVanishedUsers().await().map { it.username }}") + sender.sendComponent("Database Vanished Users: ${VanishAPI.get().getDatabase().getVanishUsers().await().filter { it.isVanished }.map { it.username }}") sender.sendComponent("Cache Vanished Users: ${VanishAPI.get().getCacheService().getVanishUsers().values.map { it.username }}") } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt index 229e6a03..a243af01 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt @@ -22,13 +22,14 @@ import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component @Serializable @SerialName("actionbar") class FeatureActionbar( + override var enabled: Boolean = true, @YamlComment("The content of the actionbar message.") @Configurable val content: String = "You are currently vanished!", @YamlComment("The delay before the actionbar message is sent. doesn't really matter.") @Configurable val delayMillis: Long = 1000, @YamlComment("The period between each actionbar message. values higher than 40 will make it not always visible.") @Configurable val periodMillis: Long = 1000, -) : ListenedFeature("actionbar") { +) : ListenedFeature("actionbar", enabled) { @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt index e73ddd6f..c642546a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt @@ -27,6 +27,7 @@ import kotlinx.serialization.SerialName @SerialName("effect") @Suppress("DEPRECATION") data class FeatureEffect( + override var enabled: Boolean = true, @YamlComment( "All effects will being sent using packets to prevent conflict with other plugins or desyncs.", "List of effects to apply when a player vanishes" @@ -60,7 +61,7 @@ data class FeatureEffect( false, ) ) -) : ListenedFeature("effect") { +) : ListenedFeature("effect", enabled) { @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt index 8fad6900..a81c637f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt @@ -28,6 +28,7 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("fake_message") class FeatureFakeMessage( + override var enabled: Boolean = true, @YamlComment("Whether to send a fake join message when a player vanishes") @Configurable val sendFakeJoinMessage: Boolean = false, @YamlComment("The message to send when a player vanishes") @@ -54,7 +55,7 @@ class FeatureFakeMessage( @Configurable val disableJoinMessageIfVanished: Boolean = true, @YamlComment("Whether to disable the quit message if the player is vanished") @Configurable val disableQuitMessageIfVanished: Boolean = true, -) : ListenedFeature("fake_message") { +) : ListenedFeature("fake_message", enabled) { @EventHandler(priority = EventPriority.LOWEST) private fun onJoin(event: PlayerJoinEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt index a766ae8e..9b35f6d0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt @@ -17,9 +17,10 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("fly") class FeatureFly( + override var enabled: Boolean = true, @YamlComment("Disable fly when player reappears and don't have keep fly permission.") @Configurable val disableOnReappear: Boolean = true -) : ListenedFeature("fly") { +) : ListenedFeature("fly", enabled) { @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt index f89c3502..fe41efa2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt @@ -20,6 +20,7 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("gamemode") class FeatureGameMode( + override var enabled: Boolean = true, @YamlComment("The fallback gamemode when the player is not vanished and doesn't have in-memory gamemode.") val fallbackMode: GameMode = GameMode.SURVIVAL, @YamlComment("Update gamemode history on gamemode change event.") @@ -27,7 +28,7 @@ class FeatureGameMode( @YamlComment("Change gamemode to spectator on double-sneak") val checkToggleSneak: Boolean = true, val timeWindowTicks: Long = 8 -): ListenedFeature("gamemode") { +): ListenedFeature("gamemode", enabled) { @Transient val sneakMap = mutableMapOf() @Transient val sneakList = mutableListOf() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt index a6d244a6..1bdd3184 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt @@ -21,8 +21,9 @@ import java.util.* @Serializable @SerialName("inventory_inspect") class FeatureInventoryInspect( + override var enabled: Boolean = true, @Configurable val modificationPermission: String = "${plugin.name}.features.inventory_inspect.modify" -): ListenedFeature("inventory_inspect") { +): ListenedFeature("inventory_inspect", enabled) { @Transient val playerInventoryMap = mutableListOf() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt index 53589fe5..626a2423 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt @@ -16,9 +16,10 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("invulnerability") class FeatureInvulnerability( + override var enabled: Boolean = true, @YamlComment("Disable invulnerability when player reappears.") @Configurable val disableOnReappear: Boolean = true -) : ListenedFeature("invulnerability") { +) : ListenedFeature("invulnerability", enabled) { override var condition: Boolean = ServerVersion.supports(9) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt index f6dee2d4..f7a1521e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt @@ -28,6 +28,7 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("level") class FeatureLevel( + override var enabled: Boolean = true, @YamlComment( "This feature is a CRITICAL feature! do NOT disable this feature if you don't know what you're doing.", "", @@ -41,7 +42,7 @@ class FeatureLevel( "- DATABASE: The vanish level is determined by the vanish level stored in the database. (you can use plugin internal command to change database vanish level)", ) val levelMethod: LevelMethod = LevelMethod.PERMISSION -): ListenedFeature("level", critical = true) { +): ListenedFeature("level", enabled, critical = true) { @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt index 38645c38..aed1f04d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt @@ -16,9 +16,10 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("ride_entity") class FeatureRideEntity( + override var enabled: Boolean = true, val leaveVehicleWhenOthersEnter: Boolean = true, val exitMessage: String = "You have been removed from the vehicle. because someone else entered it.", -): ListenedFeature("ride_entity") { +): ListenedFeature("ride_entity", enabled) { @EventHandler(priority = EventPriority.HIGHEST) private fun removeVanishedPassengerOnEnter(event: PlayerInteractEntityEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt index 83b75ef3..56fee76a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt @@ -28,7 +28,9 @@ import java.util.* @RegisteredFeature @Serializable @SerialName("silent_container") -class FeatureSilentContainer: ListenedFeature("silent_container") { +class FeatureSilentContainer( + override var enabled: Boolean = true, +): ListenedFeature("silent_container", enabled) { @Transient override var condition: Boolean = ServerVersion.supports(13) @Transient private val containerPlayersData = mutableMapOf() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index 1750f54c..64d1354a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -28,6 +28,7 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("state") class FeatureState( + override var enabled: Boolean = true, @YamlComment( "This is a CRITICAL feature. It is responsible for handling the state of the player when they join or quit the server.", "do NOT disable this feature if you don't know what you're doing.", @@ -43,7 +44,7 @@ class FeatureState( @Configurable val checkPermissionOnQuit: Boolean = true, @YamlComment("Whether to check permission when a player quits the server") @Configurable val checkPermissionOnJoin: Boolean = true, -) : ListenedFeature("state", critical = true) { +) : ListenedFeature("state", enabled, critical = true) { @EventHandler(priority = EventPriority.LOWEST) private fun onJoin(event: PlayerJoinEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt index af6a46c9..87a208f6 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt @@ -28,6 +28,7 @@ import java.util.concurrent.CompletableFuture @Serializable @SerialName("update") class FeatureUpdate( + override var enabled: Boolean = true, @YamlComment("The interval to check for updates in minutes") @Configurable val checkEveryXMinutes: Int = 60 * 24, @YamlComment("The permission required to receive update notifications") @@ -54,7 +55,7 @@ class FeatureUpdate( "Click to update'>You can install version by clicking on this message", "Make sure to read the changelog before doing any update to prevent unexpected behaviors", ) -) : ListenedFeature("update") { +) : ListenedFeature("update", enabled) { @Transient var latestRelease: VersionInfo? = null @Transient var latestSnapshot: VersionInfo? = null diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt index 5de667e8..722ec553 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -9,7 +9,8 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("hook_advanced_server_list") class FeatureHookAdvancedServerList( -) : HookFeature("hook_advanced_server_list", "AdvancedServerList") { + override var enabled: Boolean = true, +) : HookFeature("hook_advanced_server_list", "AdvancedServerList", enabled) { override fun enable() { if (hasPlugin()) { AdvancedServerListImpl().register() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt index 5810514e..48c0004f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt @@ -20,9 +20,10 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("hook_citizens") class FeatureHookCitizens( + override var enabled: Boolean = true, @YamlComment("Will cancel npc speech event if context of speech contains a vanished player") val checkSpeech: Boolean = true, -): HookFeature("hook_citizens", "Citizens") { +): HookFeature("hook_citizens", "Citizens", enabled) { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt index 88d0a1d0..41a06950 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt @@ -17,6 +17,7 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("hook_discordsrv") class FeatureHookDiscordSRV( + override var enabled: Boolean = true, @YamlComment("Send quit message on vanish") @Configurable val sendQuitMessageOnVanish: Boolean = true, @YamlComment("Send join message on unvanish") @@ -25,7 +26,7 @@ class FeatureHookDiscordSRV( @Configurable val quitMessage: String = "%player% left the server", @YamlComment("Join message format") @Configurable val joinMessage: String = "%player% joined the server", -): HookFeature("hook_discordsrv", "DiscordSRV") { +): HookFeature("hook_discordsrv", "DiscordSRV", enabled) { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt index 1afb0ecf..ea15d46e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt @@ -15,7 +15,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("hook_dynmap") -class FeatureHookDynmap: HookFeature("hook_dynmap", "dynmap") { +class FeatureHookDynmap( + override var enabled: Boolean = true, +) : HookFeature("hook_dynmap", "dynmap", enabled) { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt index b3395f1b..ca8f33fa 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt @@ -18,11 +18,12 @@ import java.util.* @Serializable @SerialName("hook_essentials") class FeatureHookEssentials( + override var enabled: Boolean = true, @YamlComment("Prevent Essentials from changing the AFK status of vanished players") @Configurable val preventAfkStatusChange: Boolean = true, @YamlComment("Prevent players to send private messages to vanished players using Essentials") @Configurable val preventPrivateMessage: Boolean = true, -) : HookFeature("hook_essentials", "Essentials") { +) : HookFeature("hook_essentials", "Essentials", enabled) { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt index 2b0702ea..a80d0389 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt @@ -27,6 +27,7 @@ import java.util.* @Serializable @SerialName("hook_luckperms") class FeatureHookLuckPerms( + override var enabled: Boolean = true, @YamlComment( "Whether to register custom context for vanished players.", "This will allow you to check if a player is vanished using the context \"vanished\".", @@ -36,7 +37,7 @@ class FeatureHookLuckPerms( @YamlComment("Whether to check permission using LuckPerms. If false, it will fallback to bukkit permission check.") @Configurable val checkPermissionViaLuckPerms: Boolean = false, @Configurable val checkPermissionViaLuckPermsFeatures: Boolean = true, -): HookFeature("hook_luckperms", "LuckPerms") { +): HookFeature("hook_luckperms", "LuckPerms", enabled) { @Transient var vanishContext: VanishedContext? = null diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt index e6fef119..ab2f76a5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -15,7 +15,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("hook_miniplaceholders") -class FeatureHookMiniPlaceholders: HookFeature("hook_miniplaceholders", "MiniPlaceholders") { +class FeatureHookMiniPlaceholders( + override var enabled: Boolean = true +) : HookFeature("hook_miniplaceholders", "MiniPlaceholders", enabled) { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt index 6faf352d..2ab28630 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt @@ -14,7 +14,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("hook_pl3xmap") -class FeatureHookPl3xMap: HookFeature("hook_pl3xmap", "Pl3xMap") { +class FeatureHookPl3xMap( + override var enabled: Boolean = true, +): HookFeature("hook_pl3xmap", "Pl3xMap", enabled) { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt index ccbdb1dd..6cb053c7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -20,6 +20,7 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("hook_placeholderapi") class FeatureHookPlaceholderAPI( + override var enabled: Boolean = true, @YamlComment( "Inject placeholders into PlaceholderAPI", "Available placeholders:", @@ -31,7 +32,7 @@ class FeatureHookPlaceholderAPI( "- %sayanvanish_online_% - Returns the count of online players that are not vanished in the specified server", ) @Configurable val injectPlaceholders: Boolean = true -): HookFeature("hook_placeholderapi", "PlaceholderAPI") { +): HookFeature("hook_placeholderapi", "PlaceholderAPI", enabled) { @Transient private var hook: Any? = null diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt index d752772b..f7b99155 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt @@ -14,7 +14,9 @@ import xyz.jpenilla.squaremap.api.SquaremapProvider @RegisteredFeature @Serializable @SerialName("hook_squaremap") -class FeatureHookSquareMap: HookFeature("hook_squaremap", "squaremap") { +class FeatureHookSquareMap( + override var enabled: Boolean = true, +): HookFeature("hook_squaremap", "squaremap", enabled) { override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt index 9e7dac50..75f2becb 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt @@ -16,7 +16,9 @@ import kotlinx.serialization.SerialName @RegisteredFeature @Serializable @SerialName("hook_tab") -class FeatureHookTAB: HookFeature("hook_tab", "TAB") { +class FeatureHookTAB( + override var enabled: Boolean = true, +): HookFeature("hook_tab", "TAB", enabled) { override fun enable() { if (hasPlugin()) { VanishIntegrationTAB(this).register() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt new file mode 100644 index 00000000..7bae15c3 --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt @@ -0,0 +1,31 @@ +package org.sayandev.sayanvanish.bukkit.feature.features.prevent + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.bukkit.event.EventHandler +import org.bukkit.event.player.PlayerPickupItemEvent +import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.api.feature.category.FeatureCategories +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.stickynote.bukkit.utils.ServerVersion + +@RegisteredFeature +@Serializable +@SerialName("legacy_prevent_pickup") +class FeatureLegacyPreventPickup( + override var enabled: Boolean = true, +): ListenedFeature("legacy_prevent_pickup", enabled, category = FeatureCategories.PREVENTION) { + + override var condition: Boolean = !ServerVersion.supports(9) + + @EventHandler + @Suppress("DEPRECATION") + private fun onPickupItem(event: PlayerPickupItemEvent) { + val user = event.player.cachedVanishUser() ?: return + if (!isActive(user)) return + if (user.isVanished) { + event.isCancelled = true + } + } +} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt index 28e673cf..f6dbe02c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt @@ -19,11 +19,12 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("prevent_advancement_announce") class FeaturePreventAdvancementAnnounce( + override var enabled: Boolean = true, @YamlComment("Whether to disable the advancement announce message when the player is vanished.") @Configurable val disableMessage: Boolean = true, @YamlComment("Whether to revoke the criteria when the player is vanished.") @Configurable val revokeCriteria: Boolean = false -): ListenedFeature("prevent_advancement_announce", category = FeatureCategories.PREVENTION) { +): ListenedFeature("prevent_advancement_announce", enabled, category = FeatureCategories.PREVENTION) { @Transient override var condition: Boolean = StickyNote.isPaper && ServerVersion.supports(13) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt index 6dc7f984..bb755414 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt @@ -14,7 +14,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_block_break") -class FeaturePreventBlockBreak: ListenedFeature("prevent_block_break", false, category = FeatureCategories.PREVENTION) { +class FeaturePreventBlockBreak( + override var enabled: Boolean = false, +): ListenedFeature("prevent_block_break", enabled, category = FeatureCategories.PREVENTION) { @EventHandler(priority = EventPriority.HIGHEST) private fun onBlockBreak(event: BlockBreakEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt index e0375ee9..05f2e87f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt @@ -14,7 +14,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_block_grief") -class FeaturePreventBlockGrief: ListenedFeature("prevent_block_grief", category = FeatureCategories.PREVENTION) { +class FeaturePreventBlockGrief( + override var enabled: Boolean = true, +): ListenedFeature("prevent_block_grief", enabled, category = FeatureCategories.PREVENTION) { @EventHandler private fun onChangeBlock(event: EntityChangeBlockEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt index 5288905e..52790680 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt @@ -14,7 +14,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_block_place") -class FeaturePreventBlockPlace: ListenedFeature("prevent_block_place", false, category = FeatureCategories.PREVENTION) { +class FeaturePreventBlockPlace( + override var enabled: Boolean = false, +): ListenedFeature("prevent_block_place", enabled, category = FeatureCategories.PREVENTION) { @EventHandler(priority = EventPriority.HIGHEST) private fun onBlockPlace(event: BlockPlaceEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt index b2d088a2..f17f3876 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt @@ -24,11 +24,12 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("prevent_chat") class FeaturePreventChat( + override var enabled: Boolean = true, @YamlComment("The character that vanished players can use to bypass the chat prevention.") @Configurable val bypassChar: String = "!", @YamlComment("Requires server restart to apply.") val priority: EventPriority = EventPriority.HIGH, -): ListenedFeature("prevent_chat", category = FeatureCategories.PREVENTION) { +): ListenedFeature("prevent_chat", enabled, category = FeatureCategories.PREVENTION) { override fun enable() { Bukkit.getPluginManager().registerEvent( diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt index 238d3c12..b9076da1 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt @@ -16,7 +16,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_creature_target") -class FeaturePreventCreatureTarget: ListenedFeature("prevent_creature_target", category = FeatureCategories.PREVENTION) { +class FeaturePreventCreatureTarget( + override var enabled: Boolean = true, +): ListenedFeature("prevent_creature_target", enabled, category = FeatureCategories.PREVENTION) { @EventHandler private fun preventEntityTargetOnVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt index 2fd8efe1..229d3c5c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt @@ -14,7 +14,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_damage") -class FeaturePreventDamage: ListenedFeature("prevent_damage", category = FeatureCategories.PREVENTION) { +class FeaturePreventDamage( + override var enabled: Boolean = true, +): ListenedFeature("prevent_damage", enabled, category = FeatureCategories.PREVENTION) { @EventHandler private fun onEntityDamage(event: EntityDamageByEntityEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt index ab82e2fe..d1903389 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt @@ -14,8 +14,9 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("prevent_food_level_change") class FeaturePreventFoodLevelChange( + override var enabled: Boolean = true, val ignoreIfIncrease: Boolean = true -): ListenedFeature("prevent_food_level_change", category = FeatureCategories.PREVENTION) { +): ListenedFeature("prevent_food_level_change", enabled, category = FeatureCategories.PREVENTION) { @EventHandler private fun onBlockBreak(event: FoodLevelChangeEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt index 3eea4875..569fccd0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt @@ -21,6 +21,7 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("prevent_interact_event") class FeaturePreventInteract( + override var enabled: Boolean = true, @YamlComment("Prevent players from activating pressure plates while vanished") @Configurable val pressurePlateTrigger: Boolean = true, @YamlComment("Prevent players from interacting with big dripleaf while vanished") @@ -29,7 +30,7 @@ class FeaturePreventInteract( @Configurable val interact: Boolean = false, @Configurable val tripwire: Boolean = true, @Configurable val button: Boolean = true, -) : ListenedFeature("prevent_interact_event", category = FeatureCategories.PREVENTION) { +) : ListenedFeature("prevent_interact_event", enabled, category = FeatureCategories.PREVENTION) { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) private fun cancelInteract(event: PlayerInteractEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt index b2db2bef..cfdafbf7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt @@ -28,21 +28,4 @@ class FeaturePreventPickup: ListenedFeature("prevent_pickup", category = Feature event.isCancelled = true } } -} - -@RegisteredFeature -@Serializable -class FeatureLegacyPreventPickup: ListenedFeature("legacy_prevent_pickup", category = FeatureCategories.PREVENTION) { - - override var condition: Boolean = !ServerVersion.supports(9) - - @EventHandler - @Suppress("DEPRECATION") - private fun onPickupItem(event: PlayerPickupItemEvent) { - val user = event.player.cachedVanishUser() ?: return - if (!isActive(user)) return - if (user.isVanished) { - event.isCancelled = true - } - } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt index 53eadf9e..dbba4767 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent +import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.bukkit.scoreboard.Team @@ -16,7 +17,10 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_push") -class FeaturePreventPush: ListenedFeature("prevent_push", enabled = false, category = FeatureCategories.PREVENTION) { +class FeaturePreventPush( + @YamlComment("This feature might cause compatibility issues with eGlow plugin. If you use eGlow, disable this feature.") + override var enabled: Boolean = false, +): ListenedFeature("prevent_push", enabled, category = FeatureCategories.PREVENTION) { @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt index 11172242..ac06d3ec 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt @@ -15,7 +15,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_raid_trigger") -class FeaturePreventRaidTrigger: ListenedFeature("prevent_raid_trigger", category = FeatureCategories.PREVENTION) { +class FeaturePreventRaidTrigger( + override var enabled: Boolean = true, +): ListenedFeature("prevent_raid_trigger", enabled, category = FeatureCategories.PREVENTION) { @Transient override var condition: Boolean = ServerVersion.supports(15) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt index ab2b72b0..bbff766f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt @@ -20,9 +20,10 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("prevent_sculk") class FeaturePreventSculk( + override var enabled: Boolean = true, @Configurable val preventSculkSensor: Boolean = true, @Configurable val preventShriek: Boolean = true -): ListenedFeature("prevent_sculk", category = FeatureCategories.PREVENTION) { +): ListenedFeature("prevent_sculk", enabled, category = FeatureCategories.PREVENTION) { val sculkBlocks = listOf( "SCULK_SENSOR", diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt index 464716a6..d9dc64d7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt @@ -15,7 +15,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_server_ping") -class FeaturePreventServerPing: ListenedFeature("prevent_server_ping", category = FeatureCategories.PREVENTION) { +class FeaturePreventServerPing( + override var enabled: Boolean = true, +): ListenedFeature("prevent_server_ping", enabled, category = FeatureCategories.PREVENTION) { @EventHandler private fun onPing(event: PaperServerListPingEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt index 2ed09e40..a13c3d77 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt @@ -18,7 +18,9 @@ import kotlinx.serialization.Serializable @RegisteredFeature @Serializable @SerialName("prevent_spawner_spawn") -class FeaturePreventSpawnerSpawn: ListenedFeature("prevent_spawner_spawn", category = FeatureCategories.PREVENTION) { +class FeaturePreventSpawnerSpawn( + override var enabled: Boolean = true, +): ListenedFeature("prevent_spawner_spawn", enabled, category = FeatureCategories.PREVENTION) { @Transient override var condition: Boolean = StickyNote.isPaper && ServerVersion.supports(16) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt index 0ea602dc..f6e3a2f7 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt @@ -22,9 +22,10 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("prevent_tab_complete") class FeaturePreventTabComplete( + override var enabled: Boolean = true, @YamlComment("Whether to keep vanished player in tab completion if the player that is getting the suggestion has a higher level of vanish.") @Configurable val checkVanishLevel: Boolean = false -): ListenedFeature("prevent_tab_complete", category = FeatureCategories.PREVENTION) { +): ListenedFeature("prevent_tab_complete", enabled, category = FeatureCategories.PREVENTION) { @EventHandler(priority = EventPriority.HIGHEST) private fun onTabComplete(event: TabCompleteEvent) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt index df4329d1..34346b75 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt @@ -7,6 +7,7 @@ import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import kotlinx.serialization.Serializable +import org.sayandev.sayanvanish.api.VanishUser.Companion.vanishUserFromCache import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.launch import java.util.UUID @@ -25,7 +26,7 @@ class FeatureHookEnhancedVelocity : HookFeature("hook_enhancedvelocity", "enhanc private class EnhancedVelocityImpl : VanishHook { override fun setIsVanished(uniqueId: UUID): Boolean { - return VanishAPI.get().isVanishedBlocking(uniqueId) + return uniqueId.vanishUserFromCache()?.isVanished == true } override fun setVanished(uniqueId: UUID) { From 98ea4aefe45c1f0d43e3d4ae0c7540f0c507ee2e Mon Sep 17 00:00:00 2001 From: Syren Date: Tue, 5 Aug 2025 20:01:01 +0330 Subject: [PATCH 32/67] chore: comment messaging unit tests for now --- .../kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt b/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt index f7adaebc..a3f8a5f3 100644 --- a/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt +++ b/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt @@ -206,7 +206,8 @@ class SimulationTest { assert(loaded == null) { "VanishUser should be removed from database" } } - @Test + // TODO: Fix websocket messaging on tests + /*@Test @Order(14) fun `syncUser() updates the cache`() = runBlocking(testDispatcher) { val db = VanishAPI.get().getDatabase() @@ -235,5 +236,5 @@ class SimulationTest { val cachedVanishUser = cache.getVanishUsers()[vanishUser.uniqueId] assert(cachedVanishUser != null) { "VanishUser should be in cache after sync" } assert(cachedVanishUser!!.uniqueId == vanishUser.uniqueId) { "Cached vanish user should match synced user" } - } + }*/ } \ No newline at end of file From d45843b42807fcbd4ac3ca06e24201d7073d6b8c Mon Sep 17 00:00:00 2001 From: Syrent Date: Fri, 26 Sep 2025 10:44:17 +0330 Subject: [PATCH 33/67] chore: better configuration handling --- gradle.properties | 2 +- .../sayanvanish/api/command/FeatureParser.kt | 41 +++++++++++++++++++ .../sayanvanish/api/feature/Feature.kt | 14 ++++--- .../sayanvanish/api/feature/Features.kt | 5 +++ .../bukkit/command/SayanVanishCommand.kt | 35 ++++------------ .../sayanvanish/bukkit/config/Settings.kt | 1 - .../sayanvanish/bukkit/feature/HookFeature.kt | 10 ++--- .../bukkit/feature/ListenedFeature.kt | 9 +--- .../feature/features/FeatureActionbar.kt | 9 ++-- .../bukkit/feature/features/FeatureEffect.kt | 7 +++- .../feature/features/FeatureFakeMessage.kt | 7 +++- .../bukkit/feature/features/FeatureFly.kt | 7 +++- .../feature/features/FeatureGameMode.kt | 7 +++- .../features/FeatureInventoryInspect.kt | 6 ++- .../features/FeatureInvulnerability.kt | 7 +++- .../bukkit/feature/features/FeatureLevel.kt | 8 +++- .../feature/features/FeatureRideEntity.kt | 7 +++- .../features/FeatureSilentContainer.kt | 7 ++-- .../bukkit/feature/features/FeatureState.kt | 8 +++- .../bukkit/feature/features/FeatureUpdate.kt | 8 ++-- .../hook/FeatureHookAdvancedServerList.kt | 10 +++-- .../features/hook/FeatureHookCitizens.kt | 8 +++- .../features/hook/FeatureHookDiscordSRV.kt | 8 +++- .../features/hook/FeatureHookDynmap.kt | 9 ++-- .../features/hook/FeatureHookEssentials.kt | 8 +++- .../features/hook/FeatureHookLuckPerms.kt | 7 +++- .../hook/FeatureHookMiniPlaceholders.kt | 7 +++- .../features/hook/FeatureHookPl3xMap.kt | 9 ++-- .../hook/FeatureHookPlaceholderAPI.kt | 7 +++- .../features/hook/FeatureHookSquareMap.kt | 9 ++-- .../feature/features/hook/FeatureHookTAB.kt | 10 +++-- .../prevent/FeatureLegacyPreventPickup.kt | 9 ++-- .../FeaturePreventAdvancementAnnounce.kt | 8 +++- .../prevent/FeaturePreventBlockBreak.kt | 9 ++-- .../prevent/FeaturePreventBlockGrief.kt | 8 +++- .../prevent/FeaturePreventBlockPlace.kt | 9 ++-- .../features/prevent/FeaturePreventChat.kt | 8 +++- .../prevent/FeaturePreventCreatureTarget.kt | 9 ++-- .../features/prevent/FeaturePreventDamage.kt | 8 +++- .../prevent/FeaturePreventFoodLevelChange.kt | 8 +++- .../prevent/FeaturePreventInteract.kt | 8 +++- .../features/prevent/FeaturePreventPickup.kt | 7 +++- .../features/prevent/FeaturePreventPush.kt | 9 ++-- .../prevent/FeaturePreventRaidTrigger.kt | 9 ++-- .../features/prevent/FeaturePreventSculk.kt | 8 +++- .../prevent/FeaturePreventServerPing.kt | 9 ++-- .../prevent/FeaturePreventSpawnerSpawn.kt | 9 ++-- .../prevent/FeaturePreventTabComplete.kt | 8 +++- .../proxy/command/SayanVanishProxyCommand.kt | 5 +-- .../proxy/config/LanguageConfig.kt | 6 +-- .../config/{SettingsConfig.kt => Settings.kt} | 35 ++++++++++------ settings.gradle.kts | 2 +- 52 files changed, 326 insertions(+), 162 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt rename sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/{SettingsConfig.kt => Settings.kt} (77%) diff --git a/gradle.properties b/gradle.properties index 318549d9..f9dd0ef8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,4 +33,4 @@ description=A modular vanish system for Minecraft servers website=https://sayandev.org author=Syrent -version=1.7.0-SNAPSHOT \ No newline at end of file +version=2.0.0-alpha.1 \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt new file mode 100644 index 00000000..949c4f0a --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt @@ -0,0 +1,41 @@ +package org.sayandev.sayanvanish.api.command + +import org.incendo.cloud.context.CommandContext +import org.incendo.cloud.context.CommandInput +import org.incendo.cloud.parser.ArgumentParseResult +import org.incendo.cloud.parser.ArgumentParser +import org.incendo.cloud.parser.ParserDescriptor +import org.incendo.cloud.suggestion.BlockingSuggestionProvider +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.feature.Feature +import org.sayandev.sayanvanish.api.feature.Features + +class FeatureParser : ArgumentParser, BlockingSuggestionProvider.Strings { + override fun parse( + commandContext: CommandContext, + commandInput: CommandInput + ): ArgumentParseResult { + val input = commandInput.readString() + val feature = Features.getFeatureById(input) + return if (feature != null) { + ArgumentParseResult.success(feature) + } else { + ArgumentParseResult.failure(Throwable("Feature with name `$input` doesn't exist")) + } + } + + override fun stringSuggestions( + commandContext: CommandContext, + input: CommandInput + ): Iterable { + val input = input.readString() + return Features.features().map { it.id }.filter { it.startsWith(input, ignoreCase = true) } + } + + companion object { + fun featureParser(): ParserDescriptor { + return ParserDescriptor.of(FeatureParser(), Feature::class.java) + } + } +} \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt index 59fddda5..1dc6b585 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt @@ -1,6 +1,9 @@ package org.sayandev.sayanvanish.api.feature import com.charleskorn.kaml.Yaml +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Required import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import org.sayandev.sayanvanish.api.Platform @@ -10,12 +13,13 @@ import org.sayandev.stickynote.core.configuration.Config import java.io.File @Serializable -abstract class Feature( - @Transient open val id: String = "@transient", - @Transient open var enabled: Boolean = true, - @Transient open val category: FeatureCategories = FeatureCategories.DEFAULT, +@OptIn(ExperimentalSerializationApi::class) +abstract class Feature { + abstract val id: String + + @Transient open var enabled: Boolean = true + @Transient open val category: FeatureCategories = FeatureCategories.DEFAULT @Transient open val critical: Boolean = false -) { @Transient open var condition: Boolean = true diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt index d3d2310d..714b3160 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt @@ -12,6 +12,11 @@ object Features { return features.find { it is T } as T } + @JvmStatic + fun getFeatureById(id: String): Feature? { + return features.find { it.id.equals(id, ignoreCase = true) } + } + @JvmStatic inline fun getUserFeature(uniqueId: UUID): T { return userFeatures[uniqueId] as T diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index a5f9e001..643edd0a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -18,6 +18,7 @@ import org.incendo.cloud.suggestion.Suggestion import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions +import org.sayandev.sayanvanish.api.command.FeatureParser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.Features @@ -256,7 +257,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val featureLiteral = rawCommandBuilder().registerCopy { literalWithPermission("feature") - required("feature", Features.features.map { it.id }) + required("feature", FeatureParser.featureParser()) } val togglePlayerLiteral = featureLiteral.registerCopy { @@ -278,10 +279,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val target = targetArg ?: sender as Player - val feature = Features.features.find { it.id == context.get("feature") } ?: let { - sender.sendComponent(language.feature.notFound) - return@suspendingHandler - } + val feature = context.get("feature") val user = target.user().await() ?: let { sender.sendComponent(language.general.userNotFound, Placeholder.unparsed("player", target.name)) @@ -301,10 +299,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set literalWithPermission("disable") handler { context -> val sender = context.sender().platformSender() - val feature = Features.features.find { it.id == context.get("feature") } ?: let { - sender.sendComponent(language.feature.notFound) - return@handler - } + val feature = context.get("feature") if (!feature.enabled) { sender.sendComponent(language.feature.alreadyDisabled, Placeholder.unparsed("feature", feature.id)) @@ -321,10 +316,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set literalWithPermission("enable") handler { context -> val sender = context.sender().platformSender() - val feature = Features.features.find { it.id == context.get("feature") } ?: let { - sender.sendComponent(language.feature.notFound) - return@handler - } + val feature = context.get("feature") if (feature.enabled) { sender.sendComponent(language.feature.alreadyEnabled, Placeholder.unparsed("feature", feature.id)) @@ -341,10 +333,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set literalWithPermission("reset") handler { context -> val sender = context.sender().platformSender() - val feature = Features.features.find { it.id == context.get("feature") } ?: let { - sender.sendComponent(language.feature.notFound) - return@handler - } + val feature = context.get("feature") feature.disable() Features.features.remove(feature) @@ -362,10 +351,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set literalWithPermission("status") handler { context -> val sender = context.sender().platformSender() - val feature = Features.features.find { it.id == context.get("feature") } ?: let { - sender.sendComponent(language.feature.notFound) - return@handler - } + val feature = context.get("feature") sender.sendComponent(language.feature.status, Placeholder.unparsed("feature", feature.id), Placeholder.parsed("status", if (feature.enabled) "Enabled" else "Disabled")) } @@ -375,16 +361,13 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set literalWithPermission("update") required(CommandComponent.builder("option", StringParser.stringParser()) .suggestionProvider { context, _ -> - val feature = Features.features.find { it.id == context.get("feature") } ?: return@suggestionProvider CompletableFuture.completedFuture(emptyList()) + val feature = context.get("feature") CompletableFuture.completedFuture(feature::class.java.declaredFields.filter { it.isAnnotationPresent(Configurable::class.java) }.map { Suggestion.suggestion(it.name) }) }) required("value", StringParser.stringParser(StringParser.StringMode.QUOTED)) handler { context -> val sender = context.sender().platformSender() - val feature = Features.features.find { it.id == context.get("feature") } ?: let { - sender.sendComponent(language.feature.notFound) - return@handler - } + val feature = context.get("feature") val field = feature.javaClass.getDeclaredField(context.get("option")) if (field == null) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt index 046ce05b..23021c2e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt @@ -65,7 +65,6 @@ class Settings( return general.serverId } - fun save() { Config.save(settingsFile, this) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt index 87df93a8..9f3412e5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt @@ -7,12 +7,10 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bukkit.hasPlugin @Serializable -abstract class HookFeature( - @Transient override val id: String = "@transient", - @Transient val plugin: String = "@transient", - @Transient override var enabled: Boolean = true, - @Transient override val category: FeatureCategories = FeatureCategories.HOOK, -) : ListenedFeature(id, enabled, category) { +abstract class HookFeature: ListenedFeature() { + abstract val plugin: String + @Transient override var enabled: Boolean = true + override val category: FeatureCategories = FeatureCategories.HOOK fun hasPlugin(): Boolean { return hasPlugin(plugin) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt index 573ddc89..75bda59a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt @@ -1,20 +1,13 @@ package org.sayandev.sayanvanish.bukkit.feature import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.Feature -import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bukkit.registerListener import org.sayandev.stickynote.bukkit.unregisterListener @Serializable -abstract class ListenedFeature( - @Transient override val id: String = "@transient", - @Transient override var enabled: Boolean = true, - @Transient override val category: FeatureCategories = FeatureCategories.DEFAULT, - @Transient override val critical: Boolean = false -) : Feature(id, enabled, category, critical), Listener { +abstract class ListenedFeature: Feature(), Listener { override fun enable() { if (!condition) return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt index a243af01..9e873ec3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature @@ -22,14 +23,16 @@ import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component @Serializable @SerialName("actionbar") class FeatureActionbar( - override var enabled: Boolean = true, @YamlComment("The content of the actionbar message.") @Configurable val content: String = "You are currently vanished!", @YamlComment("The delay before the actionbar message is sent. doesn't really matter.") @Configurable val delayMillis: Long = 1000, - @YamlComment("The period between each actionbar message. values higher than 40 will make it not always visible.") + @YamlComment("The period between each actionbar message. values higher than 2000 will make it not always visible.") @Configurable val periodMillis: Long = 1000, -) : ListenedFeature("actionbar", enabled) { +) : ListenedFeature() { + + @Transient override val id = "actionbar" + override var enabled: Boolean = true @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt index c642546a..8856224d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt @@ -21,13 +21,13 @@ import org.sayandev.stickynote.bukkit.utils.ServerVersion import org.sayandev.stickynote.core.configuration.Config import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("effect") @Suppress("DEPRECATION") data class FeatureEffect( - override var enabled: Boolean = true, @YamlComment( "All effects will being sent using packets to prevent conflict with other plugins or desyncs.", "List of effects to apply when a player vanishes" @@ -61,7 +61,10 @@ data class FeatureEffect( false, ) ) -) : ListenedFeature("effect", enabled) { +) : ListenedFeature() { + + @Transient override val id = "effect" + override var enabled: Boolean = true @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt index a81c637f..a53dbe5a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt @@ -23,12 +23,12 @@ import org.sayandev.stickynote.bukkit.utils.AdventureUtils.sendComponent import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("fake_message") class FeatureFakeMessage( - override var enabled: Boolean = true, @YamlComment("Whether to send a fake join message when a player vanishes") @Configurable val sendFakeJoinMessage: Boolean = false, @YamlComment("The message to send when a player vanishes") @@ -55,7 +55,10 @@ class FeatureFakeMessage( @Configurable val disableJoinMessageIfVanished: Boolean = true, @YamlComment("Whether to disable the quit message if the player is vanished") @Configurable val disableQuitMessageIfVanished: Boolean = true, -) : ListenedFeature("fake_message", enabled) { +) : ListenedFeature() { + + @Transient override val id = "fake_message" + override var enabled: Boolean = true @EventHandler(priority = EventPriority.LOWEST) private fun onJoin(event: PlayerJoinEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt index 9b35f6d0..802598de 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt @@ -12,15 +12,18 @@ import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("fly") class FeatureFly( - override var enabled: Boolean = true, @YamlComment("Disable fly when player reappears and don't have keep fly permission.") @Configurable val disableOnReappear: Boolean = true -) : ListenedFeature("fly", enabled) { +) : ListenedFeature() { + + @Transient override val id = "fly" + override var enabled: Boolean = true @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt index fe41efa2..94440793 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt @@ -15,12 +15,12 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("gamemode") class FeatureGameMode( - override var enabled: Boolean = true, @YamlComment("The fallback gamemode when the player is not vanished and doesn't have in-memory gamemode.") val fallbackMode: GameMode = GameMode.SURVIVAL, @YamlComment("Update gamemode history on gamemode change event.") @@ -28,7 +28,10 @@ class FeatureGameMode( @YamlComment("Change gamemode to spectator on double-sneak") val checkToggleSneak: Boolean = true, val timeWindowTicks: Long = 8 -): ListenedFeature("gamemode", enabled) { +): ListenedFeature() { + + @Transient override val id = "gamemode" + override var enabled: Boolean = true @Transient val sneakMap = mutableMapOf() @Transient val sneakList = mutableListOf() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt index 1bdd3184..b6037d23 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt @@ -21,9 +21,11 @@ import java.util.* @Serializable @SerialName("inventory_inspect") class FeatureInventoryInspect( - override var enabled: Boolean = true, @Configurable val modificationPermission: String = "${plugin.name}.features.inventory_inspect.modify" -): ListenedFeature("inventory_inspect", enabled) { +): ListenedFeature() { + + @Transient override val id = "inventory_inspect" + override var enabled: Boolean = true @Transient val playerInventoryMap = mutableListOf() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt index 626a2423..e4440639 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt @@ -11,15 +11,18 @@ import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("invulnerability") class FeatureInvulnerability( - override var enabled: Boolean = true, @YamlComment("Disable invulnerability when player reappears.") @Configurable val disableOnReappear: Boolean = true -) : ListenedFeature("invulnerability", enabled) { +) : ListenedFeature() { + + @Transient override val id = "invulnerability" + override var enabled: Boolean = true override var condition: Boolean = ServerVersion.supports(9) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt index f7a1521e..c784547d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt @@ -23,12 +23,12 @@ import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("level") class FeatureLevel( - override var enabled: Boolean = true, @YamlComment( "This feature is a CRITICAL feature! do NOT disable this feature if you don't know what you're doing.", "", @@ -42,7 +42,11 @@ class FeatureLevel( "- DATABASE: The vanish level is determined by the vanish level stored in the database. (you can use plugin internal command to change database vanish level)", ) val levelMethod: LevelMethod = LevelMethod.PERMISSION -): ListenedFeature("level", enabled, critical = true) { +): ListenedFeature() { + + @Transient override val id = "level" + override var enabled: Boolean = true + @Transient override val critical: Boolean = true @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt index aed1f04d..b520fe81 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt @@ -11,15 +11,18 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("ride_entity") class FeatureRideEntity( - override var enabled: Boolean = true, val leaveVehicleWhenOthersEnter: Boolean = true, val exitMessage: String = "You have been removed from the vehicle. because someone else entered it.", -): ListenedFeature("ride_entity", enabled) { +): ListenedFeature() { + + @Transient override val id = "ride_entity" + override var enabled: Boolean = true @EventHandler(priority = EventPriority.HIGHEST) private fun removeVanishedPassengerOnEnter(event: PlayerInteractEntityEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt index 56fee76a..b5695d5d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt @@ -28,9 +28,10 @@ import java.util.* @RegisteredFeature @Serializable @SerialName("silent_container") -class FeatureSilentContainer( - override var enabled: Boolean = true, -): ListenedFeature("silent_container", enabled) { +class FeatureSilentContainer: ListenedFeature() { + + @Transient override val id = "silent_container" + override var enabled: Boolean = true @Transient override var condition: Boolean = ServerVersion.supports(13) @Transient private val containerPlayersData = mutableMapOf() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index 64d1354a..d6de966d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -23,12 +23,12 @@ import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("state") class FeatureState( - override var enabled: Boolean = true, @YamlComment( "This is a CRITICAL feature. It is responsible for handling the state of the player when they join or quit the server.", "do NOT disable this feature if you don't know what you're doing.", @@ -44,7 +44,11 @@ class FeatureState( @Configurable val checkPermissionOnQuit: Boolean = true, @YamlComment("Whether to check permission when a player quits the server") @Configurable val checkPermissionOnJoin: Boolean = true, -) : ListenedFeature("state", enabled, critical = true) { +) : ListenedFeature() { + + @Transient override val id = "state" + override var enabled: Boolean = true + @Transient override val critical: Boolean = true @EventHandler(priority = EventPriority.LOWEST) private fun onJoin(event: PlayerJoinEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt index 87a208f6..1d7a3feb 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt @@ -27,8 +27,7 @@ import java.util.concurrent.CompletableFuture @RegisteredFeature @Serializable @SerialName("update") -class FeatureUpdate( - override var enabled: Boolean = true, +data class FeatureUpdate( @YamlComment("The interval to check for updates in minutes") @Configurable val checkEveryXMinutes: Int = 60 * 24, @YamlComment("The permission required to receive update notifications") @@ -55,7 +54,10 @@ class FeatureUpdate( "Click to update'>You can install version by clicking on this message", "Make sure to read the changelog before doing any update to prevent unexpected behaviors", ) -) : ListenedFeature("update", enabled) { +) : ListenedFeature() { + + @Transient override val id = "update" + override var enabled: Boolean = true @Transient var latestRelease: VersionInfo? = null @Transient var latestSnapshot: VersionInfo? = null diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt index 722ec553..ce33520c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -4,13 +4,17 @@ import kotlinx.serialization.SerialName import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.feature.HookFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("hook_advanced_server_list") -class FeatureHookAdvancedServerList( - override var enabled: Boolean = true, -) : HookFeature("hook_advanced_server_list", "AdvancedServerList", enabled) { +class FeatureHookAdvancedServerList: HookFeature() { + + @Transient override val id = "hook_advanced_server_list" + override var enabled: Boolean = true + override val plugin: String = "AdvancedServerList" + override fun enable() { if (hasPlugin()) { AdvancedServerListImpl().register() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt index 48c0004f..fd3a8e06 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt @@ -15,15 +15,19 @@ import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("hook_citizens") class FeatureHookCitizens( - override var enabled: Boolean = true, @YamlComment("Will cancel npc speech event if context of speech contains a vanished player") val checkSpeech: Boolean = true, -): HookFeature("hook_citizens", "Citizens", enabled) { +): HookFeature() { + + @Transient override val id = "hook_citizens" + override var enabled: Boolean = true + override val plugin: String = "Citizens" override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt index 41a06950..1d3186ca 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt @@ -12,12 +12,12 @@ import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("hook_discordsrv") class FeatureHookDiscordSRV( - override var enabled: Boolean = true, @YamlComment("Send quit message on vanish") @Configurable val sendQuitMessageOnVanish: Boolean = true, @YamlComment("Send join message on unvanish") @@ -26,7 +26,11 @@ class FeatureHookDiscordSRV( @Configurable val quitMessage: String = "%player% left the server", @YamlComment("Join message format") @Configurable val joinMessage: String = "%player% joined the server", -): HookFeature("hook_discordsrv", "DiscordSRV", enabled) { +): HookFeature() { + + @Transient override val id = "hook_discordsrv" + override var enabled: Boolean = true + override val plugin: String = "DiscordSRV" override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt index ea15d46e..61aabad4 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt @@ -11,13 +11,16 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("hook_dynmap") -class FeatureHookDynmap( - override var enabled: Boolean = true, -) : HookFeature("hook_dynmap", "dynmap", enabled) { +class FeatureHookDynmap : HookFeature() { + + @Transient override val id = "hook_dynmap" + override var enabled: Boolean = true + override val plugin: String = "dynmap" override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt index ca8f33fa..6a46c91c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt @@ -12,18 +12,22 @@ import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient import java.util.* @RegisteredFeature @Serializable @SerialName("hook_essentials") class FeatureHookEssentials( - override var enabled: Boolean = true, @YamlComment("Prevent Essentials from changing the AFK status of vanished players") @Configurable val preventAfkStatusChange: Boolean = true, @YamlComment("Prevent players to send private messages to vanished players using Essentials") @Configurable val preventPrivateMessage: Boolean = true, -) : HookFeature("hook_essentials", "Essentials", enabled) { +) : HookFeature() { + + @Transient override val id = "hook_essentials" + override var enabled: Boolean = true + override val plugin: String = "Essentials" override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt index a80d0389..3fc1caf3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt @@ -27,7 +27,6 @@ import java.util.* @Serializable @SerialName("hook_luckperms") class FeatureHookLuckPerms( - override var enabled: Boolean = true, @YamlComment( "Whether to register custom context for vanished players.", "This will allow you to check if a player is vanished using the context \"vanished\".", @@ -37,7 +36,11 @@ class FeatureHookLuckPerms( @YamlComment("Whether to check permission using LuckPerms. If false, it will fallback to bukkit permission check.") @Configurable val checkPermissionViaLuckPerms: Boolean = false, @Configurable val checkPermissionViaLuckPermsFeatures: Boolean = true, -): HookFeature("hook_luckperms", "LuckPerms", enabled) { +): HookFeature() { + + @Transient override val id = "hook_luckperms" + override var enabled: Boolean = true + override val plugin: String = "LuckPerms" @Transient var vanishContext: VanishedContext? = null diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt index ab2f76a5..d91166da 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -11,13 +11,16 @@ import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.onlinePlayers import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("hook_miniplaceholders") -class FeatureHookMiniPlaceholders( +class FeatureHookMiniPlaceholders: HookFeature() { + + @Transient override val id = "hook_miniplaceholders" override var enabled: Boolean = true -) : HookFeature("hook_miniplaceholders", "MiniPlaceholders", enabled) { + override val plugin: String = "MiniPlaceholders" override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt index 2ab28630..6a51695a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt @@ -10,13 +10,16 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("hook_pl3xmap") -class FeatureHookPl3xMap( - override var enabled: Boolean = true, -): HookFeature("hook_pl3xmap", "Pl3xMap", enabled) { +class FeatureHookPl3xMap: HookFeature() { + + @Transient override val id = "hook_pl3xmap" + override var enabled: Boolean = true + override val plugin: String = "Pl3xMap" override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt index 6cb053c7..6c1196a2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -20,7 +20,6 @@ import kotlinx.serialization.SerialName @Serializable @SerialName("hook_placeholderapi") class FeatureHookPlaceholderAPI( - override var enabled: Boolean = true, @YamlComment( "Inject placeholders into PlaceholderAPI", "Available placeholders:", @@ -32,7 +31,11 @@ class FeatureHookPlaceholderAPI( "- %sayanvanish_online_% - Returns the count of online players that are not vanished in the specified server", ) @Configurable val injectPlaceholders: Boolean = true -): HookFeature("hook_placeholderapi", "PlaceholderAPI", enabled) { +): HookFeature() { + + @Transient override val id = "hook_placeholderapi" + override var enabled: Boolean = true + override val plugin: String = "PlaceholderAPI" @Transient private var hook: Any? = null diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt index f7b99155..b9aed26d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt @@ -9,14 +9,17 @@ import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import xyz.jpenilla.squaremap.api.SquaremapProvider @RegisteredFeature @Serializable @SerialName("hook_squaremap") -class FeatureHookSquareMap( - override var enabled: Boolean = true, -): HookFeature("hook_squaremap", "squaremap", enabled) { +class FeatureHookSquareMap: HookFeature() { + + @Transient override val id = "hook_squaremap" + override var enabled: Boolean = true + override val plugin: String = "squaremap" override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt index 75f2becb..2686cb9b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt @@ -12,13 +12,17 @@ import org.sayandev.stickynote.bukkit.plugin import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("hook_tab") -class FeatureHookTAB( - override var enabled: Boolean = true, -): HookFeature("hook_tab", "TAB", enabled) { +class FeatureHookTAB: HookFeature() { + + @Transient override val id = "hook_tab" + override var enabled: Boolean = true + override val plugin: String = "TAB" + override fun enable() { if (hasPlugin()) { VanishIntegrationTAB(this).register() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt index 7bae15c3..e46735ae 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt @@ -2,6 +2,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerPickupItemEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature @@ -13,9 +14,11 @@ import org.sayandev.stickynote.bukkit.utils.ServerVersion @RegisteredFeature @Serializable @SerialName("legacy_prevent_pickup") -class FeatureLegacyPreventPickup( - override var enabled: Boolean = true, -): ListenedFeature("legacy_prevent_pickup", enabled, category = FeatureCategories.PREVENTION) { +class FeatureLegacyPreventPickup: ListenedFeature() { + + @Transient override val id = "legacy_prevent_pickup" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION override var condition: Boolean = !ServerVersion.supports(9) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt index f6dbe02c..78164934 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt @@ -14,17 +14,21 @@ import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_advancement_announce") class FeaturePreventAdvancementAnnounce( - override var enabled: Boolean = true, @YamlComment("Whether to disable the advancement announce message when the player is vanished.") @Configurable val disableMessage: Boolean = true, @YamlComment("Whether to revoke the criteria when the player is vanished.") @Configurable val revokeCriteria: Boolean = false -): ListenedFeature("prevent_advancement_announce", enabled, category = FeatureCategories.PREVENTION) { +): ListenedFeature() { + + @Transient override val id = "prevent_advancement_announce" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @Transient override var condition: Boolean = StickyNote.isPaper && ServerVersion.supports(13) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt index bb755414..757a71c0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt @@ -10,13 +10,16 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_block_break") -class FeaturePreventBlockBreak( - override var enabled: Boolean = false, -): ListenedFeature("prevent_block_break", enabled, category = FeatureCategories.PREVENTION) { +class FeaturePreventBlockBreak: ListenedFeature() { + + @Transient override val id = "prevent_block_break" + override var enabled: Boolean = false + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler(priority = EventPriority.HIGHEST) private fun onBlockBreak(event: BlockBreakEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt index 05f2e87f..72dc7fe1 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt @@ -10,13 +10,17 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_block_grief") class FeaturePreventBlockGrief( - override var enabled: Boolean = true, -): ListenedFeature("prevent_block_grief", enabled, category = FeatureCategories.PREVENTION) { +): ListenedFeature() { + + @Transient override val id = "prevent_block_grief" + override var enabled: Boolean = false + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler private fun onChangeBlock(event: EntityChangeBlockEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt index 52790680..2cc4fd22 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt @@ -10,13 +10,16 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_block_place") -class FeaturePreventBlockPlace( - override var enabled: Boolean = false, -): ListenedFeature("prevent_block_place", enabled, category = FeatureCategories.PREVENTION) { +class FeaturePreventBlockPlace: ListenedFeature() { + + @Transient override val id = "prevent_block_place" + override var enabled: Boolean = false + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler(priority = EventPriority.HIGHEST) private fun onBlockPlace(event: BlockPlaceEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt index f17f3876..4fb6e963 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt @@ -19,17 +19,21 @@ import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_chat") class FeaturePreventChat( - override var enabled: Boolean = true, @YamlComment("The character that vanished players can use to bypass the chat prevention.") @Configurable val bypassChar: String = "!", @YamlComment("Requires server restart to apply.") val priority: EventPriority = EventPriority.HIGH, -): ListenedFeature("prevent_chat", enabled, category = FeatureCategories.PREVENTION) { +): ListenedFeature() { + + @Transient override val id = "prevent_chat" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION override fun enable() { Bukkit.getPluginManager().registerEvent( diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt index b9076da1..e1785812 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt @@ -12,13 +12,16 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_creature_target") -class FeaturePreventCreatureTarget( - override var enabled: Boolean = true, -): ListenedFeature("prevent_creature_target", enabled, category = FeatureCategories.PREVENTION) { +class FeaturePreventCreatureTarget: ListenedFeature() { + + @Transient override val id = "prevent_creature_target" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler private fun preventEntityTargetOnVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt index 229d3c5c..1630b75f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt @@ -10,13 +10,17 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_damage") class FeaturePreventDamage( - override var enabled: Boolean = true, -): ListenedFeature("prevent_damage", enabled, category = FeatureCategories.PREVENTION) { +): ListenedFeature() { + + @Transient override val id = "prevent_damage" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler private fun onEntityDamage(event: EntityDamageByEntityEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt index d1903389..acc8f92e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt @@ -9,14 +9,18 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_food_level_change") class FeaturePreventFoodLevelChange( - override var enabled: Boolean = true, val ignoreIfIncrease: Boolean = true -): ListenedFeature("prevent_food_level_change", enabled, category = FeatureCategories.PREVENTION) { +): ListenedFeature() { + + @Transient override val id = "prevent_food_level_change" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler private fun onBlockBreak(event: FoodLevelChangeEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt index 569fccd0..8e1eb025 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt @@ -16,12 +16,12 @@ import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_interact_event") class FeaturePreventInteract( - override var enabled: Boolean = true, @YamlComment("Prevent players from activating pressure plates while vanished") @Configurable val pressurePlateTrigger: Boolean = true, @YamlComment("Prevent players from interacting with big dripleaf while vanished") @@ -30,7 +30,11 @@ class FeaturePreventInteract( @Configurable val interact: Boolean = false, @Configurable val tripwire: Boolean = true, @Configurable val button: Boolean = true, -) : ListenedFeature("prevent_interact_event", enabled, category = FeatureCategories.PREVENTION) { +) : ListenedFeature() { + + @Transient override val id = "prevent_interact_event" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) private fun cancelInteract(event: PlayerInteractEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt index cfdafbf7..3272f744 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt @@ -12,11 +12,16 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_pickup") -class FeaturePreventPickup: ListenedFeature("prevent_pickup", category = FeatureCategories.PREVENTION) { +class FeaturePreventPickup: ListenedFeature() { + + @Transient override val id = "prevent_pickup" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION override var condition: Boolean = ServerVersion.supports(9) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt index dbba4767..ebe99eab 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt @@ -13,14 +13,17 @@ import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.hasPlugin import org.sayandev.stickynote.bukkit.warn import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_push") -class FeaturePreventPush( +class FeaturePreventPush: ListenedFeature() { + + @Transient override val id = "prevent_push" @YamlComment("This feature might cause compatibility issues with eGlow plugin. If you use eGlow, disable this feature.") - override var enabled: Boolean = false, -): ListenedFeature("prevent_push", enabled, category = FeatureCategories.PREVENTION) { + override var enabled: Boolean = false + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler private fun onVanish(event: BukkitUserVanishEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt index ac06d3ec..8d97b8f1 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt @@ -11,13 +11,16 @@ import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.event.registerListener import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_raid_trigger") -class FeaturePreventRaidTrigger( - override var enabled: Boolean = true, -): ListenedFeature("prevent_raid_trigger", enabled, category = FeatureCategories.PREVENTION) { +class FeaturePreventRaidTrigger: ListenedFeature() { + + @Transient override val id = "prevent_raid_trigger" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @Transient override var condition: Boolean = ServerVersion.supports(15) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt index bbff766f..b73b45cf 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt @@ -15,15 +15,19 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_sculk") class FeaturePreventSculk( - override var enabled: Boolean = true, @Configurable val preventSculkSensor: Boolean = true, @Configurable val preventShriek: Boolean = true -): ListenedFeature("prevent_sculk", enabled, category = FeatureCategories.PREVENTION) { +): ListenedFeature() { + + @Transient override val id = "prevent_sculk" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION val sculkBlocks = listOf( "SCULK_SENSOR", diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt index d9dc64d7..22f5ceb5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt @@ -11,13 +11,16 @@ import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_server_ping") -class FeaturePreventServerPing( - override var enabled: Boolean = true, -): ListenedFeature("prevent_server_ping", enabled, category = FeatureCategories.PREVENTION) { +class FeaturePreventServerPing: ListenedFeature() { + + @Transient override val id = "prevent_server_ping" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler private fun onPing(event: PaperServerListPingEvent) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt index a13c3d77..4997c6bb 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt @@ -14,13 +14,16 @@ import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_spawner_spawn") -class FeaturePreventSpawnerSpawn( - override var enabled: Boolean = true, -): ListenedFeature("prevent_spawner_spawn", enabled, category = FeatureCategories.PREVENTION) { +class FeaturePreventSpawnerSpawn: ListenedFeature() { + + @Transient override val id = "prevent_spawner_spawn" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @Transient override var condition: Boolean = StickyNote.isPaper && ServerVersion.supports(16) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt index f6e3a2f7..398fd1a0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt @@ -17,15 +17,19 @@ import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable @SerialName("prevent_tab_complete") class FeaturePreventTabComplete( - override var enabled: Boolean = true, @YamlComment("Whether to keep vanished player in tab completion if the player that is getting the suggestion has a higher level of vanish.") @Configurable val checkVanishLevel: Boolean = false -): ListenedFeature("prevent_tab_complete", enabled, category = FeatureCategories.PREVENTION) { +): ListenedFeature() { + + @Transient override val id = "prevent_tab_complete" + override var enabled: Boolean = true + @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler(priority = EventPriority.HIGHEST) private fun onTabComplete(event: TabCompleteEvent) { diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt index 51b76e48..b6ef3436 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt @@ -1,11 +1,10 @@ package org.sayandev.sayanvanish.proxy.command import org.incendo.cloud.CommandManager -import org.incendo.cloud.kotlin.MutableCommandBuilder -import org.sayandev.sayanvanish.proxy.config.settings +import org.sayandev.sayanvanish.proxy.config.Settings import org.sayandev.stickynote.core.command.Command import org.sayandev.stickynote.core.command.interfaces.SenderExtension abstract class SayanVanishProxyCommand, C: CommandManager>( manager: C, -) : Command("sayanvanishproxy", manager, settings.command.name, *settings.command.aliases.toTypedArray()) \ No newline at end of file +) : Command("sayanvanishproxy", manager, Settings.get().command.name, *Settings.get().command.aliases.toTypedArray()) \ No newline at end of file diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt index 64aa44c8..7cc817a7 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt @@ -1,10 +1,8 @@ package org.sayandev.sayanvanish.proxy.config -import github.scarsz.discordsrv.dependencies.okhttp3.internal.http2.Settings import org.sayandev.sayanvanish.api.Platform import org.sayandev.stickynote.core.configuration.Config import kotlinx.serialization.Serializable -import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import java.io.File public var language: LanguageConfig = LanguageConfig.fromConfig() ?: LanguageConfig.defaultConfig() @@ -43,7 +41,7 @@ class LanguageConfig( } fun save() { - Config.save(File(languageDirectory, "${settings.general.language}.yml"), this) + Config.save(File(languageDirectory, "${Settings.get().general.language}.yml"), this) } companion object { @@ -57,7 +55,7 @@ class LanguageConfig( @JvmStatic fun fromConfig(): LanguageConfig? { - return Config.fromFile(File(languageDirectory, "${settings.general.language}.yml")) + return Config.fromFile(File(languageDirectory, "${Settings.get().general.language}.yml")) } } } \ No newline at end of file diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/SettingsConfig.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt similarity index 77% rename from sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/SettingsConfig.kt rename to sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt index 373a41c9..cd13bc2d 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/SettingsConfig.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt @@ -7,10 +7,8 @@ import com.charleskorn.kaml.YamlComment import java.io.File import java.util.UUID -public var settings: SettingsConfig = SettingsConfig.fromConfig() ?: SettingsConfig.defaultConfig() - @Serializable -class SettingsConfig( +class Settings( @YamlComment(""" Do NOT copy and paste the SayanVanish directory across multiple servers. The server-id is generated during the plugin's first startup. @@ -21,9 +19,6 @@ class SettingsConfig( val general: General = General(), @YamlComment("Command settings for the plugin") val command: Command = Command() -) : Config( - Platform.get().rootDirectory, - fileName ) { @Serializable @@ -59,18 +54,34 @@ class SettingsConfig( ) ) + fun save() { + Config.save(settingsFile, this) + } + companion object { - private val fileName = "settings.yml" - val settingsFile = File(Platform.get().rootDirectory, fileName) + private const val FILE_NAME = "settings.yml" + + val settingsFile = File(Platform.get().rootDirectory, FILE_NAME) + var config = fromConfig() ?: defaultConfig() + + @JvmStatic + fun defaultConfig(): Settings { + return Settings().also { it.save() } + } + + @JvmStatic + fun fromConfig(): Settings? { + return Config.fromFile(settingsFile) + } @JvmStatic - fun defaultConfig(): SettingsConfig { - return SettingsConfig().also { it.save() } + fun reload() { + config = fromConfig() ?: defaultConfig() } @JvmStatic - fun fromConfig(): SettingsConfig? { - return fromFile(settingsFile) + fun get(): Settings { + return config } } } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 612b1b87..53dc8524 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,7 +9,7 @@ pluginManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" - id("org.sayandev.stickynote.settings") version "1.10.5.kotlinx-serialization.8" + id("org.sayandev.stickynote.settings") version "1.10.5.kotlinx-serialization.9" } rootProject.name = "SayanVanish" From d5b5c29454e4cc5f43a54127931ee6d1acfa0c32 Mon Sep 17 00:00:00 2001 From: Syrent Date: Wed, 1 Oct 2025 17:25:05 +0330 Subject: [PATCH 34/67] feat: velocity module compiles and runs --- .../sayanvanish/api/SayanVanishAPI.kt | 5 +- .../org/sayandev/sayanvanish/api/User.kt | 10 +- .../sayandev/sayanvanish/api/VanishUser.kt | 6 +- .../types/WebSocketMessagingService.kt | 1 + .../api/storage/TransactionDatabase.kt | 15 +-- .../sayanvanish/api/storage/sql/SQLConfig.kt | 2 +- .../api/storage/sql/SQLDatabase.kt | 2 +- .../sayanvanish/bukkit/SayanVanishPlugin.kt | 7 -- .../sayanvanish/bukkit/api/BukkitUser.kt | 18 +++- .../bukkit/api/BukkitVanishUser.kt | 13 ++- .../bukkit/command/SayanVanishCommand.kt | 7 +- .../sayanvanish/bukkit/feature/HookFeature.kt | 2 +- .../bukkit/feature/ListenedFeature.kt | 2 +- .../feature/features/FeatureActionbar.kt | 8 +- .../feature/features/FeatureFakeMessage.kt | 15 ++- .../bukkit/feature/features/FeatureFly.kt | 2 +- .../bukkit/feature/features/FeatureState.kt | 20 ++-- .../hook/FeatureHookMiniPlaceholders.kt | 41 ++++--- .../hook/FeatureHookPlaceholderAPI.kt | 5 +- .../features/prevent/FeaturePreventChat.kt | 13 ++- .../sayanvanish/bukkit/utils/PlayerUtils.kt | 2 +- .../{SayanVanish.kt => SayanVanishPlugin.kt} | 41 +++---- .../sayanvanish/velocity/VanishManager.kt | 15 ++- .../sayanvanish/velocity/VelocityPlatform.kt | 47 ++++++++ .../velocity/VelocityPlatformAdapter.kt | 19 +++- .../velocity/api/SayanVanishVelocityAPI.kt | 100 +++++++++++++++++- .../sayanvanish/velocity/api/VelocityUser.kt | 34 ++++-- .../velocity/api/VelocityVanishUser.kt | 47 +++----- .../SayanVanishProxyCommandVelocity.kt | 6 +- .../velocity/feature/HookFeature.kt | 14 +-- .../velocity/feature/ListenedFeature.kt | 11 +- .../feature/features/FeatureSyncEvents.kt | 31 +++--- .../feature/features/FeatureUpdate.kt | 15 ++- .../feature/features/FeatureUpdatePing.kt | 9 +- .../hook/FeatureHookAdvancedServerList.kt | 26 +++-- .../hook/FeatureHookEnhancedVelocity.kt | 9 +- ...ckPermsHook.kt => FeatureHookLuckPerms.kt} | 15 ++- .../hook/FeatureHookMiniPlaceholders.kt | 70 ++++++------ .../feature/features/hook/FeatureHookTAB.kt | 19 ++-- .../features/hook/FeatureHookVelocitab.kt | 38 ++++--- .../features/prevent/FeaturePreventChat.kt | 24 +++-- .../prevent/FeaturePreventTabComplete.kt | 15 ++- .../sayanvanish/velocity/utils/PlayerUtils.kt | 12 +-- .../src/main/resources/velocity-plugin.json | 2 +- .../sayanvanish/proxy/config/Settings.kt | 20 ++-- settings.gradle.kts | 2 +- 46 files changed, 522 insertions(+), 315 deletions(-) rename sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/{SayanVanish.kt => SayanVanishPlugin.kt} (72%) create mode 100644 sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatform.kt rename sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/{FeatureLuckPermsHook.kt => FeatureHookLuckPerms.kt} (88%) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index 88b933d9..c81364e5 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -1,14 +1,11 @@ package org.sayandev.sayanvanish.api -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.Deferred import kotlinx.coroutines.runBlocking import org.sayandev.sayanvanish.api.cache.CacheService import org.sayandev.sayanvanish.api.cache.MemoryCacheService -import org.sayandev.sayanvanish.api.storage.TransactionDatabase import org.sayandev.sayanvanish.api.message.MessagingService import org.sayandev.sayanvanish.api.message.TypedMessagingService -import org.sayandev.stickynote.core.utils.launch +import org.sayandev.sayanvanish.api.storage.TransactionDatabase import java.util.* object SayanVanishAPI : VanishAPI { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 64fe01df..95830d12 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.Deferred import kotlinx.coroutines.awaitAll import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking -import org.sayandev.sayanventure.adventure.text.Component +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.storage.PlatformTable import org.sayandev.stickynote.core.utils.async import java.lang.reflect.Type @@ -72,12 +72,12 @@ interface User { return hasPermission(permission.permission()) } - fun sendMessage(content: Component) { - Platform.get().adapter.adapt(this).sendMessage(content) + fun sendMessage(content: String, vararg placeholders: TagResolver) { + Platform.get().adapter.adapt(this).sendMessage(content, *placeholders) } - fun sendActionbar(content: Component) { - Platform.get().adapter.adapt(this).sendActionbar(content) + fun sendActionbar(content: String, vararg placeholders: TagResolver) { + Platform.get().adapter.adapt(this).sendActionbar(content, *placeholders) } /** diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 24df9d8a..1d89638b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -152,9 +152,9 @@ interface VanishUser : User { object Schema : PlatformTable("vanish_users") { val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() - val isVanished = bool("is_vanished") - val vanishLevel = integer("vanish_level") - val currentOptions = varchar("current_options", 255) + val isVanished = bool("is_vanished").default(false) + val vanishLevel = integer("vanish_level").default(0) + val currentOptions = text("current_options") override val primaryKey = PrimaryKey(uniqueId) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt index 61283076..8bc44861 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -2,6 +2,7 @@ package org.sayandev.sayanvanish.api.message.types import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred +import org.jetbrains.exposed.sql.Except import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt index d73811d8..b560fc72 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt @@ -1,20 +1,11 @@ package org.sayandev.sayanvanish.api.storage -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.CoroutineStart -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.async -import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.isActive -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.polymorphic -import org.sayandev.sayanvanish.api.User +import kotlinx.coroutines.* import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.storage.redis.RedisDatabase import org.sayandev.sayanvanish.api.storage.sql.SQLDatabase -import org.sayandev.stickynote.core.configuration.Config import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import java.util.* @@ -178,7 +169,7 @@ class TransactionDatabase: Database { fun database(method: DatabaseType): Database { return databaseTypes[method] ?: let { val (fallbackMethod, fallbackDatabase) = databaseTypes.entries.first() - Platform.Companion.get().logger.warning("Tried to get a database of type $method, but it was not initialized. falling back to ${fallbackMethod} database method.") + Platform.get().logger.warning("Tried to get a database of type $method, but it was not initialized. falling back to ${fallbackMethod} database method.") fallbackDatabase } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt index fbf57195..0d61b6d5 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt @@ -7,7 +7,7 @@ import org.spongepowered.configurate.objectmapping.meta.Setting @Serializable class SQLConfig( var threadCount: Int = 5, - @YamlComment("The method to use for the database. Available methods: MYSQL, SQLITE") + @YamlComment("The method to use for the database. Available methods: MARIADB, MYSQL, SQLITE") val method: SQLMethod = SQLMethod.SQLITE, @YamlComment("The host address of the SQL database. If it's an IP address (x.x.x.x), ensure it is enclosed in double quotes (`\"`).") val host: String = "127.0.0.1", diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index 0ccbd4a8..3242f46c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -158,8 +158,8 @@ class SQLDatabase( } override suspend fun saveVanishUser(vanishUser: VanishUser): Deferred { + saveUser(vanishUser).await() return async { - saveUser(vanishUser).await() VanishUser.Schema.upsert { row -> row[uniqueId] = vanishUser.uniqueId row[isVanished] = vanishUser.isVanished diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt index 19e28248..f5e0ef8a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt @@ -59,8 +59,6 @@ class SayanVanishPlugin : JavaPlugin() { } } - abstract class MozAb - override fun onDisable() { runBlocking { Platform.get().unregister() @@ -72,11 +70,6 @@ class SayanVanishPlugin : JavaPlugin() { return this.file } - @Serializable - data class MozeTest( - val testsss: String = "moz" - ) - companion object { private lateinit var instance: SayanVanishPlugin diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index 1b59d336..39f6b946 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -1,14 +1,16 @@ package org.sayandev.sayanvanish.bukkit.api +import net.kyori.adventure.audience.Audience +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.Bukkit import org.bukkit.permissions.Permission import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanventure.adventure.audience.Audience -import org.sayandev.sayanventure.adventure.text.Component import org.sayandev.stickynote.bukkit.extension.sendComponent import org.sayandev.stickynote.bukkit.extension.sendComponentActionbar import org.sayandev.stickynote.bukkit.utils.AdventureUtils +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import java.util.* class BukkitUser( @@ -26,11 +28,19 @@ class BukkitUser( return player()?.hasPermission(Permission(permission, PermissionDefault.FALSE)) == true } - override fun sendMessage(content: Component) { + override fun sendMessage(content: String, vararg placeholders: TagResolver) { + sendMessage(content.component(*placeholders)) + } + + override fun sendActionbar(content: String, vararg placeholders: TagResolver) { + sendActionbar(content.component(*placeholders)) + } + + fun sendMessage(content: Component) { player()?.sendComponent(content) } - override fun sendActionbar(content: Component) { + fun sendActionbar(content: Component) { player()?.sendComponentActionbar(content) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index d3e1beb8..e65e948c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -1,13 +1,12 @@ package org.sayandev.sayanvanish.bukkit.api -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.Bukkit import org.bukkit.OfflinePlayer import org.bukkit.entity.Player import org.bukkit.metadata.FixedMetadataValue import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.Permission -import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser @@ -77,7 +76,7 @@ open class BukkitVanishUser( // order matters - don't move hideUser before vanish (hideUser have a canSee check for vanish state notify) hideUser() - sendMessage(language.vanish.vanishStateUpdate.component(Placeholder.parsed("state", stateText()))) + sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } override fun appear(options: VanishOptions) { @@ -97,7 +96,7 @@ open class BukkitVanishUser( super.appear(options) - sendMessage(language.vanish.vanishStateUpdate.component(Placeholder.parsed("state", stateText()))) + sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } override fun hasPermission(permission: String): Boolean { @@ -105,7 +104,7 @@ open class BukkitVanishUser( val luckPermsFeature = Features.getFeature() /* * I have to check if the player is op or not and luckperms feature is enabled so it doesn't disable all feature for op players - * (bukkit permission check return true for all permissions if the player is op) + * (bukkit permission check return true for all permissions if the player is op and the permission default is not false) * */ // Can't use luckperms feature isActive per-player, because per-player features check for player permissions and it causes stackoverflow if (luckPermsFeature.isActive() && luckPermsFeature.checkPermissionViaLuckPerms) { @@ -134,7 +133,7 @@ open class BukkitVanishUser( } if (currentOptions.notifyStatusChangeToOthers) { for (otherUser in VanishAPI.get().getCacheService().getUsers().getOnline().filter { it.username != username && it.generatedVanishUser().canSee(this) }) { - otherUser.sendMessage(language.vanish.vanishStateOther.component(Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(true)))) + otherUser.sendMessage(language.vanish.vanishStateOther, Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(true))) } } } @@ -151,7 +150,7 @@ open class BukkitVanishUser( } if (currentOptions.notifyStatusChangeToOthers) { for (otherUser in VanishAPI.get().getCacheService().getUsers().getOnline().filter { it.username != this.username && it.generatedVanishUser().canSee(this) }) { - otherUser.sendMessage(language.vanish.vanishStateOther.component(Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(false)))) + otherUser.sendMessage(language.vanish.vanishStateOther, Placeholder.parsed("player", username), Placeholder.parsed("state", stateText(false))) } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 643edd0a..353c2966 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.command -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.OfflinePlayer import org.bukkit.command.CommandSender import org.bukkit.entity.Player @@ -26,8 +26,6 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.api.utils.Paste -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user @@ -41,7 +39,6 @@ import org.sayandev.sayanvanish.bukkit.utils.ServerUtils import org.sayandev.stickynote.bukkit.* import org.sayandev.stickynote.bukkit.command.BukkitCommand import org.sayandev.stickynote.bukkit.command.BukkitSender -import org.sayandev.stickynote.bukkit.command.required import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.sayandev.stickynote.core.utils.MilliCounter import java.io.File @@ -87,7 +84,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val user = player.getOrCreateVanishUser() if (!user.hasPermission(Permission.VANISH)) { - user.sendMessage(language.vanish.dontHaveUsePermission.component(Placeholder.unparsed("permission", Permission.VANISH.permission()))) + user.sendMessage(language.vanish.dontHaveUsePermission, Placeholder.unparsed("permission", Permission.VANISH.permission())) } val options = VanishOptions.defaultOptions().apply { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt index 9f3412e5..6a885974 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt @@ -7,7 +7,7 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.stickynote.bukkit.hasPlugin @Serializable -abstract class HookFeature: ListenedFeature() { +abstract class HookFeature : ListenedFeature() { abstract val plugin: String @Transient override var enabled: Boolean = true override val category: FeatureCategories = FeatureCategories.HOOK diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt index 75bda59a..45732c6b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt @@ -7,7 +7,7 @@ import org.sayandev.stickynote.bukkit.registerListener import org.sayandev.stickynote.bukkit.unregisterListener @Serializable -abstract class ListenedFeature: Feature(), Listener { +abstract class ListenedFeature : Feature(), Listener { override fun enable() { if (!condition) return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt index 9e873ec3..d9bb3369 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.isActive import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient +import net.kyori.adventure.text.Component import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature @@ -13,7 +14,6 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cached import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanventure.adventure.text.Component import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.onlinePlayers @@ -38,14 +38,14 @@ class FeatureActionbar( private fun onVanish(event: BukkitUserVanishEvent) { val user = event.user if (!isActive(user)) return - user.sendActionbar(content.component()) + user.sendActionbar(content) } @EventHandler private fun onUnVanish(event: BukkitUserUnVanishEvent) { val user = event.user if (!isActive(user)) return - user.sendActionbar(Component.empty()) + user.sendActionbar("") } override fun enable() { @@ -56,7 +56,7 @@ class FeatureActionbar( // warn("vanished: ${VanishAPI.get().getCacheService().getVanishUsers().values.joinToString(" ,") { "${it.username}:${it.isVanished}" }}") for (user in onlinePlayers.mapNotNull { it.cachedVanishUser() }.filter { it.isVanished }) { if (!isActive(user)) continue - user.sendActionbar(content.component()) + user.sendActionbar(content) } delay(periodMillis) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt index a53dbe5a..59de0238 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt @@ -1,7 +1,11 @@ package org.sayandev.sayanvanish.bukkit.feature.features -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder -import org.sayandev.sayanventure.adventure.text.serializer.legacy.LegacyComponentSerializer +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent @@ -10,20 +14,13 @@ import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendRawComponent import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.AdventureUtils -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.sendComponent -import kotlinx.serialization.Serializable -import com.charleskorn.kaml.YamlComment -import kotlinx.serialization.SerialName -import kotlinx.serialization.Transient @RegisteredFeature @Serializable diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt index 802598de..f7efaae3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt @@ -40,7 +40,7 @@ class FeatureFly( val user = event.user if (!isActive(user)) return if (!user.hasPermission(Permission.FLY_KEEP_AFTER_REAPPEAR) && disableOnReappear) { - user.sendMessage(language.feature.flyDisabled.component()) + user.sendMessage(language.feature.flyDisabled) user.player()?.allowFlight = false user.player()?.isFlying = false } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index d6de966d..db0a6b74 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -1,6 +1,10 @@ package org.sayandev.sayanvanish.bukkit.feature.features -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent @@ -10,20 +14,12 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component -import kotlinx.serialization.Serializable -import com.charleskorn.kaml.YamlComment -import kotlinx.serialization.SerialName -import kotlinx.serialization.Transient @RegisteredFeature @Serializable @@ -81,7 +77,7 @@ class FeatureState( user.isOnline = true if (checkPermissionOnJoin && !user.hasPermission(Permission.VANISH)) { - user.sendMessage(language.vanish.noPermissionToKeepVanished.component(Placeholder.unparsed("permission", Permission.VANISH.permission()))) + user.sendMessage(language.vanish.noPermissionToKeepVanished, Placeholder.unparsed("permission", Permission.VANISH.permission())) user.appear(vanishJoinOptions) launch { user.delete() @@ -97,7 +93,7 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { - vanishedUser.sendMessage(language.vanish.joinedTheServerWhileVanished.component(Placeholder.unparsed("player", user.username))) + vanishedUser.sendMessage(language.vanish.joinedTheServerWhileVanished, Placeholder.unparsed("player", user.username)) } } } @@ -117,7 +113,7 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { - vanishedUser.sendMessage(language.vanish.leftTheServerWhileVanished.component(Placeholder.unparsed("player", user.username))) + vanishedUser.sendMessage(language.vanish.leftTheServerWhileVanished, Placeholder.unparsed("player", user.username)) } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt index d91166da..2c135e32 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -1,17 +1,20 @@ package org.sayandev.sayanvanish.bukkit.feature.features.hook import io.github.miniplaceholders.api.Expansion -import io.github.miniplaceholders.api.utils.TagsUtils +import io.github.miniplaceholders.api.utils.Tags import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import net.kyori.adventure.text.minimessage.tag.Tag import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.HookFeature import org.sayandev.stickynote.bukkit.onlinePlayers -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component @RegisteredFeature @Serializable @@ -45,33 +48,33 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) unregister() builder.audiencePlaceholder("vanished") { audience, queue, context -> - val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.EMPTY_TAG - return@audiencePlaceholder TagsUtils.staticTag(if (player.cachedVanishUser()?.isVanished == true) "true" else "false") + val player = audience as? Player ?: return@audiencePlaceholder Tags.EMPTY_TAG + return@audiencePlaceholder Tag.selfClosingInserting((if (player.cachedVanishUser()?.isVanished == true) "true" else "false").component()) } builder.audiencePlaceholder("level") { audience, queue, context -> - val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("0") - return@audiencePlaceholder TagsUtils.staticTag(player.cachedVanishUser()?.vanishLevel?.toString() ?: "0") + val player = audience as? Player ?: return@audiencePlaceholder Tag.selfClosingInserting("0".component()) + return@audiencePlaceholder Tag.selfClosingInserting((player.cachedVanishUser()?.vanishLevel?.toString() ?: "0").component()) } builder.globalPlaceholder("count") { queue, context -> - TagsUtils.staticTag(VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { user -> user.isOnline }.size.toString()) + Tag.selfClosingInserting(VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.isVanished && it.isOnline }.size.toString().component()) } builder.audiencePlaceholder("vanish_prefix") { audience, queue, context -> - TagsUtils.staticTag(if ((audience as? Player)?.cachedVanishUser()?.isVanished == true) language.vanish.placeholderPrefix else "") + Tag.selfClosingInserting((if ((audience as? Player)?.cachedVanishUser()?.isVanished == true) language.vanish.placeholderPrefix else "").component()) } builder.audiencePlaceholder("vanish_suffix") { audience, queue, context -> - TagsUtils.staticTag(if ((audience as? Player)?.cachedVanishUser()?.isVanished == true) language.vanish.placeholderSuffix else "") + Tag.selfClosingInserting((if ((audience as? Player)?.cachedVanishUser()?.isVanished == true) language.vanish.placeholderSuffix else "").component()) } builder.globalPlaceholder("online") { queue, context -> if (!queue.hasNext()) { - return@globalPlaceholder TagsUtils.EMPTY_TAG + return@globalPlaceholder Tags.EMPTY_TAG } - val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { user -> user.isOnline } + val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().values.filter { user -> user.isVanished && user.isOnline } val serverName = queue.pop().value() val result = when (serverName) { @@ -79,14 +82,22 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username }.contains(onlinePlayer.name) }.size.toString() } "total" -> { - VanishAPI.get().getCacheService().getUsers().values.filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + if (!Settings.get().general.proxyMode) { + "PROXY_MODE IS NOT ENABLED!" + } else { + VanishAPI.get().getCacheService().getUsers().values.filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + } } else -> { - VanishAPI.get().getCacheService().getUsers().getByServer(serverName).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + if (!Settings.get().general.proxyMode) { + "PROXY_MODE IS NOT ENABLED!" + } else { + VanishAPI.get().getCacheService().getUsers().values.filter { it.serverId == serverName && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + } } } - TagsUtils.staticTag(result) + Tag.selfClosingInserting(result.component()) } builder.build().register() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt index 6c1196a2..0c112873 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -15,6 +15,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName +import org.sayandev.stickynote.bukkit.warn @RegisteredFeature @Serializable @@ -115,13 +116,15 @@ private class HookPlaceholderAPI : PlaceholderExpansion() { if (params.startsWith("online_")) { val type = params.removePrefix("online_") - val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { user -> user.isOnline } + val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().getOnlineVanished() return if (type.equals("here", true)) { onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username }.contains(onlinePlayer.name) }.size.toString() } else if (type.equals("total", true)) { return VanishAPI.get().getCacheService().getUsers().values.filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } else { + warn("vanished online users: ${vanishedOnlineUsers.joinToString(", ") { it.username }}") + warn("users by server: ${VanishAPI.get().getCacheService().getUsers().values.joinToString(", ") { "${it.username}:${it.serverId}" }}") return VanishAPI.get().getCacheService().getUsers().getByServer(type).filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt index 4fb6e963..359d6320 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt @@ -1,6 +1,10 @@ package org.sayandev.sayanvanish.bukkit.feature.features.prevent -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.Bukkit import org.bukkit.event.Event import org.bukkit.event.EventPriority @@ -10,16 +14,11 @@ import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component -import kotlinx.serialization.Serializable -import com.charleskorn.kaml.YamlComment -import kotlinx.serialization.SerialName -import kotlinx.serialization.Transient @RegisteredFeature @Serializable @@ -50,7 +49,7 @@ class FeaturePreventChat( if (message.startsWith(bypassChar)) { event.message = message.removePrefix(bypassChar) } else { - user.sendMessage(language.vanish.cantChatWhileVanished.component(Placeholder.unparsed("char", bypassChar))) + user.sendMessage(language.vanish.cantChatWhileVanished, Placeholder.unparsed("char", bypassChar)) event.isCancelled = true } }, diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt index c1f05fe7..73c3b7e9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt @@ -1,6 +1,6 @@ package org.sayandev.sayanvanish.bukkit.utils -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.command.CommandSender import org.bukkit.entity.Player import org.sayandev.sayanvanish.bukkit.config.Settings diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt similarity index 72% rename from sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt rename to sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt index ab9f67f9..206cf692 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanish.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt @@ -7,13 +7,12 @@ import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.plugin.annotation.DataDirectory import com.velocitypowered.api.proxy.ProxyServer import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.proxy.config.Settings import org.sayandev.sayanvanish.proxy.config.language -import org.sayandev.sayanvanish.proxy.config.settings import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.command.SayanVanishProxyCommandVelocity -import org.sayandev.sayanvanish.velocity.health.HealthCheckMessageSubscriber -import org.sayandev.sayanvanish.velocity.health.ServerInfoPublisher import org.sayandev.stickynote.loader.velocity.StickyNoteVelocityLoader import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.registerListener @@ -21,9 +20,7 @@ import org.slf4j.Logger import java.io.File import java.nio.file.Path -lateinit var sayanvanish: SayanVanish - -class SayanVanish @Inject constructor( +class SayanVanishPlugin @Inject constructor( val suspendingPluginContainer: SuspendingPluginContainer ) { @@ -40,36 +37,32 @@ class SayanVanish @Inject constructor( fun onProxyInitialize(event: ProxyInitializeEvent) { StickyNoteVelocityLoader(this, PLUGIN_ID, server, logger, dataDirectory) suspendingPluginContainer.initialize(this) - sayanvanish = this + setInstance(this) Platform.get().rootDirectory = dataDirectory.toFile() - if (!Platform.setAndRegister(Platform("velocity", PLUGIN_ID, java.util.logging.Logger.getLogger("sayanvanish"), dataDirectory.toFile(), "", VelocityPlatformAdapter))) return - - settings - language + if (!Platform.setAndRegister(VelocityPlatform())) return - Platform.get().serverId = settings.general.serverId + SayanVanishAPI.initialize() - SayanVanishVelocityAPI + Settings.reload() + language - HealthCheckMessageSubscriber().register() - ServerInfoPublisher + Platform.get().serverId = Settings.get().general.serverId SayanVanishProxyCommandVelocity() - registerListener(VanishManager) // TODO: move this somewhere else. it's not something to be on main class and the main initialization method launch { - if (settings.general.purgeOnlineHistoryOnStartup) { + if (Settings.get().general.purgeOnlineHistoryOnStartup) { for (onlineServer in server.allServers) { VanishAPI.get().getDatabase().purgeUsers(onlineServer.serverInfo.name) } - VanishAPI.get().getDatabase().purgeUsers(settings.general.serverId) + VanishAPI.get().getDatabase().purgeUsers(Settings.get().general.serverId) } - if (settings.general.purgeUsersOnStartup) { + if (Settings.get().general.purgeUsersOnStartup) { for (user in VanishAPI.get().getDatabase().getUsers().await()) { user.isOnline = false user.save() @@ -84,6 +77,16 @@ class SayanVanish @Inject constructor( companion object { const val PLUGIN_ID = "sayanvanish" + + private lateinit var instance: SayanVanishPlugin + + fun getInstance(): SayanVanishPlugin { + return instance + } + + private fun setInstance(plugin: SayanVanishPlugin) { + instance = plugin + } } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt index 50638d72..29eacf34 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt @@ -3,15 +3,20 @@ package org.sayandev.sayanvanish.velocity import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.connection.DisconnectEvent import com.velocitypowered.api.event.player.ServerPostConnectEvent +import kotlinx.coroutines.awaitAll import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateVanishUser +import org.sayandev.sayanvanish.velocity.api.VelocityUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.velocityAdapt import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.server +import org.sayandev.stickynote.velocity.warn import kotlin.jvm.optionals.getOrNull object VanishManager { @@ -20,9 +25,11 @@ object VanishManager { private fun onPostLogin(event: ServerPostConnectEvent) { val player = event.player ?: return launch { - VanishAPI.get().getDatabase().saveUser(User.of(player.uniqueId, player.username, true, player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id)) + val user = player.getOrCreateVanishUser().velocityAdapt() + user.serverId = player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id + user.isOnline = true + user.saveAndSync().awaitAll() - val user = player.getVanishUser() ?: player.generateVanishUser() if (user.isVanished) { server.eventManager.fireAndForget(VelocityUserVanishEvent(user, user.currentOptions)) } else { @@ -35,6 +42,10 @@ object VanishManager { private fun onDisconnect(event: DisconnectEvent) { val player = event.player ?: return launch { + player.getVanishUser()?.velocityAdapt()?.let { user -> + user.isOnline = false + user.saveAndSync() + } VanishAPI.get().getDatabase().removeUser(player.uniqueId) } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatform.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatform.kt new file mode 100644 index 00000000..2193cbc7 --- /dev/null +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatform.kt @@ -0,0 +1,47 @@ +package org.sayandev.sayanvanish.velocity + +import kotlinx.serialization.modules.PolymorphicModuleBuilder +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass +import org.sayandev.sayanvanish.api.Platform +import org.sayandev.sayanvanish.api.feature.Feature +import org.sayandev.sayanvanish.velocity.feature.features.FeatureSyncEvents +import org.sayandev.sayanvanish.velocity.feature.features.FeatureUpdate +import org.sayandev.sayanvanish.velocity.feature.features.FeatureUpdatePing +import org.sayandev.sayanvanish.velocity.feature.features.hook.* +import org.sayandev.sayanvanish.velocity.feature.features.prevent.FeaturePreventChat +import org.sayandev.sayanvanish.velocity.feature.features.prevent.FeaturePreventTabComplete +import org.sayandev.stickynote.velocity.StickyNote + +class VelocityPlatform : Platform( + "bukkit", + "sayanvanish", + java.util.logging.Logger.getLogger("sayanvanish"), + StickyNote.dataDirectory.toFile(), + "", + VelocityPlatformAdapter, + SerializersModule { + fun PolymorphicModuleBuilder.registerProjectSubclasses() { + /* Hooks */ + subclass(FeatureHookAdvancedServerList::class) + subclass(FeatureHookEnhancedVelocity::class) + subclass(FeatureHookMiniPlaceholders::class) + subclass(FeatureHookTAB::class) + subclass(FeatureHookVelocitab::class) + subclass(FeatureHookLuckPerms::class) + + /* Prevention */ + subclass(FeaturePreventChat::class) + subclass(FeaturePreventTabComplete::class) + + /* General */ + subclass(FeatureSyncEvents::class) + subclass(FeatureUpdate::class) + subclass(FeatureUpdatePing::class) + } + polymorphic(Feature::class) { + registerProjectSubclasses() + } + } +) \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt index 4adc1f86..3aa6ed3e 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt @@ -1,12 +1,25 @@ package org.sayandev.sayanvanish.velocity import org.sayandev.sayanvanish.api.PlatformAdapter +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.velocity.api.VelocityUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser -object VelocityPlatformAdapter : PlatformAdapter { - override fun adapt(user: VanishUser): VelocityVanishUser { - return VelocityVanishUser(user.uniqueId, user.username) +object VelocityPlatformAdapter : PlatformAdapter { + override fun adapt(user: User): VelocityUser { + return VelocityUser(user.uniqueId, user.username, user.isOnline, user.serverId) + } + + override fun adapt(vanishUser: VanishUser): VelocityVanishUser { + return VelocityVanishUser(vanishUser.uniqueId, vanishUser.username).also { + it.currentOptions = vanishUser.currentOptions + it.isVanished = vanishUser.isVanished + it.vanishLevel = vanishUser.vanishLevel + } + } + + fun get(): VelocityPlatformAdapter { + return this } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt index 978aa023..d239898e 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt @@ -1,5 +1,103 @@ package org.sayandev.sayanvanish.velocity.api +import com.velocitypowered.api.proxy.Player +import kotlinx.coroutines.Deferred +import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.proxy.config.Settings +import java.util.* -object SayanVanishVelocityAPI : VanishAPI by VanishAPI.get() \ No newline at end of file +class SayanVanishVelocityAPI { + companion object { + @JvmSynthetic + suspend fun UUID.user(): Deferred { + return VanishAPI.get().getDatabase().getUser(this) + } + + @JvmSynthetic + fun UUID.cachedUser(): User? { + return VanishAPI.get().getCacheService().getUsers().getUser(this) + } + + @JvmSynthetic + suspend fun UUID.vanishUser(): Deferred { + return VanishAPI.get().getDatabase().getVanishUser(this) + } + + @JvmSynthetic + fun UUID.cachedVanishUser(): VanishUser? { + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) + } + + @JvmSynthetic + suspend fun Player.user(): Deferred { + return this.uniqueId.user() + } + + @JvmSynthetic + suspend fun Player.getOrCreateUser(): User { + return VanishAPI.get().getDatabase().getVanishUser(this.uniqueId).await() ?: VanishUser.Generic( + this.uniqueId, + this.username + ) + } + + @JvmSynthetic + suspend fun Player.getOrAddUser(): User { + val user = this.getOrCreateUser() + VanishAPI.get().getDatabase().saveUser(user).await() + return user + } + + @JvmSynthetic + fun Player.cachedUser(): User? { + return VanishAPI.get().getCacheService().getUsers().getUser(this.uniqueId) + } + + @JvmSynthetic + fun Player.getCachedOrCreateUser(): User { + return VanishAPI.get().getCacheService().getUsers().getUser(this.uniqueId) ?: User.Generic( + this.uniqueId, + this.username, + false, + Settings.get().general.serverId + ) + } + + @JvmSynthetic + suspend fun Player.vanishUser(): Deferred { + return this.uniqueId.vanishUser() + } + + @JvmSynthetic + suspend fun Player.getOrCreateVanishUser(): VanishUser { + return VanishAPI.get().getDatabase().getVanishUser(this.uniqueId).await() ?: VanishUser.Generic( + this.uniqueId, + this.username + ) + } + + @JvmSynthetic + suspend fun Player.getOrAddVanishUser(): VanishUser { + val vanishUser = this.getOrCreateVanishUser() + if (!VanishAPI.get().getCacheService().getVanishUsers().hasVanishUser(this.uniqueId)) { + VanishAPI.get().getDatabase().saveVanishUser(vanishUser).await() + } + return vanishUser + } + + @JvmSynthetic + fun Player.cachedVanishUser(): VanishUser? { + return this.uniqueId.cachedVanishUser() + } + + @JvmSynthetic + fun Player.getCachedOrCreateVanishUser(): VanishUser { + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this.uniqueId) ?: VanishUser.Generic( + this.uniqueId, + this.username, + ) + } + } +} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt index eb67fbc6..e086a6ae 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt @@ -1,18 +1,32 @@ package org.sayandev.sayanvanish.velocity.api -import com.velocitypowered.api.proxy.Player +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.User -import kotlin.jvm.optionals.getOrNull +import org.sayandev.sayanvanish.velocity.VelocityPlatformAdapter +import org.sayandev.stickynote.velocity.StickyNote +import org.sayandev.stickynote.velocity.utils.AdventureUtils.component +import java.util.* + +open class VelocityUser( + override val uniqueId: UUID, + override var username: String, + override var isOnline: Boolean, + override var serverId: String +) : User { + fun player() = StickyNote.getPlayer(uniqueId) + + override fun sendMessage(content: String, vararg placeholders: TagResolver) { + player()?.sendMessage(content.component(*placeholders)) + } + + override fun sendActionbar(content: String, vararg placeholders: TagResolver) { + player()?.sendActionBar(content.component(*placeholders)) + } -class VelocityUser { companion object { - fun Player.generateUser(): User { - return User.of( - this.uniqueId, - this.username, - true, - this.currentServer.getOrNull()?.serverInfo?.name - ) + @JvmSynthetic + fun User.bukkitAdapt(): VelocityUser { + return VelocityPlatformAdapter.adapt(this) } } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index 3d02189d..7260258f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -1,21 +1,16 @@ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player -import kotlinx.coroutines.future.await -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.VanishOptions +import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Features -import org.sayandev.sayanvanish.proxy.config.settings +import org.sayandev.sayanvanish.proxy.config.Settings import org.sayandev.sayanvanish.velocity.VelocityPlatformAdapter -import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent -import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent -import org.sayandev.sayanvanish.velocity.feature.features.hook.FeatureLuckPermsHook -import org.sayandev.sayanvanish.velocity.utils.PlayerUtils.sendComponent +import org.sayandev.sayanvanish.velocity.feature.features.hook.FeatureHookLuckPerms import org.sayandev.stickynote.velocity.StickyNote -import org.sayandev.stickynote.velocity.server import org.sayandev.stickynote.velocity.utils.AdventureUtils.component import java.util.* import kotlin.jvm.optionals.getOrNull @@ -26,14 +21,14 @@ open class VelocityVanishUser( ) : VanishUser { override var serverId: String - get() = player()?.currentServer?.getOrNull()?.serverInfo?.name ?: settings.general.serverId + get() = player()?.currentServer?.getOrNull()?.serverInfo?.name ?: Settings.get().general.serverId set(_) {} override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false override var isOnline: Boolean = player() != null override var vanishLevel: Int = 0 get() = player()?.let { player -> - val luckPermsHook = Features.getFeature() + val luckPermsHook = Features.getFeature() if (luckPermsHook.isActive()) { luckPermsHook.getPermissions(uniqueId) .filter { it.startsWith("sayanvanish.level.") } @@ -46,38 +41,24 @@ open class VelocityVanishUser( } } ?: field - fun stateText(isVanished: Boolean = this.isVanished) = if (isVanished) "ON" else "OFF" + override fun stateText(isVanished: Boolean) = if (isVanished) "ON" else "OFF" fun player(): Player? = StickyNote.getPlayer(uniqueId) - override suspend fun disappear(options: VanishOptions) { - val event = server.eventManager.fire(VelocityUserVanishEvent(this, options)).await() - val newOptions = event.options - currentOptions = newOptions - VanishAPI.get().getDatabase().saveToQueue(uniqueId, true) - super.disappear(newOptions) + override fun disappear(options: VanishOptions) { + // TODO: create event. and make sure to apply the options from the event + super.disappear(options) } - override suspend fun appear(options: VanishOptions) { - val event = server.eventManager.fire(VelocityUserUnVanishEvent(this, options)).await() - val newOptions = event.options - currentOptions = newOptions - VanishAPI.get().getDatabase().saveToQueue(uniqueId, false) - super.appear(newOptions) + override fun appear(options: VanishOptions) { + // TODO: create event. and make sure to apply the options from the event + super.appear(options) } override fun hasPermission(permission: String): Boolean { return player()?.hasPermission(permission) == true } - override fun sendMessage(content: String, vararg placeholder: TagResolver) { - player()?.sendComponent(content, *placeholder) - } - - override fun sendActionbar(content: String, vararg placeholder: TagResolver) { - player()?.sendActionBar(content.component(*placeholder)) - } - companion object { @JvmStatic fun fromUser(vanishUser: VanishUser): VelocityVanishUser { @@ -101,7 +82,7 @@ open class VelocityVanishUser( } @JvmStatic - fun VanishUser.adapt(): VelocityVanishUser { + fun VanishUser.velocityAdapt(): VelocityVanishUser { return VelocityPlatformAdapter.adapt(this) } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt index aa34b1fa..85ec2d90 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.velocity.command import com.velocitypowered.api.proxy.Player -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.incendo.cloud.component.CommandComponent import org.incendo.cloud.context.CommandContext import org.incendo.cloud.description.Description @@ -12,8 +12,8 @@ import org.incendo.cloud.velocity.parser.PlayerParser import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features +import org.sayandev.sayanvanish.proxy.config.Settings import org.sayandev.sayanvanish.proxy.config.language -import org.sayandev.sayanvanish.proxy.config.settings import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.feature.features.FeatureUpdate @@ -28,7 +28,7 @@ import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit import kotlin.jvm.optionals.getOrNull -class SayanVanishProxyCommandVelocity : VelocityCommand(settings.command.name, *settings.command.aliases.toTypedArray()) { +class SayanVanishProxyCommandVelocity : VelocityCommand(Settings.get().command.name, *Settings.get().command.aliases.toTypedArray()) { override fun rootBuilder(builder: MutableCommandBuilder) { builder.permission("${plugin.container.description.name.get().lowercase()}.commands.use") diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt index a46781a7..1f803db9 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt @@ -1,17 +1,17 @@ package org.sayandev.sayanvanish.velocity.feature +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import kotlinx.serialization.Serializable import org.sayandev.stickynote.velocity.hasPlugin @Serializable -abstract class HookFeature( - id: String, - @Transient val plugin: String, - enabled: Boolean = true, - category: FeatureCategories = FeatureCategories.HOOK, -) : ListenedFeature(id, enabled, category) { +abstract class HookFeature : ListenedFeature() { + + abstract val plugin: String + @Transient override var enabled: Boolean = true + override val category: FeatureCategories = FeatureCategories.HOOK fun hasPlugin(): Boolean { return hasPlugin(plugin) diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt index fb8e52c0..a1fd7518 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt @@ -1,18 +1,11 @@ package org.sayandev.sayanvanish.velocity.feature -import org.sayandev.sayanvanish.api.feature.Feature -import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import kotlinx.serialization.Serializable +import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.stickynote.velocity.registerListener -import org.spongepowered.configurate.serialize.TypeSerializerCollection @Serializable -abstract class ListenedFeature( - id: String, - enabled: Boolean = true, - category: FeatureCategories = FeatureCategories.DEFAULT, - additionalSerializers: TypeSerializerCollection = TypeSerializerCollection.defaults() -) : Feature(id, enabled, category, additionalSerializers) { +abstract class ListenedFeature : Feature() { override fun enable() { if (!condition) return diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt index 7434afce..60b5709b 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt @@ -1,35 +1,28 @@ package org.sayandev.sayanvanish.velocity.feature.features -import kotlinx.coroutines.delay -import kotlinx.coroutines.isActive -import org.sayandev.sayanvanish.api.VanishAPI +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.velocity.VelocityPlatformAdapter -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.adapt -import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent -import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.sayanvanish.velocity.feature.ListenedFeature -import kotlinx.serialization.Serializable -import org.sayandev.stickynote.velocity.StickyNote -import org.sayandev.stickynote.velocity.launch -import org.sayandev.stickynote.velocity.plugin -import org.sayandev.stickynote.velocity.server -import com.charleskorn.kaml.YamlComment -import java.util.UUID -import java.util.concurrent.TimeUnit +import java.util.* +// TODO: new event implementation using messaging and custom api @RegisteredFeature @Serializable +@SerialName("sync_events") class FeatureSyncEvents( @YamlComment("The period of time to check for vanished players. low values may cause performance issues.") val checkPeriodMillis: Long = 50 -) : ListenedFeature("sync_events") { +) : ListenedFeature() { + + @Transient override val id = "sync_events" @Transient val previousUsers = mutableMapOf() override fun enable() { - launch { + /*launch { // TODO: rewrite this so it uses messaging to call events while (isActive) { for (vanishUser in VanishAPI.get().getDatabase().getVanishUsers().await()) { @@ -50,7 +43,7 @@ class FeatureSyncEvents( } delay(checkPeriodMillis) } - } + }*/ super.enable() } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt index 82368b09..b87002b2 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt @@ -8,10 +8,8 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.utils.DownloadUtils import org.sayandev.sayanvanish.api.utils.HangarUtils import org.sayandev.sayanvanish.api.utils.VersionInfo -import org.sayandev.sayanvanish.proxy.config.settings import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.feature.ListenedFeature -import org.sayandev.sayanvanish.velocity.sayanvanish import org.sayandev.sayanvanish.velocity.utils.PlayerUtils.sendComponent import org.sayandev.sayanvanish.velocity.utils.PlayerUtils.sendRawComponent import org.sayandev.stickynote.velocity.StickyNote @@ -21,11 +19,16 @@ import org.sayandev.stickynote.velocity.plugin import org.sayandev.stickynote.velocity.utils.AdventureUtils.component import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient +import org.sayandev.sayanvanish.proxy.config.Settings +import org.sayandev.sayanvanish.velocity.SayanVanishPlugin import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit @RegisteredFeature @Serializable +@SerialName("update") class FeatureUpdate( @YamlComment("The period of time to check for updates.") @Configurable val checkEveryXMinutes: Int = 60 * 24, @@ -50,10 +53,12 @@ class FeatureUpdate( @YamlComment("The content of the update request message") val updateRequestContent: List = listOf( "A new version of SayanVanish Velocity is available!", - "Click to update'>You can install version by clicking on this message", + "Click to update'>You can install version by clicking on this message", "Make sure to read the changelog before doing any update to prevent unexpected behaviors", ) -) : ListenedFeature("update") { +) : ListenedFeature() { + + @Transient override val id = "update" @Transient var latestRelease: VersionInfo? = null @Transient var latestSnapshot: VersionInfo? = null @@ -144,7 +149,7 @@ class FeatureUpdate( val future = CompletableFuture() if (!isNewerVersionAvailable(notifyForSnapshotBuilds)) future.complete(false) - val pluginFile = sayanvanish.pluginFile() ?: let { + val pluginFile = SayanVanishPlugin.getInstance().pluginFile() ?: let { future.complete(false) return future } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt index bb168748..1a94c8fa 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt @@ -3,21 +3,26 @@ package org.sayandev.sayanvanish.velocity.feature.features import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyPingEvent import com.velocitypowered.api.proxy.server.ServerPing +import kotlinx.serialization.SerialName import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.velocity.feature.ListenedFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import kotlin.jvm.optionals.getOrNull @RegisteredFeature @Serializable -class FeatureUpdatePing : ListenedFeature("update_ping") { +@SerialName("update_ping") +class FeatureUpdatePing : ListenedFeature() { + + @Transient override val id = "update_ping" @Subscribe fun onProxyPing(event: ProxyPingEvent) { if (!isActive()) return val pingPlayers = event.ping.players.getOrNull() ?: return - val vanishedOnlineUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { vanishUser -> vanishUser.isVanished && vanishUser.isOnline } + val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().values.filter { vanishUser -> vanishUser.isVanished && vanishUser.isOnline } val nonVanishedPlayersCount = pingPlayers.online - vanishedOnlineUsers.size val nonVanishedPlayersSample = pingPlayers.sample.filter { !vanishedOnlineUsers.map { it.username }.contains(it.name) } event.ping = event.ping diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt index 9915d0ee..b86be435 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -5,16 +5,24 @@ import ch.andre601.advancedserverlist.api.PlaceholderProvider import ch.andre601.advancedserverlist.api.exceptions.InvalidPlaceholderProviderException import ch.andre601.advancedserverlist.api.objects.GenericPlayer import ch.andre601.advancedserverlist.api.objects.GenericServer +import kotlinx.serialization.SerialName import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.velocity.feature.HookFeature import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.sayandev.stickynote.velocity.registerListener @RegisteredFeature @Serializable -class FeatureHookAdvancedServerList : HookFeature("hook_advanced_server_list", "advancedserverlist") { +@SerialName("hook_advanced_server_list") +class FeatureHookAdvancedServerList : HookFeature() { + + @Transient override val id = "hook_advanced_server_list" + override var enabled: Boolean = true + override val plugin: String = "advancedserverlist" + override fun enable() { if (hasPlugin()) { AdvancedServerListImpl() @@ -37,33 +45,33 @@ private class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { server: GenericServer ): String? { if (placeholder.equals("vanished", true)) { - return if (VanishAPI.get().getDatabase().getVanishUserCache(player.uuid)?.isVanished == true) "true" else "false" + return if (VanishAPI.get().getCacheService().getVanishUsers()[player.uuid]?.isVanished == true) "true" else "false" } if (placeholder.equals("level", true)) { - return VanishAPI.get().getDatabase().getVanishUserCache(player.uuid)?.vanishLevel?.toString() ?: "0" + return VanishAPI.get().getCacheService().getVanishUsers()[player.uuid]?.vanishLevel?.toString() ?: "0" } if (placeholder.equals("count", true)) { - return VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { user -> user.isOnline && user.isVanished }.size.toString() + return VanishAPI.get().getCacheService().getVanishUsers().values.filter { user -> user.isOnline && user.isVanished }.size.toString() } if (placeholder.equals("vanish_prefix", true)) { - return if (VanishAPI.get().getDatabase().getVanishUserCache(player.uuid)?.isVanished == true) language.vanish.placeholderPrefix else "" + return if (VanishAPI.get().getCacheService().getVanishUsers()[player.uuid]?.isVanished == true) language.vanish.placeholderPrefix else "" } if (placeholder.equals("vanish_suffix", true)) { - return if (VanishAPI.get().getDatabase().getVanishUserCache(player.uuid)?.isVanished == true) language.vanish.placeholderSuffix else "" + return if (VanishAPI.get().getCacheService().getVanishUsers()[player.uuid]?.isVanished == true) language.vanish.placeholderSuffix else "" } if (placeholder.startsWith("online_")) { val type = placeholder.substring(7) - val vanishedOnlineUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { user -> user.isVanished && user.isOnline } + val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().values.filter { user -> user.isVanished && user.isOnline } return if (type.equals("total", true)) { - VanishAPI.get().getDatabase().getCachedUserCount().totalCount().minus(vanishedOnlineUsers.size).toString() + VanishAPI.get().getCacheService().getUsers().size.minus(vanishedOnlineUsers.size).toString() } else { - VanishAPI.get().getDatabase().getCachedUserCount()[type.lowercase()].toString() + VanishAPI.get().getCacheService().getUsers().values.filter { it.serverId.equals(type, ignoreCase = true) }.toString() } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt index 34346b75..2fcdb937 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt @@ -1,12 +1,14 @@ package org.sayandev.sayanvanish.velocity.feature.features.hook import ir.syrent.enhancedvelocity.api.VanishHook +import kotlinx.serialization.SerialName import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.sayandev.sayanvanish.api.VanishUser.Companion.vanishUserFromCache import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.launch @@ -14,7 +16,12 @@ import java.util.UUID @RegisteredFeature @Serializable -class FeatureHookEnhancedVelocity : HookFeature("hook_enhancedvelocity", "enhancedvelocity") { +@SerialName("hook_enhanced_velocity") +class FeatureHookEnhancedVelocity : HookFeature() { + + @Transient override val id = "hook_enhancedvelocity" + override var enabled: Boolean = true + override val plugin: String = "enhancedvelocity" override fun enable() { if (hasPlugin()) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureLuckPermsHook.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookLuckPerms.kt similarity index 88% rename from sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureLuckPermsHook.kt rename to sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookLuckPerms.kt index 7d37060e..3300af37 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureLuckPermsHook.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookLuckPerms.kt @@ -11,22 +11,29 @@ import net.luckperms.api.node.types.PermissionNode import net.luckperms.api.query.QueryOptions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.warn import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient +import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getCachedOrCreateVanishUser import java.util.* @RegisteredFeature @Serializable -class FeatureLuckPermsHook( +@SerialName("hook_luckperms") +class FeatureHookLuckPerms( @YamlComment("Register custom context for vanished players, this will allow you to check if a player is vanished using LuckPerms.") @Configurable val registerCustomContext: Boolean = true, @YamlComment("Check permission using LuckPerms, if false, will fallback to velocity permission check.") @Configurable val checkPermissionViaLuckPerms: Boolean = true, -): HookFeature("hook_luckperms", "luckperms") { +): HookFeature() { + + @Transient override val id = "hook_luckperms" + override var enabled: Boolean = true + override val plugin: String = "luckperms" override fun enable() { if (hasPlugin()) { @@ -73,7 +80,7 @@ class FeatureLuckPermsHook( private class VanishedContext: ContextCalculator { override fun calculate(target: Player, contextConsumer: ContextConsumer) { - contextConsumer.accept("vanished", target.getOrCreateUser().isVanished.toString()) + contextConsumer.accept("vanished", target.getCachedOrCreateVanishUser().isVanished.toString()) } override fun estimatePotentialContexts(): ContextSet { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt index 7fd434ce..9c579b72 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -2,20 +2,27 @@ package org.sayandev.sayanvanish.velocity.feature.features.hook import com.velocitypowered.api.proxy.Player import io.github.miniplaceholders.api.Expansion -import io.github.miniplaceholders.api.utils.TagsUtils +import io.github.miniplaceholders.api.utils.Tags +import ir.syrent.enhancedvelocity.utils.component +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import net.kyori.adventure.text.minimessage.tag.Tag import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.proxy.config.language -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI +import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.onlinePlayers -import org.sayandev.stickynote.velocity.plugin -import kotlinx.serialization.Serializable -import kotlin.jvm.optionals.getOrNull @RegisteredFeature @Serializable -class FeatureHookMiniPlaceholders: HookFeature("hook_miniplaceholders", "miniplaceholders") { +@SerialName("hook_mini_placeholders") +class FeatureHookMiniPlaceholders: HookFeature() { + + @Transient override val id = "hook_miniplaceholders" + override var enabled: Boolean = true + override val plugin: String = "miniplaceholders" override fun enable() { if (hasPlugin()) { @@ -40,51 +47,48 @@ private class MiniPlaceholdersHookImpl(val feature: FeatureHookMiniPlaceholders) unregister() builder.audiencePlaceholder("vanished") { audience, queue, context -> - val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.EMPTY_TAG - return@audiencePlaceholder TagsUtils.staticTag(if (VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.isVanished == true) "true" else "false") + val player = audience as? Player ?: return@audiencePlaceholder Tags.EMPTY_TAG + return@audiencePlaceholder Tag.selfClosingInserting((if (player.cachedVanishUser()?.isVanished == true) "true" else "false").component()) } builder.audiencePlaceholder("level") { audience, queue, context -> - val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("0") -// return@audiencePlaceholder TagsUtils.staticTag(player.user()?.vanishLevel?.toString() ?: "0") - return@audiencePlaceholder TagsUtils.staticTag(VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.vanishLevel?.toString() ?: "0") + val player = audience as? Player ?: return@audiencePlaceholder Tag.selfClosingInserting("0".component()) + return@audiencePlaceholder Tag.selfClosingInserting((player.cachedVanishUser()?.vanishLevel?.toString() ?: "0").component()) } builder.globalPlaceholder("count") { queue, context -> - TagsUtils.staticTag(VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { user -> user.isOnline && user.isVanished }.size.toString()) + Tag.selfClosingInserting(VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.isVanished && it.isOnline }.size.toString().component()) } builder.audiencePlaceholder("vanish_prefix") { audience, queue, context -> - val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("") - TagsUtils.staticTag(if (VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.isVanished == true) language.vanish.placeholderPrefix else "") + Tag.selfClosingInserting((if ((audience as? Player)?.cachedVanishUser()?.isVanished == true) language.vanish.placeholderPrefix else "").component()) } builder.audiencePlaceholder("vanish_suffix") { audience, queue, context -> - val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("") - TagsUtils.staticTag(if (VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.isVanished == true) language.vanish.placeholderSuffix else "") + Tag.selfClosingInserting((if ((audience as? Player)?.cachedVanishUser()?.isVanished == true) language.vanish.placeholderSuffix else "").component()) } - for (server in plugin.server.allServers) { - builder.globalPlaceholder("online_${server.serverInfo.name.lowercase()}") { queue, context -> - val vanishedOnlineUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { vanishUser -> vanishUser.isVanished && vanishUser.isOnline } - TagsUtils.staticTag(VanishAPI.get().getDatabase().getCachedUserCount().getValue(server.serverInfo.name.lowercase()).toString()) + builder.globalPlaceholder("online") { queue, context -> + if (!queue.hasNext()) { + return@globalPlaceholder Tags.EMPTY_TAG } - } - builder.audiencePlaceholder("online_here") { audience, queue, context -> - val player = audience as? Player ?: return@audiencePlaceholder TagsUtils.staticTag("0") - val currentServerVanishedOnlineUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { vanishUser -> - vanishUser.isVanished && vanishUser.isOnline && vanishUser.serverId == player.currentServer.getOrNull()?.serverInfo?.name + val vanishedOnlineUsers = VanishAPI.get().getCacheService().getVanishUsers().values.filter { user -> user.isVanished && user.isOnline } + val serverName = queue.pop().value() + + val result = when (serverName) { + "here" -> { + onlinePlayers.filter { onlinePlayer -> !vanishedOnlineUsers.map { vanishedOnlineUser -> vanishedOnlineUser.username }.contains(onlinePlayer.username) }.size.toString() + } + "total" -> { + VanishAPI.get().getCacheService().getUsers().values.filter { !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + } + else -> { + VanishAPI.get().getCacheService().getUsers().values.filter { it.serverId == serverName && !vanishedOnlineUsers.map { vanishUser -> vanishUser.username }.contains(it.username) }.size.toString() + } } - val currentServerPlayerCount = player.currentServer.getOrNull()?.server?.playersConnected?.size ?: currentServerVanishedOnlineUsers.size - TagsUtils.staticTag((currentServerPlayerCount - currentServerVanishedOnlineUsers.size).toString()) - } - builder.globalPlaceholder("online_total") { queue, context -> - val onlineVanishedUsers = VanishAPI.get().getDatabase().getCachedVanishUsers().values.filter { vanishUser -> - vanishUser.isVanished && vanishUser.isOnline - } - TagsUtils.staticTag((plugin.server.playerCount - onlineVanishedUsers.size).toString()) + Tag.selfClosingInserting(result.component()) } builder.build().register() diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt index 243bd9df..200c6e76 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt @@ -10,14 +10,19 @@ import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.plugin import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient @RegisteredFeature @Serializable -class FeatureHookTAB( - @YamlComment("Whether to use cache data for vanish status. This will improve performance but may cause a small delay in tablist removal after join.") - val useCacheData: Boolean = false -): HookFeature("hook_tab", "TAB") { +@SerialName("hook_tab") +class FeatureHookTAB : HookFeature() { + + @Transient override val id = "hook_tab" + override var enabled: Boolean = true + override val plugin: String = "TAB" + override fun enable() { if (hasPlugin()) { VanishIntegrationTAB(this).register() @@ -35,13 +40,13 @@ class FeatureHookTAB( private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegration(plugin.container.description.name.get()) { override fun isVanished(player: TabPlayer): Boolean { - return VanishAPI.get().getDatabase().getCachedVanishUser(player.uniqueId)?.isVanished == true + return VanishAPI.get().getCacheService().getVanishUsers()[player.uniqueId]?.isVanished == true } override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { if (viewer.uniqueId == target.uniqueId) return true - val viewerUser = VanishAPI.get().getDatabase().getVanishUserCache(viewer.uniqueId) ?: VelocityVanishUser(viewer.uniqueId, viewer.name) - val targetUser = VanishAPI.get().getDatabase().getVanishUserCache(target.uniqueId) ?: return true + val viewerUser = VanishAPI.get().getCacheService().getVanishUsers()[viewer.uniqueId] ?: VelocityVanishUser(viewer.uniqueId, viewer.name) + val targetUser = VanishAPI.get().getCacheService().getVanishUsers()[target.uniqueId] ?: return true return VanishAPI.get().canSee(viewerUser, targetUser) } } \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt index d43a9995..74aa6ffb 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt @@ -1,28 +1,31 @@ package org.sayandev.sayanvanish.velocity.feature.features.hook +import com.charleskorn.kaml.YamlComment import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.connection.PostLoginEvent import com.velocitypowered.api.event.player.ServerConnectedEvent import com.velocitypowered.api.event.player.ServerPostConnectEvent import com.velocitypowered.api.proxy.Player +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import net.william278.velocitab.api.VelocitabAPI import net.william278.velocitab.vanish.VanishIntegration import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser -import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser +import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.velocityAdapt import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.sayanvanish.velocity.feature.HookFeature import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.registerListener -import kotlinx.serialization.Serializable -import com.charleskorn.kaml.YamlComment import java.util.concurrent.TimeUnit @RegisteredFeature @Serializable +@SerialName("hook_velocitab") class FeatureHookVelocitab( @YamlComment("The delay in milliseconds to check on post server connect event. low values may cause issues.") val checkOnPostServerConnectDelay: Long = 150, @@ -30,7 +33,12 @@ class FeatureHookVelocitab( val checkOnServerConnectedDelay: Long = 150, @YamlComment("The delay in milliseconds to check on post login event. low values may cause issues.") val checkOnPostLoginDelay: Long = 150, -) : HookFeature("hook_velocitab", "velocitab") { +) : HookFeature() { + + @Transient override val id = "hook_velocitab" + override var enabled: Boolean = true + override val plugin: String = "velocitab" + override fun enable() { if (hasPlugin()) { VelocitabAPI.getInstance().vanishIntegration = VelocitabImpl(this) @@ -48,15 +56,15 @@ private class VelocitabImpl(val feature: FeatureHookVelocitab) : VanishIntegrati override fun canSee(name: String, otherName: String): Boolean { val player = StickyNote.getPlayer(name) ?: return true val otherPlayer = StickyNote.getPlayer(otherName) ?: return true - val user = VanishAPI.get().getDatabase().getVanishUserCache(player.uniqueId) ?: player.generateVanishUser() - val otherUser = VanishAPI.get().getDatabase().getVanishUserCache(otherPlayer.uniqueId) ?: otherPlayer.generateVanishUser() + val user = player.getCachedOrCreateVanishUser() + val otherUser = otherPlayer.getCachedOrCreateVanishUser() return if (user.isVanished && otherUser.isVanished && user.vanishLevel >= otherUser.vanishLevel) true else if (otherUser.isVanished) false else true } override fun isVanished(name: String): Boolean { - return StickyNote.getPlayer(name)?.let { VanishAPI.get().getDatabase().getCachedVanishUsers().values.find { it.username == name } }?.isVanished == true + return StickyNote.getPlayer(name)?.let { VanishAPI.get().getCacheService().getVanishUsers().values.find { it.username == name } }?.isVanished == true } @Subscribe @@ -75,12 +83,12 @@ private class VelocitabImpl(val feature: FeatureHookVelocitab) : VanishIntegrati private fun onServerPostConnect(event: ServerPostConnectEvent) { val player = event.player ?: return StickyNote.run({ - for (vanishedUser in SayanVanishVelocityAPI.getInstance().getVanishedUsers()) { + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.map { it.velocityAdapt() }) { val vanishedPlayer = vanishedUser.player() ?: continue vanish(vanishedPlayer) } - val user = player.user() ?: return@run + val user = player.cachedVanishUser() ?: return@run if (user.isVanished) { vanish(player) } else { @@ -93,12 +101,12 @@ private class VelocitabImpl(val feature: FeatureHookVelocitab) : VanishIntegrati private fun onServerConnected(event: ServerConnectedEvent) { val player = event.player ?: return StickyNote.run({ - for (vanishedUser in SayanVanishVelocityAPI.getInstance().getVanishedUsers()) { + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.map { it.velocityAdapt() }) { val vanishedPlayer = vanishedUser.player() ?: continue vanish(vanishedPlayer) } - val user = player.user() ?: return@run + val user = player.cachedVanishUser() ?: return@run if (user.isVanished) { vanish(player) } else { @@ -111,12 +119,12 @@ private class VelocitabImpl(val feature: FeatureHookVelocitab) : VanishIntegrati private fun onPostLogin(event: PostLoginEvent) { val player = event.player ?: return StickyNote.run({ - for (vanishedUser in SayanVanishVelocityAPI.getInstance().getVanishedUsers()) { + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.map { it.velocityAdapt() }) { val vanishedPlayer = vanishedUser.player() ?: continue vanish(vanishedPlayer) } - val user = player.user() ?: return@run + val user = player.cachedVanishUser() ?: return@run if (user.isVanished) { vanish(player) } else { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventChat.kt index 7add3f5c..70752854 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventChat.kt @@ -1,29 +1,37 @@ package org.sayandev.sayanvanish.velocity.feature.features.prevent +import com.charleskorn.kaml.YamlComment import com.velocitypowered.api.event.PostOrder import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.player.PlayerChatEvent -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.Placeholder +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.proxy.config.language +import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.velocity.feature.ListenedFeature -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment @RegisteredFeature -@ConfigSerializable +@Serializable +@SerialName("prevent_chat") class FeaturePreventChat( - @Comment("The character that vanished players can use to bypass the chat prevention.") + @YamlComment("The character that vanished players can use to bypass the chat prevention.") @Configurable val bypassChar: String = "!" -) : ListenedFeature("prevent_chat", category = FeatureCategories.PREVENTION, enabled = false) { +) : ListenedFeature() { + + @Transient override val id = "prevent_chat" + override val category = FeatureCategories.PREVENTION + override var enabled: Boolean = false @Subscribe(order = PostOrder.LAST) fun onPlayerChat(event: PlayerChatEvent) { val player = event.player - val user = player.getOrCreateUser() + val user = player.getCachedOrCreateVanishUser() if (!isActive(user)) return if (!user.isVanished) return @@ -31,7 +39,7 @@ class FeaturePreventChat( if (message.startsWith(bypassChar)) { event.result = PlayerChatEvent.ChatResult.message(message.removePrefix(bypassChar)) } else { - user.sendComponent(language.vanish.cantChatWhileVanished, Pair("char", bypassChar)) + user.sendMessage(language.vanish.cantChatWhileVanished, Placeholder.unparsed("char", bypassChar)) event.result = PlayerChatEvent.ChatResult.denied() } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt index 5971577d..12bf06d3 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt @@ -13,20 +13,29 @@ import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.ge import org.sayandev.sayanvanish.velocity.feature.ListenedFeature import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Transient +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getCachedOrCreateVanishUser @RegisteredFeature @Serializable +@SerialName("prevent_tab_complete") class FeaturePreventTabComplete( @YamlComment("Whether to keep vanished player in tab completion if the player that is getting the suggestion has a higher level of vanish.") @Configurable val checkVanishLevel: Boolean = false -): ListenedFeature("prevent_tab_complete", category = FeatureCategories.PREVENTION) { +): ListenedFeature() { + + @Transient override val id = "prevent_tab_complete" + override val category = FeatureCategories.PREVENTION + override var enabled: Boolean = true @Subscribe(order = PostOrder.LAST) fun onTabComplete(event: TabCompleteEvent) { val player = event.player ?: return - val user = player.getOrCreateUser() + val user = player.getCachedOrCreateVanishUser() if (!isActive(user)) return - val vanishedUsers = SayanVanishVelocityAPI.getInstance().getVanishedUsers() + val vanishedUsers = VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.isVanished } if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { event.suggestions .removeIf { suggestion -> vanishedUsers.map(VanishUser::username).contains(suggestion) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt index 4cf8e8cd..72c80ef9 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt @@ -1,12 +1,10 @@ package org.sayandev.sayanvanish.velocity.utils import com.velocitypowered.api.command.CommandSource -import org.sayandev.sayanventure.adventure.text.Component -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver -import org.sayandev.sayanvanish.proxy.config.LanguageConfig +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.sayandev.sayanvanish.proxy.config.Settings import org.sayandev.sayanvanish.proxy.config.language -import org.sayandev.sayanvanish.proxy.config.settings -import org.sayandev.stickynote.velocity.utils.AdventureUtils import org.sayandev.stickynote.velocity.utils.AdventureUtils.component object PlayerUtils { @@ -15,7 +13,7 @@ object PlayerUtils { val prefix = language.general.prefix.component() val contentComponent = content.component(*placeholders) - this.sendMessage(if (settings.general.includePrefixInMessages) { + this.sendMessage(if (Settings.get().general.includePrefixInMessages) { prefix.append(contentComponent) } else { contentComponent @@ -26,7 +24,7 @@ object PlayerUtils { if (content == Component.empty()) return val prefix = language.general.prefix.component() - this.sendMessage(if (settings.general.includePrefixInMessages) { + this.sendMessage(if (Settings.get().general.includePrefixInMessages) { prefix.append(content) } else { content diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/resources/velocity-plugin.json b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/resources/velocity-plugin.json index ad745ff4..13ba638d 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/resources/velocity-plugin.json +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/resources/velocity-plugin.json @@ -25,5 +25,5 @@ "optional": true } ], - "main": "org.sayandev.sayanvanish.velocity.SayanVanish" + "main": "org.sayandev.sayanvanish.velocity.SayanVanishPlugin" } \ No newline at end of file diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt index cd13bc2d..d795f449 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt @@ -9,13 +9,11 @@ import java.util.UUID @Serializable class Settings( - @YamlComment(""" - Do NOT copy and paste the SayanVanish directory across multiple servers. - The server-id is generated during the plugin's first startup. - Duplicating this file could lead to synchronization issues. - - General settings for the plugin - """) + @YamlComment("Do NOT copy and paste the SayanVanish directory across multiple servers.", + "The server-id is generated during the plugin's first startup.", + "Duplicating this file could lead to synchronization issues.", + "", + "General settings for the plugin") val general: General = General(), @YamlComment("Command settings for the plugin") val command: Command = Command() @@ -25,11 +23,9 @@ class Settings( data class General( @YamlComment("Unique server identifier. doesn't do anything special yet.") val serverId: String = "${Platform.get().id}-${UUID.randomUUID()}", - @YamlComment(""" - Language name - Note: By default, it only includes the `en_US` language. - However, you can create and add your own custom languages. - """) + @YamlComment("Language name", + "Note: By default, it only includes the `en_US` language.", + "However, you can create and add your own custom languages.") val language: String = LanguageConfig.Language.EN_US.id, @YamlComment("Weather to purge online history of users on startup.") val purgeOnlineHistoryOnStartup: Boolean = true, diff --git a/settings.gradle.kts b/settings.gradle.kts index 6d46cc1c..0ce14a44 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,7 +9,7 @@ pluginManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" - id("org.sayandev.stickynote.settings") version "1.10.5.20" + id("org.sayandev.stickynote.settings") version "1.10.5.20-pubsub2" } rootProject.name = "SayanVanish" From 03841dac3d0aa22818db3db627da95f9e4f6e997 Mon Sep 17 00:00:00 2001 From: Syrent Date: Wed, 7 Jan 2026 22:10:41 +0330 Subject: [PATCH 35/67] [ci skip] chore: trying to make shadowjar work again --- build.gradle.kts | 37 +++++-------- gradle/wrapper/gradle-wrapper.properties | 2 +- sayanvanish-bukkit/build.gradle.kts | 52 ++++++++++++------- .../sayandev/sayanvanish/bukkit/Hello.java | 5 ++ .../sayandev/sayanvanish/bukkit/HelloKT.kt | 5 ++ .../sayanvanish/bukkit/SayanVanishLoader.kt | 12 +++++ .../sayanvanish/bukkit/SayanVanishPlugin.kt | 3 +- .../build.gradle.kts | 2 +- settings.gradle.kts | 4 +- 9 files changed, 74 insertions(+), 48 deletions(-) create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/Hello.java create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/HelloKT.kt create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishLoader.kt diff --git a/build.gradle.kts b/build.gradle.kts index 1c2d0a91..75d1e67f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,14 +1,11 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import com.google.gson.JsonParser import io.papermc.hangarpublishplugin.model.Platforms -import org.gradle.kotlin.dsl.exclude import java.io.ByteArrayOutputStream import java.net.HttpURLConnection import java.net.URL plugins { java - kotlin("plugin.serialization") version "2.2.0" `maven-publish` id("io.papermc.hangar-publish-plugin") version "0.1.2" id("com.modrinth.minotaur") version "2.8.7" @@ -32,10 +29,12 @@ fun lastCommitMessages(): String { val connection = url.openConnection() as HttpURLConnection connection.requestMethod = "GET" connection.setRequestProperty("Accept", "application/vnd.github.v3+json") - val response = runCatching { connection.inputStream.bufferedReader().use { it.readText() } }.getOrNull() ?: let { + // TODO: fix this + /*val response = runCatching { connection.inputStream.bufferedReader().use { it.readText() } }.getOrNull() ?: let { println("Failed to fetch last commit messages from GitHub Actions API: ${connection.responseCode} ${connection.responseMessage}") return "No recent commits found." } + val sha = JsonParser.parseString(response).asJsonObject.getAsJsonArray("workflow_runs").let { if (it.size() == 0) { null @@ -48,7 +47,8 @@ fun lastCommitMessages(): String { executeGitCommand("log", "--pretty=format:%C(auto)%h %s %C(blue)<%an>", "$sha..HEAD") } else { "No changes" - } + }*/ + return "Changelog unavailable due to API changes." } fun lastReleaseCommitMessages(): String { @@ -57,11 +57,14 @@ fun lastReleaseCommitMessages(): String { connection.requestMethod = "GET" connection.setRequestProperty("Accept", "application/vnd.github.v3+json") val response = connection.inputStream.bufferedReader().use { it.readText() } - val previousReleaseVersion = JsonParser.parseString(response).asJsonArray.get(1).asJsonObject.get("tag_name").asString + // TODO: fix this + /*val previousReleaseVersion = JsonParser.parseString(response).asJsonArray.get(1).asJsonObject.get("tag_name").asString val currentProjectVersion = versionString - return executeGitCommand("log", "--pretty=format:%s%n", "$previousReleaseVersion..$currentProjectVersion") + return executeGitCommand("log", "--pretty=format:%s%n", "$previousReleaseVersion..$currentProjectVersion")*/ + + return "Changelog unavailable due to API changes." } val versionString: String = findProperty("version")!! as String @@ -86,13 +89,13 @@ allprojects { plugins.apply("java") plugins.apply("maven-publish") - plugins.apply("kotlin") + plugins.apply("com.gradleup.shadow") + plugins.apply("java-library") plugins.apply("org.sayandev.stickynote.project") plugins.apply("com.modrinth.minotaur") - plugins.apply("org.jetbrains.kotlin.plugin.serialization") stickynote { - relocate(!gradle.startParameter.taskNames.any { it.startsWith("runServer") || it.startsWith("runVelocity") }) +// relocate(!gradle.startParameter.taskNames.any { it.startsWith("runServer") || it.startsWith("runVelocity") }) } repositories { @@ -194,23 +197,12 @@ allprojects { } subprojects { - configurations.create("compileOnlyApiResolved") { - isCanBeResolved = true - extendsFrom(configurations.getByName("compileOnlyApi")) - } - java { withSourcesJar() disableAutoTargetJvm() } - val publicationShadowJar by tasks.registering(ShadowJar::class) { - from(sourceSets.main.get().output) - configurations = listOf(*configurations.get().toTypedArray(), this@subprojects.configurations["compileOnlyApiResolved"]) - archiveClassifier.set("") - } - tasks { jar { archiveClassifier.set("unshaded") @@ -231,8 +223,7 @@ subprojects { publishing { publications { create("maven") { -// from(components["shadow"]) - artifact(publicationShadowJar.get()) + from(components["shadow"]) artifact(tasks["sourcesJar"]) this.version = versionString diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e111328..23449a2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sayanvanish-bukkit/build.gradle.kts b/sayanvanish-bukkit/build.gradle.kts index 7d00fb0d..6a9d79ee 100644 --- a/sayanvanish-bukkit/build.gradle.kts +++ b/sayanvanish-bukkit/build.gradle.kts @@ -1,15 +1,14 @@ import net.minecrell.pluginyml.bukkit.BukkitPluginDescription -import org.sayandev.* import org.sayandev.plugin.StickyNoteModules plugins { - id("xyz.jpenilla.run-paper") version "2.3.0" + id("xyz.jpenilla.run-paper") version "3.0.2" // id("io.papermc.paperweight.userdev") version "1.7.2" - id("net.minecrell.plugin-yml.bukkit") version "0.6.0" + id("de.eldoria.plugin-yml.paper") version "0.8.0" } stickynote { - modules(StickyNoteModules.BUKKIT, StickyNoteModules.BUKKIT_NMS) + modules(StickyNoteModules.PAPER, StickyNoteModules.BUKKIT, StickyNoteModules.BUKKIT_NMS) // relocate(!gradle.startParameter.getTaskNames().any { it.startsWith("runServer") || it.startsWith("runFolia") || it.startsWith("runVelocity") }) } @@ -52,19 +51,19 @@ tasks { } java { - if (gradle.startParameter.getTaskNames().isNotEmpty() && (gradle.startParameter.getTaskNames().contains("runServer") || gradle.startParameter.getTaskNames().contains("runFolia"))) { + if (gradle.startParameter.taskNames.isNotEmpty() && (gradle.startParameter.taskNames.contains("runServer") || gradle.startParameter.taskNames.contains("runFolia"))) { toolchain.languageVersion = JavaLanguageVersion.of(21) } } runServer { - minecraftVersion("1.21.8") + minecraftVersion("1.21.9") downloadPlugins { hangar("ViaVersion", "5.4.2-SNAPSHOT+776") hangar("PlaceholderAPI", "2.11.6") modrinth("essentialsx", "2.21.1") - url("https://download.luckperms.net/1594/bukkit/loader/LuckPerms-Bukkit-5.5.9.jar") + modrinth("luckperms", "v5.5.17-bukkit") // hangar("AdvancedServerList", "5.4.1") // url("https://cdn.modrinth.com/data/qvdtDX3s/versions/TD9kTO2n/multiverse-inventories-4.2.7-pre.jar") // url("https://github.com/SkinsRestorer/SkinsRestorer/releases/download/15.5.1/SkinsRestorer.jar") @@ -86,7 +85,7 @@ tasks { // paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.MOJANG_PRODUCTION } -bukkit { +paper { name = rootProject.name version = rootProject.version as String description = rootProject.description @@ -94,11 +93,12 @@ bukkit { author = findProperty("author")!! as String defaultPermission = BukkitPluginDescription.Permission.Default.FALSE + loader = "${rootProject.group}.${findProperty("slug")!! as String}.bukkit.${rootProject.name}Loader" main = "${rootProject.group}.${findProperty("slug")!! as String}.bukkit.${rootProject.name}Plugin" foliaSupported = true - apiVersion = "1.13" + apiVersion = "1.20" permissions { register("sayanvanish.action.vanish.onjoin") { @@ -109,17 +109,29 @@ bukkit { } } - softDepend = listOf( - "Essentials", - "squaremap", - "LuckPerms", - "PlaceholderAPI", - "MiniPlaceholders", - "Citizens", - // just to fix adventure problem on 1.8 - "packetevents", - "TAB" - ) + serverDependencies { + register("Essentials") { + required = false + } + register("squaremap") { + required = false + } + register("LuckPerms") { + required = false + } + register("PlaceholderAPI") { + required = false + } + register("MiniPlaceholders") { + required = false + } + register("Citizens") { + required = false + } + register("TAB") { + required = false + } + } } modrinth { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/Hello.java b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/Hello.java new file mode 100644 index 00000000..1f59ab59 --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/Hello.java @@ -0,0 +1,5 @@ +class Main { + public static void main(String[] args) { + System.out.println("Hello World!"); + } +} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/HelloKT.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/HelloKT.kt new file mode 100644 index 00000000..a289ba69 --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/HelloKT.kt @@ -0,0 +1,5 @@ +package org.sayandev.sayanvanish.bukkit + +fun main() { + println("Hello from Kotlin") +} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishLoader.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishLoader.kt new file mode 100644 index 00000000..049717d3 --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishLoader.kt @@ -0,0 +1,12 @@ +package org.sayandev.sayanvanish.bukkit + +import io.papermc.paper.plugin.loader.PluginClasspathBuilder +import io.papermc.paper.plugin.loader.PluginLoader +import org.sayandev.stickynote.loader.paper.StickyNotePaperLoader + +class SayanVanishLoader : PluginLoader { + override fun classloader(classpathBuilder: PluginClasspathBuilder) { + StickyNotePaperLoader(this, classpathBuilder) + .load() + } +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt index f5e0ef8a..3bc0d240 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt @@ -15,6 +15,7 @@ import org.sayandev.sayanvanish.bukkit.command.SayanVanishCommand import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.stickynote.bukkit.StickyNote +import org.sayandev.stickynote.bukkit.WrappedStickyNotePlugin import org.sayandev.stickynote.bukkit.error import org.sayandev.stickynote.loader.bukkit.StickyNoteBukkitLoader import java.io.File @@ -22,7 +23,7 @@ import java.io.File class SayanVanishPlugin : JavaPlugin() { override fun onEnable() { - StickyNoteBukkitLoader(this) + WrappedStickyNotePlugin(this) setInstance(this) if (!Platform.setAndRegister(BukkitPlatform())) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts b/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts index 8127c293..9460d30a 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts @@ -1,7 +1,7 @@ import org.sayandev.plugin.StickyNoteModules plugins { - id("xyz.jpenilla.run-velocity") version "2.3.0" + id("xyz.jpenilla.run-velocity") version "3.0.2" } stickynote { diff --git a/settings.gradle.kts b/settings.gradle.kts index 0ce14a44..e7352b62 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,8 +8,8 @@ pluginManagement { } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" - id("org.sayandev.stickynote.settings") version "1.10.5.20-pubsub2" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" + id("org.sayandev.stickynote.settings") version "2.0.0-alpha.12" } rootProject.name = "SayanVanish" From d4526ba882845f52f6e4b30621e41e92e722d232 Mon Sep 17 00:00:00 2001 From: Syrent Date: Sun, 22 Feb 2026 21:27:18 +0330 Subject: [PATCH 36/67] chore: add stickynote submodule --- .gitmodules | 3 +++ build.gradle.kts | 5 ++++- gradle.properties | 5 ++++- gradle/wrapper/gradle-wrapper.properties | 2 +- .../sayanvanish/api/message/MessagingCategoryType.kt | 3 ++- .../sayanvanish/api/storage/TransactionType.kt | 2 +- sayanvanish-bukkit/build.gradle.kts | 10 ---------- settings.gradle.kts | 4 ++-- 8 files changed, 17 insertions(+), 17 deletions(-) create mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..a512f7f9 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "StickyNote"] + path = StickyNote + url = https://github.com/Sayan-Development/StickyNote.git diff --git a/build.gradle.kts b/build.gradle.kts index 2e299089..7a4ee7ab 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -88,6 +88,8 @@ allprojects { version = findProperty("version")!! as String plugins.apply("java") + plugins.apply("org.jetbrains.kotlin.jvm") + plugins.apply("org.jetbrains.kotlin.plugin.serialization") plugins.apply("maven-publish") plugins.apply("com.gradleup.shadow") plugins.apply("java-library") @@ -95,6 +97,7 @@ allprojects { plugins.apply("com.modrinth.minotaur") stickynote { + useSubmodule(true) // relocate(!gradle.startParameter.taskNames.any { it.startsWith("runServer") || it.startsWith("runVelocity") }) } @@ -296,4 +299,4 @@ hangarPublish { } } } -} \ No newline at end of file +} diff --git a/gradle.properties b/gradle.properties index c94dfcf4..44ad129e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,4 +33,7 @@ description=A modular vanish system for Minecraft servers website=https://sayandev.org author=Syrent -version=2.0.0-alpha.2 \ No newline at end of file +version=2.0.0-alpha.2 + +stickynote.useSubmodule=true +stickynote.submodulePath=StickyNote diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 23449a2b..37f78a6a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt index 32a1c9ca..b7c84f13 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt @@ -2,6 +2,7 @@ package org.sayandev.sayanvanish.api.message import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable +import kotlinx.serialization.builtins.serializer import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder @@ -21,4 +22,4 @@ interface MessagingCategoryType { return MessagingCategoryTypes.serializer().deserialize(decoder) } } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt index 253d03ea..ec371f9d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt @@ -21,4 +21,4 @@ interface TransactionType { return TransactionTypes.serializer().deserialize(decoder) } } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/build.gradle.kts b/sayanvanish-bukkit/build.gradle.kts index 00193a73..55c52f90 100644 --- a/sayanvanish-bukkit/build.gradle.kts +++ b/sayanvanish-bukkit/build.gradle.kts @@ -65,16 +65,6 @@ tasks { modrinth("essentialsx", "2.21.2") modrinth("luckperms", "v5.5.17-bukkit") url("https://github.com/NEZNAMY/TAB/releases/download/5.4.0/TAB.v5.4.0.jar") -// hangar("AdvancedServerList", "5.4.1") -// url("https://cdn.modrinth.com/data/qvdtDX3s/versions/TD9kTO2n/multiverse-inventories-4.2.7-pre.jar") -// url("https://github.com/SkinsRestorer/SkinsRestorer/releases/download/15.5.1/SkinsRestorer.jar") -// url("https://cdn.modrinth.com/data/3wmN97b8/versions/ehwU9G3y/multiverse-core-4.3.15-pre.2.jar") -// url("https://cdn.modrinth.com/data/16vhQOQN/versions/g55TGTXG/minimotd-bukkit-2.1.4.jar") -// url("https://github.com/NEZNAMY/TAB/releases/download/4.1.6/TAB.v4.1.6.jar") -// url("https://ci.lucko.me/job/spark/418/artifact/spark-bukkit/build/libs/spark-1.10.73-bukkit.jar") -// url("https://github.com/Insprill/custom-join-messages/releases/download/v17.5.0/custom-join-messages-17.5.0.jar") -// url("https://github.com/NEZNAMY/TAB-Bridge/releases/download/6.0.1/TAB-Bridge.v6.0.1.jar") -// url("https://download.luckperms.net/1593/bukkit/loader/LuckPerms-Bukkit-5.5.8.jar") } jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false") } diff --git a/settings.gradle.kts b/settings.gradle.kts index e7352b62..ce3827df 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,8 +8,8 @@ pluginManagement { } plugins { + id("org.sayandev.stickynote.settings") version "2.0.0-alpha.29" id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" - id("org.sayandev.stickynote.settings") version "2.0.0-alpha.12" } rootProject.name = "SayanVanish" @@ -18,4 +18,4 @@ include("sayanvanish-api") include("sayanvanish-bukkit") include("sayanvanish-proxy") include("sayanvanish-proxy:sayanvanish-proxy-velocity") -include("sayanvanish-proxy:sayanvanish-proxy-bungeecord") \ No newline at end of file +include("sayanvanish-proxy:sayanvanish-proxy-bungeecord") From 0021f150ca7e40c227382f46010d1b802a717da9 Mon Sep 17 00:00:00 2001 From: Syrent Date: Sun, 22 Feb 2026 21:29:37 +0330 Subject: [PATCH 37/67] update stickynote module --- StickyNote | 1 + 1 file changed, 1 insertion(+) create mode 160000 StickyNote diff --git a/StickyNote b/StickyNote new file mode 160000 index 00000000..8f947aff --- /dev/null +++ b/StickyNote @@ -0,0 +1 @@ +Subproject commit 8f947afff922a3090b8226eefa706300b1dfd671 From 50ebbf831de09a98558e91b393937d8bfa078451 Mon Sep 17 00:00:00 2001 From: Syrent Date: Sun, 22 Feb 2026 21:34:55 +0330 Subject: [PATCH 38/67] chore: update StickyNote submodule --- .gitmodules | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitmodules b/.gitmodules index a512f7f9..923b35f9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "StickyNote"] path = StickyNote url = https://github.com/Sayan-Development/StickyNote.git + branch = pubsub-generic From 1cdd78ad9adb6df353705d993214c96cb9f096cc Mon Sep 17 00:00:00 2001 From: Syrent Date: Sun, 22 Feb 2026 23:03:08 +0330 Subject: [PATCH 39/67] build: update stickynote to 2.0.0-alpha.36 --- StickyNote | 2 +- build.gradle.kts | 2 ++ settings.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/StickyNote b/StickyNote index 8f947aff..a83a9ff5 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit 8f947afff922a3090b8226eefa706300b1dfd671 +Subproject commit a83a9ff5f71d4b7521dc2dcf7927ac9fc425a42a diff --git a/build.gradle.kts b/build.gradle.kts index 7a4ee7ab..bc239e45 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.papermc.hangarpublishplugin.model.Platforms +import org.sayandev.plugin.StickyNotePackagingMode import java.io.ByteArrayOutputStream import java.net.HttpURLConnection import java.net.URL @@ -97,6 +98,7 @@ allprojects { plugins.apply("com.modrinth.minotaur") stickynote { + packagingMode(StickyNotePackagingMode.FAT) useSubmodule(true) // relocate(!gradle.startParameter.taskNames.any { it.startsWith("runServer") || it.startsWith("runVelocity") }) } diff --git a/settings.gradle.kts b/settings.gradle.kts index ce3827df..317cee28 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { } plugins { - id("org.sayandev.stickynote.settings") version "2.0.0-alpha.29" + id("org.sayandev.stickynote.settings") version "2.0.0-alpha.36" id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } From b143ebcf0adae65bf0b1a5cdcaf80747aba7bd21 Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 13:29:18 +0330 Subject: [PATCH 40/67] chore: visibility update bugs --- sayanvanish-bukkit/build.gradle.kts | 9 +++++++ .../sayanvanish/bukkit/VanishManager.kt | 11 +++++--- .../bukkit/api/BukkitVanishUser.kt | 23 ++++++++--------- .../bukkit/api/SayanVanishBukkitAPI.kt | 25 +++++++++++-------- settings.gradle.kts | 2 +- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/sayanvanish-bukkit/build.gradle.kts b/sayanvanish-bukkit/build.gradle.kts index 55c52f90..1e3cac48 100644 --- a/sayanvanish-bukkit/build.gradle.kts +++ b/sayanvanish-bukkit/build.gradle.kts @@ -1,5 +1,6 @@ import net.minecrell.pluginyml.bukkit.BukkitPluginDescription import org.sayandev.plugin.StickyNoteModules +import xyz.jpenilla.runpaper.task.RunServer plugins { id("xyz.jpenilla.run-paper") version "3.0.2" @@ -57,6 +58,10 @@ tasks { } runServer { + runDirectory = file("run/bukkit-1") + jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false", "-Dserver.id=lobby-1") + } + withType(RunServer::class.java) { minecraftVersion("1.21.11") downloadPlugins { @@ -68,6 +73,10 @@ tasks { } jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false") } + register("runServer2") { + runDirectory = file("run/bukkit-2") + jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false", "-Dserver.id=lobby-2") + } runPaper { folia.registerTask() diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt index 693ce9c9..fc67aac9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt @@ -5,8 +5,10 @@ import org.bukkit.event.EventPriority import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent +import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser import org.sayandev.sayanvanish.bukkit.config.Settings @@ -43,9 +45,12 @@ object VanishManager : Listener { } @EventHandler(priority = EventPriority.LOWEST) - private fun hideVanishedPlayersOnJoin(event: PlayerJoinEvent) { - for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().map { it.bukkitAdapt() }.filter { it.player() != null }) { - user.hideUser(event.player) + private fun hideVanishedPlayersForJoinedPlayer(event: PlayerJoinEvent) { + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().getVanished().map { it.bukkitAdapt() }.filter { it.player() != null }) { + val target = event.player + if (!target.isOp && !target.hasPermission(Permission.VANISH.permission())) { + vanishedUser.hideFor(target) + } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index e65e948c..4d3f4a6b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -11,8 +11,6 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Features -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.config.Settings @@ -23,7 +21,6 @@ import org.sayandev.stickynote.bukkit.hasPlugin import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.server -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.sayandev.stickynote.bukkit.utils.ServerVersion import java.util.* @@ -32,7 +29,7 @@ open class BukkitVanishUser( override var username: String ) : VanishUser { - override var serverId = Settings.get().general.serverId + override var serverId = Settings.get().serverId() override var currentOptions = VanishOptions.defaultOptions() override var isVanished = false override var isOnline: Boolean = if (!Settings.get().general.proxyMode) { @@ -74,7 +71,7 @@ open class BukkitVanishUser( super.disappear(options) // order matters - don't move hideUser before vanish (hideUser have a canSee check for vanish state notify) - hideUser() + hideForAll() sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } @@ -127,9 +124,12 @@ open class BukkitVanishUser( } } - fun hideUser() { - for (onlinePlayer in onlinePlayers) { - hideUser(onlinePlayer) + fun hideForAll() { + val player = player() + if (player != null) { + for (onlinePlayer in onlinePlayers) { + SayanVanishBukkitAPI.hidePlayer(player, onlinePlayer) + } } if (currentOptions.notifyStatusChangeToOthers) { for (otherUser in VanishAPI.get().getCacheService().getUsers().getOnline().filter { it.username != username && it.generatedVanishUser().canSee(this) }) { @@ -138,10 +138,9 @@ open class BukkitVanishUser( } } - fun hideUser(target: Player) { - if (target.cachedUser() == null && (target.isOp || target.hasPermission(Permission.VANISH.permission()))) { - target.getCachedOrCreateUser() - } + fun hideFor(target: Player) { + val player = player() ?: return + target.hidePlayer(plugin, player) } fun showUser() { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt index 4979ae3d..661314e2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt @@ -3,10 +3,13 @@ package org.sayandev.sayanvanish.bukkit.api import kotlinx.coroutines.Deferred import org.bukkit.Bukkit import org.bukkit.OfflinePlayer +import org.bukkit.entity.Player +import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.bukkit.config.Settings +import org.sayandev.stickynote.bukkit.plugin import java.util.* class SayanVanishBukkitAPI { @@ -20,11 +23,9 @@ class SayanVanishBukkitAPI { suspend fun UUID.getOrCreateUser(): User { val offlinePlayer = Bukkit.getOfflinePlayer(this) val player = offlinePlayer.player - return VanishAPI.get().getDatabase().getUser(this).await() ?: User.Generic( + return VanishAPI.get().getDatabase().getUser(this).await() ?: BukkitVanishUser( this, - offlinePlayer.name ?: this.toString(), - player != null, - Settings.get().serverId() + offlinePlayer.name ?: this.toString() ) } @@ -42,11 +43,9 @@ class SayanVanishBukkitAPI { @JvmSynthetic fun UUID.getCachedOrCreateUser(): User { - return VanishAPI.get().getCacheService().getUsers().getUser(this) ?: User.Generic( + return VanishAPI.get().getCacheService().getUsers().getUser(this) ?: BukkitVanishUser( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", - false, - Settings.get().serverId() ) } @@ -57,7 +56,7 @@ class SayanVanishBukkitAPI { @JvmSynthetic suspend fun UUID.getOrCreateVanishUser(): VanishUser { - return VanishAPI.get().getDatabase().getVanishUser(this).await() ?: VanishUser.Generic( + return VanishAPI.get().getDatabase().getVanishUser(this).await() ?: BukkitVanishUser( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", ) @@ -79,7 +78,7 @@ class SayanVanishBukkitAPI { @JvmSynthetic fun UUID.getCachedOrCreateVanishUser(): VanishUser { - return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) ?: VanishUser.Generic( + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) ?: BukkitVanishUser( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", ) @@ -134,5 +133,11 @@ class SayanVanishBukkitAPI { fun OfflinePlayer.getCachedOrCreateVanishUser(): VanishUser { return this.uniqueId.getCachedOrCreateVanishUser() } + + fun hidePlayer(player: Player, target: Player) { + if (target.uniqueId != player.uniqueId && !target.isOp && !target.hasPermission(Permission.VANISH.permission())) { + target.hidePlayer(plugin, player) + } + } } -} \ No newline at end of file +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 317cee28..905d5785 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { } plugins { - id("org.sayandev.stickynote.settings") version "2.0.0-alpha.36" + id("org.sayandev.stickynote.settings") version "2.0.0-alpha.37" id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } From 1aaa4ea4c92023ce45855e0469e6e537727a179c Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 13:32:23 +0330 Subject: [PATCH 41/67] chore: use canSee as the source of truth for vanish conditions --- .../sayanvanish/api/SayanVanishAPI.kt | 8 +++--- .../sayandev/sayanvanish/api/VanishUser.kt | 7 ++--- .../sayanvanish/bukkit/VanishManager.kt | 9 ++----- .../bukkit/api/BukkitVanishUser.kt | 23 +++++++++++++--- .../bukkit/api/SayanVanishBukkitAPI.kt | 9 ------- .../bukkit/feature/features/FeatureLevel.kt | 27 +++++++++---------- .../bukkit/feature/features/FeatureState.kt | 6 ++--- 7 files changed, 44 insertions(+), 45 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index c81364e5..02dbb1c7 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -46,8 +46,10 @@ object SayanVanishAPI : VanishAPI { override fun canSee(user: VanishUser?, target: VanishUser): Boolean { if (!target.isVanished) return true - val vanishLevel = user?.vanishLevel ?: -1 - return vanishLevel >= target.vanishLevel + if (user == null) return false + if (user.uniqueId == target.uniqueId) return true + if (!user.hasPermission(Permission.VANISH)) return false + return user.vanishLevel >= target.vanishLevel } suspend fun UUID.user(): VanishUser? { @@ -65,4 +67,4 @@ object SayanVanishAPI : VanishAPI { fun get(): SayanVanishAPI { return this } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 1d89638b..3a2c313e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -59,10 +59,7 @@ interface VanishUser : User { * @param otherVanishUser The user to check if this user can see * */ fun canSee(otherVanishUser: VanishUser): Boolean { - if (!otherVanishUser.isVanished) return true - if (this.uniqueId == otherVanishUser.uniqueId) return true - val canSee = vanishLevel >= otherVanishUser.vanishLevel - return canSee + return VanishAPI.get().canSee(this, otherVanishUser) } @JvmSynthetic @@ -203,4 +200,4 @@ interface VanishUser : User { } } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt index fc67aac9..73688104 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt @@ -5,10 +5,8 @@ import org.bukkit.event.EventPriority import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent -import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser import org.sayandev.sayanvanish.bukkit.config.Settings @@ -47,11 +45,8 @@ object VanishManager : Listener { @EventHandler(priority = EventPriority.LOWEST) private fun hideVanishedPlayersForJoinedPlayer(event: PlayerJoinEvent) { for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().getVanished().map { it.bukkitAdapt() }.filter { it.player() != null }) { - val target = event.player - if (!target.isOp && !target.hasPermission(Permission.VANISH.permission())) { - vanishedUser.hideFor(target) - } + vanishedUser.hideFor(event.player) } } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 4d3f4a6b..469896c2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -11,6 +11,7 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Features +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.config.Settings @@ -127,8 +128,11 @@ open class BukkitVanishUser( fun hideForAll() { val player = player() if (player != null) { - for (onlinePlayer in onlinePlayers) { - SayanVanishBukkitAPI.hidePlayer(player, onlinePlayer) + for (onlinePlayer in onlinePlayers.filter { it.uniqueId != uniqueId }) { + val viewer = onlinePlayer.getCachedOrCreateVanishUser() + if (!viewer.canSee(this)) { + hidePlayer(onlinePlayer, player) + } } } if (currentOptions.notifyStatusChangeToOthers) { @@ -140,7 +144,10 @@ open class BukkitVanishUser( fun hideFor(target: Player) { val player = player() ?: return - target.hidePlayer(plugin, player) + val viewer = target.getCachedOrCreateVanishUser() + if (!viewer.canSee(this)) { + hidePlayer(target, player) + } } fun showUser() { @@ -168,6 +175,14 @@ open class BukkitVanishUser( } } + private fun hidePlayer(player: Player, target: Player) { + if (ServerVersion.supports(9)) { + player.hidePlayer(plugin, target) + } else { + player.hidePlayer(target) + } + } + companion object { @JvmStatic fun fromUser(vanishUser: VanishUser): BukkitVanishUser { @@ -184,4 +199,4 @@ open class BukkitVanishUser( } } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt index 661314e2..4a6ba5d5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt @@ -3,13 +3,10 @@ package org.sayandev.sayanvanish.bukkit.api import kotlinx.coroutines.Deferred import org.bukkit.Bukkit import org.bukkit.OfflinePlayer -import org.bukkit.entity.Player -import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.bukkit.config.Settings -import org.sayandev.stickynote.bukkit.plugin import java.util.* class SayanVanishBukkitAPI { @@ -133,11 +130,5 @@ class SayanVanishBukkitAPI { fun OfflinePlayer.getCachedOrCreateVanishUser(): VanishUser { return this.uniqueId.getCachedOrCreateVanishUser() } - - fun hidePlayer(player: Player, target: Player) { - if (target.uniqueId != player.uniqueId && !target.isOp && !target.hasPermission(Permission.VANISH.permission())) { - target.hidePlayer(plugin, player) - } - } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt index c784547d..bb1f0d20 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt @@ -5,13 +5,12 @@ import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerGameModeChangeEvent import org.bukkit.event.player.PlayerJoinEvent -import org.sayandev.sayanvanish.api.Permission import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature @@ -54,8 +53,8 @@ class FeatureLevel( if (!isActive(user)) return runSync({ for (onlinePlayer in onlinePlayers.filter { it.uniqueId != user.uniqueId }) { - val playerVanishLevel = onlinePlayer.cachedVanishUser()?.vanishLevel ?: -1 - if (playerVanishLevel < user.vanishLevel || !onlinePlayer.hasPermission(Permission.VANISH.permission())) { + val viewer = onlinePlayer.getCachedOrCreateVanishUser() + if (!viewer.canSee(user)) { user.player()?.let { player -> hidePlayer(onlinePlayer, player) onlinePlayer.sendPacket(PacketUtils.getRemoveEntitiesPacket(player.entityId)) @@ -75,8 +74,8 @@ class FeatureLevel( if (!isActive(user) || !seeAsSpectator) return runSync({ for (onlinePlayer in onlinePlayers.filter { it.uniqueId != user.uniqueId }) { - val playerVanishLevel = onlinePlayer.cachedVanishUser()?.vanishLevel ?: -1 - if (playerVanishLevel >= user.vanishLevel) { + val viewer = onlinePlayer.getCachedOrCreateVanishUser() + if (viewer.canSee(user)) { user.player()?.let { player -> onlinePlayer.sendPacket(PacketUtils.getUpdateGameModePacket(NMSUtils.getServerPlayer(player), player.gameMode)) } } } @@ -90,8 +89,8 @@ class FeatureLevel( if (!isActive(user) || !seeAsSpectator) return if (!user.isVanished) return for (onlinePlayer in onlinePlayers.filter { it.uniqueId != user.uniqueId }) { - val playerVanishLevel = onlinePlayer.cachedVanishUser()?.vanishLevel ?: -1 - if (playerVanishLevel >= user.vanishLevel) { + val viewer = onlinePlayer.getCachedOrCreateVanishUser() + if (viewer.canSee(user)) { runSync({ onlinePlayer.sendPacket(PacketUtils.getUpdateGameModePacket(NMSUtils.getServerPlayer(player), GameMode.SPECTATOR)) }, 5) @@ -108,10 +107,10 @@ class FeatureLevel( val vanishUser = player.cachedVanishUser() if (((vanishUser != null && !isActive(vanishUser) || !isActive())) || !seeAsSpectator) return runSync({ - val playerVanishLevel = player.cachedVanishUser()?.vanishLevel ?: -1 + val viewer = player.getCachedOrCreateVanishUser() for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { it.bukkitAdapt().player() != null && it.uniqueId != player.uniqueId }) { val vanishedPlayer = user.bukkitAdapt().player() ?: continue - if (playerVanishLevel >= user.vanishLevel && user.hasPermission(Permission.VANISH.permission())) { + if (viewer.canSee(user)) { player.sendPacket(PacketUtils.getUpdateGameModePacket(NMSUtils.getServerPlayer(vanishedPlayer), GameMode.SPECTATOR)) } } @@ -124,10 +123,10 @@ class FeatureLevel( val user = player.cachedVanishUser() if ((user != null && !isActive(user)) || !isActive()) return runSync({ - val playerVanishLevel = player.cachedVanishUser()?.vanishLevel ?: -1 + val viewer = player.getCachedOrCreateVanishUser() for (user in VanishAPI.get().getCacheService().getVanishUsers().getVanished().filter { it.bukkitAdapt().player() != null && it.uniqueId != player.uniqueId }) { - val vanishedPlayer = BukkitPlatformAdapter.adapt(user).player() ?: continue - if (playerVanishLevel < user.vanishLevel || !player.hasPermission(Permission.VANISH.permission())) { + val vanishedPlayer = user.bukkitAdapt().player() ?: continue + if (!viewer.canSee(user)) { hidePlayer(player, vanishedPlayer) player.sendPacket(PacketUtils.getRemoveEntitiesPacket(vanishedPlayer.entityId)) } @@ -149,4 +148,4 @@ class FeatureLevel( DATABASE } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index db0a6b74..61551c70 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -92,7 +92,7 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { - for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.canSee(user) }) { vanishedUser.sendMessage(language.vanish.joinedTheServerWhileVanished, Placeholder.unparsed("player", user.username)) } } @@ -112,7 +112,7 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { - for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.hasPermission(Permission.VANISH) && it.vanishLevel >= user.vanishLevel }) { + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.canSee(user) }) { vanishedUser.sendMessage(language.vanish.leftTheServerWhileVanished, Placeholder.unparsed("player", user.username)) } } @@ -128,4 +128,4 @@ class FeatureState( } } -} \ No newline at end of file +} From 3f948b382c1b18afaca3a9605ad7a22392c3b78b Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 14:02:28 +0330 Subject: [PATCH 42/67] chore: better permission handling; feat: reloadable messaging system --- StickyNote | 2 +- .../api/{Permission.kt => Permissions.kt} | 15 +++-- .../sayanvanish/api/SayanVanishAPI.kt | 12 +++- .../org/sayandev/sayanvanish/api/User.kt | 8 +-- .../sayanvanish/api/message/MessageConfig.kt | 7 +- .../api/message/TypedMessagingService.kt | 67 ++++++++++++++++++- .../message/types/RedisMessagingService.kt | 13 +++- .../types/WebSocketMessagingService.kt | 8 ++- .../sayanvanish/bukkit/BukkitPlatform.kt | 2 + .../sayanvanish/bukkit/SayanVanishPlugin.kt | 3 +- .../sayanvanish/bukkit/api/BukkitUser.kt | 6 ++ .../bukkit/api/BukkitVanishUser.kt | 4 +- .../bukkit/command/SayanVanishCommand.kt | 21 +++--- .../feature/features/FeatureFakeMessage.kt | 10 +-- .../bukkit/feature/features/FeatureFly.kt | 7 +- .../features/FeatureInvulnerability.kt | 6 +- .../features/FeatureRegisterPermissions.kt | 50 ++++++++++++++ .../bukkit/feature/features/FeatureState.kt | 15 ++--- .../prevent/FeaturePreventTabComplete.kt | 6 +- .../bukkit/utils/PermissionUtils.kt | 15 +++++ .../prevent/FeaturePreventTabComplete.kt | 4 +- .../velocity/api/VelocityVanishUser.kt | 6 +- .../SayanVanishProxyCommandVelocity.kt | 8 +-- .../prevent/FeaturePreventTabComplete.kt | 6 +- settings.gradle.kts | 2 +- 25 files changed, 234 insertions(+), 69 deletions(-) rename sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/{Permission.kt => Permissions.kt} (55%) create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRegisterPermissions.kt create mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PermissionUtils.kt diff --git a/StickyNote b/StickyNote index a83a9ff5..1608cb89 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit a83a9ff5f71d4b7521dc2dcf7927ac9fc425a42a +Subproject commit 1608cb89b15d5622fe00a90cc45b243ccf29bf25 diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permissions.kt similarity index 55% rename from sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt rename to sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permissions.kt index db59c710..d81fcbb7 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permission.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permissions.kt @@ -1,15 +1,22 @@ package org.sayandev.sayanvanish.api -enum class Permission(val value: String) { - VANISH("vanish.use"), +enum class Permissions(val value: String, val default: PermissionDefaults = PermissionDefaults.FALSE) { + VANISH("vanish.use", PermissionDefaults.ADMIN), VANISH_OTHERS("commands.vanish.others"), VANISH_ON_JOIN("action.vanish.onjoin"), FEATURE_PLAYER_TOGGLE("commands.feature.toggleplayer.other"), INVULNERABLE("action.vanish.invulnerable"), - FLY_KEEP_AFTER_REAPPEAR("action.vanish.fly.keep_after_reappear"), - FLY("action.vanish.fly"); + FLY_KEEP_AFTER_REAPPEAR("action.vanish.fly.keep_after_reappear", PermissionDefaults.TRUE), + FLY("action.vanish.fly", PermissionDefaults.ADMIN); fun permission(): String { return "${Platform.get().pluginName.lowercase()}.${value}" } +} + +enum class PermissionDefaults { + TRUE, + FALSE, + ADMIN, + NOT_ADMIN, } \ No newline at end of file diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index 02dbb1c7..31492471 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -26,10 +26,10 @@ object SayanVanishAPI : VanishAPI { return cacheService } - fun initialize() { + fun initialize(enableMessaging: Boolean = true) { runBlocking { database.initialize().await() - messagingService.initialize().await() + messagingService.initialize(enableMessaging).await() cacheService.fetchData() for (user in database.getVanishUsers().await().filter { user -> user.serverId == Platform.get().serverId }) { @@ -40,6 +40,12 @@ object SayanVanishAPI : VanishAPI { } } + fun reloadMessaging(enableMessaging: Boolean) { + runBlocking { + messagingService.reload(enableMessaging).await() + } + } + override fun getPlatform(): Platform { return Platform.get() } @@ -48,7 +54,7 @@ object SayanVanishAPI : VanishAPI { if (!target.isVanished) return true if (user == null) return false if (user.uniqueId == target.uniqueId) return true - if (!user.hasPermission(Permission.VANISH)) return false + if (!user.hasPermission(Permissions.VANISH)) return false return user.vanishLevel >= target.vanishLevel } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 95830d12..f8c9ad6e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -62,14 +62,14 @@ interface User { } /** - * Checks if the user has the specified [Permission] object. + * Checks if the user has the specified [Permissions] object. * - * @param permission The [Permission] to check. + * @param permission The [Permissions] to check. * @return True if the user has the permission, false otherwise. * @since 1.0.0 */ - fun hasPermission(permission: Permission): Boolean { - return hasPermission(permission.permission()) + fun hasPermission(permission: Permissions): Boolean { + return Platform.get().adapter.adapt(this).hasPermission(permission) } fun sendMessage(content: String, vararg placeholders: TagResolver) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt index 1451722b..37876049 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt @@ -37,5 +37,10 @@ class MessageConfig( fun fromConfig(): MessageConfig? { return Config.fromFile(File(Platform.get().rootDirectory, FILE_NAME)) } + + @JvmStatic + fun reload() { + messageConfig = fromConfig() ?: defaultConfig() + } } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt index dd558f5e..930809ff 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt @@ -20,8 +20,34 @@ class TypedMessagingService: MessagingService { val messageTypes = mutableMapOf() var messagingConnected: Boolean = true + private set + var enabled: Boolean = true + private set + + private val noOpMessagingService = object : MessagingService { + override val dispatcher: AsyncDispatcher = this@TypedMessagingService.dispatcher + + override suspend fun syncUser(user: User): Deferred { + return CompletableDeferred(true) + } + + override suspend fun syncVanishUser(vanishUser: VanishUser): Deferred { + return CompletableDeferred(true) + } + } + + suspend fun initialize(enabled: Boolean = true): Deferred { + this.enabled = enabled + if (!enabled) { + disable() + return CompletableDeferred(true) + } + if (messageTypes.isNotEmpty()) { + return CompletableDeferred(true) + } + + messagingConnected = true - suspend fun initialize(): Deferred { PayloadWrapper.registerSerializer(User::class.java, User.JsonAdapter()) PayloadWrapper.registerDeserializer(User::class.java, User.JsonAdapter()) PayloadWrapper.registerDeserializer(VanishUser::class.java, VanishUser.JsonAdapter()) @@ -57,20 +83,43 @@ class TypedMessagingService: MessagingService { return CompletableDeferred(true) } + suspend fun reload(enabled: Boolean): Deferred { + if (!enabled) { + disable() + return CompletableDeferred(true) + } + + if (this.enabled && messageTypes.isNotEmpty()) { + return CompletableDeferred(true) + } + + disable() + return initialize(true) + } + inline fun getByType(): M { return messageTypes.values.filterIsInstance().firstOrNull() ?: throw IllegalArgumentException("Received database with type `${M::class.simpleName}` but it isn't registered in the TransactionDatabase database types.") } override suspend fun syncUser(user: User): Deferred { + if (!enabled || messageTypes.isEmpty()) { + return CompletableDeferred(true) + } return messagingService(MessagingCategoryTypes.SYNC_USER).syncUser(user) } override suspend fun syncVanishUser(vanishUser: VanishUser): Deferred { + if (!enabled || messageTypes.isEmpty()) { + return CompletableDeferred(true) + } return messagingService(MessagingCategoryTypes.SYNC_VANISH_USER).syncVanishUser(vanishUser) } fun messagingService(type: MessagingType): MessagingService { + if (!enabled || messageTypes.isEmpty()) { + return noOpMessagingService + } return messageTypes[type] ?: let { val (fallbackMethod, fallbackService) = messageTypes.entries.first() Platform.get().logger.warning("Tried to get a messaging service of type $type, but it was not initialized. falling back to ${fallbackMethod} database method.") @@ -93,4 +142,18 @@ class TypedMessagingService: MessagingService { } Platform.get().logger.severe("Here's the full error trace:") } -} \ No newline at end of file + + private suspend fun disable(): Deferred { + for ((_, messagingService) in messageTypes) { + when (messagingService) { + is RedisMessagingService -> messagingService.shutdown().await() + is WebSocketMessagingService -> messagingService.shutdown().await() + } + } + + messageTypes.clear() + this.enabled = false + this.messagingConnected = true + return CompletableDeferred(true) + } +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index 40f60119..5845b4de 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -38,6 +38,17 @@ class RedisMessagingService( return syncVanishUserPublisher.sync(vanishUser) } + suspend fun shutdown(): Deferred { + syncUserPublisher.shutdown() + syncVanishUserPublisher.shutdown() + + if (connection.connected) { + connection.disconnect().await() + } + + return CompletableDeferred(true) + } + inner class SyncUserPublisher : RedisPublisher( MessageMeta.create(Platform.get().pluginName.lowercase(), MessagingCategoryTypes.SYNC_USER.id), RedisConnectionMeta(connection.redis, dispatcher), @@ -95,4 +106,4 @@ class RedisMessagingService( ) } } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt index 8bc44861..be664463 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -35,6 +35,12 @@ class WebSocketMessagingService( return syncVanishUserPublisher.sync(vanishUser) } + suspend fun shutdown(): Deferred { + syncUserPublisher.shutdown() + syncVanishUserPublisher.shutdown() + return CompletableDeferred(true) + } + inner class SyncUserPublisher : WebSocketPublisher( MessageMeta.create(Platform.get().pluginName.lowercase(), MessagingCategoryTypes.SYNC_USER.id), WebSocketConnectionMeta(URI.create(config.uri), dispatcher), @@ -92,4 +98,4 @@ class WebSocketMessagingService( ) } } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt index fd0f7e49..cf34b7f8 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt @@ -18,6 +18,7 @@ import org.sayandev.sayanvanish.bukkit.feature.features.FeatureGameMode import org.sayandev.sayanvanish.bukkit.feature.features.FeatureInventoryInspect import org.sayandev.sayanvanish.bukkit.feature.features.FeatureInvulnerability import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel +import org.sayandev.sayanvanish.bukkit.feature.features.FeatureRegisterPermissions import org.sayandev.sayanvanish.bukkit.feature.features.FeatureRideEntity import org.sayandev.sayanvanish.bukkit.feature.features.FeatureSilentContainer import org.sayandev.sayanvanish.bukkit.feature.features.FeatureState @@ -96,6 +97,7 @@ class BukkitPlatform : Platform( subclass(FeatureRideEntity::class) subclass(FeatureSilentContainer::class) subclass(FeatureState::class) + subclass(FeatureRegisterPermissions::class) subclass(FeatureUpdate::class) } polymorphic(Feature::class) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt index 3bc0d240..5026bf3e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt @@ -31,9 +31,8 @@ class SayanVanishPlugin : JavaPlugin() { return } - SayanVanishAPI.initialize() - Settings.reload() + SayanVanishAPI.initialize(Settings.get().general.proxyMode) if (Settings.get().general.proxyMode && storageConfig.method == DatabaseType.SQL && storageConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { error("The `proxy-mode` is enabled, but the database method is set to SQLite, which might lead to unexpected results. If you're using proxies such as Velocity or BungeeCord, make sure to use a different database method, such as MySQL or Redis.") diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index 39f6b946..84af35f5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -6,7 +6,9 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.Bukkit import org.bukkit.permissions.Permission import org.bukkit.permissions.PermissionDefault +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.bukkit.utils.PermissionUtils.asBukkitPermissionDefault import org.sayandev.stickynote.bukkit.extension.sendComponent import org.sayandev.stickynote.bukkit.extension.sendComponentActionbar import org.sayandev.stickynote.bukkit.utils.AdventureUtils @@ -28,6 +30,10 @@ class BukkitUser( return player()?.hasPermission(Permission(permission, PermissionDefault.FALSE)) == true } + override fun hasPermission(permission: Permissions): Boolean { + return player()?.hasPermission(Permission(permission.permission(), permission.default.asBukkitPermissionDefault())) == true + } + override fun sendMessage(content: String, vararg placeholders: TagResolver) { sendMessage(content.component(*placeholders)) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 469896c2..9a0adbd4 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -6,7 +6,7 @@ import org.bukkit.OfflinePlayer import org.bukkit.entity.Player import org.bukkit.metadata.FixedMetadataValue import org.bukkit.permissions.PermissionDefault -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser @@ -44,7 +44,7 @@ open class BukkitVanishUser( player.effectivePermissions .filter { it.permission.startsWith("sayanvanish.level.") } .maxOfOrNull { it.permission.substringAfter("sayanvanish.level.").toIntOrNull() ?: field } - ?: if (player.hasPermission(org.bukkit.permissions.Permission(Permission.VANISH.permission(), PermissionDefault.FALSE))) 1 else { + ?: if (hasPermission(Permissions.VANISH)) 1 else { if (isVanished) 1 else field } } ?: field diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 353c2966..cf5b8d2e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -15,7 +15,8 @@ import org.incendo.cloud.parser.standard.IntegerParser import org.incendo.cloud.parser.standard.StringParser import org.incendo.cloud.setting.ManagerSetting import org.incendo.cloud.suggestion.Suggestion -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions +import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.command.FeatureParser @@ -25,6 +26,7 @@ import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.storage.storageConfig +import org.sayandev.sayanvanish.api.message.MessageConfig import org.sayandev.sayanvanish.api.utils.Paste import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateVanishUser @@ -39,7 +41,6 @@ import org.sayandev.sayanvanish.bukkit.utils.ServerUtils import org.sayandev.stickynote.bukkit.* import org.sayandev.stickynote.bukkit.command.BukkitCommand import org.sayandev.stickynote.bukkit.command.BukkitSender -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.sayandev.stickynote.core.utils.MilliCounter import java.io.File import java.util.concurrent.CompletableFuture @@ -74,7 +75,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set return } - if (target.isPresent && !sender.hasPermission(Permission.VANISH_OTHERS.permission())) { + if (target.isPresent && !sender.hasPermission(Permissions.VANISH_OTHERS.permission())) { sender.sendComponent(language.general.dontHavePermission) return } @@ -83,8 +84,8 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set launch { val user = player.getOrCreateVanishUser() - if (!user.hasPermission(Permission.VANISH)) { - user.sendMessage(language.vanish.dontHaveUsePermission, Placeholder.unparsed("permission", Permission.VANISH.permission())) + if (!user.hasPermission(Permissions.VANISH)) { + user.sendMessage(language.vanish.dontHaveUsePermission, Placeholder.unparsed("permission", Permissions.VANISH.permission())) } val options = VanishOptions.defaultOptions().apply { @@ -188,7 +189,6 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set literalWithPermission("reload") handler { context -> val sender = context.sender().platformSender() - language = LanguageConfig.fromConfig() ?: LanguageConfig.defaultConfig() Features.features.forEach { feature -> feature.disable(true) if (feature::class.java.isAssignableFrom(Listener::class.java)) { @@ -197,9 +197,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set } Features.features.clear() Features.userFeatures.clear() - RegisteredFeatureHandler.process() Settings.reload() storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultConfig() + MessageConfig.reload() + SayanVanishAPI.reloadMessaging(Settings.get().general.proxyMode) + language = LanguageConfig.fromConfig() ?: LanguageConfig.defaultConfig() + RegisteredFeatureHandler.process() sender.sendComponent(language.general.reloaded) } } @@ -264,7 +267,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val targetArg = context.optional("player").getOrNull() val sender = context.sender().platformSender() - if (targetArg != null && !sender.hasPermission(Permission.FEATURE_PLAYER_TOGGLE.permission())) { + if (targetArg != null && !sender.hasPermission(Permissions.FEATURE_PLAYER_TOGGLE.permission())) { sender.sendComponent(language.feature.togglePlayerOther) return@suspendingHandler } @@ -489,4 +492,4 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set ))).post().await() sender.sendComponent(language.paste.use.replace("", key ?: "N/A")) } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt index 59de0238..8a20be8a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt @@ -10,7 +10,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser @@ -61,7 +61,7 @@ class FeatureFakeMessage( private fun onJoin(event: PlayerJoinEvent) { val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return - if (!user.isVanished && !user.hasPermission(Permission.VANISH_ON_JOIN)) return + if (!user.isVanished && !user.hasPermission(Permissions.VANISH_ON_JOIN)) return if (disableJoinMessageIfVanished) { event.joinMessage = null } @@ -81,7 +81,7 @@ class FeatureFakeMessage( private fun onJoinLast(event: PlayerJoinEvent) { val user = event.player.cachedVanishUser() ?: return if (!isActive(user)) return - if (!user.isVanished && !user.hasPermission(Permission.VANISH_ON_JOIN)) return + if (!user.isVanished && !user.hasPermission(Permissions.VANISH_ON_JOIN)) return if (disableJoinMessageIfVanished) { event.joinMessage = null } @@ -105,7 +105,7 @@ class FeatureFakeMessage( if (sendFakeQuitMessage && !event.options.isOnJoin && !event.options.isOnQuit) { for (player in onlinePlayers) { if (useLegacyFormatter) { - AdventureUtils.audience.player(player).sendMessage( + player.sendMessage( LegacyComponentSerializer.legacyAmpersand().deserialize( PlaceholderAPIHook.injectPlaceholders(user.offlinePlayer(), fakeQuitMessage) .replace("", user.username) @@ -126,7 +126,7 @@ class FeatureFakeMessage( if (sendFakeJoinMessage && !event.options.isOnJoin && !event.options.isOnQuit) { for (player in onlinePlayers) { if (useLegacyFormatter) { - AdventureUtils.audience.player(player).sendMessage( + player.sendMessage( LegacyComponentSerializer.legacyAmpersand().deserialize( PlaceholderAPIHook.injectPlaceholders(user.offlinePlayer(), fakeJoinMessage) .replace("", user.username) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt index f7efaae3..320dc1bf 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt @@ -1,14 +1,13 @@ package org.sayandev.sayanvanish.bukkit.feature.features import org.bukkit.event.EventHandler -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName @@ -29,7 +28,7 @@ class FeatureFly( private fun onVanish(event: BukkitUserVanishEvent) { val user = event.user if (!isActive(user)) return - if (user.hasPermission(Permission.FLY)) { + if (user.hasPermission(Permissions.FLY)) { user.player()?.allowFlight = true user.player()?.isFlying = true } @@ -39,7 +38,7 @@ class FeatureFly( private fun onUnVanish(event: BukkitUserUnVanishEvent) { val user = event.user if (!isActive(user)) return - if (!user.hasPermission(Permission.FLY_KEEP_AFTER_REAPPEAR) && disableOnReappear) { + if (!user.hasPermission(Permissions.FLY_KEEP_AFTER_REAPPEAR) && disableOnReappear) { user.sendMessage(language.feature.flyDisabled) user.player()?.allowFlight = false user.player()?.isFlying = false diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt index e4440639..eb223d77 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt @@ -1,7 +1,7 @@ package org.sayandev.sayanvanish.bukkit.feature.features import org.bukkit.event.EventHandler -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent @@ -30,7 +30,7 @@ class FeatureInvulnerability( private fun onVanish(event: BukkitUserVanishEvent) { val user = event.user if (!isActive(user)) return - if (user.hasPermission(Permission.INVULNERABLE)) { + if (user.hasPermission(Permissions.INVULNERABLE)) { user.player()?.isInvulnerable = true } } @@ -38,7 +38,7 @@ class FeatureInvulnerability( @EventHandler private fun onUnVanish(event: BukkitUserUnVanishEvent) { val user = event.user - if (!user.hasPermission(Permission.INVULNERABLE) || disableOnReappear) { + if (!user.hasPermission(Permissions.INVULNERABLE) || disableOnReappear) { user.player()?.isInvulnerable = false } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRegisterPermissions.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRegisterPermissions.kt new file mode 100644 index 00000000..10fba239 --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRegisterPermissions.kt @@ -0,0 +1,50 @@ +package org.sayandev.sayanvanish.bukkit.feature.features + +import com.charleskorn.kaml.YamlComment +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.player.PlayerJoinEvent +import org.bukkit.event.player.PlayerQuitEvent +import org.sayandev.sayanvanish.api.Permissions +import org.sayandev.sayanvanish.api.VanishAPI +import org.sayandev.sayanvanish.api.VanishOptions +import org.sayandev.sayanvanish.api.feature.Configurable +import org.sayandev.sayanvanish.api.feature.RegisteredFeature +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.bukkit.config.language +import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.stickynote.bukkit.launch +import org.sayandev.stickynote.bukkit.plugin + +@RegisteredFeature +@Serializable +@SerialName("register_permissions") +class FeatureRegisterPermissions: ListenedFeature() { + + @Transient override val id = "register_permissions" + override var enabled: Boolean = true + @Transient override val critical: Boolean = false + @Transient var registeredPermissions = false + + @EventHandler(priority = EventPriority.LOWEST) + private fun onJoin(event: PlayerJoinEvent) { + val player = event.player + if (registeredPermissions) return + for (i in 1..100) { + player.hasPermission("${plugin.name}.level.${i}") + } + for (permission in Permissions.entries) { + player.hasPermission(permission.permission()) + } + + registeredPermissions = true + + return + } + +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index 61551c70..0802b720 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -9,7 +9,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Configurable @@ -19,7 +19,6 @@ import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCac import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import org.sayandev.stickynote.bukkit.launch -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component @RegisteredFeature @Serializable @@ -54,14 +53,14 @@ class FeatureState( val vanishJoinOptions = VanishOptions.Builder().sendMessage(false).notifyStatusChangeToOthers(false).isOnJoin(true).build() if (user == null) { - if (!player.hasPermission(Permission.VANISH.permission())) { + if (!player.hasPermission(Permissions.VANISH.permission())) { return } val tempUser = player.getCachedOrCreateVanishUser() tempUser.isOnline = true - if (tempUser.hasPermission(Permission.VANISH_ON_JOIN) || vanishOnJoin) { + if (tempUser.hasPermission(Permissions.VANISH_ON_JOIN) || vanishOnJoin) { tempUser.isVanished = true launch { tempUser.disappear(vanishJoinOptions) @@ -76,8 +75,8 @@ class FeatureState( user.isOnline = true - if (checkPermissionOnJoin && !user.hasPermission(Permission.VANISH)) { - user.sendMessage(language.vanish.noPermissionToKeepVanished, Placeholder.unparsed("permission", Permission.VANISH.permission())) + if (checkPermissionOnJoin && !user.hasPermission(Permissions.VANISH)) { + user.sendMessage(language.vanish.noPermissionToKeepVanished, Placeholder.unparsed("permission", Permissions.VANISH.permission())) user.appear(vanishJoinOptions) launch { user.delete() @@ -85,7 +84,7 @@ class FeatureState( return } - if (user.hasPermission(Permission.VANISH_ON_JOIN) || (user.isVanished && remember) || vanishOnJoin) { + if (user.hasPermission(Permissions.VANISH_ON_JOIN) || (user.isVanished && remember) || vanishOnJoin) { user.isVanished = true user.disappear(vanishJoinOptions) } @@ -118,7 +117,7 @@ class FeatureState( } } - if ((reappearOnQuit && user.isVanished) || (checkPermissionOnQuit && !user.hasPermission(Permission.VANISH))) { + if ((reappearOnQuit && user.isVanished) || (checkPermissionOnQuit && !user.hasPermission(Permissions.VANISH))) { user.appear(VanishOptions.Builder().isOnQuit(true).build()) } user.isOnline = false diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt index 398fd1a0..1d0e2b70 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt @@ -4,15 +4,13 @@ import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.server.TabCompleteEvent -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment @@ -38,7 +36,7 @@ class FeaturePreventTabComplete( if (!isActive(user)) return val vanishedUsers = VanishAPI.get().getCacheService().getVanishUsers().getVanished() val completions = event.completions.toMutableSet() - if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { + if (!user.hasPermission(Permissions.VANISH) || !checkVanishLevel) { event.completions = completions .filter { completion -> !vanishedUsers.map(VanishUser::username).contains(completion) } return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PermissionUtils.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PermissionUtils.kt new file mode 100644 index 00000000..832ddb8a --- /dev/null +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PermissionUtils.kt @@ -0,0 +1,15 @@ +package org.sayandev.sayanvanish.bukkit.utils + +import org.bukkit.permissions.PermissionDefault +import org.sayandev.sayanvanish.api.PermissionDefaults + +object PermissionUtils { + fun PermissionDefaults.asBukkitPermissionDefault(): PermissionDefault { + return when (this) { + PermissionDefaults.FALSE -> PermissionDefault.FALSE + PermissionDefaults.TRUE -> PermissionDefault.TRUE + PermissionDefaults.ADMIN -> PermissionDefault.OP + PermissionDefaults.NOT_ADMIN -> PermissionDefault.NOT_OP + } + } +} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt index deb6d89e..6bfe200f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt @@ -4,7 +4,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer import net.md_5.bungee.api.event.TabCompleteEvent import net.md_5.bungee.event.EventHandler import net.md_5.bungee.event.EventPriority -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable @@ -27,7 +27,7 @@ class FeaturePreventTabComplete( val user = VanishAPI.get().getDatabase().getUserCache(player.uniqueId) ?: player.generateAndSaveUser() if (!isActive(user)) return val vanishUsers = SayanVanishBungeeAPI.getDatabase().getCachedVanishUsers().values - if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { + if (!user.hasPermission(Permissions.VANISH) || !checkVanishLevel) { event.suggestions .removeIf { suggestion -> vanishUsers.map(VanishUser::username).contains(suggestion) } return diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index 7260258f..708137d7 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -1,8 +1,7 @@ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser @@ -11,7 +10,6 @@ import org.sayandev.sayanvanish.proxy.config.Settings import org.sayandev.sayanvanish.velocity.VelocityPlatformAdapter import org.sayandev.sayanvanish.velocity.feature.features.hook.FeatureHookLuckPerms import org.sayandev.stickynote.velocity.StickyNote -import org.sayandev.stickynote.velocity.utils.AdventureUtils.component import java.util.* import kotlin.jvm.optionals.getOrNull @@ -33,7 +31,7 @@ open class VelocityVanishUser( luckPermsHook.getPermissions(uniqueId) .filter { it.startsWith("sayanvanish.level.") } .maxOfOrNull { it.substringAfter("sayanvanish.level.").toIntOrNull() ?: field } - ?: if (hasPermission(Permission.VANISH)) 1 else { + ?: if (hasPermission(Permissions.VANISH)) 1 else { if (isVanished) 1 else field } } else { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt index 85ec2d90..55f1d4f5 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt @@ -9,7 +9,7 @@ import org.incendo.cloud.kotlin.MutableCommandBuilder import org.incendo.cloud.parser.standard.StringParser import org.incendo.cloud.suggestion.Suggestion import org.incendo.cloud.velocity.parser.PlayerParser -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.proxy.config.Settings @@ -55,7 +55,7 @@ class SayanVanishProxyCommandVelocity : VelocityCommand(Settings.get().command.n return } - if (target.isPresent && !sender.hasPermission(Permission.VANISH_OTHERS.permission())) { + if (target.isPresent && !sender.hasPermission(Permissions.VANISH_OTHERS.permission())) { sender.sendComponent(language.general.dontHavePermission.component()) return } @@ -65,8 +65,8 @@ class SayanVanishProxyCommandVelocity : VelocityCommand(Settings.get().command.n launch { val user = player.getVanishUser() ?: player.generateVanishUser() - if (!user.hasPermission(Permission.VANISH)) { - user.sendMessage(language.general.dontHavePermission, Placeholder.unparsed("permission", Permission.VANISH.permission())) + if (!user.hasPermission(Permissions.VANISH)) { + user.sendMessage(language.general.dontHavePermission, Placeholder.unparsed("permission", Permissions.VANISH.permission())) return@launch } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt index 12bf06d3..c3eefefd 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt @@ -3,13 +3,11 @@ package org.sayandev.sayanvanish.velocity.feature.features.prevent import com.velocitypowered.api.event.PostOrder import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.player.TabCompleteEvent -import org.sayandev.sayanvanish.api.Permission +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI -import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateUser import org.sayandev.sayanvanish.velocity.feature.ListenedFeature import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment @@ -36,7 +34,7 @@ class FeaturePreventTabComplete( val user = player.getCachedOrCreateVanishUser() if (!isActive(user)) return val vanishedUsers = VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.isVanished } - if (!user.hasPermission(Permission.VANISH) || !checkVanishLevel) { + if (!user.hasPermission(Permissions.VANISH) || !checkVanishLevel) { event.suggestions .removeIf { suggestion -> vanishedUsers.map(VanishUser::username).contains(suggestion) } return diff --git a/settings.gradle.kts b/settings.gradle.kts index 905d5785..97a51354 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { } plugins { - id("org.sayandev.stickynote.settings") version "2.0.0-alpha.37" + id("org.sayandev.stickynote.settings") version "2.0.0-alpha.38" id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } From 970b6bd33b5cc10d909772b107e7b1d922f62222 Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 14:13:35 +0330 Subject: [PATCH 43/67] chore: better error handling for pastes; feat: add new User#sendMessageWithPrefix api --- .../org/sayandev/sayanvanish/api/User.kt | 4 + .../sayandev/sayanvanish/api/utils/Paste.kt | 16 +- .../sayanvanish/bukkit/api/BukkitUser.kt | 5 + .../bukkit/api/BukkitVanishUser.kt | 4 +- .../bukkit/command/SayanVanishCommand.kt | 139 ++++++++++-------- .../bukkit/config/LanguageConfig.kt | 4 +- .../bukkit/feature/features/FeatureFly.kt | 2 +- .../feature/features/FeatureRideEntity.kt | 4 +- .../bukkit/feature/features/FeatureUpdate.kt | 4 +- .../sayanvanish/bukkit/utils/PlayerUtils.kt | 14 +- 10 files changed, 120 insertions(+), 76 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index f8c9ad6e..32173705 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -76,6 +76,10 @@ interface User { Platform.get().adapter.adapt(this).sendMessage(content, *placeholders) } + fun sendMessageWithPrefix(content: String, vararg placeholders: TagResolver) { + Platform.get().adapter.adapt(this).sendMessageWithPrefix(content, *placeholders) + } + fun sendActionbar(content: String, vararg placeholders: TagResolver) { Platform.get().adapter.adapt(this).sendActionbar(content, *placeholders) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt index 10d06d14..59976efc 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt @@ -43,7 +43,13 @@ class Paste( response.append(inputLine) } - val key = JsonParser.parseString(response.toString()).asJsonObject.get("key").asString + val body = response.toString() + val key = + runCatching { + JsonParser.parseString(body).asJsonObject.get("key").asString + }.getOrNull() + ?: connection.getHeaderField("Location") + ?: throw IOException("Paste API did not return a key.") deferred.complete(key) return deferred @@ -58,7 +64,11 @@ class Paste( private const val POST_URL = "$BASE_URL/post" private const val USER_AGENT: String = "Mozilla/5.0" - const val PASTE_URL = "https://pastes.dev" + const val PASTE_URL = BASE_URL + + fun url(key: String): String { + return "$PASTE_URL/$key" + } } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt index 84af35f5..1e9ec261 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt @@ -9,6 +9,7 @@ import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.bukkit.utils.PermissionUtils.asBukkitPermissionDefault +import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendPrefixComponent import org.sayandev.stickynote.bukkit.extension.sendComponent import org.sayandev.stickynote.bukkit.extension.sendComponentActionbar import org.sayandev.stickynote.bukkit.utils.AdventureUtils @@ -46,6 +47,10 @@ class BukkitUser( player()?.sendComponent(content) } + override fun sendMessageWithPrefix(content: String, vararg placeholders: TagResolver) { + player()?.sendPrefixComponent(content, *placeholders) + } + fun sendActionbar(content: Component) { player()?.sendComponentActionbar(content) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt index 9a0adbd4..7dffe3b3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt @@ -74,7 +74,7 @@ open class BukkitVanishUser( // order matters - don't move hideUser before vanish (hideUser have a canSee check for vanish state notify) hideForAll() - sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) + sendMessageWithPrefix(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } override fun appear(options: VanishOptions) { @@ -94,7 +94,7 @@ open class BukkitVanishUser( super.appear(options) - sendMessage(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) + sendMessageWithPrefix(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } override fun hasPermission(permission: String): Boolean { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index cf5b8d2e..2c130308 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -36,11 +36,12 @@ import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.config.language import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel import org.sayandev.sayanvanish.bukkit.feature.features.FeatureUpdate -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent +import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendPrefixComponent import org.sayandev.sayanvanish.bukkit.utils.ServerUtils import org.sayandev.stickynote.bukkit.* import org.sayandev.stickynote.bukkit.command.BukkitCommand import org.sayandev.stickynote.bukkit.command.BukkitSender +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.sayandev.stickynote.core.utils.MilliCounter import java.io.File import java.util.concurrent.CompletableFuture @@ -71,12 +72,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val state = context.flags().get("state") if (!target.isPresent && sender !is Player) { - sender.sendComponent(language.general.haveToProvidePlayer) + sender.sendPrefixComponent(language.general.haveToProvidePlayer) return } if (target.isPresent && !sender.hasPermission(Permissions.VANISH_OTHERS.permission())) { - sender.sendComponent(language.general.dontHavePermission) + sender.sendPrefixComponent(language.general.dontHavePermission) return } @@ -85,7 +86,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val user = player.getOrCreateVanishUser() if (!user.hasPermission(Permissions.VANISH)) { - user.sendMessage(language.vanish.dontHaveUsePermission, Placeholder.unparsed("permission", Permissions.VANISH.permission())) + sender.sendPrefixComponent(language.vanish.dontHaveUsePermission.component(Placeholder.unparsed("permission", Permissions.VANISH.permission()))) } val options = VanishOptions.defaultOptions().apply { @@ -96,7 +97,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set if (target.isPresent) { if (!player.isOnline) { - sender.sendComponent(language.vanish.offlineOnVanish, Placeholder.unparsed("player", player.name ?: "N/A"), Placeholder.parsed("state", user.stateText())) + sender.sendPrefixComponent(language.vanish.offlineOnVanish, Placeholder.unparsed("player", player.name ?: "N/A"), Placeholder.parsed("state", user.stateText())) options.sendMessage = false } } @@ -118,7 +119,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set handler { context -> val sender = context.sender().platformSender() if (!forceUpdateConfirm) { - sender.sendComponent(language.general.confirmUpdate) + sender.sendPrefixComponent(language.general.confirmUpdate) forceUpdateConfirm = true runSync({ forceUpdateConfirm = false @@ -126,7 +127,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set return@handler } - sender.sendComponent(language.general.updating) + sender.sendPrefixComponent(language.general.updating) runAsync { val updateFeature = Features.getFeature() @@ -135,12 +136,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set runSync { if (isSuccessful) { - sender.sendComponent(language.general.updated, Placeholder.unparsed("version", updateFeature.latestVersion())) + sender.sendPrefixComponent(language.general.updated, Placeholder.unparsed("version", updateFeature.latestVersion())) if (Settings.get().general.proxyMode && updateFeature.willAffectProxy()) { - sender.sendComponent(language.general.proxyUpdateWarning) + sender.sendPrefixComponent(language.general.proxyUpdateWarning) } } else { - sender.sendComponent(language.general.updateFailed) + sender.sendPrefixComponent(language.general.updateFailed) } } } @@ -152,34 +153,39 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set literalWithPermission("paste") suspendingHandler { context -> val sender = context.sender().platformSender() - sender.sendComponent(language.paste.generating) + sender.sendPrefixComponent(language.paste.generating) async { - val blockedWords = listOf( - "host", - "port", - "database", - "username", - "password", - ) - val databaseKey = Paste("yaml", StorageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().await() - val settingsKey = Paste("yaml", Settings.settingsFile.readLines()).post().await() - val latestLogFile = File(File(pluginDirectory.parentFile.parentFile, "logs"), "latest.log") - if (latestLogFile.exists()) { - val logKey = Paste("log", latestLogFile.readLines()).post().await() - - val featurePastes = mutableMapOf>() - for (feature in Features.features()) { - featurePastes[feature.id] = File(Feature.directory(feature.category), "${feature.id}.yml").readLines() + try { + val blockedWords = listOf( + "host", + "port", + "database", + "username", + "password", + ) + val databaseKey = Paste("yaml", StorageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().await() + val settingsKey = Paste("yaml", Settings.settingsFile.readLines()).post().await() + val latestLogFile = File(File(pluginDirectory.parentFile.parentFile, "logs"), "latest.log") + if (latestLogFile.exists()) { + val logKey = Paste("log", latestLogFile.readLines()).post().await() + + val featurePastes = mutableMapOf>() + for (feature in Features.features()) { + featurePastes[feature.id] = File(Feature.directory(feature.category), "${feature.id}.yml").readLines() + } + val featureKey = Paste("yaml", featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }).post().await() + generateMainPaste(sender, mapOf( + "storage.yml" to Paste.url(databaseKey), + "settings.yml" to Paste.url(settingsKey), + "latest.log" to Paste.url(logKey), + "features" to Paste.url(featureKey) + )) + } else { + generateMainPaste(sender, mapOf("settings.yml" to Paste.url(settingsKey))) } - val featureKey = Paste("yaml", featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }).post().await() - generateMainPaste(sender, mapOf( - "storage.yml" to "${Paste.PASTE_URL}/$databaseKey", - "settings.yml" to "${Paste.PASTE_URL}/$settingsKey", - "latest.log" to "${Paste.PASTE_URL}/$logKey", - "features" to "${Paste.PASTE_URL}/$featureKey" - )) - } else { - generateMainPaste(sender, mapOf("settings.yml" to "${Paste.PASTE_URL}/$settingsKey")) + } catch (exception: Exception) { + exception.printStackTrace() + sender.sendPrefixComponent(language.paste.failedToGenerate) } } } @@ -203,7 +209,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set SayanVanishAPI.reloadMessaging(Settings.get().general.proxyMode) language = LanguageConfig.fromConfig() ?: LanguageConfig.defaultConfig() RegisteredFeatureHandler.process() - sender.sendComponent(language.general.reloaded) + sender.sendPrefixComponent(language.general.reloaded) } } @@ -220,7 +226,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val target = context.get("player") if (!target.hasPlayedBefore()) { - sender.sendComponent(language.general.playerNotFound) + sender.sendPrefixComponent(language.general.playerNotFound) return@suspendingHandler } @@ -229,11 +235,11 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set user.saveAndSync() if (Features.getFeature().levelMethod == FeatureLevel.LevelMethod.PERMISSION) { - sender.sendComponent(language.feature.permissionLevelMethodWarning, Placeholder.unparsed("method", FeatureLevel.LevelMethod.PERMISSION.name), Placeholder.unparsed("methods", FeatureLevel.LevelMethod.entries.joinToString(", ") { it.name })) + sender.sendPrefixComponent(language.feature.permissionLevelMethodWarning, Placeholder.unparsed("method", FeatureLevel.LevelMethod.PERMISSION.name), Placeholder.unparsed("methods", FeatureLevel.LevelMethod.entries.joinToString(", ") { it.name })) return@suspendingHandler } - sender.sendComponent(language.vanish.levelSet, Placeholder.unparsed("level", user.vanishLevel.toString()), Placeholder.unparsed("player", user.username)) + sender.sendPrefixComponent(language.vanish.levelSet, Placeholder.unparsed("level", user.vanishLevel.toString()), Placeholder.unparsed("player", user.username)) } } @@ -245,13 +251,13 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val target = context.get("player") if (!target.hasPlayedBefore()) { - sender.sendComponent(language.general.playerNotFound) + sender.sendPrefixComponent(language.general.playerNotFound) return@suspendingHandler } val user = target.getOrCreateVanishUser() - sender.sendComponent(language.vanish.levelGet, Placeholder.unparsed("player", target.name ?: "N/A"), Placeholder.unparsed("level", user.vanishLevel.toString())) + sender.sendPrefixComponent(language.vanish.levelGet, Placeholder.unparsed("player", target.name ?: "N/A"), Placeholder.unparsed("level", user.vanishLevel.toString())) } } @@ -268,12 +274,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val sender = context.sender().platformSender() if (targetArg != null && !sender.hasPermission(Permissions.FEATURE_PLAYER_TOGGLE.permission())) { - sender.sendComponent(language.feature.togglePlayerOther) + sender.sendPrefixComponent(language.feature.togglePlayerOther) return@suspendingHandler } if (targetArg == null && sender !is Player) { - sender.sendComponent(language.general.haveToProvidePlayer) + sender.sendPrefixComponent(language.general.haveToProvidePlayer) return@suspendingHandler } @@ -282,14 +288,14 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val feature = context.get("feature") val user = target.user().await() ?: let { - sender.sendComponent(language.general.userNotFound, Placeholder.unparsed("player", target.name)) + sender.sendPrefixComponent(language.general.userNotFound, Placeholder.unparsed("player", target.name)) return@suspendingHandler } val userFeature = Features.userFeatures(user).find { it.id == feature.id }!! userFeature.toggle() - sender.sendComponent(language.feature.togglePlayer, Placeholder.unparsed("player", target.name), Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("state", if (userFeature.enabled) "enabled" else "disabled")) + sender.sendPrefixComponent(language.feature.togglePlayer, Placeholder.unparsed("player", target.name), Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("state", if (userFeature.enabled) "enabled" else "disabled")) return@suspendingHandler } } @@ -302,13 +308,13 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val feature = context.get("feature") if (!feature.enabled) { - sender.sendComponent(language.feature.alreadyDisabled, Placeholder.unparsed("feature", feature.id)) + sender.sendPrefixComponent(language.feature.alreadyDisabled, Placeholder.unparsed("feature", feature.id)) return@handler } feature.disable() feature.save() - sender.sendComponent(language.feature.disabled, Placeholder.unparsed("feature", feature.id)) + sender.sendPrefixComponent(language.feature.disabled, Placeholder.unparsed("feature", feature.id)) } } @@ -319,13 +325,13 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val feature = context.get("feature") if (feature.enabled) { - sender.sendComponent(language.feature.alreadyEnabled, Placeholder.unparsed("feature", feature.id)) + sender.sendPrefixComponent(language.feature.alreadyEnabled, Placeholder.unparsed("feature", feature.id)) return@handler } feature.enable() feature.save() - sender.sendComponent(language.feature.enabled, Placeholder.unparsed("feature", feature.id)) + sender.sendPrefixComponent(language.feature.enabled, Placeholder.unparsed("feature", feature.id)) } } @@ -343,7 +349,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set } freshFeature.save() Features.features.add(freshFeature) - sender.sendComponent(language.feature.reset, Placeholder.unparsed("feature", feature.id)) + sender.sendPrefixComponent(language.feature.reset, Placeholder.unparsed("feature", feature.id)) } } @@ -353,7 +359,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val sender = context.sender().platformSender() val feature = context.get("feature") - sender.sendComponent(language.feature.status, Placeholder.unparsed("feature", feature.id), Placeholder.parsed("status", if (feature.enabled) "Enabled" else "Disabled")) + sender.sendPrefixComponent(language.feature.status, Placeholder.unparsed("feature", feature.id), Placeholder.parsed("status", if (feature.enabled) "Enabled" else "Disabled")) } } @@ -371,7 +377,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val field = feature.javaClass.getDeclaredField(context.get("option")) if (field == null) { - sender.sendComponent(language.feature.invalidOption, Placeholder.unparsed("options", feature::class.memberProperties.joinToString(", ") { it.name })) + sender.sendPrefixComponent(language.feature.invalidOption, Placeholder.unparsed("options", feature::class.memberProperties.joinToString(", ") { it.name })) return@handler } @@ -395,12 +401,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set } } } catch (_: Exception) { - sender.sendComponent(language.feature.invalidValue, Placeholder.unparsed("values", field.type.simpleName ?: "N/A")) + sender.sendPrefixComponent(language.feature.invalidValue, Placeholder.unparsed("values", field.type.simpleName ?: "N/A")) return@handler } feature.save() - sender.sendComponent(language.feature.updated, Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("option", field.name), Placeholder.unparsed("state", value)) + sender.sendPrefixComponent(language.feature.updated, Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("option", field.name), Placeholder.unparsed("state", value)) } } @@ -413,9 +419,9 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set suspendingHandler { context -> // TODO: better implementation? val sender = context.sender().platformSender() - sender.sendComponent("Fetching vanish users from database...") - sender.sendComponent("Database Vanished Users: ${VanishAPI.get().getDatabase().getVanishUsers().await().filter { it.isVanished }.map { it.username }}") - sender.sendComponent("Cache Vanished Users: ${VanishAPI.get().getCacheService().getVanishUsers().values.map { it.username }}") + sender.sendPrefixComponent("Fetching vanish users from database...") + sender.sendPrefixComponent("Database Vanished Users: ${VanishAPI.get().getDatabase().getVanishUsers().await().filter { it.isVanished }.map { it.username }}") + sender.sendPrefixComponent("Cache Vanished Users: ${VanishAPI.get().getCacheService().getVanishUsers().values.map { it.username }}") } } @@ -450,10 +456,10 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set } } - sender.sendComponent("[${index + 1}] $userProperties") + sender.sendPrefixComponent("[${index + 1}] $userProperties") } counter.stop() - sender.sendComponent("Took ${counter.get()}ms") + sender.sendPrefixComponent("Took ${counter.get()}ms") } } @@ -470,12 +476,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set repeat(context.get("tries")) { val counter = MilliCounter() counter.start() - sender.sendComponent("[${it + 1}] Trying ${amount} Get Users from data storage") + sender.sendPrefixComponent("[${it + 1}] Trying ${amount} Get Users from data storage") repeat(amount) { database.getVanishUsers().await() } counter.stop() - sender.sendComponent("[${it + 1}] Took ${counter.get()}ms") + sender.sendPrefixComponent("[${it + 1}] Took ${counter.get()}ms") } } } @@ -490,6 +496,13 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set this.putAll(otherKeys) } ))).post().await() - sender.sendComponent(language.paste.use.replace("", key ?: "N/A")) + val pasteKey = key.ifEmpty { "N/A" } + val pasteUrl = if (pasteKey == "N/A") "N/A" else Paste.url(pasteKey) + sender.sendPrefixComponent( + language.paste.use + .replace("https://pastes.dev/", pasteUrl) + .replace("", pasteUrl) + .replace("", pasteKey) + ) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt index b63d935c..e715ea74 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt @@ -69,7 +69,7 @@ data class LanguageConfig( @Serializable data class Paste( - val use: String = "Your paste key is , Make sure to check the content before sharing it with others and remove the data you don't want to share. '>(Click to open in pastes.dev)", + val use: String = "Your paste key is , Make sure to check the content before sharing it with others and remove the data you don't want to share. '>(Click to open paste)", val generating: String = "Generating paste, please wait...", val failedToGenerate: String = "Failed to generate paste, please try again later and make sure your machine is connected to internet.", ) @@ -96,4 +96,4 @@ data class LanguageConfig( return Config.fromFile(File(languageDirectory, "${Settings.get().general.language}.yml")) } } -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt index 320dc1bf..eeae066e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt @@ -39,7 +39,7 @@ class FeatureFly( val user = event.user if (!isActive(user)) return if (!user.hasPermission(Permissions.FLY_KEEP_AFTER_REAPPEAR) && disableOnReappear) { - user.sendMessage(language.feature.flyDisabled) + user.sendMessageWithPrefix(language.feature.flyDisabled) user.player()?.allowFlight = false user.player()?.isFlying = false } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt index b520fe81..6707e224 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt @@ -9,7 +9,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent +import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendPrefixComponent import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -35,7 +35,7 @@ class FeatureRideEntity( .mapNotNull { it.bukkitAdapt().player() } for (vanishedPassenger in vanishedPassengers) { vanishedPassenger.leaveVehicle() - vanishedPassenger.sendComponent(exitMessage) + vanishedPassenger.sendPrefixComponent(exitMessage) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt index 1d7a3feb..d421151f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt @@ -14,7 +14,7 @@ import org.sayandev.sayanvanish.bukkit.SayanVanishPlugin import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser import org.sayandev.sayanvanish.bukkit.config.Settings import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendComponent +import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendPrefixComponent import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendRawComponent import org.sayandev.stickynote.bukkit.* import kotlinx.serialization.Serializable @@ -126,7 +126,7 @@ data class FeatureUpdate( if (!isNewerVersionAvailable(notifyForSnapshotBuilds)) return for (line in updateRequestContent) { - sender.sendComponent(line.replace("", latestVersion())) + sender.sendPrefixComponent(line.replace("", latestVersion())) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt index 73c3b7e9..08bb2a81 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.bukkit.utils +import net.kyori.adventure.text.Component import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.command.CommandSender import org.bukkit.entity.Player @@ -11,7 +12,7 @@ import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component object PlayerUtils { - fun CommandSender.sendComponent(content: String, vararg placeholders: TagResolver) { + fun CommandSender.sendPrefixComponent(content: String, vararg placeholders: TagResolver) { if (content.isBlank()) return val prefix = language.general.prefix @@ -24,6 +25,17 @@ object PlayerUtils { AdventureUtils.sendComponent(this, PlaceholderAPIHook.injectPlaceholders(this as? Player, finalContent).component(*placeholders)) } + fun CommandSender.sendPrefixComponent(content: Component) { + val prefix = language.general.prefix + val finalContent = if (Settings.get().general.includePrefixInMessages) { + prefix.component().append(content) + } else { + content + } + + AdventureUtils.sendComponent(this, finalContent) + } + fun CommandSender.sendRawComponent(content: String, vararg placeholders: TagResolver) { if (content.isBlank()) return AdventureUtils.sendComponent(this, PlaceholderAPIHook.injectPlaceholders(this as? Player, content).component(*placeholders)) From c8f48a8be3fed49d516971c0b65b64370b8fcde8 Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 14:14:58 +0330 Subject: [PATCH 44/67] chore: change noPermissionToKeepVanished message type to prefixed --- .../sayanvanish/bukkit/feature/features/FeatureState.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt index 0802b720..081afc0b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt @@ -76,7 +76,7 @@ class FeatureState( user.isOnline = true if (checkPermissionOnJoin && !user.hasPermission(Permissions.VANISH)) { - user.sendMessage(language.vanish.noPermissionToKeepVanished, Placeholder.unparsed("permission", Permissions.VANISH.permission())) + user.sendMessageWithPrefix(language.vanish.noPermissionToKeepVanished, Placeholder.unparsed("permission", Permissions.VANISH.permission())) user.appear(vanishJoinOptions) launch { user.delete() From 6227a1bfb34e0d0c4e5e08f7c9a11cda6ab53e36 Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 14:22:03 +0330 Subject: [PATCH 45/67] chore: better update checker version handling --- .../sayanvanish/api/utils/VersionUtils.kt | 120 ++++++++++++++++++ .../bukkit/feature/features/FeatureUpdate.kt | 72 ++++++----- .../feature/features/FeatureUpdate.kt | 69 +++++----- 3 files changed, 196 insertions(+), 65 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/VersionUtils.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/VersionUtils.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/VersionUtils.kt new file mode 100644 index 00000000..16e0a694 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/VersionUtils.kt @@ -0,0 +1,120 @@ +package org.sayandev.sayanvanish.api.utils + +object VersionUtils { + fun compare(first: String, second: String): Int { + val firstVersion = ParsedVersion.parse(first) + val secondVersion = ParsedVersion.parse(second) + + if (firstVersion == null && secondVersion == null) { + return first.trim().compareTo(second.trim(), ignoreCase = true) + } + if (firstVersion == null) return -1 + if (secondVersion == null) return 1 + return firstVersion.compareTo(secondVersion) + } + + fun isNewer(candidate: String, current: String): Boolean { + return compare(candidate, current) > 0 + } + + private data class ParsedVersion( + val major: Int, + val minor: Int, + val patch: Int, + val preRelease: List, + ) : Comparable { + override fun compareTo(other: ParsedVersion): Int { + if (major != other.major) return major.compareTo(other.major) + if (minor != other.minor) return minor.compareTo(other.minor) + if (patch != other.patch) return patch.compareTo(other.patch) + + if (preRelease.isEmpty() && other.preRelease.isEmpty()) return 0 + if (preRelease.isEmpty()) return 1 + if (other.preRelease.isEmpty()) return -1 + + val max = maxOf(preRelease.size, other.preRelease.size) + for (index in 0 until max) { + val left = preRelease.getOrNull(index) + val right = other.preRelease.getOrNull(index) + if (left == null) return -1 + if (right == null) return 1 + val cmp = left.compareTo(right) + if (cmp != 0) return cmp + } + return 0 + } + + companion object { + private val trailingCommitPattern = Regex("^(.*)-(?:[0-9a-fA-F]{6,40})$") + private val corePattern = Regex("^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?") + private val numberPattern = Regex("\\d+") + + fun parse(rawVersion: String): ParsedVersion? { + var normalized = rawVersion.trim() + if (normalized.isEmpty()) return null + + normalized = normalized.substringBefore('+') + normalized = normalized.removePrefix("v").removePrefix("V") + + val commitMatch = trailingCommitPattern.matchEntire(normalized) + if (commitMatch != null && commitMatch.groupValues[1].contains('.')) { + normalized = commitMatch.groupValues[1] + } + + val split = normalized.split('-', limit = 2) + val core = split[0] + val preRaw = split.getOrNull(1) + + val coreMatch = corePattern.find(core) ?: return null + val major = coreMatch.groupValues[1].toInt() + val minor = coreMatch.groupValues[2].takeIf { it.isNotEmpty() }?.toInt() ?: 0 + val patch = coreMatch.groupValues[3].takeIf { it.isNotEmpty() }?.toInt() ?: 0 + + val preIdentifiers = + preRaw + ?.replace('-', '.') + ?.replace('_', '.') + ?.split('.') + ?.filter { it.isNotBlank() } + ?.map { token -> + val numeric = token.toIntOrNull() + if (numeric != null) { + Identifier.Numeric(numeric) + } else { + val fromToken = numberPattern.find(token)?.value?.toIntOrNull() + if (fromToken != null && token.all { it.isDigit() }) { + Identifier.Numeric(fromToken) + } else { + Identifier.Text(token.lowercase()) + } + } + } + ?: emptyList() + + return ParsedVersion(major, minor, patch, preIdentifiers) + } + } + } + + private sealed class Identifier : Comparable { + data class Numeric(val value: Int) : Identifier() + + data class Text(val value: String) : Identifier() + + override fun compareTo(other: Identifier): Int { + return when (this) { + is Numeric -> + when (other) { + is Numeric -> value.compareTo(other.value) + is Text -> -1 + } + + is Text -> + when (other) { + is Numeric -> 1 + is Text -> value.compareTo(other.value) + } + } + } + } +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt index d421151f..8c9ae5e8 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt @@ -9,6 +9,7 @@ import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.utils.DownloadUtils import org.sayandev.sayanvanish.api.utils.HangarUtils +import org.sayandev.sayanvanish.api.utils.VersionUtils import org.sayandev.sayanvanish.api.utils.VersionInfo import org.sayandev.sayanvanish.bukkit.SayanVanishPlugin import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser @@ -92,7 +93,7 @@ data class FeatureUpdate( val player = event.player val user = player.cachedUser() ?: return if (!isActive(user)) return - if (notifyOnJoin && player.hasPermission(notifyPermission) && latestRelease != null && latestSnapshot != null) { + if (notifyOnJoin && player.hasPermission(notifyPermission) && latestComparableVersion(notifyForSnapshotBuilds) != null) { if (!Settings.get().general.proxyMode) { sendUpdateNotification(player) } @@ -131,21 +132,28 @@ data class FeatureUpdate( } private fun isNewerVersionAvailable(includeSnapshots: Boolean): Boolean { - if (latestRelease == null || latestSnapshot == null) return false - val currentVersion = plugin.description.version // eg: 1.1.0-SNAPSHOT-build.121-ed8f2b2 - val commitHash = currentVersion.split("-").last() - val snapshotVersion = latestSnapshot!!.name // eg: 1.1.0-SNAPSHOT-build.121 - if (currentVersion.removeSuffix("-${commitHash}") == snapshotVersion) return false - if (includeSnapshots) { - val releaseVersion = latestRelease!!.name // eg: 1.0.1-263f0bf - if (currentVersion.removeSuffix("-${commitHash}") == releaseVersion) return false - } - return true + val target = latestComparableVersion(includeSnapshots) ?: return false + val currentVersion = plugin.description.version + return VersionUtils.isNewer(target.name, currentVersion) } fun updatePlugin(): CompletableFuture { val future = CompletableFuture() - if (!isNewerVersionAvailable(notifyForSnapshotBuilds)) future.complete(false) + if (!isNewerVersionAvailable(notifyForSnapshotBuilds)) { + future.complete(false) + return future + } + + val targetVersion = latestComparableVersion(notifyForSnapshotBuilds) + if (targetVersion == null) { + future.complete(false) + return future + } + val downloadUrl = targetVersion.downloads.PAPER?.downloadUrl() + if (downloadUrl.isNullOrBlank()) { + future.complete(false) + return future + } val updateDirectory = File(plugin.dataFolder.parentFile, "update") val updatedFile = if (StickyNote.isPaper) { @@ -153,36 +161,34 @@ data class FeatureUpdate( File(updateDirectory, SayanVanishPlugin.getInstance().pluginFile().name) } else SayanVanishPlugin.getInstance().pluginFile() - if (plugin.description.version.contains("SNAPSHOT")) { - latestSnapshot?.let { snapshot -> - DownloadUtils.download(snapshot.downloads.PAPER!!.downloadUrl!!, updatedFile).whenComplete { result, error -> - error?.printStackTrace() - future.complete(result) - } - } ?: let { - future.complete(false) - } - } else { - latestRelease?.let { release -> - DownloadUtils.download(release.downloads.PAPER!!.downloadUrl!!, updatedFile).whenComplete { result, error -> - error?.printStackTrace() - future.complete(result) - } - } ?: let { - future.complete(false) - } + DownloadUtils.download(downloadUrl, updatedFile).whenComplete { result, error -> + error?.printStackTrace() + future.complete(result) } return future } fun latestVersion(): String { - return (if (notifyForSnapshotBuilds) latestSnapshot?.name else latestRelease?.name) ?: "N/A" + return latestComparableVersion(notifyForSnapshotBuilds)?.name ?: "N/A" } private val proxyWords = listOf("proxy", "velocity", "bungee") fun willAffectProxy(): Boolean { - return (if (notifyForSnapshotBuilds) proxyWords.any { latestSnapshot?.description?.contains(it) ?: false } else proxyWords.any { latestRelease?.description?.contains(it) ?: false }) ?: false + val targetVersion = latestComparableVersion(notifyForSnapshotBuilds) ?: return false + return proxyWords.any { targetVersion.description.contains(it, ignoreCase = true) } + } + + private fun latestComparableVersion(includeSnapshots: Boolean): VersionInfo? { + val candidates = buildList { + latestRelease?.let(::add) + if (includeSnapshots) { + latestSnapshot?.let(::add) + } + } + return candidates.maxWithOrNull { first, second -> + VersionUtils.compare(first.name, second.name) + } } private fun shortDescription(description: String?): String? { @@ -201,4 +207,4 @@ data class FeatureUpdate( } -} \ No newline at end of file +} diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt index b87002b2..f9437317 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt @@ -7,6 +7,7 @@ import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.utils.DownloadUtils import org.sayandev.sayanvanish.api.utils.HangarUtils +import org.sayandev.sayanvanish.api.utils.VersionUtils import org.sayandev.sayanvanish.api.utils.VersionInfo import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.feature.ListenedFeature @@ -95,7 +96,7 @@ class FeatureUpdate( val user = player.getVanishUser() ?: return@launch if (!isActive(user)) return@launch if (player.hasPermission(notifyBypassPermission)) return@launch - if (notifyOnJoin && latestRelease != null && latestSnapshot != null) { + if (notifyOnJoin && latestComparableVersion(notifyForSnapshotBuilds) != null) { sendUpdateNotification(player) if (autoUpdateNotification) { @@ -133,52 +134,56 @@ class FeatureUpdate( } private fun isNewerVersionAvailable(includeSnapshots: Boolean): Boolean { - if (latestRelease == null || latestSnapshot == null) return false - val currentVersion = plugin.container.description.version.get() // eg: 1.1.0-SNAPSHOT-build.121-ed8f2b2 - val commitHash = currentVersion.split("-").last() - val snapshotVersion = latestSnapshot!!.name // eg: 1.1.0-SNAPSHOT-build.121 - if (currentVersion.removeSuffix("-${commitHash}") == snapshotVersion) return false - if (includeSnapshots) { - val releaseVersion = latestRelease!!.name // eg: 1.0.1-263f0bf - if (currentVersion.removeSuffix("-${commitHash}") == releaseVersion) return false - } - return true + val target = latestComparableVersion(includeSnapshots) ?: return false + val currentVersion = plugin.container.description.version.get() + return VersionUtils.isNewer(target.name, currentVersion) } fun updatePlugin(): CompletableFuture { val future = CompletableFuture() - if (!isNewerVersionAvailable(notifyForSnapshotBuilds)) future.complete(false) + if (!isNewerVersionAvailable(notifyForSnapshotBuilds)) { + future.complete(false) + return future + } val pluginFile = SayanVanishPlugin.getInstance().pluginFile() ?: let { future.complete(false) return future } - if (plugin.container.description.version.get().contains("SNAPSHOT")) { - latestSnapshot?.let { snapshot -> - DownloadUtils.download(snapshot.downloads.VELOCITY!!.downloadUrl!!, pluginFile).whenComplete { result, error -> - error?.printStackTrace() - future.complete(result) - } - } ?: let { - future.complete(false) - } - } else { - latestRelease?.let { release -> - DownloadUtils.download(release.downloads.VELOCITY!!.downloadUrl!!, pluginFile).whenComplete { result, error -> - error?.printStackTrace() - future.complete(result) - } - } ?: let { - future.complete(false) - } + val targetVersion = latestComparableVersion(notifyForSnapshotBuilds) + if (targetVersion == null) { + future.complete(false) + return future + } + val downloadUrl = targetVersion.downloads.VELOCITY?.downloadUrl() + if (downloadUrl.isNullOrBlank()) { + future.complete(false) + return future + } + + DownloadUtils.download(downloadUrl, pluginFile).whenComplete { result, error -> + error?.printStackTrace() + future.complete(result) } return future } fun latestVersion(): String { - return (if (notifyForSnapshotBuilds) latestSnapshot?.name else latestRelease?.name) ?: "N/A" + return latestComparableVersion(notifyForSnapshotBuilds)?.name ?: "N/A" + } + + private fun latestComparableVersion(includeSnapshots: Boolean): VersionInfo? { + val candidates = buildList { + latestRelease?.let(::add) + if (includeSnapshots) { + latestSnapshot?.let(::add) + } + } + return candidates.maxWithOrNull { first, second -> + VersionUtils.compare(first.name, second.name) + } } private fun shortDescription(description: String?): String? { @@ -197,4 +202,4 @@ class FeatureUpdate( } -} \ No newline at end of file +} From 6f5c2279295386e1fadce8c85495a5a8ca61f78d Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 14:28:58 +0330 Subject: [PATCH 46/67] fix: parse placeholders for the correct user in `fake_message` feature --- .../bukkit/feature/features/FeatureFakeMessage.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt index 8a20be8a..52ca9aba 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt @@ -6,6 +6,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer +import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent @@ -21,6 +22,7 @@ import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendRawComponent import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.AdventureUtils +import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component @RegisteredFeature @Serializable @@ -112,7 +114,7 @@ class FeatureFakeMessage( ) ) } else { - player.sendRawComponent(fakeQuitMessage, Placeholder.unparsed("player", user.username)) + player.sendRawComponent(PlaceholderAPIHook.injectPlaceholders(user.offlinePlayer(), fakeQuitMessage), Placeholder.unparsed("player", user.username)) } } } @@ -133,7 +135,7 @@ class FeatureFakeMessage( ) ) } else { - player.sendRawComponent(fakeJoinMessage, Placeholder.unparsed("player", user.username)) + player.sendRawComponent(PlaceholderAPIHook.injectPlaceholders(user.offlinePlayer(), fakeJoinMessage), Placeholder.unparsed("player", user.username)) } } } From 5250b51df3ed7f9e10b0ff15d0b0bbb6d43f201d Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 16:55:37 +0330 Subject: [PATCH 47/67] chore: more powerful api --- .../sayanvanish/api/LifecycleVanishAPI.kt | 8 + .../org/sayandev/sayanvanish/api/Platform.kt | 12 +- .../sayanvanish/api/SayanVanishAPI.kt | 204 ++++++++++++++++-- .../org/sayandev/sayanvanish/api/VanishAPI.kt | 115 +++++++++- .../sayanvanish/api/VisibilityPolicy.kt | 15 ++ .../sayanvanish/api/cache/CacheService.kt | 22 +- .../api/cache/MemoryCacheService.kt | 22 +- .../sayanvanish/api/feature/Feature.kt | 10 +- .../api/feature/FeatureDiscoveryStrategy.kt | 35 +++ .../feature/FeatureInstantiationStrategy.kt | 11 + .../api/feature/FeatureRegistry.kt | 95 ++++++++ .../sayanvanish/api/feature/Features.kt | 67 ++++-- .../api/feature/RegisteredFeatureHandler.kt | 64 ++++-- .../sayanvanish/api/message/MessageConfig.kt | 18 +- .../api/message/MessagingService.kt | 47 +++- .../api/message/TypedMessagingService.kt | 21 +- .../message/types/RedisMessagingService.kt | 2 +- .../types/WebSocketMessagingService.kt | 2 +- .../sayanvanish/api/storage/StorageConfig.kt | 24 ++- .../api/storage/TransactionDatabase.kt | 10 +- .../sayanvanish/api/SimulationTest.kt | 6 +- .../sayanvanish/bukkit/SayanVanishPlugin.kt | 6 +- .../bukkit/command/SayanVanishCommand.kt | 22 +- 23 files changed, 732 insertions(+), 106 deletions(-) create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/LifecycleVanishAPI.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VisibilityPolicy.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureDiscoveryStrategy.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureInstantiationStrategy.kt create mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureRegistry.kt diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/LifecycleVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/LifecycleVanishAPI.kt new file mode 100644 index 00000000..f6312da4 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/LifecycleVanishAPI.kt @@ -0,0 +1,8 @@ +package org.sayandev.sayanvanish.api + +interface LifecycleVanishAPI : VanishAPI { + fun initialize(enableMessaging: Boolean) + fun reloadMessaging(enableMessaging: Boolean) + fun shutdown() + fun reinitialize(enableMessaging: Boolean) +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index 14c64900..290a2c19 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -4,7 +4,6 @@ import kotlinx.coroutines.runBlocking import kotlinx.serialization.modules.EmptySerializersModule import kotlinx.serialization.modules.SerializersModule import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler -import org.sayandev.sayanvanish.api.storage.TransactionDatabase import org.sayandev.stickynote.core.configuration.Config import java.io.File import java.util.logging.Logger @@ -16,7 +15,8 @@ open class Platform( var rootDirectory: File, var serverId: String, val adapter: PlatformAdapter, - val serializers: SerializersModule = EmptySerializersModule() + val serializers: SerializersModule = EmptySerializersModule(), + open val featureScanPackages: Set = setOf("org.sayandev.sayanvanish"), ) { @JvmSynthetic @@ -67,12 +67,6 @@ open class Platform( platform.registerBlocking() - (VanishAPI.get().getDatabase() as? TransactionDatabase)?.let { - if (!it.databaseConnected) { - return false - } - } - register() return true } @@ -83,4 +77,4 @@ open class Platform( -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index 31492471..a6f1a2db 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -1,20 +1,49 @@ package org.sayandev.sayanvanish.api +import kotlinx.coroutines.awaitAll import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.future.asCompletableFuture import org.sayandev.sayanvanish.api.cache.CacheService import org.sayandev.sayanvanish.api.cache.MemoryCacheService +import org.sayandev.sayanvanish.api.feature.DefaultFeatureRegistry +import org.sayandev.sayanvanish.api.feature.Feature +import org.sayandev.sayanvanish.api.feature.FeatureDiscoveryStrategy +import org.sayandev.sayanvanish.api.feature.FeatureInstantiationStrategy +import org.sayandev.sayanvanish.api.feature.FeatureRegistry +import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler +import org.sayandev.sayanvanish.api.message.MessageConfig import org.sayandev.sayanvanish.api.message.MessagingService import org.sayandev.sayanvanish.api.message.TypedMessagingService +import org.sayandev.sayanvanish.api.storage.Database +import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.storage.TransactionDatabase +import org.sayandev.stickynote.core.utils.async import java.util.* +import java.util.concurrent.CompletableFuture -object SayanVanishAPI : VanishAPI { +object SayanVanishAPI : LifecycleVanishAPI { + @Volatile + private var database: Database = TransactionDatabase() - private val database = TransactionDatabase() - private val messagingService = TypedMessagingService() - private val cacheService = MemoryCacheService() + @Volatile + private var messagingService: MessagingService = TypedMessagingService() - override fun getDatabase(): TransactionDatabase { + @Volatile + private var cacheService: CacheService = MemoryCacheService() + + @Volatile + private var featureRegistry: FeatureRegistry = DefaultFeatureRegistry() + + @Volatile + private var visibilityPolicy: VisibilityPolicy = DefaultVisibilityPolicy + + @Volatile + private var initialized = false + + @Volatile + private var messagingEnabled = true + + override fun getDatabase(): Database { return database } @@ -26,42 +55,187 @@ object SayanVanishAPI : VanishAPI { return cacheService } - fun initialize(enableMessaging: Boolean = true) { + override fun getFeatureRegistry(): FeatureRegistry { + return featureRegistry + } + + @JvmStatic + fun database(): Database { + return database + } + + @JvmStatic + fun messagingService(): MessagingService { + return messagingService + } + + @JvmStatic + fun cacheService(): CacheService { + return cacheService + } + + @JvmStatic + fun featureRegistry(): FeatureRegistry { + return featureRegistry + } + + @JvmStatic + fun platform(): Platform { + return Platform.get() + } + + @JvmStatic + fun isInitialized(): Boolean { + return initialized + } + + @JvmStatic + fun useDatabase(database: Database) { + ensureNotInitialized("replace the database") + this.database = database + } + + @JvmStatic + fun useMessagingService(messagingService: MessagingService) { + ensureNotInitialized("replace the messaging service") + this.messagingService = messagingService + } + + @JvmStatic + fun useCacheService(cacheService: CacheService) { + ensureNotInitialized("replace the cache service") + this.cacheService = cacheService + } + + @JvmStatic + fun useFeatureRegistry(featureRegistry: FeatureRegistry) { + ensureNotInitialized("replace the feature registry") + this.featureRegistry = featureRegistry + } + + @JvmStatic + fun useVisibilityPolicy(visibilityPolicy: VisibilityPolicy) { + ensureNotInitialized("replace the visibility policy") + this.visibilityPolicy = visibilityPolicy + } + + @JvmStatic + fun useFeatureDiscoveryStrategy(strategy: FeatureDiscoveryStrategy) { + RegisteredFeatureHandler.setDiscoveryStrategy(strategy) + } + + @JvmStatic + fun useFeatureInstantiationStrategy(strategy: FeatureInstantiationStrategy) { + RegisteredFeatureHandler.setInstantiationStrategy(strategy) + } + + @JvmStatic + fun registerFeatureClass(featureClass: Class) { + RegisteredFeatureHandler.registerFeatureClass(featureClass) + } + + @JvmStatic + fun unregisterFeatureClass(featureClass: Class) { + RegisteredFeatureHandler.unregisterFeatureClass(featureClass) + } + + @JvmStatic + fun clearManualFeatureClasses() { + RegisteredFeatureHandler.clearManualFeatureClasses() + } + + @JvmStatic + fun resetFeatureStrategies() { + RegisteredFeatureHandler.resetStrategies() + } + + @JvmStatic + fun initialize() { + initialize(true) + } + + override fun initialize(enableMessaging: Boolean) { + if (initialized) { + shutdown() + } + runBlocking { + if (database is TransactionDatabase) { + StorageConfig.reload() + } + if (messagingService is TypedMessagingService) { + MessageConfig.reload() + } + + messagingEnabled = enableMessaging database.initialize().await() messagingService.initialize(enableMessaging).await() - cacheService.fetchData() + cacheService.initialize(database).await() for (user in database.getVanishUsers().await().filter { user -> user.serverId == Platform.get().serverId }) { user.isOnline = false - user.saveAndSync() + user.saveAndSync().awaitAll() } - database.purgeUsers(Platform.get().serverId) + database.purgeUsers(Platform.get().serverId).await() + initialized = true } } - fun reloadMessaging(enableMessaging: Boolean) { + override fun reloadMessaging(enableMessaging: Boolean) { runBlocking { + if (messagingService is TypedMessagingService) { + MessageConfig.reload() + } + messagingEnabled = enableMessaging messagingService.reload(enableMessaging).await() } } + override fun shutdown() { + runBlocking { + messagingService.shutdown().await() + cacheService.clear().await() + database.disconnect().await() + } + initialized = false + } + + @JvmStatic + fun reinitialize() { + reinitialize(messagingEnabled) + } + + override fun reinitialize(enableMessaging: Boolean) { + shutdown() + initialize(enableMessaging) + } + override fun getPlatform(): Platform { return Platform.get() } override fun canSee(user: VanishUser?, target: VanishUser): Boolean { - if (!target.isVanished) return true - if (user == null) return false - if (user.uniqueId == target.uniqueId) return true - if (!user.hasPermission(Permissions.VANISH)) return false - return user.vanishLevel >= target.vanishLevel + return visibilityPolicy.canSee(user, target) + } + + private fun ensureNotInitialized(action: String) { + check(!initialized) { "Cannot $action after API initialization. Configure components before calling initialize()." } } suspend fun UUID.user(): VanishUser? { return getDatabase().getVanishUser(this).await() } + @JvmStatic + fun getVanishUserBlocking(uniqueId: UUID): VanishUser? { + return runBlocking { uniqueId.user() } + } + + @JvmStatic + fun getVanishUserFuture(uniqueId: UUID): CompletableFuture { + return async(getDatabase().dispatcher) { uniqueId.user() }.asCompletableFuture() + } + /** * Don't use this method directly, use [VanishAPI.get] instead. * diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt index a41c2c49..da59b7e0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt @@ -1,6 +1,10 @@ package org.sayandev.sayanvanish.api import org.sayandev.sayanvanish.api.cache.CacheService +import org.sayandev.sayanvanish.api.feature.Feature +import org.sayandev.sayanvanish.api.feature.FeatureDiscoveryStrategy +import org.sayandev.sayanvanish.api.feature.FeatureInstantiationStrategy +import org.sayandev.sayanvanish.api.feature.FeatureRegistry import org.sayandev.sayanvanish.api.message.MessagingService import org.sayandev.sayanvanish.api.storage.Database import java.util.* @@ -12,6 +16,8 @@ interface VanishAPI { fun getCacheService(): CacheService + fun getFeatureRegistry(): FeatureRegistry + fun getPlatform(): Platform fun canSee(user: VanishUser?, target: VanishUser): Boolean @@ -19,6 +25,11 @@ interface VanishAPI { companion object { private var defaultInstance: VanishAPI = SayanVanishAPI + private fun lifecycleApi(): LifecycleVanishAPI { + return get() as? LifecycleVanishAPI + ?: throw IllegalStateException("Current VanishAPI instance does not implement LifecycleVanishAPI.") + } + @JvmStatic fun getDefault(): SayanVanishAPI { return SayanVanishAPI @@ -29,6 +40,108 @@ interface VanishAPI { return defaultInstance } + @JvmStatic + fun database(): Database { + return get().getDatabase() + } + + @JvmStatic + fun messagingService(): MessagingService { + return get().getMessagingService() + } + + @JvmStatic + fun cacheService(): CacheService { + return get().getCacheService() + } + + @JvmStatic + fun featureRegistry(): FeatureRegistry { + return get().getFeatureRegistry() + } + + @JvmStatic + fun platform(): Platform { + return get().getPlatform() + } + + @JvmStatic + @JvmOverloads + fun initialize(enableMessaging: Boolean = true) { + lifecycleApi().initialize(enableMessaging) + } + + @JvmStatic + fun reloadMessaging(enableMessaging: Boolean) { + lifecycleApi().reloadMessaging(enableMessaging) + } + + @JvmStatic + fun shutdown() { + lifecycleApi().shutdown() + } + + @JvmStatic + @JvmOverloads + fun reinitialize(enableMessaging: Boolean = true) { + lifecycleApi().reinitialize(enableMessaging) + } + + @JvmStatic + fun useDatabase(database: Database) { + SayanVanishAPI.useDatabase(database) + } + + @JvmStatic + fun useMessagingService(messagingService: MessagingService) { + SayanVanishAPI.useMessagingService(messagingService) + } + + @JvmStatic + fun useCacheService(cacheService: CacheService) { + SayanVanishAPI.useCacheService(cacheService) + } + + @JvmStatic + fun useFeatureRegistry(featureRegistry: FeatureRegistry) { + SayanVanishAPI.useFeatureRegistry(featureRegistry) + } + + @JvmStatic + fun useVisibilityPolicy(visibilityPolicy: VisibilityPolicy) { + SayanVanishAPI.useVisibilityPolicy(visibilityPolicy) + } + + @JvmStatic + fun useFeatureDiscoveryStrategy(strategy: FeatureDiscoveryStrategy) { + SayanVanishAPI.useFeatureDiscoveryStrategy(strategy) + } + + @JvmStatic + fun useFeatureInstantiationStrategy(strategy: FeatureInstantiationStrategy) { + SayanVanishAPI.useFeatureInstantiationStrategy(strategy) + } + + @JvmStatic + fun registerFeatureClass(featureClass: Class) { + SayanVanishAPI.registerFeatureClass(featureClass) + } + + @JvmStatic + fun unregisterFeatureClass(featureClass: Class) { + SayanVanishAPI.unregisterFeatureClass(featureClass) + } + + @JvmStatic + fun clearManualFeatureClasses() { + SayanVanishAPI.clearManualFeatureClasses() + } + + @JvmStatic + fun resetFeatureStrategies() { + SayanVanishAPI.resetFeatureStrategies() + } + @JvmStatic fun set(instance: VanishAPI, platform: Platform) { Platform.get().logger.info("New API instance has been initialized from ${platform.id}") @@ -43,4 +156,4 @@ interface VanishAPI { } } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VisibilityPolicy.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VisibilityPolicy.kt new file mode 100644 index 00000000..2b47c39e --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VisibilityPolicy.kt @@ -0,0 +1,15 @@ +package org.sayandev.sayanvanish.api + +interface VisibilityPolicy { + fun canSee(viewer: VanishUser?, target: VanishUser): Boolean +} + +object DefaultVisibilityPolicy : VisibilityPolicy { + override fun canSee(viewer: VanishUser?, target: VanishUser): Boolean { + if (!target.isVanished) return true + if (viewer == null) return false + if (viewer.uniqueId == target.uniqueId) return true + if (!viewer.hasPermission(Permissions.VANISH)) return false + return viewer.vanishLevel >= target.vanishLevel + } +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt index 01eecb43..c9713013 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt @@ -1,9 +1,29 @@ package org.sayandev.sayanvanish.api.cache +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.runBlocking +import org.sayandev.sayanvanish.api.storage.Database import org.sayandev.sayanvanish.api.cache.caches.IUserCache import org.sayandev.sayanvanish.api.cache.caches.IVanishUserCache interface CacheService { fun getUsers(): IUserCache fun getVanishUsers(): IVanishUserCache -} \ No newline at end of file + + suspend fun initialize(database: Database): Deferred { + return CompletableDeferred(true) + } + + fun initializeBlocking(database: Database): Boolean { + return runBlocking { initialize(database).await() } + } + + suspend fun clear(): Deferred { + return CompletableDeferred(true) + } + + fun clearBlocking(): Boolean { + return runBlocking { clear().await() } + } +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt index 2b0c09df..982c9b13 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt @@ -1,17 +1,29 @@ package org.sayandev.sayanvanish.api.cache +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.api.storage.Database import org.sayandev.sayanvanish.api.cache.caches.IUserCache import org.sayandev.sayanvanish.api.cache.caches.IVanishUserCache import org.sayandev.sayanvanish.api.cache.caches.UserCache import org.sayandev.sayanvanish.api.cache.caches.VanishUserCache class MemoryCacheService : CacheService { - suspend fun fetchData() { - Users.putAll(VanishAPI.get().getDatabase().getUsers().await().filter { it.isOnline }.associateBy(User::uniqueId)) - VanishUsers.putAll(VanishAPI.get().getDatabase().getVanishUsers().await().associateBy(VanishUser::uniqueId)) + override suspend fun initialize(database: Database): Deferred { + Users.clear() + VanishUsers.clear() + + Users.putAll(database.getUsers().await().filter { it.isOnline }.associateBy(User::uniqueId)) + VanishUsers.putAll(database.getVanishUsers().await().associateBy(VanishUser::uniqueId)) + return CompletableDeferred(true) + } + + override suspend fun clear(): Deferred { + Users.clear() + VanishUsers.clear() + return CompletableDeferred(true) } object Users : IUserCache by UserCache() @@ -19,4 +31,4 @@ class MemoryCacheService : CacheService { override fun getUsers() = Users override fun getVanishUsers() = VanishUsers -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt index 1dc6b585..d0d11810 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt @@ -28,7 +28,9 @@ abstract class Feature { } open fun isActive(user: User): Boolean { - return !user.hasPermission("sayanvanish.feature.disable.${id}") && Features.userFeatures(user).find { it.id == this.id }?.enabled != false && isActive() + return !user.hasPermission("sayanvanish.feature.disable.${id}") && + Features.isFeatureEnabled(user, this) && + isActive() } open fun enable() { @@ -106,9 +108,9 @@ abstract class Feature { @JvmStatic fun loadAndRegister(feature: Feature) { - createFromInstance(feature) - feature.save() - Features.addFeature(feature) + val loadedFeature = createFromInstance(feature) + loadedFeature.save() + Features.addFeature(loadedFeature) } } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureDiscoveryStrategy.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureDiscoveryStrategy.kt new file mode 100644 index 00000000..de7c1bc2 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureDiscoveryStrategy.kt @@ -0,0 +1,35 @@ +package org.sayandev.sayanvanish.api.feature + +import org.reflections.Reflections +import org.sayandev.sayanvanish.api.Platform + +interface FeatureDiscoveryStrategy { + fun discover(platform: Platform): Collection> +} + +object DefaultFeatureDiscoveryStrategy : FeatureDiscoveryStrategy { + override fun discover(platform: Platform): Collection> { + val discovered = linkedSetOf>() + val packages = platform.featureScanPackages.ifEmpty { setOf("org.sayandev.sayanvanish") } + + for (packageName in packages) { + val reflections = Reflections(packageName) + val reflectionResults = reflections + .getTypesAnnotatedWith(RegisteredFeature::class.java) + .mapNotNull { it as? Class } + + if (reflectionResults.isNotEmpty()) { + discovered.addAll(reflectionResults) + continue + } + + discovered.addAll( + RegisteredFeatureHandler + .getClassesInPackage(platform, packageName) + .mapNotNull { it as? Class } + ) + } + + return discovered + } +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureInstantiationStrategy.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureInstantiationStrategy.kt new file mode 100644 index 00000000..8f556e34 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureInstantiationStrategy.kt @@ -0,0 +1,11 @@ +package org.sayandev.sayanvanish.api.feature + +interface FeatureInstantiationStrategy { + fun create(type: Class): Feature +} + +object DefaultFeatureInstantiationStrategy : FeatureInstantiationStrategy { + override fun create(type: Class): Feature { + return Feature.createFromConfig(type) + } +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureRegistry.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureRegistry.kt new file mode 100644 index 00000000..683a00b1 --- /dev/null +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureRegistry.kt @@ -0,0 +1,95 @@ +package org.sayandev.sayanvanish.api.feature + +import org.sayandev.sayanvanish.api.User +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArrayList +import java.util.Locale + +interface FeatureRegistry { + fun add(feature: Feature): Boolean + fun remove(feature: Feature): Boolean + fun remove(id: String): Boolean + fun clear() + fun all(): List + fun findById(id: String): Feature? + fun findByType(type: Class): T? + fun isEnabledForUser(user: User, feature: Feature): Boolean + fun setEnabledForUser(user: User, feature: Feature, enabled: Boolean) + fun resetUser(userId: UUID) + fun resetUsers() +} + +class DefaultFeatureRegistry : FeatureRegistry { + private val features = CopyOnWriteArrayList() + private val userDisabledFeatures = ConcurrentHashMap>() + + private fun normalize(id: String): String { + return id.lowercase(Locale.ROOT) + } + + override fun add(feature: Feature): Boolean { + if (features.any { it.id.equals(feature.id, ignoreCase = true) }) { + return false + } + features.add(feature) + return true + } + + override fun remove(feature: Feature): Boolean { + return remove(feature.id) + } + + override fun remove(id: String): Boolean { + val normalizedId = normalize(id) + val removed = features.removeIf { it.id.equals(id, ignoreCase = true) } + if (removed) { + userDisabledFeatures.values.forEach { it.remove(normalizedId) } + } + return removed + } + + override fun clear() { + features.clear() + userDisabledFeatures.clear() + } + + override fun all(): List { + return features.toList() + } + + override fun findById(id: String): Feature? { + return features.firstOrNull { it.id.equals(id, ignoreCase = true) } + } + + override fun findByType(type: Class): T? { + @Suppress("UNCHECKED_CAST") + return features.firstOrNull { type.isInstance(it) } as? T + } + + override fun isEnabledForUser(user: User, feature: Feature): Boolean { + val disabled = userDisabledFeatures[user.uniqueId] ?: return true + return normalize(feature.id) !in disabled + } + + override fun setEnabledForUser(user: User, feature: Feature, enabled: Boolean) { + val disabled = userDisabledFeatures.computeIfAbsent(user.uniqueId) { ConcurrentHashMap.newKeySet() } + val featureId = normalize(feature.id) + if (enabled) { + disabled.remove(featureId) + } else { + disabled.add(featureId) + } + if (disabled.isEmpty()) { + userDisabledFeatures.remove(user.uniqueId) + } + } + + override fun resetUser(userId: UUID) { + userDisabledFeatures.remove(userId) + } + + override fun resetUsers() { + userDisabledFeatures.clear() + } +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt index 714b3160..29c6a991 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt @@ -1,44 +1,83 @@ package org.sayandev.sayanvanish.api.feature import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishAPI import java.util.UUID object Features { - val features = mutableListOf() - val userFeatures = mutableMapOf>() + private fun registry(): FeatureRegistry { + return VanishAPI.get().getFeatureRegistry() + } + + @JvmStatic + inline fun getFeature(): T { + return getFeature(T::class.java) + } @JvmStatic - inline fun getFeature(): T { - return features.find { it is T } as T + fun getFeature(type: Class): T { + return registry().findByType(type) + ?: throw IllegalArgumentException("Feature `${type.simpleName}` is not registered.") } @JvmStatic fun getFeatureById(id: String): Feature? { - return features.find { it.id.equals(id, ignoreCase = true) } + return registry().findById(id) + } + + @JvmStatic + fun addFeature(feature: Feature): Boolean { + return registry().add(feature) } @JvmStatic - inline fun getUserFeature(uniqueId: UUID): T { - return userFeatures[uniqueId] as T + fun removeFeature(feature: Feature): Boolean { + return registry().remove(feature) } @JvmStatic - inline fun getUserFeature(user: User): T { - return getUserFeature(user.uniqueId) + fun removeFeature(id: String): Boolean { + return registry().remove(id) } @JvmStatic - fun addFeature(feature: Feature) { - features.add(feature) + fun clearFeatures() { + registry().clear() } @JvmStatic fun features(): List { - return features + return registry().all() } + @JvmStatic fun userFeatures(user: User): List { - return userFeatures.getOrPut(user.uniqueId) { features() } + return features().filter { registry().isEnabledForUser(user, it) } + } + + @JvmStatic + fun isFeatureEnabled(user: User, feature: Feature): Boolean { + return registry().isEnabledForUser(user, feature) + } + + @JvmStatic + fun setFeatureEnabled(user: User, feature: Feature, enabled: Boolean) { + registry().setEnabledForUser(user, feature, enabled) + } + + @JvmStatic + fun resetUserFeatureState(uniqueId: UUID) { + registry().resetUser(uniqueId) + } + + @JvmStatic + fun resetUserFeatureState(user: User) { + resetUserFeatureState(user.uniqueId) + } + + @JvmStatic + fun resetAllUserFeatureStates() { + registry().resetUsers() } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt index f488406b..feb92ebb 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt @@ -1,6 +1,5 @@ package org.sayandev.sayanvanish.api.feature -import org.reflections.Reflections import org.sayandev.sayanvanish.api.Platform import java.io.IOException import java.net.URL @@ -11,27 +10,62 @@ import java.util.jar.JarFile object RegisteredFeatureHandler { + @Volatile + private var discoveryStrategy: FeatureDiscoveryStrategy = DefaultFeatureDiscoveryStrategy + @Volatile + private var instantiationStrategy: FeatureInstantiationStrategy = DefaultFeatureInstantiationStrategy + + private val manualFeatureClasses = linkedSetOf>() + + @JvmStatic + fun setDiscoveryStrategy(strategy: FeatureDiscoveryStrategy) { + discoveryStrategy = strategy + } + + @JvmStatic + fun setInstantiationStrategy(strategy: FeatureInstantiationStrategy) { + instantiationStrategy = strategy + } + + @JvmStatic + fun resetStrategies() { + discoveryStrategy = DefaultFeatureDiscoveryStrategy + instantiationStrategy = DefaultFeatureInstantiationStrategy + } + + @JvmStatic + fun registerFeatureClass(featureClass: Class) { + manualFeatureClasses.add(featureClass) + } + + @JvmStatic + fun unregisterFeatureClass(featureClass: Class) { + manualFeatureClasses.remove(featureClass) + } + + @JvmStatic + fun clearManualFeatureClasses() { + manualFeatureClasses.clear() + } + + @JvmStatic fun process() { - val reflections = Reflections("org.sayandev.sayanvanish") - val annotatedClasses = if (reflections.getTypesAnnotatedWith(RegisteredFeature::class.java).isEmpty()) { - Platform.get().logger.warning("Couldn't load plugin features in your current server software, trying alternative method...") - getClassesInPackage(Platform.get(), "org.sayandev.sayanvanish") - } else { - reflections.getTypesAnnotatedWith(RegisteredFeature::class.java) - } + val annotatedClasses = linkedSetOf>() + annotatedClasses.addAll(discoveryStrategy.discover(Platform.get())) + annotatedClasses.addAll(manualFeatureClasses) Platform.get().logger.info("Found ${annotatedClasses.size} features.") for (annotatedClass in annotatedClasses) { createNewInstance(annotatedClass) } - Platform.get().logger.info("Enabled ${Features.features.filter { it.isActive() }.size} features.") + Platform.get().logger.info("Enabled ${Features.features().count { it.isActive() }} features.") } - private fun createNewInstance(clazz: Class<*>) { + private fun createNewInstance(clazz: Class) { try { - if (Features.features.map { it.javaClass }.contains(clazz)) return - val instance = Feature.createFromConfig(clazz as Class) + if (Features.features().map { it.javaClass }.contains(clazz)) return + val instance = instantiationStrategy.create(clazz) instance.save() Features.addFeature(instance) } catch (e: NoClassDefFoundError) { @@ -41,6 +75,7 @@ object RegisteredFeatureHandler { } } + @JvmStatic fun getClassesInPackage(plugin: Any, packageName: String): Collection> { val classes: MutableCollection> = ArrayList() val codeSource: CodeSource = plugin.javaClass.protectionDomain.codeSource @@ -66,7 +101,8 @@ object RegisteredFeatureHandler { try { val clazz = plugin.javaClass.classLoader.loadClass(className) if (clazz.isAnnotationPresent(RegisteredFeature::class.java)) { - classes.add(clazz) + @Suppress("UNCHECKED_CAST") + classes.add(clazz as Class) } } catch (_: NoClassDefFoundError) { } catch (_: ClassNotFoundException) { } @@ -82,4 +118,4 @@ object RegisteredFeatureHandler { return classes } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt index 37876049..11233411 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt @@ -9,9 +9,6 @@ import com.charleskorn.kaml.YamlComment import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import java.io.File -// TODO: use a singleton or something, i don't want global scope variables like this anymore -public var messageConfig = MessageConfig.fromConfig() ?: MessageConfig.defaultConfig() - @Serializable class MessageConfig( @YamlComment("Configuration for Redis database") @@ -28,6 +25,14 @@ class MessageConfig( companion object { private const val FILE_NAME = "message.yml" + @Volatile + private var config: MessageConfig = fromConfig() ?: defaultConfig() + + @JvmStatic + fun get(): MessageConfig { + return config + } + @JvmStatic fun defaultConfig(): MessageConfig { return MessageConfig().also { it.save() } @@ -40,7 +45,12 @@ class MessageConfig( @JvmStatic fun reload() { - messageConfig = fromConfig() ?: defaultConfig() + config = fromConfig() ?: defaultConfig() + } + + @JvmStatic + fun set(config: MessageConfig) { + this.config = config } } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt index ae7ef5a1..d08ebe7f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt @@ -1,5 +1,6 @@ package org.sayandev.sayanvanish.api.message +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.runBlocking @@ -12,6 +13,50 @@ import java.util.concurrent.CompletableFuture interface MessagingService { val dispatcher: AsyncDispatcher + suspend fun initialize(enabled: Boolean = true): Deferred { + return CompletableDeferred(true) + } + + fun initializeFuture(enabled: Boolean): CompletableFuture { + return async(dispatcher) { initialize(enabled).await() }.asCompletableFuture() + } + + fun initializeFuture(): CompletableFuture { + return initializeFuture(true) + } + + fun initializeBlocking(enabled: Boolean): Boolean { + return runBlocking { initialize(enabled).await() } + } + + fun initializeBlocking(): Boolean { + return initializeBlocking(true) + } + + suspend fun reload(enabled: Boolean): Deferred { + return initialize(enabled) + } + + fun reloadFuture(enabled: Boolean): CompletableFuture { + return async(dispatcher) { reload(enabled).await() }.asCompletableFuture() + } + + fun reloadBlocking(enabled: Boolean): Boolean { + return runBlocking { reload(enabled).await() } + } + + suspend fun shutdown(): Deferred { + return CompletableDeferred(true) + } + + fun shutdownFuture(): CompletableFuture { + return async(dispatcher) { shutdown().await() }.asCompletableFuture() + } + + fun shutdownBlocking(): Boolean { + return runBlocking { shutdown().await() } + } + suspend fun syncUser(user: User): Deferred fun syncUserFuture(user: User): CompletableFuture { @@ -31,4 +76,4 @@ interface MessagingService { fun syncVanishUserBlocking(vanishUser: VanishUser): Boolean { return runBlocking { syncVanishUser(vanishUser).await() } } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt index 930809ff..951b6f43 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt @@ -15,7 +15,7 @@ class TypedMessagingService: MessagingService { override val dispatcher = AsyncDispatcher( "${Platform.get().pluginName.lowercase()}-messaging-thread", - messageConfig.threadCount + MessageConfig.get().threadCount ) val messageTypes = mutableMapOf() @@ -36,10 +36,10 @@ class TypedMessagingService: MessagingService { } } - suspend fun initialize(enabled: Boolean = true): Deferred { + override suspend fun initialize(enabled: Boolean): Deferred { this.enabled = enabled if (!enabled) { - disable() + shutdown() return CompletableDeferred(true) } if (messageTypes.isNotEmpty()) { @@ -53,12 +53,12 @@ class TypedMessagingService: MessagingService { PayloadWrapper.registerDeserializer(VanishUser::class.java, VanishUser.JsonAdapter()) PayloadWrapper.registerDeserializer(VanishUser::class.java, VanishUser.JsonAdapter()) - val messagingTypes = messageConfig.categoryTypes.map { it.type }.distinct() + val messagingTypes = MessageConfig.get().categoryTypes.map { it.type }.distinct() for (method in messagingTypes) { when { method == MessagingTypes.REDIS -> { messageTypes[MessagingTypes.REDIS] = try { - RedisMessagingService(messageConfig.redis, dispatcher).also { redisMessaging -> + RedisMessagingService(MessageConfig.get().redis, dispatcher).also { redisMessaging -> redisMessaging.connection.connect() redisMessaging.connection.initialize() } @@ -70,7 +70,7 @@ class TypedMessagingService: MessagingService { } method == MessagingTypes.WEBSOCKET -> { messageTypes[MessagingTypes.WEBSOCKET] = try { - WebSocketMessagingService(messageConfig.webSocketConfig, dispatcher) + WebSocketMessagingService(MessageConfig.get().webSocketConfig, dispatcher) } catch (e: Exception) { messagingConnected = false logMessagingConnectionError() @@ -83,9 +83,9 @@ class TypedMessagingService: MessagingService { return CompletableDeferred(true) } - suspend fun reload(enabled: Boolean): Deferred { + override suspend fun reload(enabled: Boolean): Deferred { if (!enabled) { - disable() + shutdown() return CompletableDeferred(true) } @@ -93,7 +93,7 @@ class TypedMessagingService: MessagingService { return CompletableDeferred(true) } - disable() + shutdown() return initialize(true) } @@ -143,11 +143,12 @@ class TypedMessagingService: MessagingService { Platform.get().logger.severe("Here's the full error trace:") } - private suspend fun disable(): Deferred { + override suspend fun shutdown(): Deferred { for ((_, messagingService) in messageTypes) { when (messagingService) { is RedisMessagingService -> messagingService.shutdown().await() is WebSocketMessagingService -> messagingService.shutdown().await() + else -> messagingService.shutdown().await() } } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index 5845b4de..ca5debfa 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -38,7 +38,7 @@ class RedisMessagingService( return syncVanishUserPublisher.sync(vanishUser) } - suspend fun shutdown(): Deferred { + override suspend fun shutdown(): Deferred { syncUserPublisher.shutdown() syncVanishUserPublisher.shutdown() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt index be664463..76235bd8 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -35,7 +35,7 @@ class WebSocketMessagingService( return syncVanishUserPublisher.sync(vanishUser) } - suspend fun shutdown(): Deferred { + override suspend fun shutdown(): Deferred { syncUserPublisher.shutdown() syncVanishUserPublisher.shutdown() return CompletableDeferred(true) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt index 7da352cb..9ebe1c77 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt @@ -12,8 +12,6 @@ import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import org.spongepowered.configurate.serialize.TypeSerializerCollection import java.io.File -public var storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultConfig() - @Serializable class StorageConfig( val transactionThreadCount: Int = 5, @@ -44,8 +42,17 @@ class StorageConfig( companion object { private const val FILE_NAME = "storage.yml" + @JvmStatic val file = File(Platform.get().rootDirectory, FILE_NAME) + @Volatile + private var config: StorageConfig = fromConfig() ?: defaultConfig() + + @JvmStatic + fun get(): StorageConfig { + return config + } + @JvmStatic fun defaultConfig(): StorageConfig { return StorageConfig().also { it.save() } @@ -55,5 +62,16 @@ class StorageConfig( fun fromConfig(): StorageConfig? { return Config.fromFile(File(Platform.get().rootDirectory, FILE_NAME)) } + + @JvmStatic + fun reload(): StorageConfig { + config = fromConfig() ?: defaultConfig() + return config + } + + @JvmStatic + fun set(config: StorageConfig) { + this.config = config + } } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt index b560fc72..990ef059 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt @@ -16,19 +16,19 @@ class TransactionDatabase: Database { override val dispatcher = AsyncDispatcher( "${Platform.get().pluginName.lowercase()}-transaction-thread", - storageConfig.transactionThreadCount, + StorageConfig.get().transactionThreadCount, ) val databaseTypes = mutableMapOf() var databaseConnected: Boolean = true override suspend fun initialize(): Deferred { - val transactionMethods = storageConfig.transactionTypes.map { it.type }.distinct() + val transactionMethods = StorageConfig.get().transactionTypes.map { it.type }.distinct() for (method in transactionMethods) { when (method) { DatabaseType.SQL -> { databaseTypes[DatabaseType.SQL] = try { - SQLDatabase(storageConfig).also { sqlDatabase -> + SQLDatabase(StorageConfig.get()).also { sqlDatabase -> sqlDatabase.connect() sqlDatabase.initialize() } @@ -40,7 +40,7 @@ class TransactionDatabase: Database { } DatabaseType.REDIS -> { databaseTypes[DatabaseType.REDIS] = try { - RedisDatabase(storageConfig).also { redisDatabase -> + RedisDatabase(StorageConfig.get()).also { redisDatabase -> redisDatabase.connect() redisDatabase.initialize() } @@ -201,4 +201,4 @@ class TransactionDatabase: Database { return session.async(dispatcher, CoroutineStart.DEFAULT, block) } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt b/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt index a3f8a5f3..fe3c5d09 100644 --- a/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt +++ b/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.* import org.junit.jupiter.api.parallel.Execution import org.junit.jupiter.api.parallel.ExecutionMode -import org.sayandev.sayanvanish.api.storage.storageConfig +import org.sayandev.sayanvanish.api.storage.StorageConfig import java.io.File import java.util.* import java.util.concurrent.Executors @@ -36,7 +36,7 @@ class SimulationTest { APIPlatformAdapter() ) ) - storageConfig.sql.threadCount = 1 + StorageConfig.get().sql.threadCount = 1 SayanVanishAPI.initialize() } } @@ -237,4 +237,4 @@ class SimulationTest { assert(cachedVanishUser != null) { "VanishUser should be in cache after sync" } assert(cachedVanishUser!!.uniqueId == vanishUser.uniqueId) { "Cached vanish user should match synced user" } }*/ -} \ No newline at end of file +} diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt index 5026bf3e..a808066b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt @@ -8,8 +8,8 @@ import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.storage.DatabaseType +import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.storage.sql.SQLConfig -import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.bukkit.api.Metrics import org.sayandev.sayanvanish.bukkit.command.SayanVanishCommand import org.sayandev.sayanvanish.bukkit.config.Settings @@ -34,7 +34,7 @@ class SayanVanishPlugin : JavaPlugin() { Settings.reload() SayanVanishAPI.initialize(Settings.get().general.proxyMode) - if (Settings.get().general.proxyMode && storageConfig.method == DatabaseType.SQL && storageConfig.sql.method == SQLConfig.SQLMethod.SQLITE) { + if (Settings.get().general.proxyMode && StorageConfig.get().method == DatabaseType.SQL && StorageConfig.get().sql.method == SQLConfig.SQLMethod.SQLITE) { error("The `proxy-mode` is enabled, but the database method is set to SQLite, which might lead to unexpected results. If you're using proxies such as Velocity or BungeeCord, make sure to use a different database method, such as MySQL or Redis.") } @@ -53,7 +53,7 @@ class SayanVanishPlugin : JavaPlugin() { if (Settings.get().general.proxyMode) "On Proxy" else "No Proxy" }) this.addCustomChart(Metrics.SimplePie("database_method") { - storageConfig.method.name + StorageConfig.get().method.name }) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt index 2c130308..4848921f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt @@ -25,7 +25,6 @@ import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import org.sayandev.sayanvanish.api.storage.StorageConfig -import org.sayandev.sayanvanish.api.storage.storageConfig import org.sayandev.sayanvanish.api.message.MessageConfig import org.sayandev.sayanvanish.api.utils.Paste import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser @@ -195,16 +194,16 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set literalWithPermission("reload") handler { context -> val sender = context.sender().platformSender() - Features.features.forEach { feature -> + Features.features().forEach { feature -> feature.disable(true) if (feature::class.java.isAssignableFrom(Listener::class.java)) { unregisterListener(feature as Listener) } } - Features.features.clear() - Features.userFeatures.clear() + Features.clearFeatures() + Features.resetAllUserFeatureStates() Settings.reload() - storageConfig = StorageConfig.fromConfig() ?: StorageConfig.defaultConfig() + StorageConfig.reload() MessageConfig.reload() SayanVanishAPI.reloadMessaging(Settings.get().general.proxyMode) language = LanguageConfig.fromConfig() ?: LanguageConfig.defaultConfig() @@ -292,10 +291,9 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set return@suspendingHandler } - val userFeature = Features.userFeatures(user).find { it.id == feature.id }!! - - userFeature.toggle() - sender.sendPrefixComponent(language.feature.togglePlayer, Placeholder.unparsed("player", target.name), Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("state", if (userFeature.enabled) "enabled" else "disabled")) + val currentlyEnabled = Features.isFeatureEnabled(user, feature) + Features.setFeatureEnabled(user, feature, !currentlyEnabled) + sender.sendPrefixComponent(language.feature.togglePlayer, Placeholder.unparsed("player", target.name), Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("state", if (!currentlyEnabled) "enabled" else "disabled")) return@suspendingHandler } } @@ -342,13 +340,13 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set val feature = context.get("feature") feature.disable() - Features.features.remove(feature) + Features.removeFeature(feature) val freshFeature = feature::class.java.getDeclaredConstructor().newInstance() if (freshFeature.enabled) { freshFeature.enable() } freshFeature.save() - Features.features.add(freshFeature) + Features.addFeature(freshFeature) sender.sendPrefixComponent(language.feature.reset, Placeholder.unparsed("feature", feature.id)) } } @@ -491,7 +489,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set private suspend fun generateMainPaste(sender: CommandSender, otherKeys: Map) { val key = Paste("json", listOf(ServerUtils.getServerData( mutableMapOf( - "database-type" to storageConfig.method.toString(), + "database-type" to StorageConfig.get().method.toString(), ).apply { this.putAll(otherKeys) } From 9877d27a2c5e52f9a459fb8944ad8d4ea7a24859 Mon Sep 17 00:00:00 2001 From: Syrent Date: Tue, 24 Feb 2026 21:23:51 +0330 Subject: [PATCH 48/67] chore: rename bukkit module to paper; chore: remove bungeecord module --- README.md | 8 +- build.gradle.kts | 7 +- .../sayandev/sayanvanish/bukkit/Hello.java | 5 -- .../sayandev/sayanvanish/bukkit/HelloKT.kt | 5 -- .../bukkit/api/BukkitPlatformAdapter.kt | 23 ----- .../build.gradle.kts | 0 .../sayanvanish/paper/PaperPlatform.kt | 74 ++++++++-------- .../sayanvanish/paper}/SayanVanishLoader.kt | 2 +- .../sayanvanish/paper}/SayanVanishPlugin.kt | 14 ++- .../sayanvanish/paper}/VanishManager.kt | 10 +-- .../sayanvanish/paper}/api/Metrics.kt | 4 +- .../paper/api/PaperPlatformAdapter.kt | 23 +++++ .../sayanvanish/paper/api/PaperUser.kt | 12 +-- .../sayanvanish/paper/api/PaperVanishUser.kt | 30 +++---- .../paper}/api/SayanVanishBukkitAPI.kt | 11 ++- .../paper/api/event/PaperUserUnVanishEvent.kt | 8 +- .../paper/api/event/PaperUserVanishEvent.kt | 8 +- .../paper}/command/SayanVanishCommand.kt | 22 ++--- .../paper}/config/LanguageConfig.kt | 4 +- .../sayanvanish/paper}/config/Settings.kt | 4 +- .../sayanvanish/paper}/feature/HookFeature.kt | 2 +- .../paper}/feature/ListenedFeature.kt | 2 +- .../feature/features/FeatureActionbar.kt | 16 ++-- .../paper}/feature/features/FeatureEffect.kt | 12 +-- .../feature/features/FeatureFakeMessage.kt | 19 ++-- .../paper}/feature/features/FeatureFly.kt | 14 +-- .../feature/features/FeatureGameMode.kt | 15 ++-- .../features/FeatureInventoryInspect.kt | 6 +- .../features/FeatureInvulnerability.kt | 12 +-- .../paper}/feature/features/FeatureLevel.kt | 18 ++-- .../features/FeatureRegisterPermissions.kt | 14 +-- .../feature/features/FeatureRideEntity.kt | 10 +-- .../features/FeatureSilentContainer.kt | 11 ++- .../paper}/feature/features/FeatureState.kt | 10 +-- .../paper}/feature/features/FeatureUpdate.kt | 14 +-- .../features/hook/AdvancedServerListImpl.kt | 6 +- .../hook/FeatureHookAdvancedServerList.kt | 4 +- .../features/hook/FeatureHookCitizens.kt | 8 +- .../features/hook/FeatureHookDiscordSRV.kt | 12 +-- .../features/hook/FeatureHookDynmap.kt | 12 +-- .../features/hook/FeatureHookEssentials.kt | 6 +- .../features/hook/FeatureHookLuckPerms.kt | 8 +- .../hook/FeatureHookMiniPlaceholders.kt | 10 +-- .../features/hook/FeatureHookPl3xMap.kt | 12 +-- .../hook/FeatureHookPlaceholderAPI.kt | 8 +- .../features/hook/FeatureHookSquareMap.kt | 12 +-- .../feature/features/hook/FeatureHookTAB.kt | 13 ++- .../prevent/FeatureLegacyPreventPickup.kt | 6 +- .../FeaturePreventAdvancementAnnounce.kt | 8 +- .../prevent/FeaturePreventBlockBreak.kt | 7 +- .../prevent/FeaturePreventBlockGrief.kt | 7 +- .../prevent/FeaturePreventBlockPlace.kt | 7 +- .../features/prevent/FeaturePreventChat.kt | 9 +- .../prevent/FeaturePreventCreatureTarget.kt | 11 ++- .../features/prevent/FeaturePreventDamage.kt | 7 +- .../prevent/FeaturePreventFoodLevelChange.kt | 6 +- .../prevent/FeaturePreventInteract.kt | 7 +- .../features/prevent/FeaturePreventPickup.kt | 8 +- .../features/prevent/FeaturePreventPush.kt | 13 ++- .../prevent/FeaturePreventRaidTrigger.kt | 8 +- .../features/prevent/FeaturePreventSculk.kt | 7 +- .../prevent/FeaturePreventServerPing.kt | 6 +- .../prevent/FeaturePreventSpawnerSpawn.kt | 8 +- .../prevent/FeaturePreventTabComplete.kt | 6 +- .../paper}/utils/PermissionUtils.kt | 2 +- .../sayanvanish/paper}/utils/PlayerUtils.kt | 6 +- .../sayanvanish/paper}/utils/ServerUtils.kt | 3 +- .../build.gradle.kts | 37 -------- .../src/main/kotlin/BungeePlatformAdapter.kt | 14 --- .../sayanvanish/bungeecord/SayanVanish.kt | 43 ---------- .../sayanvanish/bungeecord/VanishManager.kt | 31 ------- .../sayanvanish/bungeecord/api/BungeeUser.kt | 27 ------ .../bungeecord/api/BungeeVanishUser.kt | 86 ------------------- .../bungeecord/api/SayanVanishBungeeAPI.kt | 35 -------- .../event/BungeeUserUnVanishEvent.kt | 18 ---- .../bungeecord/event/BungeeUserVanishEvent.kt | 18 ---- .../bungeecord/feature/HookFeature.kt | 28 ------ .../bungeecord/feature/ListenedFeature.kt | 28 ------ .../feature/features/FeatureSyncEvents.kt | 50 ----------- .../features/prevent/FeaturePreventChat.kt | 38 -------- .../prevent/FeaturePreventTabComplete.kt | 45 ---------- .../bungeecord/utils/PlayerUtils.kt | 34 -------- .../src/main/resources/plugin.yml | 5 -- settings.gradle.kts | 3 +- 84 files changed, 320 insertions(+), 922 deletions(-) delete mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/Hello.java delete mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/HelloKT.kt delete mode 100644 sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitPlatformAdapter.kt rename {sayanvanish-bukkit => sayanvanish-paper}/build.gradle.kts (100%) rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt (50%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/SayanVanishLoader.kt (90%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/SayanVanishPlugin.kt (85%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/VanishManager.kt (78%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/api/Metrics.kt (99%) create mode 100644 sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt (86%) rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt (88%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/api/SayanVanishBukkitAPI.kt (94%) rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserUnVanishEvent.kt (81%) rename sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserVanishEvent.kt => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserVanishEvent.kt (80%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/command/SayanVanishCommand.kt (96%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/config/LanguageConfig.kt (97%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/config/Settings.kt (95%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/HookFeature.kt (93%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/ListenedFeature.kt (91%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureActionbar.kt (78%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureEffect.kt (92%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureFakeMessage.kt (88%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureFly.kt (75%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureGameMode.kt (86%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureInventoryInspect.kt (91%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureInvulnerability.kt (76%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureLevel.kt (90%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureRegisterPermissions.kt (62%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureRideEntity.kt (78%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureSilentContainer.kt (91%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureState.kt (92%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/FeatureUpdate.kt (95%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/AdvancedServerListImpl.kt (92%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookAdvancedServerList.kt (83%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookCitizens.kt (89%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookDiscordSRV.kt (84%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookDynmap.kt (76%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookEssentials.kt (91%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookLuckPerms.kt (92%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookMiniPlaceholders.kt (93%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookPl3xMap.kt (76%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookPlaceholderAPI.kt (95%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookSquareMap.kt (77%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/hook/FeatureHookTAB.kt (71%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeatureLegacyPreventPickup.kt (83%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt (82%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventBlockBreak.kt (76%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventBlockGrief.kt (76%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventBlockPlace.kt (76%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventChat.kt (87%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventCreatureTarget.kt (74%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventDamage.kt (76%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventFoodLevelChange.kt (83%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventInteract.kt (91%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventPickup.kt (75%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventPush.kt (84%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventRaidTrigger.kt (74%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventSculk.kt (87%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventServerPing.kt (87%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventSpawnerSpawn.kt (82%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/feature/features/prevent/FeaturePreventTabComplete.kt (90%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/utils/PermissionUtils.kt (91%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/utils/PlayerUtils.kt (90%) rename {sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit => sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper}/utils/ServerUtils.kt (96%) delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/build.gradle.kts delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/BungeePlatformAdapter.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserUnVanishEvent.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserVanishEvent.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/ListenedFeature.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventChat.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/utils/PlayerUtils.kt delete mode 100644 sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/resources/plugin.yml diff --git a/README.md b/README.md index 8efe4487..61b38a09 100644 --- a/README.md +++ b/README.md @@ -128,14 +128,14 @@ The dependency artifact for the main API is `sayanvanish-api`. **Platform-Specific Dependencies** -For platform-specific dependencies, the artifact ID follows the format `sayanvanish-`. Examples include `sayanvanish-bukkit` and `sayanvanish-proxy-velocity`. +For platform-specific dependencies, the artifact ID follows the format `sayanvanish-`. Examples include `sayanvanish-paper` and `sayanvanish-proxy-velocity`. **In Maven** ```xml org.sayandev - sayanvanish-bukkit + sayanvanish-paper [get version from github] ``` @@ -145,13 +145,13 @@ For platform-specific dependencies, the artifact ID follows the format `sayanvan * **Groovy** ```groovy -compileOnly "org.sayandev:sayanvanish-bukkit:[get version from github]" +compileOnly "org.sayandev:sayanvanish-paper:[get version from github]" ``` * **Kotlin** ```kotlin -compileOnly("org.sayandev:sayanvanish-bukkit:[get version from github]") +compileOnly("org.sayandev:sayanvanish-paper:[get version from github]") ``` #### Accessing the API diff --git a/build.gradle.kts b/build.gradle.kts index bc239e45..37982033 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -286,7 +286,7 @@ hangarPublish { platforms { register(Platforms.PAPER) { - jar.set(project(":sayanvanish-bukkit").tasks.shadowJar.flatMap { it.archiveFile }) + jar.set(project(":sayanvanish-paper").tasks.shadowJar.flatMap { it.archiveFile }) platformVersions.set((property("paperVersion") as String).split(",").map { it.trim() }) } @@ -294,11 +294,6 @@ hangarPublish { jar.set(project(":sayanvanish-proxy:sayanvanish-proxy-velocity").tasks.shadowJar.flatMap { it.archiveFile }) platformVersions.set((property("velocityVersion") as String).split(",").map { it.trim() }) } - - register(Platforms.WATERFALL) { - jar.set(project(":sayanvanish-proxy:sayanvanish-proxy-bungeecord").tasks.shadowJar.flatMap { it.archiveFile }) - platformVersions.set((property("waterfallVersion") as String).split(",").map { it.trim() }) - } } } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/Hello.java b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/Hello.java deleted file mode 100644 index 1f59ab59..00000000 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/Hello.java +++ /dev/null @@ -1,5 +0,0 @@ -class Main { - public static void main(String[] args) { - System.out.println("Hello World!"); - } -} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/HelloKT.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/HelloKT.kt deleted file mode 100644 index a289ba69..00000000 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/HelloKT.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.sayandev.sayanvanish.bukkit - -fun main() { - println("Hello from Kotlin") -} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitPlatformAdapter.kt b/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitPlatformAdapter.kt deleted file mode 100644 index 795ca006..00000000 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitPlatformAdapter.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.sayandev.sayanvanish.bukkit.api - -import org.sayandev.sayanvanish.api.PlatformAdapter -import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.api.VanishUser - -object BukkitPlatformAdapter : PlatformAdapter { - override fun adapt(user: User): BukkitUser { - return BukkitUser(user.uniqueId, user.username, user.isOnline, user.serverId) - } - - override fun adapt(vanishUser: VanishUser): BukkitVanishUser { - return BukkitVanishUser(vanishUser.uniqueId, vanishUser.username).also { - it.currentOptions = vanishUser.currentOptions - it.isVanished = vanishUser.isVanished - it.vanishLevel = vanishUser.vanishLevel - } - } - - fun get(): BukkitPlatformAdapter { - return this - } -} \ No newline at end of file diff --git a/sayanvanish-bukkit/build.gradle.kts b/sayanvanish-paper/build.gradle.kts similarity index 100% rename from sayanvanish-bukkit/build.gradle.kts rename to sayanvanish-paper/build.gradle.kts diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt similarity index 50% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt index cf34b7f8..f7a6b573 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/BukkitPlatform.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit +package org.sayandev.sayanvanish.paper import kotlinx.serialization.modules.PolymorphicModuleBuilder import kotlinx.serialization.modules.SerializersModule @@ -6,51 +6,49 @@ import kotlinx.serialization.modules.polymorphic import kotlinx.serialization.modules.subclass import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.feature.Feature -import org.sayandev.sayanvanish.bukkit.api.BukkitPlatformAdapter -import org.sayandev.sayanvanish.bukkit.config.Settings -import org.sayandev.sayanvanish.bukkit.feature.HookFeature -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureActionbar -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureEffect -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureFakeMessage -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureFly -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureGameMode -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureInventoryInspect -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureInvulnerability -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureRegisterPermissions -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureRideEntity -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureSilentContainer -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureState -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureUpdate -import org.sayandev.sayanvanish.bukkit.feature.features.hook.* -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeatureLegacyPreventPickup -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventAdvancementAnnounce -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventBlockBreak -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventBlockGrief -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventBlockPlace -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventChat -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventCreatureTarget -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventDamage -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventFoodLevelChange -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventInteract -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventPickup -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventPush -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventRaidTrigger -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventSculk -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventServerPing -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventSpawnerSpawn -import org.sayandev.sayanvanish.bukkit.feature.features.prevent.FeaturePreventTabComplete +import org.sayandev.sayanvanish.paper.api.PaperPlatformAdapter +import org.sayandev.sayanvanish.paper.config.Settings +import org.sayandev.sayanvanish.paper.feature.features.FeatureActionbar +import org.sayandev.sayanvanish.paper.feature.features.FeatureEffect +import org.sayandev.sayanvanish.paper.feature.features.FeatureFakeMessage +import org.sayandev.sayanvanish.paper.feature.features.FeatureFly +import org.sayandev.sayanvanish.paper.feature.features.FeatureGameMode +import org.sayandev.sayanvanish.paper.feature.features.FeatureInventoryInspect +import org.sayandev.sayanvanish.paper.feature.features.FeatureInvulnerability +import org.sayandev.sayanvanish.paper.feature.features.FeatureLevel +import org.sayandev.sayanvanish.paper.feature.features.FeatureRegisterPermissions +import org.sayandev.sayanvanish.paper.feature.features.FeatureRideEntity +import org.sayandev.sayanvanish.paper.feature.features.FeatureSilentContainer +import org.sayandev.sayanvanish.paper.feature.features.FeatureState +import org.sayandev.sayanvanish.paper.feature.features.FeatureUpdate +import org.sayandev.sayanvanish.paper.feature.features.hook.* +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeatureLegacyPreventPickup +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventAdvancementAnnounce +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventBlockBreak +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventBlockGrief +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventBlockPlace +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventChat +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventCreatureTarget +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventDamage +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventFoodLevelChange +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventInteract +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventPickup +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventPush +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventRaidTrigger +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventSculk +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventServerPing +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventSpawnerSpawn +import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventTabComplete import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.pluginDirectory -class BukkitPlatform : Platform( +class PaperPlatform : Platform( "bukkit", plugin.name, plugin.logger, pluginDirectory, Settings.get().general.serverId, - BukkitPlatformAdapter, + PaperPlatformAdapter, SerializersModule { fun PolymorphicModuleBuilder.registerProjectSubclasses() { /* Hooks */ diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishLoader.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishLoader.kt similarity index 90% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishLoader.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishLoader.kt index 049717d3..7e83905c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishLoader.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishLoader.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit +package org.sayandev.sayanvanish.paper import io.papermc.paper.plugin.loader.PluginClasspathBuilder import io.papermc.paper.plugin.loader.PluginLoader diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt similarity index 85% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt index a808066b..9f2af12f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/SayanVanishPlugin.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt @@ -1,7 +1,6 @@ -package org.sayandev.sayanvanish.bukkit +package org.sayandev.sayanvanish.paper import kotlinx.coroutines.runBlocking -import kotlinx.serialization.Serializable import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin import org.sayandev.sayanvanish.api.Platform @@ -10,14 +9,13 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.storage.DatabaseType import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.storage.sql.SQLConfig -import org.sayandev.sayanvanish.bukkit.api.Metrics -import org.sayandev.sayanvanish.bukkit.command.SayanVanishCommand -import org.sayandev.sayanvanish.bukkit.config.Settings -import org.sayandev.sayanvanish.bukkit.config.language +import org.sayandev.sayanvanish.paper.api.Metrics +import org.sayandev.sayanvanish.paper.command.SayanVanishCommand +import org.sayandev.sayanvanish.paper.config.Settings +import org.sayandev.sayanvanish.paper.config.language import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.WrappedStickyNotePlugin import org.sayandev.stickynote.bukkit.error -import org.sayandev.stickynote.loader.bukkit.StickyNoteBukkitLoader import java.io.File class SayanVanishPlugin : JavaPlugin() { @@ -26,7 +24,7 @@ class SayanVanishPlugin : JavaPlugin() { WrappedStickyNotePlugin(this) setInstance(this) - if (!Platform.setAndRegister(BukkitPlatform())) { + if (!Platform.setAndRegister(PaperPlatform())) { Bukkit.getPluginManager().disablePlugin(this) return } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt similarity index 78% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt index 73688104..7b2d8113 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/VanishManager.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit +package org.sayandev.sayanvanish.paper import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority @@ -6,10 +6,10 @@ import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddUser -import org.sayandev.sayanvanish.bukkit.config.Settings +import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getOrAddUser +import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.registerListener diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/Metrics.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/Metrics.kt similarity index 99% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/Metrics.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/Metrics.kt index fb4a5a3c..e7bc11e3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/Metrics.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/Metrics.kt @@ -12,7 +12,7 @@ * * Violations will result in a ban of your plugin and account from bStats. */ -package org.sayandev.sayanvanish.bukkit.api +package org.sayandev.sayanvanish.paper.api import org.bukkit.Bukkit import org.bukkit.configuration.file.YamlConfiguration @@ -82,7 +82,7 @@ class Metrics(private val plugin: Plugin, serviceId: Int) { } metricsBase = MetricsBase( - "bukkit", + "paper", serverUUID, serviceId, enabled, diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt new file mode 100644 index 00000000..f6e514f6 --- /dev/null +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt @@ -0,0 +1,23 @@ +package org.sayandev.sayanvanish.paper.api + +import org.sayandev.sayanvanish.api.PlatformAdapter +import org.sayandev.sayanvanish.api.User +import org.sayandev.sayanvanish.api.VanishUser + +object PaperPlatformAdapter : PlatformAdapter { + override fun adapt(user: User): PaperUser { + return PaperUser(user.uniqueId, user.username, user.isOnline, user.serverId) + } + + override fun adapt(vanishUser: VanishUser): PaperVanishUser { + return PaperVanishUser(vanishUser.uniqueId, vanishUser.username).also { + it.currentOptions = vanishUser.currentOptions + it.isVanished = vanishUser.isVanished + it.vanishLevel = vanishUser.vanishLevel + } + } + + fun get(): PaperPlatformAdapter { + return this + } +} \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt similarity index 86% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt index 1e9ec261..c32276d5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitUser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.api +package org.sayandev.sayanvanish.paper.api import net.kyori.adventure.audience.Audience import net.kyori.adventure.text.Component @@ -8,15 +8,15 @@ import org.bukkit.permissions.Permission import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.bukkit.utils.PermissionUtils.asBukkitPermissionDefault -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendPrefixComponent +import org.sayandev.sayanvanish.paper.utils.PermissionUtils.asBukkitPermissionDefault +import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent import org.sayandev.stickynote.bukkit.extension.sendComponent import org.sayandev.stickynote.bukkit.extension.sendComponentActionbar import org.sayandev.stickynote.bukkit.utils.AdventureUtils import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import java.util.* -class BukkitUser( +class PaperUser( override val uniqueId: UUID, override var username: String, override var isOnline: Boolean, @@ -57,8 +57,8 @@ class BukkitUser( companion object { @JvmSynthetic - fun User.bukkitAdapt(): BukkitUser { - return BukkitPlatformAdapter.adapt(this) + fun User.bukkitAdapt(): PaperUser { + return PaperPlatformAdapter.adapt(this) } } } \ No newline at end of file diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt similarity index 88% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt index 7dffe3b3..f07f71c4 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/BukkitVanishUser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.api +package org.sayandev.sayanvanish.paper.api import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.Bukkit @@ -11,13 +11,13 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Features -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.config.Settings -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel -import org.sayandev.sayanvanish.bukkit.feature.features.hook.FeatureHookLuckPerms +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.config.Settings +import org.sayandev.sayanvanish.paper.config.language +import org.sayandev.sayanvanish.paper.feature.features.FeatureLevel +import org.sayandev.sayanvanish.paper.feature.features.hook.FeatureHookLuckPerms import org.sayandev.stickynote.bukkit.hasPlugin import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.plugin @@ -25,7 +25,7 @@ import org.sayandev.stickynote.bukkit.server import org.sayandev.stickynote.bukkit.utils.ServerVersion import java.util.* -open class BukkitVanishUser( +open class PaperVanishUser( override val uniqueId: UUID, override var username: String ) : VanishUser { @@ -56,7 +56,7 @@ open class BukkitVanishUser( fun offlinePlayer(): OfflinePlayer = Bukkit.getOfflinePlayer(uniqueId) override fun disappear(options: VanishOptions) { - val vanishEvent = BukkitUserVanishEvent(this, options) + val vanishEvent = PaperUserVanishEvent(this, options) server.pluginManager.callEvent(vanishEvent) if (vanishEvent.isCancelled) return val options = vanishEvent.options @@ -78,7 +78,7 @@ open class BukkitVanishUser( } override fun appear(options: VanishOptions) { - val unVanishEvent = BukkitUserUnVanishEvent(this, options) + val unVanishEvent = PaperUserUnVanishEvent(this, options) server.pluginManager.callEvent(unVanishEvent) if (unVanishEvent.isCancelled) return val options = unVanishEvent.options @@ -185,8 +185,8 @@ open class BukkitVanishUser( companion object { @JvmStatic - fun fromUser(vanishUser: VanishUser): BukkitVanishUser { - return BukkitVanishUser(vanishUser.uniqueId, vanishUser.username).apply { + fun fromUser(vanishUser: VanishUser): PaperVanishUser { + return PaperVanishUser(vanishUser.uniqueId, vanishUser.username).apply { this.isOnline = vanishUser.isOnline this.isVanished = vanishUser.isVanished this.vanishLevel = vanishUser.vanishLevel @@ -194,8 +194,8 @@ open class BukkitVanishUser( } @JvmSynthetic - fun VanishUser.bukkitAdapt(): BukkitVanishUser { - return BukkitPlatformAdapter.adapt(this) + fun VanishUser.bukkitAdapt(): PaperVanishUser { + return PaperPlatformAdapter.adapt(this) } } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishBukkitAPI.kt similarity index 94% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishBukkitAPI.kt index 4a6ba5d5..86ef4195 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishBukkitAPI.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.api +package org.sayandev.sayanvanish.paper.api import kotlinx.coroutines.Deferred import org.bukkit.Bukkit @@ -6,7 +6,6 @@ import org.bukkit.OfflinePlayer import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.bukkit.config.Settings import java.util.* class SayanVanishBukkitAPI { @@ -20,7 +19,7 @@ class SayanVanishBukkitAPI { suspend fun UUID.getOrCreateUser(): User { val offlinePlayer = Bukkit.getOfflinePlayer(this) val player = offlinePlayer.player - return VanishAPI.get().getDatabase().getUser(this).await() ?: BukkitVanishUser( + return VanishAPI.get().getDatabase().getUser(this).await() ?: PaperVanishUser( this, offlinePlayer.name ?: this.toString() ) @@ -40,7 +39,7 @@ class SayanVanishBukkitAPI { @JvmSynthetic fun UUID.getCachedOrCreateUser(): User { - return VanishAPI.get().getCacheService().getUsers().getUser(this) ?: BukkitVanishUser( + return VanishAPI.get().getCacheService().getUsers().getUser(this) ?: PaperVanishUser( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", ) @@ -53,7 +52,7 @@ class SayanVanishBukkitAPI { @JvmSynthetic suspend fun UUID.getOrCreateVanishUser(): VanishUser { - return VanishAPI.get().getDatabase().getVanishUser(this).await() ?: BukkitVanishUser( + return VanishAPI.get().getDatabase().getVanishUser(this).await() ?: PaperVanishUser( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", ) @@ -75,7 +74,7 @@ class SayanVanishBukkitAPI { @JvmSynthetic fun UUID.getCachedOrCreateVanishUser(): VanishUser { - return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) ?: BukkitVanishUser( + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this) ?: PaperVanishUser( this, Bukkit.getOfflinePlayer(this).name ?: "N/A", ) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserUnVanishEvent.kt similarity index 81% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserUnVanishEvent.kt index ded94ac2..0770b890 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserUnVanishEvent.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserUnVanishEvent.kt @@ -1,14 +1,14 @@ -package org.sayandev.sayanvanish.bukkit.api.event +package org.sayandev.sayanvanish.paper.api.event import org.bukkit.event.Cancellable import org.bukkit.event.Event import org.bukkit.event.HandlerList import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser +import org.sayandev.sayanvanish.paper.api.PaperVanishUser // TODO: Implement a universal event api -class BukkitUserUnVanishEvent( - val user: BukkitVanishUser, +class PaperUserUnVanishEvent( + val user: PaperVanishUser, val options: VanishOptions, ) : Event(), Cancellable { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserVanishEvent.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserVanishEvent.kt similarity index 80% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserVanishEvent.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserVanishEvent.kt index 78e958ee..3036bcaf 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/api/event/BukkitUserVanishEvent.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserVanishEvent.kt @@ -1,13 +1,13 @@ -package org.sayandev.sayanvanish.bukkit.api.event +package org.sayandev.sayanvanish.paper.api.event import org.bukkit.event.Cancellable import org.bukkit.event.Event import org.bukkit.event.HandlerList import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser +import org.sayandev.sayanvanish.paper.api.PaperVanishUser -class BukkitUserVanishEvent( - val user: BukkitVanishUser, +class PaperUserVanishEvent( + val user: PaperVanishUser, val options: VanishOptions, ) : Event(), Cancellable { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt similarity index 96% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt index 4848921f..2f0d1c8a 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/command/SayanVanishCommand.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.command +package org.sayandev.sayanvanish.paper.command import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.OfflinePlayer @@ -27,16 +27,16 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.message.MessageConfig import org.sayandev.sayanvanish.api.utils.Paste -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.config.LanguageConfig -import org.sayandev.sayanvanish.bukkit.config.Settings -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureLevel -import org.sayandev.sayanvanish.bukkit.feature.features.FeatureUpdate -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendPrefixComponent -import org.sayandev.sayanvanish.bukkit.utils.ServerUtils +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.user +import org.sayandev.sayanvanish.paper.config.LanguageConfig +import org.sayandev.sayanvanish.paper.config.Settings +import org.sayandev.sayanvanish.paper.config.language +import org.sayandev.sayanvanish.paper.feature.features.FeatureLevel +import org.sayandev.sayanvanish.paper.feature.features.FeatureUpdate +import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent +import org.sayandev.sayanvanish.paper.utils.ServerUtils import org.sayandev.stickynote.bukkit.* import org.sayandev.stickynote.bukkit.command.BukkitCommand import org.sayandev.stickynote.bukkit.command.BukkitSender diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt similarity index 97% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt index e715ea74..045b09a3 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/LanguageConfig.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt @@ -1,8 +1,6 @@ -package org.sayandev.sayanvanish.bukkit.config +package org.sayandev.sayanvanish.paper.config import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient -import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import org.sayandev.stickynote.bukkit.pluginDirectory import org.sayandev.stickynote.core.configuration.Config import java.io.File diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt similarity index 95% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt index 23021c2e..3d28a11b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/config/Settings.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt @@ -1,12 +1,10 @@ -package org.sayandev.sayanvanish.bukkit.config +package org.sayandev.sayanvanish.paper.config import com.charleskorn.kaml.YamlComment import org.sayandev.sayanvanish.api.Platform import org.sayandev.stickynote.bukkit.pluginDirectory import org.sayandev.stickynote.core.configuration.Config import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient -import org.sayandev.sayanvanish.api.feature.Feature.Companion.directory import java.io.File import java.util.* diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt similarity index 93% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt index 6a885974..39e9b60c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/HookFeature.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature +package org.sayandev.sayanvanish.paper.feature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt similarity index 91% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt index 45732c6b..c7533e48 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/ListenedFeature.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature +package org.sayandev.sayanvanish.paper.feature import kotlinx.serialization.Serializable import org.bukkit.event.Listener diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt similarity index 78% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt index d9bb3369..49babe7f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureActionbar.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import com.charleskorn.kaml.YamlComment import kotlinx.coroutines.delay @@ -6,18 +6,16 @@ import kotlinx.coroutines.isActive import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import net.kyori.adventure.text.Component import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.onlinePlayers -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component @RegisteredFeature @Serializable @@ -35,14 +33,14 @@ class FeatureActionbar( override var enabled: Boolean = true @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!isActive(user)) return user.sendActionbar(content) } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!isActive(user)) return user.sendActionbar("") diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt similarity index 92% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt index 5ba50657..30fa0f27 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureEffect.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import kotlinx.serialization.Contextual import kotlinx.serialization.KSerializer @@ -12,9 +12,9 @@ import org.bukkit.event.EventHandler import org.bukkit.potion.PotionEffect import org.bukkit.potion.PotionEffectType import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.nms.NMSUtils.sendPacket import org.sayandev.stickynote.bukkit.nms.PacketUtils import org.sayandev.stickynote.bukkit.utils.ServerVersion @@ -67,7 +67,7 @@ data class FeatureEffect( override var enabled: Boolean = true @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!isActive(user)) return val player = user.player() ?: return @@ -81,7 +81,7 @@ data class FeatureEffect( } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!isActive(user)) return val player = user.player() ?: return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt similarity index 88% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt index 52ca9aba..0937d3bc 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName @@ -6,7 +6,6 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer -import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent @@ -14,15 +13,13 @@ import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendRawComponent +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendRawComponent import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook import org.sayandev.stickynote.bukkit.onlinePlayers -import org.sayandev.stickynote.bukkit.utils.AdventureUtils -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component @RegisteredFeature @Serializable @@ -100,7 +97,7 @@ class FeatureFakeMessage( } @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!isActive(user)) return if (!event.options.sendMessage) return @@ -121,7 +118,7 @@ class FeatureFakeMessage( } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!event.options.sendMessage) return if (!isActive(user)) return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFly.kt similarity index 75% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFly.kt index eeae066e..fb34e063 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureFly.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFly.kt @@ -1,13 +1,13 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.config.language +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName @@ -25,7 +25,7 @@ class FeatureFly( override var enabled: Boolean = true @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!isActive(user)) return if (user.hasPermission(Permissions.FLY)) { @@ -35,7 +35,7 @@ class FeatureFly( } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!isActive(user)) return if (!user.hasPermission(Permissions.FLY_KEEP_AFTER_REAPPEAR) && disableOnReappear) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt similarity index 86% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt index 94440793..52493b41 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureGameMode.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.GameMode import org.bukkit.entity.Player @@ -6,12 +6,11 @@ import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerGameModeChangeEvent import org.bukkit.event.player.PlayerToggleSneakEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote.runSync -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName @@ -73,7 +72,7 @@ class FeatureGameMode( } @EventHandler - fun onVanish(event: BukkitUserVanishEvent) { + fun onVanish(event: PaperUserVanishEvent) { val user = event.user val player = user.player() ?: return if (player.gameMode == GameMode.SPECTATOR) return @@ -85,7 +84,7 @@ class FeatureGameMode( } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user val player = user.player() ?: return player.gameMode = sneakMap[player] ?: fallbackMode diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt similarity index 91% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt index b6037d23..83b3aab5 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInventoryInspect.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -12,8 +12,8 @@ import org.bukkit.event.inventory.InventoryType import org.bukkit.event.player.PlayerInteractAtEntityEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.plugin import java.util.* diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt similarity index 76% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt index eb223d77..ed510cd8 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureInvulnerability.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt @@ -1,12 +1,12 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment @@ -27,7 +27,7 @@ class FeatureInvulnerability( override var condition: Boolean = ServerVersion.supports(9) @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!isActive(user)) return if (user.hasPermission(Permissions.INVULNERABLE)) { @@ -36,7 +36,7 @@ class FeatureInvulnerability( } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!user.hasPermission(Permissions.INVULNERABLE) || disableOnReappear) { user.player()?.isInvulnerable = false diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt similarity index 90% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt index bb1f0d20..8af9a167 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureLevel.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.GameMode import org.bukkit.entity.Player @@ -8,12 +8,12 @@ import org.bukkit.event.player.PlayerJoinEvent import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.* import org.sayandev.stickynote.bukkit.nms.NMSUtils import org.sayandev.stickynote.bukkit.nms.NMSUtils.sendPacket @@ -48,7 +48,7 @@ class FeatureLevel( @Transient override val critical: Boolean = true @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!isActive(user)) return runSync({ @@ -69,7 +69,7 @@ class FeatureLevel( } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!isActive(user) || !seeAsSpectator) return runSync({ diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRegisterPermissions.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt similarity index 62% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRegisterPermissions.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt index 10fba239..3a0bfa9f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRegisterPermissions.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt @@ -1,24 +1,14 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features -import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerJoinEvent -import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.Permissions -import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.launch +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.plugin @RegisteredFeature diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt similarity index 78% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt index 6707e224..96cae597 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import kotlinx.serialization.SerialName import org.bukkit.entity.Player @@ -6,10 +6,10 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerInteractEntityEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendPrefixComponent +import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt similarity index 91% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt index b5695d5d..c2f75679 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureSilentContainer.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import com.cryptomorin.xseries.XMaterial import kotlinx.serialization.SerialName @@ -15,10 +15,9 @@ import org.bukkit.event.player.PlayerTeleportEvent import org.bukkit.inventory.CraftingInventory import org.bukkit.util.Vector import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.runSync import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable @@ -87,7 +86,7 @@ class FeatureSilentContainer: ListenedFeature() { } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val player = event.user.player() if (player != null) { containerPlayersData[player.uniqueId]?.apply(player) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt similarity index 92% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt index 081afc0b..f7e5f560 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureState.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName @@ -14,10 +14,10 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.config.language +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.launch @RegisteredFeature diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt similarity index 95% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt index 8c9ae5e8..723fb551 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/FeatureUpdate.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features +package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.Bukkit import org.bukkit.command.CommandSender @@ -11,12 +11,12 @@ import org.sayandev.sayanvanish.api.utils.DownloadUtils import org.sayandev.sayanvanish.api.utils.HangarUtils import org.sayandev.sayanvanish.api.utils.VersionUtils import org.sayandev.sayanvanish.api.utils.VersionInfo -import org.sayandev.sayanvanish.bukkit.SayanVanishPlugin -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedUser -import org.sayandev.sayanvanish.bukkit.config.Settings -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendPrefixComponent -import org.sayandev.sayanvanish.bukkit.utils.PlayerUtils.sendRawComponent +import org.sayandev.sayanvanish.paper.SayanVanishPlugin +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedUser +import org.sayandev.sayanvanish.paper.config.Settings +import org.sayandev.sayanvanish.paper.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent +import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendRawComponent import org.sayandev.stickynote.bukkit.* import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt similarity index 92% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt index baa06de2..4aae1f21 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/AdvancedServerListImpl.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import ch.andre601.advancedserverlist.api.AdvancedServerListAPI import ch.andre601.advancedserverlist.api.PlaceholderProvider @@ -7,8 +7,8 @@ import ch.andre601.advancedserverlist.api.objects.GenericPlayer import ch.andre601.advancedserverlist.api.objects.GenericServer import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.config.language +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.config.language import org.sayandev.stickynote.bukkit.onlinePlayers // TODO: we have so many placeholder providers, maybe we should create a common base class for them? diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookAdvancedServerList.kt similarity index 83% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookAdvancedServerList.kt index ce33520c..439d9353 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -1,8 +1,8 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import kotlinx.serialization.SerialName import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.feature.HookFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt similarity index 89% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt index fd3a8e06..442468a4 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import net.citizensnpcs.api.ai.speech.SpeechContext import net.citizensnpcs.api.ai.speech.event.NPCSpeechEvent @@ -8,9 +8,9 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt similarity index 84% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt index 1d3186ca..3d9bdd1e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDiscordSRV.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt @@ -1,13 +1,13 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import github.scarsz.discordsrv.DiscordSRV import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment @@ -47,7 +47,7 @@ private class DiscordSRVImpl(val feature: FeatureHookDiscordSRV): Listener { } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!feature.isActive(user)) return if (!feature.sendJoinMessageOnUnvanish) return @@ -57,7 +57,7 @@ private class DiscordSRVImpl(val feature: FeatureHookDiscordSRV): Listener { } @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!feature.isActive(user)) return if (!feature.sendQuitMessageOnVanish) return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt similarity index 76% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt index 61aabad4..b6556c47 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookDynmap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import kotlinx.serialization.SerialName import org.bukkit.Bukkit @@ -6,9 +6,9 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.dynmap.DynmapAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -38,14 +38,14 @@ private class DynmapHookImpl(val feature: FeatureHookDynmap): Listener { } @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!feature.isActive(user)) return api.setPlayerVisiblity(user.username, false) } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!feature.isActive(user)) return api.setPlayerVisiblity(user.username, true) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt similarity index 91% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt index 6a46c91c..905ac270 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import net.ess3.api.events.AfkStatusChangeEvent import net.ess3.api.events.PrivateMessagePreSendEvent @@ -6,8 +6,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt similarity index 92% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt index bcdc6b26..687cfeab 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookLuckPerms.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt @@ -1,7 +1,6 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import com.charleskorn.kaml.YamlComment -import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -14,12 +13,11 @@ import net.luckperms.api.node.NodeEqualityPredicate import net.luckperms.api.node.types.PermissionNode import net.luckperms.api.query.QueryOptions import org.bukkit.Bukkit -import org.bukkit.Location import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.warn import java.util.* diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt similarity index 93% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt index 2c135e32..c93871ef 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import io.github.miniplaceholders.api.Expansion import io.github.miniplaceholders.api.utils.Tags @@ -9,10 +9,10 @@ import net.kyori.adventure.text.minimessage.tag.Tag import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.config.Settings -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.config.Settings +import org.sayandev.sayanvanish.paper.config.language +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt similarity index 76% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt index 6a51695a..2d2036d0 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPl3xMap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt @@ -1,13 +1,13 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import kotlinx.serialization.SerialName import net.pl3x.map.core.Pl3xMap import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -36,14 +36,14 @@ private class Pl3xMapHookImpl(val feature: FeatureHookPl3xMap): Listener { } @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!feature.isActive(user)) return Pl3xMap.api().playerRegistry.get(user.uniqueId)?.setHidden(true, false) } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!feature.isActive(user)) return Pl3xMap.api().playerRegistry.get(user.uniqueId)?.setHidden(false, false) diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt similarity index 95% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt index 0c112873..779206c9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -1,13 +1,13 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import me.clip.placeholderapi.expansion.PlaceholderExpansion import org.bukkit.OfflinePlayer import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.config.language +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook import org.sayandev.stickynote.bukkit.onlinePlayers diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt similarity index 77% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt index b9aed26d..422fdf6f 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookSquareMap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt @@ -1,12 +1,12 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -36,14 +36,14 @@ private class SquaremapHookImpl(val feature: FeatureHookSquareMap): Listener { } @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!feature.isActive(user)) return user.player()?.uniqueId?.let { SquaremapProvider.get().playerManager().hide(it, true) } } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!feature.isActive(user)) return user.player()?.uniqueId?.let { SquaremapProvider.get().playerManager().show(it, true) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt similarity index 71% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt index 2686cb9b..55f48cb9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt @@ -1,16 +1,13 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.hook +package org.sayandev.sayanvanish.paper.feature.features.hook import me.neznamy.tab.api.TabPlayer import me.neznamy.tab.api.integration.VanishIntegration -import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.feature.HookFeature +import org.sayandev.sayanvanish.paper.api.PaperVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.plugin import kotlinx.serialization.Serializable -import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName import kotlinx.serialization.Transient @@ -45,7 +42,7 @@ private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegrati override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { if (viewer.uniqueId == target.uniqueId) return true - val viewerUser = viewer.uniqueId.cachedVanishUser() ?: BukkitVanishUser(viewer.uniqueId, viewer.name) + val viewerUser = viewer.uniqueId.cachedVanishUser() ?: PaperVanishUser(viewer.uniqueId, viewer.name) val targetUser = target.uniqueId.cachedVanishUser() ?: return true return viewerUser.canSee(targetUser) } diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt similarity index 83% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt index e46735ae..b26669d4 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeatureLegacyPreventPickup.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -7,8 +7,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerPickupItemEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion @RegisteredFeature diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt similarity index 82% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt index 78164934..b6be8cf8 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt @@ -1,14 +1,12 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerAdvancementDoneEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt similarity index 76% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt index 757a71c0..09db634d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockBreak.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler @@ -6,9 +6,8 @@ import org.bukkit.event.EventPriority import org.bukkit.event.block.BlockBreakEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt similarity index 76% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt index 72dc7fe1..b0dd905d 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockGrief.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.entity.Player @@ -6,9 +6,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityChangeBlockEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt similarity index 76% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt index 2cc4fd22..41d2f799 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventBlockPlace.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler @@ -6,9 +6,8 @@ import org.bukkit.event.EventPriority import org.bukkit.event.block.BlockPlaceEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt similarity index 87% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt index 359d6320..2408e66e 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName @@ -13,12 +13,11 @@ import org.bukkit.event.player.AsyncPlayerChatEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.config.language -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.config.language +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.plugin -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component @RegisteredFeature @Serializable diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt similarity index 74% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt index e1785812..fcfc60a9 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventCreatureTarget.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.entity.Mob @@ -7,10 +7,9 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityTargetEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -24,7 +23,7 @@ class FeaturePreventCreatureTarget: ListenedFeature() { @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler - private fun preventEntityTargetOnVanish(event: BukkitUserVanishEvent) { + private fun preventEntityTargetOnVanish(event: PaperUserVanishEvent) { val user = event.user val player = user.player() ?: return for (entity in player.world.entities.filterIsInstance()) { diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt similarity index 76% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt index 1630b75f..d425d787 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventDamage.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.entity.Player @@ -6,9 +6,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityDamageByEntityEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt similarity index 83% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt index acc8f92e..65d6baee 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventFoodLevelChange.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.entity.Player @@ -6,8 +6,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.FoodLevelChangeEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt similarity index 91% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt index 8e1eb025..c3f2078c 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventInteract.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import com.cryptomorin.xseries.XMaterial import org.bukkit.block.Container @@ -9,9 +9,8 @@ import org.bukkit.event.player.PlayerInteractEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt similarity index 75% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt index 3272f744..424385e2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPickup.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt @@ -1,15 +1,13 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityPickupItemEvent -import org.bukkit.event.player.PlayerPickupItemEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt similarity index 84% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt index ebe99eab..9902efcb 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventPush.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName @@ -6,12 +6,11 @@ import org.bukkit.event.EventHandler import org.bukkit.scoreboard.Team import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserUnVanishEvent -import org.sayandev.sayanvanish.bukkit.api.event.BukkitUserVanishEvent -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent +import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.hasPlugin -import org.sayandev.stickynote.bukkit.warn import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -26,7 +25,7 @@ class FeaturePreventPush: ListenedFeature() { @Transient override val category: FeatureCategories = FeatureCategories.PREVENTION @EventHandler - private fun onVanish(event: BukkitUserVanishEvent) { + private fun onVanish(event: PaperUserVanishEvent) { val user = event.user if (!isActive(user)) return val player = user.player() ?: return @@ -46,7 +45,7 @@ class FeaturePreventPush: ListenedFeature() { } @EventHandler - private fun onUnVanish(event: BukkitUserUnVanishEvent) { + private fun onUnVanish(event: PaperUserUnVanishEvent) { val user = event.user if (!isActive(user)) return val player = user.player() ?: return diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt similarity index 74% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt index 8d97b8f1..a531d645 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventRaidTrigger.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt @@ -1,14 +1,12 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.event.EventHandler import org.bukkit.event.raid.RaidTriggerEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.event.registerListener +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt similarity index 87% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt index b73b45cf..bf066d49 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSculk.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName import org.bukkit.entity.Player @@ -10,9 +10,8 @@ import org.bukkit.event.player.PlayerInteractEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt similarity index 87% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt index 22f5ceb5..76476bad 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventServerPing.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import com.destroystokyo.paper.event.server.PaperServerListPingEvent import kotlinx.serialization.SerialName @@ -6,8 +6,8 @@ import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.BukkitVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt similarity index 82% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt index 4997c6bb..2120a6ee 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventSpawnerSpawn.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt @@ -1,15 +1,13 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import com.destroystokyo.paper.event.entity.PreSpawnerSpawnEvent import kotlinx.serialization.SerialName import org.bukkit.GameMode import org.bukkit.event.EventHandler -import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.user -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.utils.ServerVersion diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt similarity index 90% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt index 1d0e2b70..a89add16 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.feature.features.prevent +package org.sayandev.sayanvanish.paper.feature.features.prevent import org.bukkit.entity.Player import org.bukkit.event.EventHandler @@ -10,8 +10,8 @@ import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser -import org.sayandev.sayanvanish.bukkit.feature.ListenedFeature +import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PermissionUtils.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PermissionUtils.kt similarity index 91% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PermissionUtils.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PermissionUtils.kt index 832ddb8a..9deaf434 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PermissionUtils.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PermissionUtils.kt @@ -1,4 +1,4 @@ -package org.sayandev.sayanvanish.bukkit.utils +package org.sayandev.sayanvanish.paper.utils import org.bukkit.permissions.PermissionDefault import org.sayandev.sayanvanish.api.PermissionDefaults diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt similarity index 90% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt index 08bb2a81..5855872b 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/PlayerUtils.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt @@ -1,11 +1,11 @@ -package org.sayandev.sayanvanish.bukkit.utils +package org.sayandev.sayanvanish.paper.utils import net.kyori.adventure.text.Component import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.command.CommandSender import org.bukkit.entity.Player -import org.sayandev.sayanvanish.bukkit.config.Settings -import org.sayandev.sayanvanish.bukkit.config.language +import org.sayandev.sayanvanish.paper.config.Settings +import org.sayandev.sayanvanish.paper.config.language import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook import org.sayandev.stickynote.bukkit.utils.AdventureUtils import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component diff --git a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/ServerUtils.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt similarity index 96% rename from sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/ServerUtils.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt index bd4b59d3..86e7fbd2 100644 --- a/sayanvanish-bukkit/src/main/kotlin/org/sayandev/sayanvanish/bukkit/utils/ServerUtils.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt @@ -1,11 +1,10 @@ -package org.sayandev.sayanvanish.bukkit.utils +package org.sayandev.sayanvanish.paper.utils import com.google.gson.GsonBuilder import com.google.gson.JsonArray import com.google.gson.JsonObject import org.bukkit.plugin.Plugin import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.bukkit.api.SayanVanishBukkitAPI import org.sayandev.stickynote.bukkit.onlinePlayers import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.server diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/build.gradle.kts b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/build.gradle.kts deleted file mode 100644 index 8ab807cc..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/build.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -import org.sayandev.plugin.StickyNoteModules - -plugins { - id("net.minecrell.plugin-yml.bungee") version "0.6.0" -} - -stickynote { - modules(StickyNoteModules.BUNGEECORD) -} - -dependencies { - compileOnly(libs.bungeecord.api) - - api(project(":sayanvanish-proxy")) -} - -modrinth { - loaders.set(listOf("bungeecord", "waterfall")) - detectLoaders.set(false) -} - -bungee { - name = rootProject.name - version = rootProject.version as String - description = rootProject.description - - main = "${rootProject.group}.${findProperty("slug")!! as String}.bungeecord.${rootProject.name}" - - author = findProperty("author")!! as String -} - -modrinth { - loaders.set(listOf( - "bungeecord", - "waterfall", - )) -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/BungeePlatformAdapter.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/BungeePlatformAdapter.kt deleted file mode 100644 index 74ebfcee..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/BungeePlatformAdapter.kt +++ /dev/null @@ -1,14 +0,0 @@ -import org.sayandev.sayanvanish.api.PlatformAdapter -import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.bungeecord.api.BungeeVanishUser - -object BungeePlatformAdapter : PlatformAdapter { - override fun adapt(user: VanishUser): BungeeVanishUser { - return BungeeVanishUser.fromUser(user) - } - - @JvmStatic - fun get(): BungeePlatformAdapter { - return BungeePlatformAdapter - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt deleted file mode 100644 index 3cc7be14..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/SayanVanish.kt +++ /dev/null @@ -1,43 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord - -import BungeePlatformAdapter -import kotlinx.coroutines.runBlocking -import net.md_5.bungee.api.plugin.Plugin -import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI -import org.sayandev.sayanvanish.proxy.config.settings -import org.sayandev.stickynote.bungeecord.dataDirectory -import org.sayandev.stickynote.bungeecord.registerListener -import org.sayandev.stickynote.bungeecord.server -import org.sayandev.stickynote.loader.bungee.StickyNoteBungeeLoader - -class SayanVanish : Plugin() { - - override fun onEnable() { - StickyNoteBungeeLoader(this) - // Do NOT set server id here, SettingsConfig can't be used because it depends on Platform rootDirectory - Platform.get().rootDirectory = dataDirectory - if (!Platform.setAndRegister(Platform("bungeecord", this.description.name, logger, dataDirectory, "", BungeePlatformAdapter))) return - Platform.get().serverId = settings.general.serverId - - SayanVanishBungeeAPI - - registerListener(VanishManager) - - runBlocking { - if (settings.general.purgeOnlineHistoryOnStartup) { - for (onlineServer in server.servers) { - SayanVanishBungeeAPI.getDatabase().purgeUsers(onlineServer.value.name) - } - SayanVanishBungeeAPI.getDatabase().purgeUsers(settings.general.serverId) - } - } - } - - override fun onDisable() { - Platform.get().onDisable() - StickyNote.shutdown() - SayanVanishBungeeAPI.getInstance().database.disconnect() - SayanVanishAPI.getInstance().database.disconnect() - } -} diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt deleted file mode 100644 index 46e6d89d..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/VanishManager.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord - -import net.md_5.bungee.api.event.PlayerDisconnectEvent -import net.md_5.bungee.api.event.ServerConnectedEvent -import net.md_5.bungee.api.plugin.Listener -import net.md_5.bungee.event.EventHandler -import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI.getOrCreateUser -import org.sayandev.stickynote.bungeecord.launch - -object VanishManager : Listener { - - @EventHandler - fun onPostLogin(event: ServerConnectedEvent) { - val player = event.player ?: return - launch { - SayanVanishBungeeAPI.getDatabase().saveUser(User.of(player.uniqueId, player.name, true, player.server.info.name ?: Platform.get().id)) - player.getOrCreateUser() - } - } - - fun onDisconnect(event: PlayerDisconnectEvent) { - val player = event.player ?: return - launch { - SayanVanishBungeeAPI.getDatabase().removeUser(player.uniqueId) - } - } - -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt deleted file mode 100644 index 19e72313..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeUser.kt +++ /dev/null @@ -1,27 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.api - -import net.md_5.bungee.api.connection.ProxiedPlayer -import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.User -import org.sayandev.stickynote.bungeecord.launch - -class BungeeUser { - companion object { - fun ProxiedPlayer.generateUser(): User { - return User.of( - this.uniqueId, - this.name, - this.isConnected, - this.server?.info?.name - ) - } - - fun ProxiedPlayer.generateAndSaveUser(): User { - val user = this.generateUser() - launch { - SayanVanishAPI.get().getDatabase().saveUser(user) - } - return user - } - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt deleted file mode 100644 index aebd636f..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/BungeeVanishUser.kt +++ /dev/null @@ -1,86 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.api - -import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver -import net.md_5.bungee.api.connection.ProxiedPlayer -import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bungeecord.event.BungeeUserUnVanishEvent -import org.sayandev.sayanvanish.bungeecord.event.BungeeUserVanishEvent -import org.sayandev.sayanvanish.bungeecord.utils.PlayerUtils.sendComponent -import org.sayandev.sayanvanish.proxy.config.settings -import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.component -import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.sendActionbar -import org.sayandev.stickynote.bungeecord.StickyNote -import org.sayandev.stickynote.bungeecord.launch -import org.sayandev.stickynote.bungeecord.plugin -import java.util.UUID - - -open class BungeeVanishUser( - override val uniqueId: UUID, - override var username: String -) : VanishUser { - - override var serverId = settings.general.serverId - override var currentOptions = VanishOptions.defaultOptions() - override var isVanished = false - override var isOnline: Boolean = false - override var vanishLevel: Int = 1 - - init { - launch { - isOnline = SayanVanishAPI.getDatabase().hasUser(uniqueId).await() - } - } - - fun stateText(isVanished: Boolean = this.isVanished) = if (isVanished) "ON" else "OFF" - - fun player(): ProxiedPlayer? = StickyNote.getPlayer(uniqueId) - - override suspend fun disappear(options: VanishOptions) { - val vanishEvent = plugin.proxy.pluginManager.callEvent(BungeeUserVanishEvent(this, options)) - if (vanishEvent.isCancelled) return - - val options = vanishEvent.options - currentOptions = options - - SayanVanishAPI.getDatabase().saveToQueue(uniqueId, true) - super.disappear(options) - } - - override suspend fun appear(options: VanishOptions) { - val vanishEvent = plugin.proxy.pluginManager.callEvent(BungeeUserUnVanishEvent(this, options)) - if (vanishEvent.isCancelled) return - - val options = vanishEvent.options - currentOptions = options - - SayanVanishAPI.getDatabase().saveToQueue(uniqueId, false) - super.appear(options) - } - - override fun hasPermission(permission: String): Boolean { - return player()?.hasPermission(permission) == true - } - - override fun sendMessage(content: String, vararg placeholder: TagResolver) { - player()?.sendComponent(content.component()) - } - - override fun sendActionbar(content: String, vararg placeholder: TagResolver) { - player()?.sendActionbar(content.component()) - } - - companion object { - @JvmStatic - fun fromUser(vanishUser: VanishUser): BungeeVanishUser { - return BungeeVanishUser(vanishUser.uniqueId, vanishUser.username).apply { - this.isOnline = vanishUser.isOnline - this.isVanished = vanishUser.isVanished - this.vanishLevel = vanishUser.vanishLevel - } - } - } - -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt deleted file mode 100644 index 58d3ebc9..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/api/SayanVanishBungeeAPI.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.api - -import BungeePlatformAdapter -import net.md_5.bungee.api.connection.ProxiedPlayer -import org.sayandev.sayanvanish.api.PlatformAdapter -import org.sayandev.sayanvanish.api.SayanVanishAPI -import org.sayandev.sayanvanish.api.SayanVanishAPI.user -import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.api.VanishUser - -object SayanVanishBungeeAPI : VanishAPI by SayanVanishAPI, PlatformAdapter by BungeePlatformAdapter { - @JvmStatic - fun get(): SayanVanishBungeeAPI { - return this - } - - @JvmStatic - suspend fun ProxiedPlayer.user(): VanishUser? { - return this.uniqueId.user() - } - - @JvmStatic - suspend fun ProxiedPlayer.getOrCreateUser(): VanishUser { - return getDatabase().getVanishUser(this.uniqueId).await() ?: VanishUser.of(this.uniqueId, this.name ?: "N/A") - } - - @JvmStatic - suspend fun ProxiedPlayer.getOrAddUser(): VanishUser { - return getDatabase().getVanishUser(this.uniqueId).await() ?: let { - val newUser = BungeeVanishUser(this.uniqueId, this.name ?: "N/A") - getDatabase().saveVanishUser(newUser).await() - newUser - } - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserUnVanishEvent.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserUnVanishEvent.kt deleted file mode 100644 index 9f1ed270..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserUnVanishEvent.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.event - -import net.md_5.bungee.api.plugin.Cancellable -import net.md_5.bungee.api.plugin.Event -import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bungeecord.api.BungeeVanishUser - -class BungeeUserUnVanishEvent(val user: BungeeVanishUser, val options: VanishOptions): Event(), Cancellable { - private var cancelled = false - - override fun isCancelled(): Boolean { - return cancelled - } - - override fun setCancelled(cancelled: Boolean) { - this.cancelled = cancelled - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserVanishEvent.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserVanishEvent.kt deleted file mode 100644 index 1318a78f..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/event/BungeeUserVanishEvent.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.event - -import net.md_5.bungee.api.plugin.Cancellable -import net.md_5.bungee.api.plugin.Event -import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.bungeecord.api.BungeeVanishUser - -class BungeeUserVanishEvent(val user: BungeeVanishUser, val options: VanishOptions): Event(), Cancellable { - private var cancelled = false - - override fun isCancelled(): Boolean { - return cancelled - } - - override fun setCancelled(cancelled: Boolean) { - this.cancelled = cancelled - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt deleted file mode 100644 index 1bfab1df..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/HookFeature.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.feature - -import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.stickynote.bungeecord.hasPlugin -import kotlinx.serialization.Serializable - -@Serializable -abstract class HookFeature( - id: String, - @Transient val plugin: String, - enabled: Boolean = true, - category: FeatureCategories = FeatureCategories.HOOK, -) : ListenedFeature(id, enabled, category) { - - fun hasPlugin(): Boolean { - return hasPlugin(plugin) - } - - override fun isActive(): Boolean { - return super.isActive() && hasPlugin() - } - - override fun isActive(user: User): Boolean { - return super.isActive(user) && hasPlugin() - } - -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/ListenedFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/ListenedFeature.kt deleted file mode 100644 index 3d149803..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/ListenedFeature.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.feature - -import net.md_5.bungee.api.plugin.Listener -import org.sayandev.sayanvanish.api.feature.Feature -import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.stickynote.bungeecord.StickyNote.registerListener -import kotlinx.serialization.Serializable -import org.spongepowered.configurate.serialize.TypeSerializerCollection - -@Serializable -abstract class ListenedFeature( - id: String, - enabled: Boolean = true, - category: FeatureCategories = FeatureCategories.DEFAULT, - additionalSerializers: TypeSerializerCollection = TypeSerializerCollection.defaults() -) : Feature(id, enabled, category, additionalSerializers), Listener { - - override fun enable() { - if (!condition) return - registerListener(this) - super.enable() - } - - override fun disable(reload: Boolean) { - super.disable(reload) - } - -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt deleted file mode 100644 index b7037187..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/FeatureSyncEvents.kt +++ /dev/null @@ -1,50 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.feature.features - -import kotlinx.coroutines.delay -import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI -import org.sayandev.sayanvanish.bungeecord.event.BungeeUserUnVanishEvent -import org.sayandev.sayanvanish.bungeecord.event.BungeeUserVanishEvent -import org.sayandev.sayanvanish.bungeecord.feature.ListenedFeature -import org.sayandev.stickynote.bungeecord.StickyNote -import org.sayandev.stickynote.bungeecord.launch -import org.sayandev.stickynote.bungeecord.plugin -import kotlinx.serialization.Serializable -import java.util.* -import java.util.concurrent.TimeUnit - -@RegisteredFeature -@Serializable -class FeatureSyncEvents( - // TODO: previous time was 50millis, think of something to ignore/reset previous value - val checkPeriodMillis: Long = 1000L -) : ListenedFeature("sync_events") { - - @Transient val previousUsers = mutableMapOf() - - override fun enable() { - launch { - delay(checkPeriodMillis) - while (isActive()) { - for (user in SayanVanishBungeeAPI.getDatabase().getVanishUsers().await()) { - if (previousUsers[user.uniqueId] == null) { - previousUsers[user.uniqueId] = user.isVanished - continue - } - - if (previousUsers[user.uniqueId] == false && user.isVanished) { - previousUsers[user.uniqueId] = true - plugin.proxy.pluginManager.callEvent(BungeeUserVanishEvent(SayanVanishBungeeAPI.adapt(user), user.currentOptions)) - } - - if (previousUsers[user.uniqueId] == true && !user.isVanished) { - previousUsers[user.uniqueId] = false - plugin.proxy.pluginManager.callEvent(BungeeUserUnVanishEvent(SayanVanishBungeeAPI.adapt(user), user.currentOptions)) - } - } - delay(checkPeriodMillis) - } - } - super.enable() - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventChat.kt deleted file mode 100644 index 0128ad35..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventChat.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.feature.features.prevent - -import net.md_5.bungee.api.connection.ProxiedPlayer -import net.md_5.bungee.api.event.ChatEvent -import net.md_5.bungee.event.EventHandler -import net.md_5.bungee.event.EventPriority -import org.sayandev.sayanvanish.api.feature.Configurable -import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI.Companion.user -import org.sayandev.sayanvanish.bungeecord.feature.ListenedFeature -import org.sayandev.sayanvanish.proxy.config.language -import org.spongepowered.configurate.objectmapping.ConfigSerializable -import org.spongepowered.configurate.objectmapping.meta.Comment - -@RegisteredFeature -@ConfigSerializable -class FeaturePreventChat( - @Comment("The character that vanished players can use to bypass the chat prevention.") - @Configurable val bypassChar: String = "!" -) : ListenedFeature("prevent_chat", category = FeatureCategories.PREVENTION) { - - @EventHandler(priority = EventPriority.HIGH) - fun onPlayerChat(event: ChatEvent) { - val player = event.sender as? ProxiedPlayer ?: return - val user = player.user() ?: return - if (!isActive(user)) return - if (!user.isVanished) return - - val message = event.message - if (message.startsWith(bypassChar)) { - event.message = message.removePrefix(bypassChar) - } else { - user.sendComponent(language.vanish.cantChatWhileVanished) - event.isCancelled = true - } - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt deleted file mode 100644 index 6bfe200f..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/feature/features/prevent/FeaturePreventTabComplete.kt +++ /dev/null @@ -1,45 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.feature.features.prevent - -import net.md_5.bungee.api.connection.ProxiedPlayer -import net.md_5.bungee.api.event.TabCompleteEvent -import net.md_5.bungee.event.EventHandler -import net.md_5.bungee.event.EventPriority -import org.sayandev.sayanvanish.api.Permissions -import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.api.VanishUser -import org.sayandev.sayanvanish.api.feature.Configurable -import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.bungeecord.api.BungeeUser.Companion.generateAndSaveUser -import org.sayandev.sayanvanish.bungeecord.api.SayanVanishBungeeAPI -import org.sayandev.sayanvanish.bungeecord.feature.ListenedFeature -import kotlinx.serialization.Serializable - -@RegisteredFeature -@Serializable -class FeaturePreventTabComplete( - @Configurable val checkVanishLevel: Boolean = false -): ListenedFeature("prevent_tab_complete", category = FeatureCategories.PREVENTION) { - - @EventHandler(priority = EventPriority.HIGHEST) - fun onTabComplete(event: TabCompleteEvent) { - val player = event.sender as? ProxiedPlayer ?: return - val user = VanishAPI.get().getDatabase().getUserCache(player.uniqueId) ?: player.generateAndSaveUser() - if (!isActive(user)) return - val vanishUsers = SayanVanishBungeeAPI.getDatabase().getCachedVanishUsers().values - if (!user.hasPermission(Permissions.VANISH) || !checkVanishLevel) { - event.suggestions - .removeIf { suggestion -> vanishUsers.map(VanishUser::username).contains(suggestion) } - return - } - - val vanishUser = vanishUsers.firstOrNull { it.uniqueId == user.uniqueId } - - event.suggestions.removeIf { suggestion -> - vanishUsers - .filter { otherVanishUser -> otherVanishUser.vanishLevel > (vanishUser?.vanishLevel ?: -1) } - .map(VanishUser::username).contains(suggestion) - } - } - -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/utils/PlayerUtils.kt b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/utils/PlayerUtils.kt deleted file mode 100644 index 3624ae84..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/kotlin/org/sayandev/sayanvanish/bungeecord/utils/PlayerUtils.kt +++ /dev/null @@ -1,34 +0,0 @@ -package org.sayandev.sayanvanish.bungeecord.utils - -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver -import net.md_5.bungee.api.CommandSender -import org.sayandev.sayanvanish.proxy.config.language -import org.sayandev.sayanvanish.proxy.config.settings -import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.component -import org.sayandev.stickynote.bungeecord.utils.AdventureUtils.sendMessage - -object PlayerUtils { - fun CommandSender.sendComponent(content: String, vararg placeholders: TagResolver) { - if (content.isBlank()) return - - val prefix = language.general.prefix.component() - val contentComponent = content.component(*placeholders) - this.sendMessage(if (settings.general.includePrefixInMessages) { - prefix.append(contentComponent) - } else { - contentComponent - }) - } - - fun CommandSender.sendComponent(content: Component) { - if (content == Component.empty()) return - - val prefix = language.general.prefix.component() - this.sendMessage(if (settings.general.includePrefixInMessages) { - prefix.append(content) - } else { - content - }) - } -} \ No newline at end of file diff --git a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/resources/plugin.yml b/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/resources/plugin.yml deleted file mode 100644 index 4e2ddf4a..00000000 --- a/sayanvanish-proxy/sayanvanish-proxy-bungeecord/src/main/resources/plugin.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: "${name}" -version: "${version}" -description: "${description}" -main: "org.sayandev.sayanvanish.bungeecord.SayanVanish" -author: "Syrent" diff --git a/settings.gradle.kts b/settings.gradle.kts index 97a51354..d02ebff7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,7 +15,6 @@ plugins { rootProject.name = "SayanVanish" include("sayanvanish-api") -include("sayanvanish-bukkit") +include("sayanvanish-paper") include("sayanvanish-proxy") include("sayanvanish-proxy:sayanvanish-proxy-velocity") -include("sayanvanish-proxy:sayanvanish-proxy-bungeecord") From 5ae14d7f6ccd4a5a516208b293d712452827f461 Mon Sep 17 00:00:00 2001 From: Syrent Date: Wed, 25 Feb 2026 16:33:57 +0330 Subject: [PATCH 49/67] chore: restore velocity functionality --- StickyNote | 2 +- gradle.properties | 2 +- .../types/WebSocketMessagingService.kt | 13 +++++++--- .../api/storage/websocket/WebSocketConfig.kt | 8 +++++-- sayanvanish-paper/build.gradle.kts | 4 ++-- .../sayanvanish/velocity/api/VelocityUser.kt | 16 ++++++++++++- .../sayanvanish/velocity/utils/PlayerUtils.kt | 24 +++++++++++++++++++ 7 files changed, 59 insertions(+), 10 deletions(-) diff --git a/StickyNote b/StickyNote index 1608cb89..69dae979 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit 1608cb89b15d5622fe00a90cc45b243ccf29bf25 +Subproject commit 69dae979cd6f61ba45285e69233b718f285b43c2 diff --git a/gradle.properties b/gradle.properties index 44ad129e..a605cd79 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,7 +33,7 @@ description=A modular vanish system for Minecraft servers website=https://sayandev.org author=Syrent -version=2.0.0-alpha.2 +version=2.0.0-alpha.3 stickynote.useSubmodule=true stickynote.submodulePath=StickyNote diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt index 76235bd8..0252a497 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -2,7 +2,6 @@ package org.sayandev.sayanvanish.api.message.types import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred -import org.jetbrains.exposed.sql.Except import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI @@ -24,6 +23,14 @@ class WebSocketMessagingService( val config: WebSocketConfig, override val dispatcher: AsyncDispatcher ) : MessagingService { + + val connectionMeta = WebSocketConnectionMeta( + uri = URI.create(config.uri), + dispatcher = dispatcher, + autoHostOnPort = config.autoHostOnPort, + hostWhenAutoHosting = config.hostWhenAutoHosting + ) + val syncUserPublisher = SyncUserPublisher().apply { this.register() } val syncVanishUserPublisher = SyncVanishUserPublisher().apply { this.register() } @@ -43,7 +50,7 @@ class WebSocketMessagingService( inner class SyncUserPublisher : WebSocketPublisher( MessageMeta.create(Platform.get().pluginName.lowercase(), MessagingCategoryTypes.SYNC_USER.id), - WebSocketConnectionMeta(URI.create(config.uri), dispatcher), + connectionMeta, Platform.get().logger ) { override fun handle(payload: User): Boolean? { @@ -72,7 +79,7 @@ class WebSocketMessagingService( inner class SyncVanishUserPublisher : WebSocketPublisher( MessageMeta.create(Platform.get().pluginName.lowercase(), MessagingCategoryTypes.SYNC_VANISH_USER.id), - WebSocketConnectionMeta(URI.create(config.uri), dispatcher), + connectionMeta, Platform.get().logger ) { override fun handle(payload: VanishUser): Boolean? { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt index a62b44f0..cf4db9e3 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt @@ -6,5 +6,9 @@ import com.charleskorn.kaml.YamlComment @Serializable class WebSocketConfig( val threadCount: Int = 5, - val uri: String = "ws://localhost:8083" -) \ No newline at end of file + val uri: String = "ws://localhost:8083", + @YamlComment("If true, when no websocket server is listening on the configured URI port, this node will host one locally.") + val autoHostOnPort: Boolean = true, + @YamlComment("Bind address used when autoHostOnPort is enabled.") + val hostWhenAutoHosting: String = "0.0.0.0" +) diff --git a/sayanvanish-paper/build.gradle.kts b/sayanvanish-paper/build.gradle.kts index 1e3cac48..afc28086 100644 --- a/sayanvanish-paper/build.gradle.kts +++ b/sayanvanish-paper/build.gradle.kts @@ -93,8 +93,8 @@ paper { author = findProperty("author")!! as String defaultPermission = BukkitPluginDescription.Permission.Default.FALSE - loader = "${rootProject.group}.${findProperty("slug")!! as String}.bukkit.${rootProject.name}Loader" - main = "${rootProject.group}.${findProperty("slug")!! as String}.bukkit.${rootProject.name}Plugin" + loader = "${rootProject.group}.${findProperty("slug")!! as String}.paper.${rootProject.name}Loader" + main = "${rootProject.group}.${findProperty("slug")!! as String}.paper.${rootProject.name}Plugin" foliaSupported = true diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt index e086a6ae..b479ad5a 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt @@ -1,8 +1,10 @@ package org.sayandev.sayanvanish.velocity.api import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver +import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.velocity.VelocityPlatformAdapter +import org.sayandev.sayanvanish.velocity.utils.PlayerUtils.sendPrefixComponent import org.sayandev.stickynote.velocity.StickyNote import org.sayandev.stickynote.velocity.utils.AdventureUtils.component import java.util.* @@ -19,13 +21,25 @@ open class VelocityUser( player()?.sendMessage(content.component(*placeholders)) } + override fun sendMessageWithPrefix(content: String, vararg placeholders: TagResolver) { + player()?.sendPrefixComponent(content.component(*placeholders)) + } + override fun sendActionbar(content: String, vararg placeholders: TagResolver) { player()?.sendActionBar(content.component(*placeholders)) } + override fun hasPermission(permission: String): Boolean { + return player()?.hasPermission(permission) ?: false + } + + override fun hasPermission(permission: Permissions): Boolean { + return player()?.hasPermission(permission.permission()) ?: false + } + companion object { @JvmSynthetic - fun User.bukkitAdapt(): VelocityUser { + fun User.velocityAdapt(): VelocityUser { return VelocityPlatformAdapter.adapt(this) } } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt index 72c80ef9..5fe79803 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt @@ -31,6 +31,30 @@ object PlayerUtils { }) } + fun CommandSource.sendPrefixComponent(content: String, vararg placeholders: TagResolver) { + if (content.isBlank()) return + + val prefix = language.general.prefix + val finalContent = if (Settings.get().general.includePrefixInMessages) { + prefix + content + } else { + content + } + + this.sendComponent(finalContent.component(*placeholders)) + } + + fun CommandSource.sendPrefixComponent(content: Component) { + val prefix = language.general.prefix + val finalContent = if (Settings.get().general.includePrefixInMessages) { + prefix.component().append(content) + } else { + content + } + + this.sendComponent( finalContent) + } + fun CommandSource.sendRawComponent(content: String, vararg placeholders: TagResolver) { this.sendMessage(content.component(*placeholders)) } From 5bad7e4c68409fab6e42d0f5441b3b8b2a65f148 Mon Sep 17 00:00:00 2001 From: Syrent Date: Wed, 25 Feb 2026 16:39:39 +0330 Subject: [PATCH 50/67] chore: automatically add new options to configuration files --- StickyNote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StickyNote b/StickyNote index 69dae979..46a96699 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit 69dae979cd6f61ba45285e69233b718f285b43c2 +Subproject commit 46a966999e5c530e2560d46184119ec8d90a1155 From b5566dcfa4406ef67f1eff6552c192949be31782 Mon Sep 17 00:00:00 2001 From: Syrent Date: Wed, 25 Feb 2026 16:48:49 +0330 Subject: [PATCH 51/67] chore: do not make stickynote directory if the plugin is in fatjar mode --- .../sayandev/sayanvanish/api/VanishOptions.kt | 22 +++++++- .../sayandev/sayanvanish/api/VanishUser.kt | 1 - .../api/storage/sql/SQLDatabase.kt | 55 ++++++++++++++----- 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt index 07792b3c..0f4901f1 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt @@ -1,5 +1,8 @@ package org.sayandev.sayanvanish.api +import org.jetbrains.exposed.sql.ReferenceOption +import org.sayandev.sayanvanish.api.storage.PlatformTable + data class VanishOptions( var sendMessage: Boolean = true, var notifyStatusChangeToOthers: Boolean = true, @@ -8,6 +11,21 @@ data class VanishOptions( var isOnQuit: Boolean = false, ) { + object Schema : PlatformTable("vanish_user_options") { + val uniqueId = reference( + "unique_id", + VanishUser.Schema.uniqueId, + onDelete = ReferenceOption.CASCADE + ).uniqueIndex() + val sendMessage = bool("send_message").default(true) + val notifyStatusChangeToOthers = bool("notify_status_change_to_others").default(true) + val notifyJoinQuitVanished = bool("notify_join_quit_vanished").default(true) + val isOnJoin = bool("is_on_join").default(false) + val isOnQuit = bool("is_on_quit").default(false) + + override val primaryKey = PrimaryKey(uniqueId) + } + class Builder { private var sendMessage = true private var notifyStatusChangeToOthers = true @@ -41,7 +59,7 @@ data class VanishOptions( } fun build(): VanishOptions { - return VanishOptions(sendMessage, notifyStatusChangeToOthers, notifyJoinQuitVanished, isOnJoin) + return VanishOptions(sendMessage, notifyStatusChangeToOthers, notifyJoinQuitVanished, isOnJoin, isOnQuit) } } @@ -51,4 +69,4 @@ data class VanishOptions( return VanishOptions() } } -} \ No newline at end of file +} diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 3a2c313e..1edf018f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -151,7 +151,6 @@ interface VanishUser : User { val uniqueId = reference("unique_id", User.Schema.uniqueId).uniqueIndex() val isVanished = bool("is_vanished").default(false) val vanishLevel = integer("vanish_level").default(0) - val currentOptions = text("current_options") override val primaryKey = PrimaryKey(uniqueId) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index 3242f46c..f79c537e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -3,6 +3,7 @@ package org.sayandev.sayanvanish.api.storage.sql import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.awaitAll +import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.SchemaUtils import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList @@ -20,7 +21,6 @@ import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.storage.Database import org.sayandev.sayanvanish.api.storage.StorageConfig -import org.sayandev.sayanvanish.api.utils.Gson import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher import org.sayandev.stickynote.core.utils.CoroutineUtils import java.util.* @@ -42,6 +42,7 @@ class SQLDatabase( val tables = listOf( User.Schema, VanishUser.Schema, + VanishOptions.Schema, ) lateinit var database: ExposedDatabase @@ -86,7 +87,7 @@ class SQLDatabase( override suspend fun getVanishUser(uniqueId: UUID): Deferred { return async { - (VanishUser.Schema innerJoin User.Schema) + ((VanishUser.Schema innerJoin User.Schema) innerJoin VanishOptions.Schema) .selectAll() .firstOrNull { it[VanishUser.Schema.uniqueId] == uniqueId } ?.let { result -> @@ -97,10 +98,7 @@ class SQLDatabase( result[VanishUser.Schema.isVanished], result[User.Schema.isOnline], result[VanishUser.Schema.vanishLevel], - Gson.get().fromJson( - result[VanishUser.Schema.currentOptions], - VanishOptions::class.java - ) + optionsFromResult(result) ) } ?.adapt() @@ -109,7 +107,7 @@ class SQLDatabase( override suspend fun getVanishUsers(): Deferred> { return async { - (VanishUser.Schema innerJoin User.Schema) + ((VanishUser.Schema innerJoin User.Schema) innerJoin VanishOptions.Schema) .selectAll() .map { result -> // TODO: maybe add a fromResult method to VanishUser and User? @@ -119,7 +117,8 @@ class SQLDatabase( result[User.Schema.serverId], result[VanishUser.Schema.isVanished], result[User.Schema.isOnline], - result[VanishUser.Schema.vanishLevel] + result[VanishUser.Schema.vanishLevel], + optionsFromResult(result) ).adapt() } } @@ -164,8 +163,8 @@ class SQLDatabase( row[uniqueId] = vanishUser.uniqueId row[isVanished] = vanishUser.isVanished row[vanishLevel] = vanishUser.vanishLevel - row[currentOptions] = Gson.get().toJson(vanishUser.currentOptions) - }.insertedCount == 1 + } + upsertOptions(vanishUser.uniqueId, vanishUser.currentOptions) } } @@ -198,6 +197,8 @@ class SQLDatabase( override suspend fun removeVanishUser(uniqueId: UUID): Deferred { return async { + VanishOptions.Schema + .deleteWhere { VanishOptions.Schema.uniqueId eq uniqueId } VanishUser.Schema .deleteWhere { VanishUser.Schema.uniqueId eq uniqueId } true @@ -219,8 +220,8 @@ class SQLDatabase( row[uniqueId] = vanishUser.uniqueId row[isVanished] = vanishUser.isVanished row[vanishLevel] = vanishUser.vanishLevel - row[currentOptions] = Gson.get().toJson(vanishUser.currentOptions) - }.insertedCount == 1 + } + upsertOptions(vanishUser.uniqueId, vanishUser.currentOptions) } } @@ -242,7 +243,7 @@ class SQLDatabase( override suspend fun purgeUsers(): Deferred { return async { - VanishUser.Schema.deleteAll() + User.Schema.deleteAll() > 0 + VanishOptions.Schema.deleteAll() + VanishUser.Schema.deleteAll() + User.Schema.deleteAll() > 0 } } @@ -254,13 +255,39 @@ class SQLDatabase( .map { it[User.Schema.uniqueId] } if (userIds.isNotEmpty()) { - (VanishUser.Schema.deleteWhere { uniqueId inList userIds } + User.Schema.deleteWhere { uniqueId inList userIds }) > 0 + ( + VanishOptions.Schema.deleteWhere { VanishOptions.Schema.uniqueId inList userIds } + + VanishUser.Schema.deleteWhere { VanishUser.Schema.uniqueId inList userIds } + + User.Schema.deleteWhere { User.Schema.uniqueId inList userIds } + ) > 0 } else { true } } } + private fun Transaction.optionsFromResult(result: ResultRow): VanishOptions { + return VanishOptions( + sendMessage = result[VanishOptions.Schema.sendMessage], + notifyStatusChangeToOthers = result[VanishOptions.Schema.notifyStatusChangeToOthers], + notifyJoinQuitVanished = result[VanishOptions.Schema.notifyJoinQuitVanished], + isOnJoin = result[VanishOptions.Schema.isOnJoin], + isOnQuit = result[VanishOptions.Schema.isOnQuit], + ) + } + + private fun Transaction.upsertOptions(uniqueId: UUID, options: VanishOptions): Boolean { + VanishOptions.Schema.upsert { row -> + row[VanishOptions.Schema.uniqueId] = uniqueId + row[VanishOptions.Schema.sendMessage] = options.sendMessage + row[VanishOptions.Schema.notifyStatusChangeToOthers] = options.notifyStatusChangeToOthers + row[VanishOptions.Schema.notifyJoinQuitVanished] = options.notifyJoinQuitVanished + row[VanishOptions.Schema.isOnJoin] = options.isOnJoin + row[VanishOptions.Schema.isOnQuit] = options.isOnQuit + } + return true + } + fun async(statement: suspend Transaction.() -> T): Deferred { return CoroutineUtils.async(dispatcher) { suspendedTransactionAsync( From 56b8c20ad676b959339c94ea39cb0d389efc4e4a Mon Sep 17 00:00:00 2001 From: Syrent Date: Wed, 25 Feb 2026 16:48:59 +0330 Subject: [PATCH 52/67] build: update stickynote --- StickyNote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StickyNote b/StickyNote index 46a96699..70fabcb0 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit 46a966999e5c530e2560d46184119ec8d90a1155 +Subproject commit 70fabcb03ddcab60626f506d8571758dab60be24 From b54240f85a919c54a60ce122f2e8531d84b609ba Mon Sep 17 00:00:00 2001 From: Syrent Date: Wed, 25 Feb 2026 17:36:07 +0330 Subject: [PATCH 53/67] fix: server id saving --- .../api/message/TypedMessagingService.kt | 2 +- .../api/storage/redis/RedisDatabase.kt | 37 ++++++++++++++++++- .../api/storage/sql/SQLDatabase.kt | 5 ++- .../paper/api/PaperPlatformAdapter.kt | 17 ++++++++- .../sayanvanish/velocity/VanishManager.kt | 15 +++----- .../velocity/VelocityPlatformAdapter.kt | 17 ++++++++- .../velocity/api/SayanVanishVelocityAPI.kt | 18 ++++++--- .../velocity/api/VelocityVanishUser.kt | 9 ++--- 8 files changed, 92 insertions(+), 28 deletions(-) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt index 951b6f43..9e891660 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt @@ -50,7 +50,7 @@ class TypedMessagingService: MessagingService { PayloadWrapper.registerSerializer(User::class.java, User.JsonAdapter()) PayloadWrapper.registerDeserializer(User::class.java, User.JsonAdapter()) - PayloadWrapper.registerDeserializer(VanishUser::class.java, VanishUser.JsonAdapter()) + PayloadWrapper.registerSerializer(VanishUser::class.java, VanishUser.JsonAdapter()) PayloadWrapper.registerDeserializer(VanishUser::class.java, VanishUser.JsonAdapter()) val messagingTypes = MessageConfig.get().categoryTypes.map { it.type }.distinct() diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt index 81316198..54d95f1b 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt @@ -9,6 +9,7 @@ import org.sayandev.sayanvanish.api.storage.Database import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.utils.Gson import org.sayandev.stickynote.core.coroutine.dispatcher.AsyncDispatcher +import redis.clients.jedis.Jedis import redis.clients.jedis.JedisPool import java.util.* @@ -92,7 +93,17 @@ class RedisDatabase( override suspend fun saveVanishUser(user: VanishUser): Deferred { return async { redis.resource.use { - it.hset("vanish_users", user.uniqueId.toString(), Gson.get().toJson(user)) != 0L + val resolvedServerId = resolveServerId(it, user.uniqueId, runCatching { user.serverId }.getOrNull()) + val payload = VanishUser.Generic( + uniqueId = user.uniqueId, + username = user.username, + serverId = resolvedServerId, + isVanished = user.isVanished, + isOnline = user.isOnline, + vanishLevel = user.vanishLevel, + currentOptions = user.currentOptions + ) + it.hset("vanish_users", user.uniqueId.toString(), Gson.get().toJson(payload)) != 0L } } } @@ -108,7 +119,14 @@ class RedisDatabase( override suspend fun saveUser(user: User): Deferred { return async { redis.resource.use { - it.hset("users", user.uniqueId.toString(), Gson.get().toJson(user)) != 0L + val resolvedServerId = resolveServerId(it, user.uniqueId, runCatching { user.serverId }.getOrNull()) + val payload = User.Generic( + uniqueId = user.uniqueId, + username = user.username, + isOnline = user.isOnline, + serverId = resolvedServerId + ) + it.hset("users", user.uniqueId.toString(), Gson.get().toJson(payload)) != 0L } } } @@ -179,4 +197,19 @@ class RedisDatabase( return session.async(dispatcher, CoroutineStart.DEFAULT, block) } + private fun resolveServerId(resource: Jedis, uniqueId: UUID, serverId: String?): String { + return serverId + ?: readServerId(resource, "users", uniqueId) + ?: readServerId(resource, "vanish_users", uniqueId) + ?: Platform.get().serverId + } + + private fun readServerId(resource: Jedis, key: String, uniqueId: UUID): String? { + return resource.hget(key, uniqueId.toString()) + ?.let { JsonParser.parseString(it).asJsonObject } + ?.let { json -> + if (json.has("serverId") && !json.get("serverId").isJsonNull) json.get("serverId").asString else null + } + } + } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index f79c537e..fb4ac264 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -207,7 +207,10 @@ class SQLDatabase( override suspend fun removeUser(uniqueId: UUID): Deferred { return async { - removeVanishUser(uniqueId).await() + VanishOptions.Schema + .deleteWhere { VanishOptions.Schema.uniqueId eq uniqueId } + VanishUser.Schema + .deleteWhere { VanishUser.Schema.uniqueId eq uniqueId } User.Schema .deleteWhere { User.Schema.uniqueId eq uniqueId } true diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt index f6e514f6..cfb8fc1e 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt @@ -1,16 +1,29 @@ package org.sayandev.sayanvanish.paper.api import org.sayandev.sayanvanish.api.PlatformAdapter +import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser +import org.sayandev.sayanvanish.paper.config.Settings object PaperPlatformAdapter : PlatformAdapter { override fun adapt(user: User): PaperUser { - return PaperUser(user.uniqueId, user.username, user.isOnline, user.serverId) + val serverId = if (Settings.get().general.proxyMode) { + runCatching { user.serverId }.getOrNull() ?: Platform.get().serverId + } else { + Platform.get().serverId + } + return PaperUser(user.uniqueId, user.username, user.isOnline, serverId) } override fun adapt(vanishUser: VanishUser): PaperVanishUser { + val serverId = if (Settings.get().general.proxyMode) { + runCatching { vanishUser.serverId }.getOrNull() ?: Platform.get().serverId + } else { + Platform.get().serverId + } return PaperVanishUser(vanishUser.uniqueId, vanishUser.username).also { + it.serverId = serverId it.currentOptions = vanishUser.currentOptions it.isVanished = vanishUser.isVanished it.vanishLevel = vanishUser.vanishLevel @@ -20,4 +33,4 @@ object PaperPlatformAdapter : PlatformAdapter { fun get(): PaperPlatformAdapter { return this } -} \ No newline at end of file +} diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt index 29eacf34..8d01d8b9 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt @@ -4,19 +4,14 @@ import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.connection.DisconnectEvent import com.velocitypowered.api.event.player.ServerPostConnectEvent import kotlinx.coroutines.awaitAll -import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI.Companion.getOrCreateVanishUser -import org.sayandev.sayanvanish.velocity.api.VelocityUser -import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.generateVanishUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.velocityAdapt import org.sayandev.sayanvanish.velocity.event.VelocityUserUnVanishEvent import org.sayandev.sayanvanish.velocity.event.VelocityUserVanishEvent import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.server -import org.sayandev.stickynote.velocity.warn import kotlin.jvm.optionals.getOrNull object VanishManager { @@ -26,7 +21,9 @@ object VanishManager { val player = event.player ?: return launch { val user = player.getOrCreateVanishUser().velocityAdapt() - user.serverId = player.currentServer.getOrNull()?.serverInfo?.name ?: Platform.get().id + player.currentServer.getOrNull()?.serverInfo?.name?.takeUnless { it.isEmpty() }?.let { serverName -> + user.serverId = serverName + } user.isOnline = true user.saveAndSync().awaitAll() @@ -44,10 +41,10 @@ object VanishManager { launch { player.getVanishUser()?.velocityAdapt()?.let { user -> user.isOnline = false - user.saveAndSync() + user.saveAndSync().awaitAll() } - VanishAPI.get().getDatabase().removeUser(player.uniqueId) + VanishAPI.get().getDatabase().removeUser(player.uniqueId).await() } } -} \ No newline at end of file +} diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt index 3aa6ed3e..a5d3fd97 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt @@ -1,18 +1,25 @@ package org.sayandev.sayanvanish.velocity +import org.sayandev.sayanvanish.api.Platform import org.sayandev.sayanvanish.api.PlatformAdapter import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.velocity.api.VelocityUser import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser +import org.sayandev.stickynote.velocity.StickyNote +import java.util.UUID +import kotlin.jvm.optionals.getOrNull object VelocityPlatformAdapter : PlatformAdapter { override fun adapt(user: User): VelocityUser { - return VelocityUser(user.uniqueId, user.username, user.isOnline, user.serverId) + val serverId = resolveServerId(user.uniqueId, runCatching { user.serverId }.getOrNull()) + return VelocityUser(user.uniqueId, user.username, user.isOnline, serverId) } override fun adapt(vanishUser: VanishUser): VelocityVanishUser { + val serverId = resolveServerId(vanishUser.uniqueId, runCatching { vanishUser.serverId }.getOrNull()) return VelocityVanishUser(vanishUser.uniqueId, vanishUser.username).also { + it.serverId = serverId it.currentOptions = vanishUser.currentOptions it.isVanished = vanishUser.isVanished it.vanishLevel = vanishUser.vanishLevel @@ -22,4 +29,10 @@ object VelocityPlatformAdapter : PlatformAdapter Date: Wed, 25 Feb 2026 22:03:51 +0330 Subject: [PATCH 54/67] build: update .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7e28d083..4baaa50f 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,6 @@ bin/ .idea **/run -.kotlin \ No newline at end of file +.kotlin +**/sayanvanish-test/** +.gradle-local \ No newline at end of file From 21367be024836376ec90cb0e978e359d3b64f562 Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 18:02:18 +0330 Subject: [PATCH 55/67] fix: keep vanish consistency on join and some other places --- StickyNote | 2 +- .../org/sayandev/sayanvanish/api/User.kt | 16 ++++++++++++ .../sayandev/sayanvanish/api/VanishUser.kt | 26 +++++++++++++++---- sayanvanish-paper/build.gradle.kts | 2 +- .../sayanvanish/paper/VanishManager.kt | 4 +-- .../sayanvanish/paper/api/PaperVanishUser.kt | 6 ++--- ...ishBukkitAPI.kt => SayanVanishPaperAPI.kt} | 2 +- .../paper/command/SayanVanishCommand.kt | 6 ++--- .../feature/features/FeatureActionbar.kt | 2 +- .../feature/features/FeatureFakeMessage.kt | 2 +- .../paper/feature/features/FeatureGameMode.kt | 2 +- .../features/FeatureInventoryInspect.kt | 2 +- .../paper/feature/features/FeatureLevel.kt | 4 +-- .../feature/features/FeatureRideEntity.kt | 2 +- .../features/FeatureSilentContainer.kt | 2 +- .../paper/feature/features/FeatureState.kt | 4 +-- .../paper/feature/features/FeatureUpdate.kt | 2 +- .../features/hook/AdvancedServerListImpl.kt | 2 +- .../features/hook/FeatureHookCitizens.kt | 2 +- .../features/hook/FeatureHookEssentials.kt | 2 +- .../features/hook/FeatureHookLuckPerms.kt | 2 +- .../hook/FeatureHookMiniPlaceholders.kt | 2 +- .../hook/FeatureHookPlaceholderAPI.kt | 2 +- .../feature/features/hook/FeatureHookTAB.kt | 2 +- .../prevent/FeatureLegacyPreventPickup.kt | 2 +- .../FeaturePreventAdvancementAnnounce.kt | 2 +- .../prevent/FeaturePreventBlockBreak.kt | 2 +- .../prevent/FeaturePreventBlockGrief.kt | 2 +- .../prevent/FeaturePreventBlockPlace.kt | 2 +- .../features/prevent/FeaturePreventChat.kt | 2 +- .../prevent/FeaturePreventCreatureTarget.kt | 2 +- .../features/prevent/FeaturePreventDamage.kt | 2 +- .../prevent/FeaturePreventFoodLevelChange.kt | 2 +- .../prevent/FeaturePreventInteract.kt | 2 +- .../features/prevent/FeaturePreventPickup.kt | 2 +- .../prevent/FeaturePreventRaidTrigger.kt | 2 +- .../features/prevent/FeaturePreventSculk.kt | 2 +- .../prevent/FeaturePreventSpawnerSpawn.kt | 2 +- .../prevent/FeaturePreventTabComplete.kt | 2 +- .../build.gradle.kts | 3 ++- .../velocity/api/SayanVanishVelocityAPI.kt | 12 +++------ 41 files changed, 87 insertions(+), 58 deletions(-) rename sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/{SayanVanishBukkitAPI.kt => SayanVanishPaperAPI.kt} (99%) diff --git a/StickyNote b/StickyNote index 70fabcb0..0342df97 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit 70fabcb03ddcab60626f506d8571758dab60be24 +Subproject commit 0342df9714a88c95d5ecba48207b419523da5ac9 diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index 32173705..a147e442 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -58,6 +58,10 @@ interface User { * @since 1.0.0 */ fun hasPermission(permission: String): Boolean { + if (this::class.java.isInterface) { + Platform.get().logger.warning("This platform does not support User#hasPermission(String)") + return false + } return Platform.get().adapter.adapt(this).hasPermission(permission) } @@ -69,14 +73,26 @@ interface User { * @since 1.0.0 */ fun hasPermission(permission: Permissions): Boolean { + if (this::class.java.isInterface) { + Platform.get().logger.warning("This platform does not support User#hasPermission(Permission)") + return false + } return Platform.get().adapter.adapt(this).hasPermission(permission) } fun sendMessage(content: String, vararg placeholders: TagResolver) { + if (this::class.java.isInterface) { + Platform.get().logger.warning("This platform does not support User#sendMessage") + return + } Platform.get().adapter.adapt(this).sendMessage(content, *placeholders) } fun sendMessageWithPrefix(content: String, vararg placeholders: TagResolver) { + if (this::class.java.isInterface) { + Platform.get().logger.warning("This platform does not support User#sendMessageWithPrefix") + return + } Platform.get().adapter.adapt(this).sendMessageWithPrefix(content, *placeholders) } diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 1edf018f..1d32b186 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -26,27 +26,43 @@ interface VanishUser : User { fun stateText(isVanished: Boolean = this.isVanished) = if (isVanished) "ON" else "OFF" fun disappear(options: VanishOptions) { - isVanished = true - launch(VanishAPI.get().getDatabase().dispatcher) { - saveAndSync() + if (this::class.java.isInterface) { + Platform.get().logger.warning("This platform does not support VanishUser#disappear") + return } + Platform.get().adapter.adapt(this).disappear(options) } fun disappear() { disappear(VanishOptions.defaultOptions()) } - fun appear(options: VanishOptions) { - isVanished = false + fun saveDisappear(options: VanishOptions) { + isVanished = true launch(VanishAPI.get().getDatabase().dispatcher) { saveAndSync() } } + fun appear(options: VanishOptions) { + if (this::class.java.isInterface) { + Platform.get().logger.warning("This platform does not support VanishUser#appear") + return + } + Platform.get().adapter.adapt(this).appear(options) + } + fun appear() { appear(VanishOptions.defaultOptions()) } + fun saveAppear(options: VanishOptions) { + isVanished = false + launch(VanishAPI.get().getDatabase().dispatcher) { + saveAndSync() + } + } + suspend fun toggleVanish(options: VanishOptions) { if (isVanished) appear(options) else disappear(options) } diff --git a/sayanvanish-paper/build.gradle.kts b/sayanvanish-paper/build.gradle.kts index afc28086..3a57003a 100644 --- a/sayanvanish-paper/build.gradle.kts +++ b/sayanvanish-paper/build.gradle.kts @@ -69,7 +69,7 @@ tasks { hangar("PlaceholderAPI", "2.11.7") modrinth("essentialsx", "2.21.2") modrinth("luckperms", "v5.5.17-bukkit") - url("https://github.com/NEZNAMY/TAB/releases/download/5.4.0/TAB.v5.4.0.jar") +// url("https://github.com/NEZNAMY/TAB/releases/download/5.4.0/TAB.v5.4.0.jar") } jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false") } diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt index 7b2d8113..1762f960 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt @@ -7,8 +7,8 @@ import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateUser -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getOrAddUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getOrAddUser import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.registerListener diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt index f07f71c4..320f2053 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt @@ -11,7 +11,7 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Features -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.config.Settings @@ -69,7 +69,7 @@ open class PaperVanishUser( player()?.setMetadata("vanished", FixedMetadataValue(plugin, true)) - super.disappear(options) + super.saveDisappear(options) // order matters - don't move hideUser before vanish (hideUser have a canSee check for vanish state notify) hideForAll() @@ -92,7 +92,7 @@ open class PaperVanishUser( player()?.removeMetadata("vanished", plugin) showUser() - super.appear(options) + super.saveAppear(options) sendMessageWithPrefix(language.vanish.vanishStateUpdate, Placeholder.parsed("state", stateText())) } diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishBukkitAPI.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishPaperAPI.kt similarity index 99% rename from sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishBukkitAPI.kt rename to sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishPaperAPI.kt index 86ef4195..1da238af 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishBukkitAPI.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishPaperAPI.kt @@ -8,7 +8,7 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishUser import java.util.* -class SayanVanishBukkitAPI { +class SayanVanishPaperAPI { companion object { @JvmSynthetic suspend fun UUID.user(): Deferred { diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt index 2f0d1c8a..8444d910 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt @@ -27,9 +27,9 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.message.MessageConfig import org.sayandev.sayanvanish.api.utils.Paste -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getOrAddVanishUser -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getOrCreateVanishUser -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.user +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getOrAddVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.user import org.sayandev.sayanvanish.paper.config.LanguageConfig import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.config.language diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt index 49babe7f..b45af9d7 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt @@ -9,7 +9,7 @@ import kotlinx.serialization.Transient import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt index 0937d3bc..982d99f2 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt @@ -13,7 +13,7 @@ import org.bukkit.event.player.PlayerQuitEvent import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt index 52493b41..cba59b45 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt @@ -6,7 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerGameModeChangeEvent import org.bukkit.event.player.PlayerToggleSneakEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote.runSync import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt index 83b3aab5..d7cb6b5e 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt @@ -12,7 +12,7 @@ import org.bukkit.event.inventory.InventoryType import org.bukkit.event.player.PlayerInteractAtEntityEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.plugin import java.util.* diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt index 8af9a167..2e70669d 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt @@ -9,8 +9,8 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt index 96cae597..d59f2973 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt @@ -7,7 +7,7 @@ import org.bukkit.event.EventPriority import org.bukkit.event.player.PlayerInteractEntityEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt index c2f75679..c4467792 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt @@ -15,7 +15,7 @@ import org.bukkit.event.player.PlayerTeleportEvent import org.bukkit.inventory.CraftingInventory import org.bukkit.util.Vector import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.runSync diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt index f7e5f560..8bea4681 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt @@ -14,8 +14,8 @@ import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.launch diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt index 723fb551..eadd673f 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt @@ -12,7 +12,7 @@ import org.sayandev.sayanvanish.api.utils.HangarUtils import org.sayandev.sayanvanish.api.utils.VersionUtils import org.sayandev.sayanvanish.api.utils.VersionInfo import org.sayandev.sayanvanish.paper.SayanVanishPlugin -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedUser import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt index 4aae1f21..4a8bbd0b 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt @@ -7,7 +7,7 @@ import ch.andre601.advancedserverlist.api.objects.GenericPlayer import ch.andre601.advancedserverlist.api.objects.GenericServer import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.config.language import org.sayandev.stickynote.bukkit.onlinePlayers diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt index 442468a4..1cf69a44 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt @@ -9,7 +9,7 @@ import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt index 905ac270..3404a943 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt @@ -6,7 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.registerListener import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt index 687cfeab..10b88696 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt @@ -16,7 +16,7 @@ import org.bukkit.Bukkit import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.warn import java.util.* diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt index c93871ef..7201dfad 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -9,7 +9,7 @@ import net.kyori.adventure.text.minimessage.tag.Tag import org.bukkit.entity.Player import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.HookFeature diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt index 779206c9..629b2dba 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -5,7 +5,7 @@ import org.bukkit.OfflinePlayer import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.StickyNote diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt index 55f48cb9..6eb4e88b 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt @@ -4,7 +4,7 @@ import me.neznamy.tab.api.TabPlayer import me.neznamy.tab.api.integration.VanishIntegration import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.PaperVanishUser -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.HookFeature import org.sayandev.stickynote.bukkit.plugin import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt index b26669d4..2a4ed045 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt @@ -7,7 +7,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerPickupItemEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt index b6be8cf8..3b500bbc 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt @@ -5,7 +5,7 @@ import org.bukkit.event.player.PlayerAdvancementDoneEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.utils.ServerVersion diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt index 09db634d..409c1875 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt @@ -6,7 +6,7 @@ import org.bukkit.event.EventPriority import org.bukkit.event.block.BlockBreakEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt index b0dd905d..69821eb0 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt @@ -6,7 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityChangeBlockEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt index 41d2f799..3502e121 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt @@ -6,7 +6,7 @@ import org.bukkit.event.EventPriority import org.bukkit.event.block.BlockPlaceEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt index 2408e66e..bcfe8b22 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt @@ -13,7 +13,7 @@ import org.bukkit.event.player.AsyncPlayerChatEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt index fcfc60a9..a97d793e 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt @@ -7,7 +7,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityTargetEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt index d425d787..db9f4de4 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt @@ -6,7 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityDamageByEntityEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt index 65d6baee..fd5ba34a 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt @@ -6,7 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.FoodLevelChangeEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt index c3f2078c..aefe61f0 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt @@ -9,7 +9,7 @@ import org.bukkit.event.player.PlayerInteractEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt index 424385e2..7deec74f 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt @@ -6,7 +6,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityPickupItemEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt index a531d645..66f0691b 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt @@ -5,7 +5,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.raid.RaidTriggerEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt index bf066d49..d085a2ec 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt @@ -10,7 +10,7 @@ import org.bukkit.event.player.PlayerInteractEvent import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.utils.ServerVersion import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt index 2120a6ee..71fdfa34 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt @@ -6,7 +6,7 @@ import org.bukkit.GameMode import org.bukkit.event.EventHandler import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.cachedVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.onlinePlayers diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt index a89add16..0eedf601 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt @@ -10,7 +10,7 @@ import org.sayandev.sayanvanish.api.VanishUser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.sayanvanish.paper.api.SayanVanishBukkitAPI.Companion.getCachedOrCreateVanishUser +import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts b/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts index 9e3d266d..33239254 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts @@ -40,7 +40,8 @@ tasks { downloadPlugins { modrinth("miniplaceholders", "2.3.0") modrinth("luckperms", "v5.5.17-velocity") -// modrinth("velocitab", "1.7.8") + modrinth("tab-was-taken", "on2YAQXR") +// modrinth("velocitab", "1.7.10-19b1474") // url("https://github.com/NEZNAMY/TAB/releases/download/5.0.3/TAB.v5.0.3.jar") // url("https://cdn.modrinth.com/data/Q10irTG0/versions/eXh7ktan/Velocitab-1.7.2-67931d8.jar") // url("https://github.com/Syrent/EnhancedVelocity/releases/download/1.3.3/EnhancedVelocity.v1.3.3.jar") diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt index 7e5385a2..bd3583ff 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt @@ -39,11 +39,9 @@ class SayanVanishVelocityAPI { @JvmSynthetic suspend fun Player.getOrCreateUser(): User { - return VanishAPI.get().getDatabase().getUser(this.uniqueId).await() ?: User.Generic( + return VanishAPI.get().getDatabase().getUser(this.uniqueId).await() ?: VelocityVanishUser( this.uniqueId, this.username, - true, - StickyNote.getPlayer(this.uniqueId)?.currentServer?.getOrNull()?.serverInfo?.name ?: Platform.get().serverId ) } @@ -61,7 +59,7 @@ class SayanVanishVelocityAPI { @JvmSynthetic fun Player.getCachedOrCreateUser(): User { - return VanishAPI.get().getCacheService().getUsers().getUser(this.uniqueId) ?: User.Generic( + return VanishAPI.get().getCacheService().getUsers().getUser(this.uniqueId) ?: VelocityUser( this.uniqueId, this.username, false, @@ -76,10 +74,9 @@ class SayanVanishVelocityAPI { @JvmSynthetic suspend fun Player.getOrCreateVanishUser(): VanishUser { - return VanishAPI.get().getDatabase().getVanishUser(this.uniqueId).await() ?: VanishUser.Generic( + return VanishAPI.get().getDatabase().getVanishUser(this.uniqueId).await() ?: VelocityVanishUser( this.uniqueId, this.username, - Platform.get().serverId ) } @@ -99,10 +96,9 @@ class SayanVanishVelocityAPI { @JvmSynthetic fun Player.getCachedOrCreateVanishUser(): VanishUser { - return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this.uniqueId) ?: VanishUser.Generic( + return VanishAPI.get().getCacheService().getVanishUsers().getVanishUser(this.uniqueId) ?: VelocityVanishUser( this.uniqueId, this.username, - Platform.get().serverId ) } } From 4a218bca1d7383d4070522172d1fdb454401dc6a Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 18:42:04 +0330 Subject: [PATCH 56/67] feat: add docs as submodule --- .gitmodules | 4 ++++ StickyNote | 2 +- docs | 1 + sayanvanish-paper/build.gradle.kts | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) create mode 160000 docs diff --git a/.gitmodules b/.gitmodules index 923b35f9..3fd0982f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,7 @@ path = StickyNote url = https://github.com/Sayan-Development/StickyNote.git branch = pubsub-generic +[submodule "docs"] + path = docs + url = https://github.com/Syrent/sayanvanish-docs.git + branch = main diff --git a/StickyNote b/StickyNote index 0342df97..b5e424b9 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit 0342df9714a88c95d5ecba48207b419523da5ac9 +Subproject commit b5e424b9712f0d4f92896ba27d30120f09a7cc31 diff --git a/docs b/docs new file mode 160000 index 00000000..7fc25dab --- /dev/null +++ b/docs @@ -0,0 +1 @@ +Subproject commit 7fc25dab7ebaed90c3632893ec9815c2ddaf4bf3 diff --git a/sayanvanish-paper/build.gradle.kts b/sayanvanish-paper/build.gradle.kts index 3a57003a..50383ee9 100644 --- a/sayanvanish-paper/build.gradle.kts +++ b/sayanvanish-paper/build.gradle.kts @@ -63,12 +63,14 @@ tasks { } withType(RunServer::class.java) { minecraftVersion("1.21.11") + pluginJars(shadowJar) downloadPlugins { hangar("ViaVersion", "5.6.1-SNAPSHOT+877") hangar("PlaceholderAPI", "2.11.7") modrinth("essentialsx", "2.21.2") modrinth("luckperms", "v5.5.17-bukkit") + modrinth("tab-bridge", "6.2.0") // url("https://github.com/NEZNAMY/TAB/releases/download/5.4.0/TAB.v5.4.0.jar") } jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false") From a094add721d15d6a81fef5f8bb508a0e72b971f8 Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 18:42:19 +0330 Subject: [PATCH 57/67] chore: don't send vanish-notification-other to the user itself --- .../sayanvanish/paper/feature/features/FeatureState.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt index 8bea4681..b3a2028b 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt @@ -91,7 +91,7 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { - for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.canSee(user) }) { + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.canSee(user) }.filter { it.uniqueId != user.uniqueId }) { vanishedUser.sendMessage(language.vanish.joinedTheServerWhileVanished, Placeholder.unparsed("player", user.username)) } } @@ -111,7 +111,7 @@ class FeatureState( if (user.isVanished) { if (user.currentOptions.notifyJoinQuitVanished) { - for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.canSee(user) }) { + for (vanishedUser in VanishAPI.get().getCacheService().getVanishUsers().values.filter { it.canSee(user) }.filter { it.uniqueId != user.uniqueId }) { vanishedUser.sendMessage(language.vanish.leftTheServerWhileVanished, Placeholder.unparsed("player", user.username)) } } From c1f5fe52b1c4eab05eec8716be05af21f75621d8 Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 18:47:27 +0330 Subject: [PATCH 58/67] fix(velocity): tab hook (requires deleting the previously generated `features/hooks/hook_tab.yml`) --- .../velocity/feature/features/hook/FeatureHookTAB.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt index 200c6e76..94f2d27d 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt @@ -12,6 +12,7 @@ import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName import kotlinx.serialization.Transient +import org.sayandev.sayanvanish.api.Platform @RegisteredFeature @@ -21,7 +22,7 @@ class FeatureHookTAB : HookFeature() { @Transient override val id = "hook_tab" override var enabled: Boolean = true - override val plugin: String = "TAB" + override val plugin: String = "tab" override fun enable() { if (hasPlugin()) { @@ -45,8 +46,8 @@ private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegrati override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { if (viewer.uniqueId == target.uniqueId) return true - val viewerUser = VanishAPI.get().getCacheService().getVanishUsers()[viewer.uniqueId] ?: VelocityVanishUser(viewer.uniqueId, viewer.name) val targetUser = VanishAPI.get().getCacheService().getVanishUsers()[target.uniqueId] ?: return true + val viewerUser = VanishAPI.get().getCacheService().getVanishUsers()[viewer.uniqueId] ?: VelocityVanishUser(viewer.uniqueId, viewer.name) return VanishAPI.get().canSee(viewerUser, targetUser) } } \ No newline at end of file From 770d2d6de1c06770e1256f86d5547991ef352763 Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 18:48:17 +0330 Subject: [PATCH 59/67] chore(paper): small optimization to TAB hook --- .../sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt index 6eb4e88b..0ea04b87 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt @@ -42,8 +42,8 @@ private class VanishIntegrationTAB(val feature: FeatureHookTAB): VanishIntegrati override fun canSee(viewer: TabPlayer, target: TabPlayer): Boolean { if (viewer.uniqueId == target.uniqueId) return true - val viewerUser = viewer.uniqueId.cachedVanishUser() ?: PaperVanishUser(viewer.uniqueId, viewer.name) val targetUser = target.uniqueId.cachedVanishUser() ?: return true + val viewerUser = viewer.uniqueId.cachedVanishUser() ?: PaperVanishUser(viewer.uniqueId, viewer.name) return viewerUser.canSee(targetUser) } } \ No newline at end of file From 37c60174f1c52f7b8aca9a4b83411562008c05bb Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 19:05:13 +0330 Subject: [PATCH 60/67] feat: add license header --- build.gradle.kts | 33 +++++++++++++++++++ license_header.txt | 16 +++++++++ .../sayanvanish/api/APIPlatformAdapter.kt | 18 ++++++++++ .../sayanvanish/api/LifecycleVanishAPI.kt | 18 ++++++++++ .../sayandev/sayanvanish/api/Permissions.kt | 18 ++++++++++ .../org/sayandev/sayanvanish/api/Platform.kt | 18 ++++++++++ .../sayanvanish/api/PlatformAdapter.kt | 18 ++++++++++ .../sayanvanish/api/SayanVanishAPI.kt | 18 ++++++++++ .../org/sayandev/sayanvanish/api/User.kt | 18 ++++++++++ .../org/sayandev/sayanvanish/api/VanishAPI.kt | 18 ++++++++++ .../sayandev/sayanvanish/api/VanishOptions.kt | 18 ++++++++++ .../sayandev/sayanvanish/api/VanishUser.kt | 18 ++++++++++ .../sayanvanish/api/VisibilityPolicy.kt | 18 ++++++++++ .../sayandev/sayanvanish/api/cache/Cache.kt | 18 ++++++++++ .../sayanvanish/api/cache/CacheService.kt | 18 ++++++++++ .../sayandev/sayanvanish/api/cache/ICache.kt | 18 ++++++++++ .../api/cache/MemoryCacheService.kt | 18 ++++++++++ .../api/cache/caches/IUserCache.kt | 18 ++++++++++ .../api/cache/caches/IVanishUserCache.kt | 18 ++++++++++ .../sayanvanish/api/cache/caches/UserCache.kt | 18 ++++++++++ .../api/cache/caches/VanishUserCache.kt | 18 ++++++++++ .../sayanvanish/api/command/FeatureParser.kt | 18 ++++++++++ .../exception/UnsupportedPlatformException.kt | 18 ++++++++++ .../sayanvanish/api/feature/Configurable.kt | 18 ++++++++++ .../sayanvanish/api/feature/Feature.kt | 18 ++++++++++ .../api/feature/FeatureDiscoveryStrategy.kt | 18 ++++++++++ .../feature/FeatureInstantiationStrategy.kt | 18 ++++++++++ .../api/feature/FeatureRegistry.kt | 18 ++++++++++ .../sayanvanish/api/feature/Features.kt | 18 ++++++++++ .../api/feature/RegisteredFeature.kt | 18 ++++++++++ .../api/feature/RegisteredFeatureHandler.kt | 18 ++++++++++ .../api/feature/category/FeatureCategories.kt | 18 ++++++++++ .../api/feature/category/FeatureCategory.kt | 18 ++++++++++ .../sayanvanish/api/message/MessageConfig.kt | 18 ++++++++++ .../api/message/MessagingCategoryType.kt | 18 ++++++++++ .../api/message/MessagingCategoryTypes.kt | 18 ++++++++++ .../api/message/MessagingService.kt | 18 ++++++++++ .../sayanvanish/api/message/MessagingType.kt | 18 ++++++++++ .../sayanvanish/api/message/MessagingTypes.kt | 18 ++++++++++ .../api/message/TypedMessagingService.kt | 18 ++++++++++ .../message/types/RedisMessagingService.kt | 18 ++++++++++ .../types/WebSocketMessagingService.kt | 18 ++++++++++ .../sayanvanish/api/storage/Database.kt | 18 ++++++++++ .../sayanvanish/api/storage/DatabaseType.kt | 18 ++++++++++ .../sayanvanish/api/storage/PlatformTable.kt | 18 ++++++++++ .../sayanvanish/api/storage/StorageConfig.kt | 18 ++++++++++ .../api/storage/TransactionDatabase.kt | 18 ++++++++++ .../api/storage/TransactionType.kt | 18 ++++++++++ .../api/storage/TransactionTypes.kt | 18 ++++++++++ .../api/storage/redis/RedisConfig.kt | 18 ++++++++++ .../api/storage/redis/RedisConnection.kt | 18 ++++++++++ .../api/storage/redis/RedisDatabase.kt | 18 ++++++++++ .../serializers/gson/UUIDJsonAdapter.kt | 18 ++++++++++ .../sayanvanish/api/storage/sql/SQLConfig.kt | 18 ++++++++++ .../api/storage/sql/SQLDatabase.kt | 18 ++++++++++ .../api/storage/websocket/WebSocketConfig.kt | 18 ++++++++++ .../sayanvanish/api/utils/DownloadUtils.kt | 18 ++++++++++ .../sayandev/sayanvanish/api/utils/Gson.kt | 18 ++++++++++ .../sayanvanish/api/utils/HangarUtils.kt | 18 ++++++++++ .../sayandev/sayanvanish/api/utils/Paste.kt | 18 ++++++++++ .../sayanvanish/api/utils/VersionUtils.kt | 18 ++++++++++ .../sayanvanish/api/SimulationTest.kt | 18 ++++++++++ .../sayanvanish/paper/PaperPlatform.kt | 18 ++++++++++ .../sayanvanish/paper/SayanVanishLoader.kt | 18 ++++++++++ .../sayanvanish/paper/SayanVanishPlugin.kt | 18 ++++++++++ .../sayanvanish/paper/VanishManager.kt | 18 ++++++++++ .../sayandev/sayanvanish/paper/api/Metrics.kt | 22 ++++++++----- .../paper/api/PaperPlatformAdapter.kt | 18 ++++++++++ .../sayanvanish/paper/api/PaperUser.kt | 18 ++++++++++ .../sayanvanish/paper/api/PaperVanishUser.kt | 18 ++++++++++ .../paper/api/SayanVanishPaperAPI.kt | 18 ++++++++++ .../paper/api/event/PaperUserUnVanishEvent.kt | 18 ++++++++++ .../paper/api/event/PaperUserVanishEvent.kt | 18 ++++++++++ .../paper/command/SayanVanishCommand.kt | 18 ++++++++++ .../paper/config/LanguageConfig.kt | 18 ++++++++++ .../sayanvanish/paper/config/Settings.kt | 18 ++++++++++ .../sayanvanish/paper/feature/HookFeature.kt | 18 ++++++++++ .../paper/feature/ListenedFeature.kt | 18 ++++++++++ .../feature/features/FeatureActionbar.kt | 18 ++++++++++ .../paper/feature/features/FeatureEffect.kt | 18 ++++++++++ .../feature/features/FeatureFakeMessage.kt | 18 ++++++++++ .../paper/feature/features/FeatureFly.kt | 18 ++++++++++ .../paper/feature/features/FeatureGameMode.kt | 18 ++++++++++ .../features/FeatureInventoryInspect.kt | 18 ++++++++++ .../features/FeatureInvulnerability.kt | 18 ++++++++++ .../paper/feature/features/FeatureLevel.kt | 18 ++++++++++ .../features/FeatureRegisterPermissions.kt | 18 ++++++++++ .../feature/features/FeatureRideEntity.kt | 18 ++++++++++ .../features/FeatureSilentContainer.kt | 18 ++++++++++ .../paper/feature/features/FeatureState.kt | 18 ++++++++++ .../paper/feature/features/FeatureUpdate.kt | 18 ++++++++++ .../features/hook/AdvancedServerListImpl.kt | 18 ++++++++++ .../hook/FeatureHookAdvancedServerList.kt | 18 ++++++++++ .../features/hook/FeatureHookCitizens.kt | 18 ++++++++++ .../features/hook/FeatureHookDiscordSRV.kt | 18 ++++++++++ .../features/hook/FeatureHookDynmap.kt | 18 ++++++++++ .../features/hook/FeatureHookEssentials.kt | 18 ++++++++++ .../features/hook/FeatureHookLuckPerms.kt | 18 ++++++++++ .../hook/FeatureHookMiniPlaceholders.kt | 18 ++++++++++ .../features/hook/FeatureHookPl3xMap.kt | 18 ++++++++++ .../hook/FeatureHookPlaceholderAPI.kt | 18 ++++++++++ .../features/hook/FeatureHookSquareMap.kt | 18 ++++++++++ .../feature/features/hook/FeatureHookTAB.kt | 18 ++++++++++ .../prevent/FeatureLegacyPreventPickup.kt | 18 ++++++++++ .../FeaturePreventAdvancementAnnounce.kt | 18 ++++++++++ .../prevent/FeaturePreventBlockBreak.kt | 18 ++++++++++ .../prevent/FeaturePreventBlockGrief.kt | 18 ++++++++++ .../prevent/FeaturePreventBlockPlace.kt | 18 ++++++++++ .../features/prevent/FeaturePreventChat.kt | 18 ++++++++++ .../prevent/FeaturePreventCreatureTarget.kt | 18 ++++++++++ .../features/prevent/FeaturePreventDamage.kt | 18 ++++++++++ .../prevent/FeaturePreventFoodLevelChange.kt | 18 ++++++++++ .../prevent/FeaturePreventInteract.kt | 18 ++++++++++ .../features/prevent/FeaturePreventPickup.kt | 18 ++++++++++ .../features/prevent/FeaturePreventPush.kt | 18 ++++++++++ .../prevent/FeaturePreventRaidTrigger.kt | 18 ++++++++++ .../features/prevent/FeaturePreventSculk.kt | 18 ++++++++++ .../prevent/FeaturePreventServerPing.kt | 18 ++++++++++ .../prevent/FeaturePreventSpawnerSpawn.kt | 18 ++++++++++ .../prevent/FeaturePreventTabComplete.kt | 18 ++++++++++ .../paper/utils/PermissionUtils.kt | 18 ++++++++++ .../sayanvanish/paper/utils/PlayerUtils.kt | 18 ++++++++++ .../sayanvanish/paper/utils/ServerUtils.kt | 18 ++++++++++ .../sayanvanish/velocity/SayanVanishPlugin.kt | 18 ++++++++++ .../sayanvanish/velocity/VanishManager.kt | 18 ++++++++++ .../sayanvanish/velocity/VelocityPlatform.kt | 18 ++++++++++ .../velocity/VelocityPlatformAdapter.kt | 18 ++++++++++ .../velocity/api/SayanVanishVelocityAPI.kt | 18 ++++++++++ .../sayanvanish/velocity/api/VelocityUser.kt | 18 ++++++++++ .../velocity/api/VelocityVanishUser.kt | 18 ++++++++++ .../SayanVanishProxyCommandVelocity.kt | 18 ++++++++++ .../event/VelocityUserUnVanishEvent.kt | 18 ++++++++++ .../velocity/event/VelocityUserVanishEvent.kt | 18 ++++++++++ .../velocity/feature/HookFeature.kt | 18 ++++++++++ .../velocity/feature/ListenedFeature.kt | 18 ++++++++++ .../feature/features/FeatureSyncEvents.kt | 18 ++++++++++ .../feature/features/FeatureUpdate.kt | 18 ++++++++++ .../feature/features/FeatureUpdatePing.kt | 18 ++++++++++ .../hook/FeatureHookAdvancedServerList.kt | 18 ++++++++++ .../hook/FeatureHookEnhancedVelocity.kt | 18 ++++++++++ .../features/hook/FeatureHookLuckPerms.kt | 18 ++++++++++ .../hook/FeatureHookMiniPlaceholders.kt | 18 ++++++++++ .../feature/features/hook/FeatureHookTAB.kt | 18 ++++++++++ .../features/hook/FeatureHookVelocitab.kt | 18 ++++++++++ .../features/prevent/FeaturePreventChat.kt | 18 ++++++++++ .../prevent/FeaturePreventTabComplete.kt | 18 ++++++++++ .../sayanvanish/velocity/utils/PlayerUtils.kt | 18 ++++++++++ .../proxy/command/SayanVanishProxyCommand.kt | 18 ++++++++++ .../proxy/config/LanguageConfig.kt | 18 ++++++++++ .../sayanvanish/proxy/config/Settings.kt | 18 ++++++++++ 150 files changed, 2708 insertions(+), 9 deletions(-) create mode 100644 license_header.txt diff --git a/build.gradle.kts b/build.gradle.kts index 37982033..1af49109 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.diffplug.gradle.spotless.SpotlessExtension import io.papermc.hangarpublishplugin.model.Platforms +import net.kyori.indra.licenser.spotless.IndraSpotlessLicenserExtension import org.sayandev.plugin.StickyNotePackagingMode import java.io.ByteArrayOutputStream import java.net.HttpURLConnection @@ -10,6 +12,7 @@ plugins { `maven-publish` id("io.papermc.hangar-publish-plugin") version "0.1.2" id("com.modrinth.minotaur") version "2.8.10" + id("net.kyori.indra.licenser.spotless") version "4.0.0" apply false id("org.sayandev.stickynote.project") } @@ -96,6 +99,36 @@ allprojects { plugins.apply("java-library") plugins.apply("org.sayandev.stickynote.project") plugins.apply("com.modrinth.minotaur") + if (path.startsWith(":sayanvanish")) { + plugins.apply("net.kyori.indra.licenser.spotless") + + extensions.configure("indraSpotlessLicenser") { + licenseHeaderFile(rootProject.file("license_header.txt")) + property("name", rootProject.name) + property("url", "https://github.com/Syrent/SayanVanish") + } + + extensions.configure("spotless") { + java { + target("src/**/*.java") + targetExclude("**/generated/**", "**/build/**", "**/docs/**", "**/StickyNote/**") + } + kotlin { + target("src/**/*.kt") + targetExclude("**/generated/**", "**/build/**", "**/docs/**", "**/StickyNote/**") + } + groovy { + target("src/**/*.groovy") + targetExclude("**/generated/**", "**/build/**", "**/docs/**", "**/StickyNote/**") + } + } + + pluginManager.withPlugin("com.diffplug.spotless") { + tasks.named("build") { + dependsOn("spotlessApply") + } + } + } stickynote { packagingMode(StickyNotePackagingMode.FAT) diff --git a/license_header.txt b/license_header.txt new file mode 100644 index 00000000..1fc61799 --- /dev/null +++ b/license_header.txt @@ -0,0 +1,16 @@ +This file is part of $name, licensed under the GNU General Public License v3.0. + +Copyright (c) $YEAR Sayan Development and contributors + +$name is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +$name is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/APIPlatformAdapter.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/APIPlatformAdapter.kt index 218a2a10..65374df2 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/APIPlatformAdapter.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/APIPlatformAdapter.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api class APIPlatformAdapter : PlatformAdapter { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/LifecycleVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/LifecycleVanishAPI.kt index f6312da4..ec90c5b5 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/LifecycleVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/LifecycleVanishAPI.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api interface LifecycleVanishAPI : VanishAPI { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permissions.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permissions.kt index d81fcbb7..779db086 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permissions.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Permissions.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api enum class Permissions(val value: String, val default: PermissionDefaults = PermissionDefaults.FALSE) { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt index 290a2c19..8a68f2f5 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/Platform.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api import kotlinx.coroutines.runBlocking diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt index 39908ca0..133146ec 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/PlatformAdapter.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api interface PlatformAdapter { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt index a6f1a2db..c5876842 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/SayanVanishAPI.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api import kotlinx.coroutines.awaitAll diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt index a147e442..67ab4948 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/User.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api import com.google.gson.* diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt index da59b7e0..62b1abb0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishAPI.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api import org.sayandev.sayanvanish.api.cache.CacheService diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt index 0f4901f1..4c68c75d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishOptions.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api import org.jetbrains.exposed.sql.ReferenceOption diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt index 1d32b186..1e6ce640 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VanishUser.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api import com.google.gson.* diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VisibilityPolicy.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VisibilityPolicy.kt index 2b47c39e..fea555c4 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VisibilityPolicy.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/VisibilityPolicy.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api interface VisibilityPolicy { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt index d7e3135d..2e3d1416 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/Cache.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.cache class Cache( diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt index c9713013..b3603240 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/CacheService.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.cache import kotlinx.coroutines.CompletableDeferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/ICache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/ICache.kt index 582673a0..19bf9237 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/ICache.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/ICache.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.cache interface ICache : MutableMap { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt index 982c9b13..c24e16ff 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/MemoryCacheService.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.cache import kotlinx.coroutines.CompletableDeferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IUserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IUserCache.kt index cdbc9d3e..3dcbdbd7 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IUserCache.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IUserCache.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.cache.caches import org.sayandev.sayanvanish.api.User diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IVanishUserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IVanishUserCache.kt index eaca563d..ae30a843 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IVanishUserCache.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/IVanishUserCache.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.cache.caches import org.sayandev.sayanvanish.api.VanishUser diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/UserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/UserCache.kt index b4169bd2..d7a751d0 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/UserCache.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/UserCache.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.cache.caches import org.sayandev.sayanvanish.api.User diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/VanishUserCache.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/VanishUserCache.kt index 0a3792cc..6225af95 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/VanishUserCache.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/cache/caches/VanishUserCache.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.cache.caches import org.sayandev.sayanvanish.api.VanishUser diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt index 949c4f0a..d5869e3d 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.command import org.incendo.cloud.context.CommandContext diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/exception/UnsupportedPlatformException.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/exception/UnsupportedPlatformException.kt index b306f161..b13bd762 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/exception/UnsupportedPlatformException.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/exception/UnsupportedPlatformException.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.exception import org.sayandev.sayanvanish.api.Platform diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Configurable.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Configurable.kt index 7966169d..b5d7bb2f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Configurable.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Configurable.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature @Target(AnnotationTarget.FIELD) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt index d0d11810..56927b85 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Feature.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature import com.charleskorn.kaml.Yaml diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureDiscoveryStrategy.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureDiscoveryStrategy.kt index de7c1bc2..ea617911 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureDiscoveryStrategy.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureDiscoveryStrategy.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature import org.reflections.Reflections diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureInstantiationStrategy.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureInstantiationStrategy.kt index 8f556e34..2953b7ad 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureInstantiationStrategy.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureInstantiationStrategy.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature interface FeatureInstantiationStrategy { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureRegistry.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureRegistry.kt index 683a00b1..d8348671 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureRegistry.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/FeatureRegistry.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature import org.sayandev.sayanvanish.api.User diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt index 29c6a991..02ea5ca3 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/Features.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature import org.sayandev.sayanvanish.api.User diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeature.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeature.kt index 2f160f7a..968e2520 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeature.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeature.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature @Target(AnnotationTarget.CLASS) diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt index feb92ebb..b91114d5 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/RegisteredFeatureHandler.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature import org.sayandev.sayanvanish.api.Platform diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategories.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategories.kt index bed8552f..11dd0cfd 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategories.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategories.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature.category import kotlinx.serialization.Serializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategory.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategory.kt index cd5a822a..62e1fdaf 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategory.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/feature/category/FeatureCategory.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.feature.category interface FeatureCategory { diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt index 11233411..c9968f0e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessageConfig.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message import org.sayandev.sayanvanish.api.Platform diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt index b7c84f13..b35dbe46 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryType.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message import kotlinx.serialization.KSerializer diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt index 15330176..66627dff 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingCategoryTypes.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message import kotlinx.serialization.Serializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt index d08ebe7f..e578e0eb 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingService.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message import kotlinx.coroutines.CompletableDeferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingType.kt index 9b0f092d..83cf7413 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingType.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message import org.spongepowered.configurate.ConfigurationNode diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt index 83e75b67..ff787e47 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/MessagingTypes.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message import kotlinx.serialization.Serializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt index 9e891660..f2e58e24 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/TypedMessagingService.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message import kotlinx.coroutines.CompletableDeferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt index ca5debfa..3a4fd8e4 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/RedisMessagingService.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message.types import kotlinx.coroutines.CompletableDeferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt index 0252a497..62c4a85f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/message/types/WebSocketMessagingService.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.message.types import kotlinx.coroutines.CompletableDeferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt index 1993b429..4014dc53 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/Database.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage import kotlinx.coroutines.Deferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt index e0ba25a2..a58a4bd9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/DatabaseType.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage import kotlinx.serialization.Serializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt index 1bdafd62..36b91bf8 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/PlatformTable.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage import org.jetbrains.exposed.sql.Table diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt index 9ebe1c77..f8edac70 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/StorageConfig.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage import org.sayandev.sayanvanish.api.Platform diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt index 990ef059..974259ca 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionDatabase.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage import kotlinx.coroutines.* diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt index ec371f9d..e0aa04ae 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionType.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage import kotlinx.serialization.KSerializer diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt index b0286bd8..a8825051 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/TransactionTypes.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage import kotlinx.serialization.Serializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt index 3aa73f83..a139db5e 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConfig.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage.redis import kotlinx.serialization.Serializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConnection.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConnection.kt index e6d4c1d0..5c54ba5f 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConnection.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisConnection.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage.redis import kotlinx.coroutines.CompletableDeferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt index 54d95f1b..4d3cd1f9 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/redis/RedisDatabase.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage.redis import com.google.gson.JsonParser diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/serializers/gson/UUIDJsonAdapter.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/serializers/gson/UUIDJsonAdapter.kt index 920af424..2c2d95ac 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/serializers/gson/UUIDJsonAdapter.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/serializers/gson/UUIDJsonAdapter.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage.serializers.gson import com.google.gson.* diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt index 0d61b6d5..af666e3c 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLConfig.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage.sql import kotlinx.serialization.Serializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt index fb4ac264..fe604d48 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/sql/SQLDatabase.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage.sql import kotlinx.coroutines.CompletableDeferred diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt index cf4db9e3..e208d594 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/storage/websocket/WebSocketConfig.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.storage.websocket import kotlinx.serialization.Serializable diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/DownloadUtils.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/DownloadUtils.kt index a900ea12..38970665 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/DownloadUtils.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/DownloadUtils.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.utils import java.io.BufferedInputStream diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt index 6e547dc9..23bff3c1 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Gson.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.utils import com.google.gson.Gson diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/HangarUtils.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/HangarUtils.kt index 65070ae5..f90348a8 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/HangarUtils.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/HangarUtils.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.utils import com.google.gson.Gson diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt index 59976efc..84cda0ca 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/Paste.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.utils import com.google.gson.JsonParser diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/VersionUtils.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/VersionUtils.kt index 16e0a694..47624192 100644 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/VersionUtils.kt +++ b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/utils/VersionUtils.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api.utils object VersionUtils { diff --git a/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt b/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt index fe3c5d09..1b1eada4 100644 --- a/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt +++ b/sayanvanish-api/src/test/kotlin/org/sayandev/sayanvanish/api/SimulationTest.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.api import kotlinx.coroutines.asCoroutineDispatcher diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt index f7a6b573..3a6da388 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper import kotlinx.serialization.modules.PolymorphicModuleBuilder diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishLoader.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishLoader.kt index 7e83905c..041c297d 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishLoader.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishLoader.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper import io.papermc.paper.plugin.loader.PluginClasspathBuilder diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt index 9f2af12f..2fa9b16c 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper import kotlinx.coroutines.runBlocking diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt index 1762f960..97d10654 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper import org.bukkit.event.EventHandler diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/Metrics.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/Metrics.kt index e7bc11e3..f8ddcf42 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/Metrics.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/Metrics.kt @@ -1,16 +1,20 @@ /* - * This Metrics class was auto-generated and can be copied into your project if you are - * not using a build tool like Gradle or Maven for dependency management. + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. * - * IMPORTANT: You are not allowed to modify this class, except changing the package. + * Copyright (c) 2026 Sayan Development and contributors * - * Disallowed modifications include but are not limited to: - * - Remove the option for users to opt-out - * - Change the frequency for data submission - * - Obfuscate the code (every obfuscator should allow you to make an exception for specific files) - * - Reformat the code (if you use a linter, add an exception) + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * Violations will result in a ban of your plugin and account from bStats. + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ package org.sayandev.sayanvanish.paper.api diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt index cfb8fc1e..59055441 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperPlatformAdapter.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.api import org.sayandev.sayanvanish.api.PlatformAdapter diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt index c32276d5..d052a9b2 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.api import net.kyori.adventure.audience.Audience diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt index 320f2053..6d815f29 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.api import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishPaperAPI.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishPaperAPI.kt index 1da238af..676cae33 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishPaperAPI.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/SayanVanishPaperAPI.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.api import kotlinx.coroutines.Deferred diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserUnVanishEvent.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserUnVanishEvent.kt index 0770b890..320dc82c 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserUnVanishEvent.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserUnVanishEvent.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.api.event import org.bukkit.event.Cancellable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserVanishEvent.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserVanishEvent.kt index 3036bcaf..b647c5a6 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserVanishEvent.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/event/PaperUserVanishEvent.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.api.event import org.bukkit.event.Cancellable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt index 8444d910..a8a03aec 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.command import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt index 045b09a3..ce200c9f 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.config import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt index 3d28a11b..5dd0e928 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.config import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt index 39e9b60c..e47e7838 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt index c7533e48..9ee8b1be 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt index b45af9d7..f1f08cc7 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt index 30fa0f27..55687ac1 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import kotlinx.serialization.Contextual diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt index 982d99f2..07c5a25c 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFly.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFly.kt index fb34e063..9843f30d 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFly.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFly.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.event.EventHandler diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt index cba59b45..49563daa 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.GameMode diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt index d7cb6b5e..1ae72d6b 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt index ed510cd8..63eb721c 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.event.EventHandler diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt index 2e70669d..6e1b20da 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.GameMode diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt index 3a0bfa9f..329352a3 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt index d59f2973..effe7398 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRideEntity.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt index c4467792..d368cde2 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import com.cryptomorin.xseries.XMaterial diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt index b3a2028b..bc35410c 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt index eadd673f..fc74a5b0 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features import org.bukkit.Bukkit diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt index 4a8bbd0b..2cd2603a 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import ch.andre601.advancedserverlist.api.AdvancedServerListAPI diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookAdvancedServerList.kt index 439d9353..1518370d 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt index 1cf69a44..b33d534a 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import net.citizensnpcs.api.ai.speech.SpeechContext diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt index 3d9bdd1e..2f9ad84a 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import github.scarsz.discordsrv.DiscordSRV diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt index b6556c47..a879d9ac 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt index 3404a943..7c45d025 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import net.ess3.api.events.AfkStatusChangeEvent diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt index 10b88696..69ae35f6 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt index 7201dfad..cd104627 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import io.github.miniplaceholders.api.Expansion diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt index 2d2036d0..18ec33d9 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt index 629b2dba..d4e06aec 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import me.clip.placeholderapi.expansion.PlaceholderExpansion diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt index 422fdf6f..143f10cb 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt index 0ea04b87..e26b3b97 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.hook import me.neznamy.tab.api.TabPlayer diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt index 2a4ed045..b1d678d5 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt index 3b500bbc..e20d6bcb 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import org.bukkit.event.EventHandler diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt index 409c1875..71ed2251 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockBreak.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt index 69821eb0..4383af29 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockGrief.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt index 3502e121..06e901ba 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventBlockPlace.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt index bcfe8b22..85be8d43 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt index a97d793e..92e9127b 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventCreatureTarget.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt index db9f4de4..27de96ad 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventDamage.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt index fd5ba34a..1f44661a 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventFoodLevelChange.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt index aefe61f0..8e06ab96 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import com.cryptomorin.xseries.XMaterial diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt index 7deec74f..3cd33c44 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt index 9902efcb..beb71f5d 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt index 66f0691b..1f9320d2 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt index d085a2ec..45e79022 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt index 76476bad..7ef2e988 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import com.destroystokyo.paper.event.server.PaperServerListPingEvent diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt index 71fdfa34..e55cc883 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import com.destroystokyo.paper.event.entity.PreSpawnerSpawnEvent diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt index 0eedf601..082fa30c 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventTabComplete.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.feature.features.prevent import org.bukkit.entity.Player diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PermissionUtils.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PermissionUtils.kt index 9deaf434..f9ab0a40 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PermissionUtils.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PermissionUtils.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.utils import org.bukkit.permissions.PermissionDefault diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt index 5855872b..d4d43960 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.utils import net.kyori.adventure.text.Component diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt index 86e7fbd2..48361e0a 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.utils import com.google.gson.GsonBuilder diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt index 206cf692..2034c060 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity import com.github.shynixn.mccoroutine.velocity.SuspendingPluginContainer diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt index 8d01d8b9..36b3769f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VanishManager.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity import com.velocitypowered.api.event.Subscribe diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatform.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatform.kt index 2193cbc7..bfcf8f29 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatform.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatform.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity import kotlinx.serialization.modules.PolymorphicModuleBuilder diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt index a5d3fd97..cef4f1af 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity import org.sayandev.sayanvanish.api.Platform diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt index bd3583ff..8de33c10 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/SayanVanishVelocityAPI.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt index b479ad5a..892eccfa 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityUser.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.api import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt index 3e7d59b0..3b638200 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/api/VelocityVanishUser.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.api import com.velocitypowered.api.proxy.Player diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt index 55f1d4f5..96fdbdd8 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.command import com.velocitypowered.api.proxy.Player diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserUnVanishEvent.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserUnVanishEvent.kt index 78cee747..ff4a1991 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserUnVanishEvent.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserUnVanishEvent.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.event import org.sayandev.sayanvanish.api.VanishOptions diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserVanishEvent.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserVanishEvent.kt index 7d9f2637..5ebba837 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserVanishEvent.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/event/VelocityUserVanishEvent.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.event import org.sayandev.sayanvanish.api.VanishOptions diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt index 1f803db9..0b44973c 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/HookFeature.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature import kotlinx.serialization.Serializable diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt index a1fd7518..3e6a2856 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/ListenedFeature.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature import kotlinx.serialization.Serializable diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt index 60b5709b..3b8ae536 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureSyncEvents.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt index f9437317..dcb7753b 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdate.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features import com.velocitypowered.api.command.CommandSource diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt index 1a94c8fa..2f0939a4 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/FeatureUpdatePing.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features import com.velocitypowered.api.event.Subscribe diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt index b86be435..6a08212e 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookAdvancedServerList.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features.hook import ch.andre601.advancedserverlist.api.AdvancedServerListAPI diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt index 2fcdb937..623f3cf8 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookEnhancedVelocity.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features.hook import ir.syrent.enhancedvelocity.api.VanishHook diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookLuckPerms.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookLuckPerms.kt index 3300af37..74521b7a 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookLuckPerms.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookLuckPerms.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features.hook import com.velocitypowered.api.proxy.Player diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt index 9c579b72..909aad38 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features.hook import com.velocitypowered.api.proxy.Player diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt index 94f2d27d..32819bf0 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookTAB.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features.hook import me.neznamy.tab.api.TabPlayer diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt index 74aa6ffb..eb14a40a 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/hook/FeatureHookVelocitab.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features.hook import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventChat.kt index 70752854..831a111b 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventChat.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features.prevent import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt index c3eefefd..d82ee830 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/feature/features/prevent/FeaturePreventTabComplete.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.feature.features.prevent import com.velocitypowered.api.event.PostOrder diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt index 5fe79803..14a6b456 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/utils/PlayerUtils.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.velocity.utils import com.velocitypowered.api.command.CommandSource diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt index b6ef3436..0a3f7ea5 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.proxy.command import org.incendo.cloud.CommandManager diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt index e24b6852..2d3fb73a 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/LanguageConfig.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.proxy.config import org.sayandev.sayanvanish.api.Platform diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt index d795f449..456f626e 100644 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt +++ b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/config/Settings.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.proxy.config import org.sayandev.sayanvanish.api.Platform From affe7998975dc45ad9210186351a80b3bd75c242 Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 19:07:36 +0330 Subject: [PATCH 61/67] chore: update supported versions --- gradle.properties | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/gradle.properties b/gradle.properties index a605cd79..da183354 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,27 +4,14 @@ org.gradle.parallel=true org.gradle.vfs.watch=true systemProp.file.encoding=utf-8 -paperVersion=1.8-1.21.8 -foliaVersion=1.19.4-1.21.8 +paperVersion=1.20.4-1.21.11 +foliaVersion=1.20.4-1.21.11 velocityVersion=3.0-3.4 -waterfallVersion=1.11-1.21 modrinthProjectID=hkzyeLcD -modrinthMinecraftVersions=1.8.9,\ - 1.9,1.9.1,1.9.2,1.9.3,1.9.4,\ - 1.10,1.10.1,1.10.2,\ - 1.11,1.11.1,1.11.2,\ - 1.12,1.12.1,1.12.2,\ - 1.13,1.13.1,1.13.2,\ - 1.14,1.14.1,1.14.2,1.14.3,1.14.4,\ - 1.15,1.15.1,1.15.2,\ - 1.16,1.16.1,1.16.2,1.16.3,1.16.4,1.16.5,\ - 1.17,1.17.1,\ - 1.18,1.18.1,1.18.2,\ - 1.19,1.19.1,1.19.2,1.19.3,1.19.4,\ - 1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,\ - 1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8 -modrinthLoaders=paper,purpur,spigot,velocity,bungeecord,waterfall,folia +modrinthMinecraftVersions=1.20.4,1.20.5,1.20.6\ + 1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11 +modrinthLoaders=paper,purpur,velocity,folia group=org.sayandev slug=sayanvanish From 9c86228314b67ef4aa047f7367f802913f36b56a Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 19:07:46 +0330 Subject: [PATCH 62/67] build: alpha version 4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index da183354..6a850685 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,7 +20,7 @@ description=A modular vanish system for Minecraft servers website=https://sayandev.org author=Syrent -version=2.0.0-alpha.3 +version=2.0.0-alpha.4 stickynote.useSubmodule=true stickynote.submodulePath=StickyNote From 58049f8158cc86d5149a983d3c8b0498eff74a15 Mon Sep 17 00:00:00 2001 From: Syrent Date: Thu, 26 Feb 2026 21:12:52 +0330 Subject: [PATCH 63/67] chore: change command system to new api --- StickyNote | 2 +- .../sayanvanish/api/command/FeatureParser.kt | 59 -- sayanvanish-paper/build.gradle.kts | 3 +- .../sayanvanish/paper/SayanVanishPlugin.kt | 9 +- .../paper/command/SayanVanishCommand.kt | 897 +++++++++++------- sayanvanish-proxy/build.gradle.kts | 2 +- .../build.gradle.kts | 3 +- .../sayanvanish/velocity/SayanVanishPlugin.kt | 12 +- .../SayanVanishProxyCommandVelocity.kt | 155 +-- .../proxy/command/SayanVanishProxyCommand.kt | 28 - 10 files changed, 685 insertions(+), 485 deletions(-) delete mode 100644 sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt delete mode 100644 sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt diff --git a/StickyNote b/StickyNote index b5e424b9..f191a3d6 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit b5e424b9712f0d4f92896ba27d30120f09a7cc31 +Subproject commit f191a3d6f7aa802792e7788b76d95207b925c359 diff --git a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt b/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt deleted file mode 100644 index d5869e3d..00000000 --- a/sayanvanish-api/src/main/kotlin/org/sayandev/sayanvanish/api/command/FeatureParser.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. - * - * Copyright (c) 2026 Sayan Development and contributors - * - * SayanVanish is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * SayanVanish is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.sayandev.sayanvanish.api.command - -import org.incendo.cloud.context.CommandContext -import org.incendo.cloud.context.CommandInput -import org.incendo.cloud.parser.ArgumentParseResult -import org.incendo.cloud.parser.ArgumentParser -import org.incendo.cloud.parser.ParserDescriptor -import org.incendo.cloud.suggestion.BlockingSuggestionProvider -import org.sayandev.sayanvanish.api.Platform -import org.sayandev.sayanvanish.api.User -import org.sayandev.sayanvanish.api.feature.Feature -import org.sayandev.sayanvanish.api.feature.Features - -class FeatureParser : ArgumentParser, BlockingSuggestionProvider.Strings { - override fun parse( - commandContext: CommandContext, - commandInput: CommandInput - ): ArgumentParseResult { - val input = commandInput.readString() - val feature = Features.getFeatureById(input) - return if (feature != null) { - ArgumentParseResult.success(feature) - } else { - ArgumentParseResult.failure(Throwable("Feature with name `$input` doesn't exist")) - } - } - - override fun stringSuggestions( - commandContext: CommandContext, - input: CommandInput - ): Iterable { - val input = input.readString() - return Features.features().map { it.id }.filter { it.startsWith(input, ignoreCase = true) } - } - - companion object { - fun featureParser(): ParserDescriptor { - return ParserDescriptor.of(FeatureParser(), Feature::class.java) - } - } -} \ No newline at end of file diff --git a/sayanvanish-paper/build.gradle.kts b/sayanvanish-paper/build.gradle.kts index 50383ee9..1c1da6da 100644 --- a/sayanvanish-paper/build.gradle.kts +++ b/sayanvanish-paper/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { // compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT") // paperweight.paperDevBundle("1.21.1-R0.1-SNAPSHOT") implementation(project(":sayanvanish-api")) + implementation("org.sayandev:stickynote-command-bukkit:2.0.0-alpha.38") } tasks.withType(xyz.jpenilla.runtask.task.AbstractRun::class) { @@ -143,4 +144,4 @@ modrinth { "purpur", "folia" )) -} \ No newline at end of file +} diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt index 2fa9b16c..797aa672 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt @@ -31,6 +31,7 @@ import org.sayandev.sayanvanish.paper.api.Metrics import org.sayandev.sayanvanish.paper.command.SayanVanishCommand import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.config.language +import org.sayandev.stickynote.command.bukkit.CommandApiLifecycle import org.sayandev.stickynote.bukkit.StickyNote import org.sayandev.stickynote.bukkit.WrappedStickyNotePlugin import org.sayandev.stickynote.bukkit.error @@ -38,8 +39,13 @@ import java.io.File class SayanVanishPlugin : JavaPlugin() { - override fun onEnable() { + override fun onLoad() { WrappedStickyNotePlugin(this) + CommandApiLifecycle.load(this) + } + + override fun onEnable() { + CommandApiLifecycle.enable() setInstance(this) if (!Platform.setAndRegister(PaperPlatform())) { @@ -79,6 +85,7 @@ class SayanVanishPlugin : JavaPlugin() { runBlocking { Platform.get().unregister() } + CommandApiLifecycle.disable() StickyNote.shutdown() } diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt index a8a03aec..4c7ab5fe 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt @@ -18,32 +18,32 @@ */ package org.sayandev.sayanvanish.paper.command +import com.charleskorn.kaml.YamlComment +import dev.jorel.commandapi.CommandAPICommand +import dev.jorel.commandapi.IStringTooltip +import dev.jorel.commandapi.StringTooltip +import dev.jorel.commandapi.arguments.EntitySelectorArgument.OnePlayer +import dev.jorel.commandapi.arguments.CustomArgument +import dev.jorel.commandapi.arguments.GreedyStringArgument +import dev.jorel.commandapi.arguments.IntegerArgument +import dev.jorel.commandapi.arguments.StringArgument +import dev.jorel.commandapi.executors.CommandArguments import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.bukkit.Bukkit import org.bukkit.OfflinePlayer import org.bukkit.command.CommandSender import org.bukkit.entity.Player import org.bukkit.event.Listener -import org.incendo.cloud.bukkit.parser.OfflinePlayerParser -import org.incendo.cloud.bukkit.parser.PlayerParser -import org.incendo.cloud.component.CommandComponent -import org.incendo.cloud.context.CommandContext -import org.incendo.cloud.description.Description -import org.incendo.cloud.kotlin.MutableCommandBuilder -import org.incendo.cloud.parser.standard.IntegerParser -import org.incendo.cloud.parser.standard.StringParser -import org.incendo.cloud.setting.ManagerSetting -import org.incendo.cloud.suggestion.Suggestion import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.api.command.FeatureParser import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler -import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.message.MessageConfig +import org.sayandev.sayanvanish.api.storage.StorageConfig import org.sayandev.sayanvanish.api.utils.Paste import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getOrAddVanishUser import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getOrCreateVanishUser @@ -55,93 +55,92 @@ import org.sayandev.sayanvanish.paper.feature.features.FeatureLevel import org.sayandev.sayanvanish.paper.feature.features.FeatureUpdate import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent import org.sayandev.sayanvanish.paper.utils.ServerUtils -import org.sayandev.stickynote.bukkit.* -import org.sayandev.stickynote.bukkit.command.BukkitCommand -import org.sayandev.stickynote.bukkit.command.BukkitSender +import org.sayandev.stickynote.bukkit.async +import org.sayandev.stickynote.bukkit.launch +import org.sayandev.stickynote.bukkit.plugin +import org.sayandev.stickynote.bukkit.pluginDirectory +import org.sayandev.stickynote.bukkit.runAsync +import org.sayandev.stickynote.bukkit.runSync +import org.sayandev.stickynote.bukkit.unregisterListener import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component +import org.sayandev.stickynote.command.bukkit.BukkitCommand +import org.sayandev.stickynote.command.bukkit.executesCommand +import org.sayandev.stickynote.command.bukkit.executesSuspending +import org.sayandev.stickynote.command.bukkit.suggest +import org.sayandev.stickynote.command.bukkit.suggestTooltip import org.sayandev.stickynote.core.utils.MilliCounter +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer import java.io.File -import java.util.concurrent.CompletableFuture -import kotlin.jvm.optionals.getOrNull +import java.lang.reflect.Field +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap import kotlin.reflect.KProperty1 import kotlin.reflect.full.memberProperties -class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Settings.get().vanishCommand.aliases.toTypedArray()) { - - override fun rootBuilder(builder: MutableCommandBuilder) { - builder.permission("${plugin.name}.commands.use") - builder.optional("player", OfflinePlayerParser.offlinePlayerParser()) - builder.flag( - "state", - emptyArray(), - Description.empty(), - CommandComponent.builder("state", StringParser.stringParser()) - .suggestionProvider { _, _ -> - CompletableFuture.completedFuture(listOf("on", "off").map { Suggestion.suggestion(it) }) - } - ) - builder.flag("silent", arrayOf("s")) - } - - override fun rootHandler(context: CommandContext) { - val sender = context.sender().platformSender() - val target = context.optional("player") - val state = context.flags().get("state") - - if (!target.isPresent && sender !is Player) { - sender.sendPrefixComponent(language.general.haveToProvidePlayer) - return - } - - if (target.isPresent && !sender.hasPermission(Permissions.VANISH_OTHERS.permission())) { - sender.sendPrefixComponent(language.general.dontHavePermission) - return - } +class SayanVanishCommand : BukkitCommand( + Settings.get().vanishCommand.name, + *Settings.get().vanishCommand.aliases.toTypedArray(), +) { - val player = if (target.isPresent) context.optional("player").get() else context.sender().player() ?: return - launch { - val user = player.getOrCreateVanishUser() + private val rootPermission = "${plugin.name}.commands.use" + private val featureCommentCache = ConcurrentHashMap, Map>() - if (!user.hasPermission(Permissions.VANISH)) { - sender.sendPrefixComponent(language.vanish.dontHaveUsePermission.component(Placeholder.unparsed("permission", Permissions.VANISH.permission()))) + override fun build(command: CommandAPICommand) { + command + .withPermission(rootPermission) + .executesSuspending { sender, _ -> + handleRootCommand(sender, null, null) } - val options = VanishOptions.defaultOptions().apply { - if (context.flags().hasFlag("silent")) { - this.sendMessage = false - } - } + command.withSubcommand(createRootStateCommand("on")) + command.withSubcommand(createRootStateCommand("off")) + command.withSubcommand(createPlayerCommand()) + command.withSubcommand(createForceUpdateCommand()) + command.withSubcommand(createPasteCommand()) + command.withSubcommand(createReloadCommand()) + command.withSubcommand(createLevelCommand()) + command.withSubcommand(createFeatureCommand()) + command.withSubcommand(createTestCommand()) + + createToggleFeatureAliasCommand().register(plugin) + } - if (target.isPresent) { - if (!player.isOnline) { - sender.sendPrefixComponent(language.vanish.offlineOnVanish, Placeholder.unparsed("player", player.name ?: "N/A"), Placeholder.parsed("state", user.stateText())) - options.sendMessage = false - } + private fun createRootStateCommand(state: String): CommandAPICommand { + return CommandAPICommand(state) + .withPermission(rootPermission) + .executesSuspending { sender, _ -> + handleRootCommand(sender, null, state) } + } - when (state) { - "on" -> user.disappear(options) - "off" -> user.appear(options) - else -> user.toggleVanish(options) + private fun createPlayerCommand(): CommandAPICommand { + return CommandAPICommand("player") + .withPermission(rootPermission) + .withArguments(offlinePlayerArgument("player")) + .withOptionalArguments(stateArgument("state")) + .executesSuspending { sender, arguments -> + handleRootCommand( + sender, + arguments.getByClass("player", OfflinePlayer::class.java), + arguments.getOptionalByClass("state", String::class.java).orElse(null), + ) } - } } - init { - manager.settings().set(ManagerSetting.OVERRIDE_EXISTING_COMMANDS, true) - + private fun createForceUpdateCommand(): CommandAPICommand { var forceUpdateConfirm = false - rawCommandBuilder().registerCopy { - literalWithPermission("forceupdate") - handler { context -> - val sender = context.sender().platformSender() + + return CommandAPICommand("forceupdate") + .withPermission(commandPermission("forceupdate")) + .executesCommand { sender, _ -> if (!forceUpdateConfirm) { sender.sendPrefixComponent(language.general.confirmUpdate) forceUpdateConfirm = true runSync({ forceUpdateConfirm = false }, 100) - return@handler + return@executesCommand } sender.sendPrefixComponent(language.general.updating) @@ -164,12 +163,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set } } } - } + } - rawCommandBuilder().registerCopy { - literalWithPermission("paste") - suspendingHandler { context -> - val sender = context.sender().platformSender() + private fun createPasteCommand(): CommandAPICommand { + return CommandAPICommand("paste") + .withPermission(commandPermission("paste")) + .executesSuspending { sender, _ -> sender.sendPrefixComponent(language.paste.generating) async { try { @@ -180,7 +179,7 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set "username", "password", ) - val databaseKey = Paste("yaml", StorageConfig.file.readLines().filter { !blockedWords.any { blockedWord -> it.contains(blockedWord) } }).post().await() + val databaseKey = Paste("yaml", StorageConfig.file.readLines().filter { line -> blockedWords.none { blockedWord -> line.contains(blockedWord) } }).post().await() val settingsKey = Paste("yaml", Settings.settingsFile.readLines()).post().await() val latestLogFile = File(File(pluginDirectory.parentFile.parentFile, "logs"), "latest.log") if (latestLogFile.exists()) { @@ -191,12 +190,15 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set featurePastes[feature.id] = File(Feature.directory(feature.category), "${feature.id}.yml").readLines() } val featureKey = Paste("yaml", featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }).post().await() - generateMainPaste(sender, mapOf( - "storage.yml" to Paste.url(databaseKey), - "settings.yml" to Paste.url(settingsKey), - "latest.log" to Paste.url(logKey), - "features" to Paste.url(featureKey) - )) + generateMainPaste( + sender, + mapOf( + "storage.yml" to Paste.url(databaseKey), + "settings.yml" to Paste.url(settingsKey), + "latest.log" to Paste.url(logKey), + "features" to Paste.url(featureKey), + ), + ) } else { generateMainPaste(sender, mapOf("settings.yml" to Paste.url(settingsKey))) } @@ -206,12 +208,12 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set } } } - } + } - rawCommandBuilder().registerCopy { - literalWithPermission("reload") - handler { context -> - val sender = context.sender().platformSender() + private fun createReloadCommand(): CommandAPICommand { + return CommandAPICommand("reload") + .withPermission(commandPermission("reload")) + .executesCommand { sender, _ -> Features.features().forEach { feature -> feature.disable(true) if (feature::class.java.isAssignableFrom(Listener::class.java)) { @@ -228,297 +230,548 @@ class SayanVanishCommand : BukkitCommand(Settings.get().vanishCommand.name, *Set RegisteredFeatureHandler.process() sender.sendPrefixComponent(language.general.reloaded) } - } + } - val levelLiteral = rawCommandBuilder().registerCopy { - literalWithPermission("level") - } + private fun createLevelCommand(): CommandAPICommand { + val levelRoot = CommandAPICommand("level") + .withPermission(commandPermission("level")) + + levelRoot.withSubcommand( + CommandAPICommand("set") + .withPermission(commandPermission("level", "set")) + .withArguments( + offlinePlayerArgument("player"), + IntegerArgument("level", 0), + ) + .executesSuspending { sender, arguments -> + val target = arguments.getByClass("player", OfflinePlayer::class.java) ?: return@executesSuspending + val level = arguments.getByClass("level", Int::class.javaObjectType) ?: return@executesSuspending + + if (!target.hasPlayedBefore()) { + sender.sendPrefixComponent(language.general.playerNotFound) + return@executesSuspending + } - levelLiteral.registerCopy { - literalWithPermission("set") - required("player", OfflinePlayerParser.offlinePlayerParser()) - required("level", IntegerParser.integerParser(0)) - suspendingHandler { context -> - val sender = context.sender().platformSender() - val target = context.get("player") - - if (!target.hasPlayedBefore()) { - sender.sendPrefixComponent(language.general.playerNotFound) - return@suspendingHandler - } + val user = target.getOrAddVanishUser() + user.vanishLevel = level + user.saveAndSync() - val user = target.getOrAddVanishUser() - user.vanishLevel = context.get("level") - user.saveAndSync() + if (Features.getFeature().levelMethod == FeatureLevel.LevelMethod.PERMISSION) { + sender.sendPrefixComponent( + language.feature.permissionLevelMethodWarning, + Placeholder.unparsed("method", FeatureLevel.LevelMethod.PERMISSION.name), + Placeholder.unparsed("methods", FeatureLevel.LevelMethod.entries.joinToString(", ") { it.name }), + ) + return@executesSuspending + } - if (Features.getFeature().levelMethod == FeatureLevel.LevelMethod.PERMISSION) { - sender.sendPrefixComponent(language.feature.permissionLevelMethodWarning, Placeholder.unparsed("method", FeatureLevel.LevelMethod.PERMISSION.name), Placeholder.unparsed("methods", FeatureLevel.LevelMethod.entries.joinToString(", ") { it.name })) - return@suspendingHandler - } + sender.sendPrefixComponent(language.vanish.levelSet, Placeholder.unparsed("level", user.vanishLevel.toString()), Placeholder.unparsed("player", user.username)) + }, + ) - sender.sendPrefixComponent(language.vanish.levelSet, Placeholder.unparsed("level", user.vanishLevel.toString()), Placeholder.unparsed("player", user.username)) - } - } + levelRoot.withSubcommand( + CommandAPICommand("get") + .withPermission(commandPermission("level", "get")) + .withArguments(offlinePlayerArgument("player")) + .executesSuspending { sender, arguments -> + val target = arguments.getByClass("player", OfflinePlayer::class.java) ?: return@executesSuspending - levelLiteral.registerCopy { - literalWithPermission("get") - required("player", OfflinePlayerParser.offlinePlayerParser()) - suspendingHandler { context -> - val sender = context.sender().platformSender() - val target = context.get("player") + if (!target.hasPlayedBefore()) { + sender.sendPrefixComponent(language.general.playerNotFound) + return@executesSuspending + } - if (!target.hasPlayedBefore()) { - sender.sendPrefixComponent(language.general.playerNotFound) - return@suspendingHandler - } + val user = target.getOrCreateVanishUser() + sender.sendPrefixComponent(language.vanish.levelGet, Placeholder.unparsed("player", target.name ?: "N/A"), Placeholder.unparsed("level", user.vanishLevel.toString())) + }, + ) - val user = target.getOrCreateVanishUser() + return levelRoot + } - sender.sendPrefixComponent(language.vanish.levelGet, Placeholder.unparsed("player", target.name ?: "N/A"), Placeholder.unparsed("level", user.vanishLevel.toString())) - } - } + private fun createFeatureCommand(): CommandAPICommand { + val featureRoot = CommandAPICommand("feature") + .withPermission(commandPermission("feature")) + + featureRoot.withSubcommand( + CommandAPICommand("toggleplayer") + .withPermission(commandPermission("feature", "toggleplayer")) + .withArguments(featureArgument("feature")) + .withOptionalArguments(OnePlayer("player")) + .executesSuspending { sender, arguments -> + toggleFeatureForPlayer(sender, arguments) + }, + ) - val featureLiteral = rawCommandBuilder().registerCopy { - literalWithPermission("feature") - required("feature", FeatureParser.featureParser()) - } + featureRoot.withSubcommand( + CommandAPICommand("disable") + .withPermission(commandPermission("feature", "disable")) + .withArguments(featureArgument("feature")) + .executesCommand { sender, arguments -> + val feature = featureOrNotify(sender, arguments) ?: return@executesCommand - val togglePlayerLiteral = featureLiteral.registerCopy { - literalWithPermission("toggleplayer") - optional("player", PlayerParser.playerParser()) - suspendingHandler { context -> - val targetArg = context.optional("player").getOrNull() + if (!feature.enabled) { + sender.sendPrefixComponent(language.feature.alreadyDisabled, Placeholder.unparsed("feature", feature.id)) + return@executesCommand + } - val sender = context.sender().platformSender() - if (targetArg != null && !sender.hasPermission(Permissions.FEATURE_PLAYER_TOGGLE.permission())) { - sender.sendPrefixComponent(language.feature.togglePlayerOther) - return@suspendingHandler - } + feature.disable() + feature.save() + sender.sendPrefixComponent(language.feature.disabled, Placeholder.unparsed("feature", feature.id)) + }, + ) - if (targetArg == null && sender !is Player) { - sender.sendPrefixComponent(language.general.haveToProvidePlayer) - return@suspendingHandler - } + featureRoot.withSubcommand( + CommandAPICommand("enable") + .withPermission(commandPermission("feature", "enable")) + .withArguments(featureArgument("feature")) + .executesCommand { sender, arguments -> + val feature = featureOrNotify(sender, arguments) ?: return@executesCommand - val target = targetArg ?: sender as Player + if (feature.enabled) { + sender.sendPrefixComponent(language.feature.alreadyEnabled, Placeholder.unparsed("feature", feature.id)) + return@executesCommand + } - val feature = context.get("feature") + feature.enable() + feature.save() + sender.sendPrefixComponent(language.feature.enabled, Placeholder.unparsed("feature", feature.id)) + }, + ) - val user = target.user().await() ?: let { - sender.sendPrefixComponent(language.general.userNotFound, Placeholder.unparsed("player", target.name)) - return@suspendingHandler - } + featureRoot.withSubcommand( + CommandAPICommand("reset") + .withPermission(commandPermission("feature", "reset")) + .withArguments(featureArgument("feature")) + .executesCommand { sender, arguments -> + val feature = featureOrNotify(sender, arguments) ?: return@executesCommand + + feature.disable() + Features.removeFeature(feature) + val freshFeature = feature::class.java.getDeclaredConstructor().newInstance() + if (freshFeature.enabled) { + freshFeature.enable() + } + freshFeature.save() + Features.addFeature(freshFeature) + sender.sendPrefixComponent(language.feature.reset, Placeholder.unparsed("feature", feature.id)) + }, + ) + + featureRoot.withSubcommand( + CommandAPICommand("status") + .withPermission(commandPermission("feature", "status")) + .withArguments(featureArgument("feature")) + .executesCommand { sender, arguments -> + val feature = featureOrNotify(sender, arguments) ?: return@executesCommand + + sender.sendPrefixComponent(language.feature.status, Placeholder.unparsed("feature", feature.id), Placeholder.parsed("status", if (feature.enabled) "Enabled" else "Disabled")) + }, + ) + + featureRoot.withSubcommand( + CommandAPICommand("update") + .withPermission(commandPermission("feature", "update")) + .withArguments( + featureArgument("feature"), + featureOptionArgument("option"), + featureValueArgument("value"), + ) + .executesCommand { sender, arguments -> + val option = arguments.getByClass("option", FeatureOption::class.java) ?: return@executesCommand + val feature = option.feature + val value = arguments.get("value") ?: return@executesCommand + val field = option.field + field.isAccessible = true + field.set(feature, value) + feature.save() + sender.sendPrefixComponent(language.feature.updated, Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("option", field.name), Placeholder.unparsed("state", value.toString())) + }, + ) + + return featureRoot + } - val currentlyEnabled = Features.isFeatureEnabled(user, feature) - Features.setFeatureEnabled(user, feature, !currentlyEnabled) - sender.sendPrefixComponent(language.feature.togglePlayer, Placeholder.unparsed("player", target.name), Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("state", if (!currentlyEnabled) "enabled" else "disabled")) - return@suspendingHandler + private fun createToggleFeatureAliasCommand(): CommandAPICommand { + return CommandAPICommand("togglefeature") + .withPermission(commandPermission("feature", "toggleplayer")) + .withArguments(featureArgument("feature")) + .withOptionalArguments(OnePlayer("player")) + .executesSuspending { sender, arguments -> + toggleFeatureForPlayer(sender, arguments) } + } + + private fun createTestCommand(): CommandAPICommand { + val testRoot = CommandAPICommand("test") + .withPermission(commandPermission("test")) + + testRoot.withSubcommand( + CommandAPICommand("users") + .withPermission(commandPermission("test", "users")) + .executesSuspending { sender, _ -> + sender.sendPrefixComponent("Fetching vanish users from database...") + sender.sendPrefixComponent("Database Vanished Users: ${VanishAPI.get().getDatabase().getVanishUsers().await().filter { it.isVanished }.map { it.username }}") + sender.sendPrefixComponent("Cache Vanished Users: ${VanishAPI.get().getCacheService().getVanishUsers().values.map { it.username }}") + }, + ) + + val databaseRoot = CommandAPICommand("database") + .withPermission(commandPermission("test", "database")) + + databaseRoot.withSubcommand( + CommandAPICommand("data") + .withPermission(commandPermission("test", "database", "data")) + .withOptionalArguments(IntegerArgument("limit", 1, 10000)) + .executesSuspending { sender, arguments -> + val limit = arguments.getOptionalByClass("limit", Int::class.javaObjectType).orElse(50) + val database = VanishAPI.get().getDatabase() + + val counter = MilliCounter() + counter.start() + + val users = database.getVanishUsers().await().take(limit) + for ((index, user) in users.withIndex()) { + val userProperties = user::class.memberProperties + .filterIsInstance>() + .joinToString(" | ") { prop -> + try { + "${prop.name}: ${prop.call(user)}" + } catch (_: Exception) { + "${prop.name}: Access Error" + } + } + + sender.sendPrefixComponent("[${index + 1}] $userProperties") + } + counter.stop() + sender.sendPrefixComponent("Took ${counter.get()}ms") + }, + ) + + databaseRoot.withSubcommand( + CommandAPICommand("performance") + .withPermission(commandPermission("test", "database", "performance")) + .withOptionalArguments( + IntegerArgument("amount", 1, 10000), + IntegerArgument("tries", 1, 10), + ) + .executesSuspending { sender, arguments -> + val amount = arguments.getOptionalByClass("amount", Int::class.javaObjectType).orElse(1) + val tries = arguments.getOptionalByClass("tries", Int::class.javaObjectType).orElse(1) + val database = VanishAPI.get().getDatabase() + + repeat(tries) { iteration -> + val counter = MilliCounter() + counter.start() + sender.sendPrefixComponent("[${iteration + 1}] Trying ${amount} Get Users from data storage") + repeat(amount) { + database.getVanishUsers().await() + } + counter.stop() + sender.sendPrefixComponent("[${iteration + 1}] Took ${counter.get()}ms") + } + }, + ) + + testRoot.withSubcommand(databaseRoot) + return testRoot + } + + private suspend fun handleRootCommand(sender: CommandSender, targetPlayer: OfflinePlayer?, state: String?) { + if (targetPlayer == null && sender !is Player) { + sender.sendPrefixComponent(language.general.haveToProvidePlayer) + return + } + + val target = targetPlayer ?: (sender as? Player) ?: return + val isSelf = sender is Player && sender.uniqueId == target.uniqueId + if (!isSelf && !sender.hasPermission(Permissions.VANISH_OTHERS.permission())) { + sender.sendPrefixComponent(language.general.dontHavePermission) + return } - manager.command(manager.commandBuilder("togglefeature").proxies(togglePlayerLiteral.build())) - featureLiteral.registerCopy { - literalWithPermission("disable") - handler { context -> - val sender = context.sender().platformSender() - val feature = context.get("feature") + val user = target.getOrCreateVanishUser() - if (!feature.enabled) { - sender.sendPrefixComponent(language.feature.alreadyDisabled, Placeholder.unparsed("feature", feature.id)) - return@handler - } + if (!user.hasPermission(Permissions.VANISH)) { + sender.sendPrefixComponent(language.vanish.dontHaveUsePermission.component(Placeholder.unparsed("permission", Permissions.VANISH.permission()))) + return + } - feature.disable() - feature.save() - sender.sendPrefixComponent(language.feature.disabled, Placeholder.unparsed("feature", feature.id)) + val options = VanishOptions.defaultOptions().apply { + if (!target.isOnline) { + sender.sendPrefixComponent( + language.vanish.offlineOnVanish, + Placeholder.unparsed("player", target.name ?: "N/A"), + Placeholder.parsed("state", user.stateText()), + ) + sendMessage = false } } - featureLiteral.registerCopy { - literalWithPermission("enable") - handler { context -> - val sender = context.sender().platformSender() - val feature = context.get("feature") + when (state) { + "on" -> user.disappear(options) + "off" -> user.appear(options) + else -> user.toggleVanish(options) + } + } - if (feature.enabled) { - sender.sendPrefixComponent(language.feature.alreadyEnabled, Placeholder.unparsed("feature", feature.id)) - return@handler - } + private suspend fun toggleFeatureForPlayer(sender: CommandSender, arguments: CommandArguments) { + val targetArg = arguments.getOptionalByClass("player", Player::class.java).orElse(null) - feature.enable() - feature.save() - sender.sendPrefixComponent(language.feature.enabled, Placeholder.unparsed("feature", feature.id)) - } + if (targetArg != null && !sender.hasPermission(Permissions.FEATURE_PLAYER_TOGGLE.permission())) { + sender.sendPrefixComponent(language.feature.togglePlayerOther) + return } - featureLiteral.registerCopy { - literalWithPermission("reset") - handler { context -> - val sender = context.sender().platformSender() - val feature = context.get("feature") - - feature.disable() - Features.removeFeature(feature) - val freshFeature = feature::class.java.getDeclaredConstructor().newInstance() - if (freshFeature.enabled) { - freshFeature.enable() - } - freshFeature.save() - Features.addFeature(freshFeature) - sender.sendPrefixComponent(language.feature.reset, Placeholder.unparsed("feature", feature.id)) - } + if (targetArg == null && sender !is Player) { + sender.sendPrefixComponent(language.general.haveToProvidePlayer) + return } - featureLiteral.registerCopy { - literalWithPermission("status") - handler { context -> - val sender = context.sender().platformSender() - val feature = context.get("feature") + val target = targetArg ?: sender as Player + val feature = featureOrNotify(sender, arguments) ?: return - sender.sendPrefixComponent(language.feature.status, Placeholder.unparsed("feature", feature.id), Placeholder.parsed("status", if (feature.enabled) "Enabled" else "Disabled")) - } + val user = target.user().await() ?: run { + sender.sendPrefixComponent(language.general.userNotFound, Placeholder.unparsed("player", target.name)) + return } - featureLiteral.registerCopy { - literalWithPermission("update") - required(CommandComponent.builder("option", StringParser.stringParser()) - .suggestionProvider { context, _ -> - val feature = context.get("feature") - CompletableFuture.completedFuture(feature::class.java.declaredFields.filter { it.isAnnotationPresent(Configurable::class.java) }.map { Suggestion.suggestion(it.name) }) - }) - required("value", StringParser.stringParser(StringParser.StringMode.QUOTED)) - handler { context -> - val sender = context.sender().platformSender() - val feature = context.get("feature") - - val field = feature.javaClass.getDeclaredField(context.get("option")) - if (field == null) { - sender.sendPrefixComponent(language.feature.invalidOption, Placeholder.unparsed("options", feature::class.memberProperties.joinToString(", ") { it.name })) - return@handler - } + val currentlyEnabled = Features.isFeatureEnabled(user, feature) + Features.setFeatureEnabled(user, feature, !currentlyEnabled) + sender.sendPrefixComponent(language.feature.togglePlayer, Placeholder.unparsed("player", target.name), Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("state", if (!currentlyEnabled) "enabled" else "disabled")) + } - val value = context.get("value") - field.isAccessible = true - try { - if (value.toDoubleOrNull() != null) { - val parsedValue = value.toDouble() - if (field.type == Int::class.java) { - field.set(feature, parsedValue.toInt()) - } else if (field.type == Float::class.java) { - field.set(feature, parsedValue.toFloat()) - } else { - field.set(feature, parsedValue) - } - } else { - if (value.toBooleanStrictOrNull() != null) { - field.set(feature, value.toBoolean()) - } else { - field.set(feature, value) - } - } - } catch (_: Exception) { - sender.sendPrefixComponent(language.feature.invalidValue, Placeholder.unparsed("values", field.type.simpleName ?: "N/A")) - return@handler - } - feature.save() + private fun featureOrNotify(sender: CommandSender, arguments: CommandArguments): Feature? { + val feature = arguments.getByClass("feature", Feature::class.java) + if (feature == null) { + sender.sendPrefixComponent(language.feature.notFound) + return null + } + return feature + } - sender.sendPrefixComponent(language.feature.updated, Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("option", field.name), Placeholder.unparsed("state", value)) - } + private fun featureArgument(name: String): CustomArgument { + return CustomArgument(StringArgument(name)) { info -> + Features.getFeatureById(info.input()) + ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.notFound) + }.suggestTooltip { featureTooltips() } + } + + private fun featureOptionArgument(name: String): CustomArgument { + return CustomArgument(StringArgument(name)) { info -> + val feature = info.previousArgs().getByClass("feature", Feature::class.java) + ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.notFound) + + val fields = configurableFields(feature) + val field = fields.firstOrNull { it.name.equals(info.input(), ignoreCase = true) } + ?: throw CustomArgument.CustomArgumentException.fromString( + language.feature.invalidOption.replace("", fields.joinToString(", ") { it.name }), + ) + + FeatureOption(feature, field) + }.suggestTooltip { suggestion -> + val feature = suggestion.previousArgs().getByClass("feature", Feature::class.java) ?: return@suggestTooltip emptyList() + optionTooltips(feature) } + } - val testLiteral = rawCommandBuilder().registerCopy { - literalWithPermission("test") + private fun featureValueArgument(name: String): CustomArgument { + return CustomArgument(GreedyStringArgument(name)) { info -> + val option = info.previousArgs().getByClass("option", FeatureOption::class.java) + ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidOption) + parseFeatureValue(option.field, info.input()) + }.suggest { suggestion -> + val option = suggestion.previousArgs().getByClass("option", FeatureOption::class.java) ?: return@suggest emptyList() + featureValueSuggestions(option.field) } + } - testLiteral.registerCopy { - literalWithPermission("users") - suspendingHandler { context -> - // TODO: better implementation? - val sender = context.sender().platformSender() - sender.sendPrefixComponent("Fetching vanish users from database...") - sender.sendPrefixComponent("Database Vanished Users: ${VanishAPI.get().getDatabase().getVanishUsers().await().filter { it.isVanished }.map { it.username }}") - sender.sendPrefixComponent("Cache Vanished Users: ${VanishAPI.get().getCacheService().getVanishUsers().values.map { it.username }}") + private fun configurableFields(feature: Feature): List { + return feature::class.java.declaredFields + .filter { it.isAnnotationPresent(Configurable::class.java) } + } + + private fun featureTooltips(): Collection { + return Features.features().map { feature -> + val tooltip = featureDescription(feature) + if (tooltip.isNullOrBlank()) { + StringTooltip.none(feature.id) + } else { + StringTooltip.ofString(feature.id, tooltip) } } + } - val testDatabaseLiteral = testLiteral.registerCopy { - literalWithPermission("database") + private fun optionTooltips(feature: Feature): Collection { + val commentsByField = commentsByField(feature) + return configurableFields(feature).map { field -> + val tooltip = commentsByField[field.name] ?: fieldDescriptionFromFieldAnnotation(field) + if (tooltip.isNullOrBlank()) { + StringTooltip.none(field.name) + } else { + StringTooltip.ofString(field.name, tooltip) + } } + } - testDatabaseLiteral.registerCopy { - literalWithPermission("data") - optional("limit", IntegerParser.integerParser(1, 10000)) - suspendingHandler { context -> - // TODO: better implementation? - val sender = context.sender().platformSender() - val limit = context.get("limit") - val database = VanishAPI.get().getDatabase() - - val counter = MilliCounter() - counter.start() - - val users = database.getVanishUsers().await() - - val limitedUsers = users.take(limit) - - for ((index, user) in limitedUsers.withIndex()) { - val userProperties = user::class.memberProperties - .filterIsInstance>() - .joinToString(" | ") { prop -> - try { - "${prop.name}: ${prop.call(user)}" - } catch (e: Exception) { - "${prop.name}: Access Error" - } - } + private fun featureDescription(feature: Feature): String? { + val commentsByField = commentsByField(feature) + return configurableFields(feature) + .asSequence() + .mapNotNull { commentsByField[it.name] ?: fieldDescriptionFromFieldAnnotation(it) } + .firstOrNull() + } - sender.sendPrefixComponent("[${index + 1}] $userProperties") + @OptIn(ExperimentalSerializationApi::class) + private fun commentsByField(feature: Feature): Map { + return featureCommentCache.computeIfAbsent(feature::class.java) { featureClass -> + val serializerClass = runCatching { + Class.forName("${featureClass.name}\$\$serializer") + }.getOrNull() ?: return@computeIfAbsent emptyMap() + + val serializer = runCatching { + val instance = serializerClass.getField("INSTANCE").get(null) + instance as? KSerializer<*> + }.getOrNull() ?: return@computeIfAbsent emptyMap() + + val descriptor = serializer.descriptor + buildMap { + repeat(descriptor.elementsCount) { index -> + val optionName = descriptor.getElementName(index) + val yamlComment = descriptor.getElementAnnotations(index) + .firstOrNull { it is YamlComment } as? YamlComment + val commentLine = yamlComment?.lines + ?.asSequence() + ?.map(String::trim) + ?.filter(String::isNotBlank) + ?.joinToString(" ") + + if (!commentLine.isNullOrBlank()) { + put(optionName, commentLine) + } } - counter.stop() - sender.sendPrefixComponent("Took ${counter.get()}ms") } } + } - testDatabaseLiteral.registerCopy { - literalWithPermission("performance") - optional("amount", IntegerParser.integerParser(1, 10000)) - optional("tries", IntegerParser.integerParser(1, 10)) - suspendingHandler { context -> - // TODO: better implementation? - val sender = context.sender().platformSender() - val amount = context.get("amount") - val database = VanishAPI.get().getDatabase() - - repeat(context.get("tries")) { - val counter = MilliCounter() - counter.start() - sender.sendPrefixComponent("[${it + 1}] Trying ${amount} Get Users from data storage") - repeat(amount) { - database.getVanishUsers().await() - } - counter.stop() - sender.sendPrefixComponent("[${it + 1}] Took ${counter.get()}ms") - } + private fun fieldDescriptionFromFieldAnnotation(field: Field): String? { + val annotation = field.getAnnotation(YamlComment::class.java) ?: return null + return annotation.lines + .asSequence() + .map(String::trim) + .filter(String::isNotBlank) + .joinToString(" ") + .ifBlank { null } + } + + private fun parseFeatureValue(field: Field, raw: String): Any { + val type = field.type + return when { + type == String::class.java -> raw + type == Int::class.java || type == Integer::class.java -> + raw.toIntOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "integer")) + type == Long::class.java || type == java.lang.Long::class.java -> + raw.toLongOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "long")) + type == Float::class.java || type == java.lang.Float::class.java -> + raw.toFloatOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "float")) + type == Double::class.java || type == java.lang.Double::class.java -> + raw.toDoubleOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "double")) + type == Boolean::class.java || type == java.lang.Boolean::class.java -> + raw.toBooleanStrictOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "true, false")) + type.isEnum -> { + val constants = type.enumConstants.map { (it as Enum<*>).name } + constants.firstOrNull { it.equals(raw, ignoreCase = true) }?.let { constant -> + type.enumConstants.first { (it as Enum<*>).name == constant } + } ?: throw CustomArgument.CustomArgumentException.fromString( + language.feature.invalidValue.replace("", constants.joinToString(", ")), + ) } + else -> throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", type.simpleName ?: "N/A")) } + } + private fun featureValueSuggestions(field: Field): Collection { + val type = field.type + return when { + type == Boolean::class.java || type == java.lang.Boolean::class.java -> listOf("true", "false") + type == Int::class.java || type == Integer::class.java -> listOf("0", "1", "5", "10", "50", "100") + type == Long::class.java || type == java.lang.Long::class.java -> listOf("0", "1", "5", "10", "50", "100") + type == Float::class.java || type == java.lang.Float::class.java -> listOf("0.0", "0.5", "1.0", "5.0", "10.0") + type == Double::class.java || type == java.lang.Double::class.java -> listOf("0.0", "0.5", "1.0", "5.0", "10.0") + type.isEnum -> type.enumConstants.map { (it as Enum<*>).name.lowercase() } + type == String::class.java -> listOf("\"value\"") + else -> listOf("value") + } } - private suspend fun generateMainPaste(sender: CommandSender, otherKeys: Map) { - val key = Paste("json", listOf(ServerUtils.getServerData( - mutableMapOf( - "database-type" to StorageConfig.get().method.toString(), - ).apply { - this.putAll(otherKeys) + private fun offlinePlayerArgument(name: String): CustomArgument { + return CustomArgument(StringArgument(name)) { info -> + val player = offlinePlayer(info.input()) + if (!player.hasPlayedBefore() && !player.isOnline) { + throw CustomArgument.CustomArgumentException.fromString(language.general.playerNotFound) + } + player + }.suggest { suggestion -> + val search = suggestion.currentArg().lowercase() + Bukkit.getOfflinePlayers() + .asSequence() + .mapNotNull { it.name } + .filter { it.startsWith(search, ignoreCase = true) } + .take(30) + .toList() + } + } + + private fun stateArgument(name: String): CustomArgument { + return CustomArgument(StringArgument(name)) { info -> + val state = info.input().lowercase() + if (state == "on" || state == "off") { + state + } else { + throw CustomArgument.CustomArgumentException.fromString("State must be one of: on, off") } - ))).post().await() + }.suggest(listOf("on", "off")) + } + + private fun offlinePlayer(input: String): OfflinePlayer { + return runCatching { + Bukkit.getOfflinePlayer(UUID.fromString(input)) + }.getOrElse { + Bukkit.getOfflinePlayer(input) + } + } + + private suspend fun generateMainPaste(sender: CommandSender, otherKeys: Map) { + val key = Paste( + "json", + listOf( + ServerUtils.getServerData( + mutableMapOf( + "database-type" to StorageConfig.get().method.toString(), + ).apply { + putAll(otherKeys) + }, + ), + ), + ).post().await() + val pasteKey = key.ifEmpty { "N/A" } val pasteUrl = if (pasteKey == "N/A") "N/A" else Paste.url(pasteKey) + sender.sendPrefixComponent( language.paste.use .replace("https://pastes.dev/", pasteUrl) .replace("", pasteUrl) - .replace("", pasteKey) + .replace("", pasteKey), ) } + + private fun commandPermission(vararg nodes: String): String { + val root = Settings.get().vanishCommand.name.lowercase() + return "${plugin.name.lowercase()}.commands.${listOf(root, *nodes).joinToString(".")}" + } + + private data class FeatureOption(val feature: Feature, val field: Field) + } diff --git a/sayanvanish-proxy/build.gradle.kts b/sayanvanish-proxy/build.gradle.kts index 3fd2d542..34d6c4d3 100644 --- a/sayanvanish-proxy/build.gradle.kts +++ b/sayanvanish-proxy/build.gradle.kts @@ -8,4 +8,4 @@ allprojects { dependencies { implementation(project(":sayanvanish-api")) } -} \ No newline at end of file +} diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts b/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts index 33239254..803d2db4 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { annotationProcessor(libs.velocity.api) api(project(":sayanvanish-proxy")) + implementation("org.sayandev:stickynote-command-velocity:2.0.0-alpha.38") } tasks.withType(xyz.jpenilla.runtask.task.AbstractRun::class) { @@ -58,4 +59,4 @@ modrinth { loaders.set(listOf( "velocity", )) -} \ No newline at end of file +} diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt index 2034c060..23ca170a 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt @@ -22,6 +22,7 @@ import com.github.shynixn.mccoroutine.velocity.SuspendingPluginContainer import com.google.inject.Inject import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyInitializeEvent +import com.velocitypowered.api.event.proxy.ProxyShutdownEvent import com.velocitypowered.api.plugin.annotation.DataDirectory import com.velocitypowered.api.proxy.ProxyServer import org.sayandev.sayanvanish.api.Platform @@ -31,6 +32,7 @@ import org.sayandev.sayanvanish.proxy.config.Settings import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.command.SayanVanishProxyCommandVelocity +import org.sayandev.stickynote.command.velocity.CommandApiLifecycle import org.sayandev.stickynote.loader.velocity.StickyNoteVelocityLoader import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.registerListener @@ -60,6 +62,9 @@ class SayanVanishPlugin @Inject constructor( if (!Platform.setAndRegister(VelocityPlatform())) return + CommandApiLifecycle.load(server, this) + CommandApiLifecycle.enable() + SayanVanishAPI.initialize() Settings.reload() @@ -89,6 +94,11 @@ class SayanVanishPlugin @Inject constructor( } } + @Subscribe + fun onProxyShutdown(event: ProxyShutdownEvent) { + CommandApiLifecycle.disable() + } + fun pluginFile(): File? { return dataDirectory.parent.toFile().listFiles().filter { it.isFile }.find { it.name.lowercase().contains("sayanvanish") && it.extension == "jar" } } @@ -107,4 +117,4 @@ class SayanVanishPlugin @Inject constructor( } } -} \ No newline at end of file +} diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt index 96fdbdd8..f86cc67f 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/command/SayanVanishProxyCommandVelocity.kt @@ -18,15 +18,11 @@ */ package org.sayandev.sayanvanish.velocity.command +import com.velocitypowered.api.command.CommandSource import com.velocitypowered.api.proxy.Player +import dev.jorel.commandapi.CommandAPICommand +import dev.jorel.commandapi.arguments.StringArgument import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder -import org.incendo.cloud.component.CommandComponent -import org.incendo.cloud.context.CommandContext -import org.incendo.cloud.description.Description -import org.incendo.cloud.kotlin.MutableCommandBuilder -import org.incendo.cloud.parser.standard.StringParser -import org.incendo.cloud.suggestion.Suggestion -import org.incendo.cloud.velocity.parser.PlayerParser import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.VanishOptions import org.sayandev.sayanvanish.api.feature.Features @@ -36,91 +32,61 @@ import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.genera import org.sayandev.sayanvanish.velocity.api.VelocityVanishUser.Companion.getVanishUser import org.sayandev.sayanvanish.velocity.feature.features.FeatureUpdate import org.sayandev.sayanvanish.velocity.utils.PlayerUtils.sendComponent +import org.sayandev.stickynote.command.velocity.VelocityCommand +import org.sayandev.stickynote.command.velocity.executesCommand +import org.sayandev.stickynote.command.velocity.executesSuspending +import org.sayandev.stickynote.command.velocity.suggest import org.sayandev.stickynote.velocity.StickyNote -import org.sayandev.stickynote.velocity.command.VelocityCommand -import org.sayandev.stickynote.velocity.command.VelocitySender -import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.plugin import org.sayandev.stickynote.velocity.utils.AdventureUtils.component -import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit -import kotlin.jvm.optionals.getOrNull class SayanVanishProxyCommandVelocity : VelocityCommand(Settings.get().command.name, *Settings.get().command.aliases.toTypedArray()) { - override fun rootBuilder(builder: MutableCommandBuilder) { - builder.permission("${plugin.container.description.name.get().lowercase()}.commands.use") - builder.optional("player", PlayerParser.playerParser()) - builder.flag( - "state", - emptyArray(), - Description.empty(), - CommandComponent.builder("state", StringParser.stringParser()) - .suggestionProvider { _, _ -> - CompletableFuture.completedFuture(listOf("on", "off").map { Suggestion.suggestion(it) }) - } - ) - builder.flag("silent", arrayOf("s")) - } - - override fun rootHandler(context: CommandContext) { - val sender = context.sender().platformSender() - val target = context.optional("player") - val state = context.flags().get("state") - - if (!target.isPresent && sender !is Player) { - sender.sendComponent(language.general.haveToProvidePlayer.component()) - return - } - - if (target.isPresent && !sender.hasPermission(Permissions.VANISH_OTHERS.permission())) { - sender.sendComponent(language.general.dontHavePermission.component()) - return - } + private val rootPermission = "${plugin.container.description.name.get().lowercase()}.commands.use" - val player = if (target.isPresent) context.optional("player").get() else context.sender().player() ?: return - - launch { - val user = player.getVanishUser() ?: player.generateVanishUser() - - if (!user.hasPermission(Permissions.VANISH)) { - user.sendMessage(language.general.dontHavePermission, Placeholder.unparsed("permission", Permissions.VANISH.permission())) - return@launch + override fun build(command: CommandAPICommand) { + command + .withPermission(rootPermission) + .executesSuspending { sender, _ -> + handleVanish(sender, null, null) } - val options = VanishOptions.defaultOptions().apply { - if (context.flags().hasFlag("silent")) { - this.sendMessage = false - } + command.withArguments(playerArgument("player")) + .executesSuspending { sender, arguments -> + handleVanish(sender, arguments.getByClass("player", String::class.java), null) } - val targetPlayer = target.getOrNull() ?: sender as? Player ?: let { - sender.sendMessage(language.general.haveToProvidePlayer.component()) - return@launch - } + command.withSubcommand(stateCommand("on")) + command.withSubcommand(stateCommand("off")) + command.withSubcommand(createForceUpdateCommand()) + } - when (state) { - "on" -> user.disappear(options) - "off" -> user.appear(options) - else -> user.toggleVanish(options) + private fun stateCommand(state: String): CommandAPICommand { + return CommandAPICommand(state) + .withPermission(rootPermission) + .executesSuspending { sender, _ -> + handleVanish(sender, null, state) + } + .withArguments(playerArgument("player")) + .executesSuspending { sender, arguments -> + handleVanish(sender, arguments.getByClass("player", String::class.java), state) } - context.sender().platformSender().sendComponent(language.vanish.vanishToggle.component(Placeholder.unparsed("player", targetPlayer.username), Placeholder.parsed("state", user.stateText(!user.isVanished)))) - } } - init { + private fun createForceUpdateCommand(): CommandAPICommand { var forceUpdateConfirm = false - rawCommandBuilder().registerCopy { - literalWithPermission("forceupdate") - handler { context -> - val sender = context.sender().platformSender() + + return CommandAPICommand("forceupdate") + .withPermission(commandPermission("forceupdate")) + .executesCommand { sender, _ -> if (!forceUpdateConfirm) { sender.sendComponent(language.general.confirmUpdate.component()) forceUpdateConfirm = true StickyNote.run({ forceUpdateConfirm = false }, 5, TimeUnit.SECONDS) - return@handler + return@executesCommand } sender.sendComponent(language.general.updating.component()) @@ -140,6 +106,55 @@ class SayanVanishProxyCommandVelocity : VelocityCommand(Settings.get().command.n } } } + } + + private suspend fun handleVanish(sender: CommandSource, targetName: String?, state: String?) { + if (targetName == null && sender !is Player) { + sender.sendComponent(language.general.haveToProvidePlayer.component()) + return + } + + if (targetName != null && !sender.hasPermission(Permissions.VANISH_OTHERS.permission())) { + sender.sendComponent(language.general.dontHavePermission.component()) + return + } + + val targetPlayer = targetName?.let { plugin.server.getPlayer(it).orElse(null) } ?: sender as? Player ?: run { + sender.sendComponent(language.general.haveToProvidePlayer.component()) + return } + + val user = targetPlayer.getVanishUser() ?: targetPlayer.generateVanishUser() + + if (!user.hasPermission(Permissions.VANISH)) { + user.sendMessage(language.general.dontHavePermission, Placeholder.unparsed("permission", Permissions.VANISH.permission())) + return + } + + val options = VanishOptions.defaultOptions() + + when (state) { + "on" -> user.disappear(options) + "off" -> user.appear(options) + else -> user.toggleVanish(options) + } + + sender.sendComponent( + language.vanish.vanishToggle.component( + Placeholder.unparsed("player", targetPlayer.username), + Placeholder.parsed("state", user.stateText(!user.isVanished)), + ), + ) + } + + private fun playerArgument(name: String): StringArgument { + return StringArgument(name).suggest { + plugin.server.allPlayers.map { player -> player.username } + } + } + + private fun commandPermission(vararg nodes: String): String { + val root = Settings.get().command.name.lowercase() + return "${plugin.container.description.name.get().lowercase()}.commands.${listOf(root, *nodes).joinToString(".")}" } -} \ No newline at end of file +} diff --git a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt b/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt deleted file mode 100644 index 0a3f7ea5..00000000 --- a/sayanvanish-proxy/src/main/kotlin/org/sayandev/sayanvanish/proxy/command/SayanVanishProxyCommand.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. - * - * Copyright (c) 2026 Sayan Development and contributors - * - * SayanVanish is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * SayanVanish is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.sayandev.sayanvanish.proxy.command - -import org.incendo.cloud.CommandManager -import org.sayandev.sayanvanish.proxy.config.Settings -import org.sayandev.stickynote.core.command.Command -import org.sayandev.stickynote.core.command.interfaces.SenderExtension - -abstract class SayanVanishProxyCommand, C: CommandManager>( - manager: C, -) : Command("sayanvanishproxy", manager, Settings.get().command.name, *Settings.get().command.aliases.toTypedArray()) \ No newline at end of file From 1f34e34f4aae05f05f497a6948556fc94e5d1783 Mon Sep 17 00:00:00 2001 From: Syrent Date: Fri, 27 Feb 2026 17:30:27 +0330 Subject: [PATCH 64/67] chore: better commands --- .../paper/command/SayanVanishCommand.kt | 761 +++++++----------- .../command/argument/FeatureArgumentParser.kt | 80 ++ .../paper/command/argument/FeatureOption.kt | 9 + .../argument/FeatureOptionArgumentParser.kt | 88 ++ .../argument/FeatureValueArgumentParser.kt | 62 ++ .../argument/OfflinePlayerArgumentParser.kt | 40 + .../command/argument/StateArgumentParser.kt | 22 + 7 files changed, 603 insertions(+), 459 deletions(-) create mode 100644 sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureArgumentParser.kt create mode 100644 sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOption.kt create mode 100644 sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOptionArgumentParser.kt create mode 100644 sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureValueArgumentParser.kt create mode 100644 sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/OfflinePlayerArgumentParser.kt create mode 100644 sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/StateArgumentParser.kt diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt index 4c7ab5fe..1b8e8b84 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt @@ -18,18 +18,11 @@ */ package org.sayandev.sayanvanish.paper.command -import com.charleskorn.kaml.YamlComment import dev.jorel.commandapi.CommandAPICommand -import dev.jorel.commandapi.IStringTooltip -import dev.jorel.commandapi.StringTooltip import dev.jorel.commandapi.arguments.EntitySelectorArgument.OnePlayer -import dev.jorel.commandapi.arguments.CustomArgument -import dev.jorel.commandapi.arguments.GreedyStringArgument import dev.jorel.commandapi.arguments.IntegerArgument -import dev.jorel.commandapi.arguments.StringArgument import dev.jorel.commandapi.executors.CommandArguments import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder -import org.bukkit.Bukkit import org.bukkit.OfflinePlayer import org.bukkit.command.CommandSender import org.bukkit.entity.Player @@ -38,7 +31,6 @@ import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.api.VanishOptions -import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.Features import org.sayandev.sayanvanish.api.feature.RegisteredFeatureHandler @@ -48,6 +40,12 @@ import org.sayandev.sayanvanish.api.utils.Paste import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getOrAddVanishUser import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getOrCreateVanishUser import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.user +import org.sayandev.sayanvanish.paper.command.argument.FeatureOption +import org.sayandev.sayanvanish.paper.command.argument.FeatureArgumentParser +import org.sayandev.sayanvanish.paper.command.argument.FeatureOptionArgumentParser +import org.sayandev.sayanvanish.paper.command.argument.FeatureValueArgumentParser +import org.sayandev.sayanvanish.paper.command.argument.OfflinePlayerArgumentParser +import org.sayandev.sayanvanish.paper.command.argument.StateArgumentParser import org.sayandev.sayanvanish.paper.config.LanguageConfig import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.config.language @@ -56,7 +54,6 @@ import org.sayandev.sayanvanish.paper.feature.features.FeatureUpdate import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent import org.sayandev.sayanvanish.paper.utils.ServerUtils import org.sayandev.stickynote.bukkit.async -import org.sayandev.stickynote.bukkit.launch import org.sayandev.stickynote.bukkit.plugin import org.sayandev.stickynote.bukkit.pluginDirectory import org.sayandev.stickynote.bukkit.runAsync @@ -64,17 +61,13 @@ import org.sayandev.stickynote.bukkit.runSync import org.sayandev.stickynote.bukkit.unregisterListener import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component import org.sayandev.stickynote.command.bukkit.BukkitCommand -import org.sayandev.stickynote.command.bukkit.executesCommand -import org.sayandev.stickynote.command.bukkit.executesSuspending -import org.sayandev.stickynote.command.bukkit.suggest -import org.sayandev.stickynote.command.bukkit.suggestTooltip +import org.sayandev.stickynote.command.bukkit.commandNodePermission +import org.sayandev.stickynote.command.bukkit.command as commandNode +import org.sayandev.stickynote.command.bukkit.dsl +import org.sayandev.stickynote.command.bukkit.withGeneratedPermission +import org.sayandev.stickynote.command.bukkit.withUsePermission import org.sayandev.stickynote.core.utils.MilliCounter -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.KSerializer import java.io.File -import java.lang.reflect.Field -import java.util.UUID -import java.util.concurrent.ConcurrentHashMap import kotlin.reflect.KProperty1 import kotlin.reflect.full.memberProperties @@ -83,64 +76,85 @@ class SayanVanishCommand : BukkitCommand( *Settings.get().vanishCommand.aliases.toTypedArray(), ) { - private val rootPermission = "${plugin.name}.commands.use" - private val featureCommentCache = ConcurrentHashMap, Map>() + private val commandRoot = Settings.get().vanishCommand.name.lowercase() + + private val stateArgumentParser = StateArgumentParser(invalidStateMessage = { + "State must be one of: on, off" + }) + private val offlinePlayerArgumentParser = OfflinePlayerArgumentParser { + language.general.playerNotFound + } + private val featureArgumentParser = FeatureArgumentParser { + language.feature.notFound + } + private val featureOptionArgumentParser = FeatureOptionArgumentParser( + featureNotFoundMessage = { language.feature.notFound }, + invalidOptionMessage = { options -> + language.feature.invalidOption.replace("", options.joinToString(", ")) + }, + ) + private val featureValueArgumentParser = FeatureValueArgumentParser( + invalidOptionMessage = { language.feature.invalidOption }, + invalidValueMessage = { expected -> language.feature.invalidValue.replace("", expected) }, + ) override fun build(command: CommandAPICommand) { - command - .withPermission(rootPermission) - .executesSuspending { sender, _ -> + command.dsl { + withUsePermission() + executesSuspend { sender, _ -> handleRootCommand(sender, null, null) } - command.withSubcommand(createRootStateCommand("on")) - command.withSubcommand(createRootStateCommand("off")) - command.withSubcommand(createPlayerCommand()) - command.withSubcommand(createForceUpdateCommand()) - command.withSubcommand(createPasteCommand()) - command.withSubcommand(createReloadCommand()) - command.withSubcommand(createLevelCommand()) - command.withSubcommand(createFeatureCommand()) - command.withSubcommand(createTestCommand()) + subcommand(createRootStateCommand("on")) + subcommand(createRootStateCommand("off")) + subcommand(createPlayerCommand()) + subcommand(createForceUpdateCommand()) + subcommand(createPasteCommand()) + subcommand(createReloadCommand()) + subcommand(createLevelCommand()) + subcommand(createFeatureCommand()) + subcommand(createTestCommand()) + } createToggleFeatureAliasCommand().register(plugin) } private fun createRootStateCommand(state: String): CommandAPICommand { - return CommandAPICommand(state) - .withPermission(rootPermission) - .executesSuspending { sender, _ -> + return commandNode(state) { + withUsePermission() + executesSuspend { sender, _ -> handleRootCommand(sender, null, state) } + } } private fun createPlayerCommand(): CommandAPICommand { - return CommandAPICommand("player") - .withPermission(rootPermission) - .withArguments(offlinePlayerArgument("player")) - .withOptionalArguments(stateArgument("state")) - .executesSuspending { sender, arguments -> + return commandNode("player") { + withUsePermission() + arguments(offlinePlayerArgumentParser.argument("player")) + optionalArguments(stateArgumentParser.argument("state")) + executesSuspend { sender, args -> handleRootCommand( - sender, - arguments.getByClass("player", OfflinePlayer::class.java), - arguments.getOptionalByClass("state", String::class.java).orElse(null), + sender = sender, + targetPlayer = args.required("player", OfflinePlayer::class.java), + state = args.optional("state", String::class.java), ) } + } } private fun createForceUpdateCommand(): CommandAPICommand { var forceUpdateConfirm = false - - return CommandAPICommand("forceupdate") - .withPermission(commandPermission("forceupdate")) - .executesCommand { sender, _ -> + return commandNode("forceupdate") { + withGeneratedPermission(commandRoot, "forceupdate") + executes { sender, _ -> if (!forceUpdateConfirm) { sender.sendPrefixComponent(language.general.confirmUpdate) forceUpdateConfirm = true runSync({ forceUpdateConfirm = false }, 100) - return@executesCommand + return@executes } sender.sendPrefixComponent(language.general.updating) @@ -152,7 +166,10 @@ class SayanVanishCommand : BukkitCommand( runSync { if (isSuccessful) { - sender.sendPrefixComponent(language.general.updated, Placeholder.unparsed("version", updateFeature.latestVersion())) + sender.sendPrefixComponent( + language.general.updated, + Placeholder.unparsed("version", updateFeature.latestVersion()), + ) if (Settings.get().general.proxyMode && updateFeature.willAffectProxy()) { sender.sendPrefixComponent(language.general.proxyUpdateWarning) } @@ -163,33 +180,34 @@ class SayanVanishCommand : BukkitCommand( } } } + } } private fun createPasteCommand(): CommandAPICommand { - return CommandAPICommand("paste") - .withPermission(commandPermission("paste")) - .executesSuspending { sender, _ -> + return commandNode("paste") { + withGeneratedPermission(commandRoot, "paste") + executesSuspend { sender, _ -> sender.sendPrefixComponent(language.paste.generating) async { try { - val blockedWords = listOf( - "host", - "port", - "database", - "username", - "password", - ) - val databaseKey = Paste("yaml", StorageConfig.file.readLines().filter { line -> blockedWords.none { blockedWord -> line.contains(blockedWord) } }).post().await() + val blockedWords = listOf("host", "port", "database", "username", "password") + val databaseKey = Paste( + "yaml", + StorageConfig.file.readLines().filter { line -> + blockedWords.none { blockedWord -> line.contains(blockedWord) } + }, + ).post().await() val settingsKey = Paste("yaml", Settings.settingsFile.readLines()).post().await() val latestLogFile = File(File(pluginDirectory.parentFile.parentFile, "logs"), "latest.log") if (latestLogFile.exists()) { val logKey = Paste("log", latestLogFile.readLines()).post().await() - - val featurePastes = mutableMapOf>() - for (feature in Features.features()) { - featurePastes[feature.id] = File(Feature.directory(feature.category), "${feature.id}.yml").readLines() + val featurePastes = Features.features().associate { feature -> + feature.id to File(Feature.directory(feature.category), "${feature.id}.yml").readLines() } - val featureKey = Paste("yaml", featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }).post().await() + val featureKey = Paste( + "yaml", + featurePastes.map { "${it.key}:\n ${it.value.joinToString("\n ")}" }, + ).post().await() generateMainPaste( sender, mapOf( @@ -208,16 +226,17 @@ class SayanVanishCommand : BukkitCommand( } } } + } } private fun createReloadCommand(): CommandAPICommand { - return CommandAPICommand("reload") - .withPermission(commandPermission("reload")) - .executesCommand { sender, _ -> + return commandNode("reload") { + withGeneratedPermission(commandRoot, "reload") + executes { sender, _ -> Features.features().forEach { feature -> feature.disable(true) - if (feature::class.java.isAssignableFrom(Listener::class.java)) { - unregisterListener(feature as Listener) + if (feature is Listener) { + unregisterListener(feature) } } Features.clearFeatures() @@ -230,26 +249,25 @@ class SayanVanishCommand : BukkitCommand( RegisteredFeatureHandler.process() sender.sendPrefixComponent(language.general.reloaded) } + } } private fun createLevelCommand(): CommandAPICommand { - val levelRoot = CommandAPICommand("level") - .withPermission(commandPermission("level")) - - levelRoot.withSubcommand( - CommandAPICommand("set") - .withPermission(commandPermission("level", "set")) - .withArguments( - offlinePlayerArgument("player"), + return commandNode("level") { + withGeneratedPermission(commandRoot, "level") + + subcommand("set", commandNodePermission(commandRoot, "level", "set")) { + arguments( + offlinePlayerArgumentParser.argument("player"), IntegerArgument("level", 0), ) - .executesSuspending { sender, arguments -> - val target = arguments.getByClass("player", OfflinePlayer::class.java) ?: return@executesSuspending - val level = arguments.getByClass("level", Int::class.javaObjectType) ?: return@executesSuspending + executesSuspend { sender, args -> + val target = args.required("player", OfflinePlayer::class.java) ?: return@executesSuspend + val level = args.required("level", Int::class.javaObjectType) ?: return@executesSuspend if (!target.hasPlayedBefore()) { sender.sendPrefixComponent(language.general.playerNotFound) - return@executesSuspending + return@executesSuspend } val user = target.getOrAddVanishUser() @@ -260,94 +278,101 @@ class SayanVanishCommand : BukkitCommand( sender.sendPrefixComponent( language.feature.permissionLevelMethodWarning, Placeholder.unparsed("method", FeatureLevel.LevelMethod.PERMISSION.name), - Placeholder.unparsed("methods", FeatureLevel.LevelMethod.entries.joinToString(", ") { it.name }), + Placeholder.unparsed( + "methods", + FeatureLevel.LevelMethod.entries.joinToString(", ") { it.name }, + ), ) - return@executesSuspending + return@executesSuspend } - sender.sendPrefixComponent(language.vanish.levelSet, Placeholder.unparsed("level", user.vanishLevel.toString()), Placeholder.unparsed("player", user.username)) - }, - ) + sender.sendPrefixComponent( + language.vanish.levelSet, + Placeholder.unparsed("level", user.vanishLevel.toString()), + Placeholder.unparsed("player", user.username), + ) + } + } - levelRoot.withSubcommand( - CommandAPICommand("get") - .withPermission(commandPermission("level", "get")) - .withArguments(offlinePlayerArgument("player")) - .executesSuspending { sender, arguments -> - val target = arguments.getByClass("player", OfflinePlayer::class.java) ?: return@executesSuspending + subcommand("get", commandNodePermission(commandRoot, "level", "get")) { + arguments(offlinePlayerArgumentParser.argument("player")) + executesSuspend { sender, args -> + val target = args.required("player", OfflinePlayer::class.java) ?: return@executesSuspend if (!target.hasPlayedBefore()) { sender.sendPrefixComponent(language.general.playerNotFound) - return@executesSuspending + return@executesSuspend } val user = target.getOrCreateVanishUser() - sender.sendPrefixComponent(language.vanish.levelGet, Placeholder.unparsed("player", target.name ?: "N/A"), Placeholder.unparsed("level", user.vanishLevel.toString())) - }, - ) - - return levelRoot + sender.sendPrefixComponent( + language.vanish.levelGet, + Placeholder.unparsed("player", target.name ?: "N/A"), + Placeholder.unparsed("level", user.vanishLevel.toString()), + ) + } + } + } } private fun createFeatureCommand(): CommandAPICommand { - val featureRoot = CommandAPICommand("feature") - .withPermission(commandPermission("feature")) - - featureRoot.withSubcommand( - CommandAPICommand("toggleplayer") - .withPermission(commandPermission("feature", "toggleplayer")) - .withArguments(featureArgument("feature")) - .withOptionalArguments(OnePlayer("player")) - .executesSuspending { sender, arguments -> - toggleFeatureForPlayer(sender, arguments) - }, - ) - - featureRoot.withSubcommand( - CommandAPICommand("disable") - .withPermission(commandPermission("feature", "disable")) - .withArguments(featureArgument("feature")) - .executesCommand { sender, arguments -> - val feature = featureOrNotify(sender, arguments) ?: return@executesCommand + return commandNode("feature") { + withGeneratedPermission(commandRoot, "feature") + + subcommand("toggleplayer", commandNodePermission(commandRoot, "feature", "toggleplayer")) { + arguments(featureArgumentParser.argument("feature")) + optionalArguments(OnePlayer("player")) + executesSuspend { sender, args -> + toggleFeatureForPlayer(sender, args) + } + } + subcommand("disable", commandNodePermission(commandRoot, "feature", "disable")) { + arguments(featureArgumentParser.argument("feature")) + executes { sender, args -> + val feature = featureOrNotify(sender, args) ?: return@executes if (!feature.enabled) { - sender.sendPrefixComponent(language.feature.alreadyDisabled, Placeholder.unparsed("feature", feature.id)) - return@executesCommand + sender.sendPrefixComponent( + language.feature.alreadyDisabled, + Placeholder.unparsed("feature", feature.id), + ) + return@executes } feature.disable() feature.save() - sender.sendPrefixComponent(language.feature.disabled, Placeholder.unparsed("feature", feature.id)) - }, - ) - - featureRoot.withSubcommand( - CommandAPICommand("enable") - .withPermission(commandPermission("feature", "enable")) - .withArguments(featureArgument("feature")) - .executesCommand { sender, arguments -> - val feature = featureOrNotify(sender, arguments) ?: return@executesCommand + sender.sendPrefixComponent( + language.feature.disabled, + Placeholder.unparsed("feature", feature.id), + ) + } + } + subcommand("enable", commandNodePermission(commandRoot, "feature", "enable")) { + arguments(featureArgumentParser.argument("feature")) + executes { sender, args -> + val feature = featureOrNotify(sender, args) ?: return@executes if (feature.enabled) { - sender.sendPrefixComponent(language.feature.alreadyEnabled, Placeholder.unparsed("feature", feature.id)) - return@executesCommand + sender.sendPrefixComponent( + language.feature.alreadyEnabled, + Placeholder.unparsed("feature", feature.id), + ) + return@executes } feature.enable() feature.save() sender.sendPrefixComponent(language.feature.enabled, Placeholder.unparsed("feature", feature.id)) - }, - ) - - featureRoot.withSubcommand( - CommandAPICommand("reset") - .withPermission(commandPermission("feature", "reset")) - .withArguments(featureArgument("feature")) - .executesCommand { sender, arguments -> - val feature = featureOrNotify(sender, arguments) ?: return@executesCommand + } + } + subcommand("reset", commandNodePermission(commandRoot, "feature", "reset")) { + arguments(featureArgumentParser.argument("feature")) + executes { sender, args -> + val feature = featureOrNotify(sender, args) ?: return@executes feature.disable() Features.removeFeature(feature) + val freshFeature = feature::class.java.getDeclaredConstructor().newInstance() if (freshFeature.enabled) { freshFeature.enable() @@ -355,127 +380,131 @@ class SayanVanishCommand : BukkitCommand( freshFeature.save() Features.addFeature(freshFeature) sender.sendPrefixComponent(language.feature.reset, Placeholder.unparsed("feature", feature.id)) - }, - ) - - featureRoot.withSubcommand( - CommandAPICommand("status") - .withPermission(commandPermission("feature", "status")) - .withArguments(featureArgument("feature")) - .executesCommand { sender, arguments -> - val feature = featureOrNotify(sender, arguments) ?: return@executesCommand + } + } - sender.sendPrefixComponent(language.feature.status, Placeholder.unparsed("feature", feature.id), Placeholder.parsed("status", if (feature.enabled) "Enabled" else "Disabled")) - }, - ) + subcommand("status", commandNodePermission(commandRoot, "feature", "status")) { + arguments(featureArgumentParser.argument("feature")) + executes { sender, args -> + val feature = featureOrNotify(sender, args) ?: return@executes + sender.sendPrefixComponent( + language.feature.status, + Placeholder.unparsed("feature", feature.id), + Placeholder.parsed( + "status", + if (feature.enabled) "Enabled" else "Disabled", + ), + ) + } + } - featureRoot.withSubcommand( - CommandAPICommand("update") - .withPermission(commandPermission("feature", "update")) - .withArguments( - featureArgument("feature"), - featureOptionArgument("option"), - featureValueArgument("value"), + subcommand("update", commandNodePermission(commandRoot, "feature", "update")) { + arguments( + featureArgumentParser.argument("feature"), + featureOptionArgumentParser.argument("option"), + featureValueArgumentParser.argument("value"), ) - .executesCommand { sender, arguments -> - val option = arguments.getByClass("option", FeatureOption::class.java) ?: return@executesCommand - val feature = option.feature - val value = arguments.get("value") ?: return@executesCommand - val field = option.field - field.isAccessible = true - field.set(feature, value) - feature.save() - sender.sendPrefixComponent(language.feature.updated, Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("option", field.name), Placeholder.unparsed("state", value.toString())) - }, - ) - - return featureRoot + executes { sender, args -> + val option = args.required("option", FeatureOption::class.java) ?: return@executes + val value = args.get("value") ?: return@executes + option.field.isAccessible = true + option.field.set(option.feature, value) + option.feature.save() + + sender.sendPrefixComponent( + language.feature.updated, + Placeholder.unparsed("feature", option.feature.id), + Placeholder.unparsed("option", option.field.name), + Placeholder.unparsed("state", value.toString()), + ) + } + } + } } private fun createToggleFeatureAliasCommand(): CommandAPICommand { - return CommandAPICommand("togglefeature") - .withPermission(commandPermission("feature", "toggleplayer")) - .withArguments(featureArgument("feature")) - .withOptionalArguments(OnePlayer("player")) - .executesSuspending { sender, arguments -> - toggleFeatureForPlayer(sender, arguments) + return commandNode("togglefeature") { + withGeneratedPermission(commandRoot, "feature", "toggleplayer") + arguments(featureArgumentParser.argument("feature")) + optionalArguments(OnePlayer("player")) + executesSuspend { sender, args -> + toggleFeatureForPlayer(sender, args) } + } } private fun createTestCommand(): CommandAPICommand { - val testRoot = CommandAPICommand("test") - .withPermission(commandPermission("test")) + return commandNode("test") { + withGeneratedPermission(commandRoot, "test") - testRoot.withSubcommand( - CommandAPICommand("users") - .withPermission(commandPermission("test", "users")) - .executesSuspending { sender, _ -> + subcommand("users", commandNodePermission(commandRoot, "test", "users")) { + executesSuspend { sender, _ -> sender.sendPrefixComponent("Fetching vanish users from database...") - sender.sendPrefixComponent("Database Vanished Users: ${VanishAPI.get().getDatabase().getVanishUsers().await().filter { it.isVanished }.map { it.username }}") - sender.sendPrefixComponent("Cache Vanished Users: ${VanishAPI.get().getCacheService().getVanishUsers().values.map { it.username }}") - }, - ) + sender.sendPrefixComponent( + "Database Vanished Users: ${ + VanishAPI.get().getDatabase().getVanishUsers().await() + .filter { it.isVanished } + .map { it.username } + }", + ) + sender.sendPrefixComponent( + "Cache Vanished Users: ${ + VanishAPI.get().getCacheService().getVanishUsers().values.map { it.username } + }", + ) + } + } - val databaseRoot = CommandAPICommand("database") - .withPermission(commandPermission("test", "database")) - - databaseRoot.withSubcommand( - CommandAPICommand("data") - .withPermission(commandPermission("test", "database", "data")) - .withOptionalArguments(IntegerArgument("limit", 1, 10000)) - .executesSuspending { sender, arguments -> - val limit = arguments.getOptionalByClass("limit", Int::class.javaObjectType).orElse(50) - val database = VanishAPI.get().getDatabase() - - val counter = MilliCounter() - counter.start() - - val users = database.getVanishUsers().await().take(limit) - for ((index, user) in users.withIndex()) { - val userProperties = user::class.memberProperties - .filterIsInstance>() - .joinToString(" | ") { prop -> - try { - "${prop.name}: ${prop.call(user)}" - } catch (_: Exception) { - "${prop.name}: Access Error" + subcommand("database", commandNodePermission(commandRoot, "test", "database")) { + subcommand("data", commandNodePermission(commandRoot, "test", "database", "data")) { + optionalArguments(IntegerArgument("limit", 1, 10000)) + executesSuspend { sender, args -> + val limit = args.optional("limit", Int::class.javaObjectType) ?: 50 + val database = VanishAPI.get().getDatabase() + + val counter = MilliCounter().apply { start() } + database.getVanishUsers().await().take(limit).forEachIndexed { index, user -> + val properties = user::class.memberProperties + .filterIsInstance>() + .joinToString(" | ") { property -> + runCatching { "${property.name}: ${property.call(user)}" } + .getOrDefault("${property.name}: Access Error") } - } - sender.sendPrefixComponent("[${index + 1}] $userProperties") - } - counter.stop() - sender.sendPrefixComponent("Took ${counter.get()}ms") - }, - ) - - databaseRoot.withSubcommand( - CommandAPICommand("performance") - .withPermission(commandPermission("test", "database", "performance")) - .withOptionalArguments( - IntegerArgument("amount", 1, 10000), - IntegerArgument("tries", 1, 10), - ) - .executesSuspending { sender, arguments -> - val amount = arguments.getOptionalByClass("amount", Int::class.javaObjectType).orElse(1) - val tries = arguments.getOptionalByClass("tries", Int::class.javaObjectType).orElse(1) - val database = VanishAPI.get().getDatabase() - - repeat(tries) { iteration -> - val counter = MilliCounter() - counter.start() - sender.sendPrefixComponent("[${iteration + 1}] Trying ${amount} Get Users from data storage") - repeat(amount) { - database.getVanishUsers().await() + sender.sendPrefixComponent("[${index + 1}] $properties") } counter.stop() - sender.sendPrefixComponent("[${iteration + 1}] Took ${counter.get()}ms") + sender.sendPrefixComponent("Took ${counter.get()}ms") } - }, - ) + } - testRoot.withSubcommand(databaseRoot) - return testRoot + subcommand("performance", commandNodePermission(commandRoot, "test", "database", "performance")) { + optionalArguments( + IntegerArgument("amount", 1, 10000), + IntegerArgument("tries", 1, 10), + ) + executesSuspend { sender, args -> + val amount = args.optional("amount", Int::class.javaObjectType) ?: 1 + val tries = args.optional("tries", Int::class.javaObjectType) ?: 1 + val database = VanishAPI.get().getDatabase() + + repeat(tries) { iteration -> + val counter = MilliCounter().apply { start() } + sender.sendPrefixComponent( + "[${iteration + 1}] Trying ${amount} Get Users from data storage", + ) + repeat(amount) { + database.getVanishUsers().await() + } + counter.stop() + sender.sendPrefixComponent( + "[${iteration + 1}] Took ${counter.get()}ms", + ) + } + } + } + } + } } private suspend fun handleRootCommand(sender: CommandSender, targetPlayer: OfflinePlayer?, state: String?) { @@ -492,9 +521,12 @@ class SayanVanishCommand : BukkitCommand( } val user = target.getOrCreateVanishUser() - if (!user.hasPermission(Permissions.VANISH)) { - sender.sendPrefixComponent(language.vanish.dontHaveUsePermission.component(Placeholder.unparsed("permission", Permissions.VANISH.permission()))) + sender.sendPrefixComponent( + language.vanish.dontHaveUsePermission.component( + Placeholder.unparsed("permission", Permissions.VANISH.permission()), + ), + ) return } @@ -516,240 +548,52 @@ class SayanVanishCommand : BukkitCommand( } } - private suspend fun toggleFeatureForPlayer(sender: CommandSender, arguments: CommandArguments) { - val targetArg = arguments.getOptionalByClass("player", Player::class.java).orElse(null) - - if (targetArg != null && !sender.hasPermission(Permissions.FEATURE_PLAYER_TOGGLE.permission())) { + private suspend fun toggleFeatureForPlayer(sender: CommandSender, args: CommandArguments) { + val target = args.optional("player", Player::class.java) + if (target != null && !sender.hasPermission(Permissions.FEATURE_PLAYER_TOGGLE.permission())) { sender.sendPrefixComponent(language.feature.togglePlayerOther) return } - if (targetArg == null && sender !is Player) { + if (target == null && sender !is Player) { sender.sendPrefixComponent(language.general.haveToProvidePlayer) return } - val target = targetArg ?: sender as Player - val feature = featureOrNotify(sender, arguments) ?: return - - val user = target.user().await() ?: run { - sender.sendPrefixComponent(language.general.userNotFound, Placeholder.unparsed("player", target.name)) + val resolvedTarget = target ?: sender as Player + val feature = featureOrNotify(sender, args) ?: return + val user = resolvedTarget.user().await() ?: run { + sender.sendPrefixComponent( + language.general.userNotFound, + Placeholder.unparsed("player", resolvedTarget.name), + ) return } val currentlyEnabled = Features.isFeatureEnabled(user, feature) Features.setFeatureEnabled(user, feature, !currentlyEnabled) - sender.sendPrefixComponent(language.feature.togglePlayer, Placeholder.unparsed("player", target.name), Placeholder.unparsed("feature", feature.id), Placeholder.unparsed("state", if (!currentlyEnabled) "enabled" else "disabled")) + sender.sendPrefixComponent( + language.feature.togglePlayer, + Placeholder.unparsed("player", resolvedTarget.name), + Placeholder.unparsed("feature", feature.id), + Placeholder.unparsed("state", if (!currentlyEnabled) "enabled" else "disabled"), + ) } - private fun featureOrNotify(sender: CommandSender, arguments: CommandArguments): Feature? { - val feature = arguments.getByClass("feature", Feature::class.java) + private fun featureOrNotify(sender: CommandSender, args: CommandArguments): Feature? { + val feature = args.required("feature", Feature::class.java) if (feature == null) { sender.sendPrefixComponent(language.feature.notFound) - return null } return feature } - private fun featureArgument(name: String): CustomArgument { - return CustomArgument(StringArgument(name)) { info -> - Features.getFeatureById(info.input()) - ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.notFound) - }.suggestTooltip { featureTooltips() } - } - - private fun featureOptionArgument(name: String): CustomArgument { - return CustomArgument(StringArgument(name)) { info -> - val feature = info.previousArgs().getByClass("feature", Feature::class.java) - ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.notFound) - - val fields = configurableFields(feature) - val field = fields.firstOrNull { it.name.equals(info.input(), ignoreCase = true) } - ?: throw CustomArgument.CustomArgumentException.fromString( - language.feature.invalidOption.replace("", fields.joinToString(", ") { it.name }), - ) - - FeatureOption(feature, field) - }.suggestTooltip { suggestion -> - val feature = suggestion.previousArgs().getByClass("feature", Feature::class.java) ?: return@suggestTooltip emptyList() - optionTooltips(feature) - } - } - - private fun featureValueArgument(name: String): CustomArgument { - return CustomArgument(GreedyStringArgument(name)) { info -> - val option = info.previousArgs().getByClass("option", FeatureOption::class.java) - ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidOption) - parseFeatureValue(option.field, info.input()) - }.suggest { suggestion -> - val option = suggestion.previousArgs().getByClass("option", FeatureOption::class.java) ?: return@suggest emptyList() - featureValueSuggestions(option.field) - } - } - - private fun configurableFields(feature: Feature): List { - return feature::class.java.declaredFields - .filter { it.isAnnotationPresent(Configurable::class.java) } - } - - private fun featureTooltips(): Collection { - return Features.features().map { feature -> - val tooltip = featureDescription(feature) - if (tooltip.isNullOrBlank()) { - StringTooltip.none(feature.id) - } else { - StringTooltip.ofString(feature.id, tooltip) - } - } - } - - private fun optionTooltips(feature: Feature): Collection { - val commentsByField = commentsByField(feature) - return configurableFields(feature).map { field -> - val tooltip = commentsByField[field.name] ?: fieldDescriptionFromFieldAnnotation(field) - if (tooltip.isNullOrBlank()) { - StringTooltip.none(field.name) - } else { - StringTooltip.ofString(field.name, tooltip) - } - } - } - - private fun featureDescription(feature: Feature): String? { - val commentsByField = commentsByField(feature) - return configurableFields(feature) - .asSequence() - .mapNotNull { commentsByField[it.name] ?: fieldDescriptionFromFieldAnnotation(it) } - .firstOrNull() - } - - @OptIn(ExperimentalSerializationApi::class) - private fun commentsByField(feature: Feature): Map { - return featureCommentCache.computeIfAbsent(feature::class.java) { featureClass -> - val serializerClass = runCatching { - Class.forName("${featureClass.name}\$\$serializer") - }.getOrNull() ?: return@computeIfAbsent emptyMap() - - val serializer = runCatching { - val instance = serializerClass.getField("INSTANCE").get(null) - instance as? KSerializer<*> - }.getOrNull() ?: return@computeIfAbsent emptyMap() - - val descriptor = serializer.descriptor - buildMap { - repeat(descriptor.elementsCount) { index -> - val optionName = descriptor.getElementName(index) - val yamlComment = descriptor.getElementAnnotations(index) - .firstOrNull { it is YamlComment } as? YamlComment - val commentLine = yamlComment?.lines - ?.asSequence() - ?.map(String::trim) - ?.filter(String::isNotBlank) - ?.joinToString(" ") - - if (!commentLine.isNullOrBlank()) { - put(optionName, commentLine) - } - } - } - } - } - - private fun fieldDescriptionFromFieldAnnotation(field: Field): String? { - val annotation = field.getAnnotation(YamlComment::class.java) ?: return null - return annotation.lines - .asSequence() - .map(String::trim) - .filter(String::isNotBlank) - .joinToString(" ") - .ifBlank { null } - } - - private fun parseFeatureValue(field: Field, raw: String): Any { - val type = field.type - return when { - type == String::class.java -> raw - type == Int::class.java || type == Integer::class.java -> - raw.toIntOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "integer")) - type == Long::class.java || type == java.lang.Long::class.java -> - raw.toLongOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "long")) - type == Float::class.java || type == java.lang.Float::class.java -> - raw.toFloatOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "float")) - type == Double::class.java || type == java.lang.Double::class.java -> - raw.toDoubleOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "double")) - type == Boolean::class.java || type == java.lang.Boolean::class.java -> - raw.toBooleanStrictOrNull() ?: throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", "true, false")) - type.isEnum -> { - val constants = type.enumConstants.map { (it as Enum<*>).name } - constants.firstOrNull { it.equals(raw, ignoreCase = true) }?.let { constant -> - type.enumConstants.first { (it as Enum<*>).name == constant } - } ?: throw CustomArgument.CustomArgumentException.fromString( - language.feature.invalidValue.replace("", constants.joinToString(", ")), - ) - } - else -> throw CustomArgument.CustomArgumentException.fromString(language.feature.invalidValue.replace("", type.simpleName ?: "N/A")) - } - } - - private fun featureValueSuggestions(field: Field): Collection { - val type = field.type - return when { - type == Boolean::class.java || type == java.lang.Boolean::class.java -> listOf("true", "false") - type == Int::class.java || type == Integer::class.java -> listOf("0", "1", "5", "10", "50", "100") - type == Long::class.java || type == java.lang.Long::class.java -> listOf("0", "1", "5", "10", "50", "100") - type == Float::class.java || type == java.lang.Float::class.java -> listOf("0.0", "0.5", "1.0", "5.0", "10.0") - type == Double::class.java || type == java.lang.Double::class.java -> listOf("0.0", "0.5", "1.0", "5.0", "10.0") - type.isEnum -> type.enumConstants.map { (it as Enum<*>).name.lowercase() } - type == String::class.java -> listOf("\"value\"") - else -> listOf("value") - } - } - - private fun offlinePlayerArgument(name: String): CustomArgument { - return CustomArgument(StringArgument(name)) { info -> - val player = offlinePlayer(info.input()) - if (!player.hasPlayedBefore() && !player.isOnline) { - throw CustomArgument.CustomArgumentException.fromString(language.general.playerNotFound) - } - player - }.suggest { suggestion -> - val search = suggestion.currentArg().lowercase() - Bukkit.getOfflinePlayers() - .asSequence() - .mapNotNull { it.name } - .filter { it.startsWith(search, ignoreCase = true) } - .take(30) - .toList() - } - } - - private fun stateArgument(name: String): CustomArgument { - return CustomArgument(StringArgument(name)) { info -> - val state = info.input().lowercase() - if (state == "on" || state == "off") { - state - } else { - throw CustomArgument.CustomArgumentException.fromString("State must be one of: on, off") - } - }.suggest(listOf("on", "off")) - } - - private fun offlinePlayer(input: String): OfflinePlayer { - return runCatching { - Bukkit.getOfflinePlayer(UUID.fromString(input)) - }.getOrElse { - Bukkit.getOfflinePlayer(input) - } - } - private suspend fun generateMainPaste(sender: CommandSender, otherKeys: Map) { val key = Paste( "json", listOf( ServerUtils.getServerData( - mutableMapOf( - "database-type" to StorageConfig.get().method.toString(), - ).apply { + mutableMapOf("database-type" to StorageConfig.get().method.toString()).apply { putAll(otherKeys) }, ), @@ -758,7 +602,6 @@ class SayanVanishCommand : BukkitCommand( val pasteKey = key.ifEmpty { "N/A" } val pasteUrl = if (pasteKey == "N/A") "N/A" else Paste.url(pasteKey) - sender.sendPrefixComponent( language.paste.use .replace("https://pastes.dev/", pasteUrl) @@ -767,11 +610,11 @@ class SayanVanishCommand : BukkitCommand( ) } - private fun commandPermission(vararg nodes: String): String { - val root = Settings.get().vanishCommand.name.lowercase() - return "${plugin.name.lowercase()}.commands.${listOf(root, *nodes).joinToString(".")}" + private fun CommandArguments.required(name: String, type: Class): T? { + return getByClass(name, type) } - private data class FeatureOption(val feature: Feature, val field: Field) - + private fun CommandArguments.optional(name: String, type: Class): T? { + return getOptionalByClass(name, type).orElse(null) + } } diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureArgumentParser.kt new file mode 100644 index 00000000..1da579a5 --- /dev/null +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureArgumentParser.kt @@ -0,0 +1,80 @@ +package org.sayandev.sayanvanish.paper.command.argument + +import com.charleskorn.kaml.YamlComment +import dev.jorel.commandapi.IStringTooltip +import dev.jorel.commandapi.StringTooltip +import dev.jorel.commandapi.arguments.CustomArgument +import dev.jorel.commandapi.arguments.StringArgument +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import org.sayandev.sayanvanish.api.feature.Configurable +import org.sayandev.sayanvanish.api.feature.Feature +import org.sayandev.sayanvanish.api.feature.Features +import org.sayandev.stickynote.command.bukkit.suggestTooltip +import java.util.concurrent.ConcurrentHashMap + +class FeatureArgumentParser( + private val notFoundMessage: () -> String, +) { + + private val commentsCache = ConcurrentHashMap, Map>() + + fun argument(name: String): CustomArgument { + return CustomArgument(StringArgument(name)) { info -> + Features.getFeatureById(info.input()) + ?: throw CustomArgument.CustomArgumentException.fromString(notFoundMessage()) + }.suggestTooltip { tooltips() } + } + + private fun tooltips(): Collection { + return Features.features().map { feature -> + val description = featureDescription(feature) + if (description.isNullOrBlank()) { + StringTooltip.none(feature.id) + } else { + StringTooltip.ofString(feature.id, description) + } + } + } + + private fun featureDescription(feature: Feature): String? { + val comments = commentsByField(feature) + return feature::class.java.declaredFields + .asSequence() + .filter { it.isAnnotationPresent(Configurable::class.java) } + .mapNotNull { comments[it.name] } + .firstOrNull() + } + + @OptIn(ExperimentalSerializationApi::class) + private fun commentsByField(feature: Feature): Map { + return commentsCache.computeIfAbsent(feature::class.java) { featureClass -> + val serializerClass = runCatching { + Class.forName("${featureClass.name}\$\$serializer") + }.getOrNull() ?: return@computeIfAbsent emptyMap() + + val serializer = runCatching { + serializerClass.getField("INSTANCE").get(null) as? KSerializer<*> + }.getOrNull() ?: return@computeIfAbsent emptyMap() + + val descriptor = serializer.descriptor + buildMap { + repeat(descriptor.elementsCount) { index -> + val key = descriptor.getElementName(index) + val comment = descriptor.getElementAnnotations(index) + .firstOrNull { it is YamlComment } + ?.let { it as YamlComment } + ?.lines + ?.asSequence() + ?.map(String::trim) + ?.filter(String::isNotBlank) + ?.joinToString(" ") + + if (!comment.isNullOrBlank()) { + put(key, comment) + } + } + } + } + } +} diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOption.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOption.kt new file mode 100644 index 00000000..5448a524 --- /dev/null +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOption.kt @@ -0,0 +1,9 @@ +package org.sayandev.sayanvanish.paper.command.argument + +import org.sayandev.sayanvanish.api.feature.Feature +import java.lang.reflect.Field + +data class FeatureOption( + val feature: Feature, + val field: Field, +) diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOptionArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOptionArgumentParser.kt new file mode 100644 index 00000000..7aabbf3b --- /dev/null +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOptionArgumentParser.kt @@ -0,0 +1,88 @@ +package org.sayandev.sayanvanish.paper.command.argument + +import com.charleskorn.kaml.YamlComment +import dev.jorel.commandapi.IStringTooltip +import dev.jorel.commandapi.StringTooltip +import dev.jorel.commandapi.arguments.CustomArgument +import dev.jorel.commandapi.arguments.StringArgument +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import org.sayandev.sayanvanish.api.feature.Configurable +import org.sayandev.sayanvanish.api.feature.Feature +import org.sayandev.stickynote.command.bukkit.suggestTooltip +import java.lang.reflect.Field +import java.util.concurrent.ConcurrentHashMap + +class FeatureOptionArgumentParser( + private val featureNotFoundMessage: () -> String, + private val invalidOptionMessage: (Collection) -> String, +) { + + private val commentsCache = ConcurrentHashMap, Map>() + + fun argument(name: String): CustomArgument { + return CustomArgument(StringArgument(name)) { info -> + val feature = info.previousArgs().getByClass("feature", Feature::class.java) + ?: throw CustomArgument.CustomArgumentException.fromString(featureNotFoundMessage()) + val fields = configurableFields(feature) + val field = fields.firstOrNull { it.name.equals(info.input(), ignoreCase = true) } + ?: throw CustomArgument.CustomArgumentException.fromString( + invalidOptionMessage(fields.map(Field::getName)), + ) + FeatureOption(feature, field) + }.suggestTooltip { suggestion -> + val feature = suggestion.previousArgs().getByClass("feature", Feature::class.java) + ?: return@suggestTooltip emptyList() + optionTooltips(feature) + } + } + + private fun optionTooltips(feature: Feature): Collection { + val comments = commentsByField(feature) + return configurableFields(feature).map { field -> + val description = comments[field.name] + if (description.isNullOrBlank()) { + StringTooltip.none(field.name) + } else { + StringTooltip.ofString(field.name, description) + } + } + } + + private fun configurableFields(feature: Feature): List { + return feature::class.java.declaredFields + .filter { it.isAnnotationPresent(Configurable::class.java) } + } + + @OptIn(ExperimentalSerializationApi::class) + private fun commentsByField(feature: Feature): Map { + return commentsCache.computeIfAbsent(feature::class.java) { featureClass -> + val serializerClass = runCatching { + Class.forName("${featureClass.name}\$\$serializer") + }.getOrNull() ?: return@computeIfAbsent emptyMap() + + val serializer = runCatching { + serializerClass.getField("INSTANCE").get(null) as? KSerializer<*> + }.getOrNull() ?: return@computeIfAbsent emptyMap() + + val descriptor = serializer.descriptor + buildMap { + repeat(descriptor.elementsCount) { index -> + val key = descriptor.getElementName(index) + val comment = descriptor.getElementAnnotations(index) + .firstOrNull { it is YamlComment } + ?.let { it as YamlComment } + ?.lines + ?.asSequence() + ?.map(String::trim) + ?.filter(String::isNotBlank) + ?.joinToString(" ") + + if (!comment.isNullOrBlank()) { + put(key, comment) + } + } + } + } + } +} diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureValueArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureValueArgumentParser.kt new file mode 100644 index 00000000..2d202a85 --- /dev/null +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureValueArgumentParser.kt @@ -0,0 +1,62 @@ +package org.sayandev.sayanvanish.paper.command.argument + +import dev.jorel.commandapi.arguments.CustomArgument +import dev.jorel.commandapi.arguments.GreedyStringArgument +import org.sayandev.stickynote.command.bukkit.suggest + +class FeatureValueArgumentParser( + private val invalidOptionMessage: () -> String, + private val invalidValueMessage: (String) -> String, +) { + + fun argument(name: String): CustomArgument { + return CustomArgument(GreedyStringArgument(name)) { info -> + val option = info.previousArgs().getByClass("option", FeatureOption::class.java) + ?: throw CustomArgument.CustomArgumentException.fromString(invalidOptionMessage()) + parse(option.field.type, info.input()) + }.suggest { suggestion -> + val option = suggestion.previousArgs().getByClass("option", FeatureOption::class.java) ?: return@suggest emptyList() + suggestions(option.field.type) + } + } + + private fun parse(type: Class<*>, raw: String): Any { + return when { + type == String::class.java -> raw + type == Int::class.java || type == Integer::class.java -> + raw.toIntOrNull() ?: invalid("integer") + type == Long::class.java || type == java.lang.Long::class.java -> + raw.toLongOrNull() ?: invalid("long") + type == Float::class.java || type == java.lang.Float::class.java -> + raw.toFloatOrNull() ?: invalid("float") + type == Double::class.java || type == java.lang.Double::class.java -> + raw.toDoubleOrNull() ?: invalid("double") + type == Boolean::class.java || type == java.lang.Boolean::class.java -> + raw.toBooleanStrictOrNull() ?: invalid("true, false") + type.isEnum -> { + val constants = type.enumConstants.map { (it as Enum<*>).name } + val matched = constants.firstOrNull { it.equals(raw, ignoreCase = true) } + ?: invalid(constants.joinToString(", ")) + type.enumConstants.first { (it as Enum<*>).name == matched } + } + else -> invalid(type.simpleName ?: "N/A") + } + } + + private fun suggestions(type: Class<*>): Collection { + return when { + type == Boolean::class.java || type == java.lang.Boolean::class.java -> listOf("true", "false") + type == Int::class.java || type == Integer::class.java -> listOf("0", "1", "5", "10", "50", "100") + type == Long::class.java || type == java.lang.Long::class.java -> listOf("0", "1", "5", "10", "50", "100") + type == Float::class.java || type == java.lang.Float::class.java -> listOf("0.0", "0.5", "1.0", "5.0", "10.0") + type == Double::class.java || type == java.lang.Double::class.java -> listOf("0.0", "0.5", "1.0", "5.0", "10.0") + type.isEnum -> type.enumConstants.map { (it as Enum<*>).name.lowercase() } + type == String::class.java -> listOf("\"value\"") + else -> listOf("value") + } + } + + private fun invalid(expected: String): Nothing { + throw CustomArgument.CustomArgumentException.fromString(invalidValueMessage(expected)) + } +} diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/OfflinePlayerArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/OfflinePlayerArgumentParser.kt new file mode 100644 index 00000000..859d5be9 --- /dev/null +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/OfflinePlayerArgumentParser.kt @@ -0,0 +1,40 @@ +package org.sayandev.sayanvanish.paper.command.argument + +import dev.jorel.commandapi.arguments.CustomArgument +import dev.jorel.commandapi.arguments.StringArgument +import org.bukkit.Bukkit +import org.bukkit.OfflinePlayer +import org.sayandev.stickynote.command.bukkit.suggest +import java.util.UUID + +class OfflinePlayerArgumentParser( + private val notFoundMessage: () -> String, +) { + + fun argument(name: String): CustomArgument { + return CustomArgument(StringArgument(name)) { info -> + val player = lookup(info.input()) + if (player.hasPlayedBefore() || player.isOnline) { + player + } else { + throw CustomArgument.CustomArgumentException.fromString(notFoundMessage()) + } + }.suggest { suggestion -> + val input = suggestion.currentArg().lowercase() + Bukkit.getOfflinePlayers() + .asSequence() + .mapNotNull { it.name } + .filter { it.startsWith(input, ignoreCase = true) } + .take(30) + .toList() + } + } + + private fun lookup(input: String): OfflinePlayer { + return runCatching { + Bukkit.getOfflinePlayer(UUID.fromString(input)) + }.getOrElse { + Bukkit.getOfflinePlayer(input) + } + } +} diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/StateArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/StateArgumentParser.kt new file mode 100644 index 00000000..437919f9 --- /dev/null +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/StateArgumentParser.kt @@ -0,0 +1,22 @@ +package org.sayandev.sayanvanish.paper.command.argument + +import dev.jorel.commandapi.arguments.CustomArgument +import dev.jorel.commandapi.arguments.StringArgument +import org.sayandev.stickynote.command.bukkit.suggest + +class StateArgumentParser( + private val invalidStateMessage: () -> String, + private val allowedStates: Set = setOf("on", "off"), +) { + + fun argument(name: String): CustomArgument { + return CustomArgument(StringArgument(name)) { info -> + val state = info.input().lowercase() + if (state in allowedStates) { + state + } else { + throw CustomArgument.CustomArgumentException.fromString(invalidStateMessage()) + } + }.suggest(allowedStates.toList()) + } +} From 744b455dc93300d3978bcebfe32ba4e5e6b72220 Mon Sep 17 00:00:00 2001 From: Syrent Date: Fri, 27 Feb 2026 17:30:46 +0330 Subject: [PATCH 65/67] build: update stickynote --- StickyNote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StickyNote b/StickyNote index f191a3d6..08cc5386 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit f191a3d6f7aa802792e7788b76d95207b925c359 +Subproject commit 08cc53863b5c984aa3d1634a0d5c14ba4d693db3 From 7768ba5ff799e364177fc604d1bf1f6771f668d3 Mon Sep 17 00:00:00 2001 From: Syrent Date: Fri, 27 Feb 2026 20:21:03 +0330 Subject: [PATCH 66/67] build: update stickynote --- StickyNote | 2 +- docs | 2 +- sayanvanish-api/build.gradle.kts | 13 ++++++++ sayanvanish-paper/build.gradle.kts | 17 ++++++---- .../sayanvanish/paper/PaperPlatform.kt | 4 +-- .../sayanvanish/paper/SayanVanishPlugin.kt | 16 +++++++--- .../sayanvanish/paper/VanishManager.kt | 4 +-- .../sayanvanish/paper/api/PaperUser.kt | 8 ++--- .../sayanvanish/paper/api/PaperVanishUser.kt | 13 +++++--- .../paper/command/SayanVanishCommand.kt | 32 +++++++++++-------- .../command/argument/FeatureArgumentParser.kt | 20 +++++++++++- .../paper/command/argument/FeatureOption.kt | 18 +++++++++++ .../argument/FeatureOptionArgumentParser.kt | 20 +++++++++++- .../argument/FeatureValueArgumentParser.kt | 20 +++++++++++- .../argument/OfflinePlayerArgumentParser.kt | 20 +++++++++++- .../command/argument/StateArgumentParser.kt | 20 +++++++++++- .../paper/config/LanguageConfig.kt | 2 +- .../sayanvanish/paper/config/Settings.kt | 2 +- .../sayanvanish/paper/feature/HookFeature.kt | 2 +- .../paper/feature/ListenedFeature.kt | 4 +-- .../feature/features/FeatureActionbar.kt | 7 ++-- .../paper/feature/features/FeatureEffect.kt | 6 ++-- .../feature/features/FeatureFakeMessage.kt | 4 +-- .../paper/feature/features/FeatureGameMode.kt | 2 +- .../features/FeatureInventoryInspect.kt | 2 +- .../features/FeatureInvulnerability.kt | 2 +- .../paper/feature/features/FeatureLevel.kt | 10 +++--- .../features/FeatureRegisterPermissions.kt | 2 +- .../features/FeatureSilentContainer.kt | 4 +-- .../paper/feature/features/FeatureState.kt | 2 +- .../paper/feature/features/FeatureUpdate.kt | 2 +- .../features/hook/AdvancedServerListImpl.kt | 2 +- .../features/hook/FeatureHookCitizens.kt | 2 +- .../features/hook/FeatureHookDiscordSRV.kt | 2 +- .../features/hook/FeatureHookDynmap.kt | 2 +- .../features/hook/FeatureHookEssentials.kt | 2 +- .../features/hook/FeatureHookLuckPerms.kt | 2 +- .../hook/FeatureHookMiniPlaceholders.kt | 4 +-- .../features/hook/FeatureHookPl3xMap.kt | 2 +- .../hook/FeatureHookPlaceholderAPI.kt | 8 ++--- .../features/hook/FeatureHookSquareMap.kt | 2 +- .../feature/features/hook/FeatureHookTAB.kt | 2 +- .../prevent/FeatureLegacyPreventPickup.kt | 2 +- .../FeaturePreventAdvancementAnnounce.kt | 4 +-- .../features/prevent/FeaturePreventChat.kt | 4 +-- .../prevent/FeaturePreventInteract.kt | 2 +- .../features/prevent/FeaturePreventPickup.kt | 2 +- .../features/prevent/FeaturePreventPush.kt | 4 +-- .../prevent/FeaturePreventRaidTrigger.kt | 2 +- .../features/prevent/FeaturePreventSculk.kt | 2 +- .../prevent/FeaturePreventServerPing.kt | 4 +-- .../prevent/FeaturePreventSpawnerSpawn.kt | 6 ++-- .../sayanvanish/paper/utils/PlayerUtils.kt | 6 ++-- .../sayanvanish/paper/utils/ServerUtils.kt | 6 ++-- sayanvanish-proxy/build.gradle.kts | 18 +++++------ .../build.gradle.kts | 9 +++--- .../sayanvanish/velocity/SayanVanishPlugin.kt | 10 ++++-- .../velocity/VelocityPlatformAdapter.kt | 2 -- .../SayanVanishProxyCommandVelocity.kt | 4 +++ settings.gradle.kts | 6 ++++ 60 files changed, 279 insertions(+), 126 deletions(-) diff --git a/StickyNote b/StickyNote index 08cc5386..ed759527 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit 08cc53863b5c984aa3d1634a0d5c14ba4d693db3 +Subproject commit ed759527bcf5ea0f6ba702f0d231ae89f6731fa2 diff --git a/docs b/docs index 7fc25dab..395178f8 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 7fc25dab7ebaed90c3632893ec9815c2ddaf4bf3 +Subproject commit 395178f88e8a082118c2f3c27cb5dc7934570336 diff --git a/sayanvanish-api/build.gradle.kts b/sayanvanish-api/build.gradle.kts index eacd4cc0..c0c02844 100644 --- a/sayanvanish-api/build.gradle.kts +++ b/sayanvanish-api/build.gradle.kts @@ -1,3 +1,16 @@ +stickynote { + registerModule(core { + database + configuration { + kotlinx + } + messaging { + redis + websocket + } + }) +} + dependencies { compileOnlyApi(libs.discordsrv) compileOnlyApi(libs.luckperms.api) diff --git a/sayanvanish-paper/build.gradle.kts b/sayanvanish-paper/build.gradle.kts index 1c1da6da..cbd94643 100644 --- a/sayanvanish-paper/build.gradle.kts +++ b/sayanvanish-paper/build.gradle.kts @@ -1,5 +1,4 @@ import net.minecrell.pluginyml.bukkit.BukkitPluginDescription -import org.sayandev.plugin.StickyNoteModules import xyz.jpenilla.runpaper.task.RunServer plugins { @@ -9,8 +8,15 @@ plugins { } stickynote { - modules(StickyNoteModules.PAPER, StickyNoteModules.BUKKIT, StickyNoteModules.BUKKIT_NMS) -// relocate(!gradle.startParameter.getTaskNames().any { it.startsWith("runServer") || it.startsWith("runFolia") || it.startsWith("runVelocity") }) + registerModule(core { + configuration { + kotlinx + } + }) + registerModule(paper { + nms + command + }) } dependencies { @@ -28,7 +34,6 @@ dependencies { // compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT") // paperweight.paperDevBundle("1.21.1-R0.1-SNAPSHOT") implementation(project(":sayanvanish-api")) - implementation("org.sayandev:stickynote-command-bukkit:2.0.0-alpha.38") } tasks.withType(xyz.jpenilla.runtask.task.AbstractRun::class) { @@ -59,7 +64,7 @@ tasks { } runServer { - runDirectory = file("run/bukkit-1") + runDirectory = file("run/paper-1") jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false", "-Dserver.id=lobby-1") } withType(RunServer::class.java) { @@ -77,7 +82,7 @@ tasks { jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false") } register("runServer2") { - runDirectory = file("run/bukkit-2") + runDirectory = file("run/paper-2") jvmArgs("-Dnet.kyori.adventure.text.warnWhenLegacyFormattingDetected=false", "-Dserver.id=lobby-2") } diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt index 3a6da388..32820ccc 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/PaperPlatform.kt @@ -57,8 +57,8 @@ import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventScu import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventServerPing import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventSpawnerSpawn import org.sayandev.sayanvanish.paper.feature.features.prevent.FeaturePreventTabComplete -import org.sayandev.stickynote.bukkit.plugin -import org.sayandev.stickynote.bukkit.pluginDirectory +import org.sayandev.stickynote.paper.plugin +import org.sayandev.stickynote.paper.pluginDirectory class PaperPlatform : Platform( "bukkit", diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt index 797aa672..6aceb230 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/SayanVanishPlugin.kt @@ -31,11 +31,12 @@ import org.sayandev.sayanvanish.paper.api.Metrics import org.sayandev.sayanvanish.paper.command.SayanVanishCommand import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.config.language -import org.sayandev.stickynote.command.bukkit.CommandApiLifecycle -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.WrappedStickyNotePlugin -import org.sayandev.stickynote.bukkit.error +import org.sayandev.stickynote.command.paper.CommandApiLifecycle +import org.sayandev.stickynote.paper.StickyNote +import org.sayandev.stickynote.paper.WrappedStickyNotePlugin +import org.sayandev.stickynote.paper.error import java.io.File +import java.util.logging.Level class SayanVanishPlugin : JavaPlugin() { @@ -83,7 +84,12 @@ class SayanVanishPlugin : JavaPlugin() { override fun onDisable() { runBlocking { - Platform.get().unregister() + runCatching { VanishAPI.shutdown() }.onFailure { + logger.log(Level.SEVERE, "Failed to shut down SayanVanish API cleanly", it) + } + runCatching { Platform.get().unregister() }.onFailure { + logger.log(Level.SEVERE, "Failed to unregister SayanVanish platform cleanly", it) + } } CommandApiLifecycle.disable() StickyNote.shutdown() diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt index 97d10654..2c44f555 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/VanishManager.kt @@ -28,8 +28,8 @@ import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateUser import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getOrAddUser import org.sayandev.sayanvanish.paper.config.Settings -import org.sayandev.stickynote.bukkit.launch -import org.sayandev.stickynote.bukkit.registerListener +import org.sayandev.stickynote.paper.launch +import org.sayandev.stickynote.paper.registerListener object VanishManager : Listener { diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt index d052a9b2..01d84fb4 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperUser.kt @@ -28,10 +28,10 @@ import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.paper.utils.PermissionUtils.asBukkitPermissionDefault import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent -import org.sayandev.stickynote.bukkit.extension.sendComponent -import org.sayandev.stickynote.bukkit.extension.sendComponentActionbar -import org.sayandev.stickynote.bukkit.utils.AdventureUtils -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component +import org.sayandev.stickynote.paper.extension.sendComponent +import org.sayandev.stickynote.paper.extension.sendComponentActionbar +import org.sayandev.stickynote.paper.utils.AdventureUtils +import org.sayandev.stickynote.paper.utils.AdventureUtils.component import java.util.* class PaperUser( diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt index 6d815f29..864f6e37 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/api/PaperVanishUser.kt @@ -18,6 +18,7 @@ */ package org.sayandev.sayanvanish.paper.api +import net.kyori.adventure.text.Component import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import org.bukkit.Bukkit import org.bukkit.OfflinePlayer @@ -36,11 +37,12 @@ import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.features.FeatureLevel import org.sayandev.sayanvanish.paper.feature.features.hook.FeatureHookLuckPerms -import org.sayandev.stickynote.bukkit.hasPlugin -import org.sayandev.stickynote.bukkit.onlinePlayers -import org.sayandev.stickynote.bukkit.plugin -import org.sayandev.stickynote.bukkit.server -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.extension.sendComponent +import org.sayandev.stickynote.paper.hasPlugin +import org.sayandev.stickynote.paper.onlinePlayers +import org.sayandev.stickynote.paper.plugin +import org.sayandev.stickynote.paper.server +import org.sayandev.stickynote.paper.utils.ServerVersion import java.util.* open class PaperVanishUser( @@ -107,6 +109,7 @@ open class PaperVanishUser( } player()?.isSleepingIgnored = false + player()?.sendComponent(Component.empty()) player()?.removeMetadata("vanished", plugin) showUser() diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt index 1b8e8b84..34f21198 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/SayanVanishCommand.kt @@ -53,25 +53,25 @@ import org.sayandev.sayanvanish.paper.feature.features.FeatureLevel import org.sayandev.sayanvanish.paper.feature.features.FeatureUpdate import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent import org.sayandev.sayanvanish.paper.utils.ServerUtils -import org.sayandev.stickynote.bukkit.async -import org.sayandev.stickynote.bukkit.plugin -import org.sayandev.stickynote.bukkit.pluginDirectory -import org.sayandev.stickynote.bukkit.runAsync -import org.sayandev.stickynote.bukkit.runSync -import org.sayandev.stickynote.bukkit.unregisterListener -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component -import org.sayandev.stickynote.command.bukkit.BukkitCommand -import org.sayandev.stickynote.command.bukkit.commandNodePermission -import org.sayandev.stickynote.command.bukkit.command as commandNode -import org.sayandev.stickynote.command.bukkit.dsl -import org.sayandev.stickynote.command.bukkit.withGeneratedPermission -import org.sayandev.stickynote.command.bukkit.withUsePermission +import org.sayandev.stickynote.paper.async +import org.sayandev.stickynote.paper.plugin +import org.sayandev.stickynote.paper.pluginDirectory +import org.sayandev.stickynote.paper.runAsync +import org.sayandev.stickynote.paper.runSync +import org.sayandev.stickynote.paper.unregisterListener +import org.sayandev.stickynote.paper.utils.AdventureUtils.component +import org.sayandev.stickynote.command.paper.PaperCommand +import org.sayandev.stickynote.command.paper.commandNodePermission +import org.sayandev.stickynote.command.paper.command as commandNode +import org.sayandev.stickynote.command.paper.dsl +import org.sayandev.stickynote.command.paper.withGeneratedPermission +import org.sayandev.stickynote.command.paper.withUsePermission import org.sayandev.stickynote.core.utils.MilliCounter import java.io.File import kotlin.reflect.KProperty1 import kotlin.reflect.full.memberProperties -class SayanVanishCommand : BukkitCommand( +class SayanVanishCommand : PaperCommand( Settings.get().vanishCommand.name, *Settings.get().vanishCommand.aliases.toTypedArray(), ) { @@ -98,6 +98,10 @@ class SayanVanishCommand : BukkitCommand( invalidValueMessage = { expected -> language.feature.invalidValue.replace("", expected) }, ) + init { + register() + } + override fun build(command: CommandAPICommand) { command.dsl { withUsePermission() diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureArgumentParser.kt index 1da579a5..3e11318c 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureArgumentParser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureArgumentParser.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.command.argument import com.charleskorn.kaml.YamlComment @@ -10,7 +28,7 @@ import kotlinx.serialization.KSerializer import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.Feature import org.sayandev.sayanvanish.api.feature.Features -import org.sayandev.stickynote.command.bukkit.suggestTooltip +import org.sayandev.stickynote.command.paper.suggestTooltip import java.util.concurrent.ConcurrentHashMap class FeatureArgumentParser( diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOption.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOption.kt index 5448a524..68a55490 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOption.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOption.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.command.argument import org.sayandev.sayanvanish.api.feature.Feature diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOptionArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOptionArgumentParser.kt index 7aabbf3b..22ef6dc4 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOptionArgumentParser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureOptionArgumentParser.kt @@ -1,3 +1,21 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.command.argument import com.charleskorn.kaml.YamlComment @@ -9,7 +27,7 @@ import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.Feature -import org.sayandev.stickynote.command.bukkit.suggestTooltip +import org.sayandev.stickynote.command.paper.suggestTooltip import java.lang.reflect.Field import java.util.concurrent.ConcurrentHashMap diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureValueArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureValueArgumentParser.kt index 2d202a85..a836ffdf 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureValueArgumentParser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/FeatureValueArgumentParser.kt @@ -1,8 +1,26 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.command.argument import dev.jorel.commandapi.arguments.CustomArgument import dev.jorel.commandapi.arguments.GreedyStringArgument -import org.sayandev.stickynote.command.bukkit.suggest +import org.sayandev.stickynote.command.paper.suggest class FeatureValueArgumentParser( private val invalidOptionMessage: () -> String, diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/OfflinePlayerArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/OfflinePlayerArgumentParser.kt index 859d5be9..904ba0b3 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/OfflinePlayerArgumentParser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/OfflinePlayerArgumentParser.kt @@ -1,10 +1,28 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.command.argument import dev.jorel.commandapi.arguments.CustomArgument import dev.jorel.commandapi.arguments.StringArgument import org.bukkit.Bukkit import org.bukkit.OfflinePlayer -import org.sayandev.stickynote.command.bukkit.suggest +import org.sayandev.stickynote.command.paper.suggest import java.util.UUID class OfflinePlayerArgumentParser( diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/StateArgumentParser.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/StateArgumentParser.kt index 437919f9..832664d3 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/StateArgumentParser.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/command/argument/StateArgumentParser.kt @@ -1,8 +1,26 @@ +/* + * This file is part of SayanVanish, licensed under the GNU General Public License v3.0. + * + * Copyright (c) 2026 Sayan Development and contributors + * + * SayanVanish is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SayanVanish is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.sayandev.sayanvanish.paper.command.argument import dev.jorel.commandapi.arguments.CustomArgument import dev.jorel.commandapi.arguments.StringArgument -import org.sayandev.stickynote.command.bukkit.suggest +import org.sayandev.stickynote.command.paper.suggest class StateArgumentParser( private val invalidStateMessage: () -> String, diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt index ce200c9f..d070f223 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/LanguageConfig.kt @@ -19,7 +19,7 @@ package org.sayandev.sayanvanish.paper.config import kotlinx.serialization.Serializable -import org.sayandev.stickynote.bukkit.pluginDirectory +import org.sayandev.stickynote.paper.pluginDirectory import org.sayandev.stickynote.core.configuration.Config import java.io.File diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt index 5dd0e928..466e5df4 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/config/Settings.kt @@ -20,7 +20,7 @@ package org.sayandev.sayanvanish.paper.config import com.charleskorn.kaml.YamlComment import org.sayandev.sayanvanish.api.Platform -import org.sayandev.stickynote.bukkit.pluginDirectory +import org.sayandev.stickynote.paper.pluginDirectory import org.sayandev.stickynote.core.configuration.Config import kotlinx.serialization.Serializable import java.io.File diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt index e47e7838..b8b99018 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/HookFeature.kt @@ -22,7 +22,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import org.sayandev.sayanvanish.api.User import org.sayandev.sayanvanish.api.feature.category.FeatureCategories -import org.sayandev.stickynote.bukkit.hasPlugin +import org.sayandev.stickynote.paper.hasPlugin @Serializable abstract class HookFeature : ListenedFeature() { diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt index 9ee8b1be..3dfdc62e 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/ListenedFeature.kt @@ -21,8 +21,8 @@ package org.sayandev.sayanvanish.paper.feature import kotlinx.serialization.Serializable import org.bukkit.event.Listener import org.sayandev.sayanvanish.api.feature.Feature -import org.sayandev.stickynote.bukkit.registerListener -import org.sayandev.stickynote.bukkit.unregisterListener +import org.sayandev.stickynote.paper.registerListener +import org.sayandev.stickynote.paper.unregisterListener @Serializable abstract class ListenedFeature : Feature(), Listener { diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt index f1f08cc7..b1790029 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureActionbar.kt @@ -31,9 +31,9 @@ import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVa import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.launch -import org.sayandev.stickynote.bukkit.onlinePlayers +import org.sayandev.stickynote.paper.StickyNote +import org.sayandev.stickynote.paper.launch +import org.sayandev.stickynote.paper.onlinePlayers @RegisteredFeature @Serializable @@ -69,7 +69,6 @@ class FeatureActionbar( delay(delayMillis) while (StickyNote.plugin().isEnabled && enabled && isActive) { // TODO: remove this warning -// warn("vanished: ${VanishAPI.get().getCacheService().getVanishUsers().values.joinToString(" ,") { "${it.username}:${it.isVanished}" }}") for (user in onlinePlayers.mapNotNull { it.cachedVanishUser() }.filter { it.isVanished }) { if (!isActive(user)) continue user.sendActionbar(content) diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt index 55687ac1..6a4ffad1 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureEffect.kt @@ -33,9 +33,9 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.nms.NMSUtils.sendPacket -import org.sayandev.stickynote.bukkit.nms.PacketUtils -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.nms.NMSUtils.sendPacket +import org.sayandev.stickynote.paper.nms.PacketUtils +import org.sayandev.stickynote.paper.utils.ServerVersion import org.sayandev.stickynote.core.configuration.Config import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt index 07c5a25c..ba2876b2 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureFakeMessage.kt @@ -36,8 +36,8 @@ import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendRawComponent -import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook -import org.sayandev.stickynote.bukkit.onlinePlayers +import org.sayandev.stickynote.paper.hook.PlaceholderAPIHook +import org.sayandev.stickynote.paper.onlinePlayers @RegisteredFeature @Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt index 49563daa..637639d9 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureGameMode.kt @@ -26,7 +26,7 @@ import org.bukkit.event.player.PlayerToggleSneakEvent import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.StickyNote.runSync +import org.sayandev.stickynote.paper.StickyNote.runSync import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import kotlinx.serialization.Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt index 1ae72d6b..852a6582 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInventoryInspect.kt @@ -32,7 +32,7 @@ import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.plugin +import org.sayandev.stickynote.paper.plugin import java.util.* @RegisteredFeature diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt index 63eb721c..4f3ecdcc 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureInvulnerability.kt @@ -25,7 +25,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt index 6e1b20da..3035217d 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureLevel.kt @@ -32,11 +32,11 @@ import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCache import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.* -import org.sayandev.stickynote.bukkit.nms.NMSUtils -import org.sayandev.stickynote.bukkit.nms.NMSUtils.sendPacket -import org.sayandev.stickynote.bukkit.nms.PacketUtils -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.* +import org.sayandev.stickynote.paper.nms.NMSUtils +import org.sayandev.stickynote.paper.nms.NMSUtils.sendPacket +import org.sayandev.stickynote.paper.nms.PacketUtils +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt index 329352a3..06dab9e5 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureRegisterPermissions.kt @@ -27,7 +27,7 @@ import org.bukkit.event.player.PlayerJoinEvent import org.sayandev.sayanvanish.api.Permissions import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.plugin +import org.sayandev.stickynote.paper.plugin @RegisteredFeature @Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt index d368cde2..fe4147cd 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureSilentContainer.kt @@ -36,8 +36,8 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.runSync -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.runSync +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import java.util.* diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt index bc35410c..e4c18019 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureState.kt @@ -36,7 +36,7 @@ import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVa import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.launch +import org.sayandev.stickynote.paper.launch @RegisteredFeature @Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt index fc74a5b0..b83e17a4 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/FeatureUpdate.kt @@ -35,7 +35,7 @@ import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.feature.ListenedFeature import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendPrefixComponent import org.sayandev.sayanvanish.paper.utils.PlayerUtils.sendRawComponent -import org.sayandev.stickynote.bukkit.* +import org.sayandev.stickynote.paper.* import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import com.charleskorn.kaml.YamlComment diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt index 2cd2603a..e3fd83cf 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/AdvancedServerListImpl.kt @@ -27,7 +27,7 @@ import org.sayandev.sayanvanish.api.SayanVanishAPI import org.sayandev.sayanvanish.api.VanishAPI import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.config.language -import org.sayandev.stickynote.bukkit.onlinePlayers +import org.sayandev.stickynote.paper.onlinePlayers // TODO: we have so many placeholder providers, maybe we should create a common base class for them? class AdvancedServerListImpl : PlaceholderProvider("sayanvanish") { diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt index b33d534a..8a26f80f 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookCitizens.kt @@ -29,7 +29,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.registerListener +import org.sayandev.stickynote.paper.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt index 2f9ad84a..011bfbc5 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDiscordSRV.kt @@ -26,7 +26,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.registerListener +import org.sayandev.stickynote.paper.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt index a879d9ac..82efc63a 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookDynmap.kt @@ -27,7 +27,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.registerListener +import org.sayandev.stickynote.paper.registerListener import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt index 7c45d025..d32fca14 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookEssentials.kt @@ -26,7 +26,7 @@ import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.registerListener +import org.sayandev.stickynote.paper.registerListener import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt index 69ae35f6..c584d1c5 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookLuckPerms.kt @@ -36,7 +36,7 @@ import org.sayandev.sayanvanish.api.feature.Configurable import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.getCachedOrCreateVanishUser import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.warn +import org.sayandev.stickynote.paper.warn import java.util.* @RegisteredFeature diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt index cd104627..b45b13f3 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookMiniPlaceholders.kt @@ -31,8 +31,8 @@ import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVa import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.onlinePlayers -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component +import org.sayandev.stickynote.paper.onlinePlayers +import org.sayandev.stickynote.paper.utils.AdventureUtils.component @RegisteredFeature @Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt index 18ec33d9..a7066e73 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPl3xMap.kt @@ -26,7 +26,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.registerListener +import org.sayandev.stickynote.paper.registerListener import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt index d4e06aec..09772994 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookPlaceholderAPI.kt @@ -26,14 +26,14 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook -import org.sayandev.stickynote.bukkit.onlinePlayers +import org.sayandev.stickynote.paper.StickyNote +import org.sayandev.stickynote.paper.hook.PlaceholderAPIHook +import org.sayandev.stickynote.paper.onlinePlayers import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName -import org.sayandev.stickynote.bukkit.warn +import org.sayandev.stickynote.paper.warn @RegisteredFeature @Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt index 143f10cb..45a0af3d 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookSquareMap.kt @@ -25,7 +25,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.registerListener +import org.sayandev.stickynote.paper.registerListener import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import xyz.jpenilla.squaremap.api.SquaremapProvider diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt index e26b3b97..879123c3 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/hook/FeatureHookTAB.kt @@ -24,7 +24,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.paper.api.PaperVanishUser import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.HookFeature -import org.sayandev.stickynote.bukkit.plugin +import org.sayandev.stickynote.paper.plugin import kotlinx.serialization.Serializable import kotlinx.serialization.SerialName import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt index b1d678d5..58799022 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeatureLegacyPreventPickup.kt @@ -27,7 +27,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.utils.ServerVersion @RegisteredFeature @Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt index e20d6bcb..0993d7c3 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventAdvancementAnnounce.kt @@ -25,8 +25,8 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.StickyNote +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt index 85be8d43..0546bf41 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventChat.kt @@ -34,8 +34,8 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.config.language import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.plugin +import org.sayandev.stickynote.paper.StickyNote +import org.sayandev.stickynote.paper.plugin @RegisteredFeature @Serializable diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt index 8e06ab96..925792be 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventInteract.kt @@ -29,7 +29,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import com.charleskorn.kaml.YamlComment import kotlinx.serialization.SerialName diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt index 3cd33c44..5ebb1735 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPickup.kt @@ -26,7 +26,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt index beb71f5d..ddf75f88 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventPush.kt @@ -27,8 +27,8 @@ import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.event.PaperUserUnVanishEvent import org.sayandev.sayanvanish.paper.api.event.PaperUserVanishEvent import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.hasPlugin +import org.sayandev.stickynote.paper.StickyNote +import org.sayandev.stickynote.paper.hasPlugin import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt index 1f9320d2..b944f287 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventRaidTrigger.kt @@ -25,7 +25,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt index 45e79022..25953713 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSculk.kt @@ -30,7 +30,7 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt index 7ef2e988..e4526e05 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventServerPing.kt @@ -26,8 +26,8 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.PaperVanishUser.Companion.bukkitAdapt import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.StickyNote +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt index e55cc883..dcc43013 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/feature/features/prevent/FeaturePreventSpawnerSpawn.kt @@ -26,9 +26,9 @@ import org.sayandev.sayanvanish.api.feature.RegisteredFeature import org.sayandev.sayanvanish.api.feature.category.FeatureCategories import org.sayandev.sayanvanish.paper.api.SayanVanishPaperAPI.Companion.cachedVanishUser import org.sayandev.sayanvanish.paper.feature.ListenedFeature -import org.sayandev.stickynote.bukkit.StickyNote -import org.sayandev.stickynote.bukkit.onlinePlayers -import org.sayandev.stickynote.bukkit.utils.ServerVersion +import org.sayandev.stickynote.paper.StickyNote +import org.sayandev.stickynote.paper.onlinePlayers +import org.sayandev.stickynote.paper.utils.ServerVersion import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt index d4d43960..e507904d 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/PlayerUtils.kt @@ -24,9 +24,9 @@ import org.bukkit.command.CommandSender import org.bukkit.entity.Player import org.sayandev.sayanvanish.paper.config.Settings import org.sayandev.sayanvanish.paper.config.language -import org.sayandev.stickynote.bukkit.hook.PlaceholderAPIHook -import org.sayandev.stickynote.bukkit.utils.AdventureUtils -import org.sayandev.stickynote.bukkit.utils.AdventureUtils.component +import org.sayandev.stickynote.paper.hook.PlaceholderAPIHook +import org.sayandev.stickynote.paper.utils.AdventureUtils +import org.sayandev.stickynote.paper.utils.AdventureUtils.component object PlayerUtils { diff --git a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt index 48361e0a..0f1992ee 100644 --- a/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt +++ b/sayanvanish-paper/src/main/kotlin/org/sayandev/sayanvanish/paper/utils/ServerUtils.kt @@ -23,9 +23,9 @@ import com.google.gson.JsonArray import com.google.gson.JsonObject import org.bukkit.plugin.Plugin import org.sayandev.sayanvanish.api.VanishAPI -import org.sayandev.stickynote.bukkit.onlinePlayers -import org.sayandev.stickynote.bukkit.plugin -import org.sayandev.stickynote.bukkit.server +import org.sayandev.stickynote.paper.onlinePlayers +import org.sayandev.stickynote.paper.plugin +import org.sayandev.stickynote.paper.server import java.time.Instant diff --git a/sayanvanish-proxy/build.gradle.kts b/sayanvanish-proxy/build.gradle.kts index 34d6c4d3..2df59c0a 100644 --- a/sayanvanish-proxy/build.gradle.kts +++ b/sayanvanish-proxy/build.gradle.kts @@ -1,11 +1,11 @@ -import org.sayandev.plugin.StickyNoteModules - -allprojects { - stickynote { - modules(StickyNoteModules.PROXY) - } +stickynote { + registerModule(core { + configuration { + kotlinx + } + }) +} - dependencies { - implementation(project(":sayanvanish-api")) - } +dependencies { + api(project(":sayanvanish-api")) } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts b/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts index 803d2db4..21dfa7d9 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/build.gradle.kts @@ -1,11 +1,13 @@ -import org.sayandev.plugin.StickyNoteModules - plugins { id("xyz.jpenilla.run-velocity") version "3.0.2" } stickynote { - modules(StickyNoteModules.VELOCITY) + registerModule(proxy { + velocity { + command + } + }) } dependencies { @@ -16,7 +18,6 @@ dependencies { annotationProcessor(libs.velocity.api) api(project(":sayanvanish-proxy")) - implementation("org.sayandev:stickynote-command-velocity:2.0.0-alpha.38") } tasks.withType(xyz.jpenilla.runtask.task.AbstractRun::class) { diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt index 23ca170a..75101475 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/SayanVanishPlugin.kt @@ -33,7 +33,7 @@ import org.sayandev.sayanvanish.proxy.config.language import org.sayandev.sayanvanish.velocity.api.SayanVanishVelocityAPI import org.sayandev.sayanvanish.velocity.command.SayanVanishProxyCommandVelocity import org.sayandev.stickynote.command.velocity.CommandApiLifecycle -import org.sayandev.stickynote.loader.velocity.StickyNoteVelocityLoader +import org.sayandev.stickynote.velocity.StickyNoteBootstrap import org.sayandev.stickynote.velocity.launch import org.sayandev.stickynote.velocity.registerListener import org.slf4j.Logger @@ -55,7 +55,7 @@ class SayanVanishPlugin @Inject constructor( @Subscribe fun onProxyInitialize(event: ProxyInitializeEvent) { - StickyNoteVelocityLoader(this, PLUGIN_ID, server, logger, dataDirectory) + StickyNoteBootstrap.initialize(this, PLUGIN_ID, server, logger, dataDirectory, suspendingPluginContainer) suspendingPluginContainer.initialize(this) setInstance(this) Platform.get().rootDirectory = dataDirectory.toFile() @@ -96,6 +96,12 @@ class SayanVanishPlugin @Inject constructor( @Subscribe fun onProxyShutdown(event: ProxyShutdownEvent) { + runCatching { VanishAPI.shutdown() }.onFailure { + logger.error("Failed to shut down SayanVanish API cleanly", it) + } + runCatching { Platform.get().unregisterBlocking() }.onFailure { + logger.error("Failed to unregister SayanVanish platform cleanly", it) + } CommandApiLifecycle.disable() } diff --git a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt index cef4f1af..6069f1ed 100644 --- a/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt +++ b/sayanvanish-proxy/sayanvanish-proxy-velocity/src/main/kotlin/org/sayandev/sayanvanish/velocity/VelocityPlatformAdapter.kt @@ -35,9 +35,7 @@ object VelocityPlatformAdapter : PlatformAdapter Date: Fri, 27 Feb 2026 20:25:07 +0330 Subject: [PATCH 67/67] chore: update xseries --- StickyNote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StickyNote b/StickyNote index ed759527..90a15524 160000 --- a/StickyNote +++ b/StickyNote @@ -1 +1 @@ -Subproject commit ed759527bcf5ea0f6ba702f0d231ae89f6731fa2 +Subproject commit 90a15524cb4d5416e82af3f52fc9c2fc5b259561