diff --git a/api-files/versions.json b/api-files/versions.json index bb1fee53..03297e9e 100644 --- a/api-files/versions.json +++ b/api-files/versions.json @@ -1,4 +1,652 @@ [ + { + "uniqueId": "faff7fbf-b33f-efff-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.8.8-R0.1-SNAPSHOT-latest.jar", + "buildId": null, + "version": { + "name": "1.8.8", + "protocolId": 47, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "bf7dffeb-fbf9-fdfd-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.10.jar", + "buildId": null, + "version": { + "name": "1.9.4", + "protocolId": 210, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "6e5ffe46-7de5-de9f-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.9.4-R0.1-SNAPSHOT-latest.jar", + "buildId": null, + "version": { + "name": "1.9.4", + "protocolId": 110, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "bef37dfb-fff7-eabf-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.10-R0.1-SNAPSHOT-latest.jar", + "buildId": null, + "version": { + "name": "1.10.1", + "protocolId": 210, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "eb7e676a-ffeb-ffde-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.10.2-R0.1-SNAPSHOT-latest.jar", + "buildId": null, + "version": { + "name": "1.10.2", + "protocolId": 210, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "97be6fdf-4bbf-ffb7-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.11.jar", + "buildId": null, + "version": { + "name": "1.11", + "protocolId": 315, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "ffcc6f7e-d95f-ff9d-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.11.1.jar", + "buildId": null, + "version": { + "name": "1.11.1", + "protocolId": 316, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "7fbcf9f6-baff-e9bd-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.11.2.jar", + "buildId": null, + "version": { + "name": "1.11.2", + "protocolId": 316, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "6acf8ef5-df5b-f7ec-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.12.jar", + "buildId": null, + "version": { + "name": "1.12", + "protocolId": 335, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "eb7debfa-dfce-f53b-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.12.1.jar", + "buildId": null, + "version": { + "name": "1.12.1", + "protocolId": 338, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "ff5feafe-7dee-1f9f-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.12.2.jar", + "buildId": null, + "version": { + "name": "1.12.2", + "protocolId": 340, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "dedb7ffe-fdef-fb7f-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.13.jar", + "buildId": null, + "version": { + "name": "1.13", + "protocolId": 393, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "c76f6fed-eeb7-fded-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.13.1.jar", + "buildId": null, + "version": { + "name": "1.13.1", + "protocolId": 401, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "c76f6fed-eeb7-fded-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.13.1.jar", + "buildId": null, + "version": { + "name": "1.13.1", + "protocolId": 401, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "bba8cffe-d4cd-baef-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.13.2.jar", + "buildId": null, + "version": { + "name": "1.13.2", + "protocolId": 404, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "bdd5ebf8-6ef5-7eba-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.14.jar", + "buildId": null, + "version": { + "name": "1.14", + "protocolId": 477, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "f7ffebff-dbef-ffdf-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.14.1.jar", + "buildId": null, + "version": { + "name": "1.14.1", + "protocolId": 480, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "b9dbfdb5-b7bf-754e-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.14.2.jar", + "buildId": null, + "version": { + "name": "1.14.2", + "protocolId": 485, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "f5db1fab-bfee-7fbe-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.14.3.jar", + "buildId": null, + "version": { + "name": "1.14.3", + "protocolId": 490, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "d4b7bacd-7a7f-9d96-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.14.4.jar", + "buildId": null, + "version": { + "name": "1.14.4", + "protocolId": 498, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "f77ffa0f-fe9e-b9dc-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.15.jar", + "buildId": null, + "version": { + "name": "1.15", + "protocolId": 573, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "3df3bdff-96ff-7ddd-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.15.1.jar", + "buildId": null, + "version": { + "name": "1.15.1", + "protocolId": 575, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "fed73cdd-a7fb-76fb-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.15.2.jar", + "buildId": null, + "version": { + "name": "1.15.2", + "protocolId": 578, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "fc4b737f-fa63-4ed3-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.16.1.jar", + "buildId": null, + "version": { + "name": "1.16.1", + "protocolId": 736, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "e77ffbd3-fbff-ffaf-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.16.2.jar", + "buildId": null, + "version": { + "name": "1.16.2", + "protocolId": 751, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "fc3ef75f-536f-fe21-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.16.3.jar", + "buildId": null, + "version": { + "name": "1.16.3", + "protocolId": 753, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, + { + "uniqueId": "ffe7efdd-dffd-6fbf-0000-000000000000", + "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", + "projectName": "spigot", + "customDownloadUrl": "https://cdn.getbukkit.org/spigot/spigot-1.16.4.jar", + "buildId": null, + "version": { + "name": "1.16.4", + "protocolId": 754, + "versionTypes": [ + "!VELOCITY" + ] + }, + "javaVersionId": null, + "libPattern": null, + "patch": true, + "online": true, + "used": false, + "jvmArguments": [], + "environmentVariables": {}, + "programParameters": [], + "defaultFiles": {}, + "fileEdits": {} + }, { "uniqueId": "feb5ffd3-cefa-5edc-0000-000000000000", "typeId": "6760e0ea-455d-44bc-84c4-ec603125e61a", @@ -1775,7 +2423,6 @@ "defaultFiles": {}, "fileEdits": {} }, - { "uniqueId": "bffcedab-dfda-faf5-0000-000000000000", "typeId": "6fa280a8-aaed-4ee7-99e4-c337b6985098", diff --git a/apis/base-api/build.gradle.kts b/apis/base-api/build.gradle.kts index d1210d73..163ff423 100644 --- a/apis/base-api/build.gradle.kts +++ b/apis/base-api/build.gradle.kts @@ -9,4 +9,5 @@ val publishToRepository by extra(true) dependencies { compileOnly(project(":utils")) compileOnly(project(":logging")) + compileOnly(BuildDependencies.KYORI_ADVENTURE_API) } \ No newline at end of file diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/module/ModuleHandlerInitializedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/module/ModuleHandlerInitializedEvent.kt similarity index 83% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/module/ModuleHandlerInitializedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/module/ModuleHandlerInitializedEvent.kt index 8b4c1359..0bf27674 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/module/ModuleHandlerInitializedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/module/ModuleHandlerInitializedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.module +package dev.redicloud.api.events.internal.module import dev.redicloud.api.events.CloudEvent import dev.redicloud.api.events.EventFireType diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/module/ModulesLoadedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/module/ModulesLoadedEvent.kt similarity index 82% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/module/ModulesLoadedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/module/ModulesLoadedEvent.kt index e1da72b3..90ad9fec 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/module/ModulesLoadedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/module/ModulesLoadedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.module +package dev.redicloud.api.events.internal.module import dev.redicloud.api.events.CloudEvent import dev.redicloud.api.events.EventFireType diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeConnectEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeConnectEvent.kt similarity index 79% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeConnectEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeConnectEvent.kt index 8502e25c..a0bf3643 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeConnectEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeConnectEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.node +package dev.redicloud.api.events.internal.node import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeDisconnectEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeDisconnectEvent.kt similarity index 79% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeDisconnectEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeDisconnectEvent.kt index b0138ac3..4961898f 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeDisconnectEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeDisconnectEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.node +package dev.redicloud.api.events.internal.node import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeEvent.kt similarity index 83% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeEvent.kt index 3f37b91b..194c137d 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.node +package dev.redicloud.api.events.internal.node import dev.redicloud.api.events.CloudEvent import dev.redicloud.api.events.EventFireType diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeMasterChangedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeMasterChangedEvent.kt similarity index 81% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeMasterChangedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeMasterChangedEvent.kt index 39a00e58..09a64ceb 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeMasterChangedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeMasterChangedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.node +package dev.redicloud.api.events.internal.node import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeSuspendedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeSuspendedEvent.kt similarity index 81% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeSuspendedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeSuspendedEvent.kt index 4c957725..c41795ee 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/NodeSuspendedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/NodeSuspendedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.node +package dev.redicloud.api.events.internal.node import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeConnectedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeConnectedEvent.kt similarity index 70% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeConnectedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeConnectedEvent.kt index c8197632..162eac51 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeConnectedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeConnectedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.node.file +package dev.redicloud.api.events.internal.node.file import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeDisconnectedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeDisconnectedEvent.kt similarity index 70% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeDisconnectedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeDisconnectedEvent.kt index 0854cd55..13fd5de8 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeDisconnectedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeDisconnectedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.node.file +package dev.redicloud.api.events.internal.node.file import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeEvent.kt similarity index 80% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeEvent.kt index 9608dce5..0147341f 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/node/file/FileNodeEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/node/file/FileNodeEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.node.file +package dev.redicloud.api.events.internal.node.file import dev.redicloud.api.events.CloudEvent import dev.redicloud.api.events.EventFireType diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerConnectedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerConnectedEvent.kt similarity index 68% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerConnectedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerConnectedEvent.kt index a9aa2c29..ee0c491b 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerConnectedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerConnectedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.player +package dev.redicloud.api.events.internal.player import java.util.UUID diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerDisconnectEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerDisconnectEvent.kt similarity index 68% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerDisconnectEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerDisconnectEvent.kt index 03b3fe10..8cac25d0 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerDisconnectEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerDisconnectEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.player +package dev.redicloud.api.events.internal.player import java.util.UUID diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerEvent.kt similarity index 80% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerEvent.kt index 7b944848..cbd2cb53 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.player +package dev.redicloud.api.events.internal.player import dev.redicloud.api.events.CloudEvent import dev.redicloud.api.events.EventFireType diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerSwitchServerEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerSwitchServerEvent.kt similarity index 79% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerSwitchServerEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerSwitchServerEvent.kt index 7e510b24..8428a1c4 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/player/CloudPlayerSwitchServerEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/player/CloudPlayerSwitchServerEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.player +package dev.redicloud.api.events.internal.player import dev.redicloud.api.service.ServiceId import java.util.UUID diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerConnectedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerConnectedEvent.kt similarity index 80% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerConnectedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerConnectedEvent.kt index c9887687..4e56afce 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerConnectedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerConnectedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.server +package dev.redicloud.api.events.internal.server import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerDeleteEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerDeleteEvent.kt similarity index 81% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerDeleteEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerDeleteEvent.kt index 9f3d02ac..fa459522 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerDeleteEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerDeleteEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.server +package dev.redicloud.api.events.internal.server import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerDisconnectedEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerDisconnectedEvent.kt similarity index 80% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerDisconnectedEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerDisconnectedEvent.kt index 86dbc36a..2a23517e 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerDisconnectedEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerDisconnectedEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.server +package dev.redicloud.api.events.internal.server import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerEvent.kt similarity index 82% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerEvent.kt index 1b079afa..082e835c 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.server +package dev.redicloud.api.events.internal.server import dev.redicloud.api.events.CloudEvent import dev.redicloud.api.events.EventFireType diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerRegisteredEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerRegisteredEvent.kt similarity index 80% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerRegisteredEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerRegisteredEvent.kt index 29d1d208..e0f3f92d 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerRegisteredEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerRegisteredEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.server +package dev.redicloud.api.events.internal.server import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerStateChangeEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerStateChangeEvent.kt similarity index 85% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerStateChangeEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerStateChangeEvent.kt index 352bc511..0efed07c 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerStateChangeEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerStateChangeEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.server +package dev.redicloud.api.events.internal.server import dev.redicloud.api.service.server.CloudServerState import dev.redicloud.api.events.EventFireType diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerTransferredEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerTransferredEvent.kt similarity index 82% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerTransferredEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerTransferredEvent.kt index f714ebaa..ff9b37c8 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerTransferredEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerTransferredEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.server +package dev.redicloud.api.events.internal.server import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerUnregisteredEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerUnregisteredEvent.kt similarity index 80% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerUnregisteredEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerUnregisteredEvent.kt index 231fcfe9..0b23e7a7 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/server/CloudServerUnregisteredEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/server/CloudServerUnregisteredEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.server +package dev.redicloud.api.events.internal.server import dev.redicloud.api.events.EventFireType import dev.redicloud.api.service.ServiceId diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/template/configuration/ConfigurationTemplateEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/template/configuration/ConfigurationTemplateEvent.kt similarity index 79% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/template/configuration/ConfigurationTemplateEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/template/configuration/ConfigurationTemplateEvent.kt index cd178821..ddaaa3ed 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/template/configuration/ConfigurationTemplateEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/template/configuration/ConfigurationTemplateEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.template.configuration +package dev.redicloud.api.events.internal.template.configuration import dev.redicloud.api.events.CloudEvent import dev.redicloud.api.events.EventFireType diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/template/configuration/ConfigurationTemplateUpdateEvent.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/template/configuration/ConfigurationTemplateUpdateEvent.kt similarity index 77% rename from apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/template/configuration/ConfigurationTemplateUpdateEvent.kt rename to apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/template/configuration/ConfigurationTemplateUpdateEvent.kt index 4fad033e..ea6b8d8d 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/events/impl/template/configuration/ConfigurationTemplateUpdateEvent.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/events/internal/template/configuration/ConfigurationTemplateUpdateEvent.kt @@ -1,4 +1,4 @@ -package dev.redicloud.api.events.impl.template.configuration +package dev.redicloud.api.events.internal.template.configuration import dev.redicloud.api.events.EventFireType import java.util.UUID diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/player/ICloudPlayerExecutor.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/player/ICloudPlayerExecutor.kt new file mode 100644 index 00000000..c4707efc --- /dev/null +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/player/ICloudPlayerExecutor.kt @@ -0,0 +1,51 @@ +package dev.redicloud.api.player + +import dev.redicloud.api.service.ServiceId +import dev.redicloud.api.service.server.ICloudServer +import net.kyori.adventure.bossbar.BossBar +import net.kyori.adventure.inventory.Book +import net.kyori.adventure.resource.ResourcePackRequest +import net.kyori.adventure.sound.Sound +import java.util.UUID +import net.kyori.adventure.text.Component +import net.kyori.adventure.title.Title + +interface ICloudPlayerExecutor { + + suspend fun sendMessage(uniqueId: UUID, component: Component) + suspend fun sendMessage(cloudPlayer: ICloudPlayer, component: Component) + + suspend fun showBossBar(uniqueId: UUID, bossBar: BossBar) + suspend fun showBossBar(cloudPlayer: ICloudPlayer, bossBar: BossBar) + + suspend fun hideBossBar(uniqueId: UUID, bossBar: BossBar) + suspend fun hideBossBar(cloudPlayer: ICloudPlayer, bossBar: BossBar) + + suspend fun playSound(uniqueId: UUID, sound: Sound) + suspend fun playSound(cloudPlayer: ICloudPlayer, sound: Sound) + + suspend fun stopSound(uniqueId: UUID, sound: Sound) + suspend fun stopSound(cloudPlayer: ICloudPlayer, sound: Sound) + + suspend fun showTitle(uniqueId: UUID, title: Title) + suspend fun showTitle(cloudPlayer: ICloudPlayer, title: Title) + + suspend fun showBook(uniqueId: UUID, book: Book) + suspend fun showBook(cloudPlayer: ICloudPlayer, book: Book) + + suspend fun sendPlayerListHeaderAndFooter(uniqueId: UUID, header: Component, footer: Component) + suspend fun sendPlayerListHeaderAndFooter(cloudPlayer: ICloudPlayer, header: Component, footer: Component) + + suspend fun sendResourcePacks(uniqueId: UUID, resourcePackRequest: ResourcePackRequest) + suspend fun sendResourcePacks(cloudPlayer: ICloudPlayer, resourcePackRequest: ResourcePackRequest) + + suspend fun connect(uniqueId: UUID, serviceId: ServiceId) + suspend fun connect(uniqueId: UUID, serverName: String) + suspend fun connect(cloudPlayer: ICloudPlayer, serverName: String) + suspend fun connect(cloudPlayer: ICloudPlayer, serviceId: ServiceId) + suspend fun connect(cloudPlayer: ICloudPlayer, server: ICloudServer) + + suspend fun kick(uniqueId: UUID, reason: Component) + suspend fun kick(cloudPlayer: ICloudPlayer, reason: Component) + +} \ No newline at end of file diff --git a/apis/base-api/src/main/kotlin/dev/redicloud/api/service/server/ICloudServerRepository.kt b/apis/base-api/src/main/kotlin/dev/redicloud/api/service/server/ICloudServerRepository.kt index f898f8fb..a2f54ba5 100644 --- a/apis/base-api/src/main/kotlin/dev/redicloud/api/service/server/ICloudServerRepository.kt +++ b/apis/base-api/src/main/kotlin/dev/redicloud/api/service/server/ICloudServerRepository.kt @@ -25,6 +25,6 @@ interface ICloudServerRepository { suspend fun getRegisteredServers(type: ServiceType): List - suspend fun getFallback(vararg currentServerIds: ServiceId?): ICloudMinecraftServer? + suspend fun getFallback(vararg ignoredServerIds: ServiceId?): ICloudMinecraftServer? } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/BuildDependencies.kt b/buildSrc/src/main/kotlin/BuildDependencies.kt index 927beb36..cb13c25b 100644 --- a/buildSrc/src/main/kotlin/BuildDependencies.kt +++ b/buildSrc/src/main/kotlin/BuildDependencies.kt @@ -1,5 +1,5 @@ object BuildDependencies { - const val CLOUD_VERSION = "2.3.7-RELEASE" + const val CLOUD_VERSION = "2.4.0-SNAPSHOT" const val CLOUD_LIBLOADER_VERSION = "1.7.0" const val CLOUD_LIBLOADER_BOOTSTRAP = "dev.redicloud.libloader:libloader-bootstrap:1.7.0" @@ -37,6 +37,11 @@ object BuildDependencies { const val DOCKER_TEST_CONTAINERS = "org.testcontainers:testcontainers:1.19.7" const val BCPROV = "org.bouncycastle:bcprov-jdk15on:1.70" const val BCPKIX = "org.bouncycastle:bcpkix-jdk15on:1.70" + + const val KYORI_ADVENTURE_API = "net.kyori:adventure-api:4.17.0" + const val KYORI_ADVENTURE_BUKKIT = "net.kyori:adventure-platform-bukkit:4.3.3" + const val KYORI_ADVENTURE_BUNGEECORD = "net.kyori:adventure-platform-bungeecord:4.3.3" + const val KYORI_ADVENTURE_SERIALIZER_GSON = "net.kyori:adventure-text-serializer-gson:4.17.0" } fun String.withVersion(version: String): String { diff --git a/connectors/bukkit-connector/build.gradle.kts b/connectors/bukkit-connector/build.gradle.kts index eb3501df..6a82e342 100644 --- a/connectors/bukkit-connector/build.gradle.kts +++ b/connectors/bukkit-connector/build.gradle.kts @@ -42,6 +42,9 @@ dependencies { compileOnly(BuildDependencies.SPIGOT_API) shade(project(":connectors:bukkit-legacy")) + + compileOnly(BuildDependencies.KYORI_ADVENTURE_API) + compileOnly(BuildDependencies.KYORI_ADVENTURE_BUKKIT) } val shadowModJar by tasks.creating(ShadowJar::class) { diff --git a/connectors/bukkit-connector/src/main/kotlin/dev/redicloud/connector/bukkit/BukkitConnector.kt b/connectors/bukkit-connector/src/main/kotlin/dev/redicloud/connector/bukkit/BukkitConnector.kt index 37280604..346e5d73 100644 --- a/connectors/bukkit-connector/src/main/kotlin/dev/redicloud/connector/bukkit/BukkitConnector.kt +++ b/connectors/bukkit-connector/src/main/kotlin/dev/redicloud/connector/bukkit/BukkitConnector.kt @@ -1,11 +1,14 @@ package dev.redicloud.connector.bukkit import dev.redicloud.api.provider.IServerPlayerProvider +import dev.redicloud.connector.bukkit.player.BukkitPlayerExecutor import dev.redicloud.connector.bukkit.provider.BukkitScreenProvider import dev.redicloud.connector.bukkit.provider.BukkitServerPlayerProvider +import dev.redicloud.service.base.player.BasePlayerExecutor import dev.redicloud.service.minecraft.MinecraftServerService import dev.redicloud.service.minecraft.provider.AbstractScreenProvider import kotlinx.coroutines.runBlocking +import net.kyori.adventure.platform.bukkit.BukkitAudiences import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin @@ -14,6 +17,7 @@ class BukkitConnector(val plugin: JavaPlugin) : MinecraftServerService Unit) { + val builder = Component.text() + if (clickCommand != null) { + builder.clickEvent(ClickEvent.runCommand(clickCommand)) + } + lambda(builder) + val bungeeCordComponent = BungeeComponentSerializer.get().serialize(builder.build()) + ProxyServer.getInstance().players.filter { it.hasPermission(permission) }.forEach { + it.sendMessage(*bungeeCordComponent) + } + } + +} \ No newline at end of file diff --git a/connectors/bungeecord-connector/src/main/kotlin/dev/redicloud/connector/bungeecord/player/BungeeCordPlayerExecutor.kt b/connectors/bungeecord-connector/src/main/kotlin/dev/redicloud/connector/bungeecord/player/BungeeCordPlayerExecutor.kt new file mode 100644 index 00000000..c9aa3b49 --- /dev/null +++ b/connectors/bungeecord-connector/src/main/kotlin/dev/redicloud/connector/bungeecord/player/BungeeCordPlayerExecutor.kt @@ -0,0 +1,56 @@ +package dev.redicloud.connector.bungeecord.player + +import dev.redicloud.api.packets.IPacketManager +import dev.redicloud.api.player.ICloudPlayer +import dev.redicloud.api.player.ICloudPlayerRepository +import dev.redicloud.api.service.ServiceId +import dev.redicloud.api.service.server.ICloudServer +import dev.redicloud.api.service.server.ICloudServerRepository +import dev.redicloud.service.base.player.BasePlayerExecutor +import kotlinx.coroutines.runBlocking +import net.kyori.adventure.audience.Audience +import net.kyori.adventure.platform.bungeecord.BungeeAudiences +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer +import net.md_5.bungee.api.ProxyServer +import net.md_5.bungee.api.plugin.Plugin + +class BungeeCordPlayerExecutor( + private val plugin: Plugin, + playerRepository: ICloudPlayerRepository, + serverRepository: ICloudServerRepository, + packetManager: IPacketManager, + thisServiceId: ServiceId +) : BasePlayerExecutor(playerRepository, serverRepository, packetManager, thisServiceId) { + + private var audiences: BungeeAudiences? = null + + override fun audience(player: ICloudPlayer): Audience { + if (audiences == null) { + audiences = BungeeAudiences.create(plugin) + } + return audiences!!.player(player.uniqueId) + } + + override fun executeConnect(cloudPlayer: ICloudPlayer, server: ICloudServer) { + val player = ProxyServer.getInstance().getPlayer(cloudPlayer.uniqueId) + if (player == null || !player.isConnected) { + runBlocking { this@BungeeCordPlayerExecutor.connect(cloudPlayer, server) } + return + } + val serverInfo = ProxyServer.getInstance().getServerInfo(server.name) ?: return + player.connect(serverInfo) + } + + override fun executeKick(cloudPlayer: ICloudPlayer, reason: Component) { + val player = ProxyServer.getInstance().getPlayer(cloudPlayer.uniqueId) + if (player == null || !player.isConnected) { + runBlocking { this@BungeeCordPlayerExecutor.executeKick(cloudPlayer, reason) } + return + } + val components = BungeeComponentSerializer.get().serialize(reason) + player.disconnect(*components) + } + + +} \ No newline at end of file diff --git a/connectors/bungeecord-connector/src/main/resources/bungee.yml b/connectors/bungeecord-connector/src/main/resources/bungee.yml index 5ad8395d..3ebc4fcb 100644 --- a/connectors/bungeecord-connector/src/main/resources/bungee.yml +++ b/connectors/bungeecord-connector/src/main/resources/bungee.yml @@ -1,5 +1,5 @@ name: redicloud-connector -version: 2.3.7-RELEASE +version: 2.4.0-SNAPSHOT url: https://redicloud.dev author: RediCloud main: dev.redicloud.connector.bungeecord.bootstrap.BungeeCordConnectorBootstrap diff --git a/connectors/minestom-connector/src/main/kotlin/dev/redicloud/connector/minestom/MinestomConnector.kt b/connectors/minestom-connector/src/main/kotlin/dev/redicloud/connector/minestom/MinestomConnector.kt index 30160547..a76c0c30 100644 --- a/connectors/minestom-connector/src/main/kotlin/dev/redicloud/connector/minestom/MinestomConnector.kt +++ b/connectors/minestom-connector/src/main/kotlin/dev/redicloud/connector/minestom/MinestomConnector.kt @@ -1,8 +1,10 @@ package dev.redicloud.connector.minestom import dev.redicloud.api.provider.IServerPlayerProvider +import dev.redicloud.connector.minestom.player.MinestomPlayerExecutor import dev.redicloud.connector.minestom.provider.MinestomScreenProvider import dev.redicloud.connector.minestom.provider.MinestomServerPlayerProvider +import dev.redicloud.service.base.player.BasePlayerExecutor import dev.redicloud.service.minecraft.MinecraftServerService import dev.redicloud.service.minecraft.provider.AbstractScreenProvider import kotlinx.coroutines.runBlocking @@ -16,6 +18,8 @@ class MinestomConnector(val extension: Extension) : MinecraftServerService() { internal var velocityShuttingDown: Boolean = false override var playerProvider: IServerPlayerProvider = VelocityServerPlayerProvider(proxyServer) override val screenProvider: AbstractScreenProvider = VelocityScreenProvider(this.packetManager, this.proxyServer) + override val playerExecutor: BasePlayerExecutor = VelocityPlayerExecutor(this.proxyServer, this.playerRepository, this.serverRepository, this.packetManager, this.serviceId) + override val notificationListeners: AbstractCloudNotificationListeners = CloudNotificationListeners(this.proxyServer, this.serverRepository, this.nodeRepository, this.eventManager) + init { initApi() diff --git a/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/bootstrap/VelocityConnectorBootstrap.kt b/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/bootstrap/VelocityConnectorBootstrap.kt index 8e4a7434..24227779 100644 --- a/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/bootstrap/VelocityConnectorBootstrap.kt +++ b/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/bootstrap/VelocityConnectorBootstrap.kt @@ -19,7 +19,7 @@ import kotlin.system.exitProcess @Plugin( id = "redicloud-connector", name = "redicloud-connector-velocity", - version = "2.3.7-RELEASE", + version = "2.4.0-SNAPSHOT", url = "https://redicloud.dev", authors = ["RediCloud"] ) diff --git a/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/listener/CloudNotificationListeners.kt b/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/listener/CloudNotificationListeners.kt new file mode 100644 index 00000000..c83f7ed7 --- /dev/null +++ b/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/listener/CloudNotificationListeners.kt @@ -0,0 +1,31 @@ +package dev.redicloud.connector.velocity.listener + +import com.velocitypowered.api.proxy.ProxyServer +import dev.redicloud.api.events.IEventManager +import dev.redicloud.api.service.node.ICloudNodeRepository +import dev.redicloud.api.service.server.ICloudServerRepository +import dev.redicloud.service.minecraft.listener.AbstractCloudNotificationListeners +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.TextComponent +import net.kyori.adventure.text.event.ClickEvent + +class CloudNotificationListeners( + private val proxyServer: ProxyServer, + serverRepository: ICloudServerRepository, + nodeRepository: ICloudNodeRepository, + eventManager: IEventManager +) : AbstractCloudNotificationListeners(serverRepository, nodeRepository, eventManager) { + + override fun sendMessage(permission: String, clickCommand: String?, lambda: (TextComponent.Builder) -> Unit) { + val builder = Component.text() + if (clickCommand != null) { + builder.clickEvent(ClickEvent.runCommand(clickCommand)) + } + lambda(builder) + val component = builder.build() + this.proxyServer.allPlayers.filter { it.hasPermission(permission) }.forEach { + it.sendMessage(component) + } + } + +} \ No newline at end of file diff --git a/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/player/VelocityPlayerExecutor.kt b/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/player/VelocityPlayerExecutor.kt new file mode 100644 index 00000000..599325f6 --- /dev/null +++ b/connectors/velocity-connector/src/main/kotlin/dev/redicloud/connector/velocity/player/VelocityPlayerExecutor.kt @@ -0,0 +1,47 @@ +package dev.redicloud.connector.velocity.player + +import com.velocitypowered.api.proxy.ProxyServer +import dev.redicloud.api.packets.IPacketManager +import dev.redicloud.api.player.ICloudPlayer +import dev.redicloud.api.player.ICloudPlayerRepository +import dev.redicloud.api.service.ServiceId +import dev.redicloud.api.service.server.ICloudServer +import dev.redicloud.api.service.server.ICloudServerRepository +import dev.redicloud.service.base.player.BasePlayerExecutor +import kotlinx.coroutines.runBlocking +import net.kyori.adventure.audience.Audience +import net.kyori.adventure.text.Component +import kotlin.jvm.optionals.getOrNull + +class VelocityPlayerExecutor( + private val proxyServer: ProxyServer, + playerRepository: ICloudPlayerRepository, + serverRepository: ICloudServerRepository, + packetManager: IPacketManager, + thisServiceId: ServiceId +) : BasePlayerExecutor(playerRepository, serverRepository, packetManager, thisServiceId) { + + override fun audience(player: ICloudPlayer): Audience { + return proxyServer.getPlayer(player.uniqueId).getOrNull()!! + } + + override fun executeConnect(cloudPlayer: ICloudPlayer, server: ICloudServer) { + val player = proxyServer.getPlayer(cloudPlayer.uniqueId).getOrNull() + if (player == null || !player.isActive) { + runBlocking { this@VelocityPlayerExecutor.connect(cloudPlayer, server) } + return + } + val serverInfo = proxyServer.getServer(server.name).getOrNull() ?: return + player.createConnectionRequest(serverInfo).fireAndForget() + } + + override fun executeKick(cloudPlayer: ICloudPlayer, reason: Component) { + val player = proxyServer.getPlayer(cloudPlayer.uniqueId).getOrNull() + if (player == null || !player.isActive) { + runBlocking { this@VelocityPlayerExecutor.kick(cloudPlayer, reason) } + return + } + player.disconnect(reason) + } + +} \ No newline at end of file diff --git a/deploy.kts b/deploy.kts index 84bc4986..cbd45467 100644 --- a/deploy.kts +++ b/deploy.kts @@ -8,7 +8,7 @@ import java.util.jar.JarEntry import java.util.jar.JarFile import java.util.jar.JarOutputStream -val version = "2.3.7-RELEASE" +val version = "2.4.0-SNAPSHOT" val build = System.getenv("build_number") ?: "local" val git = System.getenv("build_vcs_number") ?: "unknown" val branch = System.getenv("branch")?.replace("refs/heads/", "") ?: "local" diff --git a/examples/example-module/src/main/resources/module.json b/examples/example-module/src/main/resources/module.json index 20b19ed0..93eea68f 100644 --- a/examples/example-module/src/main/resources/module.json +++ b/examples/example-module/src/main/resources/module.json @@ -1,7 +1,7 @@ { "name": "example-module", "id": "example-module", - "version": "2.3.7-RELEASE", + "version": "2.4.0-SNAPSHOT", "description": "An example module for redicloud", "website": "https://redocloud.dev/", "authors": [ diff --git a/examples/example-plugin/build.gradle.kts b/examples/example-plugin/build.gradle.kts index 442c4869..db1ee192 100644 --- a/examples/example-plugin/build.gradle.kts +++ b/examples/example-plugin/build.gradle.kts @@ -27,4 +27,5 @@ dependencies { // Internal usage, ignore it! You don't need to add this compileOnly(project(":apis:base-api")) + compileOnly(BuildDependencies.KYORI_ADVENTURE_API) } \ No newline at end of file diff --git a/file-cluster/src/main/kotlin/dev/redicloud/cluster/file/FileCluster.kt b/file-cluster/src/main/kotlin/dev/redicloud/cluster/file/FileCluster.kt index 2b2b8737..7dc9ee63 100644 --- a/file-cluster/src/main/kotlin/dev/redicloud/cluster/file/FileCluster.kt +++ b/file-cluster/src/main/kotlin/dev/redicloud/cluster/file/FileCluster.kt @@ -2,8 +2,8 @@ package dev.redicloud.cluster.file import com.jcraft.jsch.* import com.jcraft.jsch.ChannelSftp.LsEntry -import dev.redicloud.api.events.impl.node.file.FileNodeConnectedEvent -import dev.redicloud.api.events.impl.node.file.FileNodeDisconnectedEvent +import dev.redicloud.api.events.internal.node.file.FileNodeConnectedEvent +import dev.redicloud.api.events.internal.node.file.FileNodeDisconnectedEvent import dev.redicloud.cluster.file.filter.IPFilter import dev.redicloud.cluster.file.packet.UnzipPacket import dev.redicloud.cluster.file.packet.UnzipResponse diff --git a/file-cluster/src/main/kotlin/dev/redicloud/cluster/file/filter/IPFilter.kt b/file-cluster/src/main/kotlin/dev/redicloud/cluster/file/filter/IPFilter.kt index 2ffdbfce..81fd76e6 100644 --- a/file-cluster/src/main/kotlin/dev/redicloud/cluster/file/filter/IPFilter.kt +++ b/file-cluster/src/main/kotlin/dev/redicloud/cluster/file/filter/IPFilter.kt @@ -2,9 +2,9 @@ package dev.redicloud.cluster.file.filter import dev.redicloud.cluster.file.FileNodeRepository import dev.redicloud.event.EventManager -import dev.redicloud.api.events.impl.node.NodeSuspendedEvent -import dev.redicloud.api.events.impl.node.file.FileNodeConnectedEvent -import dev.redicloud.api.events.impl.node.file.FileNodeDisconnectedEvent +import dev.redicloud.api.events.internal.node.NodeSuspendedEvent +import dev.redicloud.api.events.internal.node.file.FileNodeConnectedEvent +import dev.redicloud.api.events.internal.node.file.FileNodeDisconnectedEvent import dev.redicloud.api.events.listen import kotlinx.coroutines.runBlocking diff --git a/modules/module-handler/src/main/kotlin/dev/redicloud/modules/ModuleHandler.kt b/modules/module-handler/src/main/kotlin/dev/redicloud/modules/ModuleHandler.kt index 2dadf51a..0d0cb9d4 100644 --- a/modules/module-handler/src/main/kotlin/dev/redicloud/modules/ModuleHandler.kt +++ b/modules/module-handler/src/main/kotlin/dev/redicloud/modules/ModuleHandler.kt @@ -2,8 +2,8 @@ package dev.redicloud.modules import com.google.inject.Key import com.google.inject.name.Named -import dev.redicloud.api.events.impl.module.ModuleHandlerInitializedEvent -import dev.redicloud.api.events.impl.module.ModuleLifeCycleChangedEvent +import dev.redicloud.api.events.internal.module.ModuleHandlerInitializedEvent +import dev.redicloud.api.events.internal.module.ModuleLifeCycleChangedEvent import dev.redicloud.api.modules.* import dev.redicloud.api.service.ServiceId import dev.redicloud.api.utils.CloudInjectable diff --git a/modules/papermc-updater/src/main/resources/module.json b/modules/papermc-updater/src/main/resources/module.json index bdb5b7ca..38eb7a58 100644 --- a/modules/papermc-updater/src/main/resources/module.json +++ b/modules/papermc-updater/src/main/resources/module.json @@ -2,7 +2,7 @@ "id": "papermc-updater", "name": "PaperMC Updater", "description": "A simple module to automatically update software (Velocity, Paper, Folia, Waterfall) to the latest version.", - "version": "2.3.7-RELEASE", + "version": "2.4.0-SNAPSHOT", "website": "https://docs.redicloud.dev/modules/papermc-updater", "authors": [ "Suqatri" diff --git a/repositories/configuration-template-repository/src/main/kotlin/dev/redicloud/repository/template/configuration/ConfigurationTemplateRepository.kt b/repositories/configuration-template-repository/src/main/kotlin/dev/redicloud/repository/template/configuration/ConfigurationTemplateRepository.kt index d9d99bcf..1bb8ec0e 100644 --- a/repositories/configuration-template-repository/src/main/kotlin/dev/redicloud/repository/template/configuration/ConfigurationTemplateRepository.kt +++ b/repositories/configuration-template-repository/src/main/kotlin/dev/redicloud/repository/template/configuration/ConfigurationTemplateRepository.kt @@ -1,6 +1,6 @@ package dev.redicloud.repository.template.configuration -import dev.redicloud.api.events.impl.template.configuration.ConfigurationTemplateUpdateEvent +import dev.redicloud.api.events.internal.template.configuration.ConfigurationTemplateUpdateEvent import dev.redicloud.api.template.configuration.ICloudConfigurationTemplate import dev.redicloud.api.template.configuration.ICloudConfigurationTemplateRepository import dev.redicloud.database.DatabaseConnection diff --git a/repositories/node-repository/src/main/kotlin/dev/redicloud/repository/node/NodeRepository.kt b/repositories/node-repository/src/main/kotlin/dev/redicloud/repository/node/NodeRepository.kt index 21f5bab7..7c4a51ad 100644 --- a/repositories/node-repository/src/main/kotlin/dev/redicloud/repository/node/NodeRepository.kt +++ b/repositories/node-repository/src/main/kotlin/dev/redicloud/repository/node/NodeRepository.kt @@ -4,7 +4,7 @@ import dev.redicloud.database.DatabaseConnection import dev.redicloud.event.EventManager import dev.redicloud.packets.PacketManager import dev.redicloud.repository.service.CachedServiceRepository -import dev.redicloud.api.events.impl.node.NodeDisconnectEvent +import dev.redicloud.api.events.internal.node.NodeDisconnectEvent import dev.redicloud.api.service.node.ICloudNode import dev.redicloud.api.service.node.ICloudNodeRepository import dev.redicloud.repository.service.ServiceRepository diff --git a/repositories/player-repository/src/main/kotlin/dev/redicloud/repository/player/PlayerRepository.kt b/repositories/player-repository/src/main/kotlin/dev/redicloud/repository/player/PlayerRepository.kt index b8c8f0ad..c79867f6 100644 --- a/repositories/player-repository/src/main/kotlin/dev/redicloud/repository/player/PlayerRepository.kt +++ b/repositories/player-repository/src/main/kotlin/dev/redicloud/repository/player/PlayerRepository.kt @@ -1,8 +1,8 @@ package dev.redicloud.repository.player -import dev.redicloud.api.events.impl.player.CloudPlayerConnectedEvent -import dev.redicloud.api.events.impl.player.CloudPlayerDisconnectEvent -import dev.redicloud.api.events.impl.player.CloudPlayerSwitchServerEvent +import dev.redicloud.api.events.internal.player.CloudPlayerConnectedEvent +import dev.redicloud.api.events.internal.player.CloudPlayerDisconnectEvent +import dev.redicloud.api.events.internal.player.CloudPlayerSwitchServerEvent import dev.redicloud.api.player.ICloudPlayer import dev.redicloud.api.player.ICloudPlayerRepository import dev.redicloud.database.DatabaseConnection diff --git a/repositories/server-repository/src/main/kotlin/dev/redicloud/repository/server/ServerRepository.kt b/repositories/server-repository/src/main/kotlin/dev/redicloud/repository/server/ServerRepository.kt index b587ba25..c31a281a 100644 --- a/repositories/server-repository/src/main/kotlin/dev/redicloud/repository/server/ServerRepository.kt +++ b/repositories/server-repository/src/main/kotlin/dev/redicloud/repository/server/ServerRepository.kt @@ -1,20 +1,15 @@ package dev.redicloud.repository.server -import dev.redicloud.api.events.impl.server.CloudServerUnregisteredEvent -import dev.redicloud.api.events.impl.template.configuration.ConfigurationTemplateUpdateEvent +import dev.redicloud.api.events.internal.server.CloudServerUnregisteredEvent import dev.redicloud.database.DatabaseConnection import dev.redicloud.event.EventManager import dev.redicloud.packets.PacketManager -import dev.redicloud.repository.template.configuration.ConfigurationTemplateRepository -import dev.redicloud.api.events.impl.server.CloudServerRegisteredEvent -import dev.redicloud.api.events.impl.server.CloudServerStateChangeEvent -import dev.redicloud.api.events.listen +import dev.redicloud.api.events.internal.server.CloudServerRegisteredEvent +import dev.redicloud.api.events.internal.server.CloudServerStateChangeEvent import dev.redicloud.api.service.server.* import dev.redicloud.repository.service.ServiceRepository -import dev.redicloud.utils.defaultScope import dev.redicloud.api.service.ServiceId import dev.redicloud.api.service.ServiceType -import kotlinx.coroutines.launch class ServerRepository( databaseConnection: DatabaseConnection, @@ -83,6 +78,12 @@ class ServerRepository( } if (impl.oldState != cloudServer.state) { eventManager.fireEvent(CloudServerStateChangeEvent(cloudServer.serviceId, cloudServer.state)) + impl.oldState = cloudServer.state + when (cloudServer) { + is CloudMinecraftServer -> internalMinecraftServerRepository.updateService(cloudServer as CloudMinecraftServer) + is CloudProxyServer -> internalProxyServerRepository.updateService(cloudServer as CloudProxyServer) + else -> throw IllegalArgumentException("Unknown service type ${cloudServer.serviceId.type} (${cloudServer.serviceId.type})") + } } return cloudServer } @@ -123,11 +124,11 @@ class ServerRepository( override suspend fun getRegisteredServers(type: ServiceType): List = registeredServices.filter { it.type == type }.mapNotNull { getServer(it) } - override suspend fun getFallback(vararg currentServerIds: ServiceId?): CloudMinecraftServer? { + override suspend fun getFallback(vararg ignoredServerIds: ServiceId?): CloudMinecraftServer? { return getConnectedServers(ServiceType.MINECRAFT_SERVER) .asSequence() .filter { it.serviceId != serviceId } - .filter { !currentServerIds.toList().contains(it.serviceId) } + .filter { !ignoredServerIds.toList().contains(it.serviceId) } //TODO check permissions .filter { it.configurationTemplate.fallbackServer } .filter { it.state == CloudServerState.RUNNING } diff --git a/repositories/server-version-repository/src/main/kotlin/dev/redicloud/repository/server/version/CloudServerVersionTypeRepository.kt b/repositories/server-version-repository/src/main/kotlin/dev/redicloud/repository/server/version/CloudServerVersionTypeRepository.kt index 3eca9825..f014e120 100644 --- a/repositories/server-version-repository/src/main/kotlin/dev/redicloud/repository/server/version/CloudServerVersionTypeRepository.kt +++ b/repositories/server-version-repository/src/main/kotlin/dev/redicloud/repository/server/version/CloudServerVersionTypeRepository.kt @@ -113,9 +113,9 @@ class CloudServerVersionTypeRepository( null } else if (downloaded) { canceled = true - "Downloaded connector ${toConsoleValue(connectorFile.name)}§8: ${if (error) "§4✘" else "§2✓"}" + "Downloaded connector ${toConsoleValue(serverVersionType.name)}§8: ${if (error) "§4✘" else "§2✓"}" } else { - "Downloading connector ${toConsoleValue(connectorFile.name)}§8: %tc%%loading%" + "Downloading connector ${toConsoleValue(serverVersionType.name)}§8: %tc%%loading%" } } } else { @@ -124,7 +124,7 @@ class CloudServerVersionTypeRepository( console?.startAnimation(animation!!) LOGGER.log( if (console == null) Level.INFO else Level.FINE, - "Downloading connector for ${toConsoleValue(connectorFile.name)}..." + "Downloading connector for ${toConsoleValue(serverVersionType.name)}..." ) if (lock) getLock(serverVersionType).lock() try { @@ -138,10 +138,10 @@ class CloudServerVersionTypeRepository( } LOGGER.log( if (console == null) Level.FINE else Level.INFO, - "Successfully downloaded connector for ${toConsoleValue(connectorFile.name)}!" + "Successfully downloaded connector for ${toConsoleValue(serverVersionType.name)}!" ) } catch (e: Exception) { - LOGGER.severe("§cFailed to download connector for ${toConsoleValue(connectorFile.name, false)}!", e) + LOGGER.severe("§cFailed to download connector ${toConsoleValue(connectorFile.name, false)}!", e) error = true } finally { downloaded = true diff --git a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/ServerFactory.kt b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/ServerFactory.kt index 2d093b90..3f0dfea3 100644 --- a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/ServerFactory.kt +++ b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/ServerFactory.kt @@ -2,9 +2,9 @@ package dev.redicloud.server.factory import com.jcraft.jsch.ChannelSftp import com.jcraft.jsch.Session -import dev.redicloud.api.events.impl.server.CloudServerDeleteEvent -import dev.redicloud.api.events.impl.server.CloudServerDisconnectedEvent -import dev.redicloud.api.events.impl.server.CloudServerTransferredEvent +import dev.redicloud.api.events.internal.server.CloudServerDeleteEvent +import dev.redicloud.api.events.internal.server.CloudServerDisconnectedEvent +import dev.redicloud.api.events.internal.server.CloudServerTransferredEvent import dev.redicloud.api.server.factory.ICloudServerFactory import dev.redicloud.api.service.ServiceId import dev.redicloud.api.service.ServiceType @@ -39,11 +39,7 @@ import dev.redicloud.server.factory.screens.ServerScreenSuggester import dev.redicloud.server.factory.utils.* import dev.redicloud.service.base.utils.ClusterConfiguration import dev.redicloud.utils.MultiAsyncAction -import dev.redicloud.utils.defaultScope -import dev.redicloud.utils.ioScope import dev.redicloud.utils.zipFile -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import java.io.File import java.util.* diff --git a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/ServerProcess.kt b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/ServerProcess.kt index d4ac0c9d..0eb84586 100644 --- a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/ServerProcess.kt +++ b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/ServerProcess.kt @@ -1,6 +1,6 @@ package dev.redicloud.server.factory -import dev.redicloud.api.events.impl.server.CloudServerDisconnectedEvent +import dev.redicloud.api.events.internal.server.CloudServerDisconnectedEvent import dev.redicloud.api.server.factory.ICloudServerProcess import dev.redicloud.api.service.ServiceId import dev.redicloud.api.service.server.CloudServerState @@ -21,7 +21,7 @@ import dev.redicloud.repository.server.ServerRepository import dev.redicloud.repository.server.version.CloudServerVersionType import dev.redicloud.server.factory.screens.ServerScreen import dev.redicloud.server.factory.utils.* -import dev.redicloud.service.base.packets.CloudServiceShutdownPacket +import dev.redicloud.service.base.packets.service.CloudServiceShutdownPacket import dev.redicloud.service.base.utils.ClusterConfiguration import dev.redicloud.utils.blockPort import dev.redicloud.utils.findFreePort diff --git a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/screens/ServerScreen.kt b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/screens/ServerScreen.kt index 9acd67d8..41d7882e 100644 --- a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/screens/ServerScreen.kt +++ b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/screens/ServerScreen.kt @@ -1,6 +1,6 @@ package dev.redicloud.server.factory.screens -import dev.redicloud.api.events.impl.server.CloudServerDisconnectedEvent +import dev.redicloud.api.events.internal.server.CloudServerDisconnectedEvent import dev.redicloud.api.events.listen import dev.redicloud.console.Console import dev.redicloud.console.utils.Screen diff --git a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/task/CloudServerQueueCleanerTask.kt b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/task/CloudServerQueueCleanerTask.kt index 5b03d60e..4b3d0f89 100644 --- a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/task/CloudServerQueueCleanerTask.kt +++ b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/task/CloudServerQueueCleanerTask.kt @@ -35,7 +35,7 @@ class CloudServerQueueCleanerTask( serverFactory.getStartList().forEach { info -> val name = if (info.serviceId != null) { info.serviceId!!.toName() - } else info.configurationTemplate + } else info.configurationTemplate.name if (info.serviceId != null) { val service = serverRepository.getServer(info.serviceId!!) diff --git a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/task/CloudServerStartTask.kt b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/task/CloudServerStartTask.kt index 12e8059a..0fc734eb 100644 --- a/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/task/CloudServerStartTask.kt +++ b/server-factories/node-server-factory/src/main/kotlin/dev/redicloud/server/factory/task/CloudServerStartTask.kt @@ -7,9 +7,9 @@ import dev.redicloud.repository.node.NodeRepository import dev.redicloud.repository.server.ServerRepository import dev.redicloud.server.factory.* import dev.redicloud.server.factory.utils.* -import dev.redicloud.api.events.impl.node.NodeConnectEvent -import dev.redicloud.api.events.impl.node.NodeDisconnectEvent -import dev.redicloud.api.events.impl.node.NodeSuspendedEvent +import dev.redicloud.api.events.internal.node.NodeConnectEvent +import dev.redicloud.api.events.internal.node.NodeDisconnectEvent +import dev.redicloud.api.events.internal.node.NodeSuspendedEvent import dev.redicloud.api.events.listen import dev.redicloud.api.utils.factory.* import dev.redicloud.tasks.CloudTask diff --git a/services/base-service/build.gradle.kts b/services/base-service/build.gradle.kts index 2d5b1d95..7bc79f36 100644 --- a/services/base-service/build.gradle.kts +++ b/services/base-service/build.gradle.kts @@ -29,4 +29,6 @@ dependencies { dependency(BuildDependencies.KOTLINX_COROUTINES) dependency(BuildDependencies.REDISSON) + compileOnly(BuildDependencies.KYORI_ADVENTURE_API) + dependency(BuildDependencies.KYORI_ADVENTURE_SERIALIZER_GSON) } \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/BaseService.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/BaseService.kt index 9e1b6228..da8c7946 100644 --- a/services/base-service/src/main/kotlin/dev/redicloud/service/base/BaseService.kt +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/BaseService.kt @@ -8,6 +8,7 @@ import dev.redicloud.api.packets.IPacketManager import dev.redicloud.cache.tasks.InvalidCacheTask import dev.redicloud.api.packets.PacketListener import dev.redicloud.api.java.ICloudJavaVersionRepository +import dev.redicloud.api.player.ICloudPlayerExecutor import dev.redicloud.api.player.ICloudPlayerRepository import dev.redicloud.api.service.node.ICloudNodeRepository import dev.redicloud.api.service.server.ICloudServerRepository @@ -18,7 +19,6 @@ import dev.redicloud.commands.api.PARSERS import dev.redicloud.commands.api.SUGGESTERS import dev.redicloud.repository.node.NodeRepository import dev.redicloud.database.DatabaseConnection -import dev.redicloud.database.codec.GsonCodec import dev.redicloud.database.config.DatabaseConfiguration import dev.redicloud.event.EventManager import dev.redicloud.logging.LogManager @@ -58,6 +58,12 @@ import dev.redicloud.api.version.IVersionRepository import dev.redicloud.console.Console import dev.redicloud.modules.ModuleHandler import dev.redicloud.repository.server.version.serverversion.VersionRepository +import dev.redicloud.service.base.packets.ping.ServicePingPacket +import dev.redicloud.service.base.packets.ping.ServicePingResponse +import dev.redicloud.service.base.packets.player.* +import dev.redicloud.service.base.packets.service.CloudServiceShutdownPacket +import dev.redicloud.service.base.packets.service.CloudServiceShutdownResponse +import dev.redicloud.service.base.player.BasePlayerExecutor import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -93,6 +99,7 @@ abstract class BaseService( val taskManager: CloudTaskManager val clusterConfiguration: ClusterConfiguration abstract val moduleHandler: ModuleHandler + abstract val playerExecutor: BasePlayerExecutor init { runBlocking { @@ -222,6 +229,15 @@ abstract class BaseService( packetManager.registerPacket(CloudServiceShutdownResponse::class) packetManager.registerPacket(ClusterMessagePacket::class) packetManager.registerPacket(ScreenCommandPacket::class) + packetManager.registerPacket(CloudPlayerBookPacket::class) + packetManager.registerPacket(CloudPlayerBookPacket::class) + packetManager.registerPacket(CloudPlayerConnectServerPacket::class) + packetManager.registerPacket(CloudPlayerKickPacket::class) + packetManager.registerPacket(CloudPlayerHeaderFooterPacket::class) + packetManager.registerPacket(CloudPlayerMessagePacket::class) + packetManager.registerPacket(CloudPlayerResourcePackPacket::class) + packetManager.registerPacket(CloudPlayerSoundPacket::class) + packetManager.registerPacket(CloudPlayerTitlePacket::class) } private fun registerPacketListeners() { @@ -253,6 +269,7 @@ abstract class BaseService( } bind(ClusterConfiguration::class).toInstance(clusterConfiguration) bind(IDatabaseConnection::class).toInstance(databaseConnection) + bind(ICloudPlayerExecutor::class).toInstance(playerExecutor) } } \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/listener/CloudServiceShutdownPacketListener.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/listener/CloudServiceShutdownPacketListener.kt index a967a0d9..7c1e0a61 100644 --- a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/listener/CloudServiceShutdownPacketListener.kt +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/listener/CloudServiceShutdownPacketListener.kt @@ -1,8 +1,8 @@ package dev.redicloud.service.base.packets.listener import dev.redicloud.api.packets.PacketListener -import dev.redicloud.service.base.packets.CloudServiceShutdownPacket -import dev.redicloud.service.base.packets.CloudServiceShutdownResponse +import dev.redicloud.service.base.packets.service.CloudServiceShutdownPacket +import dev.redicloud.service.base.packets.service.CloudServiceShutdownResponse import dev.redicloud.logging.LogManager import dev.redicloud.service.base.BaseService import kotlinx.coroutines.runBlocking diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ServicePingPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ping/ServicePingPacket.kt similarity index 90% rename from services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ServicePingPacket.kt rename to services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ping/ServicePingPacket.kt index 0e3bbf8c..7a0de98c 100644 --- a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ServicePingPacket.kt +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ping/ServicePingPacket.kt @@ -1,4 +1,4 @@ -package dev.redicloud.service.base.packets +package dev.redicloud.service.base.packets.ping import dev.redicloud.api.packets.AbstractPacket import dev.redicloud.api.packets.IPacketManager diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ServicePingResponse.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ping/ServicePingResponse.kt similarity index 71% rename from services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ServicePingResponse.kt rename to services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ping/ServicePingResponse.kt index effa1ac4..facc6d7e 100644 --- a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ServicePingResponse.kt +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/ping/ServicePingResponse.kt @@ -1,4 +1,4 @@ -package dev.redicloud.service.base.packets +package dev.redicloud.service.base.packets.ping import dev.redicloud.api.packets.AbstractPacket diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerBookPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerBookPacket.kt new file mode 100644 index 00000000..b2a87b41 --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerBookPacket.kt @@ -0,0 +1,35 @@ +package dev.redicloud.service.base.packets.player + +import net.kyori.adventure.inventory.Book +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import java.util.UUID + +class CloudPlayerBookPacket( + uniqueId: UUID, + private val jsonTitle: String, + private val jsonAuthor: String, + private val jsonPages: List +) : CloudPlayerPacket(uniqueId) { + + constructor(uniqueId: UUID, book: Book) : this( + uniqueId, + GsonComponentSerializer.gson().serialize(book.title()), + GsonComponentSerializer.gson().serialize(book.author()), + book.pages().map { GsonComponentSerializer.gson().serialize(it) } + ) + + private val title: Component + get() = GsonComponentSerializer.gson().deserialize(jsonTitle) + + private val author: Component + get() = GsonComponentSerializer.gson().deserialize(jsonAuthor) + + private val pages: List + get() = jsonPages.map { GsonComponentSerializer.gson().deserialize(it) } + + fun createBook(): Book { + return Book.book(title, author, pages) + } + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerBossBarPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerBossBarPacket.kt new file mode 100644 index 00000000..650b0319 --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerBossBarPacket.kt @@ -0,0 +1,49 @@ +package dev.redicloud.service.base.packets.player + +import net.kyori.adventure.bossbar.BossBar +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import java.util.UUID + +class CloudPlayerBossBarPacket( + uniqueId: UUID, + private val jsonComponent: String, + private val colorName: String, + private val overlayName: String, + val progress: Float, + private val flagsName: List, + val hide: Boolean = false +) : CloudPlayerPacket(uniqueId) { + + constructor(uniqueId: UUID, bossBar: BossBar, hide: Boolean = false) : this( + uniqueId, + GsonComponentSerializer.gson().serialize(bossBar.name()), + bossBar.color().name, + bossBar.overlay().name, + bossBar.progress(), + bossBar.flags().map { it.name } + ) + + private val component: Component + get() = GsonComponentSerializer.gson().deserialize(jsonComponent) + + private val color: BossBar.Color + get() = BossBar.Color.valueOf(colorName) + + private val overlay: BossBar.Overlay + get() = BossBar.Overlay.valueOf(overlayName) + + private val flags: List + get() = flagsName.map { BossBar.Flag.valueOf(it) } + + fun createBossBar(): BossBar { + return BossBar.bossBar( + this.component, + this.progress, + this.color, + this.overlay, + flags.toSet() + ) + } + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerConnectServerPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerConnectServerPacket.kt new file mode 100644 index 00000000..9443018a --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerConnectServerPacket.kt @@ -0,0 +1,17 @@ +package dev.redicloud.service.base.packets.player + +import dev.redicloud.api.service.ServiceId +import dev.redicloud.api.service.server.ICloudServer +import java.util.UUID + +class CloudPlayerConnectServerPacket( + uniqueId: UUID, + val serviceId: ServiceId +) : CloudPlayerPacket(uniqueId) { + + constructor(uniqueId: UUID, cloudServer: ICloudServer) : this( + uniqueId, + cloudServer.serviceId + ) + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerHeaderFooterPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerHeaderFooterPacket.kt new file mode 100644 index 00000000..01471c29 --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerHeaderFooterPacket.kt @@ -0,0 +1,25 @@ +package dev.redicloud.service.base.packets.player + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import java.util.UUID + +class CloudPlayerHeaderFooterPacket( + uniqueId: UUID, + private val jsonHeader: String, + private val jsonFooter: String +) : CloudPlayerPacket(uniqueId) { + + constructor(uniqueId: UUID, header: Component, footer: Component) : this ( + uniqueId, + GsonComponentSerializer.gson().serialize(header), + GsonComponentSerializer.gson().serialize(footer) + ) + + val header: Component + get() = GsonComponentSerializer.gson().deserialize(jsonHeader) + + val footer: Component + get() = GsonComponentSerializer.gson().deserialize(jsonFooter) + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerKickPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerKickPacket.kt new file mode 100644 index 00000000..f53ce42c --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerKickPacket.kt @@ -0,0 +1,20 @@ +package dev.redicloud.service.base.packets.player + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import java.util.UUID + +class CloudPlayerKickPacket( + uniqueId: UUID, + private val jsonReason: String +) : CloudPlayerPacket(uniqueId) { + + constructor(uniqueId: UUID, reason: Component) : this( + uniqueId, + GsonComponentSerializer.gson().serialize(reason) + ) + + val reason: Component + get() = GsonComponentSerializer.gson().deserialize(jsonReason) + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerMessagePacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerMessagePacket.kt new file mode 100644 index 00000000..30a28e30 --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerMessagePacket.kt @@ -0,0 +1,16 @@ +package dev.redicloud.service.base.packets.player + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import java.util.* + +class CloudPlayerMessagePacket( + uniqueId: UUID, + private val jsonComponent: String +) : CloudPlayerPacket(uniqueId) { + constructor(uniqueId: UUID, component: Component) : this(uniqueId, GsonComponentSerializer.gson().serialize(component)) + + val component: Component + get() = GsonComponentSerializer.gson().deserialize(jsonComponent) + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerPacket.kt new file mode 100644 index 00000000..c92e1500 --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerPacket.kt @@ -0,0 +1,8 @@ +package dev.redicloud.service.base.packets.player + +import dev.redicloud.api.packets.AbstractPacket +import java.util.UUID + +open class CloudPlayerPacket( + val uniqueId: UUID +) : AbstractPacket() \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerResourcePackPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerResourcePackPacket.kt new file mode 100644 index 00000000..20799940 --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerResourcePackPacket.kt @@ -0,0 +1,38 @@ +package dev.redicloud.service.base.packets.player + +import net.kyori.adventure.resource.ResourcePackInfo +import net.kyori.adventure.resource.ResourcePackRequest +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import java.net.URI +import java.util.UUID + +class CloudPlayerResourcePackPacket( + uniqueId: UUID, + private val jsonPrompt: String?, + private val required: Boolean, + private val stringRequests: Map> +) : CloudPlayerPacket(uniqueId) { + + constructor(uniqueId: UUID, resourcePackPacket: ResourcePackRequest) : this( + uniqueId, + resourcePackPacket.prompt()?.let { GsonComponentSerializer.gson().serialize(it) }, + resourcePackPacket.required(), + resourcePackPacket.packs().associate { it.id() to Pair(it.uri(), it.hash()) } + ) + + private val prompt: Component? + get() = jsonPrompt?.let { GsonComponentSerializer.gson().deserialize(it) } + + private val requests: List + get() = stringRequests.map { (id, pair) -> ResourcePackInfo.resourcePackInfo(id, pair.first, pair.second) } + + fun createResourcePackRequest(): ResourcePackRequest { + return ResourcePackRequest.resourcePackRequest() + .packs(requests) + .prompt(prompt) + .required(required) + .build() + } + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerSoundPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerSoundPacket.kt new file mode 100644 index 00000000..bda2f96c --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerSoundPacket.kt @@ -0,0 +1,35 @@ +package dev.redicloud.service.base.packets.player + +import net.kyori.adventure.key.Key +import net.kyori.adventure.sound.Sound +import java.util.* + +class CloudPlayerSoundPacket( + uniqueId: UUID, + private val soundName: String, + private val sourceName: String, + val volume: Float, + val pitch: Float, + val stop: Boolean = false +) : CloudPlayerPacket(uniqueId) { + + constructor(uniqueId: UUID, sound: Sound, stop: Boolean = false) : this( + uniqueId, + sound.name().asString(), + sound.source().name, + sound.volume(), + sound.pitch(), + stop + ) + + val key: Key + get() = Key.key(soundName) + + val source: Sound.Source + get() = Sound.Source.valueOf(sourceName) + + fun createSound(): Sound { + return Sound.sound(key, source, volume, pitch) + } + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerTitlePacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerTitlePacket.kt new file mode 100644 index 00000000..a4d1c30b --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/player/CloudPlayerTitlePacket.kt @@ -0,0 +1,41 @@ +package dev.redicloud.service.base.packets.player + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import net.kyori.adventure.title.Title +import net.kyori.adventure.title.Title.Times +import java.time.Duration +import java.util.UUID + +class CloudPlayerTitlePacket( + uniqueId: UUID, + private val jsonTitle: String, + private val jsonSubTitle: String, + private val fadeIn: Duration, + private val stay: Duration, + private val fadeOut: Duration +) : CloudPlayerPacket(uniqueId) { + + constructor(uniqueId: UUID, title: Title) : this( + uniqueId, + GsonComponentSerializer.gson().serialize(title.title()), + GsonComponentSerializer.gson().serialize(title.subtitle()), + title.times()?.fadeIn() ?: Title.DEFAULT_TIMES.fadeIn(), + title.times()?.stay() ?: Title.DEFAULT_TIMES.stay(), + title.times()?.fadeOut() ?: Title.DEFAULT_TIMES.fadeOut() + ) + + private val title: Component + get() = GsonComponentSerializer.gson().deserialize(jsonTitle) + + private val subTitle: Component + get() = GsonComponentSerializer.gson().deserialize(jsonSubTitle) + + private val times: Times + get() = Times.times(fadeIn, stay, fadeOut) + + fun createTitle(): Title { + return Title.title(title, subTitle, times) + } + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/CloudServiceShutdownPacket.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/service/CloudServiceShutdownPacket.kt similarity index 66% rename from services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/CloudServiceShutdownPacket.kt rename to services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/service/CloudServiceShutdownPacket.kt index 2a93b071..307c9b9f 100644 --- a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/CloudServiceShutdownPacket.kt +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/service/CloudServiceShutdownPacket.kt @@ -1,4 +1,4 @@ -package dev.redicloud.service.base.packets +package dev.redicloud.service.base.packets.service import dev.redicloud.api.packets.AbstractPacket diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/CloudServiceShutdownResponse.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/service/CloudServiceShutdownResponse.kt similarity index 67% rename from services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/CloudServiceShutdownResponse.kt rename to services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/service/CloudServiceShutdownResponse.kt index eaaf7b64..b8b3d9a5 100644 --- a/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/CloudServiceShutdownResponse.kt +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/packets/service/CloudServiceShutdownResponse.kt @@ -1,4 +1,4 @@ -package dev.redicloud.service.base.packets +package dev.redicloud.service.base.packets.service import dev.redicloud.api.packets.AbstractPacket diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/player/BasePlayerExecutor.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/player/BasePlayerExecutor.kt new file mode 100644 index 00000000..226bad2c --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/player/BasePlayerExecutor.kt @@ -0,0 +1,245 @@ +package dev.redicloud.service.base.player + +import dev.redicloud.api.packets.IPacketManager +import dev.redicloud.api.player.ICloudPlayer +import dev.redicloud.api.player.ICloudPlayerExecutor +import dev.redicloud.api.player.ICloudPlayerRepository +import dev.redicloud.api.service.ServiceId +import dev.redicloud.api.service.ServiceType +import dev.redicloud.api.service.server.ICloudServer +import dev.redicloud.api.service.server.ICloudServerRepository +import dev.redicloud.service.base.packets.player.* +import net.kyori.adventure.audience.Audience +import net.kyori.adventure.bossbar.BossBar +import net.kyori.adventure.inventory.Book +import net.kyori.adventure.resource.ResourcePackRequest +import net.kyori.adventure.sound.Sound +import net.kyori.adventure.text.Component +import net.kyori.adventure.title.Title +import java.util.* + +abstract class BasePlayerExecutor( + private val playerRepository: ICloudPlayerRepository, + private val serverRepository: ICloudServerRepository, + private val packetManager: IPacketManager, + private val thisServiceId: ServiceId +) : ICloudPlayerExecutor { + + init { + PlayerExecutorListener(this, this.packetManager) + } + + override suspend fun sendMessage(uniqueId: UUID, component: Component) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.sendMessage(player, component) + } + + override suspend fun sendMessage(cloudPlayer: ICloudPlayer, component: Component) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).sendMessage(component) + return + } + val packet = CloudPlayerMessagePacket(cloudPlayer.uniqueId, component) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun showBossBar(uniqueId: UUID, bossBar: BossBar) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.showBossBar(player, bossBar) + } + + override suspend fun showBossBar(cloudPlayer: ICloudPlayer, bossBar: BossBar) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).showBossBar(bossBar) + return + } + val packet = CloudPlayerBossBarPacket(cloudPlayer.uniqueId, bossBar) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun hideBossBar(uniqueId: UUID, bossBar: BossBar) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.hideBossBar(player, bossBar) + } + + override suspend fun hideBossBar(cloudPlayer: ICloudPlayer, bossBar: BossBar) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).hideBossBar(bossBar) + return + } + val packet = CloudPlayerBossBarPacket(cloudPlayer.uniqueId, bossBar, true) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun playSound(uniqueId: UUID, sound: Sound) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.playSound(player, sound) + } + + override suspend fun playSound( + cloudPlayer: ICloudPlayer, + sound: Sound + ) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).playSound(sound) + return + } + val packet = CloudPlayerSoundPacket(cloudPlayer.uniqueId, sound) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun stopSound(uniqueId: UUID, sound: Sound) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.stopSound(player, sound) + } + + override suspend fun stopSound(cloudPlayer: ICloudPlayer, sound: Sound) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).stopSound(sound) + return + } + val packet = CloudPlayerSoundPacket(cloudPlayer.uniqueId, sound, true) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun showTitle(uniqueId: UUID, title: Title) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.showTitle(player, title) + } + + override suspend fun showTitle(cloudPlayer: ICloudPlayer, title: Title) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).showTitle(title) + return + } + val packet = CloudPlayerTitlePacket(cloudPlayer.uniqueId, title) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun showBook(uniqueId: UUID, book: Book) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.showBook(player, book) + } + + override suspend fun showBook(cloudPlayer: ICloudPlayer, book: Book) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).openBook(book) + return + } + val packet = CloudPlayerBookPacket(cloudPlayer.uniqueId, book) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun sendPlayerListHeaderAndFooter(uniqueId: UUID, header: Component, footer: Component) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.sendPlayerListHeaderAndFooter(player, header, footer) + } + + override suspend fun sendPlayerListHeaderAndFooter( + cloudPlayer: ICloudPlayer, + header: Component, + footer: Component + ) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).sendPlayerListHeaderAndFooter(header, footer) + return + } + val packet = CloudPlayerHeaderFooterPacket(cloudPlayer.uniqueId, header, footer) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun sendResourcePacks(uniqueId: UUID, resourcePackRequest: ResourcePackRequest) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.sendResourcePacks(player, resourcePackRequest) + } + + override suspend fun sendResourcePacks(cloudPlayer: ICloudPlayer, resourcePackRequest: ResourcePackRequest) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.audience(cloudPlayer).sendResourcePacks(resourcePackRequest) + return + } + val packet = CloudPlayerResourcePackPacket(cloudPlayer.uniqueId, resourcePackRequest) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun connect(uniqueId: UUID, serviceId: ServiceId) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.connect(player, serviceId) + } + + override suspend fun connect(uniqueId: UUID, serverName: String) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.connect(player, serverName) + } + + override suspend fun connect(cloudPlayer: ICloudPlayer, serverName: String) { + val server = serverRepository.getServer(serverName, ServiceType.MINECRAFT_SERVER) + ?: throw NullPointerException("Server with name $serverName not found") + this.connect(cloudPlayer, server) + } + + override suspend fun connect(cloudPlayer: ICloudPlayer, serviceId: ServiceId) { + if (serviceId.type != ServiceType.MINECRAFT_SERVER) { + throw IllegalArgumentException("ServiceId type must be MINECRAFT_SERVER") + } + val server = serverRepository.getServer(serviceId) + ?: throw NullPointerException("Server with serviceId $serviceId not found") + this.connect(cloudPlayer, server) + } + + override suspend fun connect(cloudPlayer: ICloudPlayer, server: ICloudServer) { + if (server.serviceId.type != ServiceType.MINECRAFT_SERVER) { + throw IllegalArgumentException("Server type must be MINECRAFT_SERVER") + } + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.executeConnect(cloudPlayer, server) + return + } + val packet = CloudPlayerConnectServerPacket(cloudPlayer.uniqueId, server.serviceId) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + override suspend fun kick(uniqueId: UUID, reason: Component) { + val player = playerRepository.getPlayer(uniqueId) + ?: throw NullPointerException("Player with uniqueId $uniqueId not found") + this.kick(player, reason) + } + + override suspend fun kick(cloudPlayer: ICloudPlayer, reason: Component) { + if (!cloudPlayer.connected || cloudPlayer.proxyId == null) return + if (cloudPlayer.proxyId == thisServiceId) { + this.executeKick(cloudPlayer, reason) + return + } + val packet = CloudPlayerKickPacket(cloudPlayer.uniqueId, reason) + packetManager.publish(packet, cloudPlayer.proxyId!!) + } + + abstract fun audience(player: ICloudPlayer): Audience + + abstract fun executeConnect(cloudPlayer: ICloudPlayer, server: ICloudServer) + + abstract fun executeKick(cloudPlayer: ICloudPlayer, reason: Component) + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/player/PlayerExecutorListener.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/player/PlayerExecutorListener.kt new file mode 100644 index 00000000..6e7b342d --- /dev/null +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/player/PlayerExecutorListener.kt @@ -0,0 +1,72 @@ +package dev.redicloud.service.base.player + +import dev.redicloud.api.packets.IPacketManager +import dev.redicloud.api.packets.listen +import dev.redicloud.api.player.ICloudPlayerExecutor +import dev.redicloud.service.base.packets.player.* +import kotlinx.coroutines.runBlocking + +class PlayerExecutorListener( + private val playerExecutor: ICloudPlayerExecutor, + packetManager: IPacketManager +) { + + val bookPacketListener = packetManager.listen { + runBlocking { + playerExecutor.showBook(it.uniqueId, it.createBook()) + } + } + + val bossBarPacketListener = packetManager.listen { + runBlocking { + if (it.hide) { + playerExecutor.hideBossBar(it.uniqueId, it.createBossBar()) + } else { + playerExecutor.showBossBar(it.uniqueId, it.createBossBar()) + } + } + } + + val connectServerPacketListener = packetManager.listen { + runBlocking { + playerExecutor.connect(it.uniqueId, it.serviceId) + } + } + + val headerFooterPacketListener = packetManager.listen { + runBlocking { + playerExecutor.sendPlayerListHeaderAndFooter(it.uniqueId, it.header, it.footer) + } + } + + val kickPacketListener = packetManager.listen { + runBlocking { + playerExecutor.kick(it.uniqueId, it.reason) + } + } + + val messagePacketLister = packetManager.listen { + runBlocking { + playerExecutor.sendMessage(it.uniqueId, it.component) + } + } + + val resourcePacketListener = packetManager.listen { + runBlocking { + playerExecutor.sendResourcePacks(it.uniqueId, it.createResourcePackRequest()) + } + } + + val soundPacketListener = packetManager.listen { + runBlocking { + playerExecutor.playSound(it.uniqueId, it.createSound()) + } + } + + val titlePacketListener = packetManager.listen { + runBlocking { + playerExecutor.showTitle(it.uniqueId, it.createTitle()) + } + } + +} \ No newline at end of file diff --git a/services/base-service/src/main/kotlin/dev/redicloud/service/base/repository/_ServiceRepository.kt b/services/base-service/src/main/kotlin/dev/redicloud/service/base/repository/_ServiceRepository.kt index a72aa18e..15d5df77 100644 --- a/services/base-service/src/main/kotlin/dev/redicloud/service/base/repository/_ServiceRepository.kt +++ b/services/base-service/src/main/kotlin/dev/redicloud/service/base/repository/_ServiceRepository.kt @@ -4,8 +4,8 @@ import dev.redicloud.repository.node.NodeRepository import dev.redicloud.repository.server.ServerRepository import dev.redicloud.repository.service.CachedServiceRepository import dev.redicloud.repository.service.ServiceRepository -import dev.redicloud.service.base.packets.ServicePingPacket -import dev.redicloud.service.base.packets.ServicePingResponse +import dev.redicloud.service.base.packets.ping.ServicePingPacket +import dev.redicloud.service.base.packets.ping.ServicePingResponse import dev.redicloud.api.service.ServiceId import dev.redicloud.api.service.ServiceType import kotlin.time.Duration.Companion.seconds diff --git a/services/minecraft-server-service/src/main/kotlin/dev/redicloud/service/minecraft/repositories/_ServerRepository.kt b/services/minecraft-server-service/src/main/kotlin/dev/redicloud/service/minecraft/repositories/_ServerRepository.kt index 29211e27..aef22765 100644 --- a/services/minecraft-server-service/src/main/kotlin/dev/redicloud/service/minecraft/repositories/_ServerRepository.kt +++ b/services/minecraft-server-service/src/main/kotlin/dev/redicloud/service/minecraft/repositories/_ServerRepository.kt @@ -1,6 +1,6 @@ package dev.redicloud.service.minecraft.repositories -import dev.redicloud.api.events.impl.server.CloudServerConnectedEvent +import dev.redicloud.api.events.internal.server.CloudServerConnectedEvent import dev.redicloud.repository.server.CloudServer import dev.redicloud.repository.server.ServerRepository import dev.redicloud.api.service.ServiceId diff --git a/services/node-service/build.gradle.kts b/services/node-service/build.gradle.kts index 154b2c11..102f7fde 100644 --- a/services/node-service/build.gradle.kts +++ b/services/node-service/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { shade(project(":updater")) shade(BuildDependencies.LOGBACK_CLASSIC) shade(BuildDependencies.LOGBACK_CORE) + dependency(BuildDependencies.KYORI_ADVENTURE_API) compileOnly(BuildDependencies.JLINE_JANSI) compileOnly(BuildDependencies.JSCH) } diff --git a/services/node-service/src/main/kotlin/dev/redicloud/service/node/NodeService.kt b/services/node-service/src/main/kotlin/dev/redicloud/service/node/NodeService.kt index ba1f958e..74cf7a5e 100644 --- a/services/node-service/src/main/kotlin/dev/redicloud/service/node/NodeService.kt +++ b/services/node-service/src/main/kotlin/dev/redicloud/service/node/NodeService.kt @@ -2,8 +2,8 @@ package dev.redicloud.service.node import dev.redicloud.api.commands.ICommand import dev.redicloud.api.commands.ICommandManager -import dev.redicloud.api.events.impl.module.ModuleHandlerInitializedEvent -import dev.redicloud.api.events.impl.server.CloudServerDisconnectedEvent +import dev.redicloud.api.events.internal.module.ModuleHandlerInitializedEvent +import dev.redicloud.api.events.internal.server.CloudServerDisconnectedEvent import dev.redicloud.cluster.file.FileCluster import dev.redicloud.cluster.file.FileNodeRepository import dev.redicloud.database.DatabaseConnection @@ -15,9 +15,9 @@ import dev.redicloud.repository.server.version.task.CloudServerVersionUpdateTask import dev.redicloud.server.factory.ServerFactory import dev.redicloud.server.factory.task.* import dev.redicloud.service.base.BaseService -import dev.redicloud.api.events.impl.node.NodeConnectEvent -import dev.redicloud.api.events.impl.node.NodeDisconnectEvent -import dev.redicloud.api.events.impl.node.NodeSuspendedEvent +import dev.redicloud.api.events.internal.node.NodeConnectEvent +import dev.redicloud.api.events.internal.node.NodeDisconnectEvent +import dev.redicloud.api.events.internal.node.NodeSuspendedEvent import dev.redicloud.api.service.server.factory.ICloudRemoteServerFactory import dev.redicloud.repository.server.version.handler.defaults.URLServerVersionHandler import dev.redicloud.service.node.console.NodeConsole @@ -32,6 +32,7 @@ import dev.redicloud.api.utils.TEMP_FOLDER import dev.redicloud.console.Console import dev.redicloud.modules.ModuleHandler import dev.redicloud.service.node.listener.ConfigurationUpdateServerListener +import dev.redicloud.service.node.player.NodePlayerExecutor import dev.redicloud.service.node.tasks.player.PlayerProxyConnectionStateTask import dev.redicloud.service.node.tasks.service.CloudInvalidServerUnregisterTask import dev.redicloud.updater.Updater @@ -47,9 +48,10 @@ class NodeService( val firstStart: Boolean = false ) : BaseService(databaseConfiguration, databaseConnection, configuration.toServiceId()) { - final override val fileTemplateRepository: NodeFileTemplateRepository - final override val serverVersionTypeRepository: CloudServerVersionTypeRepository - final override val moduleHandler: ModuleHandler + override val fileTemplateRepository: NodeFileTemplateRepository + override val serverVersionTypeRepository: CloudServerVersionTypeRepository + override val moduleHandler: ModuleHandler + override val playerExecutor: NodePlayerExecutor val console: NodeConsole val fileNodeRepository: FileNodeRepository val fileCluster: FileCluster @@ -63,6 +65,7 @@ class NodeService( serverVersionTypeRepository = CloudServerVersionTypeRepository(databaseConnection, console, packetManager) serverFactory = ServerFactory(databaseConnection, nodeRepository, serverRepository, serverVersionRepository, serverVersionTypeRepository, fileTemplateRepository, javaVersionRepository, packetManager, configuration.hostAddress, console, clusterConfiguration, configurationTemplateRepository, eventManager, fileCluster) moduleHandler = ModuleHandler(serviceId, loadModuleRepositoryUrls(), eventManager, packetManager, null, databaseConnection) + playerExecutor = NodePlayerExecutor(this.playerRepository, serverRepository, packetManager, serviceId) runBlocking { registerDefaults() diff --git a/services/node-service/src/main/kotlin/dev/redicloud/service/node/console/NodeConsole.kt b/services/node-service/src/main/kotlin/dev/redicloud/service/node/console/NodeConsole.kt index 0e469d57..22c13625 100644 --- a/services/node-service/src/main/kotlin/dev/redicloud/service/node/console/NodeConsole.kt +++ b/services/node-service/src/main/kotlin/dev/redicloud/service/node/console/NodeConsole.kt @@ -1,10 +1,10 @@ package dev.redicloud.service.node.console import dev.redicloud.api.service.server.CloudServerState -import dev.redicloud.api.events.impl.server.CloudServerConnectedEvent -import dev.redicloud.api.events.impl.server.CloudServerDeleteEvent -import dev.redicloud.api.events.impl.server.CloudServerDisconnectedEvent -import dev.redicloud.api.events.impl.server.CloudServerTransferredEvent +import dev.redicloud.api.events.internal.server.CloudServerConnectedEvent +import dev.redicloud.api.events.internal.server.CloudServerDeleteEvent +import dev.redicloud.api.events.internal.server.CloudServerDisconnectedEvent +import dev.redicloud.api.events.internal.server.CloudServerTransferredEvent import dev.redicloud.console.Console import dev.redicloud.console.utils.toConsoleValue import dev.redicloud.console.utils.Screen @@ -14,11 +14,11 @@ import dev.redicloud.repository.node.NodeRepository import dev.redicloud.repository.server.CloudServer import dev.redicloud.repository.server.ServerRepository import dev.redicloud.service.node.NodeConfiguration -import dev.redicloud.api.events.impl.node.NodeConnectEvent -import dev.redicloud.api.events.impl.node.NodeDisconnectEvent -import dev.redicloud.api.events.impl.node.NodeMasterChangedEvent -import dev.redicloud.api.events.impl.node.NodeSuspendedEvent -import dev.redicloud.api.events.impl.server.CloudServerStateChangeEvent +import dev.redicloud.api.events.internal.node.NodeConnectEvent +import dev.redicloud.api.events.internal.node.NodeDisconnectEvent +import dev.redicloud.api.events.internal.node.NodeMasterChangedEvent +import dev.redicloud.api.events.internal.node.NodeSuspendedEvent +import dev.redicloud.api.events.internal.server.CloudServerStateChangeEvent import dev.redicloud.api.events.listen import dev.redicloud.commands.api.PARSERS import kotlinx.coroutines.runBlocking diff --git a/services/node-service/src/main/kotlin/dev/redicloud/service/node/listener/ConfigurationUpdateServerListener.kt b/services/node-service/src/main/kotlin/dev/redicloud/service/node/listener/ConfigurationUpdateServerListener.kt index 0c51d743..9f163da6 100644 --- a/services/node-service/src/main/kotlin/dev/redicloud/service/node/listener/ConfigurationUpdateServerListener.kt +++ b/services/node-service/src/main/kotlin/dev/redicloud/service/node/listener/ConfigurationUpdateServerListener.kt @@ -1,7 +1,6 @@ package dev.redicloud.service.node.listener -import dev.redicloud.api.events.IEventManager -import dev.redicloud.api.events.impl.template.configuration.ConfigurationTemplateUpdateEvent +import dev.redicloud.api.events.internal.template.configuration.ConfigurationTemplateUpdateEvent import dev.redicloud.api.events.listen import dev.redicloud.api.service.ServiceId import dev.redicloud.api.service.node.ICloudNodeRepository diff --git a/services/node-service/src/main/kotlin/dev/redicloud/service/node/player/NodePlayerExecutor.kt b/services/node-service/src/main/kotlin/dev/redicloud/service/node/player/NodePlayerExecutor.kt new file mode 100644 index 00000000..afeb5925 --- /dev/null +++ b/services/node-service/src/main/kotlin/dev/redicloud/service/node/player/NodePlayerExecutor.kt @@ -0,0 +1,33 @@ +package dev.redicloud.service.node.player + +import dev.redicloud.api.packets.IPacketManager +import dev.redicloud.api.player.ICloudPlayer +import dev.redicloud.api.player.ICloudPlayerRepository +import dev.redicloud.api.service.ServiceId +import dev.redicloud.api.service.server.ICloudServer +import dev.redicloud.api.service.server.ICloudServerRepository +import dev.redicloud.service.base.player.BasePlayerExecutor +import kotlinx.coroutines.runBlocking +import net.kyori.adventure.audience.Audience +import net.kyori.adventure.text.Component + +class NodePlayerExecutor( + playerRepository: ICloudPlayerRepository, + serverRepository: ICloudServerRepository, + packetManager: IPacketManager, + thisServiceId: ServiceId +) : BasePlayerExecutor(playerRepository, serverRepository, packetManager, thisServiceId) { + + override fun audience(player: ICloudPlayer): Audience { + throw UnsupportedOperationException("Not supported for node service") + } + + override fun executeConnect(cloudPlayer: ICloudPlayer, server: ICloudServer) { + runBlocking { this@NodePlayerExecutor.connect(cloudPlayer, server) } + } + + override fun executeKick(cloudPlayer: ICloudPlayer, reason: Component) { + runBlocking { this@NodePlayerExecutor.kick(cloudPlayer, reason) } + } + +} \ No newline at end of file diff --git a/services/node-service/src/main/kotlin/dev/redicloud/service/node/repository/node/_NodeRepository.kt b/services/node-service/src/main/kotlin/dev/redicloud/service/node/repository/node/_NodeRepository.kt index 3de43225..72048afd 100644 --- a/services/node-service/src/main/kotlin/dev/redicloud/service/node/repository/node/_NodeRepository.kt +++ b/services/node-service/src/main/kotlin/dev/redicloud/service/node/repository/node/_NodeRepository.kt @@ -4,8 +4,8 @@ import dev.redicloud.logging.LogManager import dev.redicloud.repository.node.CloudNode import dev.redicloud.repository.node.NodeRepository import dev.redicloud.repository.service.ServiceSessions -import dev.redicloud.api.events.impl.node.NodeConnectEvent -import dev.redicloud.api.events.impl.node.NodeSuspendedEvent +import dev.redicloud.api.events.internal.node.NodeConnectEvent +import dev.redicloud.api.events.internal.node.NodeSuspendedEvent import dev.redicloud.service.node.NodeService import dev.redicloud.api.service.ServiceId import dev.redicloud.utils.toMb diff --git a/services/node-service/src/main/kotlin/dev/redicloud/service/node/tasks/node/NodeChooseMasterTask.kt b/services/node-service/src/main/kotlin/dev/redicloud/service/node/tasks/node/NodeChooseMasterTask.kt index 9460dbf4..68491650 100644 --- a/services/node-service/src/main/kotlin/dev/redicloud/service/node/tasks/node/NodeChooseMasterTask.kt +++ b/services/node-service/src/main/kotlin/dev/redicloud/service/node/tasks/node/NodeChooseMasterTask.kt @@ -1,7 +1,7 @@ package dev.redicloud.service.node.tasks.node import dev.redicloud.repository.node.NodeRepository -import dev.redicloud.api.events.impl.node.NodeMasterChangedEvent +import dev.redicloud.api.events.internal.node.NodeMasterChangedEvent import dev.redicloud.event.EventManager import dev.redicloud.tasks.CloudTask import dev.redicloud.api.service.ServiceId diff --git a/services/proxy-server-service/build.gradle.kts b/services/proxy-server-service/build.gradle.kts index 470eb102..a2c3968d 100644 --- a/services/proxy-server-service/build.gradle.kts +++ b/services/proxy-server-service/build.gradle.kts @@ -21,4 +21,5 @@ dependencies { compileOnly(project(":services:base-service")) compileOnly(project(":services:minecraft-server-service")) compileOnly(project(":apis:connector-api")) + compileOnly(BuildDependencies.KYORI_ADVENTURE_API) } \ No newline at end of file diff --git a/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/ProxyServerService.kt b/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/ProxyServerService.kt index fa0eff08..bf28f295 100644 --- a/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/ProxyServerService.kt +++ b/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/ProxyServerService.kt @@ -4,12 +4,14 @@ import dev.redicloud.api.service.ServiceId import dev.redicloud.repository.server.CloudMinecraftServer import dev.redicloud.service.minecraft.listener.CloudServerListener import dev.redicloud.api.service.ServiceType +import dev.redicloud.service.minecraft.listener.AbstractCloudNotificationListeners import dev.redicloud.utils.coroutineExceptionHandler import kotlinx.coroutines.runBlocking abstract class ProxyServerService : MinecraftServerService() { protected val registeredServers: MutableMap = mutableMapOf() + abstract val notificationListeners: AbstractCloudNotificationListeners init { runBlocking(coroutineExceptionHandler) { diff --git a/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/listener/AbstractCloudNotificationListeners.kt b/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/listener/AbstractCloudNotificationListeners.kt new file mode 100644 index 00000000..70dd3cc6 --- /dev/null +++ b/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/listener/AbstractCloudNotificationListeners.kt @@ -0,0 +1,149 @@ +package dev.redicloud.service.minecraft.listener + +import dev.redicloud.api.events.IEventManager +import dev.redicloud.api.events.internal.node.NodeConnectEvent +import dev.redicloud.api.events.internal.node.NodeDisconnectEvent +import dev.redicloud.api.events.internal.node.NodeMasterChangedEvent +import dev.redicloud.api.events.internal.node.NodeSuspendedEvent +import dev.redicloud.api.events.internal.server.CloudServerStateChangeEvent +import dev.redicloud.api.events.listen +import dev.redicloud.api.service.ICloudService +import dev.redicloud.api.service.ServiceType +import dev.redicloud.api.service.node.ICloudNodeRepository +import dev.redicloud.api.service.server.CloudServerState +import dev.redicloud.api.service.server.ICloudServerRepository +import dev.redicloud.repository.server.CloudServer +import kotlinx.coroutines.runBlocking +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.TextComponent +import net.kyori.adventure.text.format.NamedTextColor + +abstract class AbstractCloudNotificationListeners( + private val serverRepository: ICloudServerRepository, + private val nodeRepository: ICloudNodeRepository, + eventManager: IEventManager +) { + + private val onSuspendNode = eventManager.listen { + runBlocking { + val node = nodeRepository.getNode(it.serviceId) ?: return@runBlocking + val suspender = nodeRepository.getNode(it.suspender) + sendMessage("redicloud.node.suspend") { + it.append( + translateIdentifierName(node), + Component.text().content(": ").color(NamedTextColor.DARK_GRAY), + Component.text().content("● ").color(NamedTextColor.RED), + Component.text().content("(").color(NamedTextColor.DARK_GRAY), + Component.text().content("%tc%suspended by ${suspender?.identifyName()}").color(NamedTextColor.RED), + Component.text().content(")").color(NamedTextColor.DARK_GRAY) + ) + } + } + } + + private val onNodeConnect = eventManager.listen { + runBlocking { + val node = nodeRepository.getNode(it.serviceId) ?: return@runBlocking + sendMessage("redicloud.node.connect") { + it.append( + translateIdentifierName(node), + Component.text().content(": ").color(NamedTextColor.DARK_GRAY), + Component.text().content("● ").color(NamedTextColor.GREEN), + Component.text().content("(").color(NamedTextColor.DARK_GRAY), + Component.text().content("connected to the cluster").color(NamedTextColor.WHITE), + Component.text().content(")").color(NamedTextColor.DARK_GRAY) + ) + } + } + } + + private val onNodeDisconnect = eventManager.listen { + runBlocking { + val node = nodeRepository.getNode(it.serviceId) ?: return@runBlocking + sendMessage("redicloud.node.disconnect") { + it.append( + translateIdentifierName(node), + Component.text().content(": ").color(NamedTextColor.DARK_GRAY), + Component.text().content("● ").color(NamedTextColor.RED), + Component.text().content("(").color(NamedTextColor.DARK_GRAY), + Component.text().content("disconnected from the cluster").color(NamedTextColor.WHITE), + Component.text().content(")").color(NamedTextColor.DARK_GRAY) + ) + } + } + } + + private val onNodeMasterChange = eventManager.listen { + runBlocking { + val node = nodeRepository.getNode(it.serviceId) ?: return@runBlocking + sendMessage("redicloud.node.master.change") { + it.append( + translateIdentifierName(node), + Component.text().content(": ").color(NamedTextColor.DARK_GRAY), + Component.text().content("● ").color(NamedTextColor.YELLOW), + Component.text().content("(").color(NamedTextColor.DARK_GRAY), + Component.text().content("new master").color(NamedTextColor.WHITE), + Component.text().content(")").color(NamedTextColor.DARK_GRAY) + ) + } + } + } + + private val onServerStateChangeEvent = eventManager.listen { + runBlocking { + val server = serverRepository.getServer(it.serviceId) ?: return@runBlocking + when (it.state) { + CloudServerState.PREPARING -> { + sendMessage("redicloud.server.state.preparing") { + it.append( + translateIdentifierName(server), + Component.text().content(": ").color(NamedTextColor.DARK_GRAY), + Component.text().content("● ").color(NamedTextColor.YELLOW), + Component.text().content("(").color(NamedTextColor.DARK_GRAY), + Component.text().content("preparing").color(NamedTextColor.WHITE), + Component.text().content(")").color(NamedTextColor.DARK_GRAY) + ) + } + } + + CloudServerState.RUNNING -> { + val clickCommand = if (server.serviceId.type == ServiceType.MINECRAFT_SERVER) "/server ${server.name}" else null + sendMessage("redicloud.server.state.running", clickCommand) { + it.append( + translateIdentifierName(server), + Component.text().content(": ").color(NamedTextColor.DARK_GRAY), + Component.text().content("● ").color(NamedTextColor.GREEN), + Component.text().content("(").color(NamedTextColor.DARK_GRAY), + Component.text().content("started").color(NamedTextColor.WHITE), + Component.text().content(")").color(NamedTextColor.DARK_GRAY) + ) + } + } + + CloudServerState.STOPPING -> { + sendMessage("redicloud.server.state.stopping") { + it.append( + translateIdentifierName(server), + Component.text().content(": ").color(NamedTextColor.DARK_GRAY), + Component.text().content("● ").color(NamedTextColor.RED), + Component.text().content("(").color(NamedTextColor.DARK_GRAY), + Component.text().content("stopping").color(NamedTextColor.WHITE), + Component.text().content(")").color(NamedTextColor.DARK_GRAY) + ) + } + } + + else -> return@runBlocking + } + } + } + + private fun translateIdentifierName(service: ICloudService): TextComponent { + return Component.text().append( + Component.text().content(service.name).color(NamedTextColor.AQUA) + ).build() + } + + abstract fun sendMessage(permission: String, clickCommand: String? = null, lambda: (TextComponent.Builder) -> Unit) + +} \ No newline at end of file diff --git a/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/listener/CloudServerListener.kt b/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/listener/CloudServerListener.kt index e765b960..79607c82 100644 --- a/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/listener/CloudServerListener.kt +++ b/services/proxy-server-service/src/main/kotlin/dev/redicloud/service/minecraft/listener/CloudServerListener.kt @@ -1,7 +1,7 @@ package dev.redicloud.service.minecraft.listener -import dev.redicloud.api.events.impl.server.CloudServerConnectedEvent -import dev.redicloud.api.events.impl.server.CloudServerDisconnectedEvent +import dev.redicloud.api.events.internal.server.CloudServerConnectedEvent +import dev.redicloud.api.events.internal.server.CloudServerDisconnectedEvent import dev.redicloud.api.events.listen import dev.redicloud.service.minecraft.ProxyServerService import dev.redicloud.utils.defaultScope diff --git a/settings.gradle.kts b/settings.gradle.kts index 2dc3ff36..8a00abda 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { } } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } include("database")