From 97f66960b87122044c2988bbcf7f44352be8fde1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 20 Jan 2023 18:28:36 +0100 Subject: [PATCH 01/77] yeet all --- .../org/anvilpowered/anvil/api/Anvil.java | 90 -- .../anvilpowered/anvil/api/Environment.java | 227 ---- .../anvil/api/EnvironmentManager.java | 42 - .../java/org/anvilpowered/anvil/api/KUtils.kt | 28 - .../org/anvilpowered/anvil/api/Platform.java | 41 - .../anvil/api/ServiceManager.java | 60 - .../api/command/CommandExecuteService.java | 29 - .../anvil/api/command/CommandNode.java | 43 - .../anvil/api/command/CommandService.java | 82 -- .../api/coremember/CoreMemberManager.java | 44 - .../api/coremember/CoreMemberRepository.java | 517 -------- .../coremember/MongoCoreMemberRepository.java | 127 -- .../coremember/XodusCoreMemberRepository.java | 125 -- .../anvil/api/datastore/CacheService.java | 84 -- .../anvil/api/datastore/CachedRepository.java | 180 --- .../anvil/api/datastore/Component.java | 62 - .../anvil/api/datastore/DataStoreContext.java | 162 --- .../anvil/api/datastore/Manager.java | 186 --- .../anvil/api/datastore/MongoContext.java | 100 -- .../anvil/api/datastore/MongoRepository.java | 64 - .../anvil/api/datastore/Repository.java | 159 --- .../anvil/api/datastore/XodusContext.java | 78 -- .../anvil/api/datastore/XodusEmbedded.java | 31 - .../anvil/api/datastore/XodusEntity.java | 31 - .../anvil/api/datastore/XodusRepository.java | 67 - .../anvil/api/entity/RestrictionCriteria.java | 290 ----- .../anvil/api/entity/RestrictionService.java | 101 -- .../anvil/api/misc/BindingExtensions.java | 156 --- .../anvilpowered/anvil/api/misc/Named.java | 24 - .../anvil/api/model/Mappable.java | 150 --- .../anvil/api/model/ObjectWithId.java | 32 - .../api/model/coremember/CoreMember.java | 60 - .../anvil/api/plugin/BasicPluginInfo.java | 38 - .../anvil/api/plugin/PluginInfo.java | 24 - .../anvil/api/plugin/PluginMessages.java | 30 - .../api/registry/ConfigurationService.java | 30 - .../anvilpowered/anvil/api/registry/Key.java | 222 ---- .../anvil/api/registry/KeyBuilder.java | 98 -- .../anvilpowered/anvil/api/registry/Keys.java | 325 ----- .../anvil/api/registry/Registry.java | 256 ---- .../anvil/api/registry/RegistryScope.java | 40 - .../anvil/api/registry/RegistryScoped.java | 78 -- .../anvil/api/registry/TypeTokens.java | 36 - .../anvil/api/registry/ZoneIdSerializer.java | 40 - .../anvil/api/server/BackendServer.java | 39 - .../anvil/api/server/LocationService.java | 47 - .../anvil/api/server/Version.java | 26 - .../anvil/api/util/KickService.java | 32 - .../anvil/api/util/PermissionService.java | 45 - .../anvilpowered/anvil/api/util/Result.java | 26 - .../anvil/api/util/TextService.java | 1126 ----------------- .../anvil/api/util/TimeFormatService.java | 118 -- .../anvil/api/util/UserService.java | 73 -- .../base/datastore/BaseCacheService.java | 135 -- .../base/datastore/BaseCachedRepository.java | 87 -- .../anvil/base/datastore/BaseComponent.java | 53 - .../anvil/base/datastore/BaseManager.java | 103 -- .../datastore/BaseMongoCachedRepository.java | 52 - .../base/datastore/BaseMongoComponent.java | 42 - .../base/datastore/BaseMongoRepository.java | 197 --- .../anvil/base/datastore/BaseRepository.java | 68 - .../datastore/BaseXodusCachedRepository.java | 80 -- .../base/datastore/BaseXodusComponent.java | 46 - .../base/datastore/BaseXodusRepository.java | 266 ---- .../anvil/base/model/MongoDbo.java | 67 - .../anvil/base/model/XodusDbo.java | 107 -- .../anvil/base/plugin/BasePlugin.java | 144 --- .../registry/BaseConfigurationService.java | 432 ------- .../base/registry/BaseExtendedRegistry.java | 65 - .../anvil/base/registry/BaseRegistry.java | 252 ---- .../org/anvilpowered/anvil/api/AnvilImpl.java | 40 - .../anvil/api/EnvironmentBuilderImpl.java | 291 ----- .../anvil/api/EnvironmentImpl.java | 138 -- .../anvil/api/EnvironmentManagerImpl.java | 98 -- .../anvilpowered/anvil/api/PlatformImpl.java | 67 - .../anvil/api/ServiceManagerImpl.java | 160 --- .../command/CommonAnvilCommandNode.java | 142 --- .../command/CommonAnvilPluginsCommand.java | 73 -- .../command/CommonAnvilReloadCommand.java | 175 --- .../common/command/CommonCallbackCommand.java | 80 -- .../common/command/CommonCommandService.java | 281 ---- .../coremember/CommonCoreMemberManager.java | 33 - .../CommonCoreMemberRepository.java | 97 -- .../CommonMongoCoreMemberRepository.java | 264 ---- .../CommonXodusCoreMemberRepository.java | 290 ----- .../entity/CommonRestrictionService.java | 94 -- .../anvil/common/entity/EntityUtils.java | 27 - .../common/misc/CommonBindingExtensions.java | 120 -- .../model/coremember/MongoCoreMember.java | 153 --- .../model/coremember/XodusCoreMember.java | 253 ---- .../anvil/common/module/ApiCommonModule.java | 36 - .../anvil/common/module/CommonModule.java | 93 -- .../common/module/JavaUtilLoggingAdapter.java | 314 ----- .../anvil/common/module/PlatformModule.java | 40 - .../anvil/common/plugin/AnvilPluginInfo.java | 85 -- .../common/plugin/AnvilPluginMessages.java | 68 - .../anvil/common/util/CommonTextService.java | 536 -------- .../common/util/CommonTimeFormatService.java | 360 ------ .../anvil/common/util/CommonUserService.java | 70 - .../anvil/common/util/StringTextService.java | 248 ---- .../anvil/common/command/regedit/Change.kt | 57 - .../regedit/CommonRegistryEditBaseCommand.kt | 61 - .../CommonRegistryEditCancelCommand.kt | 40 - .../regedit/CommonRegistryEditCommandNode.kt | 91 -- .../CommonRegistryEditCommitCommand.kt | 41 - .../regedit/CommonRegistryEditKeyCommand.kt | 108 -- .../regedit/CommonRegistryEditRootCommand.kt | 39 - .../CommonRegistryEditSelectCommand.kt | 56 - .../regedit/CommonRegistryEditStartCommand.kt | 109 -- .../anvil/common/command/regedit/RegEdit.kt | 73 -- .../anvil/common/command/regedit/Stage.kt | 261 ---- .../anvil/common/module/FallbackModule.kt | 39 - .../anvil/common/plugin/FallbackPluginInfo.kt | 55 - .../registry/CommonConfigurationService.kt | 52 - .../common/registry/CommonZoneIdSerializer.kt | 34 - .../common/server/CommonBackendServer.kt | 33 - .../common/server/CommonLocationService.kt | 65 - anvil-md5/build.gradle.kts | 8 - .../anvil/md5/util/MD5TextService.java | 335 ----- .../anvil/spigot/AnvilSpigot.java | 129 -- .../command/SpigotAnvilCommandNode.java | 87 -- .../command/SpigotAnvilPluginsCommand.java | 41 - .../command/SpigotAnvilReloadCommand.java | 54 - .../spigot/command/SpigotCallbackCommand.java | 43 - .../command/SpigotCommandExecuteService.java | 47 - .../spigot/command/SpigotCommandService.java | 163 --- .../spigot/entity/SpigotEntityUtils.java | 36 - .../spigot/listener/SpigotPlayerListener.java | 103 -- .../anvil/spigot/module/ApiSpigotModule.java | 72 -- .../anvil/spigot/module/SpigotModule.java | 56 - .../anvil/spigot/util/SpigotKickService.java | 57 - .../spigot/util/SpigotPermissionService.java | 31 - .../anvil/spigot/util/SpigotTextService.java | 37 - .../anvil/spigot/util/SpigotUserService.java | 110 -- .../SpigotRegistryEditCancelCommand.kt | 34 - .../regedit/SpigotRegistryEditCommandNode.kt | 56 - .../SpigotRegistryEditCommitCommand.kt | 34 - .../regedit/SpigotRegistryEditKeyCommand.kt | 39 - .../regedit/SpigotRegistryEditRootCommand.kt | 36 - .../SpigotRegistryEditSelectCommand.kt | 39 - .../regedit/SpigotRegistryEditStartCommand.kt | 39 - .../spigot/module/SpigotFallbackModule.kt | 25 - .../spigot/server/SpigotLocationService.kt | 64 - anvil-spigot/src/main/resources/plugin.yml | 11 - .../anvil/sponge/AnvilSponge.java | 57 - .../command/SpongeAnvilCommandNode.java | 115 -- .../command/SpongeAnvilPluginsCommand.java | 37 - .../command/SpongeAnvilReloadCommand.java | 52 - .../command/SpongeCommandExecuteService.java | 44 - .../sponge/command/SpongeCommandService.java | 146 --- .../sponge/entity/SpongeEntityUtils.java | 36 - .../sponge/listener/SpongePlayerListener.java | 102 -- .../anvil/sponge/module/ApiSpongeModule.java | 67 - .../anvil/sponge/module/SpongeModule.java | 46 - .../anvil/sponge/util/SpongeKickService.java | 54 - .../sponge/util/SpongePermissionService.java | 30 - .../anvil/sponge/util/SpongeTextService.java | 435 ------- .../anvil/sponge/util/SpongeUserService.java | 109 -- .../SpongeRegistryEditCancelCommand.kt | 58 - .../regedit/SpongeRegistryEditCommandNode.kt | 61 - .../SpongeRegistryEditCommitCommand.kt | 58 - .../regedit/SpongeRegistryEditKeyCommand.kt | 59 - .../regedit/SpongeRegistryEditRootCommand.kt | 37 - .../SpongeRegistryEditSelectCommand.kt | 59 - .../regedit/SpongeRegistryEditStartCommand.kt | 59 - .../sponge/module/SpongeFallbackModule.kt | 25 - .../registry/SpongeConfigurationService.kt | 30 - .../sponge/server/SpongeLocationService.kt | 67 - .../anvil/velocity/AnvilVelocity.java | 60 - .../command/VelocityAnvilCommandNode.java | 82 -- .../command/VelocityAnvilPluginsCommand.java | 41 - .../command/VelocityAnvilReloadCommand.java | 41 - .../command/VelocityCallbackCommand.java | 44 - .../VelocityCommandExecuteService.java | 34 - .../command/VelocityCommandService.java | 181 --- .../listener/VelocityPlayerListener.java | 92 -- .../velocity/module/ApiVelocityModule.java | 68 - .../anvil/velocity/module/VelocityModule.java | 56 - .../velocity/util/VelocityKickService.java | 57 - .../util/VelocityPermissionService.java | 32 - .../velocity/util/VelocityTextService.java | 366 ------ .../velocity/util/VelocityUserService.java | 109 -- .../VelocityRegistryEditCancelCommand.kt | 31 - .../VelocityRegistryEditCommandNode.kt | 59 - .../VelocityRegistryEditCommitCommand.kt | 31 - .../regedit/VelocityRegistryEditKeyCommand.kt | 33 - .../VelocityRegistryEditRootCommand.kt | 34 - .../VelocityRegistryEditSelectCommand.kt | 33 - .../VelocityRegistryEditStartCommand.kt | 33 - .../velocity/module/VelocityFallbackModule.kt | 25 - .../velocity/server/VelocityBackendServer.kt | 45 - .../server/VelocityLocationService.kt | 51 - .../anvil/velocity/server/VelocityVersion.kt | 29 - api/build.gradle.kts | 26 - build.gradle.kts | 22 - core/build.gradle.kts | 11 - .../anvil/core/ModuleExtensions.kt | 10 - gradle/libs.versions.toml | 30 +- paper/build.gradle.kts | 10 - settings.gradle.kts | 8 +- sponge/build.gradle.kts | 10 - velocity/build.gradle.kts | 14 - 202 files changed, 4 insertions(+), 19790 deletions(-) delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/Anvil.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/Environment.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/EnvironmentManager.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/KUtils.kt delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/Platform.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/ServiceManager.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandExecuteService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandNode.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/CoreMemberManager.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/CoreMemberRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/MongoCoreMemberRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/XodusCoreMemberRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/CacheService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/CachedRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Component.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/DataStoreContext.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Manager.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/MongoContext.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/MongoRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Repository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusContext.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusEmbedded.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusEntity.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/entity/RestrictionCriteria.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/entity/RestrictionService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/misc/BindingExtensions.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/misc/Named.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/model/Mappable.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/model/ObjectWithId.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/model/coremember/CoreMember.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/BasicPluginInfo.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/PluginInfo.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/PluginMessages.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/ConfigurationService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Key.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/KeyBuilder.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Keys.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Registry.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/RegistryScope.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/RegistryScoped.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/TypeTokens.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/ZoneIdSerializer.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/server/BackendServer.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/server/LocationService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/server/Version.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/util/KickService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/util/PermissionService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/util/Result.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/util/TextService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/util/TimeFormatService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/api/util/UserService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseCacheService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseCachedRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseComponent.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseManager.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoCachedRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoComponent.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusCachedRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusComponent.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusRepository.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/model/MongoDbo.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/model/XodusDbo.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/plugin/BasePlugin.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseConfigurationService.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseExtendedRegistry.java delete mode 100644 anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseRegistry.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/api/AnvilImpl.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentBuilderImpl.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentImpl.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentManagerImpl.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/api/PlatformImpl.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/api/ServiceManagerImpl.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilCommandNode.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilPluginsCommand.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilReloadCommand.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonCallbackCommand.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonCommandService.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonCoreMemberManager.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonCoreMemberRepository.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonMongoCoreMemberRepository.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonXodusCoreMemberRepository.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/entity/CommonRestrictionService.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/entity/EntityUtils.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/misc/CommonBindingExtensions.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/model/coremember/MongoCoreMember.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/model/coremember/XodusCoreMember.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/module/ApiCommonModule.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/module/CommonModule.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/module/JavaUtilLoggingAdapter.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/module/PlatformModule.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/plugin/AnvilPluginInfo.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/plugin/AnvilPluginMessages.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonTextService.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonTimeFormatService.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonUserService.java delete mode 100644 anvil-common/src/main/java/org/anvilpowered/anvil/common/util/StringTextService.java delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/Change.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditBaseCommand.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCancelCommand.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCommandNode.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCommitCommand.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditKeyCommand.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditRootCommand.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditSelectCommand.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditStartCommand.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/RegEdit.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/Stage.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/module/FallbackModule.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/plugin/FallbackPluginInfo.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/registry/CommonConfigurationService.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/registry/CommonZoneIdSerializer.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/server/CommonBackendServer.kt delete mode 100644 anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/server/CommonLocationService.kt delete mode 100644 anvil-md5/build.gradle.kts delete mode 100644 anvil-md5/src/main/java/org/anvilpowered/anvil/md5/util/MD5TextService.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/AnvilSpigot.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilCommandNode.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilPluginsCommand.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilReloadCommand.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCallbackCommand.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCommandExecuteService.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCommandService.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/entity/SpigotEntityUtils.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/listener/SpigotPlayerListener.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/module/ApiSpigotModule.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/module/SpigotModule.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotKickService.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotPermissionService.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotTextService.java delete mode 100644 anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotUserService.java delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCancelCommand.kt delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCommandNode.kt delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCommitCommand.kt delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditKeyCommand.kt delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditRootCommand.kt delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditSelectCommand.kt delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditStartCommand.kt delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/module/SpigotFallbackModule.kt delete mode 100644 anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/server/SpigotLocationService.kt delete mode 100644 anvil-spigot/src/main/resources/plugin.yml delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/AnvilSponge.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilCommandNode.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilPluginsCommand.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilReloadCommand.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeCommandExecuteService.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeCommandService.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/entity/SpongeEntityUtils.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/listener/SpongePlayerListener.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/module/ApiSpongeModule.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/module/SpongeModule.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeKickService.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongePermissionService.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeTextService.java delete mode 100644 anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeUserService.java delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCancelCommand.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCommandNode.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCommitCommand.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditKeyCommand.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditRootCommand.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditSelectCommand.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditStartCommand.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/module/SpongeFallbackModule.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/registry/SpongeConfigurationService.kt delete mode 100644 anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/server/SpongeLocationService.kt delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/AnvilVelocity.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilCommandNode.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilPluginsCommand.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilReloadCommand.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCallbackCommand.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCommandExecuteService.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCommandService.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/listener/VelocityPlayerListener.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/module/ApiVelocityModule.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/module/VelocityModule.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityKickService.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityPermissionService.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityTextService.java delete mode 100644 anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityUserService.java delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCancelCommand.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCommandNode.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCommitCommand.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditKeyCommand.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditRootCommand.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditSelectCommand.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditStartCommand.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/module/VelocityFallbackModule.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityBackendServer.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityLocationService.kt delete mode 100644 anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityVersion.kt delete mode 100644 api/build.gradle.kts delete mode 100644 core/build.gradle.kts delete mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/ModuleExtensions.kt delete mode 100644 paper/build.gradle.kts delete mode 100644 sponge/build.gradle.kts delete mode 100644 velocity/build.gradle.kts diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/Anvil.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/Anvil.java deleted file mode 100644 index 90aabec6d..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/Anvil.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.common.base.Preconditions; -import com.google.inject.Binder; -import com.google.inject.Binding; -import com.google.inject.Injector; -import com.google.inject.Module; -import org.anvilpowered.anvil.api.coremember.CoreMemberManager; -import org.anvilpowered.anvil.api.coremember.CoreMemberRepository; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.base.plugin.BasePlugin; - -import java.util.HashMap; -import java.util.Map; - -@SuppressWarnings({"unused"}) -public class Anvil extends BasePlugin { - - static final Map> bindingsCache = new HashMap<>(); - protected static ServiceManager serviceManager; - protected static Environment environment; - private static final String NOT_LOADED = "Anvil has not been loaded yet!"; - - Anvil(String name, Injector rootInjector, Module module) { - super(name, rootInjector, module); - } - - public static BindingExtensions getBindingExtensions(Binder binder) { - return getServiceManager().provide(BindingExtensions.class, binder); - } - - public static Environment.Builder getEnvironmentBuilder() { - return getServiceManager().provide(Environment.Builder.class); - } - - public static EnvironmentManager getEnvironmentManager() { - return getServiceManager().provide(EnvironmentManager.class); - } - - public static Environment getEnvironment() { - return Preconditions.checkNotNull(environment, NOT_LOADED); - } - - public static Platform getPlatform() { - return getEnvironment().getInjector().getInstance(Platform.class); - } - - public static Registry getRegistry() { - return getEnvironment().getInjector().getInstance(Registry.class); - } - - public static CoreMemberManager getCoreMemberManager() { - return getEnvironment().getInjector().getInstance(CoreMemberManager.class); - } - - public static CoreMemberRepository getCoreMemberRepository() { - return getCoreMemberManager().getPrimaryComponent(); - } - - public static ServiceManager getServiceManager() { - if (serviceManager != null) { - return serviceManager; - } - try { - return serviceManager = (ServiceManager) - Class.forName("org.anvilpowered.anvil.api.ServiceManagerImpl").newInstance(); - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { - throw new IllegalStateException("Could not find ServiceManager implementation!", e); - } - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/Environment.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/Environment.java deleted file mode 100644 index 708503886..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/Environment.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.common.base.Preconditions; -import com.google.common.reflect.TypeToken; -import com.google.inject.Binding; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Module; -import com.google.inject.Provider; -import com.google.inject.TypeLiteral; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.api.misc.Named; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.api.util.TextService; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -@SuppressWarnings({"UnstableApiUsage", "unchecked"}) -public interface Environment extends Named, Comparable { - - static Binding getBinding(String name, Injector injector) { - long hash = ((long) name.hashCode()) * ((long) injector.hashCode()); - Binding[] binding = {Anvil.bindingsCache.get(hash)}; - if (binding[0] != null) { - return (Binding) binding[0]; - } - injector.getBindings().forEach((k, v) -> { - if (k.getTypeLiteral().getType().getTypeName().contains(name)) { - binding[0] = v; - } - }); - Binding result = Preconditions.checkNotNull( - (Binding) binding[0], - "Could not find binding for service: " + name + " in injector " + injector - ); - Anvil.bindingsCache.put(hash, result); - return result; - } - - static Key getKey(String name, Injector injector) { - return Environment.getBinding(name, injector).getKey(); - } - - static Provider getProvider(String name, Injector injector) { - return Environment.getBinding(name, injector).getProvider(); - } - - static T getInstance(String name, Injector injector) { - return Environment.getProvider(name, injector).get(); - } - - default Binding getBinding(String name) { - return getBinding(name, getInjector()); - } - - default Key getKey(String name) { - return getKey(name, getInjector()); - } - - default Provider getProvider(String name) { - return getProvider(name, getInjector()); - } - - default T getInstance(String name) { - return getInstance(name, getInjector()); - } - - void reload(); - - Injector getInjector(); - - Object getPlugin(); - - PluginInfo getPluginInfo(); - - TextService getTextService(); - - Registry getRegistry(); - - interface Builder { - - Builder addModules(Module... modules); - - Builder addModules(Iterable modules); - - Builder addEarlyServices(Key... keys); - - Builder addEarlyServices(Iterable> keys); - - Builder addEarlyServices(Class... classes); - - Builder addEarlyServices(TypeLiteral... typeLiterals); - - Builder addEarlyServices(TypeToken... typeTokens); - - Builder addEarlyServices(Key key, Consumer initializer); - - Builder addEarlyServices(Class clazz, Consumer initializer); - - Builder addEarlyServices(TypeLiteral typeLiteral, Consumer initializer); - - Builder addEarlyServices(TypeToken typeToken, Consumer initializer); - - /** - * Sets the name for this environment builder. - * - * @param name {@link String} Name to set. - * @return {@code this} - */ - Builder setName(String name); - - /** - * Sets the root injector for this environment builder. - * - * @param rootInjector {@link Injector} to set. Pass {@code null} to unset. - * @return {@code this} - */ - Builder setRootInjector(@Nullable Injector rootInjector); - - /** - * Sets the logger, currently only necessary on Nukkit. - * - *

- * The provided logger is adapted to the {@link org.slf4j.Logger}. - * If no logger is provided on Nukkit, Anvil's logger will be used. - * (This means logs will be prefixed with "Anvil" instead of your plugin name) - *

- * - *

-         *     setLoggerSupplier(MyNukkitPlugin.this::getLogger);
-         * 
- * - * @param logger to set. - */ - Builder setLoggerSupplier(Supplier logger); - - /** - * This will load your root {@link CommandNode} as - * defined by your guice module - * - * @return {@code this} - */ - Builder withRootCommand(); - - /** - * Called when the {@link Environment} is loaded. - * - *

- * This {@link Consumer} will be invoked when the {@link Environment} - * is first loaded and on subsequent reloads. - *

- * - *

- * This method can be called multiple times on one builder. - * Preexisting listeners will be used and will not be overridden. - *

- * - * @param listener {@link Consumer} to run when this environment is loaded - * @return {@code this} - */ - Builder whenLoaded(Consumer listener); - - /** - * Called when the {@link Environment} is loaded for the first time. - * - *

- * This {@link Consumer} will only be invoked when the {@link Environment} - * is loaded for the first time. - *

- * - *

- * This method can be called multiple times on one builder. - * Preexisting listeners will be used and will not be overridden. - *

- * - * @param listener {@link Consumer} to run when this environment is ready - * @return {@code this} - */ - Builder whenReady(Consumer listener); - - /** - * Called when the {@link Environment} is reloaded. - * - *

- * This {@link Consumer} will only be invoked when the {@link Environment} - * is reloaded, but not when it is first loaded. - *

- * - *

- * This method can be called multiple times on one builder. - * Preexisting listeners will be used and will not be overridden. - *

- * - * @param listener {@link Consumer} to run when this environment is reloaded - * @return {@code this} - */ - Builder whenReloaded(Consumer listener); - - /** - * Builds an {@link Environment} and registers it. - * - * @param plugin The owner for this environment - */ - void register(Object plugin); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/EnvironmentManager.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/EnvironmentManager.java deleted file mode 100644 index 0a5080c06..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/EnvironmentManager.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.regex.Pattern; -import java.util.stream.Stream; - -public interface EnvironmentManager { - - Environment getCoreEnvironment(); - - Environment getEnvironmentUnsafe(String name); - - Map getEnvironments(); - - Stream getEnvironmentsAsStream(Pattern pattern); - - List getEnvironments(Pattern pattern); - - Optional getEnvironment(Pattern pattern); - - Optional getEnvironment(String name); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/KUtils.kt b/anvil-api/src/main/java/org/anvilpowered/anvil/api/KUtils.kt deleted file mode 100644 index bf2327b69..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/KUtils.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api - -import java.util.Optional -import java.util.concurrent.CompletableFuture - -val whitespace = "\\s+".toRegex() - -fun String.splitContext(): Array = if (isEmpty()) arrayOf() else split(whitespace).toTypedArray() - -fun CompletableFuture>.asNullable(): CompletableFuture = thenApplyAsync { it.orElse(null) } diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/Platform.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/Platform.java deleted file mode 100644 index 410891f57..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/Platform.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import org.anvilpowered.anvil.api.misc.Named; - -public interface Platform extends Named { - - /** - * Returns a lowercase identifier for the current platform - * - *

- * Examples: "bungee", "spigot", "sponge", "velocity" - *

- * - * @return A lowercase identifier for the current platform - */ - @Override - String getName(); - - /** - * @return Whether the current platform is a proxy like bungee or velocity - */ - boolean isProxy(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/ServiceManager.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/ServiceManager.java deleted file mode 100644 index ff12981f8..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/ServiceManager.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.common.reflect.TypeToken; - -import java.util.function.Function; -import java.util.function.Supplier; - -@SuppressWarnings({"unused", "UnstableApiUsage"}) -public interface ServiceManager { - - Supplier provideSupplier(TypeToken typeToken); - - Supplier provideSupplier(Class clazz); - - Supplier provideSupplier(String name); - - Function provideFunction(TypeToken typeToken); - - Function provideFunction(Class clazz); - - Function provideFunction(String name); - - T provide(TypeToken typeToken); - - T provide(Class clazz); - - T provide(String name); - - R provide(TypeToken typeToken, T input); - - R provide(Class clazz, T input); - - R provide(String name, T input); - - void registerBinding(TypeToken typeToken, Supplier supplier); - - void registerBinding(Class clazz, Supplier supplier); - - void registerBinding(TypeToken typeToken, Function function); - - void registerBinding(Class clazz, Function function); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandExecuteService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandExecuteService.java deleted file mode 100644 index 9856f07fb..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandExecuteService.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.command; - -public interface CommandExecuteService { - - /** - * Executes the provided command as the console. - * - * @param command The command to execute - */ - void execute(String command); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandNode.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandNode.java deleted file mode 100644 index 3a709e9dc..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandNode.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.command; - -import org.anvilpowered.anvil.api.misc.Named; - -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Predicate; - -public interface CommandNode extends Named { - - Map, Function> getDescriptions(); - - Map, Predicate> getPermissions(); - - Map, Function> getUsages(); - - /** - * @return An array containing (in order) the names - * of parent nodes. Empty if this is the root node. - */ - default String[] getPath() { - return new String[0]; - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandService.java deleted file mode 100644 index 7dff48a30..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/command/CommandService.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.command; - -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; - -public interface CommandService { - - /** - * Generates a command that runs a child command if its alias - * matches the first argument of the generated command. - * - *

- * If {@code childCommandFallback} is false - * and the first argument does not match a child, a syntax error message will - * be shown to the source. Otherwise, the root command executor will run. - *

- * - * @param root The command to run if no child was specified. - * @param children A map of child commands and their aliases. - * @param childCommandFallback whether to fall back to the root command if the first - * argument did not match a child command alias - * @throws UnsupportedOperationException on Sponge. - * Use {@code CommandSpec} instead. - * @return A routing command - */ - TCommandExecutor generateRoutingCommand( - @Nullable TCommandExecutor root, - Map, TCommandExecutor> children, - boolean childCommandFallback - ); - - TCommandExecutor generateRootCommand( - String helpUsage, - Predicate extended - ); - - default TCommandExecutor generateRootCommand(String helpUsage) { - return generateRootCommand(helpUsage, e -> true); - } - - TCommandExecutor generateVersionCommand( - String helpUsage, - Predicate extended - ); - - default TCommandExecutor generateVersionCommand(String helpUsage) { - return generateVersionCommand(helpUsage, e -> true); - } - - /** - * Generates a help command for the provided {@link CommandNode}. - * @param node The command node to return the HelpCommand for - * @return A help command for the provided {@link CommandNode} - */ - TCommandExecutor generateHelpCommand(CommandNode node); - - /** - * @return A reload command - */ - TCommandExecutor generateReloadCommand(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/CoreMemberManager.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/CoreMemberManager.java deleted file mode 100644 index 16446ed83..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/CoreMemberManager.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.coremember; - -import org.anvilpowered.anvil.api.datastore.Manager; - -public interface CoreMemberManager extends Manager> { - - @Override - default String getDefaultIdentifierSingularUpper() { - return "Core member"; - } - - @Override - default String getDefaultIdentifierPluralUpper() { - return "Core members"; - } - - @Override - default String getDefaultIdentifierSingularLower() { - return "core member"; - } - - @Override - default String getDefaultIdentifierPluralLower() { - return "core members"; - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/CoreMemberRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/CoreMemberRepository.java deleted file mode 100644 index aceb64558..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/CoreMemberRepository.java +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.coremember; - -import org.anvilpowered.anvil.api.datastore.Repository; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; - -import java.time.Instant; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -public interface CoreMemberRepository< - TKey, - TDataStore> - extends Repository, TDataStore> { - - /** - * Ensures that a matching {@link CoreMember} exists in the database. - * - *

- * If the userName has changed since the last time this method was called, it will be updated in the database - *

- *

- * The boolean values in {@code flags} will be set according to the following rules: - *

- *

- * 0 : Whether a new member was created in the database - *

- *

- * 1 : Whether userName was updated in the database - *

- *

- * 2 : Whether ipAddress was updated in the database - *

- *

- * {@code flags} must be an array of length 8. - * There are currently 5 elements reserved for future use - *

- * - * @param userUUID {@link UUID} userUUID of user. - * @param userName {@link String} Name of user. - * @param ipAddress {@link String} IP Address of user. - * @param flags A boolean array of length 8. - * @return An {@link Optional} containing the inserted {@link CoreMember} if successful, otherwise {@link Optional#empty()} - * @throws IllegalArgumentException If {@code flags} is not of length 8 - */ - CompletableFuture>> getOneOrGenerateForUser(UUID userUUID, String userName, String ipAddress, boolean[] flags); - - /** - * Ensures that a matching {@link CoreMember} exists in the database. - * - *

- * If the userName has changed since the last time this method was called, it will be updated in the database - *

- * - * @param userUUID {@link UUID} userUUID of user - * @param userName {@link String} Name of user - * @param ipAddress {@link String} IP Address of user - * @return An {@link Optional} containing the inserted {@link CoreMember} if successful, otherwise {@link Optional#empty()} - */ - CompletableFuture>> getOneOrGenerateForUser(UUID userUUID, String userName, String ipAddress); - - /** - * @param userUUID {@link UUID} userUUID of user - * @return An {@link Optional} containing a matching {@link CoreMember} if successful, otherwise {@link Optional#empty()} - */ - CompletableFuture>> getOneForUser(UUID userUUID); - - /** - * @param userName {@link String} Name of user - * @return An {@link Optional} containing a matching {@link CoreMember} if successful, otherwise {@link Optional#empty()} - */ - CompletableFuture>> getOneForUser(String userName); - - /** - * @param ipAddress {@link String} IP Address of user - * @return A {@link List} of matching {@link CoreMember} if successful, otherwise {@link Optional#empty()} - */ - CompletableFuture>> getForIpAddress(String ipAddress); - - /** - * Updates the properties {@code banEndUtc}, {@code banReason} - * and sets {@code banned} to {@code true} for the document - * whose id matches the provided {@link TKey} - * - * @param id {@link TKey} id of document to update - * @param endUtc {@link Instant} end of the ban - * @param reason {@link String} reason for the ban - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture ban(TKey id, Instant endUtc, String reason); - - /** - * Updates the properties {@code banEndUtc}, {@code banReason} - * and sets {@code banned} to {@code true} for documents - * whose property {@code userUUID} matches the provided {@link UUID} - * - * @param userUUID {@link UUID} userUUID of documents to update - * @param endUtc {@link Instant} end of the ban - * @param reason {@link String} reason for the ban - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture banUser(UUID userUUID, Instant endUtc, String reason); - - /** - * Updates the properties {@code banEndUtc}, {@code banReason} - * and sets {@code banned} to {@code true} for documents - * whose property {@code userName} matches the provided {@link String} - * - * @param userName {@link String} userName of documents to update - * @param endUtc {@link Instant} end of the ban - * @param reason {@link String} reason for the ban - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture banUser(String userName, Instant endUtc, String reason); - - /** - * Updates the properties {@code banEndUtc}, {@code banReason} - * and sets {@code banned} to {@code true} for documents - * whose property {@code ipAddress} matches the provided {@link String} - * - * @param ipAddress {@link String} ipAddress of documents to update - * @param endUtc {@link Instant} end of the ban - * @param reason {@link String} reason for the ban - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture banIpAddress(String ipAddress, Instant endUtc, String reason); - - /** - * Sets the property {@code banned} to {@code false} for - * the document whose id matches the provided {@link TKey} - * - * @param id {@link TKey} id of document to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unBan(TKey id); - - /** - * Sets the property {@code banned} to {@code false} for - * documents whose property {@code userUUID} matches - * the provided {@link UUID} - * - * @param userUUID {@link UUID} userUUID of documents to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unBanUser(UUID userUUID); - - /** - * Sets the property {@code banned} to {@code false} for - * documents whose property {@code userName} matches - * the provided {@link String} - * - * @param userName {@link String} userName of documents to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unBanUser(String userName); - - /** - * Sets the property {@code banned} to {@code false} for - * documents whose property {@code ipAddress} matches - * the provided {@link String} - * - * @param ipAddress {@link String} ipAddress of documents to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unBanIpAddress(String ipAddress); - - /** - * Verifies whether the provided {@link CoreMember} is in fact - * banned. - * - *

- * A user is only banned if {@link CoreMember#isBanned()} is - * true and {@link CoreMember#getBanEndUtc()} is in the future. - *

- * - *

- * This method checks both {@link CoreMember#isBanned()} and - * {@link CoreMember#getBanEndUtc()} and sets the member's - * ban status accordingly. - *

- * - * @param coreMember {@link CoreMember} to verify ban for - * @return {@code true} if user is verified to be banned, otherwise {@code false} - */ - boolean checkBanned(CoreMember coreMember); - - /** - * Verifies whether the {@link CoreMember} matching the provided - * {@link TKey} is in fact banned. - * - *

- * A user is only banned if {@link CoreMember#isBanned()} is - * true and {@link CoreMember#getBanEndUtc()} is in the future. - *

- * - *

- * This method checks both {@link CoreMember#isBanned()} and - * {@link CoreMember#getBanEndUtc()} and sets the member's - * ban status accordingly. - *

- * - * @param id {@link TKey} id of member to verify ban for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * {@code true} if user is verified to be banned, otherwise {@code false} - */ - CompletableFuture checkBanned(TKey id); - - /** - * Verifies whether the {@link CoreMember} matching the provided - * {@link UUID} userUUID is in fact banned. - * - *

- * A user is only banned if {@link CoreMember#isBanned()} is - * true and {@link CoreMember#getBanEndUtc()} is in the future. - *

- * - *

- * This method checks both {@link CoreMember#isBanned()} and - * {@link CoreMember#getBanEndUtc()} and sets the member's - * ban status accordingly. - *

- * - * @param userUUID {@link UUID} userUUID of member to verify ban for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * {@code true} if user is verified to be banned, otherwise {@code false} - */ - CompletableFuture checkBannedForUser(UUID userUUID); - - /** - * Verifies whether the {@link CoreMember} matching the provided - * {@link String} userName is in fact banned. - * - *

- * A user is only banned if {@link CoreMember#isBanned()} is - * true and {@link CoreMember#getBanEndUtc()} is in the future. - *

- * - *

- * This method checks both {@link CoreMember#isBanned()} and - * {@link CoreMember#getBanEndUtc()} and sets the member's - * ban status accordingly. - *

- * - * @param userName {@link String} userUUID of member to verify ban for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * {@code true} if user is verified to be banned, otherwise {@code false} - */ - CompletableFuture checkBannedForUser(String userName); - - /** - * Updates the properties {@code muteEndUtc}, {@code muteReason} - * and sets {@code muted} to {@code true} for the document - * whose id matches the provided {@link TKey} - * - * @param id {@link TKey} id of document to update - * @param endUtc {@link Instant} end of the mute - * @param reason {@link String} reason for the mute - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture mute(TKey id, Instant endUtc, String reason); - - /** - * Updates the properties {@code muteEndUtc}, {@code muteReason} - * and sets {@code muted} to {@code true} for documents - * whose property {@code userUUID} matches the provided {@link UUID} - * - * @param userUUID {@link UUID} userUUID of documents to update - * @param endUtc {@link Instant} end of the mute - * @param reason {@link String} reason for the mute - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture muteUser(UUID userUUID, Instant endUtc, String reason); - - /** - * Updates the properties {@code muteEndUtc}, {@code muteReason} - * and sets {@code muted} to {@code true} for documents - * whose property {@code userName} matches the provided {@link String} - * - * @param userName {@link String} userName of documents to update - * @param endUtc {@link Instant} end of the mute - * @param reason {@link String} reason for the mute - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture muteUser(String userName, Instant endUtc, String reason); - - /** - * Updates the properties {@code muteEndUtc}, {@code muteReason} - * and sets {@code muted} to {@code true} for documents - * whose property {@code ipAddress} matches the provided {@link String} - * - * @param ipAddress {@link String} ipAddress of documents to update - * @param endUtc {@link Instant} end of the mute - * @param reason {@link String} reason for the mute - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture muteIpAddress(String ipAddress, Instant endUtc, String reason); - - /** - * Sets the property {@code muted} to {@code false} for - * the document whose id matches the provided {@link TKey} - * - * @param id {@link TKey} id of document to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unMute(TKey id); - - /** - * Sets the property {@code muted} to {@code false} for - * documents whose property {@code userUUID} matches - * the provided {@link UUID} - * - * @param userUUID {@link UUID} userUUID of documents to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unMuteUser(UUID userUUID); - - /** - * Sets the property {@code muted} to {@code false} for - * documents whose property {@code userName} matches - * the provided {@link String} - * - * @param userName {@link String} userName of documents to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unMuteUser(String userName); - - /** - * Sets the property {@code muted} to {@code false} for - * documents whose property {@code ipAddress} matches - * the provided {@link String} - * - * @param ipAddress {@link String} ipAddress of documents to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unMuteIpAddress(String ipAddress); - - /** - * Verifies whether the provided {@link CoreMember} is in fact - * muted. - * - *

- * A user is only muted if {@link CoreMember#isMuted()} is - * true and {@link CoreMember#getMuteEndUtc()} is in the future. - *

- * - *

- * This method checks both {@link CoreMember#isMuted()} and - * {@link CoreMember#getMuteEndUtc()} and sets the member's - * mute status accordingly. - *

- * - * @param coreMember {@link CoreMember} to verify mute for - * @return {@code true} if user is verified to be muted, otherwise {@code false} - */ - boolean checkMuted(CoreMember coreMember); - - /** - * Verifies whether the {@link CoreMember} matching the provided - * {@link TKey} is in fact muted. - * - *

- * A user is only muted if {@link CoreMember#isMuted()} is - * true and {@link CoreMember#getMuteEndUtc()} is in the future. - *

- * - *

- * This method checks both {@link CoreMember#isMuted()} and - * {@link CoreMember#getMuteEndUtc()} and sets the member's - * mute status accordingly. - *

- * - * @param id {@link TKey} id of member to verify mute for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * {@code true} if user is verified to be muted, otherwise {@code false} - */ - CompletableFuture checkMuted(TKey id); - - /** - * Verifies whether the {@link CoreMember} matching the provided - * {@link UUID} userUUID is in fact muted. - * - *

- * A user is only muted if {@link CoreMember#isMuted()} is - * true and {@link CoreMember#getMuteEndUtc()} is in the future. - *

- * - *

- * This method checks both {@link CoreMember#isMuted()} and - * {@link CoreMember#getMuteEndUtc()} and sets the member's - * mute status accordingly. - *

- * - * @param userUUID {@link UUID} userUUID of member to verify mute for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * {@code true} if user is verified to be muted, otherwise {@code false} - */ - CompletableFuture checkMutedForUser(UUID userUUID); - - /** - * Verifies whether the {@link CoreMember} matching the provided - * {@link String} userName is in fact muted. - * - *

- * A user is only muted if {@link CoreMember#isMuted()} is - * true and {@link CoreMember#getMuteEndUtc()} is in the future. - *

- * - *

- * This method checks both {@link CoreMember#isMuted()} and - * {@link CoreMember#getMuteEndUtc()} and sets the member's - * mute status accordingly. - *

- * - * @param userUUID {@link UUID} userUUID of member to verify mute for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * {@code true} if user is verified to be muted, otherwise {@code false} - */ - CompletableFuture checkMutedForUser(String userUUID); - - /** - * Updates the property {@code nickName} for the - * document whose id matches the provided {@link TKey} - * - * @param id {@link TKey} id of document to update - * @param nickName {@link String} new nickName - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture setNickName(TKey id, String nickName); - - /** - * Updates the property {@code nickName} for documents whose - * property {@code userUUID} matches the provided {@link UUID} - * - * @param userUUID {@link UUID} userUUID of documents to update - * @param nickName {@link String} new nickName - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture setNickNameForUser(UUID userUUID, String nickName); - - /** - * Updates the property {@code nickName} for documents whose - * property {@code userName} matches the provided {@link String} - * - * @param userName {@link String} userName of documents to update - * @param nickName {@link String} new nickName - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture setNickNameForUser(String userName, String nickName); - - /** - * Deletes the property {@code nickName} for the - * document whose id matches the provided {@link TKey} - * - * @param id {@link TKey} id of document to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture deleteNickName(TKey id); - - /** - * Deletes the property {@code nickName} for documents whose - * property {@code userUUID} matches the provided {@link UUID} - * - * @param userUUID {@link UUID} userName of documents to update - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture deleteNickNameForUser(UUID userUUID); - - /** - * Deletes the property {@code nickName} for documents whose - * property {@code userName} matches the provided {@link String} - * - * @param userName {@link String} userName of documents to update - * @return {@link CompletableFuture} wrapped {@link boolean} - * true if successful, otherwise false - */ - CompletableFuture deleteNickNameForUser(String userName); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/MongoCoreMemberRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/MongoCoreMemberRepository.java deleted file mode 100644 index 8c0a912cf..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/MongoCoreMemberRepository.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.coremember; - -import dev.morphia.Datastore; -import dev.morphia.query.Query; -import org.anvilpowered.anvil.api.datastore.MongoRepository; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; -import org.bson.types.ObjectId; - -import java.time.Instant; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -public interface MongoCoreMemberRepository - extends CoreMemberRepository, - MongoRepository> { - - /** - * Creates a {@link Query} matching documents whose - * property {@code userUUID} matches the provided {@link UUID} - * - * @param userUUID {@link UUID} to create {@link Query} for - * @return {@link Query} for the provided {@link UUID} - */ - Query> asQuery(UUID userUUID); - - /** - * Creates a {@link Query} matching documents whose - * property {@code userName} matches the provided {@link String} - * - * @param userName {@link String} to create {@link Query} for - * @return {@link Query} for the provided {@link String} - */ - Query> asQuery(String userName); - - /** - * Creates a {@link Query} matching documents whose - * property {@code ipAddress} matches the provided {@link String} - * - * @param ipAddress {@link String} to create {@link Query} for - * @return {@link Query} for the provided {@link String} - */ - Query> asQueryForIpAddress(String ipAddress); - - /** - * Updates the properties {@code banEndUtc}, {@code banReason} - * and sets {@code banned} to {@code true} for documents that - * match the provided {@link Query} - * - * @param query {@link Query} to update documents for - * @param endUtc {@link Instant} end of the ban - * @param reason {@link String} reason for the ban - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture ban(Query> query, Instant endUtc, String reason); - - /** - * Sets the property {@code banned} to {@code false} for - * documents that match the provided {@link Query} - * - * @param query {@link Query} to update documents for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unBan(Query> query); - - /** - * Updates the properties {@code muteEndUtc}, {@code muteReason} - * and sets {@code muted} to {@code true} for documents that - * match the provided {@link Query} - * - * @param query {@link Query} to update documents for - * @param endUtc {@link Instant} end of the mute - * @param reason {@link String} reason for the mute - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture mute(Query> query, Instant endUtc, String reason); - - /** - * Sets the property {@code muted} to {@code false} for - * documents that match the provided {@link Query} - * - * @param query {@link Query} to update documents for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unMute(Query> query); - - /** - * Updates the property {@code nickName} for - * documents that match the provided {@link Query} - * - * @param query {@link Query} to update documents for - * @param nickName {@link String} new nickName - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture setNickName(Query> query, String nickName); - - /** - * Deletes the property {@code nickName} for - * documents that match the provided {@link boolean} - * @param query {@link Query} to update documents for - * @return {@link CompletableFuture} wrapped {@link Boolean} - * true if successful, otherwise false - */ - CompletableFuture deleteNickName(Query> query); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/XodusCoreMemberRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/XodusCoreMemberRepository.java deleted file mode 100644 index e49bbf20c..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/coremember/XodusCoreMemberRepository.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.coremember; - -import jetbrains.exodus.entitystore.Entity; -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.PersistentEntityStore; -import jetbrains.exodus.entitystore.StoreTransaction; -import org.anvilpowered.anvil.api.datastore.XodusRepository; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; - -import java.time.Instant; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.function.Function; - -public interface XodusCoreMemberRepository - extends CoreMemberRepository, - XodusRepository> { - - /** - * Creates a {@link Function} that acts as a {@code query} - * matching documents whose property {@code userUUID} - * matches the provided {@link UUID} - * - * @param userUUID {@link UUID} to create {@code query} for - * @return {@code query} for the provided {@link UUID} - */ - Function> asQuery(UUID userUUID); - - /** - * Creates a {@link Function} that acts as a {@code query} - * matching documents whose property {@code userName} - * matches the provided {@link String} - * - * @param userName {@link String} to create {@code query} for - * @return {@code query} for the provided {@link UUID} - */ - Function> asQuery(String userName); - - /** - * Creates a {@link Function} that acts as a {@code query} - * matching documents whose property {@code ipAddress} - * matches the provided {@link String} - * - * @param ipAddress {@link String} to create {@code query} for - * @return {@code query} for the provided {@link UUID} - */ - Function> asQueryForIpAddress(String ipAddress); - - /** - * Updates the properties {@code banEndUtc}, {@code banReason} - * and sets {@code banned} to {@code true} for documents that - * match the provided {@code query} - * - * @param query {@code query} to update documents for - * @param endUtc {@link Instant} end of the ban - * @param reason {@link String} reason for the ban - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture ban(Function> query, Instant endUtc, String reason); - - /** - * Sets the property {@code banned} to {@code false} for - * documents that match the provided {@code query} - * - * @param query {@code query} to update documents for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unBan(Function> query); - - /** - * Updates the properties {@code muteEndUtc}, {@code muteReason} - * and sets {@code muted} to {@code true} for documents that - * match the provided {@code query} - * - * @param query {@code query} to update documents for - * @param endUtc {@link Instant} end of the mute - * @param reason {@link String} reason for the mute - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture mute(Function> query, Instant endUtc, String reason); - - /** - * Sets the property {@code muted} to {@code false} for - * documents that match the provided {@code query} - * - * @param query {@code query} to update documents for - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture unMute(Function> query); - - /** - * Updates the property {@code nickName} for - * documents that match the provided {@code query} - * - * @param query {@code query} to update documents for - * @param nickName {@link String} new nickName - * @return {@link CompletableFuture} wrapped {@link Boolean}. - * true if successful, otherwise false - */ - CompletableFuture setNickName(Function> query, String nickName); - - CompletableFuture deleteNickName(Function> query); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/CacheService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/CacheService.java deleted file mode 100644 index 9d6b5147c..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/CacheService.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import org.anvilpowered.anvil.api.model.ObjectWithId; - -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.function.Predicate; - -@Deprecated // will probably break in 0.4 -public interface CacheService< - TKey, - T extends ObjectWithId, - TDataStore> - extends Repository { - - /** - * Starts cache invalidation task - * - * @param intervalSeconds How often the cache invalidation task should run - */ - void startCacheInvalidationTask(Integer intervalSeconds); - - /** - * Stop cache invalidation task - */ - void stopCacheInvalidationTask(); - - /** - * @return Cache invalidation task - */ - Runnable getCacheInvalidationTask(); - - /** - * @return A set containing all parties in the cache - */ - Set getAllAsSet(); - - /** - * Deletes a {@link T} from the cache - * - * @param predicate of {@link T} to remove from cache - * @return An optional containing the {@link T} if it was successfully removed - */ - Optional deleteOne(Predicate predicate); - - /** - * Deletes a {@link T} from the cache - * - * @param t {@link T} to remove from cache - * @return An optional containing the {@link T} if it was successfully removed - */ - Optional delete(T t); - - /** - * Deletes a {@link T} from the cache - * - * @param predicate of {@link T} to remove from cache - * @return A list of successfully deleted elements - */ - List delete(Predicate predicate); - - List getAll(Predicate predicate); - - Optional getOne(Predicate predicate); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/CachedRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/CachedRepository.java deleted file mode 100644 index 87c3f428c..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/CachedRepository.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import org.anvilpowered.anvil.api.model.ObjectWithId; - -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; - -@Deprecated // will probably break in 0.4 -public interface CachedRepository< - TKey, - T extends ObjectWithId, - C extends CacheService, - TDataStore> - extends Repository { - - default Optional getRepositoryCacheService() { - return Optional.empty(); - } - - /** - *

- * Usually used when (updated) data from DB needs to be applied to cache - *

- *

- * {@code toCache} will run if and only if: - *

- *
    - *
  • - Cache is present
  • - *
- * - * @param The type returned from the cache and database - * @param fromDB {@link Supplier} retrieving data from DB - * @param toCache {@link BiConsumer} applying DB data to cache - * @return Result from DB after it has (optionally) been applied to cache - */ - CompletableFuture applyFromDBToCache(Supplier fromDB, BiConsumer toCache); - - /** - *

- * Usually used when (updated) data from DB needs to be applied to cache - *

- *

- * {@code toCache} will run if and only if: - *

- *
    - *
  • - Cache is present
  • - *
  • - {@link Optional} result from {@code fromDB} is present
  • - *
- * - * @param The type returned from the cache and database - * @param fromDB {@link Supplier} retrieving data from DB - * @param toCache {@link BiConsumer} applying DB data to cache. - * @return Result from DB after it has (optionally) been applied to cache - */ - CompletableFuture> applyFromDBToCacheConditionally(Supplier> fromDB, BiConsumer toCache); - - /** - *

- * Usually used for editing model data - *

- *

- * {@code cacheTransformer} will run if and only if: - *

- *
    - *
  • - Cache is present
  • - *
- * - * @param The type returned from the cache and database - * @param fromDB {@link Supplier} retrieving data from DB - * @param cacheTransformer {@link BiFunction} applying DB data to cache - * @return Result from cache - */ - CompletableFuture applyFromDBThroughCache(Supplier fromDB, BiFunction cacheTransformer); - - /** - *

- * Usually used for editing model data - *

- *

- * {@code cacheTransformer} will run if and only if: - *

- *
    - *
  • - Cache is present
  • - *
  • - {@link Optional} result from {@code fromDB} is present
  • - *
- * - * @param The type returned from the cache and database - * @param fromDB {@link Supplier} retrieving data from DB - * @param cacheTransformer {@link BiFunction} applying DB data to cache. Will only be run if {@link Optional} is present - * @return Result from cache if result and cache are present, otherwise from DB - */ - CompletableFuture> applyFromDBThroughCacheConditionally(Supplier> fromDB, BiFunction> cacheTransformer); - - /** - *

- * Usually used for editing model data - *

- *

- * {@code cacheTransformer} will run if and only if: - *

- *
    - *
  • - Cache is present
  • - *
- * - * @param The type returned by the cache and database - * @param cacheTransformer {@link Function} applying transformation to data in cache and returning new data - * @param dbTransformer {@link Function} retrieving data from db. - * {@link Optional} is the result of the cache function (will be empty if the cache or the result is not present) - * @return Result from DB - */ - CompletableFuture applyThroughBoth(Function cacheTransformer, Function, K> dbTransformer); - - /** - *

- * Usually used for retrieving or editing model data - *

- *

- * {@code cacheTransformer} will run if and only if: - *

- *
    - *
  • - Cache is present
  • - *
- *

- * {@code dbTransformer} will run if and only if: - *

- *
    - *
  • - {@link Optional} result from {@code cacheTransformer} is present
  • - *
- * - * @param The type returned by the cache and database - * @param cacheTransformer {@link Function} applying transformation to data in cache and returning new data - * @param dbTransformer {@link Function} applying transformation to data in db - * @return {@link K} result from cache - */ - CompletableFuture> applyThroughBothConditionally(Function> cacheTransformer, Function dbTransformer); - - /** - *

- * Usually used for retrieving or editing model data - *

- *

- * {@code cacheTransformer} will run if and only if: - *

- *
    - *
  • - Cache is present
  • - *
- * {@code dbTransformer} will run if and only if: - *
    - *
  • - {@link Optional} result from {@code cacheTransformer} is not present
  • - *
- * - * @param The type returned by the cache and database - * @param cacheTransformer {@link Function} applying transformation to data in cache and returning new data - * @param dbSupplier {@link Supplier} retrieving data from db. Will only be run if {@link Optional} is not present - * @return {@link K} result from cache if present, otherwise from db - */ - CompletableFuture> applyToBothConditionally(Function> cacheTransformer, Supplier> dbSupplier); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Component.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Component.java deleted file mode 100644 index c3d1ffdd2..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Component.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import org.anvilpowered.anvil.api.misc.BindingExtensions; - -import java.util.Optional; - -/** - * Part of a module - * - * @see Manager - * @see Repository - * @see CacheService - * @see BindingExtensions - */ -public interface Component< - TKey, - TDataStore> { - - Class getTKeyClass(); - - DataStoreContext getDataStoreContext(); - - /** - * Tries to convert the given object to {@link TKey} - * - * @param object To try to parse - * @return The {@link TKey} representing this {@code object} - * @throws UnsupportedOperationException If not implemented - * @throws IllegalArgumentException if object was unsuccessfully parsed - */ - default TKey parseUnsafe(Object object) { - throw new UnsupportedOperationException(); - } - - /** - * Tries to convert the given object to {@link TKey} - * - * @param object To try to parse - * @return {@link Optional} containing (if parsing successful) the {@link TKey} representing this {@code object} - */ - default Optional parse(Object object) { - return Optional.empty(); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/DataStoreContext.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/DataStoreContext.java deleted file mode 100644 index 9c3deb33f..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/DataStoreContext.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import com.google.common.base.Preconditions; -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.registry.Registry; -import org.jetbrains.annotations.Nullable; -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; -import org.reflections.scanners.TypeAnnotationsScanner; - -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; - -// TODO: extract to interface -public abstract class DataStoreContext { - - private static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; - private final List> connectionOpenedListeners; - private final List> connectionClosedListeners; - protected final Registry registry; - - @Nullable - private TDataStore dataStore; - private Class[] entityClasses; - private Class tKeyClass; - - @Inject(optional = true) - private ClassLoader classLoader; - - protected DataStoreContext(Registry registry) { - connectionOpenedListeners = new ArrayList<>(); - connectionClosedListeners = new ArrayList<>(); - - this.registry = registry; - registry.whenLoaded(this::registryLoaded).register(); - } - - protected void registryLoaded() { - requestCloseConnection(); - dataStore = null; - } - - protected abstract TDataStore loadDataStore(); - - public TDataStore getDataStore() { - if (dataStore == null) { - dataStore = loadDataStore(); - notifyConnectionOpenedListeners(dataStore); - } - return Preconditions.checkNotNull(dataStore, "An error occurred while loading datastore"); - } - - @SafeVarargs - protected final Class[] calculateEntityClasses( - final String baseScanPackage, final Class... entityAnnotations) { - if (entityAnnotations.length == 0) return EMPTY_CLASS_ARRAY; - Reflections reflections = new Reflections( - baseScanPackage, new TypeAnnotationsScanner(), new SubTypesScanner(), classLoader); - Set> types = reflections.getTypesAnnotatedWith(entityAnnotations[0]); - for (int i = 1; i < entityAnnotations.length; i++) { - types.addAll(reflections.getTypesAnnotatedWith(entityAnnotations[i])); - } - return entityClasses = types.toArray(EMPTY_CLASS_ARRAY); - } - - public final Class[] getEntityClasses() { - return entityClasses; - } - - /** - * @param name The name that the entity class contains - * @return First entityClass that contains {@code name} - */ - public final Optional> getEntityClass(final String name) { - Class clazz = null; - try { - clazz = getEntityClassUnsafe(name); - } catch (RuntimeException ignored) { - } - return Optional.ofNullable(clazz); - } - - /** - * @param name The name that the entity class contains - * @return First entityClass that contains (ignored case) the provided name - */ - public final Class getEntityClassUnsafe(final String name) { - getDataStore(); // ensure that entityClasses is not null - final String n = name.toLowerCase(Locale.ENGLISH); - for (Class entityClass : entityClasses) { - if (entityClass.getSimpleName().toLowerCase(Locale.ENGLISH).contains(n)) { - return entityClass; - } - } - throw new IllegalStateException("Could not find EntityClass for " + name); - } - - protected final void setTKeyClass(Class tKeyClass) { - this.tKeyClass = tKeyClass; - } - - public final Class getTKeyClass() { - return tKeyClass; - } - - protected abstract void closeConnection(TDataStore dataStore); - - protected final void requestCloseConnection() { - if (dataStore != null) { - notifyConnectionClosedListeners(dataStore); - closeConnection(dataStore); - dataStore = null; - } - } - - private void notifyConnectionOpenedListeners(TDataStore dataStore) { - connectionOpenedListeners.forEach(listener -> listener.accept(dataStore)); - } - - public final void addConnectionOpenedListener(Consumer connectionOpenedListener) { - connectionOpenedListeners.add(connectionOpenedListener); - } - - public final void removeConnectionOpenedListener(Consumer connectionOpenedListener) { - connectionOpenedListeners.remove(connectionOpenedListener); - } - - private void notifyConnectionClosedListeners(TDataStore dataStore) { - connectionClosedListeners.forEach(listener -> listener.accept(dataStore)); - } - - public final void addConnectionClosedListener(Consumer connectionClosedListener) { - connectionClosedListeners.add(connectionClosedListener); - } - - public final void removeConnectionClosedListener(Consumer connectionClosedListener) { - connectionClosedListeners.remove(connectionClosedListener); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Manager.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Manager.java deleted file mode 100644 index a051da41f..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Manager.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import com.google.inject.name.Named; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.api.util.TextService; - -/** - *

- * A module consists of a {@link Manager} and a (single) {@link Component} - * for every data storage implementation. - *

- *

- * The {@link Manager} of a module is its metaphorical gateway. Interactions with - * other modules should (almost always) be done through the {@link Manager}. - * There are, however, some cases where direct access to a component is required. - * One such case is inter-{@link Repository} access that requires compile time - * type safety. Because the {@link Component#getTKeyClass()} type is not known - * to the manager, code that interacts with {@code TKey} must be placed in a - * {@link Component}. - *

- *

- * One of the primary functions of a {@link Manager} is to provide the correct - * {@link Component} implementation via {@link #getPrimaryComponent()}. - *

- *

- * Implementations of {@link Manager} should consist of methods similar to the - * following: - *

- *
    - *
  • {@code CompletableFuture create(UUID userUUID);}
  • - *
  • {@code CompletableFuture invite(UUID userUUID, UUID targetUserUUID);}
  • - *
  • {@code CompletableFuture kick(UUID userUUID, UUID targetUserUUID);}
  • - *
  • {@code CompletableFuture> list(String query);}
  • - *
- *

- * {@code TString} is the base return type for the methods in a {@link Manager}. - * To build these results use {@link TextService.Builder}. - *

- *

- * All methods (with some exceptions) in {@link Manager} should return a form of {@code TString} - * to be displayed directly to the end user. Normally, the return type, {@code TString}, is wrapped in - * a {@link java.util.concurrent.CompletableFuture} in order to keep the main game thread - * free from IO. It is sometimes necessary to further wrap the {@code TString} in a {@link java.util.List} - * when the result is more than a single line. In this case, pagination can be used to display the result - * to the end user. - *

- *

- * The following interface signature is an example of a simple {@link Manager}: - *

- *
{@code
- * public interface FooManager<
- * TFoo extends Foo,
- * TString>
- * extends Manager>
- * }
- * - * @param Base {@link Component} type for this manager. - * Must be implemented by all components in this module - * @see Repository - * @see Component - * @see TextService - */ -public interface Manager> { - - /** - *

- * Represents the default singular identifier for this module - *

- *

- * Should be overridden by other plugins who change the name of the object. - * Examples: "Clan", "Faction", "Guild", "Member", ... etc - *

- *

- * Used in text sent to the player - *

- * - * @return The default singular identifier for this module - */ - String getDefaultIdentifierSingularUpper(); - - /** - *

- * Represents the default plural identifier for this module - *

- *

- * Should be overridden by other plugins who change the name of party. - * Examples: "Clans", "Factions", "Guilds", "Members" ... etc - *

- *

- * Used in text sent to the player - *

- * - * @return The default plural identifier for this module - */ - String getDefaultIdentifierPluralUpper(); - - /** - *

- * Represents the default singular identifier for this module - *

- *

- * Should be overridden by other plugins who change the name of party. - * Examples: "clan", "faction", "guild", "member" ... etc - *

- *

- * Used in text sent to the player - *

- * - * @return The default singular identifier for this module - */ - String getDefaultIdentifierSingularLower(); - - /** - *

- * Represents the default plural identifier for this module - *

- *

- * Should be overridden by other plugins who change the name of party. - * Examples: "clans", "factions", "guilds", "members" ... etc - *

- *

- * Used in text sent to the player - *

- * - * @return The default plural identifier for this module - */ - String getDefaultIdentifierPluralLower(); - - /** - * Provides the current {@link Component} as defined by - * {@link Keys#DATA_STORE_NAME} in the current {@link Registry}. - * - *

- * The current {@link Component} implementation is defined as the - * implementation provided by Guice that meets the following criteria: - *

- *
- *

- * The value for {@link Keys#DATA_STORE_NAME} found by - * the the current {@link Registry} must match (ignored case) a registered - * datastore implementation. This can be one of the following predefined values: - *

- *
    - *
  • {@code "mongodb"}
  • - *
  • {@code "xodus"}
  • - *
- *

- * or a custom value defined by your guice module. - *

- *
- *

- * For example, 'mongodb' (or any capitalization thereof) will match - * a {@link Component} annotated with {@link Named}{@code (value = "mongodb"} - *

- *

- * Use {@link BindingExtensions} to bind your component implementations - *

- * - * @return The current {@link Component} implementation - * @throws IllegalStateException If the config has not been loaded yet, - * or if no implementation was found - * @see Component - * @see BindingExtensions - */ - C getPrimaryComponent(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/MongoContext.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/MongoContext.java deleted file mode 100644 index d0ca5ec3b..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/MongoContext.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import com.mongodb.MongoClient; -import com.mongodb.MongoClientURI; -import dev.morphia.Datastore; -import dev.morphia.Morphia; -import dev.morphia.annotations.Embedded; -import dev.morphia.annotations.Entity; -import dev.morphia.mapping.MapperOptions; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.bson.types.ObjectId; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; - -@Singleton -public final class MongoContext extends DataStoreContext { - - @Inject - public MongoContext(Registry registry) { - super(registry); - } - - @Override - protected void closeConnection(Datastore dataStore) { - dataStore.getMongo().close(); - } - - @Override - protected Datastore loadDataStore() { - - /* === Get values from config === */ - String connectionString = registry.getExtraSafe(Keys.MONGODB_CONNECTION_STRING); - String hostname = registry.getExtraSafe(Keys.MONGODB_HOSTNAME); - int port = registry.getExtraSafe(Keys.MONGODB_PORT); - String dbName = registry.getExtraSafe(Keys.MONGODB_DBNAME); - String username = registry.getExtraSafe(Keys.MONGODB_USERNAME); - String password = registry.getExtraSafe(Keys.MONGODB_PASSWORD); - String authDb = registry.getExtraSafe(Keys.MONGODB_AUTH_DB); - boolean useAuth = registry.getExtraSafe(Keys.MONGODB_USE_AUTH); - boolean useSrv = registry.getExtraSafe(Keys.MONGODB_USE_SRV); - boolean useConnectionString = registry.getExtraSafe(Keys.MONGODB_USE_CONNECTION_STRING); - - /* === Determine credentials for MongoDB === */ - String clientUrl; - String protocol = useSrv ? "mongodb+srv://" : "mongodb://"; - String pt = useSrv ? "" : ":" + port; - if (useConnectionString) { - clientUrl = connectionString; - } else if (useAuth) { - String encodedPassword = password; - try { - encodedPassword = URLEncoder.encode(password, "UTF-8"); - } catch (UnsupportedEncodingException ignored) { - } - clientUrl = protocol + username + ":" + encodedPassword + "@" + hostname + pt + "/" + dbName + "?authSource=" + authDb; - } else { - clientUrl = protocol + hostname + pt + "/" + dbName; - } - - /* === Establish MongoDB connection === */ - MongoClientURI uri = new MongoClientURI(clientUrl); - MongoClient mongoClient = new MongoClient(uri); - Morphia morphia = new Morphia(); - Datastore dataStore = morphia.createDatastore(mongoClient, dbName); - dataStore.ensureIndexes(); - - /* === Save mapped objects and register with morphia === */ - morphia.map(calculateEntityClasses(registry.getOrDefault(Keys.BASE_SCAN_PACKAGE), Entity.class, Embedded.class)); - - /* === Set class loader to prevent morphia from breaking === */ - morphia.getMapper().setOptions(MapperOptions.legacy() - .classLoader(getClass().getClassLoader()) - .build()); - - setTKeyClass(ObjectId.class); - return dataStore; - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/MongoRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/MongoRepository.java deleted file mode 100644 index 0a9467d3f..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/MongoRepository.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import dev.morphia.Datastore; -import dev.morphia.query.Query; -import dev.morphia.query.UpdateOperations; -import org.anvilpowered.anvil.api.model.ObjectWithId; -import org.bson.types.ObjectId; - -import java.time.Instant; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -public interface MongoRepository< - T extends ObjectWithId> - extends Repository { - - CompletableFuture> getOne(Query query); - - CompletableFuture> getAll(Query query); - - CompletableFuture delete(Query query); - - UpdateOperations createUpdateOperations(); - - UpdateOperations inc(String field, Number value); - - UpdateOperations inc(String field); - - UpdateOperations set(String field, Object value); - - UpdateOperations unSet(String field); - - CompletableFuture update(Query query, UpdateOperations updateOperations); - - CompletableFuture update(Optional> optionalQuery, - UpdateOperations updateOperations); - - Query asQuery(); - - Query asQuery(ObjectId id); - - Query asQuery(Instant createdUtc); - - Optional> asQueryForIdOrTime(String idOrTime); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Repository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Repository.java deleted file mode 100644 index b09840e13..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/Repository.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import org.anvilpowered.anvil.api.model.ObjectWithId; -import org.anvilpowered.anvil.api.util.TimeFormatService; - -import java.time.Instant; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -public interface Repository< - TKey, - T extends ObjectWithId, - TDataStore> - extends Component { - - /** - * @return An empty {@link T} - */ - T generateEmpty(); - - Class getTClass(); - - /** - * @param id A id of the document - * @return The time of creation of this document as an {@link Instant} - */ - default CompletableFuture> getCreatedUtc(TKey id) { - return getOne(id).thenApplyAsync(o -> o.map(ObjectWithId::getCreatedUtc)); - } - - /** - * @param item A {@link T document} to insert - * @return An {@link Optional} containing the inserted {@link T document} if successful, otherwise {@link Optional#empty()} - */ - CompletableFuture> insertOne(T item); - - /** - * @param list A {@link List} of {@link T documents} to insert - * @return A {@link List} of all {@link T documents} that were successfully inserted - */ - CompletableFuture> insert(List list); - - /** - * @return A {@link List} of all {@link TKey ids} in the repository - */ - CompletableFuture> getAllIds(); - - /** - * @return A {@link List} of all {@link T documents} in the repository - */ - CompletableFuture> getAll(); - - /** - * Attempts to find a matching {@link T document} with the provided {@link TKey id} - * - * @param id An {@link TKey id} to query the repository with - * @return An {@link Optional} containing a matching {@link T document} if successful, otherwise {@link Optional#empty()} - */ - CompletableFuture> getOne(TKey id); - - /** - * Attempts to find the first {@link T document} where {@link Instant#getEpochSecond()} retrieved from - * {@link ObjectWithId#getCreatedUtc()} is equal to {@link Instant#getEpochSecond()} of the provided {@link Instant} - * - * @param createdUtc An {@link Instant} to query the repository with - * @return An {@link Optional} containing if successful, otherwise {@link Optional#empty()} - */ - CompletableFuture> getOne(Instant createdUtc); - - /** - * Attempts to find a matching {@link T document} by parsing provided id or time. - * - *

- * Attempts to parse the provided {@link Object} as an id. If parsing is successful, returns the - * result of {@link #getOne(Object)}. - *

- * - *

- * If parsing as an id is unsuccessful, attempts to parse the provided {@link Object} as createdUtc. - * If parsing is successful, returns the result of {@link #getOne(Instant)} - *

- * - *

- * Note: if parsing as id is successful but no document is found, will not attempt to parse as time - *

- * - * @param idOrTime An id or time to parse. Can be an instance of {@link TKey} or a {@link String} representation. May - * also be wrapped in an {@link Optional} - * @return An {@link Optional} containing a matching {@link T document} if successful, otherwise {@link Optional#empty()} - * @see Component#parseUnsafe(Object) - * @see Component#parse(Object) - * @see TimeFormatService#parseInstantUnsafe(String) - * @see TimeFormatService#parseInstant(String) - */ - CompletableFuture> parseAndGetOne(Object idOrTime); - - /** - * Attempts to delete a matching {@link T document} with the provided {@link TKey id} - * - * @param id An {@link TKey id} to query the repository with - * @return Whether or not an item was found and deleted - */ - CompletableFuture deleteOne(TKey id); - - /** - * Attempts to delete the first {@link T document} where {@link Instant#getEpochSecond()} retrieved from - * {@link ObjectWithId#getCreatedUtc()} is equal to {@link Instant#getEpochSecond()} of the provided {@link Instant} - * - * @param createdUtc An {@link Instant} to query the repository with - * @return Whether a {@link T document} was found and deleted - */ - CompletableFuture deleteOne(Instant createdUtc); - - /** - * Attempts to delete a matching {@link T document} by parsing provided id or time. - * - *

- * Attempts to parse the provided {@link Object} as an id. If parsing is successful, returns the - * result of {@link #deleteOne(Object)}. - *

- * - *

- * If parsing as an id is unsuccessful, attempts to parse the provided {@link Object} as createdUtc. - * If parsing is successful, returns the result of {@link #deleteOne(Instant)} - *

- * - *

- * Note: if id parsing is successful but no document is found, will not attempt to parse as time - *

- * - * @param idOrTime {@link Object} to parse. Can be an instance of {@link TKey} or a {@link String} representation. May - * also be wrapped in an {@link Optional} - * @return Whether a {@link T document} was found and deleted - * @see Component#parseUnsafe(Object) - * @see Component#parse(Object) - * @see TimeFormatService#parseInstantUnsafe(String) - * @see TimeFormatService#parseInstant(String) - */ - CompletableFuture parseAndDeleteOne(Object idOrTime); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusContext.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusContext.java deleted file mode 100644 index 73103ed58..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusContext.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import jetbrains.exodus.entitystore.Entity; -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.PersistentEntityStore; -import jetbrains.exodus.entitystore.PersistentEntityStores; -import org.anvilpowered.anvil.api.model.Mappable; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; - -import java.io.File; -import java.nio.file.Paths; - -@Singleton -public final class XodusContext extends DataStoreContext { - - @Inject - public XodusContext(Registry registry) { - super(registry); - } - - @Override - protected void closeConnection(PersistentEntityStore dataStore) { - dataStore.close(); - } - - @Override - protected PersistentEntityStore loadDataStore() { - - /* === Initialize storage location === */ - File dbFilesLocation = Paths.get(registry.getOrDefault(Keys.DATA_DIRECTORY) + "/data/xodus").toFile(); - if (!dbFilesLocation.exists()) { - if (!dbFilesLocation.mkdirs()) { - throw new IllegalStateException("Unable to create xodus directory"); - } - } - - /* === Find objects to map === */ - Class[] entityClasses = calculateEntityClasses(registry.getOrDefault(Keys.BASE_SCAN_PACKAGE), XodusEntity.class, XodusEmbedded.class); - - /* === Create collections if not present === */ - for (Class entityClass : entityClasses) { - if (Mappable.class.isAssignableFrom(entityClass)) { - try { - entityClass.getDeclaredMethod("writeTo", Entity.class); - entityClass.getDeclaredMethod("readFrom", Entity.class); - } catch (NoSuchMethodException e) { - throw new IllegalStateException("Xodus entity class " + entityClass.getName() + " must implement Mappable#writeTo(T) and Mappable#readFrom(T)", e); - } - } else if (entityClass.isAnnotationPresent(XodusEntity.class)){ - throw new IllegalStateException("Xodus entity class " + entityClass.getName() + " must extend org.anvilpowered.anvil.model.data.dbo.Mappable"); - } - } - - setTKeyClass(EntityId.class); - return PersistentEntityStores.newInstance(dbFilesLocation.getPath()); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusEmbedded.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusEmbedded.java deleted file mode 100644 index ef3412f3e..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusEmbedded.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface XodusEmbedded { -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusEntity.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusEntity.java deleted file mode 100644 index 0ac601ac6..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface XodusEntity { -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusRepository.java deleted file mode 100644 index 95f9b6d64..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/datastore/XodusRepository.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.datastore; - -import jetbrains.exodus.entitystore.Entity; -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.PersistentEntityStore; -import jetbrains.exodus.entitystore.StoreTransaction; -import org.anvilpowered.anvil.api.model.ObjectWithId; - -import java.time.Instant; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Function; - -public interface XodusRepository< - T extends ObjectWithId> - extends Repository { - - Iterator iterator( - Function> query); - - CompletableFuture> getAll( - Function> query); - - CompletableFuture> getOne( - Function> query); - - CompletableFuture delete( - Function> query); - - CompletableFuture update( - Function> query, - Consumer update); - - CompletableFuture update( - Optional>> optionalQuery, - Consumer update); - - Function> asQuery( - EntityId id); - - Function> asQuery( - Instant createdUtc); - - Optional>> asQueryForIdOrTime( - String idOrTime); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/entity/RestrictionCriteria.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/entity/RestrictionCriteria.java deleted file mode 100644 index b5381b84e..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/entity/RestrictionCriteria.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.entity; - -import com.google.common.base.MoreObjects; - -public final class RestrictionCriteria { - - private static final RestrictionCriteria ALL = new RestrictionCriteria( - true, - true, - true, - true, - true - ); - - private static final RestrictionCriteria NONE = new RestrictionCriteria( - false, - false, - false, - false, - false - ); - - private static final RestrictionCriteria MOVEMENT_ONLY = new RestrictionCriteria( - true, - false, - false, - false, - false - ); - - private static final RestrictionCriteria INTERACTION_ONLY = new RestrictionCriteria( - false, - true, - false, - false, - false - ); - - private static final RestrictionCriteria INVENTORY_ONLY = new RestrictionCriteria( - false, - false, - true, - false, - false - ); - - private static final RestrictionCriteria COMMANDS_ONLY = new RestrictionCriteria( - false, - false, - false, - true, - false - ); - - private static final RestrictionCriteria DAMAGE_ONLY = new RestrictionCriteria( - false, - false, - false, - false, - true - ); - - public static RestrictionCriteria all() { - return ALL; - } - - public static RestrictionCriteria none() { - return NONE; - } - - public static RestrictionCriteria movementOnly() { - return MOVEMENT_ONLY; - } - - public static RestrictionCriteria interactionOnly() { - return INTERACTION_ONLY; - } - - public static RestrictionCriteria inventoryOnly() { - return INVENTORY_ONLY; - } - - public static RestrictionCriteria commandsOnly() { - return COMMANDS_ONLY; - } - - public static RestrictionCriteria damageOnly() { - return DAMAGE_ONLY; - } - - public final static class Builder { - private boolean movement = false; - private boolean interaction = false; - private boolean inventory = false; - private boolean commands = false; - private boolean damage = false; - - private Builder() { - } - - public Builder movement(boolean movement) { - this.movement = movement; - return this; - } - - public Builder interaction(boolean interaction) { - this.interaction = interaction; - return this; - } - - public Builder inventory(boolean inventory) { - this.inventory = inventory; - return this; - } - - public Builder commands(boolean commands) { - this.commands = commands; - return this; - } - - public Builder damage(boolean damage) { - this.damage = damage; - return this; - } - - public RestrictionCriteria build() { - return new RestrictionCriteria( - movement, - interaction, - inventory, - commands, - damage - ); - } - } - - public static Builder builder() { - return new Builder(); - } - - /** - * Prevents entity movement. This includes all movement keys (WASD + space) in addition to external influences. - */ - private final boolean movement; - - /** - * Prevents all interactions that occurs as the result of a right-click. - */ - private final boolean interaction; - - /** - * Prevents all inventory transactions. - */ - private final boolean inventory; - - /** - * Prevents all commands. - */ - private final boolean commands; - - /** - * Prevents damage dealt and taken. - */ - private final boolean damage; - - public RestrictionCriteria( - boolean movement, - boolean interaction, - boolean inventory, - boolean commands, - boolean damage - ) { - this.movement = movement; - this.interaction = interaction; - this.inventory = inventory; - this.commands = commands; - this.damage = damage; - } - - public RestrictionCriteria union(RestrictionCriteria criteria) { - final boolean movement = this.movement || criteria.movement; - final boolean interaction = this.interaction || criteria.interaction; - final boolean inventory = this.inventory || criteria.inventory; - final boolean commands = this.commands || criteria.commands; - final boolean damage = this.damage || criteria.damage; - return new RestrictionCriteria( - movement, - interaction, - inventory, - commands, - damage - ); - } - - public RestrictionCriteria intersect(RestrictionCriteria criteria) { - final boolean movement = this.movement && criteria.movement; - final boolean interaction = this.interaction && criteria.interaction; - final boolean inventory = this.inventory && criteria.inventory; - final boolean commands = this.commands && criteria.commands; - final boolean damage = this.damage && criteria.damage; - return new RestrictionCriteria( - movement, - interaction, - inventory, - commands, - damage - ); - } - - public boolean hasAll() { - return movement - && interaction - && inventory - && commands - && damage - ; - } - - public boolean hasAny() { - return movement - || interaction - || inventory - || commands - || damage - ; - } - - public boolean movement() { - return movement; - } - - public boolean interaction() { - return interaction; - } - - public boolean inventory() { - return inventory; - } - - public boolean commands() { - return commands; - } - - public boolean damage() { - return damage; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof RestrictionCriteria)) { - return false; - } - final RestrictionCriteria other = (RestrictionCriteria) obj; - return movement == other.movement - && interaction == other.interaction - && inventory == other.inventory - && commands == other.commands - && damage == other.damage - ; - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this) - .add("movement", movement) - .add("interaction", interaction) - .add("inventory", inventory) - .add("commands", commands) - .add("damage", damage) - .toString(); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/entity/RestrictionService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/entity/RestrictionService.java deleted file mode 100644 index 428bafc55..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/entity/RestrictionService.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.entity; - -import java.util.Optional; -import java.util.UUID; - -public interface RestrictionService { - - /** - *

- * Restricts the provided entity as specified by the provided {@link RestrictionCriteria}, overwriting any - * previous restrictions. - *

- *
- *

- * If the provided entity is identifiable by {@link UUID}, the provided {@link RestrictionCriteria} - * will be registered with said {@link UUID} rather than the provided entity instance. - *

- * - * @param entity The entity to restrict - * @param criteria The {@link RestrictionCriteria} to restrict with - */ - void put(Object entity, RestrictionCriteria criteria); - - /** - *

- * Restricts entities identified by the provided {@link UUID} as specified by the provided - * {@link RestrictionCriteria}, overwriting any previous restrictions. - *

- * - * @param uuid The uuid of the entity to restrict - * @param criteria The {@link RestrictionCriteria} to restrict with - */ - void put(UUID uuid, RestrictionCriteria criteria); - - /** - *

- * Stops all restrictions for the provided entity. - *

- *
- *

- * If the provided entity is identifiable by {@link UUID}, removes all restrictions for entities identified by - * said {@link UUID}. - *

- * - * @param entity The entity to stop restrictions for - * @return An {@link Optional} containing the removed {@link RestrictionCriteria} if it existed, - * otherwise {@link Optional#empty()} - */ - Optional remove(Object entity); - - /** - *

- * Stops all restrictions for entities identified by the provided {@link UUID}. - *

- * - * @param uuid The uuid of the entity to stop restricting - * @return An {@link Optional} containing the removed {@link RestrictionCriteria} if it existed, - * otherwise {@link Optional#empty()} - */ - Optional remove(UUID uuid); - - /** - *

- * Checks whether the provided entity is restricted. - *

- * - * @param entity The entity to check - * @return The {@link RestrictionCriteria} associated with the provided entity, otherwise - * {@link RestrictionCriteria#none()} - */ - RestrictionCriteria get(Object entity); - - /** - *

- * Checks whether the entity identified by the provided {@link UUID} is restricted. - *

- * - * @param uuid The {@link UUID} of the entity to check - * @return The {@link RestrictionCriteria} associated with the provided {@link UUID}, otherwise - * {@link RestrictionCriteria#none()} - */ - RestrictionCriteria get(UUID uuid); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/misc/BindingExtensions.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/misc/BindingExtensions.java deleted file mode 100644 index 7e6dbeede..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/misc/BindingExtensions.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.misc; - -import com.google.common.reflect.TypeToken; -import com.google.inject.Key; -import com.google.inject.Provider; -import com.google.inject.TypeLiteral; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.datastore.Component; -import org.anvilpowered.anvil.api.datastore.DataStoreContext; - -import java.lang.annotation.Annotation; - -@SuppressWarnings({"unchecked", "UnstableApiUsage"}) -public interface BindingExtensions { - - /** - * Full binding method for a component - *

- * A typical example of usage of this method: - *

- *
{@code
-     * be.bind(
-     *     new TypeToken>(getClass()) {
-     *     },
-     *     new TypeToken>(getClass()) {
-     *     },
-     *     new TypeToken, Datastore>>(getClass()) {
-     *     },
-     *     new TypeToken>(getClass()) { // final implementation
-     *     },
-     *     Names.named("mongodb")
-     * );
-     * }
- */ - , - From2 extends Component, - From3 extends From1, - Target extends From1> - void bind( - TypeToken from1, - TypeToken from2, - TypeToken from3, - TypeToken target, - Annotation componentAnnotation - ); - - /** - * Binding method for a component - *

- * A typical example of usage of this method: - *

- *
{@code
-     * be.bind(
-     *     new TypeToken>(getClass()) {
-     *     },
-     *     new TypeToken>(getClass()) {
-     *     },
-     *     new TypeToken(getClass()) { // final implementation
-     *     },
-     *     Names.named("mongodb")
-     * );
-     * }
- */ - , - From2 extends From1, - Target extends From1> - void bind( - TypeToken from1, - TypeToken from2, - TypeToken target, - Annotation componentAnnotation - ); - - void bind( - TypeToken from, - TypeToken target, - Annotation annotation - ); - - void bind( - TypeToken from, - TypeToken target, - Class annotation - ); - - void bind( - TypeToken from, - TypeToken target - ); - - /** - * Binds the mongodb {@link DataStoreContext} - *

- * Using this method is the same as invoking: - *

- *
{@code
-     * bind(new TypeLiteral>() {
-     * }).to(MongoContext.class);
-     * }
- */ - void withMongoDB(); - - /** - * Binds the xodus {@link DataStoreContext} - *

- * Using this method is the same as invoking: - *

- *
{@code
-     * binder.bind(new TypeLiteral>() {
-     * }).to(XodusContext.class);
-     * }
- */ - void withXodus(); - - - static TypeLiteral getTypeLiteral(TypeToken typeToken) { - return (TypeLiteral) TypeLiteral.get(typeToken.getType()); - } - - static Key getKey(TypeToken typeToken) { - return Key.get(getTypeLiteral(typeToken)); - } - - static Provider asInternalProvider(Class clazz) { - return () -> Anvil.getEnvironment().getInjector() - .getInstance(clazz); - } - - static Provider asInternalProvider(TypeLiteral typeLiteral) { - return () -> Anvil.getEnvironment().getInjector() - .getInstance(Key.get(typeLiteral)); - } - - static Provider asInternalProvider(TypeToken typeToken) { - return () -> Anvil.getEnvironment().getInjector() - .getInstance(BindingExtensions.getKey(typeToken)); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/misc/Named.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/misc/Named.java deleted file mode 100644 index fcfc975e4..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/misc/Named.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.misc; - -public interface Named { - - String getName(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/Mappable.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/Mappable.java deleted file mode 100644 index 2363a567d..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/Mappable.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.model; - -import com.google.common.collect.ImmutableList; -import jetbrains.exodus.util.ByteArraySizedInputStream; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInput; -import java.io.ObjectInputStream; -import java.io.ObjectOutput; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Optional; -import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -public interface Mappable { - - /** - * Writes all data from this object to the provided {@code object}. - *

- * Fields that are {@code null} in this object but not {@code null} - * in the target object should not be overwritten. - *

- * - * @param object Object to write data to - * @return object with data written to. Same instance as provided object - */ - T writeTo(T object); - - /** - * Reads all data from the provided {@code object} to this object - *

- * Fields that are {@code null} in the provided object but not {@code null} - * this object should not be overwritten. - *

- * - * @param object Object to read data from - */ - void readFrom(T object); - - static byte[] serializeUnsafe(Object object) throws IOException { - try ( - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutput oos = new ObjectOutputStream(baos) - ) { - oos.writeObject(object); - return baos.toByteArray(); - } - } - - static Optional serialize(Object object) { - try { - return Optional.of(serializeUnsafe(object)); - } catch (IOException ignored) { - return Optional.empty(); - } - } - - @SuppressWarnings("unchecked") - static T deserializeUnsafe(InputStream inputStream) throws IOException, ClassNotFoundException { - try ( - ObjectInput objectInputStream = new ObjectInputStream(inputStream) - ) { - return (T) objectInputStream.readObject(); - } - } - - static Optional deserialize(InputStream inputStream) { - try { - return Optional.of(deserializeUnsafe(inputStream)); - } catch (IOException | ClassNotFoundException | ClassCastException ignored) { - return Optional.empty(); - } - } - - static boolean addToCollection(InputStream inputStream, Consumer callback, Collection elements) { - Collection collection; - try { - collection = deserializeUnsafe(inputStream); - } catch (IOException | ClassNotFoundException ignored) { - return false; - } - try { - collection.addAll(elements); - } catch (UnsupportedOperationException ignored) { - Collection temp = new ArrayList<>(collection.size() + elements.size()); - temp.addAll(collection); - temp.addAll(elements); - collection = temp; - } - byte[] data; - try { - data = serializeUnsafe(collection); - } catch (IOException ignored) { - return false; - } - callback.accept(new ByteArraySizedInputStream(data)); - return true; - } - - @SafeVarargs - static boolean addToCollection(InputStream inputStream, Consumer callback, T... elements) { - return addToCollection(inputStream, callback, ImmutableList.copyOf(elements)); - } - - static boolean removeFromCollection(InputStream inputStream, Consumer callback, - Predicate filter) { - Collection collection; - try { - collection = deserializeUnsafe(inputStream); - } catch (IOException | ClassNotFoundException ignored) { - return false; - } - try { - collection.removeIf(filter); - } catch (UnsupportedOperationException ignored) { - collection = collection.stream().filter(filter.negate()).collect(Collectors.toList()); - } - byte[] data; - try { - data = serializeUnsafe(collection); - } catch (IOException ignored) { - return false; - } - callback.accept(new ByteArraySizedInputStream(data)); - return true; - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/ObjectWithId.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/ObjectWithId.java deleted file mode 100644 index b818a0252..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/ObjectWithId.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.model; - -import java.time.Instant; - -public interface ObjectWithId { - - TKey getId(); - void setId(TKey id); - - String getIdAsString(); - - Instant getCreatedUtc(); - Instant getUpdatedUtc(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/coremember/CoreMember.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/coremember/CoreMember.java deleted file mode 100644 index 2218d2141..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/model/coremember/CoreMember.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.model.coremember; - -import org.anvilpowered.anvil.api.model.ObjectWithId; - -import java.time.Instant; -import java.util.UUID; - -public interface CoreMember extends ObjectWithId { - - UUID getUserUUID(); - void setUserUUID(UUID userUUID); - - String getUserName(); - void setUserName(String userName); - - String getIpAddress(); - void setIpAddress(String ipAddress); - - Instant getLastJoinedUtc(); - void setLastJoinedUtc(Instant joinedUtc); - - String getNickName(); - void setNickName(String nickName); - - boolean isBanned(); - void setBanned(boolean banned); - - boolean isMuted(); - void setMuted(boolean muted); - - Instant getBanEndUtc(); - void setBanEndUtc(Instant banEndUtc); - - Instant getMuteEndUtc(); - void setMuteEndUtc(Instant muteEndUtc); - - String getBanReason(); - void setBanReason(String banReason); - - String getMuteReason(); - void setMuteReason(String muteReason); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/BasicPluginInfo.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/BasicPluginInfo.java deleted file mode 100644 index e2cff1d80..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/BasicPluginInfo.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.plugin; - -import org.anvilpowered.anvil.api.misc.Named; - -public interface BasicPluginInfo extends Named { - - String getId(); - - String getVersion(); - - String getDescription(); - - String getUrl(); - - String[] getAuthors(); - - String getOrganizationName(); - - String getBuildDate(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/PluginInfo.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/PluginInfo.java deleted file mode 100644 index 7b38af15d..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/PluginInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.plugin; - -public interface PluginInfo extends BasicPluginInfo { - - TString getPrefix(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/PluginMessages.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/PluginMessages.java deleted file mode 100644 index 695bec40e..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/plugin/PluginMessages.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.plugin; - -import java.time.Instant; - -public interface PluginMessages { - - TString getBanMessage(String reason, Instant endUtc); - - TString getMuteMessage(String reason, Instant endUtc); - - TString getNoPermission(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/ConfigurationService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/ConfigurationService.java deleted file mode 100644 index 5ff0c4436..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/ConfigurationService.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -public interface ConfigurationService extends Registry { - - /** - * Updates the config with values from the registry. Will only update the file if changes were made - * - * @return {@code true} if there were updated values to save and they were saved successfully - * otherwise {@code false} - */ - boolean save(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Key.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Key.java deleted file mode 100644 index 707513390..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Key.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -import com.google.common.reflect.TypeToken; -import org.anvilpowered.anvil.api.misc.Named; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.function.Function; - -@SuppressWarnings({"UnstableApiUsage", "unchecked"}) -public abstract class Key implements Named, Comparable> { - - private final TypeToken type; - private final String name; - private final T fallbackValue; - private final boolean userImmutable; - private final boolean sensitive; - @Nullable - private final String description; - @Nullable - private final Function parser; - @Nullable - private final Function toStringer; - - Key( - TypeToken type, - String name, - @Nullable T fallbackValue, - boolean userImmutable, - boolean sensitive, - @Nullable String description, - @Nullable Function parser, - @Nullable Function toStringer - ) { - this.type = type; - this.name = name; - this.fallbackValue = fallbackValue; - this.userImmutable = userImmutable; - this.sensitive = sensitive; - this.description = description; - if (parser == null) { - this.parser = extractParser(fallbackValue); - } else { - this.parser = parser; - } - this.toStringer = toStringer; - } - - public interface Builder { - - /** - * Sets the name of the generated {@link Key} - * - * @param name The name to set - * @return {@code this} - */ - Builder name(String name); - - /** - * Sets the fallback value of the generated {@link Key} - * - * @param fallbackValue The fallback value to set - * @return {@code this} - */ - Builder fallback(@Nullable T fallbackValue); - - /** - * Indicates that the generated {@link Key} cannot be changed by the user. - * - * @return {@code this} - */ - Builder userImmutable(); - - /** - * Indicates that the generated {@link Key} is sensitive (e.g. connection details) that should not - * be accessible through regedit by default. Values of sensitive keys can only be viewed or modified - * through registries that have {@link Keys#REGEDIT_ALLOW_SENSITIVE} enabled. - * - * @return {@code this} - */ - Builder sensitive(); - - /** - * Sets the description of the generated {@link Key}. - * - * @param description The description to set or {@code null} to remove it - * @return {@code this} - */ - Builder description(@Nullable String description); - - /** - * Sets the parser of the generated {@link Key}. - * - * @param parser The parser to set or {@code null} to remove it - * @return {@code this} - */ - Builder parser(@Nullable Function parser); - - /** - * Sets the toStringer of the generated {@link Key}. - * - * @param toStringer The toStringer to set or {@code null} to remove it - * @return {@code this} - */ - Builder toStringer(@Nullable Function toStringer); - - /** - * Generates a {@link Key} based on this builder. - * - * @return The generated {@link Key} - */ - Key build(); - } - - public static Builder builder(TypeToken type) { - return new KeyBuilder<>(type); - } - - @Nullable - private Function extractParser(@Nullable T value) { - if (value instanceof String) { - return s -> (T) s; - } else if (value instanceof Boolean) { - return s -> (T) Boolean.valueOf(s); - } else if (value instanceof Double) { - return s -> (T) Double.valueOf(s); - } else if (value instanceof Float) { - return s -> (T) Float.valueOf(s); - } else if (value instanceof Long) { - return s -> (T) Long.valueOf(s); - } else if (value instanceof Integer) { - return s -> (T) Integer.valueOf(s); - } else if (value instanceof Short) { - return s -> (T) Short.valueOf(s); - } else if (value instanceof Byte) { - return s -> (T) Byte.valueOf(s); - } - return null; - } - - @Nullable - public T parse(String value) { - if (parser == null) { - return null; - } - return parser.apply(value); - } - - public String toString(@Nullable T value) { - if (toStringer == null) { - return String.valueOf(value); - } - return String.valueOf(toStringer.apply(value)); - } - - @Override - public int compareTo(Key o) { - return name.compareToIgnoreCase(o.name); - } - - @Override - public boolean equals(Object o) { - return o instanceof Key && name.equalsIgnoreCase(((Key) o).name); - } - - @Override - public int hashCode() { - return name.hashCode(); - } - - @Override - public String toString() { - return name; - } - - public TypeToken getType() { - return type; - } - - @Override - public String getName() { - return name; - } - - public T getFallbackValue() { - return fallbackValue; - } - - public boolean isUserImmutable() { - return userImmutable; - } - - public boolean isSensitive() { - return sensitive; - } - - public boolean isSensitive(Registry registry) { - return isSensitive() && !registry.get(Keys.REGEDIT_ALLOW_SENSITIVE).orElse(false); - } - - @Nullable - public String getDescription() { - return description; - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/KeyBuilder.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/KeyBuilder.java deleted file mode 100644 index 99b419fef..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/KeyBuilder.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -import com.google.common.base.Preconditions; -import com.google.common.reflect.TypeToken; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.function.Function; - -@SuppressWarnings("UnstableApiUsage") -class KeyBuilder implements Key.Builder { - - private final TypeToken type; - @MonotonicNonNull - private String name; - @Nullable - private T fallbackValue; - private boolean userImmutable; - private boolean sensitive; - @Nullable - private String description; - @Nullable - private Function parser; - @Nullable - private Function toStringer; - - KeyBuilder(TypeToken type) { - this.type = Preconditions.checkNotNull(type, "type"); - this.sensitive = false; - } - - @Override - public Key.Builder name(String name) { - this.name = Preconditions.checkNotNull(name, "name"); - return this; - } - - @Override - public Key.Builder fallback(@Nullable T fallbackValue) { - this.fallbackValue = fallbackValue; - return this; - } - - @Override - public KeyBuilder userImmutable() { - userImmutable = true; - return this; - } - - @Override - public KeyBuilder sensitive() { - sensitive = true; - return this; - } - - @Override - public KeyBuilder description(@Nullable String description) { - this.description = description; - return this; - } - - @Override - public KeyBuilder parser(@Nullable Function parser) { - this.parser = parser; - return this; - } - - @Override - public KeyBuilder toStringer(@Nullable Function toStringer) { - this.toStringer = toStringer; - return this; - } - - @Override - public Key build() { - Preconditions.checkNotNull(name, "name"); - return new Key(type, name, fallbackValue, userImmutable, sensitive, description, parser, toStringer) { - }; - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Keys.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Keys.java deleted file mode 100644 index 80c57053c..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Keys.java +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -import com.google.common.base.Preconditions; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Table; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.time.ZoneId; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Optional; - -public final class Keys { - - private static final String GLOBAL_NAMESPACE - = "global"; - - private static final Table> keys - = HashBasedTable.create(); - - private static final Map>> localAndGlobalCache - = new HashMap<>(); - - private Keys() { - throw new AssertionError("**boss music** No instance for you!"); - } - - /** - *

- * Used to start the registration of keys in a namespace. - *

- *
- *

- * Example usage: - *

- *

-     * static {
-     *     Keys.startRegistration("ontime")
-     *         .register(RANKS)
-     *         .register(CHECK_PERMISSION)
-     *         .register(CHECK_EXTENDED_PERMISSION)
-     *         .register(EDIT_PERMISSION)
-     *         .register(IMPORT_PERMISSION);
-     * }
-     * 
- * - * @param nameSpace The namespace to register the keys in. Usually the name of the plugin. - * @return A {@link KeyRegistrationEnd} instance for registering keys - */ - public static KeyRegistrationEnd startRegistration(String nameSpace) { - return new KeyRegistrationEnd(nameSpace); - } - - public final static class KeyRegistrationEnd { - - private final String nameSpace; - - KeyRegistrationEnd(String nameSpace) { - this.nameSpace = nameSpace; - } - - private void checkName(String nameSpace, String name) { - if (keys.contains(nameSpace, name)) { - throw new IllegalArgumentException("The provided key " + name + " conflicts with a" - + " key of the same name in the " + nameSpace + " namespace."); - } - } - - /** - * Registers the provided key. - * - * @param key The {@link Key} to register - * @return {@code this} - */ - public KeyRegistrationEnd register(Key key) { - final String name = key.getName(); - checkName(nameSpace, name); - keys.put(nameSpace, key.getName(), key); - return this; - } - } - - @SuppressWarnings("unchecked") - public static Key resolveUnsafe(String name, String nameSpace) { - return (Key) Preconditions.checkNotNull(keys.get(nameSpace, name)); - } - - @SuppressWarnings("unchecked") - public static Optional> resolve(String name, String nameSpace) { - return Optional.ofNullable((Key) keys.get(nameSpace, name)); - } - - @SuppressWarnings("unchecked") - public static Key resolveUnsafe(String name) { - return (Key) resolve(name).orElseThrow(() -> - new IllegalArgumentException("Could not resolve key " + name)); - } - - @SuppressWarnings("unchecked") - public static Optional> resolve(String name) { - @Nullable - Key candidate = (Key) keys.get(GLOBAL_NAMESPACE, name); - if (candidate != null) { - return Optional.of(candidate); - } - Iterator> it = keys.column(name).values().iterator(); - if (it.hasNext()) { - return Optional.of((Key) it.next()); - } else { - return Optional.empty(); - } - } - - @SuppressWarnings("unchecked") - public static Optional> resolveLocalAndGlobal(String name, String nameSpace) { - @Nullable - Key candidate = (Key) keys.get(nameSpace, name); - if (candidate != null) { - return Optional.of(candidate); - } - return Optional.ofNullable((Key) keys.get(GLOBAL_NAMESPACE, name)); - } - - public static Map> getAll(String nameSpace) { - Map> result = localAndGlobalCache.get(nameSpace); - if (result != null) { - return result; - } - result = ImmutableMap.>builder() - .putAll(keys.row(nameSpace)) - .putAll(keys.row(GLOBAL_NAMESPACE)) - .build(); - localAndGlobalCache.put(nameSpace, result); - return result; - } - - public static final Key SERVER_NAME = - Key.builder(TypeTokens.STRING) - .name("SERVER_NAME") - .fallback("server") - .build(); - public static final Key TIME_ZONE = - Key.builder(TypeTokens.ZONE_ID) - .name("TIME_ZONE") - .fallback(ZoneId.systemDefault()) - .parser(ZoneIdSerializer::parse) - .toStringer(ZoneIdSerializer::toString) - .build(); - public static final Key PROXY_MODE = - Key.builder(TypeTokens.BOOLEAN) - .name("PROXY_MODE") - .fallback(false) - .build(); - public static final Key REGEDIT_ALLOW_SENSITIVE = - Key.builder(TypeTokens.BOOLEAN) - .name("REGEDIT_ALLOW_SENSITIVE") - .fallback(false) - .userImmutable() - .build(); - public static final Key BASE_SCAN_PACKAGE = - Key.builder(TypeTokens.STRING) - .name("BASE_SCAN_PACKAGE") - .fallback("org.anvilpowered.anvil.common.model") - .userImmutable() - .build(); - public static final Key CACHE_INVALIDATION_INTERVAL_SECONDS = - Key.builder(TypeTokens.INTEGER) - .name("CACHE_INVALIDATION_INTERVAL_SECONDS") - .fallback(30) - .build(); - public static final Key CACHE_INVALIDATION_TIMOUT_SECONDS = - Key.builder(TypeTokens.INTEGER) - .name("CACHE_INVALIDATION_TIMOUT_SECONDS") - .fallback(300) - .build(); - public static final Key USE_SHARED_ENVIRONMENT = - Key.builder(TypeTokens.BOOLEAN) - .name("USE_SHARED_ENVIRONMENT") - .fallback(false) - .sensitive() - .build(); - public static final Key USE_SHARED_CREDENTIALS = - Key.builder(TypeTokens.BOOLEAN) - .name("USE_SHARED_CREDENTIALS") - .fallback(false) - .sensitive() - .build(); - public static final Key DATA_DIRECTORY = - Key.builder(TypeTokens.STRING) - .name("DATA_DIRECTORY") - .fallback("anvil") - .sensitive() - .build(); - public static final Key DATA_STORE_NAME = - Key.builder(TypeTokens.STRING) - .name("DATA_STORE_NAME") - .fallback("xodus") - .sensitive() - .build(); - public static final Key MONGODB_CONNECTION_STRING = - Key.builder(TypeTokens.STRING) - .name("MONGODB_CONNECTION_STRING") - .fallback("mongodb://admin:password@localhost:27017/anvil?authSource=admin") - .sensitive() - .build(); - public static final Key MONGODB_HOSTNAME = - Key.builder(TypeTokens.STRING) - .name("MONGODB_HOSTNAME") - .fallback("localhost") - .sensitive() - .build(); - public static final Key MONGODB_PORT = - Key.builder(TypeTokens.INTEGER) - .name("MONGODB_PORT") - .fallback(27017) - .sensitive() - .build(); - public static final Key MONGODB_DBNAME = - Key.builder(TypeTokens.STRING) - .name("MONGODB_DBNAME") - .fallback("anvil") - .sensitive() - .build(); - public static final Key MONGODB_USERNAME = - Key.builder(TypeTokens.STRING) - .name("MONGODB_USERNAME") - .fallback("admin") - .sensitive() - .build(); - public static final Key MONGODB_PASSWORD = - Key.builder(TypeTokens.STRING) - .name("MONGODB_PASSWORD") - .fallback("password") - .sensitive() - .build(); - public static final Key MONGODB_AUTH_DB = - Key.builder(TypeTokens.STRING) - .name("MONGODB_AUTH_DB") - .fallback("admin") - .sensitive() - .build(); - public static final Key MONGODB_USE_AUTH = - Key.builder(TypeTokens.BOOLEAN) - .name("MONGODB_USE_AUTH") - .fallback(false) - .sensitive() - .build(); - public static final Key MONGODB_USE_SRV = - Key.builder(TypeTokens.BOOLEAN) - .name("MONGODB_USE_SRV") - .fallback(false) - .sensitive() - .build(); - public static final Key MONGODB_USE_CONNECTION_STRING = - Key.builder(TypeTokens.BOOLEAN) - .name("MONGODB_USE_CONNECTION_STRING") - .fallback(false) - .sensitive() - .build(); - - public static final Key PLUGINS_PERMISSION = - Key.builder(TypeTokens.STRING) - .name("PLUGINS_PERMISSION") - .fallback("anvil.admin.plugins") - .build(); - public static final Key REGEDIT_PERMISSION = - Key.builder(TypeTokens.STRING) - .name("REGEDIT_PERMISSION") - .fallback("anvil.admin.regedit") - .build(); - public static final Key RELOAD_PERMISSION = - Key.builder(TypeTokens.STRING) - .name("RELOAD_PERMISSION") - .fallback("anvil.admin.reload") - .build(); - - static { - startRegistration(GLOBAL_NAMESPACE) - .register(SERVER_NAME) - .register(TIME_ZONE) - .register(PROXY_MODE) - .register(REGEDIT_ALLOW_SENSITIVE) - .register(BASE_SCAN_PACKAGE) - .register(CACHE_INVALIDATION_INTERVAL_SECONDS) - .register(CACHE_INVALIDATION_TIMOUT_SECONDS) - .register(USE_SHARED_ENVIRONMENT) - .register(USE_SHARED_CREDENTIALS) - .register(DATA_DIRECTORY) - .register(DATA_STORE_NAME) - .register(MONGODB_HOSTNAME) - .register(MONGODB_PORT) - .register(MONGODB_DBNAME) - .register(MONGODB_USERNAME) - .register(MONGODB_PASSWORD) - .register(MONGODB_AUTH_DB) - .register(MONGODB_USE_AUTH) - .register(MONGODB_USE_SRV); - - startRegistration("anvil") - .register(PLUGINS_PERMISSION) - .register(REGEDIT_PERMISSION) - .register(RELOAD_PERMISSION) - ; - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Registry.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Registry.java deleted file mode 100644 index 94ad567bd..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/Registry.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -import org.anvilpowered.anvil.api.Environment; - -import java.util.Collection; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.function.BiFunction; -import java.util.function.Function; - -public interface Registry { - - /** - * Gets this registry's value for the provided {@link Key} - * and throws an exception if it is not present. - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to get the value for - * @return This registry's value for the provided {@link Key} - * @throws NoSuchElementException If this registry has no value defined - * for the provided {@link Key} - */ - @RegistryScoped - T getUnsafe(Key key); - - /** - * Gets this registry's value for the provided {@link Key} - * or {@link Optional#empty()} if it is not present. - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to get the value for - * @return This registry's value for the provided {@link Key} or {@link Optional#empty()} - */ - @RegistryScoped - Optional get(Key key); - - /** - * Gets this registry's default value for the provided {@link Key} - * or the fallback value if it is not present. - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to get the default value for - * @return This registry's default value for the provided {@link Key} or the fallback value - */ - @RegistryScoped - default T getDefault(Key key) { - return key.getFallbackValue(); - } - - /** - * Gets this registry's value for the provided {@link Key} - * or the default value if it is not present. - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to get the value or (if not present) the default value for - * @return This registry's value for the provided {@link Key} or the default value - */ - @RegistryScoped - default T getOrDefault(Key key) { - return get(key).orElse(getDefault(key)); - } - - /** - * Similar to {@link #getOrDefault(Key)}, but performs additional (implementation specific) - * checks that could potentially check other registries if certain requirements are met. - * Use {@link #getOrDefault(Key)} unless you are sure you need this. - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to get the value for - * @return The value for the provided {@link Key} as defined by the additional checks - */ - @RegistryScoped - default T getExtraSafe(Key key) { - return getOrDefault(key); - } - - /** - * Sets this registry's value for the provided {@link Key} - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to set the value for - * @param value The value to set - */ - @RegistryScoped - void set(Key key, T value); - - /** - * Removes this registry's value for the provided {@link Key} - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to set the value for - */ - @RegistryScoped - void remove(Key key); - - /** - * Applies the provided transformation to this registry's - * value for the provided {@link Key} - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to transform the value for - * @param transformer The transformation to apply - */ - @RegistryScoped - void transform(Key key, BiFunction, ? super T, ? extends T> transformer); - - /** - * Applies the provided transformation to this registry's - * value for the provided {@link Key} - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} to transform the value for - * @param transformer The transformation to apply - */ - @RegistryScoped - void transform(Key key, Function transformer); - - /** - * Adds the provided value to this registry's - * {@link Collection} value for the provided {@link Key} - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} of the collection - * to add the provided value to - * @param value The value to add - */ - @RegistryScoped - void addToCollection(Key> key, T value); - - /** - * Removes the provided value from this registry's - * {@link Collection} value for the provided {@link Key} - * - * @param The value type of the provided {@link Key} - * @param key The {@link Key} of the collection - * to add the provided value to - * @param value The value to add - */ - @RegistryScoped - void removeFromCollection(Key> key, T value); - - /** - * Puts the provided key and value pair to this registry's - * {@link Map} value for the provided {@link Key} - * - * @param The key type of the map value for the provided key - * @param The value type of the map value for the provided key - * @param key The {@link Key} of the map to add the - * provided key and value pair to - * @param mapKey The map key to add - * @param mapValue The map value to add - */ - @RegistryScoped - void putInMap(Key> key, K mapKey, T mapValue); - - /** - * Removes the provided key from this registry's - * {@link Map} value for the provided {@link Key} - * - * @param The key type of the map value for the provided key - * @param The value type of the map value for the provided key - * @param key The {@link Key} of the map to remove the provided mapKey from - * @param mapKey The map key to remove - */ - @RegistryScoped - void removeFromMap(Key> key, K mapKey); - - /** - * Runs all {@link Runnable listeners} that were - * added before this call in the provided registryScope. - * - * @param registryScope The {@link RegistryScope} to load - * @see Environment#reload() - * @see #whenLoaded(Runnable) - */ - @RegistryScoped - void load(RegistryScope registryScope); - - /** - * Runs all {@link Runnable listeners} that were - * added before this call in the {@link RegistryScope#DEFAULT default scope}. - * - * @see Environment#reload() - * @see #whenLoaded(Runnable) - */ - @RegistryScoped - default void load() { - load(RegistryScope.DEFAULT); - } - - /** - * Adds a {@link Runnable} to be loaded on {@link #load()}. - * - *

- * Listeners are grouped by order. Smaller orders run before larger ones. - * The execution order within one order group is not guaranteed. - *

- *

- * Please note that {@link ListenerRegistrationEnd#register()} must be invoked to - * complete the registration. - *

- * - * @param listener Listener to add - * @return A {@link ListenerRegistrationEnd} for specifying additional parameters and - * completing the registration. - * @see #load() - */ - ListenerRegistrationEnd whenLoaded(Runnable listener); - - interface ListenerRegistrationEnd { - - /** - * Sets the order for the listener. - * The default order is 0. - * - * @param order The order to run this listener in. Smaller is earlier. - * @return {@code this} - */ - ListenerRegistrationEnd order(int order); - - /** - * Sets the scope for the listener. - * The default scope is {@link RegistryScope#DEFAULT}. - * - * @param scope The scope to run this listener in. - * @return {@code this} - * @see RegistryScope - * @see RegistryScoped - */ - ListenerRegistrationEnd scope(RegistryScope scope); - - /** - * Completes the listener registration. - */ - void register(); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/RegistryScope.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/RegistryScope.java deleted file mode 100644 index 8bc20b9c9..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/RegistryScope.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -public enum RegistryScope { - - /** - * The annotated value persists only between deep reloads. - *

- * Use this scope for values that should be reloadable but not necessarily - * during normal operation of the plugin. - *

- */ - DEEP, - - /** - * The annotated value persists only between normal reloads. - * This value is the default value for the {@link RegistryScoped} annotation. - *

- * Use this scope for - *

- */ - DEFAULT, -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/RegistryScoped.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/RegistryScoped.java deleted file mode 100644 index 5c3cb8bed..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/RegistryScoped.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; - -/** - * Used to indicate the persistence of a value or validity of a method in relation to reloads. - *

- * A field annotated with {@code RegistryScoped} must be persisted (cached) only between reloads - * of that scope. For example, you may choose to persist a result calculated from a configurable - * value (see {@link Registry}). This is illustrated here: - *

- *

- * public class FooService {
- *
- *     // this instance is persisted only for the duration of the scope
- *    {@literal @}RegistryScoped
- *     private Foo foo;
- *
- *     // used to calculate foo
- *     private final Registry registry;
- *
- *    {@literal @}Inject
- *     public FooService(Registry registry) {
- *         this.registry = registry;
- *         registry.whenLoaded(this::loaded).register();
- *     }
- *
- *     public void loaded() {
- *         // invalidate foo
- *         foo = null;
- *     }
- *
- *     // instances returned here are persisted only for the duration of the scope
- *    {@literal @}RegistryScoped
- *     public Foo getFoo() {
- *         if (foo == null) {
- *             foo = ...; // use registry for lazy initialization of foo
- *         }
- *         return foo;
- *     }
- * }
- * 
- *

- * A method annotated with {@code RegistryScoped} must be invoked inside of a reloaded listener - * of the same scope. An example of this is {@link Registry#set(Key, Object)}. Although it has a - * void return type, the side effects of this method will only persist during a scope and so must - * be invoked again to maintain these side effects. - *

- */ -@Target({ - FIELD, - METHOD, -}) -public @interface RegistryScoped { - - RegistryScope value() default RegistryScope.DEFAULT; -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/TypeTokens.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/TypeTokens.java deleted file mode 100644 index 0a92d4970..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/TypeTokens.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -import com.google.common.reflect.TypeToken; - -import java.time.ZoneId; - -@SuppressWarnings("UnstableApiUsage") -public final class TypeTokens { - - private TypeTokens() { - throw new AssertionError("**boss music** No instance for you!"); - } - - public static final TypeToken BOOLEAN = TypeToken.of(Boolean.class); - public static final TypeToken INTEGER = TypeToken.of(Integer.class); - public static final TypeToken STRING = TypeToken.of(String.class); - public static final TypeToken ZONE_ID = TypeToken.of(ZoneId.class); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/ZoneIdSerializer.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/ZoneIdSerializer.java deleted file mode 100644 index d992c2a53..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/registry/ZoneIdSerializer.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.registry; - -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.time.ZoneId; - -public class ZoneIdSerializer { - - private static final String AUTO = "auto"; - - public static ZoneId parse(@Nullable String input) { - if (input == null || AUTO.equals(input)) { - return ZoneId.systemDefault(); - } else { - return ZoneId.of(input); - } - } - - public static String toString(@Nullable ZoneId zoneId) { - return zoneId == null || zoneId.equals(ZoneId.systemDefault()) ? AUTO : zoneId.getId(); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/BackendServer.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/BackendServer.java deleted file mode 100644 index 4ab6dd031..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/BackendServer.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.server; - -import org.anvilpowered.anvil.api.misc.Named; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.List; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -public interface BackendServer extends Named { - - CompletableFuture getVersion(); - - CompletableFuture connect(@Nullable Object player); - - CompletableFuture connect(UUID userUUID); - - CompletableFuture connect(String userName); - - List getPlayerUUIDs(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/LocationService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/LocationService.java deleted file mode 100644 index 3303858c0..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/LocationService.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.server; - -import com.flowpowered.math.vector.Vector3d; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -public interface LocationService { - - Optional getServer(UUID userUUID); - - Optional getServer(String userName); - - Optional getServerForName(String serverName); - - List getServers(); - - Optional getWorldName(UUID userUUID); - - Optional getWorldName(String userName); - - Optional getPosition(UUID userUUID); - - Optional getPosition(String userName); - - CompletableFuture teleport(UUID teleportingUserUUID, UUID targetUserUUID); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/Version.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/Version.java deleted file mode 100644 index b1e1c8b3f..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/server/Version.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.server; - -import org.anvilpowered.anvil.api.misc.Named; - -public interface Version extends Named { - - int getProtocol(); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/KickService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/KickService.java deleted file mode 100644 index bc2edca40..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/KickService.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.util; - -import java.util.UUID; - -public interface KickService { - - void kick(UUID userUUID, Object reason); - - void kick(String userName, Object reason); - - void kick(UUID userUUID); - - void kick(String userName); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/PermissionService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/PermissionService.java deleted file mode 100644 index cf5e02ae3..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/PermissionService.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.util; - -import org.checkerframework.checker.nullness.qual.Nullable; - -public interface PermissionService { - - /** - * Checks whether the provided {@code subject} has - * the provided {@code permission}. Depending on - * the target platform, this can be a - * Player, User, Group etc... - * - *

- * If the provided {@code subject} is the console, returns {@code true} - *

- * - *

- * If the provided {@code subject} is {@code null}, returns {@code false} - *

- * - * @param subject The {@code subject} to test - * @param permission The {@code permission} to check - * @return Whether the provided {@code subject} has - * the provided {@code permission} or is the console. - */ - boolean hasPermission(@Nullable Object subject, String permission); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/Result.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/Result.java deleted file mode 100644 index 5014531ee..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/Result.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.util; - -public interface Result { - - TResult success(TData data); - - TResult fail(TData data); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/TextService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/TextService.java deleted file mode 100644 index 6baccd0d9..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/TextService.java +++ /dev/null @@ -1,1126 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.util; - -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.net.URL; -import java.util.Optional; -import java.util.UUID; -import java.util.function.Consumer; - -public interface TextService - extends Result { - - /** - * @return A new {@link Builder} instance - */ - Builder builder(); - - /** - * @return A new {@link PaginationBuilder} instance - */ - PaginationBuilder paginationBuilder(); - - /** - * Create a {@link TString} with the provided contents - * - * @param contents The contents to add to the result - * @return A built {@link TString} - */ - default TString of(Object... contents) { - return builder().append(contents).build(); - } - - /** - * Create a {@link TString} with the provided contents - * - * @param contents The contents to add to the result - * @return A built {@link TString} - */ - default TString of(CharSequence... contents) { - return builder().append(contents).build(); - } - - /** - * Sends the provided {@link TString text} to the provided {@link TCommandSource receiver}. - * - * @param text The {@link TString text} to send - * @param receiver The {@link TCommandSource receiver} to send the provided text to - */ - void send(TString text, TCommandSource receiver); - - /** - * Sends the provided {@link TString text} to the provided {@link TCommandSource receiver}, - * originating from the provided {@link UUID sourceUUID}. - * - * @param text The {@link TString text} to send - * @param receiver The {@link TCommandSource receiver} to send the provided text to - * @param sourceUUID The {@link UUID} of the source of the message - */ - void send(TString text, TCommandSource receiver, UUID sourceUUID); - - /** - * Sends the provided {@link TString text} to the provided {@link TCommandSource receiver}, - * originating from the provided source. Attempts to extract a {@link UUID} - * from the provided source to server as the identity. - * - * @param text The {@link TString text} to send - * @param receiver The {@link TCommandSource receiver} source to send the provided text to - * @param source The source of the message - */ - void send(TString text, TCommandSource receiver, Object source); - - /** - * Send the provided {@link TString text} to the console - * - * @param text The {@link TString text} to send - */ - default void sendToConsole(TString text) { - send(text, getConsole()); - } - - /** - * @return The server console - */ - TCommandSource getConsole(); - - /** - * Deserializes the provided {@link String} using the - * character {@literal '&'} to determine styles. - * - * @param text {@link String} text to deserialize - * @return The {@link TString} result of the deserialization - */ - TString deserialize(String text); - - /** - * Serializes the provided {@link String} using the - * character {@literal '&'} to serialize styles. - * - * @param text {@link TString} text to serialize - * @return The {@link String} result of the serialization - */ - String serialize(TString text); - - /** - * Serializes the provided {@link String} and - * ignores all styles. - * - * @param text {@link TString} text to serialize - * @return The {@link String} result of the serialization - */ - String serializePlain(TString text); - - /** - * Removes all styles codes from the provided {@link String} - * using the character {@literal '&'} to determine styles - * - *

- * For example, {@code "&l&bhello &aworld"} becomes {@code "hello world"} - *

- * - * @param text {@link String} text to remove color from - * @return The provided {@link String} without any color codes - */ - String toPlain(String text); - - /** - * Counts the number of lines in the provided {@link TString} - * - * @param text {@link TString} text to count lines - * @return The number of lines in the provided {@link TString}. - * -1 if null. 0 if empty. - */ - int lineCount(@Nullable TString text); - - /** - * Counts the number of characters in the provided {@link TString} - * excluding color codes. - * - * @param text {@link TString} text to count characters - * @return The number of characters in the provided {@link TString}. - * -1 if null. 0 if empty. - */ - default int length(@Nullable TString text) { - return text == null - ? -1 - : serializePlain(text).length(); - } - - interface Builder { - - /** - * Sets the current color to aqua. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder aqua(); - - /** - * Sets the current color to black. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder black(); - - /** - * Sets the current color to blue. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder blue(); - - /** - * Sets the current color to dark aqua. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder dark_aqua(); - - /** - * Sets the current color to dark blue. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder dark_blue(); - - /** - * Sets the current color to dark gray. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder dark_gray(); - - /** - * Sets the current color to dark green. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder dark_green(); - - /** - * Sets the current color to dark purple. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder dark_purple(); - - /** - * Sets the current color to dark red. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder dark_red(); - - /** - * Sets the current color to gold. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder gold(); - - /** - * Sets the current color to gray. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder gray(); - - /** - * Sets the current color to green. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder green(); - - /** - * Sets the current color to light purple. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder light_purple(); - - /** - * Sets the current color to red. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder red(); - - /** - * Resets the current style to default. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder reset(); - - /** - * Sets the current color to white. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder white(); - - /** - * Sets the current color to yellow. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder yellow(); - - /** - * Sets the current style to bold. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder bold(); - - /** - * Sets the current style to italic. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder italic(); - - /** - * Sets the current style to obfuscated. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder obfuscated(); - - /** - * Sets the current style to strikethrough. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder strikethrough(); - - /** - * Sets the current style to underlined. Only applies - * to text appended after this call. - * - * @return {@code this} - */ - Builder underlined(); - - /** - * Append the provided contents to this builder - * - * @param contents {@link Object} contents to append - * @return {@code this} - */ - Builder append( - Object... contents); - - /** - * Append the provided contents to this builder - * - * @param contents {@link CharSequence} contents to append - * @return {@code this} - */ - Builder append( - CharSequence... contents); - - /** - * Append the provided contents to this builder - * {@code count} times. - * - *

- * This method is the same as: - *

- *
{@code
-         * for (int i = 0; i < count; i++) {
-         *     builder.append(contents);
-         * }
-         * }
- * - * @param count number of times to append the provided contents - * @param contents {@link Object} contents to append - * @return {@code this} - */ - Builder appendCount( - int count, Object... contents); - - /** - * Append the provided contents to this builder - * {@code count} times. - * - *

- * This method is the same as: - *

- *
{@code
-         * for (int i = 0; i < count; i++) {
-         *     builder.append(contents);
-         * }
-         * }
- * - * @param count number of times to append the provided contents - * @param contents {@link CharSequence} contents to append - * @return {@code this} - */ - Builder appendCount( - int count, CharSequence... contents); - - /** - * Append the provided contents to this builder - * and add the provided padding on the left side - * until the result is at most {@code width} wide. - * - *

- * An example of usage is: - *

- *
{@code
-         * builder.appendWithPaddingLeft(15, '-', "hello");
-         * }
- *

- * which appends the result {@code "----------hello"} - *

- *
- *

- * If the value for padding is longer than one character, - * the appended result may not reach the full provided {@code width}. - * This can be seen in the following example: - *

- *
{@code
-         * builder.appendWithPaddingLeft(15, "abc", "hello");
-         * }
- *

- * which appends the result {@code "abcabcabchello"} (14 characters instead of 15) - *

- *
- *

- * This happens because the remaining width is not a multiple of - * the length of the provided padding, which makes it impossible fill - * the full length of the appended result. - *

- *
- *

- * Note: The appended result will be at most {@code width} wide, or - * an exception will be thrown - *

- * - * @param width The maximum total width after padding - * @param padding The padding to fill the left side with - * @param contents The contents to append - * @return {@code this} - * @throws IllegalArgumentException If width {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal >} width - * @throws IllegalArgumentException If contents length {@literal >} width - */ - Builder appendWithPaddingLeft( - int width, Object padding, Object... contents); - - /** - * Append the provided contents to this builder - * and add the provided padding on the left side - * until the result is at most {@code width} wide. - * - *

- * An example of usage is: - *

- *
{@code
-         * builder.appendWithPaddingLeft(15, '-', "hello");
-         * }
- *

- * which appends the result {@code "----------hello"} - *

- *
- *

- * If the value for padding is longer than one character, - * the appended result may not reach the full provided {@code width}. - * This can be seen in the following example: - *

- *
{@code
-         * builder.appendWithPaddingLeft(15, "abc", "hello");
-         * }
- *

- * which appends the result {@code "abcabcabchello"} (14 characters instead of 15) - *

- *
- *

- * This happens because the remaining width is not a multiple of - * the length of the provided padding, which makes it impossible fill - * the full length of the appended result. - *

- *
- *

- * Note: The appended result will be at most {@code width} wide, or - * an exception will be thrown - *

- * - * @param width The maximum total width after padding - * @param padding The padding to fill the left side with - * @param contents The contents to append - * @return {@code this} - * @throws IllegalArgumentException If width {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal >} width - * @throws IllegalArgumentException If contents length {@literal >} width - */ - Builder appendWithPaddingLeft( - int width, Object padding, CharSequence... contents); - - /** - * Append the provided contents to this builder - * and add the provided padding on both the left and right side - * until the result is at most {@code width} wide. - * - *

- * An example of usage is: - *

- *
{@code
-         * builder.appendWithPaddingAround(15, '-', "hello");
-         * }
- *

- * which appends the result {@code "-----hello-----"} - *

- *
- *

- * If the value for padding is longer than one character, - * the appended result may not reach the full provided {@code width}. - * This can be seen in the following example: - *

- *
{@code
-         * builder.appendWithPaddingAround(15, "abc", "hello");
-         * }
- *

- * which appends the result {@code "abchelloabc"} (11 characters instead of 15) - *

- *
- *

- * This happens because the remaining width is not a multiple of - * the length of the provided padding, which makes it impossible fill - * the full length of the appended result. - *

- *
- *

- * Note: The appended result will be at most {@code width} wide, or - * an exception will be thrown - * Note: The amount of padding on the left and right side will - * always be the same - *

- * - * @param width The maximum total width after padding - * @param padding The padding to fill the left and right side with - * @param contents The contents to append - * @return {@code this} - * @throws IllegalArgumentException If width {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal >} width - * @throws IllegalArgumentException If contents length {@literal >} width - */ - Builder appendWithPaddingAround( - int width, Object padding, Object... contents); - - /** - * Append the provided contents to this builder - * and add the provided padding on both the left and right side - * until the result is at most {@code width} wide. - * - *

- * An example of usage is: - *

- *
{@code
-         * builder.appendWithPaddingAround(15, '-', "hello");
-         * }
- *

- * which appends the result {@code "-----hello-----"} - *

- *
- *

- * If the value for padding is longer than one character, - * the appended result may not reach the full provided {@code width}. - * This can be seen in the following example: - *

- *
{@code
-         * builder.appendWithPaddingAround(15, "abc", "hello");
-         * }
- *

- * which appends the result {@code "abchelloabc"} (11 characters instead of 15) - *

- *
- *

- * This happens because the remaining width is not a multiple of - * the length of the provided padding, which makes it impossible fill - * the full length of the appended result. - *

- *
- *

- * Note: The appended result will be at most {@code width} wide, or - * an exception will be thrown - * Note: The amount of padding on the left and right side will - * always be the same - *

- * - * @param width The maximum total width after padding - * @param padding The padding to fill the left and right side with - * @param contents The contents to append - * @return {@code this} - * @throws IllegalArgumentException If width {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal >} width - * @throws IllegalArgumentException If contents length {@literal >} width - */ - Builder appendWithPaddingAround( - int width, Object padding, CharSequence... contents); - - /** - * Append the provided contents to this builder - * and add the provided padding on the right side - * until the result is at most {@code width} wide. - * - *

- * An example of usage is: - *

- *
{@code
-         * builder.appendWithPaddingRight(15, '-', "hello");
-         * }
- *

- * which appends the result {@code "hello----------"} - *

- *
- *

- * If the value for padding is longer than one character, - * the appended result may not reach the full provided {@code width}. - * This can be seen in the following example: - *

- *
{@code
-         * builder.appendWithPaddingRight(15, "abc", "hello");
-         * }
- *

- * which appends the result {@code "helloabcabcabc"} (14 characters instead of 15) - *

- *
- *

- * This happens because the remaining width is not a multiple of - * the length of the provided padding, which makes it impossible fill - * the full length of the appended result. - *

- *
- *

- * Note: The appended result will be at most {@code width} wide, or - * an exception will be thrown - *

- * - * @param width The maximum total width after padding - * @param padding The padding to fill the right side with - * @param contents The contents to append - * @return {@code this} - * @throws IllegalArgumentException If width {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal >} width - * @throws IllegalArgumentException If contents length {@literal >} width - */ - Builder appendWithPaddingRight( - int width, Object padding, Object... contents); - - /** - * Append the provided contents to this builder - * and add the provided padding on the right side - * until the result is at most {@code width} wide. - * - *

- * An example of usage is: - *

- *
{@code
-         * builder.appendWithPaddingRight(15, '-', "hello");
-         * }
- *

- * which appends the result {@code "hello----------"} - *

- *
- *

- * If the value for padding is longer than one character, - * the appended result may not reach the full provided {@code width}. - * This can be seen in the following example: - *

- *
{@code
-         * builder.appendWithPaddingRight(15, "abc", "hello");
-         * }
- *

- * which appends the result {@code "helloabcabcabc"} (14 characters instead of 15) - *

- *
- *

- * This happens because the remaining width is not a multiple of - * the length of the provided padding, which makes it impossible fill - * the full length of the appended result. - *

- *
- *

- * Note: The appended result will be at most {@code width} wide, or - * an exception will be thrown - *

- * - * @param width The maximum total width after padding - * @param padding The padding to fill the right side with - * @param contents The contents to append - * @return {@code this} - * @throws IllegalArgumentException If width {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal <} 1 - * @throws IllegalArgumentException If padding length {@literal >} width - * @throws IllegalArgumentException If contents length {@literal >} width - */ - Builder appendWithPaddingRight( - int width, Object padding, CharSequence... contents); - - /** - * Append the provided contents if {@code condition} is true. - * - *

- * This method is the same as: - *

- *
{@code
-         * if (condition) {
-         *     builder.append(contents);
-         * }
-         * }
- * - * @param condition The condition to check - * @param contents The contents to append - * @return {@code this} - */ - Builder appendIf( - boolean condition, Object... contents); - - /** - * Append the provided contents if {@code condition} is true. - * - *

- * This method is the same as: - *

- *
{@code
-         * if (condition) {
-         *     builder.append(contents);
-         * }
-         * }
- * - * @param condition The condition to check - * @param contents The contents to append - * @return {@code this} - */ - Builder appendIf( - boolean condition, CharSequence... contents); - - /** - * Append the provided contents, putting the - * provided delimiter between each element - * - *
{@code
-         * builder.appendJoining(", ", "Bob", "Alice", "Steven");
-         * }
- *

- * is the same as - *

- *
{@code
-         * builder.append("Bob", ", ", "Alice", ", ", "Steven");
-         * }
- *

- * They both append: {@code "Bob, Alice, Steven"} - *

- * - * @param delimiter The delimiter to put between each element - * @param contents The contents to append - * @return {@code this} - */ - Builder appendJoining( - Object delimiter, Object... contents); - - /** - * Append the provided contents, putting the - * provided delimiter between each element - * - *
{@code
-         * builder.appendJoining(", ", "Bob", "Alice", "Steven");
-         * }
- *

- * is the same as - *

- *
{@code
-         * builder.append("Bob", ", ", "Alice", ", ", "Steven");
-         * }
- *

- * They both append: {@code "Bob, Alice, Steven"} - *

- * - * @param delimiter The delimiter to put between each element - * @param contents The contents to append - * @return {@code this} - */ - Builder appendJoining( - Object delimiter, CharSequence... contents); - - /** - * Append the provided contents if {@code condition} is true, - * putting the provided delimiter between each element - * - *

- * This is a combination of {@link #appendIf(boolean, Object...)} - * and {@link #appendJoining(Object, Object...)} - *

- * - *
{@code
-         * builder.appendJoiningIf(condition, ", ", "Bob", "Alice", "Steven");
-         * }
- *

- * is the same as - *

- *
{@code
-         * if (condition) {
-         *     builder.append("Bob", ", ", "Alice", ", ", "Steven");
-         * }
-         * }
- *

- * They both append: {@code "Bob, Alice, Steven"} if {@code condition} is true - *

- * - * @param condition The condition to check before appending - * @param delimiter The delimiter to put between each element - * @param contents The contents to append - * @return {@code this} - */ - Builder appendJoiningIf( - boolean condition, Object delimiter, Object... contents); - - /** - * Append the provided contents if {@code condition} is true, - * putting the provided delimiter between each element - * - *

- * This is a combination of {@link #appendIf(boolean, CharSequence...)} - * and {@link #appendJoining(Object, CharSequence...)} - *

- * - *
{@code
-         * builder.appendJoiningIf(condition, ", ", "Bob", "Alice", "Steven");
-         * }
- *

- * is the same as - *

- *
{@code
-         * if (condition) {
-         *     builder.append("Bob", ", ", "Alice", ", ", "Steven");
-         * }
-         * }
- *

- * They both append: {@code "Bob, Alice, Steven"} if {@code condition} is true - *

- * - * @param condition The condition to check before appending - * @param delimiter The delimiter to put between each element - * @param contents The contents to append - * @return {@code this} - */ - Builder appendJoiningIf( - boolean condition, Object delimiter, CharSequence... contents); - - /** - * Fetches the plugin prefix from the bound {@link PluginInfo} and appends it to this builder. - * - * @return {@code this} - */ - Builder appendPrefix(); - - /** - * Show the provided text as a tooltip while - * the mouse is hovering over this text - * - * @param text The text to show on hover - * @return {@code this} - */ - Builder onHoverShowText( - TString text); - - /** - * Show the provided text as a tooltip while - * the mouse is hovering over this text - * - * @param builder The text to show on hover - * @return {@code this} - */ - Builder onHoverShowText( - Builder builder); - - /** - * Suggest the provided command to the provided{@link TCommandSource} when - * they click This puts it in their chat bar but does not run the command. - * - * @param command The command to suggest - * @return {@code this} - */ - Builder onClickSuggestCommand( - String command); - - /** - * Run the provided command as the provided {@link TCommandSource} when they click. - * - * @param command The command to run - * @return {@code this} - */ - Builder onClickRunCommand( - String command); - - /** - * Run the provided callback, passing the provided {@link TCommandSource}, when they click. - * - * @param callback The callback to run - * @return {@code this} - */ - Builder onClickExecuteCallback( - Consumer callback); - - /** - * Open a url in a browser when this text is clicked. - * - * @param url The url to open - * @return {@code this} - */ - Builder onClickOpenUrl( - URL url); - - /** - * Open a url in a browser when this text is clicked. - * - * @param url The url to open - * @return {@code this} - */ - Builder onClickOpenUrl( - String url); - - /** - * Creates a {@link TString} from this builder. - * - * @return The built {@link TString} - */ - TString build(); - - /** - * Creates a {@link TString text} from this builder and sends it to the provided {@link TCommandSource receiver} - * - * @param receiver The {@link TCommandSource receiver} to send the {@link TString text} to - */ - void sendTo(TCommandSource receiver); - - /** - * Creates a {@link TString} from this builder and sends - * it to the console - */ - void sendToConsole(); - } - - interface PaginationBuilder { - - /** - * Sets the contents of this {@link PaginationBuilder}. - * - * @param contents The contents to set - * @return {@code this} - */ - PaginationBuilder contents( - TString... contents); - - /** - * Sets the contents of this {@link PaginationBuilder}. - * - * @param contents The contents to set - * @return {@code this} - */ - PaginationBuilder contents( - Iterable contents); - - /** - * Sets the title of this {@link PaginationBuilder}. - * - * @param title The title to set, should be exactly one line - * @return {@code this} - */ - PaginationBuilder title( - @Nullable TString title); - - /** - * Sets the title of this {@link PaginationBuilder}. - * - * @param title The title to set, should be exactly one line - * @return {@code this} - */ - PaginationBuilder title( - @Nullable Builder title); - - /** - * Sets the header of this {@link PaginationBuilder}. - * - *

- * If the header is not specified, or passed in as {@code null}, - * it will be omitted when displaying this pagination. - *

- * - * @param header The header to set - * @return {@code this} - */ - PaginationBuilder header( - @Nullable TString header); - - /** - * Sets the header of this {@link PaginationBuilder}. - * - *

- * If the header is not specified, or passed in as {@code null}, - * it will be omitted when displaying this pagination. - *

- * - * @param header The header to set - * @return {@code this} - */ - PaginationBuilder header( - @Nullable Builder header); - - /** - * Sets the footer of this {@link PaginationBuilder}. - * - *

- * If the footer is not specified, or passed in as {@code null}, - * it will be omitted when displaying this pagination. - *

- * - * @param footer The footer to set - * @return {@code this} - */ - PaginationBuilder footer( - @Nullable TString footer); - - /** - * Sets the footer of this {@link PaginationBuilder}. - * - *

- * If the footer is not specified, or passed in as {@code null}, - * it will be omitted when displaying this pagination. - *

- * - * @param footer The footer to set - * @return {@code this} - */ - PaginationBuilder footer( - @Nullable Builder footer); - - /** - * Sets the padding of this {@link PaginationBuilder}. - * - * @param padding The padding to set - * @return {@code this} - */ - PaginationBuilder padding( - TString padding); - - /** - * Sets the padding of this {@link PaginationBuilder}. - * - * @param padding The padding to set - * @return {@code this} - */ - PaginationBuilder padding( - Builder padding); - - /** - * Sets the maximum number of lines for this {@link PaginationBuilder}. - * - * @param linesPerPge The lines per page to set - * @return {@code this} - * @throws IllegalArgumentException If linesPerPage {@literal <} 1 - */ - PaginationBuilder linesPerPage( - int linesPerPge); - - /** - * Creates a {@link Pagination} from this builder - * - * @return The built {@link Pagination} - */ - Pagination build(); - } - - interface Pagination { - - /** - * @return The contents of this {@link Pagination} - */ - Iterable getContents(); - - /** - * @return The title of this {@link Pagination} - */ - Optional getTitle(); - - /** - * @return The header of this {@link Pagination} - */ - Optional getHeader(); - - /** - * @return The footer of this {@link Pagination} - */ - Optional getFooter(); - - /** - * @return The padding of this {@link Pagination} - */ - TString getPadding(); - - /** - * @return The lines per page of this {@link Pagination} - */ - int getLinesPerPage(); - - /** - * Sends this {@link Pagination} to the provided {@link TCommandSource receiver} - * - * @param receiver The {@link TCommandSource receiver} to send this {@link Pagination} to - */ - void sendTo(TCommandSource receiver); - - /** - * Sends this {@link Pagination} to the console - */ - void sendToConsole(); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/TimeFormatService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/TimeFormatService.java deleted file mode 100644 index a8ce18ce9..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/TimeFormatService.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.util; - -import java.time.Duration; -import java.time.Instant; -import java.time.ZonedDateTime; -import java.time.temporal.TemporalAccessor; -import java.util.Optional; - -/** - * A service that deals with transforming times and durations to and from human-readable formats. - * - *

- * In general, times are interpreted in the following way: - *

- *
    - *
  • {@link String} and {@link ZonedDateTime} - In the end user's time zone (as defined in the config)
  • - *
  • {@link Instant} - In UTC
  • - *
- */ -public interface TimeFormatService { - - long parseSecondsUnsafe(String input); - - Optional parseSeconds(String input); - - Duration parseDurationUnsafe(String input); - - Optional parseDuration(String input); - - Instant parseFutureInstantUnsafe(String input); - - Optional parseFutureInstant(String input); - - Instant parseInstantUnsafe(String input); - - Optional parseInstant(String input); - - /** - * Interprets the provided {@link Instant} as UTC and converts it into the time zone defined in the config. - * - * @param instant The {@link Instant} in UTC to convert - * @return An {@link Instant} converted to the time zone defined in the config - */ - ZonedDateTime fromUTC(Instant instant); - - FormatResult format(Duration duration); - - /** - * Formats the provided {@link TemporalAccessor} and converts it to the time zone defined in the config if it does - * not already have timezone data. - * - * @param temporal The {@link TemporalAccessor} to format - * @return A {@link FormatResult} - */ - FormatResult format(TemporalAccessor temporal); - - FormatResult formatDurationUnsafe(String input); - - Optional formatDuration(String input); - - FormatResult formatInstantUnsafe(String input); - - Optional formatInstant(String input); - - interface FormatResult { - - /** - * Sets the maximum amount of characters in the result. Providing a - * negative value means no maximum. - * - * @param maxCharacters The maximum amount of characters - * @return {@code this} - */ - FormatResult maxCharacters(int maxCharacters); - - /** - * Sets the maximum amount of units in the result. Providing a - * negative value means no maximum. - * - * @param maxUnits The maximum amount of units - * @return {@code this} - */ - FormatResult maxUnits(int maxUnits); - - /** - * Removes the nano second component of the result - * - * @return {@code this} - */ - FormatResult withoutNano(); - - /** - * Builds and returns the string representation of this {@link FormatResult} - * - * @return The string representation of this {@link FormatResult} - */ - @Override - String toString(); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/UserService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/UserService.java deleted file mode 100644 index 80f4ac475..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/api/util/UserService.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.util; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -/** - * Service for translating UUIDs to UserNames or UserNames to UUIDs - */ -public interface UserService { - - Optional get(String userName); - - Optional get(UUID userUUID); - - Optional getPlayer(String userName); - - Optional getPlayer(UUID userUUID); - - Optional getPlayer(TUser user); - - /** - * Attempts to find all matching userNames that start with the provided String (case-insensitive). - * - * @return A list of matching player names - */ - List matchPlayerNames(String startsWith); - - /** - * Attempts to find all matching userNames that start with the String at the provided index - * of the provided array when it has the provided length. - * - * @param length The length of {@code context} for which to match the String at {@code index} - * @return A list of matching player names - */ - List matchPlayerNames(String[] context, int index, int length); - - Collection getOnlinePlayers(); - - CompletableFuture> getUUID(String userName); - - CompletableFuture> getUserName(UUID userUUID); - - UUID getUUID(TUser user); - - /** - * If the provided object has a {@link UUID}, return it. Otherwise return a constant UUID that is - * the same for all objects without a UUID. - */ - UUID getUUIDSafe(Object object); - - String getUserName(TUser user); -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseCacheService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseCacheService.java deleted file mode 100644 index 8e263442b..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseCacheService.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import org.anvilpowered.anvil.api.datastore.CacheService; -import org.anvilpowered.anvil.api.model.ObjectWithId; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -@Deprecated // will probably break in 0.4 -public abstract class BaseCacheService< - TKey, - T extends ObjectWithId, - TDataStore> - extends BaseRepository - implements CacheService { - - protected Registry registry; - - protected ConcurrentMap cache; - - private Integer timeoutSeconds; - - protected BaseCacheService(Registry registry) { - this.registry = registry; - registry.whenLoaded(this::registryLoaded).register(); - cache = new ConcurrentHashMap<>(); - } - - private void registryLoaded() { - stopCacheInvalidationTask(); - Integer intervalSeconds = registry.getOrDefault(Keys.CACHE_INVALIDATION_INTERVAL_SECONDS); - timeoutSeconds = registry.getOrDefault(Keys.CACHE_INVALIDATION_TIMOUT_SECONDS); - startCacheInvalidationTask(intervalSeconds); - } - - @Override - public Runnable getCacheInvalidationTask() { - return () -> { - List toRemove = new ArrayList<>(); - for (T t : getAllAsSet()) { - if (System.currentTimeMillis() - cache.get(t) > timeoutSeconds * 1000L) { - toRemove.add(t); - } - } - toRemove.forEach(this::delete); - }; - } - - @Override - public Set getAllAsSet() { - return cache.keySet(); - } - - @Override - public CompletableFuture> insertOne(T t) { - return CompletableFuture.supplyAsync(() -> { - if (t == null) return Optional.empty(); - cache.put(t, System.currentTimeMillis()); - return Optional.of(t); - }); - } - - @Override - public CompletableFuture> insert(List list) { - return CompletableFuture.supplyAsync(() -> list.stream().map(t -> insertOne(t).join().orElse(null)).filter(Objects::nonNull).collect(Collectors.toList())); - } - - @Override - public CompletableFuture> getOne(TKey id) { - return CompletableFuture.supplyAsync(() -> getOne(dbo -> dbo.getId().equals(id))); - } - - @Override - public CompletableFuture deleteOne(TKey id) { - return CompletableFuture.supplyAsync(() -> deleteOne(dbo -> dbo.getId().equals(id)).isPresent()); - } - - @Override - public CompletableFuture> getAllIds() { - return CompletableFuture.supplyAsync(() -> cache.keySet().stream().map(ObjectWithId::getId).collect(Collectors.toList())); - } - - @Override - public Optional deleteOne(Predicate predicate) { - return getOne(predicate).flatMap(this::delete); - } - - @Override - public Optional delete(T t) { - return cache.remove(t) == null ? Optional.empty() : Optional.of(t); - } - - @Override - public List delete(Predicate predicate) { - return cache.keySet().stream().filter(predicate).filter(t -> cache.remove(t) != null).collect(Collectors.toList()); - } - - @Override - public List getAll(Predicate predicate) { - return getAllAsSet().stream().filter(predicate).collect(Collectors.toList()); - } - - @Override - public Optional getOne(Predicate predicate) { - return getAll(predicate).stream().findAny(); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseCachedRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseCachedRepository.java deleted file mode 100644 index 7890019af..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseCachedRepository.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import org.anvilpowered.anvil.api.datastore.CacheService; -import org.anvilpowered.anvil.api.datastore.CachedRepository; -import org.anvilpowered.anvil.api.model.ObjectWithId; - -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; - -@Deprecated // will probably break in 0.4 -public abstract class BaseCachedRepository< - TKey, - T extends ObjectWithId, - C extends CacheService, - TDataStore> - extends BaseRepository - implements CachedRepository { - - @Override - public CompletableFuture applyFromDBToCache(Supplier fromDB, BiConsumer toCache) { - return CompletableFuture.supplyAsync(fromDB).thenApplyAsync(k -> { - getRepositoryCacheService().ifPresent(c -> toCache.accept(c, k)); - return k; - }); - } - - @Override - public CompletableFuture> applyFromDBToCacheConditionally(Supplier> fromDB, BiConsumer toCache) { - return CompletableFuture.supplyAsync(fromDB).thenApplyAsync(optionalK -> { - optionalK.ifPresent(k -> getRepositoryCacheService().ifPresent(c -> toCache.accept(c, k))); - return optionalK; - }); - } - - @Override - public CompletableFuture applyFromDBThroughCache(Supplier fromDB, BiFunction cacheTransformer) { - return CompletableFuture.supplyAsync(fromDB).thenApplyAsync(k -> getRepositoryCacheService().map(c -> cacheTransformer.apply(c, k)).orElse(k)); - } - - @Override - public CompletableFuture> applyFromDBThroughCacheConditionally(Supplier> fromDB, BiFunction> cacheTransformer) { - return CompletableFuture.supplyAsync(fromDB).thenApplyAsync(optionalK -> optionalK.flatMap(k -> getRepositoryCacheService().flatMap(c -> cacheTransformer.apply(c, k)))); - } - - @Override - public CompletableFuture applyThroughBoth(Function cacheTransformer, Function, K> dbTransformer) { - return CompletableFuture.supplyAsync(() -> dbTransformer.apply(getRepositoryCacheService().map(cacheTransformer))); - } - - @Override - public CompletableFuture> applyThroughBothConditionally(Function> cacheTransformer, Function dbTransformer) { - return CompletableFuture.supplyAsync(() -> getRepositoryCacheService().flatMap(cacheTransformer).map(dbTransformer)); - } - - @Override - public CompletableFuture> applyToBothConditionally(Function> cacheTransformer, Supplier> dbSupplier) { - return CompletableFuture.supplyAsync(() -> { - Optional optionalK = getRepositoryCacheService().flatMap(cacheTransformer); - if (!optionalK.isPresent()) { - return dbSupplier.get(); - } - return optionalK; - }); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseComponent.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseComponent.java deleted file mode 100644 index 5679c29fb..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseComponent.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.datastore.Component; -import org.anvilpowered.anvil.api.datastore.DataStoreContext; - -import java.util.Optional; - -public abstract class BaseComponent< - TKey, - TDataStore> - implements Component { - - @Inject - private DataStoreContext dataStoreContext; - - @Override - public DataStoreContext getDataStoreContext() { - return dataStoreContext; - } - - @Override - public Class getTKeyClass() { - return dataStoreContext.getTKeyClass(); - } - - @Override - public Optional parse(Object object) { - try { - return Optional.of(parseUnsafe(object)); - } catch (IllegalArgumentException | UnsupportedOperationException e) { - return Optional.empty(); - } - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseManager.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseManager.java deleted file mode 100644 index 03902d887..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseManager.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import com.google.common.base.Preconditions; -import com.google.common.reflect.TypeToken; -import com.google.inject.Binding; -import com.google.inject.Inject; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.name.Named; -import com.google.inject.name.Names; -import org.anvilpowered.anvil.api.datastore.Component; -import org.anvilpowered.anvil.api.datastore.Manager; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.api.registry.RegistryScoped; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.slf4j.Logger; - -import java.util.Locale; -import java.util.Map; - -@SuppressWarnings({"UnstableApiUsage", "unchecked"}) -public abstract class BaseManager> implements Manager { - - protected Registry registry; - - private final TypeToken componentType; - - protected BaseManager(Registry registry) { - this.registry = registry; - registry.whenLoaded(this::registryLoaded).register(); - componentType = new TypeToken(getClass()) { - }; - } - - @Inject - private Injector injector; - - @Inject - private Logger logger; - - @Nullable - @RegistryScoped - private C currentComponent; - - private void registryLoaded() { - currentComponent = null; - } - - private void loadComponent() { - String dataStoreName = registry.getExtraSafe(Keys.DATA_STORE_NAME) - .toLowerCase(Locale.ENGLISH); - String type = componentType.getRawType().getCanonicalName(); - Named named = Names.named(dataStoreName); - for (Map.Entry, Binding> entry : injector.getBindings().entrySet()) { - Key k = entry.getKey(); - if (k.getTypeLiteral().getType().getTypeName().contains(type) - && named.equals(k.getAnnotation())) { - currentComponent = (C) entry.getValue().getProvider().get(); - return; - } - } - String message = "Anvil: Could not find requested data store: \"" + dataStoreName - + "\". Did you bind it correctly?"; - logger.error(message, new IllegalStateException(message)); - } - - @Override - @RegistryScoped - public C getPrimaryComponent() { - try { - if (currentComponent == null) { - loadComponent(); - } - return Preconditions.checkNotNull(currentComponent, - "An error occurred while loading current component"); - } catch (RuntimeException e) { - String message = "Anvil: DataStoreName has not been loaded yet!" + - "Make sure your Registry and ConfigurationService implementations" + - "are annotated with @Singleton!"; - logger.error(message); - throw new IllegalStateException(message, e); - } - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoCachedRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoCachedRepository.java deleted file mode 100644 index 799096501..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoCachedRepository.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import dev.morphia.Datastore; -import org.anvilpowered.anvil.api.datastore.CacheService; -import org.anvilpowered.anvil.api.datastore.CachedRepository; -import org.anvilpowered.anvil.api.datastore.Repository; -import org.anvilpowered.anvil.api.model.ObjectWithId; -import org.bson.types.ObjectId; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -@Deprecated // will probably break in 0.4 -public interface BaseMongoCachedRepository< - T extends ObjectWithId, - C extends CacheService> - extends BaseMongoRepository, CachedRepository { - - @Override - default CompletableFuture> insertOne(T item) { - return applyFromDBToCacheConditionally(() -> BaseMongoRepository.super.insertOne(item).join(), Repository::insertOne); - } - - @Override - default CompletableFuture> insert(List list) { - return applyFromDBToCache(() -> BaseMongoRepository.super.insert(list).join(), Repository::insert); - } - - @Override - default CompletableFuture> getOne(ObjectId id) { - return applyToBothConditionally(c -> c.getOne(id).join(), () -> BaseMongoRepository.super.getOne(id).join()); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoComponent.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoComponent.java deleted file mode 100644 index f1b2aa217..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoComponent.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import dev.morphia.Datastore; -import org.anvilpowered.anvil.api.datastore.Component; -import org.bson.types.ObjectId; - -import java.util.Optional; - -public interface BaseMongoComponent extends Component { - - @Override - default ObjectId parseUnsafe(Object object) { - if (object instanceof ObjectId) { - return (ObjectId) object; - } else if (object instanceof Optional) { - Optional optional = (Optional) object; - if (optional.isPresent()) return parseUnsafe(optional.get()); - throw new IllegalArgumentException("Error while parsing " + object + ". Optional not present"); - } - String string = object.toString(); - if (ObjectId.isValid(string)) return new ObjectId(string); - throw new IllegalArgumentException("Error while parsing " + object + ". Not a valid ObjectId"); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoRepository.java deleted file mode 100644 index 494f02357..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseMongoRepository.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import com.google.common.collect.ImmutableList; -import dev.morphia.query.Query; -import dev.morphia.query.UpdateOperations; -import kotlin.collections.CollectionsKt; -import kotlin.sequences.SequencesKt; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.datastore.MongoRepository; -import org.anvilpowered.anvil.api.model.ObjectWithId; -import org.anvilpowered.anvil.api.util.TimeFormatService; -import org.bson.types.ObjectId; - -import java.time.Instant; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; - -public interface BaseMongoRepository< - T extends ObjectWithId> - extends MongoRepository, BaseMongoComponent { - - @Override - default CompletableFuture> getCreatedUtc(ObjectId id) { - return CompletableFuture.completedFuture( - Optional.of(Instant.ofEpochSecond(id.getTimestamp()))); - } - - @Override - default CompletableFuture> insertOne(T item) { - return CompletableFuture.supplyAsync(() -> { - try { - getDataStoreContext().getDataStore().save(item); - } catch (RuntimeException e) { - e.printStackTrace(); - return Optional.empty(); - } - return Optional.of(item); - }); - } - - @Override - default CompletableFuture> insert(List list) { - return CompletableFuture.supplyAsync(() -> - list.stream().filter(item -> { - try { - getDataStoreContext().getDataStore().save(item); - } catch (RuntimeException e) { - e.printStackTrace(); - return false; - } - return true; - }).collect(Collectors.toList()) - ); - } - - @Override - default CompletableFuture> getOne(Query query) { - return CompletableFuture.supplyAsync(() -> Optional.ofNullable(query.first())); - } - - @Override - default CompletableFuture> getOne(ObjectId id) { - return getOne(asQuery(id)); - } - - @Override - default CompletableFuture> getOne(Instant createdUtc) { - return getOne(asQuery(createdUtc)); - } - - @Override - default CompletableFuture> getAllIds() { - return CompletableFuture.supplyAsync(() -> - ImmutableList.copyOf( - SequencesKt.map(CollectionsKt.asSequence(asQuery().project("_id", true)), - ObjectWithId::getId).iterator()) - ); - } - - @Override - default CompletableFuture delete(Query query) { - return CompletableFuture.supplyAsync(() -> { - try { - return getDataStoreContext().getDataStore().delete(query).getN() > 0; - } catch (RuntimeException e) { - e.printStackTrace(); - return false; - } - }); - } - - @Override - default CompletableFuture deleteOne(ObjectId id) { - return delete(asQuery(id)); - } - - @Override - default CompletableFuture deleteOne(Instant createdUtc) { - return delete(asQuery(createdUtc)); - } - - @Override - default UpdateOperations createUpdateOperations() { - return getDataStoreContext().getDataStore().createUpdateOperations(getTClass()); - } - - @Override - default UpdateOperations inc(String field, Number value) { - return createUpdateOperations().inc(field, value); - } - - @Override - default UpdateOperations inc(String field) { - return inc(field, 1); - } - - @Override - default UpdateOperations set(String field, Object value) { - return createUpdateOperations().set(field, value); - } - - @Override - default UpdateOperations unSet(String field) { - return createUpdateOperations().unset(field); - } - - @Override - default CompletableFuture update(Query query, - UpdateOperations updateOperations) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore() - .update(query, updateOperations).getUpdatedCount() > 0); - } - - @Override - default CompletableFuture update(Optional> optionalQuery, - UpdateOperations updateOperations) { - return optionalQuery.map(q -> update(q, updateOperations)) - .orElse(CompletableFuture.completedFuture(false)); - } - - @Override - default CompletableFuture> getAll() { - return getAll(asQuery()); - } - - @Override - default CompletableFuture> getAll(Query query) { - return CompletableFuture.supplyAsync(query::asList); - } - - @Override - default Query asQuery() { - return getDataStoreContext().getDataStore().createQuery(getTClass()); - } - - @Override - default Query asQuery(ObjectId id) { - return asQuery().field("_id").equal(id); - } - - @Override - default Query asQuery(Instant createdUtc) { - String time = Integer.toHexString((int) createdUtc.getEpochSecond()); - return asQuery() - .field("_id").greaterThan(new ObjectId(time + "0000000000000000")) - .field("_id").lessThan(new ObjectId(time + "ffffffffffffffff")); - } - - @Override - default Optional> asQueryForIdOrTime(String idOrTime) { - return parse(idOrTime).map(id -> Optional.of(asQuery(id))) - .orElseGet(() -> Anvil.getEnvironmentManager().getCoreEnvironment() - .getInjector().getInstance(TimeFormatService.class).parseInstant(idOrTime) - .map(this::asQuery)); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseRepository.java deleted file mode 100644 index d079814fa..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseRepository.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.datastore.Repository; -import org.anvilpowered.anvil.api.model.ObjectWithId; -import org.anvilpowered.anvil.api.util.TimeFormatService; -import org.slf4j.Logger; - -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -public abstract class BaseRepository< - TKey, - T extends ObjectWithId, - TDataStore> - extends BaseComponent - implements Repository { - - @Inject - private Logger logger; - - @Override - public T generateEmpty() { - Class tClass = getTClass(); - try { - return tClass.getConstructor().newInstance(); - } catch (Exception e) { - String message = "There was an error creating an instance of " + tClass.getName() + "! Make sure it has an accessible no-args constructor!"; - logger.error(message); - throw new IllegalStateException(message, e); - } - } - - @Override - public CompletableFuture> parseAndGetOne(Object idOrTime) { - return parse(idOrTime).map(this::getOne).orElseGet(() -> - Anvil.getEnvironmentManager().getCoreEnvironment().getInjector() - .getInstance(TimeFormatService.class).parseInstant(idOrTime.toString()) - .map(this::getOne).orElse(CompletableFuture.completedFuture(Optional.empty()))); - } - - @Override - public CompletableFuture parseAndDeleteOne(Object idOrTime) { - return parse(idOrTime).map(this::deleteOne).orElseGet(() -> - Anvil.getEnvironmentManager().getCoreEnvironment().getInjector() - .getInstance(TimeFormatService.class).parseInstant(idOrTime.toString()) - .map(this::deleteOne).orElse(CompletableFuture.completedFuture(false))); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusCachedRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusCachedRepository.java deleted file mode 100644 index 3558b496f..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusCachedRepository.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import jetbrains.exodus.entitystore.Entity; -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.PersistentEntityStore; -import jetbrains.exodus.entitystore.StoreTransaction; -import org.anvilpowered.anvil.api.datastore.CacheService; -import org.anvilpowered.anvil.api.datastore.CachedRepository; -import org.anvilpowered.anvil.api.datastore.Repository; -import org.anvilpowered.anvil.api.model.ObjectWithId; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Function; - -@Deprecated // will probably break in 0.4 -public interface BaseXodusCachedRepository< - T extends ObjectWithId, - C extends CacheService> - extends BaseXodusRepository, CachedRepository { - - @Override - default CompletableFuture> insertOne(T item) { - return applyFromDBToCacheConditionally(() -> BaseXodusRepository.super.insertOne(item).join(), Repository::insertOne); - } - - @Override - default CompletableFuture> insert(List list) { - return applyFromDBToCache(() -> BaseXodusRepository.super.insert(list).join(), Repository::insert); - } - - @Override - default CompletableFuture> getOne(EntityId id) { - return applyToBothConditionally(c -> c.getOne(id).join(), () -> BaseXodusRepository.super.getOne(id).join()); - } - - @Override - default CompletableFuture delete(Function> query) { - return applyFromDBToCache(() -> - getDataStoreContext().getDataStore().computeInTransaction(txn -> { - List toDelete = new ArrayList<>(); - query.apply(txn).forEach(entity -> { - toDelete.add(entity.getId()); - entity.delete(); - }); - return txn.commit() ? toDelete : Collections.emptyList(); - }), (c, toDelete) -> toDelete.forEach(id -> c.deleteOne(id).join())) - .thenApplyAsync(result -> !result.isEmpty()); - } - - @Override - default CompletableFuture deleteOne(EntityId id) { - return applyFromDBToCache(() -> BaseXodusRepository.super.deleteOne(id).join(), (c, b) -> { - if (b) { - c.deleteOne(id).join(); - } - }); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusComponent.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusComponent.java deleted file mode 100644 index a063a6d78..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusComponent.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.PersistentEntityId; -import jetbrains.exodus.entitystore.PersistentEntityStore; -import org.anvilpowered.anvil.api.datastore.Component; - -import java.util.Optional; - -public interface BaseXodusComponent extends Component { - - @Override - default EntityId parseUnsafe(Object object) { - if (object instanceof EntityId) { - return (EntityId) object; - } else if (object instanceof Optional) { - Optional optional = (Optional) object; - if (optional.isPresent()) return parseUnsafe(optional.get()); - throw new IllegalArgumentException("Error while parsing " + object + ". Optional not present"); - } - String string = object.toString(); - String[] stringParts = string.split("-"); - if (stringParts.length != 2) { - throw new IllegalArgumentException("Not a valid EntityId. Must follow format (int)-(long)"); - } - return new PersistentEntityId(Integer.parseInt(stringParts[0]), Long.parseLong(stringParts[1])); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusRepository.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusRepository.java deleted file mode 100644 index 31ad01e43..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/datastore/BaseXodusRepository.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.datastore; - -import com.google.common.collect.ImmutableList; -import jetbrains.exodus.entitystore.Entity; -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.EntityIterable; -import jetbrains.exodus.entitystore.EntityIterator; -import jetbrains.exodus.entitystore.EntityRemovedInDatabaseException; -import jetbrains.exodus.entitystore.StoreTransaction; -import kotlin.collections.CollectionsKt; -import kotlin.sequences.SequencesKt; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.datastore.XodusRepository; -import org.anvilpowered.anvil.api.model.Mappable; -import org.anvilpowered.anvil.api.model.ObjectWithId; -import org.anvilpowered.anvil.api.util.TimeFormatService; - -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Function; - -public interface BaseXodusRepository< - T extends ObjectWithId> - extends XodusRepository, BaseXodusComponent { - - @Override - default CompletableFuture> insertOne(T item) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInTransaction(txn -> { - final Entity entity = txn.newEntity(getTClass().getSimpleName()); - ((Mappable) item).writeTo(entity); - item.setId(entity.getId()); - return txn.commit() ? Optional.of(item) : Optional.empty(); - }) - ); - } - - @Override - default CompletableFuture> insert(List list) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInTransaction(txn -> { - list.forEach(item -> { - final Entity entity = txn.newEntity(getTClass().getSimpleName()); - ((Mappable) item).writeTo(entity); - item.setId(entity.getId()); - }); - txn.commit(); - return list; - }) - ); - } - - @Override - default Iterator iterator(Function> query) { - return getDataStoreContext().getDataStore().computeInReadonlyTransaction(txn -> - SequencesKt.map(CollectionsKt.asSequence(query.apply(txn)), entity -> { - T item = generateEmpty(); - ((Mappable) item).readFrom(entity); - return item; - }).iterator() - ); - } - - default Iterator iterator() { - return iterator(txn -> txn.getAll(getTClass().getSimpleName())); - } - - @Override - default CompletableFuture> getAll(Function> query) { - return CompletableFuture.supplyAsync(() -> ImmutableList.copyOf(iterator(query))); - } - - @Override - default CompletableFuture> getAll() { - return CompletableFuture.supplyAsync(() -> ImmutableList.copyOf(iterator())); - } - - @Override - default CompletableFuture> getOne( - Function> query) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInReadonlyTransaction(txn -> { - Iterator iterator = query.apply(txn).iterator(); - if (iterator.hasNext()) { - T item = generateEmpty(); - ((Mappable) item).readFrom(iterator.next()); - return Optional.of(item); - } else { - return Optional.empty(); - } - }) - ); - } - - @Override - default CompletableFuture> getOne(EntityId id) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInReadonlyTransaction(txn -> { - Entity entity; - try { - entity = txn.getEntity(id); - } catch (EntityRemovedInDatabaseException ignored) { - return Optional.empty(); - } - T item = generateEmpty(); - ((Mappable) item).readFrom(entity); - return Optional.of(item); - }) - ); - } - - @Override - default CompletableFuture> getOne(Instant createdUtc) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInReadonlyTransaction(txn -> { - Entity entity; - try { - Iterator it = asQuery(createdUtc).apply(txn).iterator(); - if (!it.hasNext()) { - return Optional.empty(); - } - entity = it.next(); - } catch (EntityRemovedInDatabaseException ignored) { - return Optional.empty(); - } - T item = generateEmpty(); - ((Mappable) item).readFrom(entity); - return Optional.of(item); - }) - ); - } - - @Override - default CompletableFuture> getAllIds() { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInReadonlyTransaction(txn -> { - final EntityIterable iterable = txn.getAll(getTClass().getSimpleName()); - final EntityIterator iterator = iterable.iterator(); - final long roughCount = iterable.getRoughCount(); - final int buffer = 50; - int listSize = roughCount > Integer.MAX_VALUE - buffer - ? Integer.MAX_VALUE - buffer // woah - : (int) (roughCount + buffer); - final List list = new ArrayList<>(listSize); - while (iterator.hasNext()) { - list.add(iterator.nextId()); - } - if (iterator.shouldBeDisposed()) { - iterator.dispose(); - } - return list; - }) - ); - } - - @Override - default CompletableFuture delete( - Function> query) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInTransaction(txn -> { - boolean success = false; - for (Entity entity : query.apply(txn)) { - if (entity.delete()) { - success = true; - } - } - return txn.commit() && success; - }) - ); - } - - @Override - default CompletableFuture deleteOne(EntityId id) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInTransaction(txn -> - txn.getEntity(id).delete() && txn.commit()) - ); - } - - @Override - default CompletableFuture deleteOne(Instant createdUtc) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInTransaction(txn -> { - Iterator it = asQuery(createdUtc).apply(txn).iterator(); - return it.hasNext() && it.next().delete() && txn.commit(); - }) - ); - } - - @Override - default CompletableFuture update( - Function> query, - Consumer update) { - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInTransaction(txn -> { - query.apply(txn).forEach(e -> { - update.accept(e); - Instant now = OffsetDateTime.now(ZoneOffset.UTC).toInstant(); - e.setProperty("updatedUtcSeconds", now.getEpochSecond()); - e.setProperty("updatedUtcNanos", now.getNano()); - }); - return txn.commit(); - }) - ); - } - - @Override - default CompletableFuture update( - Optional>> optionalQuery, - Consumer update) { - return optionalQuery.map(q -> update(q, update)) - .orElse(CompletableFuture.completedFuture(false)); - } - - @Override - default Function> asQuery( - EntityId id) { - return txn -> Collections.singletonList(txn.getEntity(id)); - } - - @Override - default Function> asQuery( - Instant createdUtc) { - return txn -> txn.find(getTClass().getSimpleName(), - "createdUtcSeconds", createdUtc.getEpochSecond()) - .union(txn.find(getTClass().getSimpleName(), - "createdUtcNanos", createdUtc.getNano())); - } - - @Override - default Optional>> - asQueryForIdOrTime(String idOrTime) { - return parse(idOrTime).>>> - map(entityId -> Optional.of(asQuery(entityId))) - .orElseGet(() -> Anvil.getEnvironmentManager().getCoreEnvironment() - .getInjector().getInstance(TimeFormatService.class).parseInstant(idOrTime) - .map(Instant::getEpochSecond) - .map(s -> txn -> txn.find(getTClass().getSimpleName(), "createdUtcSeconds", s))); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/model/MongoDbo.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/model/MongoDbo.java deleted file mode 100644 index b82d42abc..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/model/MongoDbo.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.model; - -import dev.morphia.annotations.Id; -import dev.morphia.annotations.PrePersist; -import org.anvilpowered.anvil.api.model.ObjectWithId; -import org.bson.types.ObjectId; - -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; - -public abstract class MongoDbo implements ObjectWithId { - - @Id - private ObjectId id; - - private Instant updatedUtc; - - @Override - public ObjectId getId() { - return id; - } - - @Override - public void setId(ObjectId id) { - this.id = id; - } - - @Override - public String getIdAsString() { - return id.toHexString(); - } - - @Override - public Instant getCreatedUtc() { - return Instant.ofEpochSecond(id.getTimestamp()); - } - - @Override - public Instant getUpdatedUtc() { - return updatedUtc; - } - - @PrePersist - private void prePersist() { - updatedUtc = OffsetDateTime.now(ZoneOffset.UTC).toInstant(); - } -} - diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/model/XodusDbo.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/model/XodusDbo.java deleted file mode 100644 index 26845cb70..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/model/XodusDbo.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.model; - -import jetbrains.exodus.entitystore.Entity; -import jetbrains.exodus.entitystore.EntityId; -import org.anvilpowered.anvil.api.model.Mappable; -import org.anvilpowered.anvil.api.model.ObjectWithId; - -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; - -public abstract class XodusDbo implements ObjectWithId, Mappable { - - private EntityId id; - - private long createdUtcSeconds; - private int createdUtcNanos; - private long updatedUtcSeconds; - private int updatedUtcNanos; - - protected XodusDbo() { - Instant now = OffsetDateTime.now(ZoneOffset.UTC).toInstant(); - createdUtcSeconds = now.getEpochSecond(); - createdUtcNanos = now.getNano(); - prePersist(); - } - - @Override - public EntityId getId() { - return id; - } - - @Override - public void setId(EntityId id) { - this.id = id; - } - - @Override - public String getIdAsString() { - return id.toString(); - } - - @Override - public Instant getCreatedUtc() { - return Instant.ofEpochSecond(createdUtcSeconds, createdUtcNanos); - } - - @Override - public Instant getUpdatedUtc() { - return Instant.ofEpochSecond(updatedUtcSeconds, updatedUtcNanos); - } - - protected void prePersist() { - Instant now = OffsetDateTime.now(ZoneOffset.UTC).toInstant(); - updatedUtcSeconds = now.getEpochSecond(); - updatedUtcNanos = now.getNano(); - } - - @Override - public Entity writeTo(Entity object) { - // id cannot be written to object - object.setProperty("createdUtcSeconds", createdUtcSeconds); - object.setProperty("createdUtcNanos", createdUtcNanos); - object.setProperty("updatedUtcSeconds", updatedUtcSeconds); - object.setProperty("updatedUtcNanos", updatedUtcNanos); - return object; - } - - @Override - public void readFrom(Entity object) { - id = object.getId(); - Comparable createdUtcSeconds = object.getProperty("createdUtcSeconds"); - if (createdUtcSeconds instanceof Long) { - this.createdUtcSeconds = (Long) createdUtcSeconds; - } - Comparable createdUtcNanos = object.getProperty("createdUtcNanos"); - if (createdUtcNanos instanceof Integer) { - this.createdUtcNanos = (Integer) createdUtcNanos; - } - Comparable updatedUtcSeconds = object.getProperty("updatedUtcSeconds"); - if (updatedUtcSeconds instanceof Long) { - this.updatedUtcSeconds = (Long) updatedUtcSeconds; - } - Comparable updatedUtcNanos = object.getProperty("updatedUtcNanos"); - if (updatedUtcNanos instanceof Integer) { - this.updatedUtcNanos = (Integer) updatedUtcNanos; - } - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/plugin/BasePlugin.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/plugin/BasePlugin.java deleted file mode 100644 index dffec8f3f..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/plugin/BasePlugin.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.plugin; - -import com.google.common.base.MoreObjects; -import com.google.common.reflect.TypeToken; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Module; -import com.google.inject.TypeLiteral; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.Environment; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.checkerframework.checker.nullness.qual.Nullable; - -/** - * A helper class for quickly creating an environment. While not strictly necessary, it can - * simplify the start up process in most cases. - */ -@SuppressWarnings("UnstableApiUsage") -public abstract class BasePlugin { - - protected Environment environment; - - protected BasePlugin( - String name, - @Nullable Injector rootInjector, - @Nullable Module module, - Key... earlyServices - ) { - createDefaultBuilder(name, rootInjector, module) - .addEarlyServices(earlyServices) - .register(this); - } - - protected BasePlugin( - String name, - @Nullable Injector rootInjector, - @Nullable Module module, - Class... earlyServices - ) { - createDefaultBuilder(name, rootInjector, module) - .addEarlyServices(earlyServices) - .register(this); - } - - protected BasePlugin( - String name, - @Nullable Injector rootInjector, - @Nullable Module module, - TypeLiteral... earlyServices - ) { - createDefaultBuilder(name, rootInjector, module) - .addEarlyServices(earlyServices) - .register(this); - } - - protected BasePlugin( - String name, - @Nullable Injector rootInjector, - @Nullable Module module, - TypeToken... earlyServices - ) { - createDefaultBuilder(name, rootInjector, module) - .addEarlyServices(earlyServices) - .register(this); - } - - protected BasePlugin( - String name, - @Nullable Injector rootInjector, - @Nullable Module module - ) { - createDefaultBuilder(name, rootInjector, module) - .register(this); - } - - protected Environment.Builder createDefaultBuilder( - String name, - @Nullable Injector rootInjector, - @Nullable Module module - ) { - Environment.Builder builder = Anvil.getEnvironmentBuilder() - .setName(name) - .setRootInjector(rootInjector) - .whenLoaded(this::whenLoaded) - .whenReady(e -> environment = e) - .whenReady(this::whenReady) - .whenReloaded(this::whenReloaded); - if (module != null) { - builder.addModules(module); - } - applyToBuilder(builder); - return builder; - } - - protected void applyToBuilder(Environment.Builder builder) { - } - - private void sendLoaded(String status) { - PluginInfo pluginInfo = environment.getPluginInfo(); - environment.getTextService().builder() - .append(pluginInfo.getPrefix()) - .green().append(pluginInfo.getVersion()) - .aqua().append(" by ") - .appendJoining(", ", pluginInfo.getAuthors()) - .append(" - ", status, "!") - .sendToConsole(); - } - - protected void whenLoaded(Environment environment) { - } - - protected void whenReady(Environment environment) { - sendLoaded("Loaded"); - } - - protected void whenReloaded(Environment environment) { - sendLoaded("Reloaded"); - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this) - .add("name", environment == null ? "null" : environment.getName()) - .toString(); - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseConfigurationService.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseConfigurationService.java deleted file mode 100644 index 8697ac439..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseConfigurationService.java +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.registry; - -import com.google.common.reflect.Invokable; -import com.google.common.reflect.TypeToken; -import com.google.inject.Inject; -import com.google.inject.Singleton; -import ninja.leaping.configurate.ConfigurationOptions; -import ninja.leaping.configurate.commented.CommentedConfigurationNode; -import ninja.leaping.configurate.loader.ConfigurationLoader; -import ninja.leaping.configurate.objectmapping.ObjectMappingException; -import org.anvilpowered.anvil.api.registry.ConfigurationService; -import org.anvilpowered.anvil.api.registry.Key; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.RegistryScope; -import org.anvilpowered.anvil.api.registry.RegistryScoped; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Predicate; - -/** - * Service to load and save data from a config file - * - * @author Cableguy20 - */ -@Singleton -@SuppressWarnings({"unchecked", "UnstableApiUsage"}) -public class BaseConfigurationService extends BaseRegistry implements ConfigurationService { - - protected ConfigurationLoader configLoader; - private CommentedConfigurationNode rootConfigurationNode; - - /** - * Maps Keys to their verification function - */ - private final Map, Map, Function>> verificationMap; - - /** - * Maps ConfigKeys to configuration node names - */ - private final Map, String> nodeNameMap; - - /** - * Maps ConfigKeys to configuration node descriptions - */ - private final Map, String> nodeDescriptionMap; - - private boolean configValuesEdited; - private boolean isWithDataStore = false; - @Nullable - private ConfigurationOptions options; - - @Inject - public BaseConfigurationService(ConfigurationLoader configLoader) { - this.configLoader = configLoader; - verificationMap = new HashMap<>(); - nodeNameMap = new HashMap<>(); - nodeDescriptionMap = new HashMap<>(); - } - - protected void setOptions(@Nullable ConfigurationOptions options) { - this.options = options; - } - - protected void withCore() { - setName(Keys.SERVER_NAME, "server.name"); - setDescription(Keys.SERVER_NAME, "\nServer name"); - } - - private void withDataStoreCore0() { - setName(Keys.DATA_DIRECTORY, "datastore.dataDirectory"); - setName(Keys.DATA_STORE_NAME, "datastore.dataStoreName"); - setDescription(Keys.DATA_DIRECTORY, "\nDirectory for extra data" + - "\nPlease note that it is not recommended to change this value from the original"); - setDescription(Keys.DATA_STORE_NAME, "\nDetermines which storage option to use"); - } - - protected void withDataStoreCore() { - if (isWithDataStore) return; - isWithDataStore = true; - withDataStoreCore0(); - } - - protected void withDataStore() { - if (isWithDataStore) return; - isWithDataStore = true; - withDataStoreCore0(); - setName(Keys.USE_SHARED_CREDENTIALS, "datastore.anvil.useSharedCredentials"); - setName(Keys.USE_SHARED_ENVIRONMENT, "datastore.anvil.useSharedEnvironment"); - setDescription(Keys.USE_SHARED_CREDENTIALS, "\nWhether to use Anvil's shared credentials." - + "\nIf enabled, the following datastore settings will be inherited from Anvil's config (Requires useSharedEnvironment)" - + "\n\t- mongodb.authDb" - + "\n\t- mongodb.connectionString" - + "\n\t- mongodb.password" - + "\n\t- mongodb.username" - + "\n\t- mongodb.useAuth" - + "\n\t- mongodb.useConnectionString" - + "\n\t- mongodb.useSrv" - + "\nPlease note: If this is enabled, the values for above settings in this config file have no effect" - ); - setDescription(Keys.USE_SHARED_ENVIRONMENT, "\nWhether to use Anvil's shared environment." - + "\nIf enabled, the following datastore settings will be inherited from Anvil's config" - + "\n\t- mongodb.hostname" - + "\n\t- mongodb.port" - + "\nPlease note: If this is enabled, the values for above settings in this config file have no effect" - ); - } - - protected void withMongoDB() { - withDataStore(); - setName(Keys.MONGODB_CONNECTION_STRING, "datastore.mongodb.connectionString"); - setName(Keys.MONGODB_HOSTNAME, "datastore.mongodb.hostname"); - setName(Keys.MONGODB_PORT, "datastore.mongodb.port"); - setName(Keys.MONGODB_DBNAME, "datastore.mongodb.dbname"); - setName(Keys.MONGODB_USERNAME, "datastore.mongodb.username"); - setName(Keys.MONGODB_PASSWORD, "datastore.mongodb.password"); - setName(Keys.MONGODB_AUTH_DB, "datastore.mongodb.authDb"); - setName(Keys.MONGODB_USE_AUTH, "datastore.mongodb.useAuth"); - setName(Keys.MONGODB_USE_SRV, "datastore.mongodb.useSrv"); - setName(Keys.MONGODB_USE_CONNECTION_STRING, "datastore.mongodb.useConnectionString"); - setDescription(Keys.MONGODB_CONNECTION_STRING, "\n(Advanced) You will probably not need to use this." + - "\nCustom MongoDB connection string that will used instead of the connection info and credentials below" + - "\nWill only be used if useConnectionString=true"); - setDescription(Keys.MONGODB_HOSTNAME, "\nMongoDB hostname"); - setDescription(Keys.MONGODB_PORT, "\nMongoDB port"); - setDescription(Keys.MONGODB_DBNAME, "\nMongoDB database name"); - setDescription(Keys.MONGODB_USERNAME, "\nMongoDB username"); - setDescription(Keys.MONGODB_PASSWORD, "\nMongoDB password"); - setDescription(Keys.MONGODB_AUTH_DB, "\nMongoDB database to use for authentication"); - setDescription(Keys.MONGODB_USE_AUTH, "\nWhether to use authentication (username/password) for MongoDB connection"); - setDescription(Keys.MONGODB_USE_SRV, "\nWhether to interpret the MongoDB hostname as an SRV record"); - setDescription(Keys.MONGODB_USE_CONNECTION_STRING, "\n(Advanced) You will probably not need to use this." + - "\nWhether to use the connection string provided instead of the normal connection info and credentials" + - "\nOnly use this if you know what you are doing!" + - "\nPlease note that this plugin will inherit both useConnectionString and connectionString from" + - "\nAnvil if and only if useSharedEnvironment and useSharedCredentials are both true"); - } - - protected void withProxyMode() { - setName(Keys.PROXY_MODE, "server.proxyMode"); - setDescription(Keys.PROXY_MODE, "\nEnable this if your server is running behind a proxy" - + "\nIf true, this setting disables the join and chat listeners" - + "\nto prevent conflicts with the proxy's listeners."); - } - - protected void withDefault() { - withCore(); - withMongoDB(); - } - - protected void withAll() { - withDefault(); - withProxyMode(); - } - - protected void setVerification(Key key, - Map, Function> verification) { - verificationMap.put(key, - (Map, Function>) (Object) verification); - } - - protected void setName(Key key, String name) { - nodeNameMap.put(key, name); - } - - protected void setDescription(Key key, String description) { - nodeDescriptionMap.put(key, description); - } - - @Override - public void set(Key key, T value) { - super.set(key, value); - configValuesEdited = true; - } - - @Override - public void remove(Key key) { - super.remove(key); - configValuesEdited = true; - } - - @Override - public void transform(Key key, BiFunction, ? super T, ? extends T> transformer) { - super.transform(key, transformer); - configValuesEdited = true; - } - - @Override - public void transform(Key key, Function transformer) { - super.transform(key, transformer); - configValuesEdited = true; - } - - @Override - public void addToCollection(Key> key, T value) { - super.addToCollection(key, value); - configValuesEdited = true; - } - - @Override - public void removeFromCollection(Key> key, T value) { - super.removeFromCollection(key, value); - configValuesEdited = true; - } - - @Override - public void putInMap(Key> key, K mapKey, T mapValue) { - super.putInMap(key, mapKey, mapValue); - configValuesEdited = true; - } - - @Override - public void removeFromMap(Key> key, K mapKey) { - super.removeFromMap(key, mapKey); - configValuesEdited = true; - } - - @Override - public void load(RegistryScope registryScope) { - final int ordinal = registryScope.ordinal(); - if (ordinal <= RegistryScope.DEFAULT.ordinal()) { - loadDefaultScope(); - } - loadConfig(); - loadOrdinal(ordinal); - } - - @Override - public boolean save() { - if (configValuesEdited) { - for (Map.Entry, String> entry : nodeNameMap.entrySet()) { - CommentedConfigurationNode node = fromString(entry.getValue()); - try { - setNodeValue(node, entry.getKey()); - } catch (ObjectMappingException e) { - logger.error("Unable to set config value for " + entry.getKey(), e); - } - } - try { - configLoader.save(rootConfigurationNode); - configValuesEdited = false; - return true; - } catch (IOException e) { - e.printStackTrace(); - } - } - return false; - } - - private CommentedConfigurationNode fromString(String name) { - String[] path = name.split("[.]"); - CommentedConfigurationNode node = rootConfigurationNode; - for (String s : path) { - node = node.getNode(s); - } - return node; - } - - private void setNodeDefault(CommentedConfigurationNode node, Key key) throws ObjectMappingException { - T def = getDefault(key); - node.setValue(key.getType(), def); - set(key, def); - } - - private void setNodeValue(CommentedConfigurationNode node, Key key) throws ObjectMappingException { - node.setValue(key.getType(), getOrDefault(key)); - } - - @RegistryScoped - private void loadConfig() { - try { - if (options == null) { - rootConfigurationNode = configLoader.load(); - } else { - rootConfigurationNode = configLoader.load(options); - } - } catch (IOException e) { - e.printStackTrace(); - } - - int updatedCount = 0; - for (Map.Entry, String> entry : nodeNameMap.entrySet()) { - Key key = entry.getKey(); - CommentedConfigurationNode node = fromString(entry.getValue()); - if (node.isVirtual()) { - try { - setNodeDefault(node, key); - updatedCount++; - } catch (ObjectMappingException e) { - e.printStackTrace(); - } - } else { - boolean[] modified = {false}; - initConfigValue(key, node, modified); - if (modified[0]) { - updatedCount++; - } - } - - if (node.isVirtual() || !node.getComment().isPresent()) { - node.setComment(nodeDescriptionMap.get(key)); - updatedCount++; - } - } - if (updatedCount > 0) { - try { - configLoader.save(rootConfigurationNode); - configValuesEdited = false; - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - @Nullable - private T initConfigValue(Key key, CommentedConfigurationNode node, boolean[] modified) { - return initConfigValue(key, key.getType(), node, modified); - } - - /** - * @param typeToken {@link TypeToken} of node to parse. Pass a {@link Key} to save that value to the registry - * @param node {@link CommentedConfigurationNode} to get value from - */ - @Nullable - private T initConfigValue(@Nullable Key key, TypeToken typeToken, CommentedConfigurationNode node, boolean[] modified) { - - // it ain't pretty but it works - - if (key != null && typeToken.isSubtypeOf(List.class)) { - - // *** unwrap list *** // - try { - - Method getMethod = List.class.getMethod("get", int.class); - Invokable invokable = typeToken.method(getMethod); - T list = (T) verify(verificationMap.get(key), node.getList(invokable.getReturnType()), node, modified); - - set(key, list); - - return list; - - } catch (NoSuchMethodException | IllegalArgumentException | ObjectMappingException e) { - e.printStackTrace(); - return null; - } - - } else if (typeToken.isSubtypeOf(Map.class)) { - - // *** unwrap map *** // - try { - - Method getMethod = Map.class.getMethod("get", Object.class); - Invokable invokable = typeToken.method(getMethod); - TypeToken subType = invokable.getReturnType(); - - Map result = new HashMap<>(); - - for (Map.Entry entry : node.getChildrenMap().entrySet()) { - // here comes the recursion - result.put(entry.getValue().getKey(), initConfigValue(null, subType, entry.getValue(), modified)); - } - - if (key != null) { - T map = (T) verify(verificationMap.get(key), result, node, modified); - set(key, map); - } - - return (T) result; - - } catch (NoSuchMethodException | IllegalArgumentException e) { - e.printStackTrace(); - return null; - } - } else if (key != null) { - try { - T value = node.getValue(typeToken); - set(key, (T) verify(verificationMap.get(key), value, node, modified)); - return value; - } catch (ClassCastException | ObjectMappingException e) { - e.printStackTrace(); - return null; - } - } else { - try { - return node.getValue(typeToken); - } catch (ObjectMappingException e) { - e.printStackTrace(); - return null; - } - } - } - - private T verify(Map, Function> verificationMap, T value, CommentedConfigurationNode node, boolean[] modified) { - if (verificationMap == null) return value; // if there is no verification function defined - T result = value; - for (Map.Entry, Function> entry : verificationMap.entrySet()) { - if (entry.getKey().test(result)) { - modified[0] = true; - result = entry.getValue().apply(result); - } - } - if (modified[0]) { - node.setValue(result); - } - return result; - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseExtendedRegistry.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseExtendedRegistry.java deleted file mode 100644 index b9437a275..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseExtendedRegistry.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.registry; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import org.anvilpowered.anvil.api.registry.ConfigurationService; -import org.anvilpowered.anvil.api.registry.Key; -import org.anvilpowered.anvil.api.registry.RegistryScope; - -import java.util.Optional; - -/** - * A registry that is backed by the configuration service - */ -@Singleton -@SuppressWarnings("unchecked") -public class BaseExtendedRegistry extends BaseRegistry { - - @Inject - protected ConfigurationService configurationService; - - @Override - public Optional get(Key key) { - Optional result = super.get(key); - return result.isPresent() ? result : configurationService.get(key); - } - - @Override - public T getDefault(Key key) { - T result = (T) defaultMap.get(key); - return result == null ? configurationService.getDefault(key) : result; - } - - @Override - public void load(RegistryScope registryScope) { - configurationService.load(registryScope); - super.load(registryScope); - } - - @Override - public String toString() { - if (configurationService == null) { - return super.toString(); - } else { - return super.toString() + "\n" + configurationService; - } - } -} diff --git a/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseRegistry.java b/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseRegistry.java deleted file mode 100644 index 08e1999be..000000000 --- a/anvil-api/src/main/java/org/anvilpowered/anvil/base/registry/BaseRegistry.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.base.registry; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.registry.Key; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.api.registry.RegistryScope; -import org.anvilpowered.anvil.api.registry.RegistryScoped; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.slf4j.Logger; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.Set; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; - -@Singleton -@SuppressWarnings("unchecked") -public class BaseRegistry implements Registry { - - @Inject - protected Logger logger; - - final Map, Object> defaultMap, valueMap; - private final Map> listeners; - private Registry coreRegistry; - @Nullable - private String stringRepresentation; - - public BaseRegistry() { - defaultMap = new HashMap<>(); - valueMap = new HashMap<>(); - listeners = new HashMap<>(); - } - - @Override - public T getUnsafe(Key key) { - T t = (T) valueMap.get(key); - if (t == null) { - throw new NoSuchElementException("Could not find value for key " + key); - } - return t; - } - - @Override - public Optional get(Key key) { - return Optional.ofNullable((T) valueMap.get(key)); - } - - @Override - public T getDefault(Key key) { - T result = (T) defaultMap.get(key); - return result == null ? key.getFallbackValue() : result; - } - - @Override - public void set(Key key, T value) { - valueMap.put(key, value); - stringRepresentation = null; - } - - @RegistryScoped - protected void setDefault(Key key, T value) { - defaultMap.put(key, value); - stringRepresentation = null; - } - - @Override - public T getExtraSafe(Key key) { - if (coreRegistry == null) { - coreRegistry = Anvil.getRegistry(); - } - if (this != coreRegistry - && getOrDefault(Keys.USE_SHARED_ENVIRONMENT)) { - if (key.equals(Keys.DATA_STORE_NAME) - || key.equals(Keys.MONGODB_HOSTNAME) - || key.equals(Keys.MONGODB_PORT) - || key.equals(Keys.MONGODB_USE_SRV)) { - return coreRegistry.getOrDefault(key); - } else if (getOrDefault(Keys.USE_SHARED_CREDENTIALS)) { - if (key.equals(Keys.MONGODB_USE_CONNECTION_STRING) - || key.equals(Keys.MONGODB_CONNECTION_STRING) - || key.equals(Keys.MONGODB_USERNAME) - || key.equals(Keys.MONGODB_PASSWORD) - || key.equals(Keys.MONGODB_AUTH_DB) - || key.equals(Keys.MONGODB_USE_AUTH)) { - return coreRegistry.getOrDefault(key); - } - } - } - return getOrDefault(key); - } - - @Override - public void remove(Key key) { - valueMap.remove(key); - stringRepresentation = null; - } - - @Override - public void transform(Key key, BiFunction, ? super T, ? extends T> transformer) { - valueMap.compute(key, (BiFunction, ? super Object, ?>) transformer); - stringRepresentation = null; - } - - @Override - public void transform(Key key, Function transformer) { - transform(key, (k, v) -> transformer.apply((T) v)); - stringRepresentation = null; - } - - @Override - public void addToCollection(Key> key, T value) { - ((Collection) valueMap.get(key)).add(value); - stringRepresentation = null; - } - - @Override - public void removeFromCollection(Key> key, T value) { - ((Collection) valueMap.get(key)).remove(value); - stringRepresentation = null; - } - - @Override - public void putInMap(Key> key, K mapKey, T mapValue) { - ((Map) valueMap.get(key)).put(mapKey, mapValue); - stringRepresentation = null; - } - - @Override - public void removeFromMap(Key> key, K mapKey) { - ((Map) valueMap.get(key)).remove(mapKey); - stringRepresentation = null; - } - - @Override - public ListenerRegistrationEnd whenLoaded(Runnable listener) { - return new ListenerRegistrationEndImpl(listener); - } - - private class ListenerRegistrationEndImpl implements ListenerRegistrationEnd { - - private final Runnable listener; - private int order; - private RegistryScope registryScope; - - public ListenerRegistrationEndImpl(Runnable listener) { - this.listener = listener; - order = 0; - registryScope = RegistryScope.DEFAULT; - } - - @Override - public ListenerRegistrationEnd order(int order) { - this.order = order; - return this; - } - - @Override - public ListenerRegistrationEnd scope(RegistryScope registryScope) { - this.registryScope = registryScope; - return this; - } - - @Override - public void register() { - listeners.computeIfAbsent(order, o -> new HashMap<>()) - .put(listener, registryScope); - } - } - - @Override - public void load(RegistryScope registryScope) { - final int ordinal = registryScope.ordinal(); - if (ordinal <= RegistryScope.DEFAULT.ordinal()) { - loadDefaultScope(); - } - loadOrdinal(ordinal); - } - - protected final void loadOrdinal(int ordinal) { - listeners.entrySet().stream() - .sorted(Map.Entry.comparingByKey()) - .forEach(e -> e.getValue().forEach((r, c) -> { - if (ordinal <= c.ordinal()) { - r.run(); - } - })); - } - - /** - * Override this method to load values into this registry on normal reloads - */ - @RegistryScoped - protected void loadDefaultScope() { - } - - @Override - public String toString() { - if (stringRepresentation != null) { - return stringRepresentation; - } - Set> keys = new HashSet<>(); - int[] width = {0, 32, 32}; - Consumer> addToKeys = key -> { - final int keyLength = key.toString().length(); - if (keyLength > width[0]) { - width[0] = keyLength; - } - keys.add(key); - }; - valueMap.keySet().forEach(addToKeys); - defaultMap.keySet().forEach(addToKeys); - width[0] += 5; - return stringRepresentation = String.format("%-" + width[0] + "s", "Key") - + String.format("%-" + width[1] + "s", "Value") - + String.format("%-" + width[2] + "s", "Default") - + '\n' - + keys.stream().map(key -> - String.format("%-" + width[0] + "s", key.toString()) - + String.format("%-" + width[1] + "s", valueMap.get(key)) - + String.format("%-" + width[2] + "s", defaultMap.get(key)) - ).collect(Collectors.joining("\n")); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/api/AnvilImpl.java b/anvil-common/src/main/java/org/anvilpowered/anvil/api/AnvilImpl.java deleted file mode 100644 index a7dc11494..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/api/AnvilImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.inject.Injector; -import com.google.inject.Module; -import org.anvilpowered.anvil.common.plugin.AnvilPluginInfo; -import org.slf4j.Logger; - -public class AnvilImpl extends Anvil { - - public AnvilImpl(Injector injector, Module module) { - super(AnvilPluginInfo.id, injector, module); - } - - @Override - protected void applyToBuilder(Environment.Builder builder) { - builder.withRootCommand(); - } - - public static Logger getLogger() { - return environment.getInjector().getInstance(Logger.class); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentBuilderImpl.java b/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentBuilderImpl.java deleted file mode 100644 index 1e91c4d34..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentBuilderImpl.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.common.base.Preconditions; -import com.google.common.reflect.TypeToken; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Module; -import com.google.inject.TypeLiteral; -import com.google.inject.name.Names; -import com.google.inject.util.Modules; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.api.registry.RegistryScope; -import org.anvilpowered.anvil.common.module.PlatformModule; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -public class EnvironmentBuilderImpl implements Environment.Builder { - - private String name; - @Nullable - private Injector rootInjector; - private Object plugin; - private Supplier loggerSupplier; - private boolean withRootCommand = false; - private final Collection modules; - private final Map, Consumer> earlyServices; - private final Collection> loadedListeners; - private final Collection> readyListeners; - private final Collection> reloadedListeners; - private static final Collection builders = new ArrayList<>(); - private static boolean alreadyCompleted = false; - - public static void completeInitialization(Module platformModule, Module fallbackModule) { - if (alreadyCompleted) { - throw new IllegalStateException("This method should only be called exactly once (in Anvil Common)"); - } - alreadyCompleted = true; - Map>> loadedListeners = new HashMap<>(); - Map>> readyListeners = new HashMap<>(); - Map>> reloadedListeners = new HashMap<>(); - List environments = builders.stream().map(builder -> { - final String name = builder.name; - loadedListeners.put(name, builder.loadedListeners); - readyListeners.put(name, builder.readyListeners); - reloadedListeners.put(name, builder.reloadedListeners); - List modules = new ArrayList<>(); - modules.add(Modules.override(fallbackModule).with(builder.modules)); - return new EnvironmentImpl( - builder.rootInjector, - name, - builder.plugin, - builder.loggerSupplier, - builder.withRootCommand, - modules, - builder.earlyServices - ); - }).collect(Collectors.toList()); - AbstractModule commonModule = new AbstractModule() { - @Override - protected void configure() { - for (EnvironmentImpl environment : environments) { - bind(Environment.class) - .annotatedWith(Names.named(environment.getName())) - .toInstance(environment); - } - } - }; - environments.sort(Comparator.naturalOrder()); - for (EnvironmentImpl environment : environments) { - environment.addModule(platformModule); - environment.addModule(commonModule); - environment.addModule(new AbstractModule() { - @Override - protected void configure() { - bind(ClassLoader.class).toInstance(environment.getPlugin() - .getClass().getClassLoader()); - bind(Environment.class).toInstance(environment); - if (platformModule instanceof PlatformModule) { - Platform platform = ((PlatformModule) platformModule).getPlatform(); - if (platform instanceof PlatformImpl) { - ((PlatformImpl) platform).bindLoggerOptionally(environment, binder()); - } - } - } - }); - Injector injector = environment.getInjector(); - if (injector != null) { - injector = injector.createChildInjector(environment.getModules()); - } else { - injector = Guice.createInjector(environment.getModules()); - } - environment.setInjector(injector); - if ("anvil".equals(environment.getName())) { - Anvil.environment = environment; - ((ServiceManagerImpl) Anvil.getServiceManager()) - .setInjector(injector); - } - ServiceManagerImpl.environmentManager - .registerEnvironment(environment, environment.getPlugin()); - for (Map.Entry, Consumer> entry - : environment.getEarlyServices().entrySet()) { - ((Consumer) entry.getValue()) - .accept(injector.getInstance(entry.getKey())); - } - if (environment.withRootCommand()) { - environment.getInstance(CommandNode.class.getCanonicalName()); - } - Registry registry = injector.getInstance(Registry.class); - for (Consumer listener - : loadedListeners.get(environment.getName())) { - registry.whenLoaded(() -> listener.accept(environment)).register(); - } - registry.load(RegistryScope.DEEP); - for (Consumer listener - : reloadedListeners.get(environment.getName())) { - registry.whenLoaded(() -> listener.accept(environment)).register(); - } - for (Consumer listener - : readyListeners.get(environment.getName())) { - listener.accept(environment); - } - } - } - - EnvironmentBuilderImpl() { - modules = new ArrayList<>(); - earlyServices = new HashMap<>(); - loadedListeners = new ArrayList<>(); - readyListeners = new ArrayList<>(); - reloadedListeners = new ArrayList<>(); - } - - @Override - public Environment.Builder addModules(Module... modules) { - this.modules.addAll(Arrays.asList(modules)); - return this; - } - - @Override - public Environment.Builder addModules(Iterable modules) { - modules.forEach(this.modules::add); - return this; - } - - private Environment.Builder addEarlyServices( - Stream keys, - Function> keyTransformer - ) { - keys.forEach(key -> earlyServices.put(keyTransformer.apply(key), t -> { - })); - return this; - } - - @Override - public Environment.Builder addEarlyServices(Key... keys) { - return addEarlyServices(Stream.of(keys), Function.identity()); - } - - @Override - public Environment.Builder addEarlyServices(Iterable> keys) { - return addEarlyServices(StreamSupport.stream(keys.spliterator(), false), - Function.identity()); - } - - @Override - public Environment.Builder addEarlyServices(Class... classes) { - return addEarlyServices(Stream.of(classes), Key::get); - } - - @Override - public Environment.Builder addEarlyServices(TypeLiteral... typeLiterals) { - return addEarlyServices(Stream.of(typeLiterals), Key::get); - } - - @Override - public Environment.Builder addEarlyServices(TypeToken... typeTokens) { - return addEarlyServices(Stream.of(typeTokens), BindingExtensions::getKey); - } - - @Override - public Environment.Builder addEarlyServices(Key key, Consumer initializer) { - earlyServices.put(key, initializer); - return this; - } - - @Override - public Environment.Builder addEarlyServices(Class clazz, Consumer initializer) { - earlyServices.put(Key.get(clazz), initializer); - return this; - } - - @Override - public Environment.Builder addEarlyServices(TypeLiteral typeLiteral, Consumer initializer) { - earlyServices.put(Key.get(typeLiteral), initializer); - return this; - } - - @Override - public Environment.Builder addEarlyServices(TypeToken typeToken, Consumer initializer) { - earlyServices.put(BindingExtensions.getKey(typeToken), initializer); - return this; - } - - @Override - public Environment.Builder setName(String name) { - if (name == null || name.isEmpty()) { - throw new IllegalStateException("Name may not be null or empty"); - } - this.name = name; - return this; - } - - @Override - public Environment.Builder setRootInjector(@Nullable Injector rootInjector) { - this.rootInjector = rootInjector; - return this; - } - - @Override - public Environment.Builder setLoggerSupplier(Supplier logger) { - this.loggerSupplier = logger; - return this; - } - - @Override - public Environment.Builder withRootCommand() { - withRootCommand = true; - return this; - } - - @Override - public Environment.Builder whenLoaded(Consumer listener) { - loadedListeners.add(listener); - return this; - } - - @Override - public Environment.Builder whenReady(Consumer listener) { - readyListeners.add(listener); - return this; - } - - @Override - public Environment.Builder whenReloaded(Consumer listener) { - reloadedListeners.add(listener); - return this; - } - - @Override - public void register(Object plugin) { - Preconditions.checkNotNull(name, "name"); - Preconditions.checkNotNull(plugin, "plugin"); - this.plugin = plugin; - builders.add(this); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentImpl.java b/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentImpl.java deleted file mode 100644 index c6cdb25ad..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentImpl.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Module; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.api.util.TextService; - -import java.util.Collection; -import java.util.Map; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class EnvironmentImpl implements Environment { - - private Injector injector; - private final String name; - private final Object plugin; - private final Supplier loggerSupplier; - private final boolean withRootCommand; - private final Collection modules; - private final Map, Consumer> earlyServices; - - EnvironmentImpl( - Injector injector, - String name, - Object plugin, - Supplier loggerSupplier, - boolean withRootCommand, - Collection modules, - Map, Consumer> earlyServices - ) { - this.injector = injector; - this.name = name; - this.plugin = plugin; - if (loggerSupplier == null) { - this.loggerSupplier = () -> null; - } else { - this.loggerSupplier = loggerSupplier; - } - this.withRootCommand = withRootCommand; - this.modules = modules; - this.earlyServices = earlyServices; - } - - void setInjector(Injector injector) { - this.injector = injector; - } - - public Supplier getLoggerSupplier() { - return loggerSupplier; - } - - boolean withRootCommand() { - return withRootCommand; - } - - void addModule(Module module) { - this.modules.add(module); - } - - Collection getModules() { - return modules; - } - - Map, Consumer> getEarlyServices() { - return earlyServices; - } - - @Override - public void reload() { - getRegistry().load(); - } - - @Override - public String getName() { - return name; - } - - @Override - public Injector getInjector() { - return injector; - } - - @Override - public Object getPlugin() { - return plugin; - } - - @Override - public PluginInfo getPluginInfo() { - return getInstance(PluginInfo.class.getCanonicalName()); - } - - @Override - public TextService getTextService() { - return getInstance(TextService.class.getCanonicalName()); - } - - @Override - public Registry getRegistry() { - return getInjector().getInstance(Registry.class); - } - - @Override - public int compareTo(Environment o) { - return getName().compareTo(o.getName()); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof Environment && getName().equals(((Environment) obj).getName()); - } - - @Override - public String toString() { - return name; - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentManagerImpl.java b/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentManagerImpl.java deleted file mode 100644 index 1f208648f..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/api/EnvironmentManagerImpl.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.common.base.Preconditions; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.TreeSet; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -class EnvironmentManagerImpl implements EnvironmentManager{ - - private final Map environments; - final Map> pluginEnvironmentMap; - - public EnvironmentManagerImpl() { - environments = new HashMap<>(); - pluginEnvironmentMap = new HashMap<>(); - } - - @Override - public Environment getCoreEnvironment() { - return Preconditions.checkNotNull(environments.get("anvil"), - "Global environment not loaded"); - } - - @Override - public Environment getEnvironmentUnsafe(String name) { - return Preconditions.checkNotNull(environments.get(name), - "Could not find environment " + name); - } - - @Override - public Map getEnvironments() { - return Collections.unmodifiableMap(environments); - } - - @Override - public Stream getEnvironmentsAsStream(Pattern pattern) { - return environments.entrySet().stream().filter(e -> - pattern.matcher(e.getKey()).matches() - ).map(Map.Entry::getValue); - } - - @Override - public List getEnvironments(Pattern pattern) { - return getEnvironmentsAsStream(pattern).collect(Collectors.toList()); - } - - @Override - public Optional getEnvironment(Pattern pattern) { - return getEnvironmentsAsStream(pattern).findAny(); - } - - @Override - public Optional getEnvironment(String name) { - return Optional.ofNullable(environments.get(name)); - } - - void registerEnvironment(Environment environment, Object plugin) { - final String name = environment.getName(); - if (environments.containsKey(name)) { - throw new IllegalArgumentException("Environment " + name + " already exists"); - } - environments.put(name, environment); - Set envs = pluginEnvironmentMap.get(plugin); - if (envs == null) { - envs = new TreeSet<>(); - envs.add(environment); - pluginEnvironmentMap.put(plugin, envs); - } else { - envs.add(environment); - } - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/api/PlatformImpl.java b/anvil-common/src/main/java/org/anvilpowered/anvil/api/PlatformImpl.java deleted file mode 100644 index 08c669282..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/api/PlatformImpl.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.inject.Binder; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.function.BiConsumer; - -public class PlatformImpl implements Platform { - - private final boolean isProxy; - private final String name; - @Nullable - private final BiConsumer loggerBinder; - - public PlatformImpl( - boolean isProxy, - String name, - @Nullable BiConsumer loggerBinder - ) { - this.isProxy = isProxy; - this.name = name; - this.loggerBinder = loggerBinder; - } - - public PlatformImpl(boolean isProxy, String name) { - this(isProxy, name, null); - } - - @Override - public boolean isProxy() { - return isProxy; - } - - public void bindLoggerOptionally(Environment environment, Binder binder) { - if (loggerBinder != null) { - loggerBinder.accept(environment, binder); - } - } - - @Override - public String getName() { - return name; - } - - @Override - public String toString() { - return String.format("Platform(isProxy=%s, name=%s)", isProxy, name); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/api/ServiceManagerImpl.java b/anvil-common/src/main/java/org/anvilpowered/anvil/api/ServiceManagerImpl.java deleted file mode 100644 index 95ed3a40a..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/api/ServiceManagerImpl.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api; - -import com.google.common.reflect.TypeToken; -import com.google.inject.Injector; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.anvilpowered.anvil.common.misc.CommonBindingExtensions; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Supplier; - -@SuppressWarnings({"unchecked", "unused", "UnstableApiUsage"}) -class ServiceManagerImpl implements ServiceManager { - - private final Map, Supplier> supplierBindings; - private final Map, Function> functionBindings; - private Injector injector; - static final EnvironmentManagerImpl environmentManager - = new EnvironmentManagerImpl(); - - public ServiceManagerImpl() { - supplierBindings = new HashMap<>(); - functionBindings = new HashMap<>(); - registerBinding(EnvironmentManager.class, () -> environmentManager); - registerBinding(Environment.Builder.class, EnvironmentBuilderImpl::new); - registerBinding(BindingExtensions.class, CommonBindingExtensions::new); - } - - void setInjector(Injector injector) { - this.injector = injector; - } - - @Override - public Supplier provideSupplier(TypeToken typeToken) { - Supplier supplier = (Supplier) supplierBindings.get(typeToken); - if (supplier != null) { - return supplier; - } - return () -> injector.getInstance(BindingExtensions.getKey(typeToken)); - } - - @Override - public Supplier provideSupplier(Class clazz) { - return provideSupplier(TypeToken.of(clazz)); - } - - @Override - public Supplier provideSupplier(String name) { - Supplier[] suppliers = new Supplier[1]; - for (Map.Entry, Supplier> entry : supplierBindings.entrySet()) { - if (entry.getKey().getRawType().getName().equalsIgnoreCase(name)) { - suppliers[0] = (Supplier) entry.getValue(); - break; - } - } - if (suppliers[0] != null) { - return suppliers[0]; - } - return () -> Environment.getInstance(name, injector); - } - - @Override - public Function provideFunction(TypeToken typeToken) { - Function function = (Function) functionBindings.get(typeToken); - if (function != null) { - return function; - } - return injector -> ((Injector) injector) - .getInstance(BindingExtensions.getKey(typeToken)); - } - - @Override - public Function provideFunction(Class clazz) { - return provideFunction(TypeToken.of(clazz)); - } - - @Override - public Function provideFunction(String name) { - Function[] functions = new Function[1]; - for (Map.Entry, Function> entry : functionBindings.entrySet()) { - if (entry.getKey().getRawType().getName().equalsIgnoreCase(name)) { - functions[0] = (Function) entry.getValue(); - break; - } - } - if (functions[0] != null) { - return functions[0]; - } - return injector -> Environment.getInstance(name, (Injector) injector); - } - - @Override - public T provide(TypeToken typeToken) { - return provideSupplier(typeToken).get(); - } - - @Override - public T provide(Class clazz) { - return provideSupplier(clazz).get(); - } - - @Override - public T provide(String name) { - return this.provideSupplier(name).get(); - } - - @Override - public R provide(TypeToken typeToken, T input) { - return provideFunction(typeToken).apply(input); - } - - @Override - public R provide(Class clazz, T input) { - return provideFunction(clazz).apply(input); - } - - @Override - public R provide(String name, T input) { - return this.provideFunction(name).apply(input); - } - - @Override - public void registerBinding(TypeToken typeToken, Supplier supplier) { - supplierBindings.put(typeToken, supplier); - } - - @Override - public void registerBinding(Class clazz, Supplier supplier) { - supplierBindings.put(TypeToken.of(clazz), supplier); - } - - @Override - public void registerBinding(TypeToken typeToken, Function function) { - functionBindings.put(typeToken, function); - } - - @Override - public void registerBinding(Class clazz, Function function) { - functionBindings.put(TypeToken.of(clazz), function); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilCommandNode.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilCommandNode.java deleted file mode 100644 index c947e944a..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilCommandNode.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command; - -import com.google.common.base.Preconditions; -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.Environment; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.api.command.CommandService; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.common.plugin.AnvilPluginInfo; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Predicate; - -public abstract class CommonAnvilCommandNode - implements CommandNode { - - protected static final List PLUGINS_ALIAS = Collections.singletonList("plugins"); - protected static final List RELOAD_ALIAS = Collections.singletonList("reload"); - protected static final List REGEDIT_ALIAS = Collections.singletonList("regedit"); - protected static final List HELP_ALIAS = Collections.singletonList("help"); - protected static final List VERSION_ALIAS = Collections.singletonList("version"); - - protected static final String PLUGINS_DESCRIPTION - = String.format("%s plugins command", AnvilPluginInfo.name); - protected static final String RELOAD_DESCRIPTION - = String.format("%s reload command", AnvilPluginInfo.name); - protected static final String REGEDIT_DESCRIPTION - = String.format("%s regedit command", AnvilPluginInfo.name); - protected static final String HELP_DESCRIPTION - = String.format("%s help command", AnvilPluginInfo.name); - protected static final String VERSION_DESCRIPTION - = String.format("%s version command", AnvilPluginInfo.name); - protected static final String ROOT_DESCRIPTION - = String.format("%s root command", AnvilPluginInfo.name); - - protected static final String RELOAD_USAGE = "[-a|--all|-r|--regex] []"; - protected static final String REGEDIT_USAGE - = "[cancel|select|commit|start|key] [||] [info|set|unset|unstage] []"; - - protected static final String HELP_COMMAND = "/anvil help"; - - private boolean alreadyLoaded; - protected Map, Function> descriptions; - protected Map, Predicate> permissions; - protected Map, Function> usages; - - @Inject - protected CommandService commandService; - - @Inject - protected Environment environment; - - protected Registry registry; - - protected CommonAnvilCommandNode(Registry registry) { - this.registry = registry; - registry.whenLoaded(() -> { - if (alreadyLoaded) return; - loadCommands(); - alreadyLoaded = true; - }).register(); - alreadyLoaded = false; - descriptions = new HashMap<>(); - permissions = new HashMap<>(); - usages = new HashMap<>(); - descriptions.put(PLUGINS_ALIAS, c -> PLUGINS_DESCRIPTION); - descriptions.put(RELOAD_ALIAS, c -> RELOAD_DESCRIPTION); - descriptions.put(REGEDIT_ALIAS, c -> REGEDIT_DESCRIPTION); - descriptions.put(HELP_ALIAS, c -> HELP_DESCRIPTION); - descriptions.put(VERSION_ALIAS, c -> VERSION_DESCRIPTION); - usages.put(RELOAD_ALIAS, c -> RELOAD_USAGE); - usages.put(REGEDIT_ALIAS, c -> REGEDIT_USAGE); - } - - protected abstract void loadCommands(); - - private static final String ERROR_MESSAGE = "Anvil command has not been loaded yet"; - - @Nullable - private static String alias; - - public static String getAlias() { - if (alias == null) { - switch (Anvil.getPlatform().getName()) { - case "bungee": - alias = "anvilb"; - break; - case "velocity": - alias = "anvilv"; - break; - default: - alias = "anvil"; - break; - } - } - return alias; - } - - @Override - public Map, Function> getDescriptions() { - return Preconditions.checkNotNull(descriptions, ERROR_MESSAGE); - } - - @Override - public Map, Predicate> getPermissions() { - return Preconditions.checkNotNull(permissions, ERROR_MESSAGE); - } - - @Override - public Map, Function> getUsages() { - return Preconditions.checkNotNull(usages, ERROR_MESSAGE); - } - - @Override - public String getName() { - return getAlias(); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilPluginsCommand.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilPluginsCommand.java deleted file mode 100644 index 2c2f917cf..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilPluginsCommand.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.plugin.PluginMessages; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.api.util.PermissionService; -import org.anvilpowered.anvil.api.util.TextService; -import org.jetbrains.annotations.Nullable; - -public class CommonAnvilPluginsCommand { - - @Inject - protected PermissionService permissionService; - - @Inject - protected PluginInfo pluginInfo; - - @Inject - protected PluginMessages pluginMessages; - - @Inject - protected Registry registry; - - @Inject - protected TextService textService; - - public void execute(TCommandSource source) { - execute(source, null); - } - - public void execute(TCommandSource source, String @Nullable [] context) { - if (permissionService.hasPermission(source, - registry.getOrDefault(Keys.PLUGINS_PERMISSION))) { - executeDirect(source); - } else { - textService.send(pluginMessages.getNoPermission(), source); - } - } - - public void executeDirect(TCommandSource source) { - String[] names = Anvil.getEnvironmentManager() - .getEnvironments().values() - .stream() - .map(e -> e.getPluginInfo().getName()) - .sorted().toArray(String[]::new); - textService.builder() - .append(pluginInfo.getPrefix()) - .green().append("Plugins (", names.length, "): ") - .appendJoining(", ", names) - .sendTo(source); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilReloadCommand.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilReloadCommand.java deleted file mode 100644 index 757acd7eb..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonAnvilReloadCommand.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.Environment; -import org.anvilpowered.anvil.api.misc.Named; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.plugin.PluginMessages; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.api.util.PermissionService; -import org.anvilpowered.anvil.api.util.TextService; -import org.jetbrains.annotations.Contract; - -import java.util.List; -import java.util.Optional; -import java.util.function.Function; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; -import java.util.stream.Collectors; - -public class CommonAnvilReloadCommand { - - private static final Function reloadEnvironment = e -> { - e.reload(); - return e.getPluginInfo().getName(); - }; - - @Inject - protected PermissionService permissionService; - - @Inject - protected PluginInfo pluginInfo; - - @Inject - protected PluginMessages pluginMessages; - - @Inject - protected Registry registry; - - @Inject - protected TextService textService; - - public void execute(TCommandSource source, String[] context) { - if (permissionService.hasPermission(source, - registry.getOrDefault(Keys.RELOAD_PERMISSION))) { - executeDirect(source, context); - } else { - textService.send(pluginMessages.getNoPermission(), source); - } - } - - public List suggest() { - List suggestions = Anvil.getEnvironmentManager() - .getEnvironments().values().stream() - .map(Named::getName) - .sorted().collect(Collectors.toList()); - suggestions.add("--all"); - suggestions.add("--regex"); - return suggestions; - } - - public List suggest(TCommandSource source, String[] context) { - return suggest(); - } - - public void executeDirect(TCommandSource source, String[] context) { - final int length = context.length; - if (length == 0) { - checkPresent(source, false); - return; - } - String[] reloadedResult = {""}; - if ("-a".equals(context[0]) || "--all".equals(context[0])) { - reloadedResult[0] = doAll(); - } else if ("-r".equals(context[0]) || "--regex".equals(context[0])) { - if (!checkPresent(source, length > 1) - || !doRegex(source, context[1], reloadedResult)) { - return; - } - } else { - if (!doDirect(source, context[0], reloadedResult)) { - return; - } - } - sendSuccess(source, reloadedResult); - } - - protected String doAll() { - return Anvil.getEnvironmentManager() - .getEnvironments().values().stream() - .map(reloadEnvironment) - .collect(Collectors.joining(", ")); - } - - @Contract("_, _ -> param2") - protected boolean checkPresent(TCommandSource source, boolean present) { - if (present) { - return true; - } - textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("Plugin is required if '--all' is not set") - .sendTo(source); - return false; - } - - protected boolean doRegex(TCommandSource source, String regex, String[] reloadedResult) { - try { - reloadedResult[0] = Anvil.getEnvironmentManager() - .getEnvironmentsAsStream(Pattern.compile(regex)) - .map(reloadEnvironment) - .collect(Collectors.joining(", ")); - if (reloadedResult[0].length() == 0) { - textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("Regex ") - .gold().append(regex) - .red().append(" did not match any plugins") - .sendTo(source); - return false; - } - } catch (PatternSyntaxException e) { - textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("Failed to parse ") - .gold().append(regex) - .sendTo(source); - return false; - } - return true; - } - - protected boolean doDirect(TCommandSource source, String plugin, String[] reloadedResult) { - Optional optionalReloaded = Anvil.getEnvironmentManager() - .getEnvironment(plugin) - .map(reloadEnvironment); - if (!optionalReloaded.isPresent()) { - textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("Could not find plugin ") - .gold().append(plugin) - .sendTo(source); - return false; - } - reloadedResult[0] = optionalReloaded.get(); - return true; - } - - protected void sendSuccess(TCommandSource source, String[] reloadedResult) { - textService.builder() - .append(pluginInfo.getPrefix()) - .green().append("Successfully reloaded ") - .gold().append(reloadedResult[0]) - .sendTo(source); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonCallbackCommand.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonCallbackCommand.java deleted file mode 100644 index 6a4af53e8..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonCallbackCommand.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.util.TextService; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import java.util.function.Consumer; - -@Singleton -public class CommonCallbackCommand { - - @Inject - protected PluginInfo pluginInfo; - - @Inject - protected TextService textService; - - private final Map> callbacks; - - public CommonCallbackCommand() { - callbacks = new HashMap<>(); - } - - public void addCallback(UUID uuid, Consumer callback) { - callbacks.put(uuid, callback); - } - - public void execute(TCommandSource source, String[] context) { - if (context.length == 0) { - textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("Missing callback id") - .sendTo(source); - return; - } - UUID uuid; - try { - uuid = UUID.fromString(context[0]); - } catch (IllegalArgumentException e) { - textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("Callback id must be a valid UUID") - .sendTo(source); - return; - } - Consumer callback = callbacks.get(uuid); - if (callback == null) { - textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("Callback id ") - .gold().append(uuid) - .red().append(" does not match any callbacks") - .sendTo(source); - return; - } - callback.accept(source); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonCommandService.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonCommandService.java deleted file mode 100644 index f272e86ff..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/command/CommonCommandService.java +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command; - -import com.google.common.collect.ImmutableList; -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.Environment; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.api.command.CommandService; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.util.TextService; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -public abstract class CommonCommandService< - TCommand, - TCommandExecutor, - TString, - TCommandSource> - implements CommandService { - - @Inject - protected Environment environment; - - @Inject - protected PluginInfo pluginInfo; - - @Inject - protected TextService textService; - - protected abstract void runExecutor( - TCommandExecutor executor, - TCommand command, - TCommandSource source, - String alias, - String[] context - ); - - protected abstract List getSuggestions( - TCommandExecutor executor, - TCommand command, - TCommandSource source, - String alias, - String[] context - ); - - protected abstract TCommandExecutor generateWrapperCommand( - CommandExecutorWrapper command); - - protected interface CommandExecutorWrapper { - void execute( - TCommand command, - TCommandSource source, - String alias, - String[] context - ); - - default List suggest( - TCommand command, - TCommandSource commandSource, - String alias, - String[] context - ) { - return ImmutableList.of(); - } - } - - private void sendSubCommandError( - TCommandSource source, - @Nullable String command, - Map, TCommandExecutor> children - ) { - textService.builder() - .red().append("Input command ", command == null ? "null" : command) - .append(" was not a valid subcommand!\n") - .appendIf(command != null, command, "\n^") - .append("\nAvailable: ") - .append(children.keySet().stream() - .filter(l -> !l.isEmpty()) - .map(l -> l.get(0)) - .collect(Collectors.joining(", ")) - ) - .sendTo(source); - } - - private class RoutingCommand implements CommandExecutorWrapper { - - @Nullable - private final TCommandExecutor root; - private final Map, TCommandExecutor> children; - private final boolean childCommandFallback; - - private RoutingCommand( - @Nullable TCommandExecutor root, - Map, TCommandExecutor> children, - boolean childCommandFallback - ) { - this.root = root; - this.children = children; - this.childCommandFallback = childCommandFallback; - } - - @Override - public void execute(TCommand command, TCommandSource source, String alias, String[] context) { - final int length = context.length; - if (length > 0) { - for (Map.Entry, TCommandExecutor> entry : children.entrySet()) { - final List key = entry.getKey(); - if (key.contains(context[0])) { - runExecutor(entry.getValue(), command, source, context[0], - // remove the first argument (the child selector) - Arrays.copyOfRange(context, 1, length)); - return; - } - } - if (!childCommandFallback) { - sendSubCommandError(source, context[0], children); - return; - } - } - // reached the end; if no children have - // matched, run the root command - if (root == null) { - sendSubCommandError(source, null, children); - return; - } - runExecutor(root, command, source, alias, context); - } - - @Override - public List suggest(TCommand command, TCommandSource source, String alias, String[] context) { - final int length = context.length; - if (length == 0) { - return ImmutableList.of(); - } - if (length == 1) { - List suggestions = new ArrayList<>(); - for (List aliases : children.keySet()) { - if (aliases.size() == 0) { - continue; - } - suggestions.add(aliases.get(0)); - } - return suggestions; - } - for (Map.Entry, TCommandExecutor> entry : children.entrySet()) { - final List key = entry.getKey(); - if (key.contains(context[0])) { - return getSuggestions(entry.getValue(), command, source, context[0], - // remove the first argument (the child selector) - Arrays.copyOfRange(context, 1, length)); - } - } - if (!childCommandFallback) { - return ImmutableList.of(); - } - return getSuggestions(root, command, source, alias, context); - } - } - - @Override - public TCommandExecutor generateRoutingCommand( - @Nullable TCommandExecutor root, - Map, TCommandExecutor> children, - boolean childCommandFallback - ) { - return generateWrapperCommand(new RoutingCommand(root, children, childCommandFallback)); - } - - protected void sendRoot(TCommandSource source, String helpUsage, boolean extended) { - textService.builder() - .append(pluginInfo.getPrefix()) - .aqua().append("Running version ") - .green().append(pluginInfo.getVersion()) - .aqua().append(" by ") - .appendJoining(", ", pluginInfo.getAuthors()) - .append("\n") - .appendIf(extended, textService.builder() - .green().append("Use ") - .gold().append(helpUsage) - .green().append(" for help") - ) - .appendIf(!extended, textService.builder() - .red().append("You do not have permission for any sub-commands") - ) - .sendTo(source); - } - - protected void sendVersion(TCommandSource source, String helpUsage, boolean extended) { - textService.builder() - .append(pluginInfo.getPrefix()) - .aqua().append("Running version ") - .green().append(pluginInfo.getVersion()) - .aqua().append(" by ") - .appendJoining(", ", pluginInfo.getAuthors()) - .gray().append("\nBuild date: ") - .aqua().append(pluginInfo.getBuildDate(), "\n") - .appendIf(extended, textService.builder() - .green().append("Use ") - .gold().append(helpUsage) - .green().append(" for help") - ) - .appendIf(!extended, textService.builder() - .red().append("You do not have permission for any sub-commands") - ) - .sendTo(source); - } - - protected void sendReload(TCommandSource source) { - environment.reload(); - textService.builder() - .append(pluginInfo.getPrefix()) - .green().append("Successfully reloaded!") - .sendTo(source); - } - - protected String getFullPath(CommandNode node) { - StringBuilder s = new StringBuilder(32); - s.append("/"); - for (String name : node.getPath()) { - s.append(name).append(" "); - } - s.append(node.getName()).append(" "); - return s.toString(); - } - - protected void sendHelp(TCommandSource source, CommandNode node) { - List helpList = new ArrayList<>(); - String fullPath = getFullPath(node); - - node.getDescriptions().forEach((aliases, command) -> { - Predicate permission = node.getPermissions().get(aliases); - if (permission != null && permission.test(source)) return; - - Function description = node.getDescriptions().get(aliases); - Function usage = node.getUsages().get(aliases); - - TextService.Builder builder = textService.builder() - .gold().append(fullPath).appendIf(aliases.size() > 0, aliases.get(0)); - if (description != null) { - builder.append(" - ", description.apply(source)); - } - builder.gray().append("\nUsage: ", fullPath) - .appendJoining(", ", aliases.toArray()); - if (usage != null) { - builder.append(" ", usage.apply(source)); - } - - helpList.add(builder.build()); - }); - textService.paginationBuilder() - .title(textService.builder().gold().append(pluginInfo.getName(), " - ", pluginInfo.getOrganizationName()).build()) - .padding(textService.builder().dark_green().append("-").build()) - .contents(helpList) - .build() - .sendTo(source); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonCoreMemberManager.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonCoreMemberManager.java deleted file mode 100644 index 14711e4a4..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonCoreMemberManager.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.coremember; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.coremember.CoreMemberManager; -import org.anvilpowered.anvil.api.coremember.CoreMemberRepository; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.base.datastore.BaseManager; - -public class CommonCoreMemberManager extends BaseManager> implements CoreMemberManager { - - @Inject - public CommonCoreMemberManager(Registry registry) { - super(registry); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonCoreMemberRepository.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonCoreMemberRepository.java deleted file mode 100644 index 25096640e..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonCoreMemberRepository.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.coremember; - -import org.anvilpowered.anvil.api.coremember.CoreMemberRepository; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; -import org.anvilpowered.anvil.base.datastore.BaseRepository; - -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -public abstract class CommonCoreMemberRepository< - TKey, - TDataStore> - extends BaseRepository, TDataStore> - implements CoreMemberRepository { - - @Override - @SuppressWarnings("unchecked") - public Class> getTClass() { - return (Class>) getDataStoreContext().getEntityClassUnsafe("coremember"); - } - - @Override - public CompletableFuture>> getOneOrGenerateForUser(UUID userUUID, String userName, String ipAddress) { - return getOneOrGenerateForUser(userUUID, userName, ipAddress, new boolean[]{false, false, false, false, false, false, false, false}); - } - - @Override - public boolean checkBanned(CoreMember coreMember) { - if (coreMember.isBanned() && coreMember.getBanEndUtc().isAfter(OffsetDateTime.now(ZoneOffset.UTC).toInstant())) { - return true; - } else if (coreMember.isBanned()) { - unBanUser(coreMember.getUserUUID()); - } - return false; - } - - @Override - public CompletableFuture checkBanned(TKey id) { - return getOne(id).thenApplyAsync(o -> o.map(this::checkBanned).orElse(false)); - } - - @Override - public CompletableFuture checkBannedForUser(UUID userUUID) { - return getOneForUser(userUUID).thenApplyAsync(o -> o.map(this::checkBanned).orElse(false)); - } - - @Override - public CompletableFuture checkBannedForUser(String userName) { - return getOneForUser(userName).thenApplyAsync(o -> o.map(this::checkBanned).orElse(false)); - } - - @Override - public boolean checkMuted(CoreMember coreMember) { - if (coreMember.isMuted() && coreMember.getMuteEndUtc().isAfter(OffsetDateTime.now(ZoneOffset.UTC).toInstant())) { - return true; - } else if (coreMember.isMuted()) { - unMuteUser(coreMember.getUserUUID()); - } - return false; - } - - @Override - public CompletableFuture checkMuted(TKey id) { - return getOne(id).thenApplyAsync(o -> o.map(this::checkMuted).orElse(false)); - } - - @Override - public CompletableFuture checkMutedForUser(UUID userUUID) { - return getOneForUser(userUUID).thenApplyAsync(o -> o.map(this::checkMuted).orElse(false)); - } - - @Override - public CompletableFuture checkMutedForUser(String userName) { - return getOneForUser(userName).thenApplyAsync(o -> o.map(this::checkMuted).orElse(false)); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonMongoCoreMemberRepository.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonMongoCoreMemberRepository.java deleted file mode 100644 index 9ff3d05c2..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonMongoCoreMemberRepository.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.coremember; - -import dev.morphia.Datastore; -import dev.morphia.query.Query; -import dev.morphia.query.UpdateOperations; -import org.anvilpowered.anvil.api.coremember.MongoCoreMemberRepository; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; -import org.anvilpowered.anvil.base.datastore.BaseMongoRepository; -import org.bson.types.ObjectId; - -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -public class CommonMongoCoreMemberRepository - extends CommonCoreMemberRepository - implements BaseMongoRepository>, - MongoCoreMemberRepository { - - @Override - public CompletableFuture>> getOneOrGenerateForUser(UUID userUUID, String userName, String ipAddress, boolean[] flags) { - final int length = flags.length; - if (length != 8) throw new IllegalArgumentException("Flags must be an array of length 8"); - for (int i = 0; i < length; i++) { - flags[i] = false; - } - return getOneForUser(userUUID).thenApplyAsync(optionalMember -> { - if (!optionalMember.isPresent()) { - CoreMember member = generateEmpty(); - member.setUserUUID(userUUID); - member.setUserName(userName); - member.setIpAddress(ipAddress); - member.setLastJoinedUtc(OffsetDateTime.now(ZoneOffset.UTC).toInstant()); - flags[0] = true; - return insertOne(member).join(); - } - - CoreMember member = optionalMember.get(); - UpdateOperations> updateOperations = createUpdateOperations(); - boolean updateName = false; - boolean updateIpAddress = false; - if (!userName.equals(member.getUserName())) { - updateOperations.set("userName", userName); - updateName = true; - } - if (!ipAddress.equals(member.getIpAddress())) { - updateOperations.set("ipAddress", ipAddress); - updateIpAddress = true; - } - updateOperations.set("lastJoinedUtc", OffsetDateTime.now(ZoneOffset.UTC).toInstant()); - if (getDataStoreContext().getDataStore() - .update(asQuery(member.getId()), updateOperations) - .getUpdatedCount() > 0) { - if (updateName) { - member.setUserName(userName); - flags[1] = true; - } - if (updateIpAddress) { - member.setIpAddress(ipAddress); - flags[2] = true; - } - } - return optionalMember; - }); - } - - @Override - public CompletableFuture>> getOneForUser(UUID userUUID) { - return getOne(asQuery(userUUID)); - } - - @Override - public CompletableFuture>> getOneForUser(String userName) { - return getOne(asQuery(userName)); - } - - @Override - public CompletableFuture>> getForIpAddress(String ipAddress) { - return getAll(asQueryForIpAddress(ipAddress)); - } - - @Override - public CompletableFuture ban(ObjectId id, Instant endUtc, String reason) { - return ban(asQuery(id), endUtc, reason); - } - - @Override - public CompletableFuture banUser(UUID userUUID, Instant endUtc, String reason) { - return ban(asQuery(userUUID), endUtc, reason); - } - - @Override - public CompletableFuture banUser(String userName, Instant endUtc, String reason) { - return ban(asQuery(userName), endUtc, reason); - } - - @Override - public CompletableFuture banIpAddress(String ipAddress, Instant endUtc, String reason) { - return ban(asQueryForIpAddress(ipAddress), endUtc, reason); - } - - @Override - public CompletableFuture unBan(ObjectId id) { - return unBan(asQuery(id)); - } - - @Override - public CompletableFuture unBanUser(UUID userUUID) { - return unBan(asQuery(userUUID)); - } - - @Override - public CompletableFuture unBanUser(String userName) { - return unBan(asQuery(userName)); - } - - @Override - public CompletableFuture unBanIpAddress(String ipAddress) { - return unBan(asQueryForIpAddress(ipAddress)); - } - - @Override - public CompletableFuture mute(ObjectId id, Instant endUtc, String reason) { - return mute(asQuery(id), endUtc, reason); - } - - @Override - public CompletableFuture muteUser(UUID userUUID, Instant endUtc, String reason) { - return mute(asQuery(userUUID), endUtc, reason); - } - - @Override - public CompletableFuture muteUser(String userName, Instant endUtc, String reason) { - return mute(asQuery(userName), endUtc, reason); - } - - @Override - public CompletableFuture muteIpAddress(String ipAddress, Instant endUtc, String reason) { - return mute(asQueryForIpAddress(ipAddress), endUtc, reason); - } - - @Override - public CompletableFuture unMute(ObjectId id) { - return unMute(asQuery(id)); - } - - @Override - public CompletableFuture unMuteUser(UUID userUUID) { - return unMute(asQuery(userUUID)); - } - - @Override - public CompletableFuture unMuteUser(String userName) { - return unMute(asQuery(userName)); - } - - @Override - public CompletableFuture unMuteIpAddress(String ipAddress) { - return unMute(asQueryForIpAddress(ipAddress)); - } - - @Override - public CompletableFuture setNickName(ObjectId id, String nickName) { - return setNickName(asQuery(id), nickName); - } - - @Override - public CompletableFuture setNickNameForUser(UUID userUUID, String nickName) { - return setNickName(asQuery(userUUID), nickName); - } - - @Override - public CompletableFuture setNickNameForUser(String userName, String nickName) { - return setNickName(asQuery(userName), nickName); - } - - @Override - public CompletableFuture deleteNickName(ObjectId id) { - return deleteNickName(asQuery(id)); - } - - @Override - public CompletableFuture deleteNickNameForUser(UUID userUUID) { - return deleteNickName(asQuery(userUUID)); - } - - @Override - public CompletableFuture deleteNickNameForUser(String userName) { - return deleteNickName(asQuery(userName)); - } - - @Override - public Query> asQuery(UUID userUUID) { - return asQuery().field("userUUID").equal(userUUID); - } - - @Override - public Query> asQuery(String userName) { - return asQuery().field("userName").containsIgnoreCase(userName); - } - - @Override - public Query> asQueryForIpAddress(String ipAddress) { - return asQuery().field("ipAddress").equal(ipAddress); - } - - @Override - public CompletableFuture ban(Query> query, Instant endUtc, String reason) { - return update(query, set("banned", true) - .set("banEndUtc", endUtc) - .set("banReason", reason) - ); - } - - @Override - public CompletableFuture unBan(Query> query) { - return update(query, set("banned", false)); - } - - @Override - public CompletableFuture mute(Query> query, Instant endUtc, String reason) { - return update(query, set("muted", true) - .set("muteEndUtc", endUtc) - .set("muteReason", reason) - ); - } - - @Override - public CompletableFuture unMute(Query> query) { - return update(query, set("muted", false)); - } - - @Override - public CompletableFuture setNickName(Query> query, String nickName) { - return update(query, set("nickName", nickName)); - } - - @Override - public CompletableFuture deleteNickName(Query> query) { - return update(query, unSet("nickName")); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonXodusCoreMemberRepository.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonXodusCoreMemberRepository.java deleted file mode 100644 index 92658d377..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/coremember/CommonXodusCoreMemberRepository.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.coremember; - -import com.google.inject.Inject; -import jetbrains.exodus.entitystore.Entity; -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.PersistentEntityStore; -import jetbrains.exodus.entitystore.StoreTransaction; -import org.anvilpowered.anvil.api.coremember.XodusCoreMemberRepository; -import org.anvilpowered.anvil.api.model.Mappable; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; -import org.anvilpowered.anvil.base.datastore.BaseXodusRepository; -import org.slf4j.Logger; - -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.function.Function; - -public class CommonXodusCoreMemberRepository - extends CommonCoreMemberRepository - implements BaseXodusRepository>, - XodusCoreMemberRepository { - - @Inject - private Logger logger; - - @Override - public CompletableFuture>> getOneOrGenerateForUser(UUID userUUID, String userName, String ipAddress, boolean[] flags) { - final int length = flags.length; - if (length != 8) throw new IllegalArgumentException("Flags must be an array of length 8"); - for (int i = 0; i < length; i++) { - flags[i] = false; - } - return CompletableFuture.supplyAsync(() -> - getDataStoreContext().getDataStore().computeInTransaction(txn -> { - Iterator iterator = asQuery(userUUID).apply(txn).iterator(); - if (!iterator.hasNext()) { - CoreMember member = generateEmpty(); - member.setUserUUID(userUUID); - member.setUserName(userName); - member.setIpAddress(ipAddress); - member.setLastJoinedUtc(OffsetDateTime.now(ZoneOffset.UTC).toInstant()); - flags[0] = true; - return insertOne(member).join(); - } - - CoreMember member = generateEmpty(); - Entity entity = iterator.next(); - ((Mappable) member).readFrom(entity); - - boolean updateUsername = false; - boolean updateIPAddress = false; - - if (!userName.equals(member.getUserName())) { - entity.setProperty("userName", userName); - updateUsername = true; - } - - if (!ipAddress.equals(member.getIpAddress())) { - entity.setProperty("ipAddress", ipAddress); - updateIPAddress = true; - } - Instant now = OffsetDateTime.now(ZoneOffset.UTC).toInstant(); - long nowSeconds = now.getEpochSecond(); - int nowNanos = now.getNano(); - entity.setProperty("lastJoinedUtcSeconds", nowSeconds); - entity.setProperty("lastJoinedUtcNanos", nowNanos); - entity.setProperty("updatedUtcSeconds", nowSeconds); - entity.setProperty("updatedUtcNanos", nowNanos); - if (txn.commit()) { - if (updateUsername) { - member.setUserName(userName); - flags[1] = true; - } - if (updateIPAddress) { - member.setIpAddress(ipAddress); - flags[2] = true; - } - member.setLastJoinedUtc(now); - return Optional.of(member); - } - logger.error("Failed to update {} please report this on github!", userName); - return Optional.empty(); - }) - ); - } - - @Override - public CompletableFuture>> getOneForUser(UUID userUUID) { - return getOne(asQuery(userUUID)); - } - - @Override - public CompletableFuture>> getOneForUser(String userName) { - return getOne(asQuery(userName)); - } - - @Override - public CompletableFuture>> getForIpAddress(String ipAddress) { - return getAll(asQueryForIpAddress(ipAddress)); - } - - @Override - public CompletableFuture ban(EntityId id, Instant endUtc, String reason) { - return ban(asQuery(id), endUtc, reason); - } - - @Override - public CompletableFuture banUser(UUID userUUID, Instant endUtc, String reason) { - return ban(asQuery(userUUID), endUtc, reason); - } - - @Override - public CompletableFuture banUser(String userName, Instant endUtc, String reason) { - return ban(asQuery(userName), endUtc, reason); - } - - @Override - public CompletableFuture banIpAddress(String ipAddress, Instant endUtc, String reason) { - return ban(asQueryForIpAddress(ipAddress), endUtc, reason); - } - - @Override - public CompletableFuture unBan(EntityId id) { - return unBan(asQuery(id)); - } - - @Override - public CompletableFuture unBanUser(UUID userUUID) { - return unBan(asQuery(userUUID)); - } - - @Override - public CompletableFuture unBanUser(String userName) { - return unBan(asQuery(userName)); - } - - @Override - public CompletableFuture unBanIpAddress(String ipAddress) { - return unBan(asQueryForIpAddress(ipAddress)); - } - - @Override - public CompletableFuture mute(EntityId id, Instant endUtc, String reason) { - return mute(asQuery(id), endUtc, reason); - } - - @Override - public CompletableFuture muteUser(UUID userUUID, Instant endUtc, String reason) { - return mute(asQuery(userUUID), endUtc, reason); - } - - @Override - public CompletableFuture muteUser(String userName, Instant endUtc, String reason) { - return mute(asQuery(userName), endUtc, reason); - } - - @Override - public CompletableFuture muteIpAddress(String ipAddress, Instant endUtc, String reason) { - return mute(asQueryForIpAddress(ipAddress), endUtc, reason); - } - - @Override - public CompletableFuture unMute(EntityId id) { - return unMute(asQuery(id)); - } - - @Override - public CompletableFuture unMuteUser(UUID userUUID) { - return unMute(asQuery(userUUID)); - } - - @Override - public CompletableFuture unMuteUser(String userName) { - return unMute(asQuery(userName)); - } - - @Override - public CompletableFuture unMuteIpAddress(String ipAddress) { - return unMute(asQueryForIpAddress(ipAddress)); - } - - @Override - public CompletableFuture setNickName(EntityId id, String nickName) { - return setNickName(asQuery(id), nickName); - } - - @Override - public CompletableFuture setNickNameForUser(UUID userUUID, String nickName) { - return setNickName(asQuery(userUUID), nickName); - } - - @Override - public CompletableFuture setNickNameForUser(String userName, String nickName) { - return setNickName(asQuery(userName), nickName); - } - - @Override - public CompletableFuture deleteNickName(EntityId id) { - return deleteNickName(asQuery(id)); - } - - @Override - public CompletableFuture deleteNickNameForUser(UUID userUUID) { - return deleteNickName(asQuery(userUUID)); - } - - @Override - public CompletableFuture deleteNickNameForUser(String userName) { - return deleteNickName(asQuery(userName)); - } - - @Override - public Function> asQuery(UUID userUUID) { - return txn -> txn.find(getTClass().getSimpleName(), "userUUID", userUUID.toString()); - } - - @Override - public Function> asQuery(String userName) { - return txn -> txn.find(getTClass().getSimpleName(), "userName", userName); - } - - @Override - public Function> asQueryForIpAddress(String ipAddress) { - return txn -> txn.find(getTClass().getSimpleName(), "ipAddress", ipAddress); - } - - @Override - public CompletableFuture ban(Function> query, Instant endUtc, String reason) { - return update(query, e -> { - e.setProperty("banned", true); - e.setProperty("banEndUtcSeconds", endUtc.getEpochSecond()); - e.setProperty("banEndUtcNanos", endUtc.getNano()); - e.setProperty("banReason", reason); - }); - } - - @Override - public CompletableFuture unBan(Function> query) { - return update(query, e -> e.setProperty("banned", false)); - } - - @Override - public CompletableFuture mute(Function> query, Instant endUtc, String reason) { - return update(query, e -> { - e.setProperty("muted", true); - e.setProperty("muteEndUtcSeconds", endUtc.getEpochSecond()); - e.setProperty("muteEndUtcNanos", endUtc.getNano()); - e.setProperty("muteReason", reason); - }); - } - - @Override - public CompletableFuture unMute(Function> query) { - return update(query, e -> e.setProperty("muted", false)); - } - - @Override - public CompletableFuture setNickName(Function> query, String nickName) { - return update(query, e -> e.setProperty("nickName", nickName)); - } - - @Override - public CompletableFuture deleteNickName(Function> query) { - return update(query, e -> e.deleteProperty("nickName")); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/entity/CommonRestrictionService.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/entity/CommonRestrictionService.java deleted file mode 100644 index ee60972d6..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/entity/CommonRestrictionService.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.entity; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import org.anvilpowered.anvil.api.entity.RestrictionCriteria; -import org.anvilpowered.anvil.api.entity.RestrictionService; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; - -@Singleton -public class CommonRestrictionService implements RestrictionService { - - @Inject - private EntityUtils entityUtils; - - private final Map entityRestrictions; - private final Map uuidRestrictions; - - public CommonRestrictionService() { - entityRestrictions = new HashMap<>(); - uuidRestrictions = new HashMap<>(); - } - - @Override - public void put(Object entity, RestrictionCriteria criteria) { - Optional optionalUUID = entityUtils.extractUUID(entity); - if (optionalUUID.isPresent()) { - // register with UUID instead, we don't want to persist the instances of identifiable entities - put(optionalUUID.get(), criteria); - return; - } - if (criteria.equals(RestrictionCriteria.none())) { - entityRestrictions.remove(entity); - } - entityRestrictions.put(entity, criteria); - } - - @Override - public void put(UUID uuid, RestrictionCriteria criteria) { - if (criteria.equals(RestrictionCriteria.none())) { - uuidRestrictions.remove(uuid); - } - uuidRestrictions.put(uuid, criteria); - } - - @Override - public Optional remove(Object entity) { - Optional optionalUUID = entityUtils.extractUUID(entity); - if (optionalUUID.isPresent()) { - return remove(optionalUUID.get()); - } - return Optional.ofNullable(entityRestrictions.remove(entity)); - } - - @Override - public Optional remove(UUID uuid) { - return Optional.ofNullable(uuidRestrictions.remove(uuid)); - } - - @Override - public RestrictionCriteria get(Object entity) { - Optional optionalUUID = entityUtils.extractUUID(entity); - if (optionalUUID.isPresent()) { - return get(optionalUUID.get()); - } - return entityRestrictions.getOrDefault(entity, RestrictionCriteria.none()); - } - - @Override - public RestrictionCriteria get(UUID uuid) { - return uuidRestrictions.getOrDefault(uuid, RestrictionCriteria.none()); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/entity/EntityUtils.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/entity/EntityUtils.java deleted file mode 100644 index f0e7caedc..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/entity/EntityUtils.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.entity; - -import java.util.Optional; -import java.util.UUID; - -public interface EntityUtils { - - Optional extractUUID(Object entity); -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/misc/CommonBindingExtensions.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/misc/CommonBindingExtensions.java deleted file mode 100644 index 51af0e7eb..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/misc/CommonBindingExtensions.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.misc; - -import com.google.common.reflect.TypeToken; -import com.google.inject.Binder; -import com.google.inject.TypeLiteral; -import dev.morphia.Datastore; -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.PersistentEntityStore; -import org.anvilpowered.anvil.api.datastore.Component; -import org.anvilpowered.anvil.api.datastore.DataStoreContext; -import org.anvilpowered.anvil.api.datastore.MongoContext; -import org.anvilpowered.anvil.api.datastore.XodusContext; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.bson.types.ObjectId; - -import java.lang.annotation.Annotation; - -@SuppressWarnings({"unchecked", "UnstableApiUsage"}) -public class CommonBindingExtensions implements BindingExtensions { - - private final Binder binder; - - public CommonBindingExtensions(Binder binder) { - this.binder = binder; - } - - @Override - public , - From2 extends Component, - From3 extends From1, - Target extends From1> - void bind( - TypeToken from1, - TypeToken from2, - TypeToken from3, - TypeToken target, - Annotation componentAnnotation - ) { - binder.bind((TypeLiteral) TypeLiteral.get(from2.getType())) - .annotatedWith(componentAnnotation) - .to(BindingExtensions.getTypeLiteral(target)); - - binder.bind((TypeLiteral) TypeLiteral.get(from3.getType())) - .to(BindingExtensions.getTypeLiteral(target)); - } - - @Override - public , - From2 extends From1, - Target extends From1> - void bind( - TypeToken from1, - TypeToken from2, - TypeToken target, - Annotation componentAnnotation - ) { - bind(from1, from1, from2, target, componentAnnotation); - } - - @Override - public void bind( - TypeToken from, - TypeToken target, - Annotation annotation - ) { - binder.bind(BindingExtensions.getTypeLiteral(from)) - .annotatedWith(annotation) - .to(BindingExtensions.getTypeLiteral(target)); - } - - @Override - public void bind( - TypeToken from, - TypeToken target, - Class annotation - ) { - binder.bind(BindingExtensions.getTypeLiteral(from)) - .annotatedWith(annotation) - .to(BindingExtensions.getTypeLiteral(target)); - } - - @Override - public void bind( - TypeToken from, - TypeToken target - ) { - binder.bind(BindingExtensions.getTypeLiteral(from)) - .to(BindingExtensions.getTypeLiteral(target)); - } - - @Override - public void withMongoDB() { - binder.bind(new TypeLiteral>() { - }).to(MongoContext.class); - } - - @Override - public void withXodus() { - binder.bind(new TypeLiteral>() { - }).to(XodusContext.class); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/model/coremember/MongoCoreMember.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/model/coremember/MongoCoreMember.java deleted file mode 100644 index eea648529..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/model/coremember/MongoCoreMember.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.model.coremember; - -import dev.morphia.annotations.Entity; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; -import org.anvilpowered.anvil.base.model.MongoDbo; -import org.bson.types.ObjectId; - -import java.time.Instant; -import java.util.UUID; - -@Entity("coreMembers") -public class MongoCoreMember extends MongoDbo implements CoreMember { - - private UUID userUUID; - private String userName; - private String ipAddress; - private Instant lastJoinedUtc; - private String nickName; - private boolean banned; - private boolean muted; - private Instant banEndUtc; - private Instant muteEndUtc; - private String banReason; - private String muteReason; - - @Override - public UUID getUserUUID() { - return userUUID; - } - - @Override - public void setUserUUID(UUID userUUID) { - this.userUUID = userUUID; - } - - @Override - public String getUserName() { - return userName; - } - - @Override - public void setUserName(String userName) { - this.userName = userName; - } - - @Override - public String getIpAddress() { - return ipAddress; - } - - @Override - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - @Override - public Instant getLastJoinedUtc() { - return lastJoinedUtc; - } - - @Override - public void setLastJoinedUtc(Instant lastJoinedUtc) { - this.lastJoinedUtc = lastJoinedUtc; - } - - @Override - public String getNickName() { - return nickName; - } - - @Override - public void setNickName(String nickName) { - this.nickName = nickName; - } - - @Override - public boolean isBanned() { - return banned; - } - - @Override - public void setBanned(boolean banned) { - this.banned = banned; - } - - @Override - public boolean isMuted() { - return muted; - } - - @Override - public void setMuted(boolean muted) { - this.muted = muted; - } - - @Override - public Instant getBanEndUtc() { - return banEndUtc; - } - - @Override - public void setBanEndUtc(Instant banEndUtc) { - this.banEndUtc = banEndUtc; - } - - @Override - public Instant getMuteEndUtc() { - return muteEndUtc; - } - - @Override - public void setMuteEndUtc(Instant muteEndUtc) { - this.muteEndUtc = muteEndUtc; - } - - @Override - public String getBanReason() { - return banReason; - } - - @Override - public void setBanReason(String banReason) { - this.banReason = banReason; - } - - @Override - public String getMuteReason() { - return muteReason; - } - - @Override - public void setMuteReason(String muteReason) { - this.muteReason = muteReason; - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/model/coremember/XodusCoreMember.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/model/coremember/XodusCoreMember.java deleted file mode 100644 index cc7771f32..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/model/coremember/XodusCoreMember.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.model.coremember; - -import jetbrains.exodus.entitystore.Entity; -import jetbrains.exodus.entitystore.EntityId; -import org.anvilpowered.anvil.api.datastore.XodusEntity; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; -import org.anvilpowered.anvil.base.model.XodusDbo; - -import java.time.Instant; -import java.util.UUID; - -@XodusEntity -public class XodusCoreMember extends XodusDbo implements CoreMember { - - private String userUUID; - private String userName; - private String ipAddress; - private long lastJoinedUtcSeconds; - private int lastJoinedUtcNanos; - private String nickName; - private boolean banned; - private boolean muted; - private long banEndUtcSeconds; - private int banEndUtcNanos; - private long muteEndUtcSeconds; - private int muteEndUtcNanos; - private String banReason; - private String muteReason; - - @Override - public UUID getUserUUID() { - return UUID.fromString(userUUID); - } - - @Override - public void setUserUUID(UUID userUUID) { - this.userUUID = userUUID.toString(); - } - - @Override - public String getUserName() { - return userName; - } - - @Override - public void setUserName(String userName) { - this.userName = userName; - } - - @Override - public String getIpAddress() { - return ipAddress; - } - - @Override - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - @Override - public Instant getLastJoinedUtc() { - return Instant.ofEpochSecond(lastJoinedUtcSeconds, lastJoinedUtcNanos); - } - - @Override - public void setLastJoinedUtc(Instant lastJoinedUtc) { - lastJoinedUtcSeconds = lastJoinedUtc.getEpochSecond(); - lastJoinedUtcNanos = lastJoinedUtc.getNano(); - } - - @Override - public String getNickName() { - return nickName; - } - - @Override - public void setNickName(String nickName) { - this.nickName = nickName; - } - - @Override - public boolean isBanned() { - return banned; - } - - @Override - public void setBanned(boolean banned) { - this.banned = banned; - } - - @Override - public boolean isMuted() { - return muted; - } - - @Override - public void setMuted(boolean muted) { - this.muted = muted; - } - - @Override - public Instant getBanEndUtc() { - return Instant.ofEpochSecond(banEndUtcSeconds, banEndUtcNanos); - } - - @Override - public void setBanEndUtc(Instant banEndUtc) { - banEndUtcSeconds = banEndUtc.getEpochSecond(); - banEndUtcNanos = banEndUtc.getNano(); - } - - @Override - public Instant getMuteEndUtc() { - return Instant.ofEpochSecond(muteEndUtcSeconds, muteEndUtcNanos); - } - - @Override - public void setMuteEndUtc(Instant muteEndUtc) { - muteEndUtcSeconds = muteEndUtc.getEpochSecond(); - muteEndUtcNanos = muteEndUtc.getNano(); - } - - @Override - public String getBanReason() { - return banReason; - } - - @Override - public void setBanReason(String banReason) { - this.banReason = banReason; - } - - @Override - public String getMuteReason() { - return muteReason; - } - - @Override - public void setMuteReason(String muteReason) { - this.muteReason = muteReason; - } - - @Override - public Entity writeTo(Entity object) { - super.writeTo(object); - if (userUUID != null) { - object.setProperty("userUUID", userUUID); - } - if (userName != null) { - object.setProperty("userName", userName); - } - if (ipAddress != null) { - object.setProperty("ipAddress", ipAddress); - } - object.setProperty("lastJoinedUtcSeconds", lastJoinedUtcSeconds); - object.setProperty("lastJoinedUtcNanos", lastJoinedUtcNanos); - if (nickName != null) { - object.setProperty("nickname", nickName); - } - object.setProperty("banned", banned); - object.setProperty("muted", muted); - object.setProperty("banEndUtcSeconds", banEndUtcSeconds); - object.setProperty("banEndUtcNanos", banEndUtcNanos); - object.setProperty("muteEndUtcSeconds", muteEndUtcSeconds); - object.setProperty("muteEndUtcNanos", muteEndUtcNanos); - if (banReason != null) { - object.setProperty("banReason", banReason); - } - if (muteReason != null) { - object.setProperty("muteReason", muteReason); - } - return object; - } - - @Override - public void readFrom(Entity object) { - super.readFrom(object); - Comparable userUUID = object.getProperty("userUUID"); - if (userUUID instanceof String) { - this.userUUID = (String) userUUID; - } - Comparable userName = object.getProperty("userName"); - if (userName instanceof String) { - this.userName = (String) userName; - } - Comparable ipAddress = object.getProperty("ipAddress"); - if (ipAddress instanceof String) { - this.ipAddress = (String) ipAddress; - } - Comparable lastJoinedUtcSeconds = object.getProperty("lastJoinedUtcSeconds"); - if (lastJoinedUtcSeconds instanceof Long) { - this.lastJoinedUtcSeconds = (Long) lastJoinedUtcSeconds; - } - Comparable lastJoinedUtcNanos = object.getProperty("lastJoinedUtcNanos"); - if (lastJoinedUtcNanos instanceof Integer) { - this.lastJoinedUtcNanos = (Integer) lastJoinedUtcNanos; - } - Comparable nickName = object.getProperty("nickName"); - if (nickName instanceof String) { - this.nickName = (String) nickName; - } - Comparable banned = object.getProperty("banned"); - if (banned instanceof Boolean) { - this.banned = (Boolean) banned; - } - Comparable muted = object.getProperty("muted"); - if (muted instanceof Boolean) { - this.muted = (Boolean) muted; - } - Comparable banEndUtcSeconds = object.getProperty("banEndUtcSeconds"); - if (banEndUtcSeconds instanceof Long) { - this.banEndUtcSeconds = (Long) banEndUtcSeconds; - } - Comparable banEndUtcNanos = object.getProperty("banEndUtcNanos"); - if (banEndUtcNanos instanceof Integer) { - this.banEndUtcNanos = (Integer) banEndUtcNanos; - } - Comparable muteEndUtcSeconds = object.getProperty("muteEndUtcSeconds"); - if (muteEndUtcSeconds instanceof Long) { - this.muteEndUtcSeconds = (Long) muteEndUtcSeconds; - } - Comparable muteEndUtcNanos = object.getProperty("muteEndUtcNanos"); - if (muteEndUtcNanos instanceof Integer) { - this.muteEndUtcNanos = (Integer) muteEndUtcNanos; - } - Comparable banReason = object.getProperty("banReason"); - if (banReason instanceof String) { - this.banReason = (String) banReason; - } - Comparable muteReason = object.getProperty("muteReason"); - if (muteReason instanceof String) { - this.muteReason = (String) muteReason; - } - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/ApiCommonModule.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/ApiCommonModule.java deleted file mode 100644 index d3d6d68db..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/ApiCommonModule.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.module; - -import com.google.inject.AbstractModule; -import org.anvilpowered.anvil.api.entity.RestrictionService; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.anvilpowered.anvil.api.util.TimeFormatService; -import org.anvilpowered.anvil.common.entity.CommonRestrictionService; -import org.anvilpowered.anvil.common.util.CommonTimeFormatService; - -public class ApiCommonModule extends AbstractModule { - - @Override - protected void configure() { - bind(TimeFormatService.class).to(CommonTimeFormatService.class); - bind(RestrictionService.class).toProvider( - BindingExtensions.asInternalProvider(CommonRestrictionService.class)); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/CommonModule.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/CommonModule.java deleted file mode 100644 index 0bbc1b113..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/CommonModule.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.module; - -import com.google.common.reflect.TypeToken; -import com.google.inject.name.Names; -import dev.morphia.Datastore; -import jetbrains.exodus.entitystore.EntityId; -import jetbrains.exodus.entitystore.PersistentEntityStore; -import org.anvilpowered.anvil.api.coremember.CoreMemberManager; -import org.anvilpowered.anvil.api.coremember.CoreMemberRepository; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.anvilpowered.anvil.api.plugin.BasicPluginInfo; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.plugin.PluginMessages; -import org.anvilpowered.anvil.api.registry.ConfigurationService; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.base.registry.BaseExtendedRegistry; -import org.anvilpowered.anvil.common.coremember.CommonCoreMemberManager; -import org.anvilpowered.anvil.common.coremember.CommonMongoCoreMemberRepository; -import org.anvilpowered.anvil.common.coremember.CommonXodusCoreMemberRepository; -import org.anvilpowered.anvil.common.misc.CommonBindingExtensions; -import org.anvilpowered.anvil.common.plugin.AnvilPluginInfo; -import org.anvilpowered.anvil.common.plugin.AnvilPluginMessages; -import org.anvilpowered.anvil.common.registry.CommonConfigurationService; -import org.bson.types.ObjectId; - -@SuppressWarnings("UnstableApiUsage") -public class CommonModule extends ApiCommonModule { - - @Override - protected void configure() { - - BindingExtensions be = new CommonBindingExtensions(binder()); - - be.bind(new TypeToken>(getClass()) { - }, new TypeToken>(getClass()) { - }); - - be.bind(new TypeToken(getClass()) { - }, new TypeToken>(getClass()) { - }); - - be.bind(new TypeToken>(getClass()) { - }, new TypeToken>(getClass()) { - }); - - be.bind( - new TypeToken>() { - }, - new TypeToken>() { - }, - new TypeToken() { - }, - Names.named("mongodb") - ); - - be.bind( - new TypeToken>() { - }, - new TypeToken>() { - }, - new TypeToken() { - }, - Names.named("xodus") - ); - - bind(CoreMemberManager.class).to(CommonCoreMemberManager.class); - - be.withMongoDB(); - be.withXodus(); - - bind(Registry.class).to(BaseExtendedRegistry.class); - - bind(ConfigurationService.class).to(CommonConfigurationService.class); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/JavaUtilLoggingAdapter.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/JavaUtilLoggingAdapter.java deleted file mode 100644 index cb2286cf4..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/JavaUtilLoggingAdapter.java +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.module; - -import com.google.inject.Binder; -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.Environment; -import org.slf4j.Marker; -import org.slf4j.helpers.FormattingTuple; -import org.slf4j.helpers.MarkerIgnoringBase; -import org.slf4j.helpers.MessageFormatter; -import org.slf4j.spi.LocationAwareLogger; - -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; - -/** - * @author Jacob Allen - */ -public class JavaUtilLoggingAdapter extends MarkerIgnoringBase implements LocationAwareLogger { - - @Inject - private Logger logger; - - private final String name; - - public static void bindLogger(Environment environment, Binder binder) { - binder.bind(org.slf4j.Logger.class).toInstance(new JavaUtilLoggingAdapter(environment.getName())); - } - - public JavaUtilLoggingAdapter(String name) { - this.name = name; - } - - private void log(Level level, String message, Throwable throwable) { - String color; - switch (level.getName()) { - case "WARNING": - color = "\033[0;33m"; // Yellow - break; - case "SEVERE": - color = "\033[0;31m"; // Red - break; - default: - color = ""; - break; - } - - String message0 = color + message + "\033[0m"; //Always reset the color - LogRecord record = new LogRecord(level, message0); - record.setLoggerName(name); - record.setThrown(throwable); - logger.log(record); - } - - @Override - public boolean isTraceEnabled() { - return logger.isLoggable(Level.FINEST); - } - - @Override - public void trace(String message) { - if (isTraceEnabled()) { - log(Level.FINEST, message, null); - } - } - - @Override - public void trace(String format, Object arg) { - if (isTraceEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg); - log(Level.FINEST, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void trace(String format, Object arg1, Object arg2) { - if (isTraceEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg1, arg2); - log(Level.FINEST, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void trace(String format, Object... arguments) { - if (isTraceEnabled()) { - FormattingTuple tuple = MessageFormatter.arrayFormat(format, arguments); - log(Level.FINEST, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void trace(String message, Throwable throwable) { - if (isTraceEnabled()) { - log(Level.FINEST, message, throwable); - } - } - - @Override - public boolean isDebugEnabled() { - return logger.isLoggable(Level.FINE); - } - - @Override - public void debug(String message) { - if (isDebugEnabled()) { - log(Level.FINE, message, null); - } - } - - @Override - public void debug(String format, Object arg) { - if (isDebugEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg); - log(Level.FINE, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void debug(String format, Object arg1, Object arg2) { - if (isDebugEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg1, arg2); - log(Level.FINE, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void debug(String format, Object... arguments) { - if (isDebugEnabled()) { - FormattingTuple tuple = MessageFormatter.arrayFormat(format, arguments); - log(Level.FINE, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void debug(String message, Throwable throwable) { - if (isDebugEnabled()) { - log(Level.FINE, message, throwable); - } - } - - @Override - public boolean isInfoEnabled() { - return logger.isLoggable(Level.INFO); - } - - @Override - public void info(String message) { - if (isInfoEnabled()) { - log(Level.INFO, message, null); - } - } - - @Override - public void info(String format, Object arg) { - if (isInfoEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg); - log(Level.INFO, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void info(String format, Object arg1, Object arg2) { - if (isInfoEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg1, arg2); - log(Level.INFO, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void info(String format, Object... arguments) { - if (isInfoEnabled()) { - FormattingTuple tuple = MessageFormatter.arrayFormat(format, arguments); - log(Level.INFO, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void info(String message, Throwable throwable) { - if (isInfoEnabled()) { - log(Level.INFO, message, throwable); - } - } - - @Override - public boolean isWarnEnabled() { - return logger.isLoggable(Level.WARNING); - } - - @Override - public void warn(String message) { - if (isWarnEnabled()) { - log(Level.WARNING, message, null); - } - } - - @Override - public void warn(String format, Object arg) { - if (isWarnEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg); - log(Level.WARNING, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void warn(String format, Object... arguments) { - if (isWarnEnabled()) { - FormattingTuple tuple = MessageFormatter.arrayFormat(format, arguments); - log(Level.WARNING, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void warn(String format, Object arg1, Object arg2) { - if (isWarnEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg1, arg2); - log(Level.WARNING, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void warn(String message, Throwable throwable) { - if (isWarnEnabled()) { - log(Level.WARNING, message, throwable); - } - } - - @Override - public boolean isErrorEnabled() { - return logger.isLoggable(Level.SEVERE); - } - - @Override - public void error(String message) { - if (isErrorEnabled()) { - log(Level.SEVERE, message, null); - } - } - - @Override - public void error(String format, Object arg) { - if (isErrorEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg); - log(Level.SEVERE, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void error(String format, Object arg1, Object arg2) { - if (isErrorEnabled()) { - FormattingTuple tuple = MessageFormatter.format(format, arg1, arg2); - log(Level.SEVERE, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void error(String format, Object... arguments) { - if (isErrorEnabled()) { - FormattingTuple tuple = MessageFormatter.arrayFormat(format, arguments); - log(Level.SEVERE, tuple.getMessage(), tuple.getThrowable()); - } - } - - @Override - public void error(String message, Throwable throwable) { - if (isErrorEnabled()) { - log(Level.SEVERE, message, throwable); - } - } - - @Override - public void log(Marker marker, String fqcn, int level, String message, Object[] argArray, Throwable throwable) { - Level level0; - switch (level) { - case LocationAwareLogger.TRACE_INT: - level0 = Level.FINEST; - break; - case LocationAwareLogger.DEBUG_INT: - level0 = Level.FINE; - break; - case LocationAwareLogger.INFO_INT: - level0 = Level.INFO; - break; - case LocationAwareLogger.WARN_INT: - level0 = Level.WARNING; - break; - case LocationAwareLogger.ERROR_INT: - level0 = Level.SEVERE; - break; - default: - throw new IllegalStateException(level + " is not a supported logging level!"); - } - if (logger.isLoggable(level0)) { - log(level0, message, throwable); - } - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/PlatformModule.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/PlatformModule.java deleted file mode 100644 index c51646320..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/module/PlatformModule.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.module; - -import org.anvilpowered.anvil.api.Platform; - -public class PlatformModule extends ApiCommonModule { - - private final Platform platform; - - public PlatformModule(Platform platform) { - this.platform = platform; - } - - public Platform getPlatform() { - return platform; - } - - @Override - protected void configure() { - super.configure(); - bind(Platform.class).toInstance(getPlatform()); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/plugin/AnvilPluginInfo.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/plugin/AnvilPluginInfo.java deleted file mode 100644 index 8c240680a..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/plugin/AnvilPluginInfo.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.plugin; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.util.TextService; - -public class AnvilPluginInfo implements PluginInfo { - public static final String id = "anvil"; - public static final String name = "Anvil"; - public static final String version = "$modVersion"; - public static final String description = "A cross-platform Minecraft plugin framework"; - public static final String url = "https://github.com/AnvilPowered/Anvil"; - public static final String organizationName = "AnvilPowered"; - public static final String[] authors = {organizationName}; - public static final String buildDate = "$buildDate"; - public TString pluginPrefix; - - @Inject - public void setPluginPrefix(TextService textService) { - pluginPrefix = textService.builder().blue().append("[").aqua().append(name).blue().append("] ").build(); - } - - @Override - public String getId() { - return id; - } - - @Override - public String getName() { - return name; - } - - @Override - public String getVersion() { - return version; - } - - @Override - public String getDescription() { - return description; - } - - @Override - public String getUrl() { - return url; - } - - @Override - public String[] getAuthors() { - return authors; - } - - @Override - public String getOrganizationName() { - return organizationName; - } - - @Override - public String getBuildDate() { - return buildDate; - } - - @Override - public TString getPrefix() { - return pluginPrefix; - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/plugin/AnvilPluginMessages.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/plugin/AnvilPluginMessages.java deleted file mode 100644 index 28429fffb..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/plugin/AnvilPluginMessages.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.plugin; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.plugin.PluginMessages; -import org.anvilpowered.anvil.api.util.TextService; -import org.anvilpowered.anvil.api.util.TimeFormatService; - -import java.time.Duration; -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; - -public class AnvilPluginMessages implements PluginMessages { - - @Inject - protected PluginInfo pluginInfo; - - @Inject - protected TextService textService; - - @Inject - protected TimeFormatService timeFormatService; - - @Override - public TString getBanMessage(String reason, Instant endUtc) { - return textService.builder() - .red().append("You have been banned for: ", textService.deserialize(reason)) - .yellow().append("\n\nFor another ", timeFormatService.format(Duration.between(OffsetDateTime.now(ZoneOffset.UTC).toInstant(), endUtc))) - .append("\n\nUntil ", timeFormatService.format(endUtc)) - .build(); - } - - @Override - public TString getMuteMessage(String reason, Instant endUtc) { - return textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("You have been muted for: ", textService.deserialize(reason)) - .yellow().append("\nFor another ", timeFormatService.format(Duration.between(OffsetDateTime.now(ZoneOffset.UTC).toInstant(), endUtc))) - .build(); - } - - @Override - public TString getNoPermission() { - return textService.builder() - .append(pluginInfo.getPrefix()) - .red().append("You do not have permission for this command!") - .build(); - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonTextService.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonTextService.java deleted file mode 100644 index c214ec835..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonTextService.java +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.util; - -import com.google.common.base.Preconditions; -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.Platform; -import org.anvilpowered.anvil.api.plugin.PluginInfo; -import org.anvilpowered.anvil.api.util.TextService; -import org.anvilpowered.anvil.common.command.CommonCallbackCommand; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public abstract class CommonTextService - implements TextService { - - @Inject - private Platform platform; - - @Inject - private PluginInfo pluginInfo; - - @Inject - protected CommonCallbackCommand callbackCommand; - - @Override - public TString success(String s) { - return builder().green().append(s).build(); - } - - @Override - public TString fail(String s) { - return builder().red().append(s).build(); - } - - @Override - public PaginationBuilder paginationBuilder() { - return new CommonExtendedPaginationBuilder(); - } - - @Override - public void send(TString text, TCommandSource receiver, UUID sourceUUID) { - send(text, receiver); - } - - @Override - public void send(TString text, TCommandSource receiver, Object source) { - send(text, receiver); - } - - @Override - public String toPlain(String text) { - return text.replaceAll("&[0-9a-fklmnor]", ""); - } - - private static final Pattern LINE_BREAK_PATTERN = Pattern.compile("\r\n|\r|\n"); - - @Override - public int lineCount(TString text) { - if (text == null) { - return -1; - } - String s = serializePlain(text); - if (s.isEmpty()) { - return 0; - } - Matcher m = LINE_BREAK_PATTERN.matcher(s); - int lines = 1; - while (m.find()) { - lines++; - } - return lines; - } - - protected abstract class CommonTextBuilder - implements Builder { - - @Nullable - protected Consumer callback; - - @Override - public Builder append(CharSequence... contents) { - return append((Object[]) contents); - } - - @Override - public Builder appendCount( - int count, Object... contents) { - for (int i = 0; i < count; i++) { - append(contents); - } - return this; - } - - @Override - public Builder appendCount( - int count, CharSequence... contents) { - for (int i = 0; i < count; i++) { - append(contents); - } - return this; - } - - protected Builder appendWithPadding( - @Nullable BiConsumer before, - @Nullable BiConsumer after, - int width, Object padding, Object... contents) { - if (width < 1) { - throw new IllegalArgumentException("Width must be at least 1"); - } - final TString paddingText = of(padding); - final int paddingLength = length(paddingText); - if (paddingLength < 1) { - throw new IllegalArgumentException("Padding length must be at least 1"); - } else if (width < paddingLength) { - throw new IllegalArgumentException("Padding length must not be greater than width"); - } - final TString contentsText = of(contents); - final int contentsLength = length(contentsText); - if (width < contentsLength) { - throw new IllegalArgumentException("Contents length must not be greater than width"); - } - int missingSpace = (width - contentsLength) / paddingLength; - boolean add = missingSpace != 0; - if (add && before != null) { - before.accept(missingSpace, paddingText); - } - append(contentsText); - if (add && after != null) { - after.accept(missingSpace, paddingText); - } - return this; - } - - @Override - public Builder appendWithPaddingLeft(int width, Object padding, Object... contents) { - return appendWithPadding(this::appendCount, null, width, padding, contents); - } - - @Override - public Builder appendWithPaddingLeft(int width, Object padding, CharSequence... contents) { - return appendWithPaddingLeft(width, padding, (Object[]) contents); - } - - @Override - public Builder appendWithPaddingAround(int width, Object padding, Object... contents) { - BiConsumer bothEnds = (m, c) -> appendCount(m / 2, c); - return appendWithPadding(bothEnds, bothEnds, width, padding, contents); - } - - @Override - public Builder appendWithPaddingAround(int width, Object padding, CharSequence... contents) { - return appendWithPaddingAround(width, padding, (Object[]) contents); - } - - @Override - public Builder appendWithPaddingRight(int width, Object padding, Object... contents) { - return appendWithPadding(null, this::appendCount, width, padding, contents); - } - - @Override - public Builder appendWithPaddingRight(int width, Object padding, CharSequence... contents) { - return appendWithPaddingRight(width, padding, (Object[]) contents); - } - - @Override - public Builder appendIf( - boolean condition, Object... contents) { - return condition ? append(contents) : this; - } - - @Override - public Builder appendIf( - boolean condition, CharSequence... contents) { - return condition ? append(contents) : this; - } - - @Override - public Builder appendJoining( - Object delimiter, CharSequence... contents) { - return appendJoining(delimiter, (Object[]) contents); - } - - @Override - public Builder appendJoiningIf( - boolean condition, Object delimiter, Object... contents) { - return condition ? appendJoining(delimiter, contents) : this; - } - - @Override - public Builder appendJoiningIf( - boolean condition, Object delimiter, CharSequence... contents) { - return condition ? appendJoining(delimiter, contents) : this; - } - - @Override - public Builder appendPrefix() { - return append(pluginInfo.getPrefix()); - } - - @Override - public Builder onHoverShowText( - Builder builder) { - return onHoverShowText(builder.build()); - } - - @Override - public Builder onClickExecuteCallback( - Consumer callback) { - this.callback = callback; - return this; - } - - protected void initializeCallback() { - UUID uuid = UUID.randomUUID(); - callbackCommand.addCallback(uuid, callback); - String platform = Anvil.getPlatform().getName(); - String command; - switch (platform) { - case "bungee": - command = "/anvilb:callback "; - break; - case "velocity": - command = "/anvilv:callback "; - break; - default: - command = "/anvil:callback "; - break; - } - onClickRunCommand(command + uuid); - } - - @Override - public void sendTo(TCommandSource receiver) { - send(build(), receiver); - } - - @Override - public void sendToConsole() { - CommonTextService.this.sendToConsole(build()); - } - } - - protected abstract class CommonPaginationBuilder - implements PaginationBuilder { - - @Override - public PaginationBuilder title( - @Nullable Builder title) { - if (title == null) { - return title((TString) null); - } - return title(title.build()); - } - - @Override - public PaginationBuilder header( - @Nullable Builder header) { - if (header == null) { - return header((TString) null); - } - return header(header.build()); - } - - @Override - public PaginationBuilder footer( - @Nullable Builder footer) { - if (footer == null) { - return footer((TString) null); - } - return footer(footer.build()); - } - - @Override - public PaginationBuilder padding( - Builder padding) { - return padding(padding.build()); - } - } - - protected class CommonExtendedPaginationBuilder - extends CommonPaginationBuilder { - - List contents; - @Nullable - TString title; - @Nullable - TString header; - @Nullable - TString footer; - TString padding; - int linesPerPage; - - public CommonExtendedPaginationBuilder() { - padding = builder().dark_green().append("-").build(); - linesPerPage = 20; - } - - @Override - public PaginationBuilder contents( - TString... contents) { - this.contents = Arrays.asList(contents); - return this; - } - - @Override - public PaginationBuilder contents( - Iterable contents) { - this.contents = new ArrayList<>(64); - contents.forEach(c -> this.contents.add(c)); - return this; - } - - @Override - public PaginationBuilder title( - @Nullable TString title) { - this.title = title; - return this; - } - - @Override - public PaginationBuilder header( - @Nullable TString header) { - this.header = header; - return this; - } - - @Override - public PaginationBuilder footer( - @Nullable TString footer) { - this.footer = footer; - return this; - } - - @Override - public PaginationBuilder padding( - TString padding) { - this.padding = padding; - return this; - } - - @Override - public PaginationBuilder linesPerPage( - int linesPerPage) { - if (linesPerPage < 1) { - throw new IllegalArgumentException("Lines per page must be at least 1"); - } - this.linesPerPage = linesPerPage; - return this; - } - - @Override - public Pagination build() { - return new CommonExtendedPagination( - contents, - title, - header, - footer, - padding, - linesPerPage - ); - } - } - - protected class CommonExtendedPagination - implements Pagination { - - protected final List contents; - - @Nullable - protected final TString title; - - @Nullable - protected final TString header; - - @Nullable - protected final TString footer; - - protected final TString padding; - - protected final int linesPerPage; - - @Nullable - protected List pages; - - protected CommonExtendedPagination( - List contents, - @Nullable TString title, - @Nullable TString header, - @Nullable TString footer, - TString padding, - int linesPerPage - ) { - this.contents = Preconditions.checkNotNull(contents, "contents"); - this.title = title; - this.header = header; - this.footer = footer; - this.padding = Preconditions.checkNotNull(padding, "padding"); - this.linesPerPage = linesPerPage; - } - - @Override - public Iterable getContents() { - return contents; - } - - @Override - public Optional getTitle() { - return Optional.ofNullable(title); - } - - @Override - public Optional getHeader() { - return Optional.ofNullable(header); - } - - @Override - public Optional getFooter() { - return Optional.ofNullable(footer); - } - - @Override - public TString getPadding() { - return padding; - } - - @Override - public int getLinesPerPage() { - return linesPerPage; - } - - protected void buildPages() { - final int LINE_WIDTH; - if (platform.getName().equals("sponge")) { - LINE_WIDTH = 91; - } else { - LINE_WIDTH = 51; - } - pages = new ArrayList<>(); - int contentsIndex = 0; // index in contents list - final int contentsSize = contents.size(); - boolean isFirstPage = true; - outer: - while (contentsIndex < contentsSize) { - Builder page = builder(); - int linesAvailable = linesPerPage - 1; - if (title != null) { - page.appendWithPaddingAround(LINE_WIDTH, ' ', title).append("\n"); - linesAvailable -= lineCount(title); - } - if (header != null) { - page.appendWithPaddingAround(LINE_WIDTH, ' ', header).append("\n"); - linesAvailable -= lineCount(header); - } else { - page.appendWithPaddingAround(LINE_WIDTH, padding).append("\n"); - } - boolean withFooter = false; - if (footer != null) { - // reserve space for footer - // will be added later - withFooter = true; - linesAvailable -= lineCount(footer); - } - for (; linesAvailable > 0; --linesAvailable) { - // check if there are any contents left - if (contentsIndex >= contentsSize) { - // dont add empty lines on first page - if (isFirstPage) { - break; - } - // no more content, add an empty line - page.append("\n"); - } - TString next = contents.get(contentsIndex); - // make sure there's enough space - if (linesAvailable < lineCount(next)) { - continue outer; - } - page.append(next, "\n"); - ++contentsIndex; - } - if (isFirstPage) { - isFirstPage = false; - } - if (withFooter) { - page.appendWithPaddingAround(LINE_WIDTH, padding, footer); - } else { - page.appendWithPaddingAround(LINE_WIDTH, padding); - } - pages.add(page.build()); - } - } - - @Override - public void sendTo(TCommandSource receiver) { - if (pages == null) { - buildPages(); - } - if (pages.size() == 0) { - return; - } - send(pages.get(0), receiver); - } - - @Override - public void sendToConsole() { - sendTo(getConsole()); - } - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonTimeFormatService.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonTimeFormatService.java deleted file mode 100644 index 2a374ed68..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonTimeFormatService.java +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.util; - -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.util.TimeFormatService; - -import java.time.DateTimeException; -import java.time.Duration; -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.temporal.TemporalAccessor; -import java.util.Optional; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class CommonTimeFormatService implements TimeFormatService { - - private static final long SECONDS_IN_YEAR = 31536000; - private static final long SECONDS_IN_MONTH = 2628000; - private static final long SECONDS_IN_WEEK = 604800; - private static final long SECONDS_IN_DAY = 86400; - private static final long SECONDS_IN_HOUR = 3600; - private static final long SECONDS_IN_MINUTE = 60; - - private static final DateTimeFormatter[] dateTimeFormat = { - DateTimeFormatter.ofPattern("ss").withZone(ZoneOffset.UTC), - DateTimeFormatter.ofPattern("mm:ss").withZone(ZoneOffset.UTC), - DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneOffset.UTC), - DateTimeFormatter.ofPattern("dd-HH:mm:ss").withZone(ZoneOffset.UTC), - DateTimeFormatter.ofPattern("MM-dd-HH:mm:ss").withZone(ZoneOffset.UTC), - DateTimeFormatter.ofPattern("uuuu-MM-dd-HH:mm:ss").withZone(ZoneOffset.UTC) - }; - - private static final DateTimeFormatter[] dateTimeFormatZoned = dateTimeFormat.clone(); - - private static final Pattern timePattern = Pattern.compile( - "\\s*((?-?[0-9]*)\\s*[yY])?" + - "\\s*((?-?[0-9]*)\\s*M)?" + - "\\s*((?-?[0-9]*)\\s*[wW])?" + - "\\s*((?-?[0-9]*)\\s*[dD])?" + - "\\s*((?-?[0-9]*)\\s*[hH])?" + - "\\s*((?-?[0-9]*)\\s*m)?" + - "\\s*((?-?[0-9]*)\\s*[sS])?\\s*" - ); - - private static DateTimeFormatter getZonedFormatter(int index) { - DateTimeFormatter result = dateTimeFormatZoned[index]; - ZoneId zone = getZone(); - if (result.getZone().equals(zone)) { - return result; - } - return dateTimeFormatZoned[index] = dateTimeFormat[index].withZone(zone); - } - - private static ZoneId getZone() { - return Anvil.getRegistry().getOrDefault(Keys.TIME_ZONE); - } - - private static Instant utcNow() { - return OffsetDateTime.now(ZoneOffset.UTC).toInstant(); - } - - @Override - public long parseSecondsUnsafe(String input) { - Matcher matcher = timePattern.matcher(input); - if (!matcher.matches()) { - throw new IllegalStateException("Input does not match"); - } - return Optional.ofNullable(matcher.group("years")) - .map(g -> Long.parseLong(g) * SECONDS_IN_YEAR).orElse(0L) - + Optional.ofNullable(matcher.group("months")) - .map(g -> Long.parseLong(g) * SECONDS_IN_MONTH).orElse(0L) - + Optional.ofNullable(matcher.group("weeks")) - .map(g -> Long.parseLong(g) * SECONDS_IN_WEEK).orElse(0L) - + Optional.ofNullable(matcher.group("days")) - .map(g -> Long.parseLong(g) * SECONDS_IN_DAY).orElse(0L) - + Optional.ofNullable(matcher.group("hours")) - .map(g -> Long.parseLong(g) * SECONDS_IN_HOUR).orElse(0L) - + Optional.ofNullable(matcher.group("minutes")) - .map(g -> Long.parseLong(g) * SECONDS_IN_MINUTE).orElse(0L) - + Optional.ofNullable(matcher.group("seconds")) - .map(Long::parseLong).orElse(0L); - } - - @Override - public Optional parseSeconds(String input) { - try { - return Optional.of(parseSecondsUnsafe(input)); - } catch (NumberFormatException | IndexOutOfBoundsException | IllegalStateException ignored) { - return Optional.empty(); - } - } - - @Override - public Duration parseDurationUnsafe(String input) { - return Duration.ofSeconds(parseSecondsUnsafe(input)); - } - - @Override - public Optional parseDuration(String input) { - return parseSeconds(input).map(Duration::ofSeconds); - } - - @Override - public Instant parseFutureInstantUnsafe(String input) { - return utcNow().plusSeconds(parseSecondsUnsafe(input)); - } - - @Override - public Optional parseFutureInstant(String input) { - return parseSeconds(input).map(s -> utcNow().plusSeconds(s)); - } - - @Override - public Instant parseInstantUnsafe(String input) { - return Instant.from(getZonedFormatter(5).parse(input)); - } - - @Override - public Optional parseInstant(String input) { - try { - return Optional.of(parseInstantUnsafe(input)); - } catch (DateTimeException | NullPointerException ignored) { - return Optional.empty(); - } - } - - @Override - public ZonedDateTime fromUTC(Instant instant) { - return instant.atZone(getZone()); - } - - @Override - public FormatResult format(Duration duration) { - return new DurationFormatResult(duration); - } - - @Override - public FormatResult format(TemporalAccessor temporal) { - return new TemporalFormatResult(temporal); - } - - @Override - public FormatResult formatDurationUnsafe(String input) { - return format(parseDurationUnsafe(input)); - } - - @Override - public Optional formatDuration(String input) { - return parseDuration(input).map(this::format); - } - - @Override - public FormatResult formatInstantUnsafe(String input) { - return format(parseInstantUnsafe(input)); - } - - @Override - public Optional formatInstant(String input) { - return parseInstant(input).map(this::format); - } - - private static final class DurationFormatResult implements FormatResult { - - private final Duration duration; - int maxCharacters; - int maxUnits; - boolean withoutNano; - - private DurationFormatResult(Duration duration) { - this.duration = duration; - maxCharacters = -1; - maxUnits = -1; - withoutNano = false; - } - - @Override - public FormatResult maxCharacters(int maxCharacters) { - this.maxCharacters = maxCharacters; - return this; - } - - @Override - public FormatResult maxUnits(int maxUnits) { - this.maxUnits = maxUnits; - return this; - } - - @Override - public FormatResult withoutNano() { - withoutNano = true; - return this; - } - - @Override - public String toString() { - if (maxCharacters == 0 || maxUnits == 0) { - return ""; - } - StringBuilder s = new StringBuilder(); - long seconds = duration.getSeconds(); - int nanos = duration.getNano(); - if (seconds == 0) { - return nanos > 0 ? nanos + " nanoseconds" : "0 seconds"; - } - long years = seconds / SECONDS_IN_YEAR; - seconds -= SECONDS_IN_YEAR * years; - long months = seconds / SECONDS_IN_MONTH; - seconds -= SECONDS_IN_MONTH * months; - long weeks = seconds / SECONDS_IN_WEEK; - seconds -= SECONDS_IN_WEEK * weeks; - long days = seconds / SECONDS_IN_DAY; - seconds -= SECONDS_IN_DAY * days; - long hours = seconds / SECONDS_IN_HOUR; - seconds -= SECONDS_IN_HOUR * hours; - long minutes = seconds / SECONDS_IN_MINUTE; - seconds -= SECONDS_IN_MINUTE * minutes; - int units = maxUnits < 0 ? Integer.MIN_VALUE : 0; - int maxCharacters = this.maxCharacters < 0 ? Integer.MAX_VALUE : this.maxCharacters; - if (years != 0) { - String t = years + (years == 1 ? " year, " : " years, "); - if (s.length() + t.length() <= maxCharacters) { - s.append(t); - ++units; - } - } - if (months != 0 && units <= maxUnits) { - String t = months + (months == 1 ? " month, " : " months, "); - if (s.length() + t.length() <= maxCharacters) { - s.append(t); - ++units; - } - } - if (weeks != 0 && units <= maxUnits) { - String t = weeks + (weeks == 1 ? " week, " : " weeks, "); - if (s.length() + t.length() <= maxCharacters) { - s.append(t); - ++units; - } - } - if (days != 0 && units <= maxUnits) { - String t = days + (days == 1 ? " day, " : " days, "); - if (s.length() + t.length() <= maxCharacters) { - s.append(t); - ++units; - } - } - if (hours != 0 && units <= maxUnits) { - String t = hours + (hours == 1 ? " hour, " : " hours, "); - if (s.length() + t.length() <= maxCharacters) { - s.append(t); - ++units; - } - } - if (minutes != 0 && units <= maxUnits) { - String t = minutes + (minutes == 1 ? " minute, " : " minutes, "); - if (s.length() + t.length() <= maxCharacters) { - s.append(t); - ++units; - } - } - if (seconds != 0 && units <= maxUnits) { - String t = seconds + (seconds == 1 ? " second, " : " seconds, "); - if (s.length() + t.length() <= maxCharacters) { - s.append(t); - ++units; - } - } - if (nanos != 0 && !withoutNano && units <= maxUnits) { - String t = nanos + (nanos == 1 ? " nanosecond" : " nanoseconds"); - if (s.length() + t.length() <= maxCharacters) { - s.append(t); - return s.toString(); - } - } - if (s.length() > 1) { - s.deleteCharAt(s.length() - 1); - s.deleteCharAt(s.length() - 1); - } - return s.toString(); - } - } - - private static final class TemporalFormatResult implements FormatResult { - - private final TemporalAccessor temporal; - int maxUnits; - boolean withoutNano; - - private TemporalFormatResult(TemporalAccessor temporal) { - this.temporal = temporal; - maxUnits = -1; - withoutNano = false; - } - - @Override - public FormatResult maxCharacters(int maxCharacters) { - if (maxCharacters < 0 || maxCharacters > 18) { - maxUnits = -1; - } else if (maxCharacters > 13) { - maxUnits = 5; - } else if (maxCharacters > 10) { - maxUnits = 4; - } else if (maxCharacters > 7) { - maxUnits = 3; - } else if (maxCharacters > 4) { - maxUnits = 2; - } else if (maxCharacters > 1) { - maxUnits = 1; - } else { - maxUnits = 0; - } - return this; - } - - @Override - public FormatResult maxUnits(int maxUnits) { - this.maxUnits = maxUnits; - return this; - } - - @Override - public FormatResult withoutNano() { - return this; - } - - @Override - public String toString() { - if (maxUnits == 0) { - return ""; - } - if (maxUnits < 0 || maxUnits > 6) { - return getZonedFormatter(5).format(temporal); - } - return getZonedFormatter(maxUnits - 1).format(temporal); - } - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonUserService.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonUserService.java deleted file mode 100644 index 0ef27ca50..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/CommonUserService.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.util; - -import com.google.common.collect.ImmutableList; -import org.anvilpowered.anvil.api.Anvil; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; -import org.anvilpowered.anvil.api.util.UserService; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -@SuppressWarnings("unchecked") -public abstract class CommonUserService implements UserService { - - private static final UUID constant = UUID.nameUUIDFromBytes(new byte[0]); - - private final Class userClass; - - protected CommonUserService(Class userClass) { - this.userClass = userClass; - } - - @Override - public List matchPlayerNames(String[] context, int index, int length) { - if (context.length == length) { - return matchPlayerNames(context[index]); - } - return ImmutableList.of(); - } - - @Override - public CompletableFuture> getUUID(String userName) { - return Anvil.getCoreMemberRepository() - .getOneForUser(userName).thenApplyAsync(c -> c.map(CoreMember::getUserUUID)); - } - - @Override - public CompletableFuture> getUserName(UUID userUUID) { - return Anvil.getCoreMemberRepository() - .getOneForUser(userUUID).thenApplyAsync(c -> c.map(CoreMember::getUserName)); - } - - @Override - public UUID getUUIDSafe(Object object) { - if (userClass.isInstance(object)) { - return getUUID((TUser) object); - } else { - return constant; - } - } -} diff --git a/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/StringTextService.java b/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/StringTextService.java deleted file mode 100644 index d0c123506..000000000 --- a/anvil-common/src/main/java/org/anvilpowered/anvil/common/util/StringTextService.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.util; - -import java.net.URL; -import java.util.function.Consumer; - -public abstract class StringTextService - extends CommonTextService { - - @Override - public String deserialize(String text) { - return text; - } - - @Override - public String serializePlain(String text) { - return toPlain(text); - } - - @Override - public String serialize(String text) { - return text; - } - - protected class StringTextBuilder extends CommonTextBuilder { - protected final StringBuilder elements; - - public StringTextBuilder() { - elements = new StringBuilder(); - } - - @Override - public Builder aqua() { - elements.append("\u00a7b"); - return this; - } - - @Override - public Builder black() { - elements.append("\u00a70"); - return this; - } - - @Override - public Builder blue() { - elements.append("\u00a79"); - return this; - } - - @Override - public Builder dark_aqua() { - elements.append("\u00a73"); - return this; - } - - @Override - public Builder dark_blue() { - elements.append("\u00a71"); - return this; - } - - @Override - public Builder dark_gray() { - elements.append("\u00a78"); - return this; - } - - @Override - public Builder dark_green() { - elements.append("\u00a72"); - return this; - } - - @Override - public Builder dark_purple() { - elements.append("\u00a75"); - return this; - } - - @Override - public Builder dark_red() { - elements.append("\u00a74"); - return this; - } - - @Override - public Builder gold() { - elements.append("\u00a76"); - return this; - } - - @Override - public Builder gray() { - elements.append("\u00a77"); - return this; - } - - @Override - public Builder green() { - elements.append("\u00a7a"); - return this; - } - - @Override - public Builder light_purple() { - elements.append("\u00a7d"); - return this; - } - - @Override - public Builder red() { - elements.append("\u00a7c"); - return this; - } - - @Override - public Builder reset() { - elements.append("\u00a7r"); - return this; - } - - @Override - public Builder white() { - elements.append("\u00a7f"); - return this; - } - - @Override - public Builder yellow() { - elements.append("\u00a7e"); - return this; - } - - @Override - public Builder bold() { - elements.append("\u00a7l"); - return this; - } - - @Override - public Builder italic() { - elements.append("\u00a7o"); - return this; - } - - @Override - public Builder obfuscated() { - elements.append("\u00a7k"); - return this; - } - - @Override - public Builder strikethrough() { - elements.append("\u00a7m"); - return this; - } - - @Override - public Builder underlined() { - elements.append("\u00a7n"); - return this; - } - - @Override - public Builder append(Object... contents) { - for (Object o : contents) { - if (o instanceof Builder) { - elements.append(((Builder) o).build()); - } else { - elements.append(o); - } - } - return this; - } - - @Override - public Builder appendJoining(Object delimiter, Object... contents) { - if (delimiter instanceof Builder) { - delimiter = ((Builder) delimiter).build(); - } - final int indexOfLast = contents.length - 1; - for (int i = 0; i <= indexOfLast; i++) { - Object o = contents[i]; - if (o instanceof Builder) { - elements.append(((Builder) o).build()); - } else { - elements.append(o); - } - if (i != indexOfLast) { - elements.append(delimiter); - } - } - return this; - } - - @Override - public Builder onHoverShowText(String content) { - return this; - } - - @Override - public Builder onClickSuggestCommand(String command) { - return this; - } - - @Override - public Builder onClickRunCommand(String command) { - return this; - } - - @Override - public Builder onClickExecuteCallback(Consumer callback) { - return this; - } - - @Override - public Builder onClickOpenUrl(URL url) { - return this; - } - - @Override - public Builder onClickOpenUrl(String url) { - return this; - } - - @Override - public String build() { - return elements.toString(); - } - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/Change.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/Change.kt deleted file mode 100644 index b1d6db12c..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/Change.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.common.command.regedit - -import org.anvilpowered.anvil.api.registry.Key -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.api.util.TextService - -class Change( - private val registry: Registry, - private val textService: TextService, - val key: Key, - var newValue: T? = null, -) { - - private val remove: TString by lazy { - textService.builder() - .red().append("[R]") - .onHoverShowText(textService.builder() - .red().append("Remove this change\n") - .gray().append("/$alias regedit key $key unstage") - ).onClickRunCommand("/$alias regedit key $key unstage") - .build() - } - - constructor(stage: Stage, key: Key, newValue: T? = null) - : this(stage.registry.second, stage.textService, key, newValue) - - fun apply(registry: Registry) { - registry.set(key, newValue) - } - - fun print(): TString { - return textService.builder() - .append(remove, " ") - .gold().append(key.name, " > ") - .append(textService.printValueYellow(key, registry.get(key).orElse(null))) - .gray().append(" -> ") - .append(textService.printValueGreen(key, newValue)) - .build() - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditBaseCommand.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditBaseCommand.kt deleted file mode 100644 index 1fa19401b..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditBaseCommand.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command.regedit - -import com.google.inject.Inject -import org.anvilpowered.anvil.api.plugin.PluginInfo -import org.anvilpowered.anvil.api.plugin.PluginMessages -import org.anvilpowered.anvil.api.registry.Keys -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.api.util.PermissionService -import org.anvilpowered.anvil.api.util.TextService -import org.anvilpowered.anvil.api.util.UserService - -open class CommonRegistryEditBaseCommand { - - @Inject - protected lateinit var registry: Registry - - @Inject - protected lateinit var permissionService: PermissionService - - @Inject - protected lateinit var pluginInfo: PluginInfo - - @Inject - protected lateinit var pluginMessages: PluginMessages - - @Inject - protected lateinit var textService: TextService - - @Inject - protected lateinit var userService: UserService - - fun testPermission(source: Any?): Boolean { - return permissionService.hasPermission(source ?: return false, registry.getOrDefault(Keys.REGEDIT_PERMISSION)) - } - - fun hasNoPerms(source: TCommandSource): Boolean { - if (!testPermission(source)) { - textService.send(pluginMessages.noPermission, source) - return true - } - return false - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCancelCommand.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCancelCommand.kt deleted file mode 100644 index f4b3447ac..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCancelCommand.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command.regedit - -import com.google.inject.Inject - -open class CommonRegistryEditCancelCommand - : CommonRegistryEditBaseCommand() { - - @Inject - private lateinit var registryEditRootCommand: CommonRegistryEditRootCommand - - fun execute(source: TCommandSource, context: Array? = null) { - if (hasNoPerms(source)) return - val builder = textService.builder().append(pluginInfo.prefix) - val removed = registryEditRootCommand.stages.remove(userService.getUUIDSafe(source)) - if (removed == null) { - builder.red().append("Could not find stage") - } else { - builder.green().append("Successfully cancelled changes. Didn't mean to? ") - .append(textService.undo("/$alias regedit start ${removed.envName}")) - }.sendTo(source) - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCommandNode.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCommandNode.kt deleted file mode 100644 index de50cff47..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCommandNode.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command.regedit - -import com.google.inject.Inject -import org.anvilpowered.anvil.api.Environment -import org.anvilpowered.anvil.api.command.CommandNode -import org.anvilpowered.anvil.api.command.CommandService -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.common.command.CommonAnvilCommandNode -import java.util.function.Function -import java.util.function.Predicate - -abstract class CommonRegistryEditCommandNode( - val registry: Registry, -) : CommandNode { - - companion object { - val CANCEL_ALIAS = listOf("cancel") - val COMMIT_ALIAS = listOf("commit") - val KEY_ALIAS = listOf("key") - val SELECT_ALIAS = listOf("select") - val START_ALIAS = listOf("start") - val HELP_ALIAS = listOf("help") - - const val CANCEL_DESCRIPTION = "Cancel a stage" - const val COMMIT_DESCRIPTION = "Commit changes" - const val KEY_DESCRIPTION = "Do stuff with a key" - const val SELECT_DESCRIPTION = "Select a registry" - const val START_DESCRIPTION = "Start a regedit with the specified environment" - const val ROOT_DESCRIPTION = "Root regedit command" - - const val KEY_USAGE = " [info|set|unset|unstage] []" - const val SELECT_USAGE = "" - const val START_USAGE = "" - - const val REGEDIT = "regedit" - lateinit var PATH: Array - } - - private var alreadyLoaded = false - private val descriptions: MutableMap, Function> = HashMap() - private val permissions: MutableMap, Predicate> = HashMap() - private val usages: MutableMap, Function> = HashMap() - - @Inject - protected lateinit var commandService: CommandService - - @Inject - protected lateinit var environment: Environment - - init { - registry.whenLoaded { - if (alreadyLoaded) return@whenLoaded - PATH = arrayOf(CommonAnvilCommandNode.getAlias()) - loadCommands() - alreadyLoaded = true - }.order(-10).register() // has to load before main node - descriptions.put(CANCEL_ALIAS) { CANCEL_DESCRIPTION } - descriptions.put(COMMIT_ALIAS) { COMMIT_DESCRIPTION } - descriptions.put(KEY_ALIAS) { KEY_DESCRIPTION } - descriptions.put(SELECT_ALIAS) { SELECT_DESCRIPTION } - descriptions.put(START_ALIAS) { START_DESCRIPTION } - usages.put(KEY_ALIAS) { KEY_USAGE } - usages.put(SELECT_ALIAS) { SELECT_USAGE } - usages.put(START_ALIAS) { START_USAGE } - } - - protected abstract fun loadCommands() - override fun getName(): String = REGEDIT - override fun getDescriptions(): Map, Function> = descriptions - override fun getPermissions(): Map, Predicate> = permissions - override fun getUsages(): Map, Function> = usages - override fun getPath(): Array = PATH -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCommitCommand.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCommitCommand.kt deleted file mode 100644 index 06f4dc9e6..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditCommitCommand.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command.regedit - -import com.google.inject.Inject - -open class CommonRegistryEditCommitCommand - : CommonRegistryEditBaseCommand() { - - @Inject - private lateinit var registryEditRootCommand: CommonRegistryEditRootCommand - - fun execute(source: TCommandSource, context: Array? = null) { - if (hasNoPerms(source)) return - val uuid = userService.getUUIDSafe(source) - val stage = registryEditRootCommand.stages[uuid] - if (stage == null) { - textService.send(registryEditRootCommand.notInStage, source) - return - } - if (stage.commit(source)) { - registryEditRootCommand.stages.remove(uuid) - } - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditKeyCommand.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditKeyCommand.kt deleted file mode 100644 index f4649bd6c..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditKeyCommand.kt +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.common.command.regedit - -import com.google.inject.Inject -import org.anvilpowered.anvil.api.registry.Key -import org.anvilpowered.anvil.api.registry.Keys -import kotlin.streams.toList - -open class CommonRegistryEditKeyCommand - : CommonRegistryEditBaseCommand() { - - @Inject - private lateinit var registryEditRootCommand: CommonRegistryEditRootCommand - - private val keyActions = listOf("info", "set", "unset", "unstage") - - private val usage: TString by lazy { - textService.builder() - .red().append("Usage: /$alias regedit key [info|set|unset|unstage] []") - .build() - } - - private val setUsage: TString by lazy { - textService.builder() - .append(pluginInfo.prefix) - .red().append("Value required for set subcommand. Usage: /$alias regedit key set ") - .build() - } - - private fun unknownKey(keyName: String) = textService.builder() - .append(pluginInfo.prefix) - .red().append("Unknown key: ") - .gold().append(keyName) - .build() - - private fun String.resolveKey(envName: String): Key? { - return Keys.resolveLocalAndGlobal(this, envName).orElse(null) - } - - open fun execute(source: TCommandSource, context: Array) { - if (hasNoPerms(source)) return - val stage = registryEditRootCommand.stages[userService.getUUIDSafe(source)] - if (stage == null) { - textService.send(registryEditRootCommand.notInStage, source) - return - } - textService.send(when (context.size) { - 0, 1 -> usage - 2 -> when (val key = context[0].resolveKey(stage.envName)) { - null -> unknownKey(context[0]) - else -> when (context[1]) { - "info" -> stage.info(key) - "set" -> setUsage - "unset" -> stage.addChange(key) - "unstage" -> stage.unstageChange(key) - else -> usage - } - } - 3 -> when (val key = context[0].resolveKey(stage.envName)) { - null -> unknownKey(context[0]) - else -> when (context[1]) { - "set" -> { - try { - stage.addChange(key, key.parse(context[2])) - } catch (e: Exception) { - textService.builder() - .append(pluginInfo.prefix) - .red().append("Error: ", e.message) - .build() - } - } - "info", "unset", "unstage" -> textService.builder() - .append(pluginInfo.prefix) - .red().append("Too many args for ${context[1]}! ", usage) - .build() - else -> usage - } - } - else -> usage - }, source) - } - - open fun suggest(source: TCommandSource, context: Array): List { - if (!testPermission(source)) return listOf() - val stage = registryEditRootCommand.stages[userService.getUUIDSafe(source)] ?: return listOf() - return when (context.size) { - 1 -> Keys.getAll(stage.envName).keys.stream().filter { it.startsWith(context[0]) }.toList() - 2 -> keyActions.stream().filter { it.startsWith(context[1]) }.toList() - else -> listOf() - } - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditRootCommand.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditRootCommand.kt deleted file mode 100644 index c67c54202..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditRootCommand.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command.regedit - -import java.util.UUID - -open class CommonRegistryEditRootCommand - : CommonRegistryEditBaseCommand() { - - val stages: MutableMap> = HashMap() - - val notInStage: TString by lazy { - textService.builder() - .append(pluginInfo.prefix) - .red().append("You are not currently in a regedit session. Use /$alias regedit help") - .build() - } - - fun execute(source: TCommandSource, context: Array? = null) { - if (hasNoPerms(source)) return - textService.send(stages[userService.getUUIDSafe(source)]?.print() ?: notInStage, source) - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditSelectCommand.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditSelectCommand.kt deleted file mode 100644 index f09609a80..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditSelectCommand.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command.regedit - -import com.google.inject.Inject -import kotlin.streams.toList - -open class CommonRegistryEditSelectCommand - : CommonRegistryEditBaseCommand() { - - @Inject - private lateinit var registryEditRootCommand: CommonRegistryEditRootCommand - - private val usage: TString by lazy { - textService.builder() - .append(pluginInfo.prefix) - .red().append("Please provide exactly one argument!\nUsage: /$alias regedit select ") - .build() - } - - open fun execute(source: TCommandSource, context: Array) { - if (hasNoPerms(source)) return - val uuid = userService.getUUIDSafe(source) - val stage = registryEditRootCommand.stages[uuid] - textService.send(when { - stage == null -> registryEditRootCommand.notInStage - context.size == 1 -> stage.setRegistry(context[0]) - else -> usage - }, source) - } - - open fun suggest(source: TCommandSource, context: Array): List { - if (!testPermission(source)) return listOf() - val stage = registryEditRootCommand.stages[userService.getUUIDSafe(source)] ?: return listOf() - return when (context.size) { - 1 -> stage.registries.keys.stream().filter { it.startsWith(context[0]) }.toList() - else -> listOf() - } - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditStartCommand.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditStartCommand.kt deleted file mode 100644 index b893dc09e..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/CommonRegistryEditStartCommand.kt +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command.regedit - -import com.google.inject.Inject -import com.google.inject.name.Named -import org.anvilpowered.anvil.api.Anvil -import org.anvilpowered.anvil.api.Environment -import org.anvilpowered.anvil.api.registry.ConfigurationService -import org.anvilpowered.anvil.api.registry.Registry -import java.util.stream.Collectors -import java.util.stream.Stream -import kotlin.streams.toList - -open class CommonRegistryEditStartCommand - : CommonRegistryEditBaseCommand() { - - @Inject - private lateinit var registryEditRootCommand: CommonRegistryEditRootCommand - - private val envRegs: MutableMap> = HashMap() - - private val environments: Stream - get() = Anvil.getEnvironmentManager() - .environments.values.stream() - .map { it.name } - .sorted() - - private val environmentsPrinted: String - get() = Anvil.getEnvironmentManager() - .environments.values.stream() - .map { it.name } - .sorted().collect(Collectors.joining(", ")) - - private fun parseEnv(envName: String?): Environment? { - return Anvil.getEnvironmentManager().getEnvironment(envName).orElse(null) - } - - private fun parseEnv(envName: String?, then: (Environment) -> TString): TString { - return parseEnv(envName)?.let { then(it) } - ?: textService.builder() - .append(pluginInfo.prefix) - .red().append("Could not find environment ") - .gold().append(envName) - .build() - } - - private fun Environment.getRegistries(): Map { - return envRegs[name] ?: run { - val registries: MutableMap = HashMap() - val main = injector.getInstance(Registry::class.java) - val config = injector.getInstance(ConfigurationService::class.java) - for ((key, value) in injector.bindings) { - if (key.typeLiteral.type == Registry::class) { - val reg = value.provider.get() as? Registry ?: continue - if (reg !== main && reg !== config) { - registries[(key.annotation as? Named)?.value ?: continue] = reg - } - } - } - registries["main"] = main - registries["config"] = config - envRegs[name] = registries - return registries - } - } - - open fun execute(source: TCommandSource, context: Array) { - if (hasNoPerms(source)) return - if (context.isEmpty()) { - textService.builder() - .append(pluginInfo.prefix) - .red().append("Please select an environment. Usage: /$alias regedit select \n") - .append("Available environments: ").gold().append(environmentsPrinted) - .sendTo(source) - return - } - textService.send(parseEnv(context[0]) { - val newStage = Stage(context[0], it.getRegistries().toMutableMap(), - it.getPluginInfo(), textService) - registryEditRootCommand.stages[userService.getUUIDSafe(source)] = newStage - newStage.print() - }, source) - } - - open fun suggest(source: TCommandSource, context: Array): List { - if (!testPermission(source)) return listOf() - return when (context.size) { - 1 -> environments.filter { it.startsWith(context[0]) }.toList() - else -> listOf() - } - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/RegEdit.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/RegEdit.kt deleted file mode 100644 index cb17dd9ad..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/RegEdit.kt +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.command.regedit - -import org.anvilpowered.anvil.api.registry.Key -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.api.util.TextService -import org.anvilpowered.anvil.common.command.CommonAnvilCommandNode - -val alias by lazy { CommonAnvilCommandNode.getAlias()!! } - -val whitespace = "\\s+".toRegex() - -fun TextService.undo(cmd: String): TString { - return builder() - .light_purple().append("[ Undo ]") - .onHoverShowText(builder() - .light_purple().append("Undo this action\n") - .gray().append(cmd) - ).onClickRunCommand(cmd) - .build() -} - -fun TextService.info(key: Key, registry: Registry): TString { - return builder() - .gold().append(key, " >").gray() - .append("\nValue: ", printValueYellow(key, registry.get(key).orElse(null))) - .append("\nDefault: ", printValueYellow(key, registry.getDefault(key))) - .append("\nFallback: ", printValueYellow(key, key.fallbackValue)) - .build() -} - -fun TextService.printValueGreen(key: Key, value: T?): TString { - if (value == null) { - return builder().red().append("none").build() - } - val primary = key.toString(value) - val secondary = value.toString() - val builder = builder().green().append(primary) - if (primary != secondary) { - builder.gray().append(" (", secondary, ")") - } - return builder.build() -} - -fun TextService.printValueYellow(key: Key, value: T?): TString { - if (value == null) { - return builder().red().append("none").build() - } - val primary = key.toString(value) - val secondary = value.toString() - val builder = builder().yellow().append(primary) - if (primary != secondary) { - builder.gray().append(" (", secondary, ")") - } - return builder.build() -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/Stage.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/Stage.kt deleted file mode 100644 index 9f077e5c5..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/command/regedit/Stage.kt +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.common.command.regedit - -import org.anvilpowered.anvil.api.plugin.PluginInfo -import org.anvilpowered.anvil.api.registry.ConfigurationService -import org.anvilpowered.anvil.api.registry.Key -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.api.util.TextService - -class Stage( - val envName: String, - val registries: MutableMap, - val pluginInfo: PluginInfo, - val textService: TextService, -) { - - lateinit var registry: Pair - - private val changes: MutableList> = ArrayList() - private val availableRegistries: TString - - private val border = textService.builder() - .dark_gray().appendCount(15, '=') - .append(" [ ").gold().append("Anvil RegEdit") - .dark_gray().append(" ] ").appendCount(15, '=') - .build() - - private val view = textService.builder() - .aqua().append("[ Key ]") - .onHoverShowText(textService.builder() - .aqua().append("Key\n") - .gray().append("/$alias regedit key [info|set|unset|unstage]") - ).onClickSuggestCommand("/$alias regedit key ") - .build() - - private val cancel = textService.builder() - .red().append("[ Cancel ]") - .onHoverShowText(textService.builder() - .red().append("Cancel\n") - .gray().append("/$alias regedit cancel") - ).onClickRunCommand("/$alias regedit cancel") - .build() - - private val commit = textService.builder() - .gold().append("[ Commit ]") - .onHoverShowText(textService.builder() - .gold().append("Commit\n") - .gray().append("/$alias regedit commit") - ).onClickRunCommand("/$alias regedit commit") - .build() - - private val noSuchChange = textService.builder() - .append(pluginInfo.prefix) - .red().append("Could not find change") - .build() - - private val selectRegistry = textService.builder() - .append(pluginInfo.prefix) - .red().append("You must select a registry") - .build() - - private val sensitive = textService.builder() - .append(pluginInfo.prefix) - .red().append("This key is sensitive and may only be viewed or edited if ") - .gold().append("server.regeditAllowSensitive ") - .red().append("is enabled in the config") - .build() - - private val userImmutable = textService.builder() - .append(pluginInfo.prefix) - .red().append("This key is user immutable and may not be edited with the regedit command") - .build() - - fun setRegistry(name: String?): TString { - val newReg = when (name) { - null, "internal", "r", "registry" -> Pair("main", registries["main"]) - "c" -> Pair("config", registries["config"]) - else -> Pair(name, registries[name]) - } - return if (newReg.second == null) { - textService.fail("Could not find registry $name") - } else { - registry = Pair(newReg.first, newReg.second!!) - print() - } - } - - init { - val builder = textService.builder().aqua() - // reference equality, we want to check specifically for the same instance - // if these are the same, don't show [ Internal ] and [ Config ] separately - if (registries["main"] !== registries["config"]) { - builder.append(textService.builder() - .aqua().append("[ Internal ]") - .onHoverShowText(textService.builder() - .aqua().append("The main registry\n") - .gray().append("/$alias regedit select internal") - ).onClickRunCommand("/$alias regedit select internal") - ).append(" ") - } - builder.append(textService.builder() - .aqua().append("[ Config ]") - .onHoverShowText(textService.builder() - .aqua().append("The configuration\n") - .gray().append("/$alias regedit select config") - ).onClickRunCommand("/$alias regedit select config") - ) - for ((name, _) in registries) { - if (name == "main" || name == "config") { - continue - } - val cmd = "/$alias regedit select $name" - builder.append(" ", textService.builder() - .aqua().append("[ ", name, " ]") - .onHoverShowText(textService.builder() - .aqua().append(name) - .gray().append(cmd) - ).onClickRunCommand(cmd) - ) - } - availableRegistries = builder.build() - } - - fun info(key: Key<*>): TString { - return when { - !::registry.isInitialized -> selectRegistry - else -> when (key.isSensitive(registry.second)) { - true -> sensitive - false -> textService.info(key, registry.second) - } - } - } - - fun commit(source: TCommandSource): Boolean { - if (!::registry.isInitialized) { - textService.send(selectRegistry, source) - return false - } - val reg = registry.second - if (changes.isEmpty()) { - textService.builder() - .append(pluginInfo.prefix) - .red().append("You have no changes!") - .sendTo(source) - return false - } - changes.forEach { it.apply(reg) } - if (reg is ConfigurationService) { - if (reg.save()) { - reg.load() - textService.builder() - .append(pluginInfo.prefix) - .green().append("Successfully committed and saved ") - .gold().append(changes.size) - .green().append(" changes!") - .sendTo(source) - } else { - textService.builder() - .append(pluginInfo.prefix) - .red().append("There was an error saving the config!") - .sendTo(source) - return false - } - } else { - reg.load() - textService.builder() - .append(pluginInfo.prefix) - .green().append("Successfully committed ") - .gold().append(changes.size) - .green().append(" changes!") - .sendTo(source) - } - return true - } - - fun addChange(key: Key, newValue: T? = null): TString { - if (!::registry.isInitialized) { - return selectRegistry - } - if (key.isUserImmutable) { - return userImmutable - } - if (key.isSensitive(registry.second)) { - return sensitive - } - val existing = changes.stream() - .filter { it.key == key } - .findAny().orElse(null) as? Change - val action: String - if (existing == null) { - changes += Change(this, key, newValue) - action = "added" - } else { - existing.newValue = newValue - action = "edited" - } - return print(textService.builder() - .green().append("Successfully $action change for ") - .gold().append(key, " ", textService.undo("/$alias regedit key $key unstage")) - .build()) - } - - fun unstageChange(key: Key): TString { - if (!::registry.isInitialized) { - return selectRegistry - } - val index = changes.indexOfFirst { it.key == key } - if (index == -1) { - return noSuchChange - } - val removed = changes.removeAt(index) as Change - return print(textService.builder() - .green().append("Successfully unstaged change for ") - .gold().append(key, " ", textService.undo("/$alias regedit key $key set ${key.toString(removed.newValue)}")) - .build()) - } - - fun print(message: TString? = null): TString { - if (!::registry.isInitialized) { - return textService.builder() - .append(border, "\n\n") - .green().append("Started a regedit session for ") - .gold().append(pluginInfo.name, "\n\n") - .gray().append("Please select one of the following registries:\n\n", availableRegistries) - .gray().append("\nor ", cancel, "\n\n", border) - .build() - } - val builder = textService.builder() - .append(border, "\n\n") - .appendIf(message != null, message, "\n\n") - .aqua().append("[ ", registry.first, " ]") - .gray().append(" Queued changes:") - if (changes.isEmpty()) { - builder.red().append(" (none)") - } else { - builder.append("\n") - for (change in changes) { - builder.append("\n", change.print()) - } - } - return builder.gray().append("\n\nPlease select an action:\n\n") - .append(view, " ", commit, " ", cancel, "\n\n", border) - .build() - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/module/FallbackModule.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/module/FallbackModule.kt deleted file mode 100644 index e830af85a..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/module/FallbackModule.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.module - -import com.google.common.reflect.TypeToken -import com.google.inject.AbstractModule -import org.anvilpowered.anvil.api.Anvil -import org.anvilpowered.anvil.api.plugin.BasicPluginInfo -import org.anvilpowered.anvil.api.plugin.PluginInfo -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.base.registry.BaseRegistry -import org.anvilpowered.anvil.common.plugin.FallbackPluginInfo - -@Suppress("UnstableApiUsage") -open class FallbackModule : AbstractModule() { - override fun configure() { - val be = Anvil.getBindingExtensions(binder()); - val fallbackPluginInfoToken = object : TypeToken>(javaClass) {} - be.bind(TypeToken.of(BasicPluginInfo::class.java), fallbackPluginInfoToken) - be.bind(object : TypeToken>(javaClass) {}, fallbackPluginInfoToken) - bind(Registry::class.java).to(BaseRegistry::class.java) - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/plugin/FallbackPluginInfo.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/plugin/FallbackPluginInfo.kt deleted file mode 100644 index 4a8a5fe1a..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/plugin/FallbackPluginInfo.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.plugin - -import com.google.inject.Inject -import org.anvilpowered.anvil.api.Environment -import org.anvilpowered.anvil.api.plugin.PluginInfo -import org.anvilpowered.anvil.api.util.TextService - -class FallbackPluginInfo : PluginInfo { - companion object { - const val version = "v0" - const val description = "description" - const val url = "URL" - val authors = arrayOf("author") - const val organizationName = "organizationName" - const val buildDate = "last night" - } - - @Inject - private lateinit var environment: Environment - - lateinit var pluginPrefix: TString - - @Inject - fun setPluginPrefix(textService: TextService) { - pluginPrefix = textService.builder().gold().append("[", name, "] ").build() - } - - override fun getId(): String = environment.name - override fun getName(): String = environment.name - override fun getVersion(): String = Companion.version - override fun getDescription(): String = Companion.description - override fun getUrl(): String = Companion.url - override fun getAuthors(): Array = Companion.authors - override fun getOrganizationName(): String = Companion.organizationName - override fun getBuildDate(): String = Companion.buildDate - override fun getPrefix(): TString = pluginPrefix -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/registry/CommonConfigurationService.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/registry/CommonConfigurationService.kt deleted file mode 100644 index 92f640441..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/registry/CommonConfigurationService.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.common.registry - -import com.google.inject.Inject -import com.google.inject.Singleton -import ninja.leaping.configurate.ConfigurationOptions -import ninja.leaping.configurate.commented.CommentedConfigurationNode -import ninja.leaping.configurate.loader.ConfigurationLoader -import ninja.leaping.configurate.objectmapping.serialize.TypeSerializerCollection -import org.anvilpowered.anvil.api.registry.Keys -import org.anvilpowered.anvil.base.registry.BaseConfigurationService - -@Singleton -open class CommonConfigurationService @Inject constructor( - configLoader: ConfigurationLoader, -) : BaseConfigurationService(configLoader) { - init { - withDataStoreCore() - withDefault() - withProxyMode() - setName(Keys.REGEDIT_ALLOW_SENSITIVE, "server.regeditAllowSensitive") - setName(Keys.TIME_ZONE, "server.timezone") - setDescription(Keys.REGEDIT_ALLOW_SENSITIVE, """ -Whether the regedit command should have access to sensitive settings such as connection details. -""") - setDescription(Keys.TIME_ZONE, """ -The server's timezone id. Use "auto" for the local system time, otherwise -please see https://nodatime.org/TimeZones (note that your system's available timezones may differ). -This option is useful if your server machine and community are based in different timezones. -""") - val serializers = TypeSerializerCollection.defaults().newChild() - serializers.register(Keys.TIME_ZONE.type, CommonZoneIdSerializer()) - val options = ConfigurationOptions.defaults() - setOptions(options.withSerializers(serializers)) - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/registry/CommonZoneIdSerializer.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/registry/CommonZoneIdSerializer.kt deleted file mode 100644 index bd554e6c5..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/registry/CommonZoneIdSerializer.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.registry - -import com.google.common.reflect.TypeToken -import ninja.leaping.configurate.ConfigurationNode -import ninja.leaping.configurate.objectmapping.serialize.TypeSerializer -import org.anvilpowered.anvil.api.registry.ZoneIdSerializer -import java.time.ZoneId - -@Suppress("UnstableApiUsage") -class CommonZoneIdSerializer : ZoneIdSerializer(), TypeSerializer { - - override fun deserialize(type: TypeToken<*>, node: ConfigurationNode): ZoneId = parse(node.string) - override fun serialize(type: TypeToken<*>, zoneId: ZoneId?, node: ConfigurationNode) { - node.value = toString(zoneId) - } -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/server/CommonBackendServer.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/server/CommonBackendServer.kt deleted file mode 100644 index 5034b2a29..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/server/CommonBackendServer.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.server - -import org.anvilpowered.anvil.api.server.BackendServer -import org.anvilpowered.anvil.api.util.UserService -import java.util.Optional -import java.util.UUID -import java.util.concurrent.CompletableFuture - -abstract class CommonBackendServer( - val userService: UserService, -) : BackendServer { - abstract fun Optional.connect(): CompletableFuture - override fun connect(userUUID: UUID): CompletableFuture = userService.getPlayer(userUUID).connect() - override fun connect(userName: String): CompletableFuture = userService.getPlayer(userName).connect() -} diff --git a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/server/CommonLocationService.kt b/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/server/CommonLocationService.kt deleted file mode 100644 index f68e1d580..000000000 --- a/anvil-common/src/main/kotlin/org/anvilpowered/anvil/common/server/CommonLocationService.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.common.server - -import com.flowpowered.math.vector.Vector3d -import org.anvilpowered.anvil.api.server.BackendServer -import org.anvilpowered.anvil.api.server.LocationService -import java.util.Optional -import java.util.UUID -import java.util.concurrent.CompletableFuture - -abstract class CommonLocationService : LocationService { - - override fun getServer(userUUID: UUID): Optional { - return Optional.empty() - } - - override fun getServer(userName: String): Optional { - return Optional.empty() - } - - override fun getServerForName(serverName: String): Optional { - return Optional.empty() - } - - override fun getServers(): List { - return listOf() - } - - override fun getWorldName(userUUID: UUID): Optional { - return Optional.empty() - } - - override fun getWorldName(userName: String): Optional { - return Optional.empty() - } - - override fun getPosition(userUUID: UUID): Optional { - return Optional.empty() - } - - override fun getPosition(userName: String): Optional { - return Optional.empty() - } - - override fun teleport(teleportingUserUUID: UUID, targetUserUUID: UUID): CompletableFuture { - return CompletableFuture.completedFuture(false) - } -} diff --git a/anvil-md5/build.gradle.kts b/anvil-md5/build.gradle.kts deleted file mode 100644 index f4d50d605..000000000 --- a/anvil-md5/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -plugins { - java -} - -dependencies { - api(project(":anvil-core")) - implementation("net.md-5:bungeecord-api:1.16-R0.4") -} diff --git a/anvil-md5/src/main/java/org/anvilpowered/anvil/md5/util/MD5TextService.java b/anvil-md5/src/main/java/org/anvilpowered/anvil/md5/util/MD5TextService.java deleted file mode 100644 index 4bee8d2bd..000000000 --- a/anvil-md5/src/main/java/org/anvilpowered/anvil/md5/util/MD5TextService.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.md5.util; - -import com.google.inject.Inject; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import org.anvilpowered.anvil.common.util.CommonTextService; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.slf4j.Logger; - -import java.net.URL; -import java.util.Deque; -import java.util.LinkedList; - -public abstract class MD5TextService - extends CommonTextService { - - @Inject - private Logger logger; - - @Override - public Builder builder() { - return new MD5TextBuilder(); - } - - @Override - public TextComponent deserialize(String text) { - return new TextComponent(ChatColor.translateAlternateColorCodes('&', text)); - } - - @Override - public String serialize(TextComponent text) { - return text.toLegacyText(); - } - - @Override - public String serializePlain(TextComponent text) { - return text.toPlainText(); - } - - protected class MD5TextBuilder extends CommonTextBuilder { - - private final Deque elements; - @Nullable - private HoverEvent hoverEvent; - @Nullable - private ClickEvent clickEvent; - - protected MD5TextBuilder() { - this.elements = new LinkedList<>(); - } - - @Override - public Builder aqua() { - elements.add(ChatColor.AQUA); - return this; - } - - @Override - public Builder black() { - elements.add(ChatColor.BLACK); - return this; - } - - @Override - public Builder blue() { - elements.add(ChatColor.BLUE); - return this; - } - - @Override - public Builder dark_aqua() { - elements.add(ChatColor.DARK_AQUA); - return this; - } - - @Override - public Builder dark_blue() { - elements.add(ChatColor.DARK_BLUE); - return this; - } - - @Override - public Builder dark_gray() { - elements.add(ChatColor.DARK_GRAY); - return this; - } - - @Override - public Builder dark_green() { - elements.add(ChatColor.DARK_GREEN); - return this; - } - - @Override - public Builder dark_purple() { - elements.add(ChatColor.DARK_PURPLE); - return this; - } - - @Override - public Builder dark_red() { - elements.add(ChatColor.DARK_RED); - return this; - } - - @Override - public Builder gold() { - elements.add(ChatColor.GOLD); - return this; - } - - @Override - public Builder gray() { - elements.add(ChatColor.GRAY); - return this; - } - - @Override - public Builder green() { - elements.add(ChatColor.GREEN); - return this; - } - - @Override - public Builder light_purple() { - elements.add(ChatColor.LIGHT_PURPLE); - return this; - } - - @Override - public Builder red() { - elements.add(ChatColor.RED); - return this; - } - - @Override - public Builder reset() { - elements.add(ChatColor.RESET); - return this; - } - - @Override - public Builder white() { - elements.add(ChatColor.WHITE); - return this; - } - - @Override - public Builder yellow() { - elements.add(ChatColor.YELLOW); - return this; - } - - @Override - public Builder bold() { - elements.add(ChatColor.BOLD); - return this; - } - - @Override - public Builder italic() { - elements.add(ChatColor.ITALIC); - return this; - } - - @Override - public Builder obfuscated() { - elements.add(ChatColor.MAGIC); - return this; - } - - @Override - public Builder strikethrough() { - elements.add(ChatColor.STRIKETHROUGH); - return this; - } - - @Override - public Builder underlined() { - elements.add(ChatColor.UNDERLINE); - return this; - } - - @Override - public Builder append(Object... contents) { - for (Object o : contents) { - if (o instanceof Builder || o instanceof TextComponent || o instanceof ChatColor) { - elements.add(o); - } else { - elements.add(new TextComponent(String.valueOf(o))); - } - } - return this; - } - - @Override - public Builder appendJoining( - Object delimiter, Object... contents) { - final int indexOfLast = contents.length - 1; - for (int i = 0; i <= indexOfLast; i++) { - Object o = contents[i]; - if (o instanceof Builder || o instanceof TextComponent || o instanceof ChatColor) { - elements.add(o); - } else { - elements.add(new TextComponent(String.valueOf(o))); - } - if (i != indexOfLast) { - if (delimiter instanceof Builder || delimiter instanceof TextComponent) { - elements.add(delimiter); - } else { - elements.add(new TextComponent(String.valueOf(delimiter))); - } - } - } - return this; - } - - @Override - public Builder onHoverShowText(TextComponent content) { - hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, - new ComponentBuilder(content).create()); - return this; - } - - @Override - public Builder onClickSuggestCommand(String command) { - callback = null; - clickEvent = new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command); - return this; - } - - @Override - public Builder onClickRunCommand(String command) { - callback = null; - clickEvent = new ClickEvent(ClickEvent.Action.RUN_COMMAND, command); - return this; - } - - @Override - public Builder onClickOpenUrl(String url) { - callback = null; - clickEvent = new ClickEvent(ClickEvent.Action.OPEN_URL, url); - return this; - } - - @Override - public Builder onClickOpenUrl(URL url) { - return onClickOpenUrl(url.toString()); - } - - @Override - @SuppressWarnings("unchecked") - public TextComponent build() { - boolean hover = hoverEvent != null; - if (callback != null) { - initializeCallback(); - } - boolean click = clickEvent != null; - - if (elements.isEmpty()) { - return new TextComponent(); - } else if (elements.size() == 1 && !hover && !click) { - Object o = elements.getFirst(); - if (o instanceof Builder) { - return ((Builder) o).build(); - } else if (o instanceof TextComponent) { - return (TextComponent) o; - } - } - - // one builder for every color - final Deque components = new LinkedList<>(); - - // create first builder - TextComponent currentBuilder = new TextComponent(); - Object firstColor = elements.peekFirst(); - if (firstColor instanceof ChatColor) { - currentBuilder.setColor((ChatColor) firstColor); - elements.pollFirst(); // remove color because its already added to builder - } - - for (Object o : elements) { - if (o instanceof Builder) { - currentBuilder.addExtra(((Builder) o).build()); - } else if (o instanceof BaseComponent) { - currentBuilder.addExtra((BaseComponent) o); - } else if (o instanceof ChatColor) { - // build current builder - components.offer(currentBuilder); - // create new builder starting at this point until the next color - currentBuilder = new TextComponent(); - currentBuilder.setColor((ChatColor) o); - } else { - logger.error("Skipping {} because it does not match any of the correct types.", o); - } - } - - // build last builder - components.offer(currentBuilder); - - // create new builder with all previous components - currentBuilder = new TextComponent(components.toArray(new BaseComponent[0])); - - if (hover) { - currentBuilder.setHoverEvent(hoverEvent); - } - if (click) { - currentBuilder.setClickEvent(clickEvent); - } - return currentBuilder; - } - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/AnvilSpigot.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/AnvilSpigot.java deleted file mode 100644 index cf905a143..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/AnvilSpigot.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot; - -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import org.anvilpowered.anvil.api.AnvilImpl; -import org.anvilpowered.anvil.api.Environment; -import org.anvilpowered.anvil.api.EnvironmentBuilderImpl; -import org.anvilpowered.anvil.api.registry.ConfigurationService; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.spigot.listener.SpigotPlayerListener; -import org.anvilpowered.anvil.spigot.module.ApiSpigotModule; -import org.anvilpowered.anvil.spigot.module.SpigotFallbackModule; -import org.anvilpowered.anvil.spigot.module.SpigotModule; -import org.bukkit.Bukkit; -import org.bukkit.Server; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.server.ServerLoadEvent; -import org.bukkit.plugin.java.JavaPlugin; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class AnvilSpigot extends JavaPlugin { - - protected final Inner inner; - - public AnvilSpigot() { - AbstractModule module = new AbstractModule() { - @Override - protected void configure() { - bind(JavaPlugin.class).toInstance(AnvilSpigot.this); - bind(AnvilSpigot.class).toInstance(AnvilSpigot.this); - } - }; - Injector injector = Guice.createInjector(module); - inner = new Inner(injector); - } - - private final class Inner extends AnvilImpl { - - public Inner(Injector injector) { - super(injector, new SpigotModule()); - } - - @Override - protected void applyToBuilder(Environment.Builder builder) { - super.applyToBuilder(builder); - builder.addEarlyServices(SpigotPlayerListener.class, t -> - Bukkit.getPluginManager().registerEvents(t, AnvilSpigot.this)); - } - - @Override - protected void whenLoaded(Environment environment) { - super.whenLoaded(environment); - - // Attempt to autodetect proxy mode - boolean serverProxyMode = false; - - // Check for Paper-specific Velocity mode first - try { - Method getPaperConfigMethod = Server.Spigot.class.getMethod("getPaperConfig"); - YamlConfiguration paperConfig = (YamlConfiguration) getPaperConfigMethod - .invoke(Bukkit.spigot()); - serverProxyMode = paperConfig.getBoolean("settings.velocity-support.enabled", false); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException("Unable to get Paper configuration", e); - } catch (NoSuchMethodException ignored) { - } - - // Check BungeeCord mode if Velocity setting was not enabled or server implementation is not Paper - if (!serverProxyMode) { - serverProxyMode = Bukkit.spigot().getConfig() - .getBoolean("settings.bungeecord", false); - } - - ConfigurationService configurationService = environment.getInjector() - .getInstance(ConfigurationService.class); - boolean anvilProxyMode = configurationService.getOrDefault(Keys.PROXY_MODE); - - if (serverProxyMode && !anvilProxyMode) { - getLogger().error( - "It looks like you are running this server behind a proxy. " + - "If this is the case, set server.proxyMode=true in the anvil config" - ); - } else if (anvilProxyMode && !serverProxyMode) { - getLogger().error( - "It looks like you are not running this server behind a proxy. " + - "If this is the case, set server.proxyMode=false in the anvil config" - ); - } - } - } - - @Override - public void onEnable() { - Bukkit.getPluginManager().registerEvents(new Listener() { - @EventHandler - public void onLoad(ServerLoadEvent event) { - EnvironmentBuilderImpl.completeInitialization(new ApiSpigotModule(), new SpigotFallbackModule()); - } - }, this); - } - - @Override - public String toString() { - return inner.toString(); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilCommandNode.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilCommandNode.java deleted file mode 100644 index 6092ddf4e..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilCommandNode.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command; - -import com.google.common.base.Preconditions; -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.common.command.CommonAnvilCommandNode; -import org.anvilpowered.anvil.spigot.AnvilSpigot; -import org.anvilpowered.anvil.spigot.command.regedit.SpigotRegistryEditCommandNode; -import org.anvilpowered.anvil.spigot.command.regedit.SpigotRegistryEditRootCommand; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.PluginCommand; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SpigotAnvilCommandNode - extends CommonAnvilCommandNode { - - @Inject - private SpigotAnvilPluginsCommand anvilPluginsCommand; - - @Inject - private SpigotAnvilReloadCommand anvilReloadCommand; - - @Inject - private SpigotCallbackCommand callbackCommand; - - @Inject - private SpigotRegistryEditRootCommand registryEditRootCommand; - - @Inject - private SpigotRegistryEditCommandNode registryEditCommandNode; - - @Inject - private AnvilSpigot plugin; - - @Inject - public SpigotAnvilCommandNode(Registry registry) { - super(registry); - } - - @Override - protected void loadCommands() { - Map, CommandExecutor> subCommands = new HashMap<>(); - - subCommands.put(PLUGINS_ALIAS, anvilPluginsCommand); - subCommands.put(RELOAD_ALIAS, anvilReloadCommand); - subCommands.put(REGEDIT_ALIAS, commandService.generateRoutingCommand( - registryEditRootCommand, registryEditCommandNode.getSubCommands(), false) - ); - subCommands.put(HELP_ALIAS, commandService.generateHelpCommand(this)); - subCommands.put(VERSION_ALIAS, commandService.generateVersionCommand(HELP_COMMAND)); - - PluginCommand root = plugin.getCommand(getName()); - - Preconditions.checkNotNull(root, "Anvil command not registered"); - - root.setExecutor(commandService.generateRoutingCommand( - commandService.generateRootCommand(HELP_COMMAND), subCommands, false)); - - PluginCommand callback = plugin.getCommand("callback"); - - Preconditions.checkNotNull(callback, "Callback command not registered"); - - callback.setExecutor(callbackCommand); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilPluginsCommand.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilPluginsCommand.java deleted file mode 100644 index cfef75530..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilPluginsCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command; - -import net.md_5.bungee.api.chat.TextComponent; -import org.anvilpowered.anvil.common.command.CommonAnvilPluginsCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; - -public class SpigotAnvilPluginsCommand - extends CommonAnvilPluginsCommand - implements CommandExecutor { - - @Override - public boolean onCommand( - CommandSender source, - Command command, - String alias, - String[] context - ) { - execute(source); - return true; - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilReloadCommand.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilReloadCommand.java deleted file mode 100644 index f02921f51..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotAnvilReloadCommand.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command; - -import net.md_5.bungee.api.chat.TextComponent; -import org.anvilpowered.anvil.common.command.CommonAnvilReloadCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; - -import java.util.List; - -public class SpigotAnvilReloadCommand - extends CommonAnvilReloadCommand - implements CommandExecutor, TabCompleter { - - @Override - public boolean onCommand( - CommandSender source, - Command command, - String alias, - String[] context - ) { - execute(source, context); - return true; - } - - @Override - public List onTabComplete( - CommandSender source, - Command command, - String alias, - String[] context - ) { - return suggest(source, context); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCallbackCommand.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCallbackCommand.java deleted file mode 100644 index 9605ff586..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCallbackCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command; - -import com.google.inject.Singleton; -import net.md_5.bungee.api.chat.TextComponent; -import org.anvilpowered.anvil.common.command.CommonCallbackCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; - -@Singleton -public class SpigotCallbackCommand - extends CommonCallbackCommand - implements CommandExecutor { - - @Override - public boolean onCommand( - CommandSender source, - Command command, - String alias, - String[] context - ) { - execute(source, context); - return true; - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCommandExecuteService.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCommandExecuteService.java deleted file mode 100644 index 0a3082f9f..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCommandExecuteService.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.AnvilImpl; -import org.anvilpowered.anvil.api.command.CommandExecuteService; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -public class SpigotCommandExecuteService implements CommandExecuteService { - - @Inject(optional = true) - private Plugin plugin; - - private void executeDirect(String command) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command); - } - - @Override - public void execute(String command) { - if (Bukkit.isPrimaryThread()) { - executeDirect(command); - } else if (plugin != null) { - Bukkit.getScheduler().runTask(plugin, () -> executeDirect(command)); - } else { - AnvilImpl.getLogger() - .error("You must bind org.bukkit.plugin.Plugin to your plugin instance to be able to run commands async"); - } - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCommandService.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCommandService.java deleted file mode 100644 index 05707b880..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/command/SpigotCommandService.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command; - -import com.google.common.collect.ImmutableList; -import net.md_5.bungee.api.chat.TextComponent; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.common.command.CommonCommandService; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; - -import java.util.List; -import java.util.function.Predicate; - -public class SpigotCommandService extends CommonCommandService { - - private static class WrapperCommand implements CommandExecutor, TabCompleter { - private final CommandExecutorWrapper wrapper; - - public WrapperCommand(CommandExecutorWrapper wrapper) { - this.wrapper = wrapper; - } - - @Override - public boolean onCommand(CommandSender source, Command command, String label, String[] args) { - wrapper.execute(command, source, label, args); - return true; - } - - @Override - public List onTabComplete(CommandSender source, Command command, String label, String[] args) { - return wrapper.suggest(command, source, label, args); - } - } - - private static abstract class SCommand implements CommandExecutor { - protected final String helpUsage; - protected final Predicate extended; - - public SCommand(String helpUsage, Predicate extended) { - this.helpUsage = helpUsage; - this.extended = extended; - } - } - - private class RootCommand extends SCommand { - - public RootCommand(String helpUsage, Predicate extended) { - super(helpUsage, extended); - } - - @Override - public boolean onCommand(CommandSender source, Command command, String label, String[] args) { - sendRoot(source, helpUsage, extended.test(source)); - return true; - } - } - - private class VersionCommand extends SCommand { - - public VersionCommand(String helpUsage, Predicate extended) { - super(helpUsage, extended); - } - - @Override - public boolean onCommand(CommandSender source, Command command, String label, String[] args) { - sendVersion(source, helpUsage, extended.test(source)); - return true; - } - } - - private class HelpCommand implements CommandExecutor { - - private final CommandNode node; - - public HelpCommand(CommandNode node) { - this.node = node; - } - - @Override - public boolean onCommand(CommandSender source, Command command, String label, String[] args) { - sendHelp(source, node); - return true; - } - } - - private class ReloadCommand implements CommandExecutor { - - @Override - public boolean onCommand(CommandSender source, Command command, String label, String[] args) { - sendReload(source); - return true; - } - } - - @Override - protected void runExecutor( - CommandExecutor executor, - Command command, - CommandSender source, - String alias, - String[] context - ) { - executor.onCommand(source, command, alias, context); - } - - @Override - protected List getSuggestions( - CommandExecutor executor, - Command command, - CommandSender source, - String alias, - String[] context - ) { - if (executor instanceof TabCompleter) { - return ((TabCompleter) executor).onTabComplete(source, command, alias, context); - } - return ImmutableList.of(); - } - - @Override - protected CommandExecutor generateWrapperCommand(CommandExecutorWrapper command) { - return new WrapperCommand(command); - } - - @Override - public CommandExecutor generateRootCommand(String helpUsage, Predicate extended) { - return new RootCommand(helpUsage, extended); - } - - @Override - public CommandExecutor generateVersionCommand(String helpUsage, Predicate extended) { - return new VersionCommand(helpUsage, extended); - } - - @Override - public CommandExecutor generateHelpCommand(CommandNode node) { - return new HelpCommand(node); - } - - @Override - public CommandExecutor generateReloadCommand() { - return new ReloadCommand(); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/entity/SpigotEntityUtils.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/entity/SpigotEntityUtils.java deleted file mode 100644 index f0240b926..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/entity/SpigotEntityUtils.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.entity; - -import org.anvilpowered.anvil.common.entity.EntityUtils; -import org.bukkit.entity.Entity; - -import java.util.Optional; -import java.util.UUID; - -public class SpigotEntityUtils implements EntityUtils { - - @Override - public Optional extractUUID(Object entity) { - if (!(entity instanceof Entity)) { - return Optional.empty(); - } - return Optional.of(((Entity) entity).getUniqueId()); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/listener/SpigotPlayerListener.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/listener/SpigotPlayerListener.java deleted file mode 100644 index 053b6502e..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/listener/SpigotPlayerListener.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.listener; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.coremember.CoreMemberManager; -import org.anvilpowered.anvil.api.entity.RestrictionService; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityInteractEvent; -import org.bukkit.event.inventory.InventoryInteractEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerMoveEvent; - -public class SpigotPlayerListener implements Listener { - - @Inject - private CoreMemberManager coreMemberManager; - - @Inject - private Registry registry; - - @Inject - private RestrictionService restrictionService; - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - if (registry.getOrDefault(Keys.PROXY_MODE)) { - return; - } - Player player = event.getPlayer(); - coreMemberManager.getPrimaryComponent() - .getOneOrGenerateForUser( - player.getUniqueId(), - player.getName(), - player.getAddress().getHostString() - ); - } - - @EventHandler - public void onMovement(PlayerMoveEvent event) { - if (restrictionService.get(event.getPlayer().getUniqueId()).movement()) { - event.setCancelled(true); - } - } - - @EventHandler - public void onInteraction(EntityInteractEvent event) { - if (restrictionService.get(event.getEntity().getUniqueId()).interaction()) { - event.setCancelled(true); - } - } - - @EventHandler - public void onInventory(InventoryInteractEvent event) { - if (restrictionService.get(event.getWhoClicked().getUniqueId()).inventory()) { - event.setCancelled(true); - } - } - - @EventHandler - public void onCommands(PlayerCommandPreprocessEvent event) { - if (restrictionService.get(event.getPlayer().getUniqueId()).commands()) { - event.setCancelled(true); - } - } - - @EventHandler - public void onReceiveDamage(EntityDamageEvent event) { - if (restrictionService.get(event.getEntity().getUniqueId()).damage()) { - event.setCancelled(true); - } - } - - @EventHandler - public void onDealDamage(EntityDamageByEntityEvent event) { - if (restrictionService.get(event.getDamager().getUniqueId()).damage()) { - event.setCancelled(true); - } - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/module/ApiSpigotModule.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/module/ApiSpigotModule.java deleted file mode 100644 index 3dfb361cb..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/module/ApiSpigotModule.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.module; - -import com.google.inject.TypeLiteral; -import net.md_5.bungee.api.chat.TextComponent; -import org.anvilpowered.anvil.api.PlatformImpl; -import org.anvilpowered.anvil.api.command.CommandExecuteService; -import org.anvilpowered.anvil.api.command.CommandService; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.anvilpowered.anvil.api.server.LocationService; -import org.anvilpowered.anvil.api.util.KickService; -import org.anvilpowered.anvil.api.util.PermissionService; -import org.anvilpowered.anvil.api.util.TextService; -import org.anvilpowered.anvil.api.util.UserService; -import org.anvilpowered.anvil.common.command.CommonCallbackCommand; -import org.anvilpowered.anvil.common.entity.EntityUtils; -import org.anvilpowered.anvil.common.module.JavaUtilLoggingAdapter; -import org.anvilpowered.anvil.common.module.PlatformModule; -import org.anvilpowered.anvil.spigot.command.SpigotCallbackCommand; -import org.anvilpowered.anvil.spigot.command.SpigotCommandExecuteService; -import org.anvilpowered.anvil.spigot.command.SpigotCommandService; -import org.anvilpowered.anvil.spigot.entity.SpigotEntityUtils; -import org.anvilpowered.anvil.spigot.server.SpigotLocationService; -import org.anvilpowered.anvil.spigot.util.SpigotKickService; -import org.anvilpowered.anvil.spigot.util.SpigotPermissionService; -import org.anvilpowered.anvil.spigot.util.SpigotTextService; -import org.anvilpowered.anvil.spigot.util.SpigotUserService; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class ApiSpigotModule extends PlatformModule { - - public ApiSpigotModule() { - super(new PlatformImpl(false, "spigot", JavaUtilLoggingAdapter::bindLogger)); - } - - @Override - protected void configure() { - super.configure(); - bind(new TypeLiteral>() { - }).toProvider(BindingExtensions.asInternalProvider(SpigotCallbackCommand.class)); - bind(CommandExecuteService.class).to(SpigotCommandExecuteService.class); - bind(new TypeLiteral>() { - }).to(SpigotCommandService.class); - bind(KickService.class).to(SpigotKickService.class); - bind(EntityUtils.class).to(SpigotEntityUtils.class); - bind(LocationService.class).to(SpigotLocationService.class); - bind(PermissionService.class).to(SpigotPermissionService.class); - bind(new TypeLiteral>() { - }).to(SpigotTextService.class); - bind(new TypeLiteral>() { - }).to(SpigotUserService.class); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/module/SpigotModule.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/module/SpigotModule.java deleted file mode 100644 index 33ed08d97..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/module/SpigotModule.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.module; - -import com.google.inject.TypeLiteral; -import net.md_5.bungee.api.chat.TextComponent; -import ninja.leaping.configurate.commented.CommentedConfigurationNode; -import ninja.leaping.configurate.hocon.HoconConfigurationLoader; -import ninja.leaping.configurate.loader.ConfigurationLoader; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditRootCommand; -import org.anvilpowered.anvil.common.module.CommonModule; -import org.anvilpowered.anvil.common.plugin.AnvilPluginInfo; -import org.anvilpowered.anvil.spigot.command.SpigotAnvilCommandNode; -import org.anvilpowered.anvil.spigot.command.regedit.SpigotRegistryEditRootCommand; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.io.File; -import java.nio.file.Paths; - -public class SpigotModule extends CommonModule { - - @Override - protected void configure() { - super.configure(); - File configFilesLocation = Paths.get("plugins/" + AnvilPluginInfo.id).toFile(); - if (!configFilesLocation.exists()) { - if (!configFilesLocation.mkdirs()) { - throw new IllegalStateException("Unable to create config directory"); - } - } - bind(new TypeLiteral>() { - }).toInstance(HoconConfigurationLoader.builder().setPath(Paths.get(configFilesLocation + "/anvil.conf")).build()); - bind(new TypeLiteral>() { - }).to(SpigotAnvilCommandNode.class); - bind(new TypeLiteral>() { - }).to(SpigotRegistryEditRootCommand.class); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotKickService.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotKickService.java deleted file mode 100644 index fc71b33de..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotKickService.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.util; - -import com.google.inject.Inject; -import net.md_5.bungee.api.chat.TextComponent; -import org.anvilpowered.anvil.api.util.KickService; -import org.anvilpowered.anvil.api.util.UserService; -import org.bukkit.entity.Player; - -import java.util.UUID; - -public class SpigotKickService implements KickService { - - @Inject - private UserService userService; - - private TextComponent getReason(Object reason) { - return reason instanceof TextComponent ? (TextComponent) reason : new TextComponent(reason.toString()); - } - - @Override - public void kick(UUID userUUID, Object reason) { - userService.getPlayer(userUUID).ifPresent(player -> player.kickPlayer(reason.toString())); - } - - @Override - public void kick(String userName, Object reason) { - userService.getPlayer(userName).ifPresent(player -> player.kickPlayer(reason.toString())); - } - - @Override - public void kick(UUID userUUID) { - kick(userUUID, "You have been kicked"); - } - - @Override - public void kick(String userName) { - kick(userName, "You have been kicked"); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotPermissionService.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotPermissionService.java deleted file mode 100644 index 26e68d605..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotPermissionService.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.util; - -import org.anvilpowered.anvil.api.util.PermissionService; -import org.bukkit.permissions.Permissible; -import org.checkerframework.checker.nullness.qual.Nullable; - -public class SpigotPermissionService implements PermissionService { - - @Override - public boolean hasPermission(@Nullable Object subject, String permission) { - return subject instanceof Permissible && ((Permissible) subject).hasPermission(permission); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotTextService.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotTextService.java deleted file mode 100644 index 3f48fb24a..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotTextService.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.util; - -import net.md_5.bungee.api.chat.TextComponent; -import org.anvilpowered.anvil.md5.util.MD5TextService; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; - -public class SpigotTextService extends MD5TextService { - - @Override - public void send(TextComponent text, CommandSender receiver) { - receiver.spigot().sendMessage(text); - } - - @Override - public CommandSender getConsole() { - return Bukkit.getConsoleSender(); - } -} diff --git a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotUserService.java b/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotUserService.java deleted file mode 100644 index 1795cbf9c..000000000 --- a/anvil-spigot/src/main/java/org/anvilpowered/anvil/spigot/util/SpigotUserService.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.util; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.common.util.CommonUserService; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class SpigotUserService extends CommonUserService { - - @Inject - public SpigotUserService() { - super(Player.class); - } - - @Override - public Optional get(String userName) { - return Optional.ofNullable(Bukkit.getPlayer(userName)); - } - - @Override - public Optional get(UUID userUUID) { - return Optional.ofNullable(Bukkit.getPlayer(userUUID)); - } - - @Override - public Optional getPlayer(String userName) { - return get(userName); - } - - @Override - public Optional getPlayer(UUID userUUID) { - return get(userUUID); - } - - @Override - public Optional getPlayer(Player player) { - return Optional.of(player); - } - - @Override - public List matchPlayerNames(String startsWith) { - String startsWithLowerCase = startsWith.toLowerCase(); - return Stream.of(Bukkit.getOfflinePlayers()) - .map(OfflinePlayer::getName) - .filter(Objects::nonNull) - .filter(name -> name.toLowerCase().startsWith(startsWithLowerCase)) - .collect(Collectors.toList()); - } - - @Override - public Collection getOnlinePlayers() { - return (Collection) Bukkit.getOnlinePlayers(); - } - - @Override - public CompletableFuture> getUUID(String userName) { - Optional userUUID = getPlayer(userName).map(Player::getUniqueId); - if (userUUID.isPresent()) { - return CompletableFuture.completedFuture(userUUID); - } - return super.getUUID(userName); - } - - @Override - public CompletableFuture> getUserName(UUID userUUID) { - Optional userName = getPlayer(userUUID).map(Player::getName); - if (userName.isPresent()) { - return CompletableFuture.completedFuture(userName); - } - return super.getUserName(userUUID); - } - - @Override - public UUID getUUID(Player user) { - return user.getUniqueId(); - } - - @Override - public String getUserName(Player user) { - return user.getName(); - } -} diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCancelCommand.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCancelCommand.kt deleted file mode 100644 index b80da2234..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCancelCommand.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command.regedit - -import net.md_5.bungee.api.chat.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCancelCommand -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class SpigotRegistryEditCancelCommand - : CommonRegistryEditCancelCommand(), CommandExecutor { - override fun onCommand(source: CommandSender, command: Command, alias: String, context: Array): Boolean { - execute(source, context) - return true - } -} diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCommandNode.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCommandNode.kt deleted file mode 100644 index 8a8b7313b..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCommandNode.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command.regedit - -import com.google.inject.Inject -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender - -class SpigotRegistryEditCommandNode @Inject constructor( - registry: Registry, -) : CommonRegistryEditCommandNode(registry) { - - @Inject - private lateinit var registryEditCancelCommand: SpigotRegistryEditCancelCommand - - @Inject - private lateinit var registryEditCommitCommand: SpigotRegistryEditCommitCommand - - @Inject - private lateinit var registryEditKeyCommand: SpigotRegistryEditKeyCommand - - @Inject - private lateinit var registryEditSelectCommand: SpigotRegistryEditSelectCommand - - @Inject - private lateinit var registryEditStartCommand: SpigotRegistryEditStartCommand - - val subCommands: MutableMap, CommandExecutor> = HashMap() - - override fun loadCommands() { - subCommands[CANCEL_ALIAS] = registryEditCancelCommand - subCommands[COMMIT_ALIAS] = registryEditCommitCommand - subCommands[KEY_ALIAS] = registryEditKeyCommand - subCommands[SELECT_ALIAS] = registryEditSelectCommand - subCommands[START_ALIAS] = registryEditStartCommand - subCommands[HELP_ALIAS] = commandService.generateHelpCommand(this) - } -} diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCommitCommand.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCommitCommand.kt deleted file mode 100644 index 7cac09cf6..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditCommitCommand.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command.regedit - -import net.md_5.bungee.api.chat.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommitCommand -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class SpigotRegistryEditCommitCommand - : CommonRegistryEditCommitCommand(), CommandExecutor { - override fun onCommand(source: CommandSender, command: Command, alias: String, context: Array): Boolean { - execute(source, context) - return true - } -} diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditKeyCommand.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditKeyCommand.kt deleted file mode 100644 index 3d9976adb..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditKeyCommand.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command.regedit - -import net.md_5.bungee.api.chat.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditKeyCommand -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.command.TabCompleter -import org.bukkit.entity.Player - -class SpigotRegistryEditKeyCommand - : CommonRegistryEditKeyCommand(), CommandExecutor, TabCompleter { - override fun onCommand(source: CommandSender, command: Command, alias: String, context: Array): Boolean { - execute(source, context) - return true - } - - override fun onTabComplete(source: CommandSender, command: Command, alias: String, context: Array): List { - return suggest(source, context) - } -} diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditRootCommand.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditRootCommand.kt deleted file mode 100644 index 3cf87992c..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditRootCommand.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command.regedit - -import com.google.inject.Singleton -import net.md_5.bungee.api.chat.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditRootCommand -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -@Singleton -class SpigotRegistryEditRootCommand - : CommonRegistryEditRootCommand(), CommandExecutor { - override fun onCommand(source: CommandSender, command: Command, alias: String, context: Array): Boolean { - execute(source, context) - return true - } -} diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditSelectCommand.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditSelectCommand.kt deleted file mode 100644 index b0a5d71f8..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditSelectCommand.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command.regedit - -import net.md_5.bungee.api.chat.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditSelectCommand -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.command.TabCompleter -import org.bukkit.entity.Player - -class SpigotRegistryEditSelectCommand - : CommonRegistryEditSelectCommand(), CommandExecutor, TabCompleter { - override fun onCommand(source: CommandSender, command: Command, alias: String, context: Array): Boolean { - execute(source, context) - return true - } - - override fun onTabComplete(source: CommandSender, command: Command, alias: String, context: Array): List { - return suggest(source, context) - } -} diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditStartCommand.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditStartCommand.kt deleted file mode 100644 index d36a6705f..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/command/regedit/SpigotRegistryEditStartCommand.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.command.regedit - -import net.md_5.bungee.api.chat.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditStartCommand -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.command.TabCompleter -import org.bukkit.entity.Player - -class SpigotRegistryEditStartCommand - : CommonRegistryEditStartCommand(), CommandExecutor, TabCompleter { - override fun onCommand(source: CommandSender, command: Command, alias: String, context: Array): Boolean { - execute(source, context) - return true - } - - override fun onTabComplete(source: CommandSender, command: Command, alias: String, context: Array): List { - return suggest(source, context) - } -} diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/module/SpigotFallbackModule.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/module/SpigotFallbackModule.kt deleted file mode 100644 index 6effc3d2f..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/module/SpigotFallbackModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.spigot.module - -import net.md_5.bungee.api.chat.TextComponent -import org.anvilpowered.anvil.common.module.FallbackModule -import org.bukkit.command.CommandSender - -class SpigotFallbackModule : FallbackModule() diff --git a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/server/SpigotLocationService.kt b/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/server/SpigotLocationService.kt deleted file mode 100644 index e4ec04edb..000000000 --- a/anvil-spigot/src/main/kotlin/org/anvilpowered/anvil/spigot/server/SpigotLocationService.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.spigot.server - -import com.flowpowered.math.vector.Vector3d -import com.google.inject.Inject -import org.anvilpowered.anvil.api.util.UserService -import org.anvilpowered.anvil.common.server.CommonLocationService -import org.bukkit.entity.Player -import java.util.Optional -import java.util.UUID -import java.util.concurrent.CompletableFuture - -class SpigotLocationService : CommonLocationService() { - - @Inject - private lateinit var userService: UserService - - override fun teleport(teleportingUserUUID: UUID, targetUserUUID: UUID): CompletableFuture { - val teleporter = userService[teleportingUserUUID] - val target = userService[targetUserUUID] - return CompletableFuture.completedFuture( - if (teleporter.isPresent && target.isPresent) { - teleporter.get().teleport(target.get().location) - } else false - ) - } - - override fun getWorldName(userUUID: UUID): Optional { - return userService[userUUID].map { it.world }.map { it.name } - } - - override fun getWorldName(userName: String): Optional { - return userService[userName].map { it.world }.map { it.name } - } - - private fun extractCoords(player: Player): Vector3d { - val pos = player.location - return Vector3d(pos.x, pos.y, pos.z) - } - - override fun getPosition(userUUID: UUID): Optional { - return userService[userUUID].map(::extractCoords) - } - - override fun getPosition(userName: String): Optional { - return userService[userName].map(::extractCoords) - } -} diff --git a/anvil-spigot/src/main/resources/plugin.yml b/anvil-spigot/src/main/resources/plugin.yml deleted file mode 100644 index d6ec98f08..000000000 --- a/anvil-spigot/src/main/resources/plugin.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: Anvil -version: "${version}" -main: org.anvilpowered.anvil.spigot.AnvilSpigot -api-version: 1.15 -description: A cross-platform Minecraft plugin framework -website: https://www.anvilpowered.org -commands: - anvil: - description: Anvil root command - callback: - description: Anvil callback command diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/AnvilSponge.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/AnvilSponge.java deleted file mode 100644 index dd4518bc0..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/AnvilSponge.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge; - -import com.google.inject.Inject; -import com.google.inject.Injector; -import org.anvilpowered.anvil.api.AnvilImpl; -import org.anvilpowered.anvil.api.EnvironmentBuilderImpl; -import org.anvilpowered.anvil.common.plugin.AnvilPluginInfo; -import org.anvilpowered.anvil.sponge.listener.SpongePlayerListener; -import org.anvilpowered.anvil.sponge.module.ApiSpongeModule; -import org.anvilpowered.anvil.sponge.module.SpongeFallbackModule; -import org.anvilpowered.anvil.sponge.module.SpongeModule; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.Order; -import org.spongepowered.api.event.game.state.GameInitializationEvent; -import org.spongepowered.api.plugin.Plugin; - -@Plugin( - id = AnvilPluginInfo.id, - name = AnvilPluginInfo.name, - version = AnvilPluginInfo.version, - description = AnvilPluginInfo.description, - url = AnvilPluginInfo.url, - authors = AnvilPluginInfo.organizationName -) -public class AnvilSponge extends AnvilImpl { - - @Inject - public AnvilSponge(Injector injector) { - super(injector, new SpongeModule()); - } - - @Listener(order = Order.EARLY) - public void onInit(GameInitializationEvent event) { - EnvironmentBuilderImpl.completeInitialization(new ApiSpongeModule(), new SpongeFallbackModule()); - Sponge.getEventManager().registerListeners(this, - environment.getInjector().getInstance(SpongePlayerListener.class)); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilCommandNode.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilCommandNode.java deleted file mode 100644 index b1e0c3e0e..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilCommandNode.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.common.command.CommonAnvilCommandNode; -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode; -import org.anvilpowered.anvil.common.plugin.AnvilPluginInfo; -import org.anvilpowered.anvil.sponge.command.regedit.SpongeRegistryEditCommandNode; -import org.anvilpowered.anvil.sponge.command.regedit.SpongeRegistryEditRootCommand; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.CommandCallable; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.GenericArguments; -import org.spongepowered.api.command.spec.CommandExecutor; -import org.spongepowered.api.command.spec.CommandSpec; -import org.spongepowered.api.text.Text; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Singleton -public class SpongeAnvilCommandNode - extends CommonAnvilCommandNode { - - @Inject - private SpongeAnvilPluginsCommand anvilPluginsCommand; - - @Inject - private SpongeAnvilReloadCommand anvilReloadCommand; - - @Inject - private SpongeRegistryEditRootCommand registryEditRootCommand; - - @Inject - private SpongeRegistryEditCommandNode registryEditCommandNode; - - @Inject - public SpongeAnvilCommandNode(Registry registry) { - super(registry); - } - - @Override - protected void loadCommands() { - - Map, CommandCallable> subCommands = new HashMap<>(); - - subCommands.put(PLUGINS_ALIAS, CommandSpec.builder() - .description(Text.of(PLUGINS_DESCRIPTION)) - .permission(registry.getOrDefault(Keys.PLUGINS_PERMISSION)) - .executor(anvilPluginsCommand) - .build()); - - subCommands.put(RELOAD_ALIAS, CommandSpec.builder() - .description(Text.of(RELOAD_DESCRIPTION)) - .permission(registry.getOrDefault(Keys.RELOAD_PERMISSION)) - .arguments( - GenericArguments.flags().flag("a", "-all").flag("r", "-regex") - .buildWith(GenericArguments.optional( - GenericArguments.withSuggestions( - GenericArguments.string(Text.of("plugin")), - anvilReloadCommand.suggest() - ) - )) - ) - .executor(anvilReloadCommand) - .build()); - - subCommands.put(REGEDIT_ALIAS, CommandSpec.builder() - .description(Text.of(CommonRegistryEditCommandNode.ROOT_DESCRIPTION)) - .permission(registry.getOrDefault(Keys.REGEDIT_PERMISSION)) - .executor(registryEditRootCommand) - .children(registryEditCommandNode.getSubCommands()) - .build()); - - subCommands.put(HELP_ALIAS, CommandSpec.builder() - .description(Text.of(HELP_DESCRIPTION)) - .executor(commandService.generateHelpCommand(this)) - .build()); - - subCommands.put(VERSION_ALIAS, CommandSpec.builder() - .description(Text.of(VERSION_DESCRIPTION)) - .executor(commandService.generateVersionCommand(HELP_COMMAND)) - .build()); - - CommandSpec root = CommandSpec.builder() - .description(Text.of(ROOT_DESCRIPTION)) - .executor(commandService.generateRootCommand(HELP_COMMAND)) - .children(subCommands) - .build(); - - Sponge.getCommandManager() - .register(environment.getPlugin(), root, AnvilPluginInfo.id); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilPluginsCommand.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilPluginsCommand.java deleted file mode 100644 index 1a5a66181..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilPluginsCommand.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command; - -import org.anvilpowered.anvil.common.command.CommonAnvilPluginsCommand; -import org.spongepowered.api.command.CommandResult; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.CommandContext; -import org.spongepowered.api.command.spec.CommandExecutor; -import org.spongepowered.api.text.Text; - -public class SpongeAnvilPluginsCommand - extends CommonAnvilPluginsCommand - implements CommandExecutor { - - @Override - public CommandResult execute(CommandSource source, CommandContext context) { - executeDirect(source); - return CommandResult.success(); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilReloadCommand.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilReloadCommand.java deleted file mode 100644 index 5a5d7d57b..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeAnvilReloadCommand.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command; - -import org.anvilpowered.anvil.common.command.CommonAnvilReloadCommand; -import org.spongepowered.api.command.CommandResult; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.CommandContext; -import org.spongepowered.api.command.spec.CommandExecutor; -import org.spongepowered.api.text.Text; - -import java.util.Optional; - -public class SpongeAnvilReloadCommand - extends CommonAnvilReloadCommand - implements CommandExecutor { - - @Override - public CommandResult execute(CommandSource source, CommandContext context) { - Optional optionalPlugin = context.getOne("plugin"); - String[] reloadedResult = {""}; - if (context.hasAny("a")) { - reloadedResult[0] = doAll(); - } else if (!checkPresent(source, optionalPlugin.isPresent())) { - return CommandResult.empty(); - } else if (context.hasAny("r")) { - if (!doRegex(source, optionalPlugin.get(), reloadedResult)) { - return CommandResult.empty(); - } - } else if (!doDirect(source, optionalPlugin.get(), reloadedResult)) { - return CommandResult.empty(); - } - sendSuccess(source, reloadedResult); - return CommandResult.success(); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeCommandExecuteService.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeCommandExecuteService.java deleted file mode 100644 index 6cbe8c97a..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeCommandExecuteService.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.command.CommandExecuteService; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.plugin.PluginContainer; -import org.spongepowered.api.scheduler.Task; - -public class SpongeCommandExecuteService implements CommandExecuteService { - - @Inject - private PluginContainer pluginContainer; - - private void executeDirect(String command) { - Sponge.getCommandManager().process(Sponge.getServer().getConsole(), command); - } - - @Override - public void execute(String command) { - if (Sponge.getServer().isMainThread()) { - executeDirect(command); - } else { - Task.builder().execute(() -> executeDirect(command)).submit(pluginContainer); - } - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeCommandService.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeCommandService.java deleted file mode 100644 index 423b325de..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/command/SpongeCommandService.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command; - -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.common.command.CommonCommandService; -import org.spongepowered.api.command.CommandCallable; -import org.spongepowered.api.command.CommandResult; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.CommandContext; -import org.spongepowered.api.command.spec.CommandExecutor; -import org.spongepowered.api.text.Text; - -import java.util.List; -import java.util.function.Predicate; - -public class SpongeCommandService - extends CommonCommandService { - - private static abstract class Command implements CommandExecutor { - - protected final String helpUsage; - protected final Predicate extended; - - public Command(String helpUsage, Predicate extended) { - this.helpUsage = helpUsage; - this.extended = extended; - } - } - - private class RootCommand extends Command { - - public RootCommand(String helpUsage, Predicate extended) { - super(helpUsage, extended); - } - - @Override - public CommandResult execute(CommandSource source, CommandContext context) { - sendRoot(source, helpUsage, extended.test(source)); - return CommandResult.success(); - } - } - - private class VersionCommand extends Command { - - public VersionCommand(String helpUsage, Predicate extended) { - super(helpUsage, extended); - } - - @Override - public CommandResult execute(CommandSource source, CommandContext context) { - sendVersion(source, helpUsage, extended.test(source)); - return CommandResult.success(); - } - } - - private class HelpCommand implements CommandExecutor { - - private final CommandNode node; - - public HelpCommand(CommandNode node) { - this.node = node; - } - - @Override - public CommandResult execute(CommandSource source, CommandContext context) { - sendHelp(source, node); - return CommandResult.success(); - } - } - - private class ReloadCommand implements CommandExecutor { - - @Override - public CommandResult execute(CommandSource source, CommandContext context) { - sendReload(source); - return CommandResult.success(); - } - } - - @Override - protected void runExecutor( - CommandExecutor commandExecutor, - CommandCallable commandCallable, - CommandSource commandSource, - String alias, - String[] context - ) { - throw new UnsupportedOperationException(); - } - - @Override - protected List getSuggestions( - CommandExecutor commandExecutor, - CommandCallable commandCallable, - CommandSource commandSource, - String alias, - String[] context - ) { - throw new UnsupportedOperationException(); - } - - @Override - protected CommandExecutor generateWrapperCommand( - CommandExecutorWrapper command) { - throw new UnsupportedOperationException(); - } - - @Override - public CommandExecutor generateRootCommand( - String helpUsage, Predicate extended) { - return new RootCommand(helpUsage, extended); - } - - @Override - public CommandExecutor generateVersionCommand( - String helpUsage, Predicate extended) { - return new VersionCommand(helpUsage, extended); - } - - @Override - public CommandExecutor generateHelpCommand(CommandNode node) { - return new HelpCommand(node); - } - - @Override - public CommandExecutor generateReloadCommand() { - return new ReloadCommand(); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/entity/SpongeEntityUtils.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/entity/SpongeEntityUtils.java deleted file mode 100644 index 69f48031d..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/entity/SpongeEntityUtils.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.entity; - -import org.anvilpowered.anvil.common.entity.EntityUtils; -import org.spongepowered.api.util.Identifiable; - -import java.util.Optional; -import java.util.UUID; - -public class SpongeEntityUtils implements EntityUtils { - - @Override - public Optional extractUUID(Object entity) { - if (!(entity instanceof Identifiable)) { - return Optional.empty(); - } - return Optional.of(((Identifiable) entity).getUniqueId()); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/listener/SpongePlayerListener.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/listener/SpongePlayerListener.java deleted file mode 100644 index 66e2f4a54..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/listener/SpongePlayerListener.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.listener; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.coremember.CoreMemberManager; -import org.anvilpowered.anvil.api.entity.RestrictionService; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; -import org.spongepowered.api.entity.Entity; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.event.Cancellable; -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.action.InteractEvent; -import org.spongepowered.api.event.cause.entity.damage.source.DamageSource; -import org.spongepowered.api.event.cause.entity.damage.source.EntityDamageSource; -import org.spongepowered.api.event.command.SendCommandEvent; -import org.spongepowered.api.event.entity.DamageEntityEvent; -import org.spongepowered.api.event.entity.MoveEntityEvent; -import org.spongepowered.api.event.filter.Getter; -import org.spongepowered.api.event.filter.cause.Root; -import org.spongepowered.api.event.item.inventory.TargetInventoryEvent; -import org.spongepowered.api.event.network.ClientConnectionEvent; - -public class SpongePlayerListener { - - @Inject - private CoreMemberManager coreMemberManager; - - @Inject - private Registry registry; - - @Inject - private RestrictionService restrictionService; - - @Listener - public void onPlayerJoin(ClientConnectionEvent.Join event) { - if (registry.getOrDefault(Keys.PROXY_MODE)) { - return; - } - Player player = event.getTargetEntity(); - coreMemberManager.getPrimaryComponent() - .getOneOrGenerateForUser( - player.getUniqueId(), - player.getName(), - player.getConnection().getAddress().getHostString() - ); - } - - @Listener - public void onMovement(MoveEntityEvent event, @Getter("getTargetEntity") Entity entity) { - if (restrictionService.get(entity).movement()) { - event.setCancelled(true); - } - } - - @Listener - public void onInteraction(InteractEvent event, @Root Entity entity) { - if (restrictionService.get(entity).interaction()) { - event.setCancelled(true); - } - } - - @Listener - public void onInventory(TargetInventoryEvent event, @Root Player player) { - if (event instanceof Cancellable - && restrictionService.get(player.getUniqueId()).inventory()) { - ((Cancellable) event).setCancelled(true); - } - } - - @Listener - public void onCommands(SendCommandEvent event, @Root Player player) { - if (restrictionService.get(player.getUniqueId()).commands()) { - event.setCancelled(true); - } - } - - @Listener - public void onDamage(DamageEntityEvent event, @Getter("getTargetEntity") Entity target, @Root DamageSource source) { - if (restrictionService.get(target).damage() || ((source instanceof EntityDamageSource) - && restrictionService.get(((EntityDamageSource) source).getSource()).damage())) { - event.setCancelled(true); - } - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/module/ApiSpongeModule.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/module/ApiSpongeModule.java deleted file mode 100644 index d44b36c38..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/module/ApiSpongeModule.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.module; - -import com.google.inject.TypeLiteral; -import org.anvilpowered.anvil.api.PlatformImpl; -import org.anvilpowered.anvil.api.command.CommandExecuteService; -import org.anvilpowered.anvil.api.command.CommandService; -import org.anvilpowered.anvil.api.server.LocationService; -import org.anvilpowered.anvil.api.util.KickService; -import org.anvilpowered.anvil.api.util.PermissionService; -import org.anvilpowered.anvil.api.util.TextService; -import org.anvilpowered.anvil.api.util.UserService; -import org.anvilpowered.anvil.common.entity.EntityUtils; -import org.anvilpowered.anvil.common.module.PlatformModule; -import org.anvilpowered.anvil.sponge.command.SpongeCommandExecuteService; -import org.anvilpowered.anvil.sponge.command.SpongeCommandService; -import org.anvilpowered.anvil.sponge.entity.SpongeEntityUtils; -import org.anvilpowered.anvil.sponge.server.SpongeLocationService; -import org.anvilpowered.anvil.sponge.util.SpongeKickService; -import org.anvilpowered.anvil.sponge.util.SpongePermissionService; -import org.anvilpowered.anvil.sponge.util.SpongeTextService; -import org.anvilpowered.anvil.sponge.util.SpongeUserService; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.spec.CommandExecutor; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.living.player.User; -import org.spongepowered.api.text.Text; - -public class ApiSpongeModule extends PlatformModule { - - public ApiSpongeModule() { - super(new PlatformImpl(false, "sponge")); - } - - @Override - protected void configure() { - super.configure(); - bind(CommandExecuteService.class).to(SpongeCommandExecuteService.class); - bind(new TypeLiteral>() { - }).to(SpongeCommandService.class); - bind(EntityUtils.class).to(SpongeEntityUtils.class); - bind(KickService.class).to(SpongeKickService.class); - bind(LocationService.class).to(SpongeLocationService.class); - bind(PermissionService.class).to(SpongePermissionService.class); - bind(new TypeLiteral>() { - }).to(SpongeTextService.class); - bind(new TypeLiteral>() { - }).to(SpongeUserService.class); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/module/SpongeModule.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/module/SpongeModule.java deleted file mode 100644 index 77a408569..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/module/SpongeModule.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.module; - -import com.google.inject.TypeLiteral; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditRootCommand; -import org.anvilpowered.anvil.common.module.CommonModule; -import org.anvilpowered.anvil.common.registry.CommonConfigurationService; -import org.anvilpowered.anvil.sponge.command.SpongeAnvilCommandNode; -import org.anvilpowered.anvil.sponge.command.regedit.SpongeRegistryEditRootCommand; -import org.anvilpowered.anvil.sponge.registry.SpongeConfigurationService; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.living.player.User; -import org.spongepowered.api.text.Text; - -public class SpongeModule extends CommonModule { - - @Override - protected void configure() { - super.configure(); - - bind(CommonConfigurationService.class).to(SpongeConfigurationService.class); - bind(new TypeLiteral>() { - }).to(SpongeAnvilCommandNode.class); - bind(new TypeLiteral>() { - }).to(SpongeRegistryEditRootCommand.class); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeKickService.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeKickService.java deleted file mode 100644 index ba44cb050..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeKickService.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.util; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.api.util.KickService; -import org.anvilpowered.anvil.api.util.UserService; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.living.player.User; -import org.spongepowered.api.text.Text; - -import java.util.UUID; - -public class SpongeKickService implements KickService { - - @Inject - private UserService userService; - - @Override - public void kick(UUID userUUID, Object reason) { - userService.getPlayer(userUUID).ifPresent(player -> player.kick(Text.of(reason))); - } - - @Override - public void kick(String userName, Object reason) { - userService.getPlayer(userName).ifPresent(player -> player.kick(Text.of(reason))); - } - - @Override - public void kick(UUID userUUID) { - kick(userUUID, "You have been kicked"); - } - - @Override - public void kick(String userName) { - kick(userName, "You have been kicked"); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongePermissionService.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongePermissionService.java deleted file mode 100644 index d6f3ac40a..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongePermissionService.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.util; - -import org.anvilpowered.anvil.api.util.PermissionService; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.service.permission.Subject; - -public class SpongePermissionService implements PermissionService { - @Override - public boolean hasPermission(@Nullable Object subject, String permission) { - return subject instanceof Subject && ((Subject) subject).hasPermission(permission); - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeTextService.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeTextService.java deleted file mode 100644 index 7c9a23d7c..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeTextService.java +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.util; - -import org.anvilpowered.anvil.common.util.CommonTextService; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.service.pagination.PaginationList; -import org.spongepowered.api.service.pagination.PaginationService; -import org.spongepowered.api.text.Text; -import org.spongepowered.api.text.TextElement; -import org.spongepowered.api.text.action.ClickAction; -import org.spongepowered.api.text.action.HoverAction; -import org.spongepowered.api.text.action.TextActions; -import org.spongepowered.api.text.format.TextColors; -import org.spongepowered.api.text.format.TextStyles; -import org.spongepowered.api.text.serializer.TextSerializers; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.function.Consumer; - -@SuppressWarnings("unchecked") -public class SpongeTextService extends CommonTextService { - - @Override - public Builder builder() { - return new SpongeTextBuilder(); - } - - @Override - public PaginationBuilder paginationBuilder() { - return new SpongePaginationBuilder(); - } - - @Override - public void send(Text text, CommandSource receiver) { - receiver.sendMessage(text); - } - - @Override - public CommandSource getConsole() { - return Sponge.getServer().getConsole(); - } - - @Override - public Text deserialize(String text) { - return TextSerializers.FORMATTING_CODE.deserialize(text); - } - - @Override - public String serialize(Text text) { - return TextSerializers.FORMATTING_CODE.serialize(text); - } - - @Override - public String serializePlain(Text text) { - return text.toPlain(); - } - - protected class SpongeTextBuilder extends CommonTextBuilder { - - private final List elements; - private HoverAction hoverAction; - private ClickAction clickAction; - - protected SpongeTextBuilder() { - elements = new ArrayList<>(); - } - - @Override - public Builder aqua() { - elements.add(TextColors.AQUA); - return this; - } - - @Override - public Builder black() { - elements.add(TextColors.BLACK); - return this; - } - - @Override - public Builder blue() { - elements.add(TextColors.BLUE); - return this; - } - - @Override - public Builder dark_aqua() { - elements.add(TextColors.DARK_AQUA); - return this; - } - - @Override - public Builder dark_blue() { - elements.add(TextColors.DARK_BLUE); - return this; - } - - @Override - public Builder dark_gray() { - elements.add(TextColors.DARK_GRAY); - return this; - } - - @Override - public Builder dark_green() { - elements.add(TextColors.DARK_GREEN); - return this; - } - - @Override - public Builder dark_purple() { - elements.add(TextColors.DARK_PURPLE); - return this; - } - - @Override - public Builder dark_red() { - elements.add(TextColors.DARK_RED); - return this; - } - - @Override - public Builder gold() { - elements.add(TextColors.GOLD); - return this; - } - - @Override - public Builder gray() { - elements.add(TextColors.GRAY); - return this; - } - - @Override - public Builder green() { - elements.add(TextColors.GREEN); - return this; - } - - @Override - public Builder light_purple() { - elements.add(TextColors.LIGHT_PURPLE); - return this; - } - - @Override - public Builder red() { - elements.add(TextColors.RED); - return this; - } - - @Override - public Builder reset() { - elements.add(TextColors.RESET); - return this; - } - - @Override - public Builder white() { - elements.add(TextColors.WHITE); - return this; - } - - @Override - public Builder yellow() { - elements.add(TextColors.YELLOW); - return this; - } - - @Override - public Builder bold() { - elements.add(TextStyles.BOLD); - return this; - } - - @Override - public Builder italic() { - elements.add(TextStyles.ITALIC); - return this; - } - - @Override - public Builder obfuscated() { - elements.add(TextStyles.OBFUSCATED); - return this; - } - - @Override - public Builder strikethrough() { - elements.add(TextStyles.STRIKETHROUGH); - return this; - } - - @Override - public Builder underlined() { - elements.add(TextStyles.UNDERLINE); - return this; - } - - @Override - public Builder append(Object... contents) { - for (Object o : contents) { - if (o instanceof Builder) { - elements.add(((Builder) o).build()); - } else if (o instanceof TextElement) { - elements.add((TextElement) o); - } else { - elements.add(Text.of(o)); - } - } - return this; - } - - @Override - public Builder appendJoining(Object delimiter, Object... contents) { - final int indexOfLast = contents.length - 1; - for (int i = 0; i <= indexOfLast; i++) { - Object o = contents[i]; - if (o instanceof Builder) { - elements.add(((Builder) o).build()); - } else if (o instanceof TextElement) { - elements.add((TextElement) o); - } else { - elements.add(Text.of(o)); - } - if (i != indexOfLast) { - elements.add(Text.of(delimiter)); - } - } - return this; - } - - @Override - public Builder onHoverShowText(Text content) { - hoverAction = TextActions.showText(content); - return this; - } - - @Override - public Builder onClickSuggestCommand(String command) { - clickAction = TextActions.suggestCommand(command); - return this; - } - - @Override - public Builder onClickRunCommand(String command) { - clickAction = TextActions.runCommand(command); - return this; - } - - @Override - public Builder onClickExecuteCallback( - Consumer callback) { - clickAction = TextActions.executeCallback(callback); - return this; - } - - @Override - public Builder onClickOpenUrl(URL url) { - clickAction = TextActions.openUrl(url); - return this; - } - - @Override - public Builder onClickOpenUrl(String url) { - try { - clickAction = TextActions.openUrl(new URL(url)); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - return this; - } - - @Override - public Text build() { - boolean hover = hoverAction != null; - boolean click = clickAction != null; - - if (elements.size() == 1 && !hover && !click) { - TextElement o = elements.get(0); - if (o instanceof Builder) { - return ((Builder) o).build(); - } - return Text.of(o); - } - Text.Builder builder = Text.builder().append(Text.of(elements.toArray())); - if (hover) { - builder.onHover(hoverAction); - } - if (click) { - builder.onClick(clickAction); - } - return builder.build(); - } - } - - protected class SpongePaginationBuilder extends CommonPaginationBuilder { - - private final PaginationList.Builder builder; - - public SpongePaginationBuilder() { - builder = Sponge.getServiceManager() - .provideUnchecked(PaginationService.class).builder(); - } - - @Override - public PaginationBuilder contents( - Text... contents) { - builder.contents(contents); - return this; - } - - @Override - public PaginationBuilder contents( - Iterable contents) { - builder.contents(contents); - return this; - } - - @Override - public PaginationBuilder title( - @Nullable Text title) { - builder.title(title); - return this; - } - - @Override - public PaginationBuilder header( - @Nullable Text header) { - builder.header(header); - return this; - } - - @Override - public PaginationBuilder footer( - @Nullable Text footer) { - builder.footer(footer); - return this; - } - - @Override - public PaginationBuilder padding( - Text padding) { - builder.padding(padding); - return this; - } - - @Override - public PaginationBuilder linesPerPage( - int linesPerPage) { - if (linesPerPage < 1) { - throw new IllegalArgumentException("Lines per page must be at least 1"); - } - builder.linesPerPage(linesPerPage); - return this; - } - - @Override - public Pagination build() { - return new SpongePagination(builder.build()); - } - } - - protected static class SpongePagination implements Pagination { - - private final PaginationList paginationList; - - public SpongePagination(PaginationList paginationList) { - this.paginationList = paginationList; - } - - @Override - public Iterable getContents() { - return paginationList.getContents(); - } - - @Override - public Optional getTitle() { - return paginationList.getTitle(); - } - - @Override - public Optional getHeader() { - return paginationList.getHeader(); - } - - @Override - public Optional getFooter() { - return paginationList.getFooter(); - } - - @Override - public Text getPadding() { - return paginationList.getPadding(); - } - - @Override - public int getLinesPerPage() { - return paginationList.getLinesPerPage(); - } - - @Override - public void sendTo(CommandSource receiver) { - paginationList.sendTo(receiver); - } - - @Override - public void sendToConsole() { - sendTo(Sponge.getServer().getConsole()); - } - } -} diff --git a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeUserService.java b/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeUserService.java deleted file mode 100644 index d82e86cf8..000000000 --- a/anvil-sponge/src/main/java/org/anvilpowered/anvil/sponge/util/SpongeUserService.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.util; - -import com.google.inject.Inject; -import org.anvilpowered.anvil.common.util.CommonUserService; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.living.player.User; -import org.spongepowered.api.profile.GameProfile; -import org.spongepowered.api.service.user.UserStorageService; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; - -public class SpongeUserService extends CommonUserService { - - @Inject - public SpongeUserService() { - super(User.class); - } - - @Override - public Optional get(String userName) { - return Sponge.getServiceManager().provide(UserStorageService.class).flatMap(u -> u.get(userName)); - } - - @Override - public Optional get(UUID userUUID) { - return Sponge.getServiceManager().provide(UserStorageService.class).flatMap(u -> u.get(userUUID)); - } - - @Override - public Optional getPlayer(String userName) { - return get(userName).flatMap(User::getPlayer); - } - - @Override - public Optional getPlayer(UUID userUUID) { - return get(userUUID).flatMap(User::getPlayer); - } - - @Override - public Optional getPlayer(User user) { - return user.getPlayer(); - } - - @Override - public List matchPlayerNames(String lastKnownName) { - return Sponge.getServiceManager().provideUnchecked(UserStorageService.class).match(lastKnownName).stream() - .map(GameProfile::getName) - .filter(Optional::isPresent) - .map(Optional::get) - .collect(Collectors.toList()); - } - - @Override - public Collection getOnlinePlayers() { - return Sponge.getServer().getOnlinePlayers(); - } - - @Override - public CompletableFuture> getUUID(String userName) { - Optional userUUID = getPlayer(userName).map(Player::getUniqueId); - if (userUUID.isPresent()) { - return CompletableFuture.completedFuture(userUUID); - } - return super.getUUID(userName); - } - - @Override - public CompletableFuture> getUserName(UUID userUUID) { - Optional userName = getPlayer(userUUID).map(Player::getName); - if (userName.isPresent()) { - return CompletableFuture.completedFuture(userName); - } - return super.getUserName(userUUID); - } - - @Override - public UUID getUUID(User user) { - return user.getUniqueId(); - } - - @Override - public String getUserName(User user) { - return user.getName(); - } -} diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCancelCommand.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCancelCommand.kt deleted file mode 100644 index ecef436a9..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCancelCommand.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command.regedit - -import org.anvilpowered.anvil.api.registry.Keys -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCancelCommand -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode -import org.anvilpowered.anvil.common.command.regedit.alias -import org.spongepowered.api.command.CommandCallable -import org.spongepowered.api.command.CommandResult -import org.spongepowered.api.command.CommandSource -import org.spongepowered.api.entity.living.player.Player -import org.spongepowered.api.entity.living.player.User -import org.spongepowered.api.text.Text -import org.spongepowered.api.world.Location -import org.spongepowered.api.world.World -import java.util.Optional - -class SpongeRegistryEditCancelCommand : CommonRegistryEditCancelCommand(), CommandCallable { - - companion object { - val DESCRIPTION: Optional = Optional.of(Text.of(CommonRegistryEditCommandNode.CANCEL_DESCRIPTION)) - val USAGE: Text get() = Text.of("/$alias regedit cancel") - } - - override fun process(source: CommandSource, context: String): CommandResult { - execute(source) - return CommandResult.success() - } - - override fun getSuggestions(source: CommandSource, context: String, targetPosition: Location?): List { - return listOf() - } - - override fun testPermission(source: CommandSource): Boolean { - return source.hasPermission(registry.getOrDefault(Keys.REGEDIT_PERMISSION)) - } - - override fun getShortDescription(source: CommandSource): Optional = DESCRIPTION - override fun getHelp(source: CommandSource): Optional = DESCRIPTION - override fun getUsage(source: CommandSource): Text = USAGE -} diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCommandNode.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCommandNode.kt deleted file mode 100644 index 614599830..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCommandNode.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command.regedit - -import com.google.inject.Inject -import com.google.inject.Singleton -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode -import org.spongepowered.api.command.CommandCallable -import org.spongepowered.api.command.CommandSource -import org.spongepowered.api.command.spec.CommandExecutor -import org.spongepowered.api.command.spec.CommandSpec -import java.util.HashMap - -@Singleton -class SpongeRegistryEditCommandNode @Inject constructor( - registry: Registry, -) : CommonRegistryEditCommandNode(registry) { - - @Inject - private lateinit var registryEditCancelCommand: SpongeRegistryEditCancelCommand - - @Inject - private lateinit var registryEditCommitCommand: SpongeRegistryEditCommitCommand - - @Inject - private lateinit var registryEditKeyCommand: SpongeRegistryEditKeyCommand - - @Inject - private lateinit var registryEditSelectCommand: SpongeRegistryEditSelectCommand - - @Inject - private lateinit var registryEditStartCommand: SpongeRegistryEditStartCommand - - val subCommands: MutableMap, CommandCallable> = HashMap() - - override fun loadCommands() { - subCommands[CANCEL_ALIAS] = registryEditCancelCommand - subCommands[COMMIT_ALIAS] = registryEditCommitCommand - subCommands[KEY_ALIAS] = registryEditKeyCommand - subCommands[SELECT_ALIAS] = registryEditSelectCommand - subCommands[START_ALIAS] = registryEditStartCommand - subCommands[HELP_ALIAS] = CommandSpec.builder().executor(commandService.generateHelpCommand(this)).build() - } -} diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCommitCommand.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCommitCommand.kt deleted file mode 100644 index 42825daca..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditCommitCommand.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command.regedit - -import org.anvilpowered.anvil.api.registry.Keys -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommitCommand -import org.anvilpowered.anvil.common.command.regedit.alias -import org.spongepowered.api.command.CommandCallable -import org.spongepowered.api.command.CommandResult -import org.spongepowered.api.command.CommandSource -import org.spongepowered.api.entity.living.player.Player -import org.spongepowered.api.entity.living.player.User -import org.spongepowered.api.text.Text -import org.spongepowered.api.world.Location -import org.spongepowered.api.world.World -import java.util.Optional - -class SpongeRegistryEditCommitCommand : CommonRegistryEditCommitCommand(), CommandCallable { - - companion object { - val DESCRIPTION: Optional = Optional.of(Text.of(CommonRegistryEditCommandNode.COMMIT_DESCRIPTION)) - val USAGE: Text get() = Text.of("/$alias regedit commit") - } - - override fun process(source: CommandSource, context: String): CommandResult { - execute(source) - return CommandResult.success() - } - - override fun getSuggestions(source: CommandSource, context: String, targetPosition: Location?): List { - return listOf() - } - - override fun testPermission(source: CommandSource): Boolean { - return source.hasPermission(registry.getOrDefault(Keys.REGEDIT_PERMISSION)) - } - - override fun getShortDescription(source: CommandSource): Optional = DESCRIPTION - override fun getHelp(source: CommandSource): Optional = DESCRIPTION - override fun getUsage(source: CommandSource): Text = USAGE -} diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditKeyCommand.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditKeyCommand.kt deleted file mode 100644 index 7ef5fea90..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditKeyCommand.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command.regedit - -import org.anvilpowered.anvil.api.registry.Keys -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditKeyCommand -import org.anvilpowered.anvil.common.command.regedit.alias -import org.anvilpowered.anvil.common.command.regedit.whitespace -import org.spongepowered.api.command.CommandCallable -import org.spongepowered.api.command.CommandResult -import org.spongepowered.api.command.CommandSource -import org.spongepowered.api.entity.living.player.Player -import org.spongepowered.api.entity.living.player.User -import org.spongepowered.api.text.Text -import org.spongepowered.api.world.Location -import org.spongepowered.api.world.World -import java.util.Optional - -class SpongeRegistryEditKeyCommand : CommonRegistryEditKeyCommand(), CommandCallable { - - companion object { - val DESCRIPTION: Optional = Optional.of(Text.of(CommonRegistryEditCommandNode.KEY_DESCRIPTION)) - val USAGE: Text get() = Text.of("/$alias regedit key ${CommonRegistryEditCommandNode.KEY_USAGE}") - } - - override fun process(source: CommandSource, context: String): CommandResult { - execute(source, context.split(whitespace).toTypedArray()) - return CommandResult.success() - } - - override fun getSuggestions(source: CommandSource, context: String, targetPosition: Location?): List { - return suggest(source, context.split(whitespace).toTypedArray()) - } - - override fun testPermission(source: CommandSource): Boolean { - return source.hasPermission(registry.getOrDefault(Keys.REGEDIT_PERMISSION)) - } - - override fun getShortDescription(source: CommandSource): Optional = DESCRIPTION - override fun getHelp(source: CommandSource): Optional = DESCRIPTION - override fun getUsage(source: CommandSource): Text = USAGE -} diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditRootCommand.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditRootCommand.kt deleted file mode 100644 index 845a9065d..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditRootCommand.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command.regedit - -import com.google.inject.Singleton -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditRootCommand -import org.spongepowered.api.command.CommandResult -import org.spongepowered.api.command.CommandSource -import org.spongepowered.api.command.args.CommandContext -import org.spongepowered.api.command.spec.CommandExecutor -import org.spongepowered.api.entity.living.player.Player -import org.spongepowered.api.entity.living.player.User -import org.spongepowered.api.text.Text - -@Singleton -class SpongeRegistryEditRootCommand : CommonRegistryEditRootCommand(), CommandExecutor { - override fun execute(source: CommandSource, context: CommandContext): CommandResult { - execute(source) - return CommandResult.success() - } -} diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditSelectCommand.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditSelectCommand.kt deleted file mode 100644 index 2da523b5d..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditSelectCommand.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command.regedit - -import org.anvilpowered.anvil.api.registry.Keys -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditSelectCommand -import org.anvilpowered.anvil.common.command.regedit.alias -import org.anvilpowered.anvil.common.command.regedit.whitespace -import org.spongepowered.api.command.CommandCallable -import org.spongepowered.api.command.CommandResult -import org.spongepowered.api.command.CommandSource -import org.spongepowered.api.entity.living.player.Player -import org.spongepowered.api.entity.living.player.User -import org.spongepowered.api.text.Text -import org.spongepowered.api.world.Location -import org.spongepowered.api.world.World -import java.util.Optional - -class SpongeRegistryEditSelectCommand : CommonRegistryEditSelectCommand(), CommandCallable { - - companion object { - val DESCRIPTION: Optional = Optional.of(Text.of(CommonRegistryEditCommandNode.SELECT_DESCRIPTION)) - val USAGE: Text get() = Text.of("/$alias regedit select ${CommonRegistryEditCommandNode.SELECT_USAGE}") - } - - override fun process(source: CommandSource, context: String): CommandResult { - execute(source, context.split(whitespace).toTypedArray()) - return CommandResult.success() - } - - override fun getSuggestions(source: CommandSource, context: String, targetPosition: Location?): List { - return suggest(source, context.split(whitespace).toTypedArray()) - } - - override fun testPermission(source: CommandSource): Boolean { - return source.hasPermission(registry.getOrDefault(Keys.REGEDIT_PERMISSION)) - } - - override fun getShortDescription(source: CommandSource): Optional = DESCRIPTION - override fun getHelp(source: CommandSource): Optional = DESCRIPTION - override fun getUsage(source: CommandSource): Text = USAGE -} diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditStartCommand.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditStartCommand.kt deleted file mode 100644 index 61006513c..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/command/regedit/SpongeRegistryEditStartCommand.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.command.regedit - -import org.anvilpowered.anvil.api.registry.Keys -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditStartCommand -import org.anvilpowered.anvil.common.command.regedit.alias -import org.anvilpowered.anvil.common.command.regedit.whitespace -import org.spongepowered.api.command.CommandCallable -import org.spongepowered.api.command.CommandResult -import org.spongepowered.api.command.CommandSource -import org.spongepowered.api.entity.living.player.Player -import org.spongepowered.api.entity.living.player.User -import org.spongepowered.api.text.Text -import org.spongepowered.api.world.Location -import org.spongepowered.api.world.World -import java.util.Optional - -class SpongeRegistryEditStartCommand : CommonRegistryEditStartCommand(), CommandCallable { - - companion object { - val DESCRIPTION: Optional = Optional.of(Text.of(CommonRegistryEditCommandNode.START_DESCRIPTION)) - val USAGE: Text get() = Text.of("/$alias regedit start ${CommonRegistryEditCommandNode.START_USAGE}") - } - - override fun process(source: CommandSource, context: String): CommandResult { - execute(source, context.split(whitespace).toTypedArray()) - return CommandResult.success() - } - - override fun getSuggestions(source: CommandSource, context: String, targetPosition: Location?): List { - return suggest(source, context.split(whitespace).toTypedArray()) - } - - override fun testPermission(source: CommandSource): Boolean { - return source.hasPermission(registry.getOrDefault(Keys.REGEDIT_PERMISSION)) - } - - override fun getShortDescription(source: CommandSource): Optional = DESCRIPTION - override fun getHelp(source: CommandSource): Optional = DESCRIPTION - override fun getUsage(source: CommandSource): Text = USAGE -} diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/module/SpongeFallbackModule.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/module/SpongeFallbackModule.kt deleted file mode 100644 index d4d0c1b52..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/module/SpongeFallbackModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.sponge.module - -import org.anvilpowered.anvil.common.module.FallbackModule -import org.spongepowered.api.command.CommandSource -import org.spongepowered.api.text.Text - -class SpongeFallbackModule : FallbackModule() diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/registry/SpongeConfigurationService.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/registry/SpongeConfigurationService.kt deleted file mode 100644 index 3ef6434ef..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/registry/SpongeConfigurationService.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.sponge.registry - -import com.google.inject.Inject -import com.google.inject.Singleton -import ninja.leaping.configurate.commented.CommentedConfigurationNode -import ninja.leaping.configurate.loader.ConfigurationLoader -import org.anvilpowered.anvil.common.registry.CommonConfigurationService -import org.spongepowered.api.config.DefaultConfig - -@Singleton -class SpongeConfigurationService @Inject constructor( - @DefaultConfig(sharedRoot = false) configLoader: ConfigurationLoader -) : CommonConfigurationService(configLoader) diff --git a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/server/SpongeLocationService.kt b/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/server/SpongeLocationService.kt deleted file mode 100644 index 85c10e4ac..000000000 --- a/anvil-sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/server/SpongeLocationService.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.sponge.server - -import com.flowpowered.math.vector.Vector3d -import com.google.inject.Inject -import org.anvilpowered.anvil.api.util.UserService -import org.anvilpowered.anvil.common.server.CommonLocationService -import org.spongepowered.api.Sponge -import org.spongepowered.api.entity.living.player.Player -import org.spongepowered.api.entity.living.player.User -import java.util.Optional -import java.util.UUID -import java.util.concurrent.CompletableFuture - -class SpongeLocationService : CommonLocationService() { - - @Inject - private lateinit var userService: UserService - - override fun teleport(teleportingUserUUID: UUID, targetUserUUID: UUID): CompletableFuture { - val teleporter = userService[teleportingUserUUID] - val target = userService[targetUserUUID] - return CompletableFuture.completedFuture( - if (teleporter.isPresent && target.isPresent) { - target.get().worldUniqueId - .filter { teleporter.get().setLocation(target.get().position, it) } - .isPresent - } else false - ) - } - - override fun getWorldName(userName: String): Optional { - return userService[userName].flatMap { it.worldUniqueId } - .flatMap { Sponge.getServer().getWorld(it) } - .map { it.name } - } - - override fun getWorldName(userUUID: UUID): Optional { - return userService[userUUID].flatMap { it.worldUniqueId } - .flatMap { Sponge.getServer().getWorld(it) } - .map { it.name } - } - - override fun getPosition(userUUID: UUID): Optional { - return userService[userUUID].map { it.position } - } - - override fun getPosition(userName: String): Optional { - return userService[userName].map { it.position } - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/AnvilVelocity.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/AnvilVelocity.java deleted file mode 100644 index 57ac8b05f..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/AnvilVelocity.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity; - -import com.google.inject.Inject; -import com.google.inject.Injector; -import com.velocitypowered.api.event.PostOrder; -import com.velocitypowered.api.event.Subscribe; -import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; -import com.velocitypowered.api.plugin.Plugin; -import com.velocitypowered.api.proxy.ProxyServer; -import org.anvilpowered.anvil.api.AnvilImpl; -import org.anvilpowered.anvil.api.EnvironmentBuilderImpl; -import org.anvilpowered.anvil.common.plugin.AnvilPluginInfo; -import org.anvilpowered.anvil.velocity.listener.VelocityPlayerListener; -import org.anvilpowered.anvil.velocity.module.ApiVelocityModule; -import org.anvilpowered.anvil.velocity.module.VelocityFallbackModule; -import org.anvilpowered.anvil.velocity.module.VelocityModule; - -@Plugin( - id = AnvilPluginInfo.id, - name = AnvilPluginInfo.name, - version = AnvilPluginInfo.version, - description = AnvilPluginInfo.description, - url = AnvilPluginInfo.url, - authors = AnvilPluginInfo.organizationName -) -public class AnvilVelocity extends AnvilImpl { - - @Inject - private ProxyServer proxyServer; - - @Inject - public AnvilVelocity(Injector injector) { - super(injector, new VelocityModule()); - } - - @Subscribe(order = PostOrder.EARLY) - public void onInit(ProxyInitializeEvent event) { - EnvironmentBuilderImpl.completeInitialization(new ApiVelocityModule(), new VelocityFallbackModule()); - proxyServer.getEventManager().register(this, - environment.getInjector().getInstance(VelocityPlayerListener.class)); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilCommandNode.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilCommandNode.java deleted file mode 100644 index 07e242b7b..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilCommandNode.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.command; - -import com.google.inject.Inject; -import com.velocitypowered.api.command.Command; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.SimpleCommand; -import com.velocitypowered.api.proxy.ProxyServer; -import org.anvilpowered.anvil.api.registry.Registry; -import org.anvilpowered.anvil.common.command.CommonAnvilCommandNode; -import org.anvilpowered.anvil.velocity.command.regedit.VelocityRegistryEditCommandNode; -import org.anvilpowered.anvil.velocity.command.regedit.VelocityRegistryEditRootCommand; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class VelocityAnvilCommandNode - extends CommonAnvilCommandNode { - - @Inject - private VelocityAnvilPluginsCommand anvilPluginsCommand; - - @Inject - private VelocityAnvilReloadCommand anvilReloadCommand; - - @Inject - private VelocityCallbackCommand callbackCommand; - - @Inject - private VelocityRegistryEditRootCommand registryEditRootCommand; - - @Inject - private VelocityRegistryEditCommandNode registryEditCommandNode; - - @Inject - private ProxyServer proxyServer; - - private static final String HELP_COMMAND_PROXY = "/anvilv help"; - - @Inject - public VelocityAnvilCommandNode(Registry registry) { - super(registry); - } - - @Override - protected void loadCommands() { - Map, SimpleCommand> subCommands = new HashMap<>(); - - subCommands.put(PLUGINS_ALIAS, anvilPluginsCommand); - subCommands.put(RELOAD_ALIAS, anvilReloadCommand); - subCommands.put(REGEDIT_ALIAS, commandService.generateRoutingCommand( - registryEditRootCommand, registryEditCommandNode.getSubCommands(), false) - ); - subCommands.put(HELP_ALIAS, commandService.generateHelpCommand(this)); - subCommands.put(VERSION_ALIAS, commandService.generateVersionCommand(HELP_COMMAND_PROXY)); - - proxyServer.getCommandManager().register("anvilv", - commandService.generateRoutingCommand( - commandService.generateRootCommand(HELP_COMMAND_PROXY), subCommands, false), - "av", "anvilv:av", "anvilv:anvilv"); - - proxyServer.getCommandManager().register("callback", callbackCommand, "anvilv:callback"); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilPluginsCommand.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilPluginsCommand.java deleted file mode 100644 index 75ce26992..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilPluginsCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.command; - -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.SimpleCommand; -import net.kyori.adventure.text.TextComponent; -import org.anvilpowered.anvil.common.command.CommonAnvilPluginsCommand; - -import java.util.List; - -public class VelocityAnvilPluginsCommand - extends CommonAnvilPluginsCommand - implements SimpleCommand { - - @Override - public void execute(Invocation invocation) { - super.execute(invocation.source(), invocation.arguments()); - } - - @Override - public List suggest(Invocation invocation) { - return null; - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilReloadCommand.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilReloadCommand.java deleted file mode 100644 index e45cf62de..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityAnvilReloadCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.command; - -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.SimpleCommand; -import net.kyori.adventure.text.TextComponent; -import org.anvilpowered.anvil.common.command.CommonAnvilReloadCommand; - -import java.util.List; - -public class VelocityAnvilReloadCommand - extends CommonAnvilReloadCommand - implements SimpleCommand { - - @Override - public void execute(Invocation invocation) { - super.execute(invocation.source(), invocation.arguments()); - } - - @Override - public List suggest(Invocation invocation) { - return super.suggest(invocation.source(), invocation.arguments()); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCallbackCommand.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCallbackCommand.java deleted file mode 100644 index c4d1cbe5c..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCallbackCommand.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.command; - -import com.google.inject.Singleton; -import com.velocitypowered.api.command.Command; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.SimpleCommand; -import net.kyori.adventure.text.TextComponent; -import org.anvilpowered.anvil.common.command.CommonCallbackCommand; - -import java.util.List; - -@Singleton -public class VelocityCallbackCommand - extends CommonCallbackCommand - implements SimpleCommand { - - @Override - public void execute(Invocation invocation) { - super.execute(invocation.source(), invocation.arguments()); - } - - @Override - public List suggest(Invocation invocation) { - return null; - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCommandExecuteService.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCommandExecuteService.java deleted file mode 100644 index 3c30d43a3..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCommandExecuteService.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.command; - -import com.google.inject.Inject; -import com.velocitypowered.api.proxy.ProxyServer; -import org.anvilpowered.anvil.api.command.CommandExecuteService; - -public class VelocityCommandExecuteService implements CommandExecuteService { - - @Inject - private ProxyServer proxyServer; - - @Override - public void execute(String command) { - proxyServer.getCommandManager().executeAsync(proxyServer.getConsoleCommandSource(), command); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCommandService.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCommandService.java deleted file mode 100644 index 956aec0fa..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/command/VelocityCommandService.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.command; - -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.SimpleCommand; -import net.kyori.adventure.text.TextComponent; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.common.command.CommonCommandService; -import org.checkerframework.checker.nullness.qual.NonNull; - -import java.util.List; -import java.util.function.Predicate; - -public class VelocityCommandService extends CommonCommandService { - - private static class WrapperCommand implements SimpleCommand { - private final CommandExecutorWrapper wrapper; - - public WrapperCommand(CommandExecutorWrapper wrapper) { - this.wrapper = wrapper; - } - - @Override - public void execute(Invocation invocation) { - wrapper.execute(null, invocation.source(), null, invocation.arguments()); - } - - @Override - public List suggest(Invocation invocation) { - return wrapper.suggest(null, invocation.source(), null, invocation.arguments()); - } - } - - private abstract static class VCommand implements SimpleCommand { - - protected final String helpUsage; - protected final Predicate extended; - - protected VCommand(String helpUsage, Predicate extended) { - this.helpUsage = helpUsage; - this.extended = extended; - } - } - - private class RootCommand extends VCommand { - public RootCommand(String helpUsage, Predicate extended) { - super(helpUsage, extended); - } - - @Override - public void execute(Invocation invocation) { - sendRoot(invocation.source(), helpUsage, extended.test(invocation.source())); - } - } - - private class VersionCommand extends VCommand { - - public VersionCommand(String helpUsage, Predicate extended) { - super(helpUsage, extended); - } - - @Override - public void execute(Invocation invocation) { - sendVersion(invocation.source(), helpUsage, extended.test(invocation.source())); - } - } - - private class HelpCommand implements SimpleCommand { - - private final CommandNode node; - - private HelpCommand(CommandNode node) { - this.node = node; - } - - @Override - public void execute(Invocation invocation) { - sendHelp(invocation.source(), node); - } - } - - private class ReloadCommand implements SimpleCommand { - - @Override - public void execute(Invocation invocation) { - sendReload(invocation.source()); - } - } - - @Override - protected void runExecutor( - SimpleCommand executor, - SimpleCommand command, - CommandSource source, - String alias, - String[] context) { - executor.execute(new SimpleCommand.Invocation() { - @Override - public String alias() { - return alias; - } - - @Override - public CommandSource source() { - return source; - } - - @Override - public String @NonNull [] arguments() { - return context; - } - }); - } - - @Override - protected List getSuggestions( - SimpleCommand executor, - SimpleCommand command, - CommandSource source, - String alias, - String[] context) { - return executor.suggest(new SimpleCommand.Invocation() { - @Override - public String alias() { - return alias; - } - - @Override - public CommandSource source() { - return source; - } - - @Override - public String @NonNull [] arguments() { - return context; - } - }); - } - - @Override - protected SimpleCommand generateWrapperCommand(CommandExecutorWrapper command) { - return new WrapperCommand(command); - } - - @Override - public SimpleCommand generateRootCommand(String helpUsage, Predicate extended) { - return new RootCommand(helpUsage, extended); - } - - @Override - public SimpleCommand generateVersionCommand(String helpUsage, Predicate extended) { - return new VersionCommand(helpUsage, extended); - } - - @Override - public SimpleCommand generateHelpCommand(CommandNode node) { - return new HelpCommand(node); - } - - @Override - public SimpleCommand generateReloadCommand() { - return new ReloadCommand(); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/listener/VelocityPlayerListener.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/listener/VelocityPlayerListener.java deleted file mode 100644 index ba12511f4..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/listener/VelocityPlayerListener.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.listener; - -import com.google.inject.Inject; -import com.velocitypowered.api.event.Subscribe; -import com.velocitypowered.api.event.connection.LoginEvent; -import com.velocitypowered.api.event.player.PlayerChatEvent; -import com.velocitypowered.api.proxy.Player; -import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.text.TextComponent; -import org.anvilpowered.anvil.api.coremember.CoreMemberManager; -import org.anvilpowered.anvil.api.model.coremember.CoreMember; -import org.anvilpowered.anvil.api.plugin.PluginMessages; -import org.anvilpowered.anvil.api.registry.Keys; -import org.anvilpowered.anvil.api.registry.Registry; - -public class VelocityPlayerListener { - - @Inject - private CoreMemberManager coreMemberManager; - - @Inject - private PluginMessages pluginMessages; - - @Inject - private Registry registry; - - @Subscribe - public void onPlayerJoin(LoginEvent event) { - if (registry.getOrDefault(Keys.PROXY_MODE)) { - return; - } - Player player = event.getPlayer(); - coreMemberManager.getPrimaryComponent() - .getOneOrGenerateForUser( - player.getUniqueId(), - player.getUsername(), - player.getRemoteAddress().getHostString() - ).thenAcceptAsync(optionalMember -> { - if (!optionalMember.isPresent()) { - return; - } - CoreMember coreMember = optionalMember.get(); - if (coreMemberManager.getPrimaryComponent().checkBanned(coreMember)) { - player.disconnect( - pluginMessages.getBanMessage(coreMember.getBanReason(), coreMember.getBanEndUtc()) - ); - } - }).join(); - } - - @Subscribe - public void onPlayerChat(PlayerChatEvent event) { - if (registry.getOrDefault(Keys.PROXY_MODE)) { - return; - } - Player player = event.getPlayer(); - coreMemberManager.getPrimaryComponent() - .getOneForUser( - player.getUniqueId() - ).thenAcceptAsync(optionalMember -> { - if (!optionalMember.isPresent()) { - return; - } - CoreMember coreMember = optionalMember.get(); - if (coreMemberManager.getPrimaryComponent().checkMuted(coreMember)) { - event.setResult(PlayerChatEvent.ChatResult.denied()); - player.sendMessage( - Identity.nil(), - pluginMessages.getMuteMessage(coreMember.getMuteReason(), coreMember.getMuteEndUtc()) - ); - } - }).join(); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/module/ApiVelocityModule.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/module/ApiVelocityModule.java deleted file mode 100644 index 630dcf45f..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/module/ApiVelocityModule.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.module; - -import com.google.inject.TypeLiteral; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.SimpleCommand; -import com.velocitypowered.api.proxy.Player; -import net.kyori.adventure.text.TextComponent; -import org.anvilpowered.anvil.api.PlatformImpl; -import org.anvilpowered.anvil.api.command.CommandExecuteService; -import org.anvilpowered.anvil.api.command.CommandService; -import org.anvilpowered.anvil.api.misc.BindingExtensions; -import org.anvilpowered.anvil.api.server.LocationService; -import org.anvilpowered.anvil.api.util.KickService; -import org.anvilpowered.anvil.api.util.PermissionService; -import org.anvilpowered.anvil.api.util.TextService; -import org.anvilpowered.anvil.api.util.UserService; -import org.anvilpowered.anvil.common.command.CommonCallbackCommand; -import org.anvilpowered.anvil.common.module.PlatformModule; -import org.anvilpowered.anvil.velocity.command.VelocityCallbackCommand; -import org.anvilpowered.anvil.velocity.command.VelocityCommandExecuteService; -import org.anvilpowered.anvil.velocity.command.VelocityCommandService; -import org.anvilpowered.anvil.velocity.server.VelocityLocationService; -import org.anvilpowered.anvil.velocity.util.VelocityKickService; -import org.anvilpowered.anvil.velocity.util.VelocityPermissionService; -import org.anvilpowered.anvil.velocity.util.VelocityTextService; -import org.anvilpowered.anvil.velocity.util.VelocityUserService; - -public class ApiVelocityModule extends PlatformModule { - - public ApiVelocityModule() { - super(new PlatformImpl(true, "velocity")); - } - - @Override - protected void configure() { - super.configure(); - bind(new TypeLiteral>() { - }).toProvider(BindingExtensions.asInternalProvider(VelocityCallbackCommand.class)); - bind(CommandExecuteService.class).to(VelocityCommandExecuteService.class); - bind(new TypeLiteral>() { - }).to(VelocityCommandService.class); - bind(KickService.class).to(VelocityKickService.class); - bind(LocationService.class).to(VelocityLocationService.class); - bind(PermissionService.class).to(VelocityPermissionService.class); - bind(new TypeLiteral>() { - }).to(VelocityTextService.class); - bind(new TypeLiteral>() { - }).to(VelocityUserService.class); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/module/VelocityModule.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/module/VelocityModule.java deleted file mode 100644 index e3bf60961..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/module/VelocityModule.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.module; - -import com.google.inject.TypeLiteral; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.proxy.Player; -import net.kyori.adventure.text.TextComponent; -import ninja.leaping.configurate.commented.CommentedConfigurationNode; -import ninja.leaping.configurate.hocon.HoconConfigurationLoader; -import ninja.leaping.configurate.loader.ConfigurationLoader; -import org.anvilpowered.anvil.api.command.CommandNode; -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditRootCommand; -import org.anvilpowered.anvil.common.module.CommonModule; -import org.anvilpowered.anvil.common.plugin.AnvilPluginInfo; -import org.anvilpowered.anvil.velocity.command.VelocityAnvilCommandNode; -import org.anvilpowered.anvil.velocity.command.regedit.VelocityRegistryEditRootCommand; - -import java.io.File; -import java.nio.file.Paths; - -public class VelocityModule extends CommonModule { - - @Override - protected void configure() { - super.configure(); - File configFilesLocation = Paths.get("plugins/" + AnvilPluginInfo.id).toFile(); - if (!configFilesLocation.exists()) { - if (!configFilesLocation.mkdirs()) { - throw new IllegalStateException("Unable to create config directory"); - } - } - bind(new TypeLiteral>() { - }).toInstance(HoconConfigurationLoader.builder().setPath(Paths.get(configFilesLocation + "/anvil.conf")).build()); - bind(new TypeLiteral>() { - }).to(VelocityAnvilCommandNode.class); - bind(new TypeLiteral>() { - }).to(VelocityRegistryEditRootCommand.class); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityKickService.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityKickService.java deleted file mode 100644 index 029ebb776..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityKickService.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.util; - -import com.google.inject.Inject; -import com.velocitypowered.api.proxy.ProxyServer; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; -import org.anvilpowered.anvil.api.util.KickService; - -import java.util.UUID; - -public class VelocityKickService implements KickService { - - @Inject - private ProxyServer proxyServer; - - private TextComponent getReason(Object reason) { - return reason instanceof TextComponent ? (TextComponent) reason : Component.text(reason.toString()); - } - - @Override - public void kick(UUID userUUID, Object reason) { - proxyServer.getPlayer(userUUID).ifPresent(p -> p.disconnect(getReason(reason))); - } - - @Override - public void kick(String userName, Object reason) { - proxyServer.getPlayer(userName).ifPresent(p -> p.disconnect(getReason(reason))); - } - - @Override - public void kick(UUID userUUID) { - kick(userUUID, "You have been kicked"); - } - - @Override - public void kick(String userName) { - kick(userName, "You have been kicked"); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityPermissionService.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityPermissionService.java deleted file mode 100644 index 3983b7173..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityPermissionService.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.util; - -import com.velocitypowered.api.permission.PermissionSubject; -import org.anvilpowered.anvil.api.util.PermissionService; -import org.checkerframework.checker.nullness.qual.Nullable; - -public class VelocityPermissionService implements PermissionService { - - @Override - public boolean hasPermission(@Nullable Object subject, String permission) { - return subject instanceof PermissionSubject - && ((PermissionSubject) subject).hasPermission(permission); - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityTextService.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityTextService.java deleted file mode 100644 index eed98b4f4..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityTextService.java +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.util; - -import com.google.inject.Inject; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.proxy.ProxyServer; -import net.kyori.adventure.identity.Identified; -import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.event.ClickEvent; -import net.kyori.adventure.text.event.HoverEvent; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextColor; -import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer; -import org.anvilpowered.anvil.common.util.CommonTextService; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.slf4j.Logger; - -import java.net.URL; -import java.util.Deque; -import java.util.LinkedList; -import java.util.UUID; - -public class VelocityTextService extends CommonTextService { - - @Inject - private Logger logger; - - @Inject - protected ProxyServer proxyServer; - - @Override - public Builder builder() { - return new VelocityTextBuilder(); - } - - @Override - public void send(TextComponent text, CommandSource receiver) { - receiver.sendMessage(Identity.nil(), text); - } - - @Override - public void send(TextComponent text, CommandSource receiver, UUID sourceUUID) { - receiver.sendMessage(Identity.identity(sourceUUID), text); - } - - @Override - public void send(TextComponent text, CommandSource receiver, Object source) { - if (source instanceof Identified) { - receiver.sendMessage((Identified) source, text); - } else { - send(text, receiver); - } - } - - @Override - public CommandSource getConsole() { - return proxyServer.getConsoleCommandSource(); - } - - @Override - public TextComponent deserialize(String text) { - return LegacyComponentSerializer.legacyAmpersand().deserialize(text); - } - - @Override - public String serialize(TextComponent text) { - return LegacyComponentSerializer.legacyAmpersand().serialize(text); - } - - @Override - public String serializePlain(TextComponent text) { - return PlainComponentSerializer.plain().serialize(text.asComponent()); - } - - protected class VelocityTextBuilder extends CommonTextBuilder { - - private final Deque elements; - @Nullable - private HoverEvent hoverEvent; - @Nullable - private ClickEvent clickEvent; - - protected VelocityTextBuilder() { - elements = new LinkedList<>(); - } - - @Override - public Builder aqua() { - elements.add(NamedTextColor.AQUA); - return this; - } - - @Override - public Builder black() { - elements.add(NamedTextColor.BLACK); - return this; - } - - @Override - public Builder blue() { - elements.add(NamedTextColor.BLUE); - return this; - } - - @Override - public Builder dark_aqua() { - elements.add(NamedTextColor.DARK_AQUA); - return this; - } - - @Override - public Builder dark_blue() { - elements.add(NamedTextColor.DARK_BLUE); - return this; - } - - @Override - public Builder dark_gray() { - elements.add(NamedTextColor.DARK_GRAY); - return this; - } - - @Override - public Builder dark_green() { - elements.add(NamedTextColor.DARK_GREEN); - return this; - } - - @Override - public Builder dark_purple() { - elements.add(NamedTextColor.DARK_PURPLE); - return this; - } - - @Override - public Builder dark_red() { - elements.add(NamedTextColor.DARK_RED); - return this; - } - - @Override - public Builder gold() { - elements.add(NamedTextColor.GOLD); - return this; - } - - @Override - public Builder gray() { - elements.add(NamedTextColor.GRAY); - return this; - } - - @Override - public Builder green() { - elements.add(NamedTextColor.GREEN); - return this; - } - - @Override - public Builder light_purple() { - elements.add(NamedTextColor.LIGHT_PURPLE); - return this; - } - - @Override - public Builder red() { - elements.add(NamedTextColor.RED); - return this; - } - - @Override - public Builder reset() { - elements.add(NamedTextColor.WHITE); - return this; - } - - @Override - public Builder white() { - elements.add(NamedTextColor.WHITE); - return this; - } - - @Override - public Builder yellow() { - elements.add(NamedTextColor.YELLOW); - return this; - } - - @Override - public Builder bold() { - elements.add(TextDecoration.BOLD); - return this; - } - - @Override - public Builder italic() { - elements.add(TextDecoration.ITALIC); - return this; - } - - @Override - public Builder obfuscated() { - elements.add(TextDecoration.OBFUSCATED); - return this; - } - - @Override - public Builder strikethrough() { - elements.add(TextDecoration.STRIKETHROUGH); - return this; - } - - @Override - public Builder underlined() { - elements.add(TextDecoration.UNDERLINED); - return this; - } - - @Override - public Builder append(Object... contents) { - for (Object o : contents) { - if (o instanceof Builder || o instanceof Component || o instanceof TextColor) { - elements.add(o); - } else { - elements.add(Component.text(String.valueOf(o))); - } - } - return this; - } - - @Override - public Builder appendJoining( - Object delimiter, Object... contents) { - if (!(delimiter instanceof Builder || delimiter instanceof Component)) { - delimiter = Component.text(delimiter.toString()); - } - final int indexOfLast = contents.length - 1; - for (int i = 0; i <= indexOfLast; i++) { - Object o = contents[i]; - if (o instanceof Builder || o instanceof Component || o instanceof TextColor) { - elements.add(o); - } else { - elements.add(Component.text(String.valueOf(o))); - } - if (i != indexOfLast) { - elements.add(delimiter); - } - } - return this; - } - - @Override - public Builder onHoverShowText(TextComponent text) { - hoverEvent = HoverEvent.showText(text); - return this; - } - - @Override - public Builder onClickSuggestCommand(String command) { - callback = null; - clickEvent = ClickEvent.suggestCommand(command); - return this; - } - - @Override - public Builder onClickRunCommand(String command) { - callback = null; - clickEvent = ClickEvent.runCommand(command); - return this; - } - - @Override - public Builder onClickOpenUrl(URL url) { - return onClickOpenUrl(url.toString()); - } - - @Override - public Builder onClickOpenUrl(String url) { - callback = null; - clickEvent = ClickEvent.openUrl(url); - return this; - } - - @Override - @SuppressWarnings("unchecked") - public TextComponent build() { - boolean hover = hoverEvent != null; - if (callback != null) { - initializeCallback(); - } - boolean click = clickEvent != null; - - if (elements.isEmpty()) { - return Component.empty(); - } else if (elements.size() == 1 && !hover && !click) { - Object o = elements.getFirst(); - if (o instanceof Builder) { - return ((Builder) o).build(); - } else if (o instanceof TextComponent) { - return (TextComponent) o; - } - } - - // one builder for every color - final Deque components = new LinkedList<>(); - - // create first builder - TextComponent.Builder currentBuilder = Component.text(); - Object firstColor = elements.peekFirst(); - if (firstColor instanceof TextColor) { - currentBuilder.color((TextColor) firstColor); - elements.pollFirst(); // remove color because its already added to builder - } - - for (Object o : elements) { - if (o instanceof Builder) { - currentBuilder.append(((Builder) o).build()); - } else if (o instanceof Component) { - currentBuilder.append((Component) o); - } else if (o instanceof TextColor) { - // build current builder - components.offer(currentBuilder.build()); - // create new builder starting at this point until the next color - currentBuilder = Component.text().color((TextColor) o); - } else { - logger.error("Skipping {} because it does not match any of the correct types.", o); - } - } - - // build last builder - components.offer(currentBuilder.build()); - - // create new builder with all previous components - currentBuilder = Component.text().append(components); - - if (hover) { - currentBuilder.hoverEvent(hoverEvent); - } - if (click) { - currentBuilder.clickEvent(clickEvent); - } - return currentBuilder.build(); - } - } -} diff --git a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityUserService.java b/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityUserService.java deleted file mode 100644 index 75a3af514..000000000 --- a/anvil-velocity/src/main/java/org/anvilpowered/anvil/velocity/util/VelocityUserService.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.util; - -import com.google.inject.Inject; -import com.velocitypowered.api.proxy.Player; -import com.velocitypowered.api.proxy.ProxyServer; -import org.anvilpowered.anvil.common.util.CommonUserService; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; - -public class VelocityUserService extends CommonUserService { - - @Inject - private ProxyServer proxyServer; - - @Inject - public VelocityUserService() { - super(Player.class); - } - - @Override - public Optional get(String userName) { - return proxyServer.getPlayer(userName); - } - - @Override - public Optional get(UUID userUUID) { - return proxyServer.getPlayer(userUUID); - } - - @Override - public Optional getPlayer(String userName) { - return get(userName); - } - - @Override - public Optional getPlayer(UUID userUUID) { - return get(userUUID); - } - - @Override - public Optional getPlayer(Player player) { - return Optional.of(player); - } - - @Override - public List matchPlayerNames(String startsWith) { - String startsWithLowerCase = startsWith.toLowerCase(); - return getOnlinePlayers().stream() - .map(Player::getUsername) - .filter(name -> name.toLowerCase().startsWith(startsWithLowerCase)) - .collect(Collectors.toList()); - } - - @Override - public Collection getOnlinePlayers() { - return proxyServer.getAllPlayers(); - } - - @Override - public CompletableFuture> getUUID(String userName) { - Optional userUUID = getPlayer(userName).map(Player::getUniqueId); - if (userUUID.isPresent()) { - return CompletableFuture.completedFuture(userUUID); - } - return super.getUUID(userName); - } - - @Override - public CompletableFuture> getUserName(UUID userUUID) { - Optional userName = getPlayer(userUUID).map(Player::getUsername); - if (userName.isPresent()) { - return CompletableFuture.completedFuture(userName); - } - return super.getUserName(userUUID); - } - - @Override - public UUID getUUID(Player player) { - return player.getUniqueId(); - } - - @Override - public String getUserName(Player player) { - return player.getUsername(); - } -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCancelCommand.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCancelCommand.kt deleted file mode 100644 index faf84b5c1..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCancelCommand.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.velocity.command.regedit - -import com.velocitypowered.api.command.CommandSource -import com.velocitypowered.api.command.SimpleCommand -import com.velocitypowered.api.proxy.Player -import net.kyori.adventure.text.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCancelCommand - -class VelocityRegistryEditCancelCommand - : CommonRegistryEditCancelCommand(), SimpleCommand { - override fun execute(invocation: SimpleCommand.Invocation) { - super.execute(invocation.source(), invocation.arguments()) - } -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCommandNode.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCommandNode.kt deleted file mode 100644 index 8c707cec4..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCommandNode.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.velocity.command.regedit - -import com.google.inject.Inject -import com.google.inject.Singleton -import com.velocitypowered.api.command.Command -import com.velocitypowered.api.command.CommandSource -import com.velocitypowered.api.command.SimpleCommand -import org.anvilpowered.anvil.api.registry.Registry -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommandNode -import java.util.HashMap - -@Singleton -class VelocityRegistryEditCommandNode @Inject constructor( - registry: Registry, -) : CommonRegistryEditCommandNode(registry) { - - @Inject - private lateinit var registryEditCancelCommand: VelocityRegistryEditCancelCommand - - @Inject - private lateinit var registryEditCommitCommand: VelocityRegistryEditCommitCommand - - @Inject - private lateinit var registryEditKeyCommand: VelocityRegistryEditKeyCommand - - @Inject - private lateinit var registryEditSelectCommand: VelocityRegistryEditSelectCommand - - @Inject - private lateinit var registryEditStartCommand: VelocityRegistryEditStartCommand - - val subCommands: MutableMap, SimpleCommand> = HashMap() - - override fun loadCommands() { - subCommands[CANCEL_ALIAS] = registryEditCancelCommand - subCommands[COMMIT_ALIAS] = registryEditCommitCommand - subCommands[KEY_ALIAS] = registryEditKeyCommand - subCommands[SELECT_ALIAS] = registryEditSelectCommand - subCommands[START_ALIAS] = registryEditStartCommand - subCommands[HELP_ALIAS] = commandService.generateHelpCommand(this) - } -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCommitCommand.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCommitCommand.kt deleted file mode 100644 index 2da7752b5..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditCommitCommand.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.velocity.command.regedit - -import com.velocitypowered.api.command.CommandSource -import com.velocitypowered.api.command.SimpleCommand -import com.velocitypowered.api.proxy.Player -import net.kyori.adventure.text.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditCommitCommand - -class VelocityRegistryEditCommitCommand - : CommonRegistryEditCommitCommand(), SimpleCommand { - override fun execute(invocation: SimpleCommand.Invocation) { - super.execute(invocation.source(), invocation.arguments()) - } -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditKeyCommand.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditKeyCommand.kt deleted file mode 100644 index 548e618d4..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditKeyCommand.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.velocity.command.regedit - -import com.velocitypowered.api.command.CommandSource -import com.velocitypowered.api.command.SimpleCommand -import com.velocitypowered.api.proxy.Player -import net.kyori.adventure.text.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditKeyCommand - -class VelocityRegistryEditKeyCommand - : CommonRegistryEditKeyCommand(), SimpleCommand { - override fun execute(invocation: SimpleCommand.Invocation) = - super.execute(invocation.source(), invocation.arguments()) - - override fun suggest(invocation: SimpleCommand.Invocation): List = - super.suggest(invocation.source(), invocation.arguments()) -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditRootCommand.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditRootCommand.kt deleted file mode 100644 index c9e0b8f02..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditRootCommand.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.velocity.command.regedit - -import com.google.inject.Singleton -import com.velocitypowered.api.command.Command -import com.velocitypowered.api.command.CommandSource -import com.velocitypowered.api.command.SimpleCommand -import com.velocitypowered.api.proxy.Player -import net.kyori.adventure.text.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditRootCommand - -@Singleton -class VelocityRegistryEditRootCommand - : CommonRegistryEditRootCommand(), SimpleCommand { - override fun execute(invocation: SimpleCommand.Invocation) { - super.execute(invocation.source(), invocation.arguments()) - } -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditSelectCommand.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditSelectCommand.kt deleted file mode 100644 index 6f103034b..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditSelectCommand.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.velocity.command.regedit - -import com.velocitypowered.api.command.CommandSource -import com.velocitypowered.api.command.SimpleCommand -import com.velocitypowered.api.proxy.Player -import net.kyori.adventure.text.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditSelectCommand - -class VelocityRegistryEditSelectCommand - : CommonRegistryEditSelectCommand(), SimpleCommand { - override fun execute(invocation: SimpleCommand.Invocation) = - super.execute(invocation.source(), invocation.arguments()) - - override fun suggest(invocation: SimpleCommand.Invocation): List = - super.suggest(invocation.source(), invocation.arguments()) -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditStartCommand.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditStartCommand.kt deleted file mode 100644 index 538853aff..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/regedit/VelocityRegistryEditStartCommand.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package org.anvilpowered.anvil.velocity.command.regedit - -import com.velocitypowered.api.command.CommandSource -import com.velocitypowered.api.command.SimpleCommand -import com.velocitypowered.api.proxy.Player -import net.kyori.adventure.text.TextComponent -import org.anvilpowered.anvil.common.command.regedit.CommonRegistryEditStartCommand - -class VelocityRegistryEditStartCommand - : CommonRegistryEditStartCommand(), SimpleCommand { - override fun execute(invocation: SimpleCommand.Invocation) = - super.execute(invocation.source(), invocation.arguments()) - - override fun suggest(invocation: SimpleCommand.Invocation): List = - super.suggest(invocation.source(), invocation.arguments()) -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/module/VelocityFallbackModule.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/module/VelocityFallbackModule.kt deleted file mode 100644 index 4edcac8ca..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/module/VelocityFallbackModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.module - -import com.velocitypowered.api.command.CommandSource -import net.kyori.adventure.text.TextComponent -import org.anvilpowered.anvil.common.module.FallbackModule - -class VelocityFallbackModule : FallbackModule() diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityBackendServer.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityBackendServer.kt deleted file mode 100644 index dfc3d5bb6..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityBackendServer.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.server - -import com.velocitypowered.api.proxy.Player -import com.velocitypowered.api.proxy.server.RegisteredServer -import org.anvilpowered.anvil.api.util.UserService -import org.anvilpowered.anvil.common.server.CommonBackendServer -import java.util.Optional -import java.util.UUID -import java.util.concurrent.CompletableFuture -import kotlin.streams.toList - -class VelocityBackendServer( - private val server: RegisteredServer, - userService: UserService, -) : CommonBackendServer(userService) { - override fun getName(): String = server.serverInfo.name - override fun getVersion(): CompletableFuture { - return server.ping().thenApply { VelocityVersion(it.version) } - } - override fun Optional.connect(): CompletableFuture { - return map { it.createConnectionRequest(server).connect().thenApply { c -> c.isSuccessful } } - .orElse(CompletableFuture.completedFuture(false)) - } - - override fun connect(player: Any?): CompletableFuture = Optional.ofNullable(player as? Player).connect() - override fun getPlayerUUIDs(): List = server.playersConnected.stream().map { it.uniqueId }.toList() -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityLocationService.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityLocationService.kt deleted file mode 100644 index 37c7accf8..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityLocationService.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.server - -import com.google.inject.Inject -import com.velocitypowered.api.proxy.Player -import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.api.util.UserService -import org.anvilpowered.anvil.common.server.CommonLocationService -import java.util.Optional -import java.util.UUID -import kotlin.streams.toList - -class VelocityLocationService : CommonLocationService() { - - @Inject - private lateinit var proxyServer: ProxyServer - - @Inject - private lateinit var userService: UserService - - private fun Optional.getServer(): Optional { - return flatMap { it.currentServer }.map { VelocityBackendServer(it.server, userService) } - } - - override fun getServer(userUUID: UUID): Optional = userService.getPlayer(userUUID).getServer() - override fun getServer(userName: String): Optional = userService.getPlayer(userName).getServer() - override fun getServerForName(serverName: String): Optional { - return proxyServer.getServer(serverName).map { VelocityBackendServer(it, userService) } - } - - override fun getServers(): List { - return proxyServer.allServers.stream().map { VelocityBackendServer(it, userService) }.toList() - } -} diff --git a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityVersion.kt b/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityVersion.kt deleted file mode 100644 index 6d33d1f32..000000000 --- a/anvil-velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/server/VelocityVersion.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Anvil - AnvilPowered - * Copyright (C) 2020-2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity.server - -import com.velocitypowered.api.proxy.server.ServerPing -import org.anvilpowered.anvil.api.server.Version - -class VelocityVersion( - val version: ServerPing.Version -) : Version { - override fun getName(): String = version.name - override fun getProtocol(): Int = version.protocol -} diff --git a/api/build.gradle.kts b/api/build.gradle.kts deleted file mode 100644 index c2fce59a5..000000000 --- a/api/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -@Suppress("DSL_SCOPE_VIOLATION") -plugins { - `java-library` - alias(libs.plugins.kotlin.jvm) -} - -val apiVersion: String by rootProject -version = apiVersion - -dependencies { - api(libs.coroutines) - api(libs.bson) - api(libs.configurate.core) - api(libs.flow.math) - api(libs.guice) - api(libs.jetbrains.annotations) - api(libs.mongo.driver.sync) - api(libs.morphia) - api(libs.reflections) - api(libs.xodus.entity.store) -} - -java { - withSourcesJar() - withJavadocJar() -} diff --git a/build.gradle.kts b/build.gradle.kts index ae2ee5a9b..1b5b4f365 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,6 @@ plugins { } val projectVersion = file("version").readLines().first() -project.extra["apiVersion"] = projectVersion.replace(".[0-9]+(?=($|-SNAPSHOT))".toRegex(), "") allprojects { group = "org.anvilpowered" @@ -27,24 +26,3 @@ allprojects { } } } - -// include legacy java code during migration to kotlin -subprojects { - apply(plugin = "java") - apply(plugin = "org.jetbrains.kotlin.jvm") - val legacyName = when (this@subprojects.name) { - "anvil-core" -> "anvil-common" - "anvil-paper" -> "anvil-spigot" - else -> this@subprojects.name - } - java { - sourceSets.main.configure { - java.srcDir("../$legacyName/src/main/java") - } - } - kotlin { - sourceSets.main.configure { - kotlin.srcDir("../$legacyName/src/main/kotlin") - } - } -} diff --git a/core/build.gradle.kts b/core/build.gradle.kts deleted file mode 100644 index 57439e3f1..000000000 --- a/core/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -@Suppress("DSL_SCOPE_VIOLATION") -plugins { - alias(libs.plugins.kotlin.jvm) -} - -dependencies { - api(project(":anvil-api")) - api(libs.kotlin.reflect) - api(libs.configurate.hocon) - implementation(libs.reflections) -} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/ModuleExtensions.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/ModuleExtensions.kt deleted file mode 100644 index 8a5ad845c..000000000 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/ModuleExtensions.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.anvilpowered.anvil.core - -import com.google.inject.Binder -import com.google.inject.binder.AnnotatedBindingBuilder -import com.google.inject.binder.LinkedBindingBuilder -import com.google.inject.binder.ScopedBindingBuilder - -inline fun Binder.bind(): AnnotatedBindingBuilder = bind(T::class.java) - -inline fun LinkedBindingBuilder.to(): ScopedBindingBuilder = to(T::class.java) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f9f7668d0..294847bff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,37 +1,13 @@ [versions] -configurate = "3.7.2" -kotlin = "1.7.0" -blossom = "1.3.0" -mongo = "3.12.11" +kotlin = "1.8.0" [libraries] -aopalliance = "aopalliance:aopalliance:1.0" -apache-commons = "org.apache.commons:commons-pool2:2.11.1" -bson = { module = "org.mongodb:bson", version.ref = "mongo" } -bungee = "net.md-5:bungeecord-api:1.15-SNAPSHOT" -configurate-core = { module = "org.spongepowered:configurate-core", version.ref = "configurate" } -configurate-hocon = { module = "org.spongepowered:configurate-hocon", version.ref = "configurate" } coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2" -flow-math = "com.flowpowered:flow-math:1.0.3" -guava = "com.google.guava:guava:28.1-jre" -guice = "com.google.inject:guice:4.1.0" -javasisst = "org.javassist:javassist:3.26.0-GA" -javax = "javax.inject:javax.inject:1" -jetbrains_annotations = "org.jetbrains:annotations:23.0.0" +jetbrains_annotations = "org.jetbrains:annotations:24.0.0" kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } kotlin-stdlib8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } -mongo-java-driver = { module = "org.mongodb:mongodb-java-driver", version.ref = "mongo" } -mongo-driver-sync = { module = "org.mongodb:mongodb-driver-sync", version.ref = "mongo" } -morphia = "dev.morphia.morphia:core:1.6.1" -microutils_logging = "io.github.microutils:kotlin-logging:1.5.4" -paper = "io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT" -reflections = "org.reflections:reflections:0.9.10" -serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3" -sponge = "org.spongepowered:spongeapi:7.4.0" -typesafe_config = "com.typesafe:config:1.4.0" -velocity = "com.velocitypowered:velocity-api:3.1.1" -xodus-entity-store = "org.jetbrains.xodus:xodus-entity-store:2.0.1" +serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" [plugins] kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } diff --git a/paper/build.gradle.kts b/paper/build.gradle.kts deleted file mode 100644 index 2bfb25080..000000000 --- a/paper/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ -@Suppress("DSL_SCOPE_VIOLATION") -plugins { - alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.shadow) -} - -dependencies { - implementation(project(":anvil-md5")) - compileOnly(libs.paper) -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 91c7c9739..b47490f5e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,14 +10,8 @@ dependencyResolutionManagement { rootProject.name = "anvil" -include("anvil-md5") - sequenceOf( - "api", - "core", - "paper", - "sponge", - "velocity" + "domain", ).forEach { val project = ":anvil-$it" include(project) diff --git a/sponge/build.gradle.kts b/sponge/build.gradle.kts deleted file mode 100644 index dccb88603..000000000 --- a/sponge/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ -@Suppress("DSL_SCOPE_VIOLATION") -plugins { - alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.shadow) -} - -dependencies { - implementation(project(":anvil-core")) - compileOnly(libs.sponge) -} diff --git a/velocity/build.gradle.kts b/velocity/build.gradle.kts deleted file mode 100644 index 409f6644d..000000000 --- a/velocity/build.gradle.kts +++ /dev/null @@ -1,14 +0,0 @@ -@Suppress("DSL_SCOPE_VIOLATION") -plugins { - alias(libs.plugins.kotlin.jvm) - id("org.jetbrains.kotlin.kapt") - alias(libs.plugins.shadow) -} - -val velocityVersion: String by project - -dependencies { - implementation(project(":anvil-core")) - compileOnly(libs.velocity) - kapt(libs.velocity) -} From cd295041739cd2cf69413ed747576d228fbabd33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 21 Jan 2023 19:58:30 +0100 Subject: [PATCH 02/77] Start new structure --- agent/build.gradle.kts | 3 +++ agent/sponge/build.gradle.kts | 3 +++ agent/velocity/build.gradle.kts | 3 +++ build-logic/build.gradle.kts | 7 +++++++ build-logic/settings.gradle.kts | 15 +++++++++++++ .../kotlin-js.base-conventions.gradle.kts | 9 ++++++++ .../kotlin-jvm.base-conventions.gradle.kts | 17 +++++++++++++++ build.gradle.kts | 7 +++++-- domain/build.gradle.kts | 4 ++++ .../kotlin/org/sourcegrade/anvil/user/User.kt | 8 +++++++ gradle/libs.versions.toml | 3 ++- server/build.gradle.kts | 3 +++ server/impl/build.gradle.kts | 3 +++ settings.gradle.kts | 21 +++++++++++++++---- ui/build.gradle.kts | 3 +++ 15 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 agent/build.gradle.kts create mode 100644 agent/sponge/build.gradle.kts create mode 100644 agent/velocity/build.gradle.kts create mode 100644 build-logic/build.gradle.kts create mode 100644 build-logic/settings.gradle.kts create mode 100644 build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts create mode 100644 build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts create mode 100644 domain/build.gradle.kts create mode 100644 domain/src/commonMain/kotlin/org/sourcegrade/anvil/user/User.kt create mode 100644 server/build.gradle.kts create mode 100644 server/impl/build.gradle.kts create mode 100644 ui/build.gradle.kts diff --git a/agent/build.gradle.kts b/agent/build.gradle.kts new file mode 100644 index 000000000..3614e4182 --- /dev/null +++ b/agent/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("kotlin-jvm.base-conventions") +} diff --git a/agent/sponge/build.gradle.kts b/agent/sponge/build.gradle.kts new file mode 100644 index 000000000..3614e4182 --- /dev/null +++ b/agent/sponge/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("kotlin-jvm.base-conventions") +} diff --git a/agent/velocity/build.gradle.kts b/agent/velocity/build.gradle.kts new file mode 100644 index 000000000..3614e4182 --- /dev/null +++ b/agent/velocity/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("kotlin-jvm.base-conventions") +} diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts new file mode 100644 index 000000000..279c3daf2 --- /dev/null +++ b/build-logic/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${libs.versions.kotlin.get()}") +} diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 000000000..1d2545453 --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,15 @@ +@file:Suppress("UnstableApiUsage") + +dependencyResolutionManagement { + repositories { + gradlePluginPortal() + mavenCentral() + } + versionCatalogs { + register("libs") { + from(files("../gradle/libs.versions.toml")) // include from parent project + } + } +} + +rootProject.name = "build-logic" diff --git a/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts b/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts new file mode 100644 index 000000000..3a3bac02e --- /dev/null +++ b/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts @@ -0,0 +1,9 @@ +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +extensions.getByName("kotlin").apply { + js(IR) { + browser { + binaries.executable() + } + } +} diff --git a/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts b/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts new file mode 100644 index 000000000..5dc11d1a0 --- /dev/null +++ b/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts @@ -0,0 +1,17 @@ +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +extensions.getByName("kotlin").apply { + jvm { + withJava() + compilations.all { + kotlinOptions { + jvmTarget = "17" + freeCompilerArgs = listOf("-Xcontext-receivers") + } + } + } +} + +dependencies { + "jvmMainImplementation"(kotlin("reflect")) +} diff --git a/build.gradle.kts b/build.gradle.kts index 1b5b4f365..cf1b0e700 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,13 +2,16 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @Suppress("DSL_SCOPE_VIOLATION") plugins { - `java-library` - alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.ktlint) + id("kotlin-jvm.base-conventions") } val projectVersion = file("version").readLines().first() allprojects { + apply(plugin = "org.jetbrains.kotlin.multiplatform") + apply(plugin = "org.jlleitschuh.gradle.ktlint") group = "org.anvilpowered" version = projectVersion project.findProperty("buildNumber") diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts new file mode 100644 index 000000000..163ce308c --- /dev/null +++ b/domain/build.gradle.kts @@ -0,0 +1,4 @@ +plugins { + id("kotlin-js.base-conventions") + id("kotlin-jvm.base-conventions") +} diff --git a/domain/src/commonMain/kotlin/org/sourcegrade/anvil/user/User.kt b/domain/src/commonMain/kotlin/org/sourcegrade/anvil/user/User.kt new file mode 100644 index 000000000..f2db8442b --- /dev/null +++ b/domain/src/commonMain/kotlin/org/sourcegrade/anvil/user/User.kt @@ -0,0 +1,8 @@ +package org.sourcegrade.anvil.user + +import java.time.OffsetDateTime + +interface User { + val name: String + val createdAt: OffsetDateTime +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 294847bff..a87098a30 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,8 @@ kotlin-stdlib8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.r serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" [plugins] -kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +ktlint = { id = "org.jlleitschuh.gradle.ktlint", version = "11.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "7.1.2" } diff --git a/server/build.gradle.kts b/server/build.gradle.kts new file mode 100644 index 000000000..3614e4182 --- /dev/null +++ b/server/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("kotlin-jvm.base-conventions") +} diff --git a/server/impl/build.gradle.kts b/server/impl/build.gradle.kts new file mode 100644 index 000000000..3614e4182 --- /dev/null +++ b/server/impl/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("kotlin-jvm.base-conventions") +} diff --git a/settings.gradle.kts b/settings.gradle.kts index b47490f5e..0dfda12df 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,19 +1,32 @@ +@file:Suppress("UnstableApiUsage") + dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { mavenCentral() - maven("https://repo.spongepowered.org/repository/maven-public/") - maven("https://papermc.io/repo/repository/maven-public/") - maven("https://libraries.minecraft.net/") + } +} + +pluginManagement { + includeBuild("build-logic") + repositories { + mavenCentral() + gradlePluginPortal() } } rootProject.name = "anvil" sequenceOf( + "agent", + "agent-sponge", + "agent-velocity", "domain", + "server", + "server-impl", + "ui", ).forEach { val project = ":anvil-$it" include(project) - project(project).projectDir = file(it) + project(project).projectDir = file(it.replace('-', '/')) } diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts new file mode 100644 index 000000000..359f50a28 --- /dev/null +++ b/ui/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("kotlin-js.base-conventions") +} From b621978e531aaaab4c53e85d2f0312177896bb48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 21 Jan 2023 23:19:24 +0100 Subject: [PATCH 03/77] More stuff, add kotlin mui frontend --- .gitignore | 1 + README.md | 9 ++- agent/sponge/build.gradle.kts | 23 ++++++ .../anvil/agent/AnvilSpongePlugin.kt | 14 ++++ .../kotlin-js.base-conventions.gradle.kts | 5 +- .../org/anvilpowered/anvil/user/User.kt | 5 ++ .../kotlin/org/sourcegrade/anvil/user/User.kt | 8 --- gradle/libs.versions.toml | 5 +- settings.gradle.kts | 3 +- ui/build.gradle.kts | 18 +++++ .../kotlin/org/anvilpowered/anvil/ui/App.kt | 70 +++++++++++++++++++ ui/src/jsMain/resources/index.html | 13 ++++ 12 files changed, 157 insertions(+), 17 deletions(-) create mode 100644 agent/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt delete mode 100644 domain/src/commonMain/kotlin/org/sourcegrade/anvil/user/User.kt create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt create mode 100644 ui/src/jsMain/resources/index.html diff --git a/.gitignore b/.gitignore index c2fe75ab6..c764c9366 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,4 @@ gradle-app.setting .git/ +yarn.lock diff --git a/README.md b/README.md index 88cef397c..1a449c550 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,12 @@ [CI](http://ci.anvilpowered.org) (Release candidate jars) -Anvil is a mineraft plugin api that aims to help developers create structured cross-platform plugins. Included is an entity framework and many services that abstract platform-specific actions so that they can be used in common code. +Anvil is a mineraft plugin api that aims to help developers create structured cross-platform plugins. +Included is an entity framework and many services that abstract platform-specific actions so that they can be used in common code. -Anvil is not only cross-platform in the context of plugin platforms, but also in the context of databases. Currently, MongoDB and Xodus are supported, with SQL on the way. With Anvil, you can write a central abstract set of logic that applies to several database types. +Anvil is not only cross-platform in the context of plugin platforms, but also in the context of databases. +Currently, MongoDB and Xodus are supported, with SQL on the way. +With Anvil, you can write a central abstract set of logic that applies to several database types. ## Quick start @@ -17,4 +20,4 @@ repositories { dependencies { implementation 'org.anvilpowered:anvil-api:0.1' } -``` \ No newline at end of file +``` diff --git a/agent/sponge/build.gradle.kts b/agent/sponge/build.gradle.kts index 3614e4182..ec0cc6899 100644 --- a/agent/sponge/build.gradle.kts +++ b/agent/sponge/build.gradle.kts @@ -1,3 +1,26 @@ +import org.spongepowered.gradle.plugin.config.PluginLoaders + +@Suppress("DSL_SCOPE_VIOLATION") // https://youtrack.jetbrains.com/issue/KTIJ-19369 plugins { id("kotlin-jvm.base-conventions") + alias(libs.plugins.sponge) + alias(libs.plugins.shadow) +} + +sponge { + apiVersion("10.0.0-SNAPSHOT") + license("AGPL-3.0") + loader { + name(PluginLoaders.JAVA_PLAIN) + version("1.0") + } + plugin("anvil-agent") { + displayName("Anvil Agent") + version.set(project.version.toString()) + entrypoint("org.anvilpowered.anvil.agent.AnvilSpongePlugin") + description("Agent plugin for the Anvil system") +// dependency("spongeapi") { +// loadOrder(LoadOrder.AFTER) +// } + } } diff --git a/agent/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt b/agent/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt new file mode 100644 index 000000000..22a4ee68f --- /dev/null +++ b/agent/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt @@ -0,0 +1,14 @@ +package org.anvilpowered.anvil.agent + +import org.spongepowered.api.event.Listener +import org.spongepowered.api.event.lifecycle.ConstructPluginEvent +import org.spongepowered.plugin.builtin.jvm.Plugin + +@Plugin("anvil-agent") +class AnvilSpongePlugin { + + @Listener + fun onServerStart(event: ConstructPluginEvent) { + println("Hello, world! ${event.plugin()}") + } +} diff --git a/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts b/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts index 3a3bac02e..78e189513 100644 --- a/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts @@ -2,8 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension extensions.getByName("kotlin").apply { js(IR) { - browser { - binaries.executable() - } + browser() + binaries.executable() } } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt new file mode 100644 index 000000000..747fd9bc0 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.user + +interface User { + val name: String +} diff --git a/domain/src/commonMain/kotlin/org/sourcegrade/anvil/user/User.kt b/domain/src/commonMain/kotlin/org/sourcegrade/anvil/user/User.kt deleted file mode 100644 index f2db8442b..000000000 --- a/domain/src/commonMain/kotlin/org/sourcegrade/anvil/user/User.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.sourcegrade.anvil.user - -import java.time.OffsetDateTime - -interface User { - val name: String - val createdAt: OffsetDateTime -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a87098a30..6d46a1117 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,5 +13,6 @@ serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } -ktlint = { id = "org.jlleitschuh.gradle.ktlint", version = "11.0.0" } -shadow = { id = "com.github.johnrengelman.shadow", version = "7.1.2" } +ktlint = "org.jlleitschuh.gradle.ktlint:11.0.0" +shadow = "com.github.johnrengelman.shadow:7.1.2" +sponge = "org.spongepowered.gradle.plugin:2.1.1" diff --git a/settings.gradle.kts b/settings.gradle.kts index 0dfda12df..068c53915 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,9 +1,10 @@ @file:Suppress("UnstableApiUsage") dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) +// repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { mavenCentral() +// maven("https://repo.spongepowered.org/repository/maven-public/") } } diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index 359f50a28..de81be0ae 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -1,3 +1,21 @@ plugins { id("kotlin-js.base-conventions") } + +fun kotlinw(target: String): String = + "org.jetbrains.kotlin-wrappers:kotlin-$target" + +dependencies { + jsMainImplementation(enforcedPlatform(kotlinw("wrappers-bom:1.0.0-pre.477"))) + + jsMainImplementation(kotlinw("react")) + jsMainImplementation(kotlinw("react-dom")) + jsMainImplementation(kotlinw("react-router-dom")) + + jsMainImplementation(kotlinw("emotion")) + jsMainImplementation(kotlinw("mui")) + jsMainImplementation(kotlinw("mui-icons")) + + jsMainImplementation(npm("date-fns", "2.29.3")) + jsMainImplementation(npm("@date-io/date-fns", "2.16.0")) +} diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt new file mode 100644 index 000000000..e05eae852 --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt @@ -0,0 +1,70 @@ +package org.anvilpowered.anvil.ui + +import csstype.Color +import csstype.number +import csstype.px +import emotion.css.css +import emotion.react.css +import js.core.jso +import mui.icons.material.Html +import mui.icons.material.Menu as MenuIcon +import mui.material.AppBar +import mui.material.AppBarPosition +import mui.material.Box +import mui.material.Button +import mui.material.ButtonColor +import mui.material.Divider +import mui.material.IconButton +import mui.material.IconButtonColor +import mui.material.IconButtonEdge +import mui.material.Size +import mui.material.Toolbar +import mui.material.Typography +import mui.material.styles.TypographyVariant +import mui.system.sx +import react.ElementType +import react.FC +import react.Props +import react.create +import react.dom.client.createRoot +import web.dom.document +import web.html.HTML.div + +fun main() { + val root = document.createElement(div) + .also { document.body.appendChild(it) } + + createRoot(root) + .render(App.create()) +} + +private val App = FC { + Box { + AppBar { + position = AppBarPosition.static + Toolbar { + IconButton { + size = Size.large + edge = IconButtonEdge.start + color = IconButtonColor.inherit + sx { + marginRight = 2.px + } + child(MenuIcon.create()) + } + Typography { + variant = TypographyVariant.h6 + component = Divider + sx { + flexGrow = number(1.0) + } + +"Anvil" + } + Button { + color = ButtonColor.inherit + +"Login" + } + } + } + } +} diff --git a/ui/src/jsMain/resources/index.html b/ui/src/jsMain/resources/index.html new file mode 100644 index 000000000..e0cd3ee40 --- /dev/null +++ b/ui/src/jsMain/resources/index.html @@ -0,0 +1,13 @@ + + + + + + + Kotlin MUI Showcase + + + + + + From 7c64b9067b129b1d402a0d54fa96e38453e8f019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 22 Jan 2023 16:07:38 +0100 Subject: [PATCH 04/77] Progress --- .../kotlin/org/anvilpowered/anvil/ui/App.kt | 66 ++++----------- .../org/anvilpowered/anvil/ui/Dashboard.kt | 53 ++++++++++++ .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 80 +++++++++++++++++++ .../org/anvilpowered/anvil/ui/Servers.kt | 31 +++++++ .../anvil/ui/component/Sidebar.kt | 21 +++++ 5 files changed, 202 insertions(+), 49 deletions(-) create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt index e05eae852..4b514db13 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt @@ -1,28 +1,10 @@ package org.anvilpowered.anvil.ui -import csstype.Color -import csstype.number -import csstype.px -import emotion.css.css -import emotion.react.css import js.core.jso -import mui.icons.material.Html -import mui.icons.material.Menu as MenuIcon -import mui.material.AppBar -import mui.material.AppBarPosition -import mui.material.Box -import mui.material.Button -import mui.material.ButtonColor -import mui.material.Divider -import mui.material.IconButton -import mui.material.IconButtonColor -import mui.material.IconButtonEdge -import mui.material.Size -import mui.material.Toolbar -import mui.material.Typography -import mui.material.styles.TypographyVariant -import mui.system.sx -import react.ElementType +import mui.material.CssBaseline +import mui.material.PaletteMode +import mui.material.styles.ThemeProvider +import mui.material.styles.createTheme import react.FC import react.Props import react.create @@ -38,33 +20,19 @@ fun main() { .render(App.create()) } -private val App = FC { - Box { - AppBar { - position = AppBarPosition.static - Toolbar { - IconButton { - size = Size.large - edge = IconButtonEdge.start - color = IconButtonColor.inherit - sx { - marginRight = 2.px - } - child(MenuIcon.create()) - } - Typography { - variant = TypographyVariant.h6 - component = Divider - sx { - flexGrow = number(1.0) - } - +"Anvil" - } - Button { - color = ButtonColor.inherit - +"Login" - } - } +private val darkTheme = createTheme( + jso { + palette = jso { + mode = PaletteMode.dark } } +) + +private val App = FC { + ThemeProvider { + theme = darkTheme + CssBaseline () + Menu() + Dashboard() + } } diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt new file mode 100644 index 000000000..55b6730a0 --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt @@ -0,0 +1,53 @@ +package org.anvilpowered.anvil.ui + +import csstype.number +import csstype.px +import mui.material.Box +import mui.material.Toolbar +import mui.material.Typography +import mui.system.sx +import react.FC +import react.Props + +val Dashboard = FC { + Box { + sx { + flexGrow = number(1.0) + padding = 3.px + marginLeft = drawerWidth.px + } + Toolbar() + Typography { + paragraph = true + +""" + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non + enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus + imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. + Convallis convallis tellus id interdum velit laoreet id donec ultrices. + Odio morbi quis commodo odio aenean sed adipiscing. Amet nisl suscipit + adipiscing bibendum est ultricies integer quis. Cursus euismod quis viverra + nibh cras. Metus vulputate eu scelerisque felis imperdiet proin fermentum + leo. Mauris commodo quis imperdiet massa tincidunt. Cras tincidunt lobortis + feugiat vivamus at augue. At augue eget arcu dictum varius duis at + consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa + sapien faucibus et molestie ac. + """.trimIndent() + +""" + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non + enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus + imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. + Convallis convallis tellus id interdum velit laoreet id donec ultrices. + Odio morbi quis commodo odio aenean sed adipiscing. Amet nisl suscipit + adipiscing bibendum est ultricies integer quis. Cursus euismod quis viverra + nibh cras. Metus vulputate eu scelerisque felis imperdiet proin fermentum + leo. Mauris commodo quis imperdiet massa tincidunt. Cras tincidunt lobortis + feugiat vivamus at augue. At augue eget arcu dictum varius duis at + consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa + sapien faucibus et molestie ac. + """.trimIndent() + + } + } +} diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt new file mode 100644 index 000000000..7b17591c7 --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt @@ -0,0 +1,80 @@ +package org.anvilpowered.anvil.ui + +import csstype.BoxSizing +import csstype.Display +import csstype.em +import csstype.minus +import csstype.pct +import csstype.px +import mui.icons.material.ViewSidebar +import mui.material.AppBar +import mui.material.AppBarPosition +import mui.material.Box +import mui.material.CssBaseline +import mui.material.Divider +import mui.material.Drawer +import mui.material.DrawerAnchor +import mui.material.DrawerVariant +import mui.material.ListItemIcon +import mui.material.ListItemText +import mui.material.MenuItem +import mui.material.MenuList +import mui.material.Toolbar +import mui.material.Typography +import mui.material.styles.TypographyVariant +import mui.system.sx +import org.anvilpowered.anvil.ui.component.SectionTypography +import react.FC +import react.Props +import mui.icons.material.Inbox as InboxIcon + +val drawerWidth = 240; + +val Menu = FC { + Box { + sx { display = Display.flex } + CssBaseline() + AppBar { + position = AppBarPosition.fixed + sx { + width = 100.pct - drawerWidth.px + marginLeft = drawerWidth.px + } + Toolbar { + Typography { + variant = TypographyVariant.h6 + noWrap = true + component = Divider + +"Anvil Dashboard" + } + } + } + Drawer { + sx { + width = drawerWidth.px + "& .MuiDrawer-paper" { + width = drawerWidth.px + boxSizing = BoxSizing.borderBox + } + } + variant = DrawerVariant.permanent + anchor = DrawerAnchor.left + Toolbar() + SectionTypography { + text = "Foobar" + } + MenuList { + sequenceOf("Foobar", "Baz", "Qux").forEach { + MenuItem { + ListItemIcon { + ViewSidebar() + } + ListItemText { + +"Hello $it" + } + } + } + } + } + } +} diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt new file mode 100644 index 000000000..c2ef5eefa --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt @@ -0,0 +1,31 @@ +package org.anvilpowered.anvil.ui + +import csstype.number +import csstype.px +import mui.material.Box +import mui.material.Toolbar +import mui.material.Typography +import mui.system.sx +import react.FC +import react.Props + +val Servers = FC { + Box { + sx { + flexGrow = number(1.0) + padding = 3.px + marginLeft = drawerWidth.px + } + Toolbar() + Typography { + paragraph = true + +""" + Servers + """.trimIndent() + +""" + More servers + """.trimIndent() + + } + } +} diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt new file mode 100644 index 000000000..48f3ee737 --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt @@ -0,0 +1,21 @@ +package org.anvilpowered.anvil.ui.component + +import csstype.em +import mui.material.Typography +import mui.material.styles.TypographyVariant +import mui.system.sx +import react.FC +import react.Props + +external interface SectionTypographyProps : Props { + var text: String +} + +val SectionTypography = FC { + Typography { + sx { paddingLeft = 1.em } + variant = TypographyVariant.overline + noWrap = true + +it.text + } +} From 52b101ae5ac5e8dc6d994d3280fb7bbe1a2e1f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 22 Jan 2023 17:46:36 +0100 Subject: [PATCH 05/77] Kinda fix routing --- ui/build.gradle.kts | 2 +- .../kotlin/org/anvilpowered/anvil/ui/App.kt | 28 +++++-- .../org/anvilpowered/anvil/ui/Dashboard.kt | 74 +++++++---------- .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 81 +++++++++---------- .../org/anvilpowered/anvil/ui/Routing.kt | 33 ++++++++ .../org/anvilpowered/anvil/ui/Servers.kt | 29 ++----- 6 files changed, 132 insertions(+), 115 deletions(-) create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index de81be0ae..cb2c8062a 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -6,7 +6,7 @@ fun kotlinw(target: String): String = "org.jetbrains.kotlin-wrappers:kotlin-$target" dependencies { - jsMainImplementation(enforcedPlatform(kotlinw("wrappers-bom:1.0.0-pre.477"))) + jsMainImplementation(enforcedPlatform(kotlinw("wrappers-bom:1.0.0-pre.480"))) jsMainImplementation(kotlinw("react")) jsMainImplementation(kotlinw("react-dom")) diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt index 4b514db13..d2aade223 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt @@ -1,14 +1,21 @@ package org.anvilpowered.anvil.ui +import csstype.em +import csstype.number +import csstype.px import js.core.jso +import mui.material.Box import mui.material.CssBaseline import mui.material.PaletteMode +import mui.material.Toolbar import mui.material.styles.ThemeProvider import mui.material.styles.createTheme +import mui.system.sx import react.FC import react.Props import react.create import react.dom.client.createRoot +import react.router.dom.HashRouter import web.dom.document import web.html.HTML.div @@ -29,10 +36,21 @@ private val darkTheme = createTheme( ) private val App = FC { - ThemeProvider { - theme = darkTheme - CssBaseline () - Menu() - Dashboard() + // TODO: Convert to BrowserRouter and figure out how to fix webpack for SPA + HashRouter { + ThemeProvider { + theme = darkTheme + CssBaseline() + Menu() + Box { + sx { + flexGrow = number(1.0) + padding = 2.em + marginLeft = drawerWidth.px + } + Toolbar() + Routing() + } + } } } diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt index 55b6730a0..f89f90e32 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt @@ -1,53 +1,39 @@ package org.anvilpowered.anvil.ui -import csstype.number -import csstype.px -import mui.material.Box -import mui.material.Toolbar import mui.material.Typography -import mui.system.sx import react.FC import react.Props val Dashboard = FC { - Box { - sx { - flexGrow = number(1.0) - padding = 3.px - marginLeft = drawerWidth.px - } - Toolbar() - Typography { - paragraph = true - +""" - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod - tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non - enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus - imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. - Convallis convallis tellus id interdum velit laoreet id donec ultrices. - Odio morbi quis commodo odio aenean sed adipiscing. Amet nisl suscipit - adipiscing bibendum est ultricies integer quis. Cursus euismod quis viverra - nibh cras. Metus vulputate eu scelerisque felis imperdiet proin fermentum - leo. Mauris commodo quis imperdiet massa tincidunt. Cras tincidunt lobortis - feugiat vivamus at augue. At augue eget arcu dictum varius duis at - consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa - sapien faucibus et molestie ac. - """.trimIndent() - +""" - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod - tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non - enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus - imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. - Convallis convallis tellus id interdum velit laoreet id donec ultrices. - Odio morbi quis commodo odio aenean sed adipiscing. Amet nisl suscipit - adipiscing bibendum est ultricies integer quis. Cursus euismod quis viverra - nibh cras. Metus vulputate eu scelerisque felis imperdiet proin fermentum - leo. Mauris commodo quis imperdiet massa tincidunt. Cras tincidunt lobortis - feugiat vivamus at augue. At augue eget arcu dictum varius duis at - consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa - sapien faucibus et molestie ac. - """.trimIndent() - - } + Typography { + paragraph = true + +""" + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non + enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus + imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. + Convallis convallis tellus id interdum velit laoreet id donec ultrices. + Odio morbi quis commodo odio aenean sed adipiscing. Amet nisl suscipit + adipiscing bibendum est ultricies integer quis. Cursus euismod quis viverra + nibh cras. Metus vulputate eu scelerisque felis imperdiet proin fermentum + leo. Mauris commodo quis imperdiet massa tincidunt. Cras tincidunt lobortis + feugiat vivamus at augue. At augue eget arcu dictum varius duis at + consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa + sapien faucibus et molestie ac. + """.trimIndent() + +""" + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non + enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus + imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. + Convallis convallis tellus id interdum velit laoreet id donec ultrices. + Odio morbi quis commodo odio aenean sed adipiscing. Amet nisl suscipit + adipiscing bibendum est ultricies integer quis. Cursus euismod quis viverra + nibh cras. Metus vulputate eu scelerisque felis imperdiet proin fermentum + leo. Mauris commodo quis imperdiet massa tincidunt. Cras tincidunt lobortis + feugiat vivamus at augue. At augue eget arcu dictum varius duis at + consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa + sapien faucibus et molestie ac. + """.trimIndent() } } diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt index 7b17591c7..2db231904 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt @@ -1,17 +1,11 @@ package org.anvilpowered.anvil.ui import csstype.BoxSizing -import csstype.Display -import csstype.em import csstype.minus import csstype.pct import csstype.px import mui.icons.material.ViewSidebar import mui.material.AppBar -import mui.material.AppBarPosition -import mui.material.Box -import mui.material.CssBaseline -import mui.material.Divider import mui.material.Drawer import mui.material.DrawerAnchor import mui.material.DrawerVariant @@ -26,52 +20,51 @@ import mui.system.sx import org.anvilpowered.anvil.ui.component.SectionTypography import react.FC import react.Props -import mui.icons.material.Inbox as InboxIcon +import react.router.dom.NavLink +import react.router.useNavigate +import web.navigator.navigator val drawerWidth = 240; val Menu = FC { - Box { - sx { display = Display.flex } - CssBaseline() - AppBar { - position = AppBarPosition.fixed - sx { - width = 100.pct - drawerWidth.px - marginLeft = drawerWidth.px - } - Toolbar { - Typography { - variant = TypographyVariant.h6 - noWrap = true - component = Divider - +"Anvil Dashboard" - } + + val nav = useNavigate() + + AppBar { + sx { + width = 100.pct - drawerWidth.px + marginLeft = drawerWidth.px + } + Toolbar { + Typography { + variant = TypographyVariant.h6 + +"Anvil Dashboard" } } - Drawer { - sx { + } + Drawer { + sx { + width = drawerWidth.px + "& .MuiDrawer-paper" { width = drawerWidth.px - "& .MuiDrawer-paper" { - width = drawerWidth.px - boxSizing = BoxSizing.borderBox - } - } - variant = DrawerVariant.permanent - anchor = DrawerAnchor.left - Toolbar() - SectionTypography { - text = "Foobar" + boxSizing = BoxSizing.borderBox } - MenuList { - sequenceOf("Foobar", "Baz", "Qux").forEach { - MenuItem { - ListItemIcon { - ViewSidebar() - } - ListItemText { - +"Hello $it" - } + } + variant = DrawerVariant.permanent + anchor = DrawerAnchor.left + Toolbar() + SectionTypography { + text = "Foobar" + } + MenuList { + sequenceOf("dashboard", "servers").forEach { name -> + MenuItem { + onClick = { nav("/$name") } + ListItemIcon { + ViewSidebar() + } + ListItemText { + +name.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } } } } diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt new file mode 100644 index 000000000..a09badfea --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt @@ -0,0 +1,33 @@ +package org.anvilpowered.anvil.ui + +import mui.material.Typography +import react.FC +import react.Props +import react.create +import react.router.Navigate +import react.router.Route +import react.router.Routes + +val Routing = FC { + + Routes { + Route { + path = "/dashboard" + element = Dashboard.create() + } + Route { + path = "/servers" + element = Servers.create() + } + Route { + path = "/" + element = Navigate.create { + to = "/dashboard" + } + } + Route { + path = "*" + element = Typography.create { +"404 page not found" } + } + } +} diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt index c2ef5eefa..3f3526a05 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt @@ -1,31 +1,18 @@ package org.anvilpowered.anvil.ui -import csstype.number -import csstype.px -import mui.material.Box -import mui.material.Toolbar import mui.material.Typography -import mui.system.sx import react.FC import react.Props val Servers = FC { - Box { - sx { - flexGrow = number(1.0) - padding = 3.px - marginLeft = drawerWidth.px - } - Toolbar() - Typography { - paragraph = true - +""" - Servers - """.trimIndent() - +""" - More servers - """.trimIndent() + Typography { + paragraph = true + +""" + Servers + """.trimIndent() + +""" + More servers + """.trimIndent() - } } } From 4b0e71d20f6fa1d764f8950785cba634d271e69d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 22 Jan 2023 18:27:04 +0100 Subject: [PATCH 06/77] Reorganize --- .../org/anvilpowered/anvil/user/Server.kt | 7 +++++ ui/build.gradle.kts | 1 + .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 27 +++++++++---------- .../org/anvilpowered/anvil/ui/Routing.kt | 3 ++- .../org/anvilpowered/anvil/ui/Servers.kt | 18 ------------- .../anvil/ui/{ => page}/Dashboard.kt | 2 +- .../org/anvilpowered/anvil/ui/page/Servers.kt | 25 +++++++++++++++++ 7 files changed, 49 insertions(+), 34 deletions(-) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Server.kt delete mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt rename ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/{ => page}/Dashboard.kt (98%) create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Server.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Server.kt new file mode 100644 index 000000000..502cfd2a6 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Server.kt @@ -0,0 +1,7 @@ +package org.anvilpowered.anvil.user + +interface Server { + val id: String + val playerCount: Int + val maxPlayerCount: Int +} diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index cb2c8062a..c63d8fb19 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -6,6 +6,7 @@ fun kotlinw(target: String): String = "org.jetbrains.kotlin-wrappers:kotlin-$target" dependencies { + commonMainImplementation(project(":anvil-domain")) jsMainImplementation(enforcedPlatform(kotlinw("wrappers-bom:1.0.0-pre.480"))) jsMainImplementation(kotlinw("react")) diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt index 2db231904..3f775ba1d 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt @@ -4,7 +4,8 @@ import csstype.BoxSizing import csstype.minus import csstype.pct import csstype.px -import mui.icons.material.ViewSidebar +import mui.icons.material.Dashboard as DashboardIcon +import mui.icons.material.Storage as StorageIcon import mui.material.AppBar import mui.material.Drawer import mui.material.DrawerAnchor @@ -20,9 +21,8 @@ import mui.system.sx import org.anvilpowered.anvil.ui.component.SectionTypography import react.FC import react.Props -import react.router.dom.NavLink +import react.ReactNode import react.router.useNavigate -import web.navigator.navigator val drawerWidth = 240; @@ -54,19 +54,18 @@ val Menu = FC { anchor = DrawerAnchor.left Toolbar() SectionTypography { - text = "Foobar" + text = "Home" } MenuList { - sequenceOf("dashboard", "servers").forEach { name -> - MenuItem { - onClick = { nav("/$name") } - ListItemIcon { - ViewSidebar() - } - ListItemText { - +name.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } - } - } + MenuItem { + onClick = { nav("/dashboard") } + ListItemIcon { DashboardIcon() } + ListItemText { primary = ReactNode("Dashboard") } + } + MenuItem { + onClick = { nav("/servers") } + ListItemIcon { StorageIcon() } + ListItemText { primary = ReactNode("Servers") } } } } diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt index a09badfea..bbda724ca 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt @@ -1,6 +1,8 @@ package org.anvilpowered.anvil.ui import mui.material.Typography +import org.anvilpowered.anvil.ui.page.Dashboard +import org.anvilpowered.anvil.ui.page.Servers import react.FC import react.Props import react.create @@ -9,7 +11,6 @@ import react.router.Route import react.router.Routes val Routing = FC { - Routes { Route { path = "/dashboard" diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt deleted file mode 100644 index 3f3526a05..000000000 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Servers.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.anvilpowered.anvil.ui - -import mui.material.Typography -import react.FC -import react.Props - -val Servers = FC { - Typography { - paragraph = true - +""" - Servers - """.trimIndent() - +""" - More servers - """.trimIndent() - - } -} diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Dashboard.kt similarity index 98% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt rename to ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Dashboard.kt index f89f90e32..6f3d5fefa 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Dashboard.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Dashboard.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.ui +package org.anvilpowered.anvil.ui.page import mui.material.Typography import react.FC diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt new file mode 100644 index 000000000..41abceef1 --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt @@ -0,0 +1,25 @@ +package org.anvilpowered.anvil.ui.page + +import mui.material.Grid +import mui.material.Typography +import org.anvilpowered.anvil.user.Server +import react.FC +import react.Props + +private data class ServerImpl( + override val id: String, + override val playerCount: Int, + override val maxPlayerCount: Int +) : Server + +val demoData = listOf( + ServerImpl("Spawn", 5, 150), + ServerImpl("Wild 1", 17, 100), + ServerImpl("Wild 2", 23, 100), + ServerImpl("Wild 3", 39, 100), + ServerImpl("Wild 4", 24, 100), +) + +val Servers = FC { + Grid +} From afdbf9a65a7a8943444df1d0e800d45f794b1aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Mon, 23 Jan 2023 22:07:41 +0100 Subject: [PATCH 07/77] Add sample data to server page --- .../kotlin/org/anvilpowered/anvil/ui/App.kt | 1 - .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 1 + .../org/anvilpowered/anvil/ui/page/Servers.kt | 31 +++++++++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt index d2aade223..fa56a5fb6 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt @@ -45,7 +45,6 @@ private val App = FC { Box { sx { flexGrow = number(1.0) - padding = 2.em marginLeft = drawerWidth.px } Toolbar() diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt index 3f775ba1d..515961b14 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt @@ -14,6 +14,7 @@ import mui.material.ListItemIcon import mui.material.ListItemText import mui.material.MenuItem import mui.material.MenuList +import mui.material.MuiDrawer import mui.material.Toolbar import mui.material.Typography import mui.material.styles.TypographyVariant diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt index 41abceef1..19985c04b 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt @@ -1,7 +1,12 @@ package org.anvilpowered.anvil.ui.page -import mui.material.Grid -import mui.material.Typography +import mui.material.Paper +import mui.material.Table +import mui.material.TableBody +import mui.material.TableCell +import mui.material.TableContainer +import mui.material.TableHead +import mui.material.TableRow import org.anvilpowered.anvil.user.Server import react.FC import react.Props @@ -21,5 +26,25 @@ val demoData = listOf( ) val Servers = FC { - Grid + TableContainer { + component = Paper + Table { + TableHead { + TableRow { + TableCell { +"Server Name" } + TableCell { +"Players Online" } + TableCell { +"Player Capacity" } + } + } + TableBody { + demoData.forEach { server -> + TableRow { + TableCell { +server.id } + TableCell { +server.playerCount.toString() } + TableCell { +server.maxPlayerCount.toString() } + } + } + } + } + } } From 59166958cbdd844cdda169bae27f947d59ad61d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 24 Jan 2023 02:48:41 +0100 Subject: [PATCH 08/77] I did not just spend 2 hours on a search bar and a button --- .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 5 +- .../anvil/ui/component/SearchBox.kt | 48 +++++++++++++++++++ .../org/anvilpowered/anvil/ui/page/Servers.kt | 37 ++++++++++++-- 3 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt index 515961b14..c418abf53 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt @@ -4,8 +4,6 @@ import csstype.BoxSizing import csstype.minus import csstype.pct import csstype.px -import mui.icons.material.Dashboard as DashboardIcon -import mui.icons.material.Storage as StorageIcon import mui.material.AppBar import mui.material.Drawer import mui.material.DrawerAnchor @@ -14,7 +12,6 @@ import mui.material.ListItemIcon import mui.material.ListItemText import mui.material.MenuItem import mui.material.MenuList -import mui.material.MuiDrawer import mui.material.Toolbar import mui.material.Typography import mui.material.styles.TypographyVariant @@ -24,6 +21,8 @@ import react.FC import react.Props import react.ReactNode import react.router.useNavigate +import mui.icons.material.Dashboard as DashboardIcon +import mui.icons.material.Storage as StorageIcon val drawerWidth = 240; diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt new file mode 100644 index 000000000..94ce67cec --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt @@ -0,0 +1,48 @@ +package org.anvilpowered.anvil.ui.component + +import csstype.AlignItems +import csstype.Display +import csstype.LineStyle +import csstype.NamedColor +import csstype.ch +import csstype.px +import mui.material.InputBase +import mui.material.Paper +import mui.material.styles.Theme +import mui.material.styles.create +import mui.material.styles.useTheme +import mui.system.PropsWithSx +import mui.system.sx +import react.FC +import mui.icons.material.Search as SearchIcon + +val SearchBox = FC { + + val theme = useTheme() + + Paper { + sx { + display = Display.flex + alignItems = AlignItems.center + padding = 3.px + borderColor = NamedColor.gray + borderWidth = 1.px + borderStyle = LineStyle.solid + borderRadius = 8.px + } + SearchIcon() + InputBase { + sx { + width = 20.ch + transition = theme.transitions.create("width") { + easing = theme.transitions.easing.easeIn + duration = theme.transitions.duration.shortest + } + focusWithin { + width = 34.ch + } + } + placeholder = "Search..." + } + } +} diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt index 19985c04b..e52bfb2cb 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt @@ -1,15 +1,32 @@ package org.anvilpowered.anvil.ui.page +import csstype.Display +import csstype.JustifyContent +import csstype.number +import csstype.pct +import csstype.px +import mui.material.Button +import mui.material.ButtonVariant +import mui.material.IconButton import mui.material.Paper +import mui.material.Size import mui.material.Table import mui.material.TableBody import mui.material.TableCell +import mui.material.TableCellAlign import mui.material.TableContainer import mui.material.TableHead import mui.material.TableRow +import mui.material.Toolbar +import mui.material.Typography +import mui.material.styles.TypographyVariant +import mui.system.sx +import org.anvilpowered.anvil.ui.component.SearchBox import org.anvilpowered.anvil.user.Server import react.FC import react.Props +import react.create +import mui.icons.material.Add as AddIcon private data class ServerImpl( override val id: String, @@ -26,22 +43,34 @@ val demoData = listOf( ) val Servers = FC { + Toolbar { + Typography { + sx { + flexGrow = number(1.0) + } + variant = TypographyVariant.overline + +"Servers" + } + SearchBox() + IconButton { + sx { marginLeft = 10.px } + AddIcon() + } + } TableContainer { component = Paper Table { TableHead { TableRow { TableCell { +"Server Name" } - TableCell { +"Players Online" } - TableCell { +"Player Capacity" } + TableCell { align = TableCellAlign.right; +"Players" } } } TableBody { demoData.forEach { server -> TableRow { TableCell { +server.id } - TableCell { +server.playerCount.toString() } - TableCell { +server.maxPlayerCount.toString() } + TableCell { align = TableCellAlign.right; +"${server.playerCount}/${server.maxPlayerCount}" } } } } From ea3c53c1ea856d1eb7dc1f7687142849a83d03a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 24 Jan 2023 11:30:56 +0100 Subject: [PATCH 09/77] Fix margin -> flex gap --- .../jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt index e52bfb2cb..bfc2d6338 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt @@ -44,6 +44,10 @@ val demoData = listOf( val Servers = FC { Toolbar { + sx { + display = Display.flex + gap = 16.px + } Typography { sx { flexGrow = number(1.0) @@ -53,7 +57,6 @@ val Servers = FC { } SearchBox() IconButton { - sx { marginLeft = 10.px } AddIcon() } } From 2a32e9caf327dd5f94e88a99af8033215cf55145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 24 Jan 2023 22:52:43 +0100 Subject: [PATCH 10/77] Prepare for ktor --- gradle/libs.versions.toml | 23 ++++++++--- .../org/anvilpowered/anvil/ui/Routing.kt | 13 +++++-- .../page/{Dashboard.kt => dashboard/Home.kt} | 4 +- .../anvil/ui/page/servers/Create.kt | 38 +++++++++++++++++++ .../ui/page/{Servers.kt => servers/Home.kt} | 17 ++++----- 5 files changed, 75 insertions(+), 20 deletions(-) rename ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/{Dashboard.kt => dashboard/Home.kt} (96%) create mode 100644 ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt rename ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/{Servers.kt => servers/Home.kt} (88%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6d46a1117..48cf984d4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,26 @@ [versions] +kmongo = "4.8.0" kotlin = "1.8.0" +ktor = "2.2.2" [libraries] coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2" -jetbrains_annotations = "org.jetbrains:annotations:24.0.0" -kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } -kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } -kotlin-stdlib8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } -serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" +annotations = "org.jetbrains:annotations:24.0.0" +kmongo-core = { module = "org.litote.kmongo:kmongo", version.ref = "kmongo" } +kmongo-async = { module = "org.litote.kmongo:kmongo-async", version.ref = "kmongo" } +kmongo-coroutine = { module = "org.litote.kmongo:kmongo-coroutine-serialization", version.ref = "kmongo" } +kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" +kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" +kotlinx-serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" +ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" } +ktor-serialization = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } +ktor-server-auth = { module = "io.ktor:ktor-server-auth", version.ref = "ktor" } +ktor-server-content-negotiation = { module = "io.ktor:ktor-server-content-negotiation", version.ref = "ktor" } +ktor-server-cors = { module = "io.ktor:ktor-server-cors", version.ref = "ktor" } +ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" } +ktor-server-resources = { module = "io.ktor:ktor-server-resources", version.ref = "ktor" } +ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = "ktor" } +ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" } [plugins] kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt index bbda724ca..518c960ef 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt @@ -1,8 +1,9 @@ package org.anvilpowered.anvil.ui import mui.material.Typography -import org.anvilpowered.anvil.ui.page.Dashboard -import org.anvilpowered.anvil.ui.page.Servers +import org.anvilpowered.anvil.ui.page.dashboard.DashboardHome +import org.anvilpowered.anvil.ui.page.servers.ServersCreate +import org.anvilpowered.anvil.ui.page.servers.ServersHome import react.FC import react.Props import react.create @@ -14,11 +15,15 @@ val Routing = FC { Routes { Route { path = "/dashboard" - element = Dashboard.create() + element = DashboardHome.create() } Route { path = "/servers" - element = Servers.create() + element = ServersHome.create() + } + Route { + path = "/servers/create" + element = ServersCreate.create() } Route { path = "/" diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Dashboard.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt similarity index 96% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Dashboard.kt rename to ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt index 6f3d5fefa..b9ae96b7e 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Dashboard.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt @@ -1,10 +1,10 @@ -package org.anvilpowered.anvil.ui.page +package org.anvilpowered.anvil.ui.page.dashboard import mui.material.Typography import react.FC import react.Props -val Dashboard = FC { +val DashboardHome = FC { Typography { paragraph = true +""" diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt new file mode 100644 index 000000000..f4c5cf5ba --- /dev/null +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt @@ -0,0 +1,38 @@ +package org.anvilpowered.anvil.ui.page.servers + +import csstype.Display +import csstype.number +import csstype.px +import mui.icons.material.ArrowBack +import mui.material.IconButton +import mui.material.Toolbar +import mui.material.Typography +import mui.material.styles.TypographyVariant +import mui.system.sx +import react.FC +import react.Props +import react.router.useNavigate +import kotlin.random.Random + +val ServersCreate = FC { + + val nav = useNavigate() + + Toolbar { + sx { + display = Display.flex + gap = 16.px + } + Typography { + sx { + flexGrow = number(1.0) + } + variant = TypographyVariant.overline + +"Create Server" + } + IconButton { + onClick = { nav("/servers") } + ArrowBack() + } + } +} diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt similarity index 88% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt rename to ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt index bfc2d6338..122a35a8e 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/Servers.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt @@ -1,15 +1,10 @@ -package org.anvilpowered.anvil.ui.page +package org.anvilpowered.anvil.ui.page.servers import csstype.Display -import csstype.JustifyContent import csstype.number -import csstype.pct import csstype.px -import mui.material.Button -import mui.material.ButtonVariant import mui.material.IconButton import mui.material.Paper -import mui.material.Size import mui.material.Table import mui.material.TableBody import mui.material.TableCell @@ -25,13 +20,13 @@ import org.anvilpowered.anvil.ui.component.SearchBox import org.anvilpowered.anvil.user.Server import react.FC import react.Props -import react.create +import react.router.useNavigate import mui.icons.material.Add as AddIcon private data class ServerImpl( override val id: String, override val playerCount: Int, - override val maxPlayerCount: Int + override val maxPlayerCount: Int, ) : Server val demoData = listOf( @@ -42,7 +37,10 @@ val demoData = listOf( ServerImpl("Wild 4", 24, 100), ) -val Servers = FC { +val ServersHome = FC { + + val nav = useNavigate() + Toolbar { sx { display = Display.flex @@ -57,6 +55,7 @@ val Servers = FC { } SearchBox() IconButton { + onClick = { nav("/servers/create") } AddIcon() } } From f2616c71323b6525c0f5f2e260b253e912ee20ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 25 Jan 2023 01:46:30 +0100 Subject: [PATCH 11/77] Add state --- gradle/libs.versions.toml | 1 + ui/build.gradle.kts | 1 + .../anvil/ui/page/servers/Create.kt | 56 ++++++++++++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 48cf984d4..eac6271fd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,6 +21,7 @@ ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" ktor-server-resources = { module = "io.ktor:ktor-server-resources", version.ref = "ktor" } ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = "ktor" } ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" } +redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.5.5" [plugins] kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index c63d8fb19..ca1174af2 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -7,6 +7,7 @@ fun kotlinw(target: String): String = dependencies { commonMainImplementation(project(":anvil-domain")) + commonMainImplementation(libs.redux) jsMainImplementation(enforcedPlatform(kotlinw("wrappers-bom:1.0.0-pre.480"))) jsMainImplementation(kotlinw("react")) diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt index f4c5cf5ba..8e0836bc7 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt @@ -1,22 +1,34 @@ package org.anvilpowered.anvil.ui.page.servers +import csstype.AlignItems import csstype.Display +import csstype.em import csstype.number import csstype.px import mui.icons.material.ArrowBack +import mui.material.Box +import mui.material.CircularProgress +import mui.material.Container +import mui.material.Divider import mui.material.IconButton +import mui.material.SvgIconColor +import mui.material.TextField import mui.material.Toolbar import mui.material.Typography import mui.material.styles.TypographyVariant import mui.system.sx import react.FC import react.Props +import react.ReactNode +import react.dom.onChange import react.router.useNavigate -import kotlin.random.Random +import react.useState +import mui.icons.material.Check as CheckIcon val ServersCreate = FC { val nav = useNavigate() + var isValidName by useState() Toolbar { sx { @@ -35,4 +47,46 @@ val ServersCreate = FC { ArrowBack() } } + + Divider() + + Container { + maxWidth = "lg" + Box { + sx { + margin = 2.em + } + Typography { + variant = TypographyVariant.h5 + +"Basic Information" + } + Divider { + sx { + marginTop = 1.em + marginBottom = 2.em + } + } + Box { + sx { + display = Display.inlineFlex + alignItems = AlignItems.center + gap = 1.em + } + TextField { + id = "server-name1" + label = ReactNode("Server Name") + onChange = { + isValidName = it.target.asDynamic().value.length > 0 + } + } + if (isValidName == true) { + CheckIcon { + color = SvgIconColor.success + } + } else { + CircularProgress() + } + } + } + } } From 83f0c4864c788dca0229c8989c43b8dfbd7d84eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 25 Jan 2023 11:23:06 +0100 Subject: [PATCH 12/77] Step 1 & 2 of server create --- .../anvil/ui/page/servers/Create.kt | 123 ++++++++++++++++-- 1 file changed, 115 insertions(+), 8 deletions(-) diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt index 8e0836bc7..64015c1b2 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt +++ b/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt @@ -1,16 +1,31 @@ package org.anvilpowered.anvil.ui.page.servers import csstype.AlignItems +import csstype.Auto import csstype.Display +import csstype.JustifyContent import csstype.em import csstype.number +import csstype.pct import csstype.px +import js.core.jso import mui.icons.material.ArrowBack +import mui.material.Alert +import mui.material.AlertColor import mui.material.Box +import mui.material.Button +import mui.material.ButtonVariant +import mui.material.Card +import mui.material.CardActions +import mui.material.CardContent import mui.material.CircularProgress import mui.material.Container import mui.material.Divider import mui.material.IconButton +import mui.material.Snackbar +import mui.material.SnackbarOrigin +import mui.material.SnackbarOriginHorizontal +import mui.material.SnackbarOriginVertical import mui.material.SvgIconColor import mui.material.TextField import mui.material.Toolbar @@ -23,12 +38,20 @@ import react.ReactNode import react.dom.onChange import react.router.useNavigate import react.useState +import web.navigator.navigator +import kotlin.random.Random +import kotlin.random.nextUInt import mui.icons.material.Check as CheckIcon +import mui.icons.material.Close as CloseIcon val ServersCreate = FC { val nav = useNavigate() var isValidName by useState() + var isNameDirty by useState(false) + var generatedConnectionString by useState() + var copySnackOpen by useState(false) + val random by useState(Random(1)) Toolbar { sx { @@ -58,7 +81,7 @@ val ServersCreate = FC { } Typography { variant = TypographyVariant.h5 - +"Basic Information" + +"Step 1: Server Information" } Divider { sx { @@ -68,25 +91,109 @@ val ServersCreate = FC { } Box { sx { - display = Display.inlineFlex + display = Display.flex alignItems = AlignItems.center gap = 1.em + marginBottom = 2.em } TextField { - id = "server-name1" + id = "server-name" label = ReactNode("Server Name") onChange = { isValidName = it.target.asDynamic().value.length > 0 } } - if (isValidName == true) { - CheckIcon { - color = SvgIconColor.success + when { + isValidName == true -> CheckIcon { color = SvgIconColor.success } + isNameDirty && isValidName == false -> CloseIcon() + isNameDirty && isValidName == null -> CircularProgress() + } + Box { + sx { + flexGrow = number(1.0) + } + } + Button { + variant = ButtonVariant.outlined + disabled = isValidName != true + onClick = { + generatedConnectionString = random.nextUInt().toString() + } + if (generatedConnectionString == null) { + +"Generate Connection String" + } else { + +"Regenerate Connection String" + } + } + } + + Typography { + variant = TypographyVariant.h5 + +"Step 2: Copy Connection String" + } + Divider { + sx { + marginTop = 1.em + marginBottom = 2.em + } + } + + Card { + sx { + marginTop = 2.em + width = 100.pct + } + CardContent { + sx { + height = 120.px + } + Typography { + variant = TypographyVariant.overline + +"Connection String" + } + generatedConnectionString?.let { + Box { + sx { + display = Display.flex + justifyContent = JustifyContent.center + } + Typography { + variant = TypographyVariant.h5 + +it + } + } + } + } + CardActions { + Button { + sx { + marginLeft = Auto.auto + } + variant = ButtonVariant.outlined + disabled = generatedConnectionString == null + generatedConnectionString?.let { cs -> + onClick = { + navigator.clipboard.writeText(cs) + copySnackOpen = true + } + } + +"Copy" } - } else { - CircularProgress() } } } } + Snackbar { + anchorOrigin = jso { + vertical = SnackbarOriginVertical.bottom + horizontal = SnackbarOriginHorizontal.center + } + open = copySnackOpen + autoHideDuration = 2000 + onClose = { _, _ -> copySnackOpen = false } + Alert { + severity = AlertColor.success + +"Copied to clipboard!" + } + } } From 63ab8552fa41c6166dbabbd7631aff7eb125d27a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 5 Apr 2023 00:55:17 +0200 Subject: [PATCH 13/77] Start domain model and organizing submodules --- .editorconfig | 2 + agent/application/build.gradle.kts | 11 ++++++ .../anvil/agent/command/AgentCommand.kt | 3 ++ .../agent/command/AnvilPluginsCommand.kt | 16 ++++++++ .../anvil/agent/command/ArgumentExtensions.kt | 15 ++++++++ .../anvil/agent/platform/PluginManager.kt | 11 ++++++ agent/build.gradle.kts | 6 +++ agent/infrastructure/build.gradle.kts | 8 ++++ .../anvil/agent/http/client/AgentClient.kt | 3 ++ .../anvil/agent/http/server/AgentServer.kt | 3 ++ agent/{ => mc}/sponge/build.gradle.kts | 2 +- .../anvil/agent/AnvilSpongePlugin.kt | 8 +++- agent/mc/velocity/build.gradle.kts | 16 ++++++++ .../anvil/agent/AnvilVelocityPlugin.kt | 26 +++++++++++++ .../kotlin-js.base-conventions.gradle.kts | 1 + cockpit/application/build.gradle.kts | 7 ++++ .../anvil/cockpit/usecase/gametype/create.kt | 10 +++++ .../backend}/build.gradle.kts | 0 {server => cockpit}/build.gradle.kts | 0 cockpit/domain/build.gradle.kts | 7 ++++ {ui => cockpit/ui}/build.gradle.kts | 4 +- .../kotlin/org/anvilpowered/anvil/ui/App.kt | 6 ++- .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 1 + .../org/anvilpowered/anvil/ui/Routing.kt | 0 .../org/anvilpowered/anvil/ui/UUIDStuff.kt | 4 ++ .../anvil/ui/component/SearchBox.kt | 0 .../anvil/ui/component/Sidebar.kt | 0 .../anvil/ui/page/dashboard/Home.kt | 0 .../anvil/ui/page/servers/Create.kt | 0 .../anvil/ui/page/servers/Home.kt | 2 +- .../ui}/src/jsMain/resources/index.html | 2 +- {server/impl => core}/build.gradle.kts | 0 core/db/build.gradle.kts | 9 +++++ .../GameTypeRepositoryActionsImpl.kt | 30 +++++++++++++++ .../anvil/datastore/RepositoryExtensions.kt | 20 ++++++++++ .../anvilpowered/anvil/entity/AnvilTable.kt | 9 +++++ .../anvilpowered/anvil/entity/GameTypes.kt | 27 +++++++++++++ .../anvilpowered/anvil/entity/ServerNodes.kt | 21 ++++++++++ .../org/anvilpowered/anvil/entity/Users.kt | 18 +++++++++ .../db/src/jvmMain/resources/application.conf | 9 +++++ core/domain/build.gradle.kts | 12 ++++++ .../kotlin/org/anvilpowered/anvil/Anvil.kt | 6 +++ .../kotlin/org/anvilpowered/anvil}/Server.kt | 2 +- .../datastore/GameTypeRepositoryActions.kt | 11 ++++++ .../anvil/datastore/RepositoryActions.kt | 12 ++++++ .../datastore/ServerNodeRepositoryActions.kt | 9 +++++ .../org/anvilpowered/anvil/datastore/UUID.kt | 7 ++++ .../anvilpowered/anvil/entity/DomainEntity.kt | 12 ++++++ .../org/anvilpowered/anvil/entity/GameType.kt | 16 ++++++++ .../anvilpowered/anvil/entity/ServerNode.kt | 16 ++++++++ .../anvil/platform/AgentPlatform.kt | 9 +++++ .../anvil/platform/AgentPlugin.kt | 5 +++ .../anvil/platform/UniversalPlugin.kt | 5 +++ .../org/anvilpowered/anvil/user/Audience.kt | 5 +++ .../anvilpowered/anvil/user/CommandSource.kt | 3 ++ .../org/anvilpowered/anvil/user/Component.kt | 3 ++ .../anvil/user/PermissionSubject.kt | 17 +++++++++ .../org/anvilpowered/anvil/user/Player.kt | 5 +++ .../org/anvilpowered/anvil/user/User.kt | 2 +- .../org/anvilpowered/anvil/datastore/UUID.kt | 9 +++++ .../org/anvilpowered/anvil/user/Audience.kt | 6 +++ .../org/anvilpowered/anvil/user/Component.kt | 3 ++ .../org/anvilpowered/anvil/datastore/UUID.kt | 10 +++++ .../org/anvilpowered/anvil/user/Audience.kt | 3 ++ .../org/anvilpowered/anvil/user/Component.kt | 3 ++ core/web/build.gradle.kts | 15 ++++++++ .../org/anvilpowered/anvil/web/AddAgent.kt | 9 +++++ .../kotlin/org/anvilpowered/anvil/web/Foo.kt | 4 ++ .../kotlin/org/anvilpowered/anvil/web/Main.kt | 15 ++++++++ .../anvilpowered/anvil/web/web-platforms.kt | 5 +++ domain/build.gradle.kts | 4 -- gradle/libs.versions.toml | 36 +++++++++++++----- gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 61608 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 4 +- settings.gradle.kts | 21 +++++++--- 76 files changed, 590 insertions(+), 33 deletions(-) create mode 100644 agent/application/build.gradle.kts create mode 100644 agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AgentCommand.kt create mode 100644 agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt create mode 100644 agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt create mode 100644 agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/platform/PluginManager.kt create mode 100644 agent/infrastructure/build.gradle.kts create mode 100644 agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/client/AgentClient.kt create mode 100644 agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/server/AgentServer.kt rename agent/{ => mc}/sponge/build.gradle.kts (95%) rename agent/{ => mc}/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt (59%) create mode 100644 agent/mc/velocity/build.gradle.kts create mode 100644 agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt create mode 100644 cockpit/application/build.gradle.kts create mode 100644 cockpit/application/src/jvmMain/kotlin/org/anvilpowered/anvil/cockpit/usecase/gametype/create.kt rename {agent/velocity => cockpit/backend}/build.gradle.kts (100%) rename {server => cockpit}/build.gradle.kts (100%) create mode 100644 cockpit/domain/build.gradle.kts rename {ui => cockpit/ui}/build.gradle.kts (80%) rename {ui => cockpit/ui}/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt (92%) rename {ui => cockpit/ui}/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt (98%) rename {ui => cockpit/ui}/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt (100%) create mode 100644 cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt rename {ui => cockpit/ui}/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt (100%) rename {ui => cockpit/ui}/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt (100%) rename {ui => cockpit/ui}/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt (100%) rename {ui => cockpit/ui}/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt (100%) rename {ui => cockpit/ui}/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt (98%) rename {ui => cockpit/ui}/src/jsMain/resources/index.html (84%) rename {server/impl => core}/build.gradle.kts (100%) create mode 100644 core/db/build.gradle.kts create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActionsImpl.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt create mode 100644 core/db/src/jvmMain/resources/application.conf create mode 100644 core/domain/build.gradle.kts create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt rename {domain/src/commonMain/kotlin/org/anvilpowered/anvil/user => core/domain/src/commonMain/kotlin/org/anvilpowered/anvil}/Server.kt (72%) create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActions.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryActions.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeRepositoryActions.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/DomainEntity.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlatform.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlugin.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/UniversalPlugin.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Audience.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/CommandSource.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Component.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/PermissionSubject.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt rename {domain => core/domain}/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt (61%) create mode 100644 core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt create mode 100644 core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Audience.kt create mode 100644 core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Component.kt create mode 100644 core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt create mode 100644 core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Audience.kt create mode 100644 core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Component.kt create mode 100644 core/web/build.gradle.kts create mode 100644 core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/AddAgent.kt create mode 100644 core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Foo.kt create mode 100644 core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Main.kt create mode 100644 core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/web-platforms.kt delete mode 100644 domain/build.gradle.kts diff --git a/.editorconfig b/.editorconfig index 4dad478be..0ff0a5ab9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,6 +8,8 @@ indent_style = space indent_size = 4 insert_final_newline = true trim_trailing_whitespace = true +ij_kotlin_allow_trailing_comma_on_call_site = true +ij_kotlin_allow_trailing_comma = true [{*.json,*.yml}] indent_size = 2 diff --git a/agent/application/build.gradle.kts b/agent/application/build.gradle.kts new file mode 100644 index 000000000..7730ff1fa --- /dev/null +++ b/agent/application/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(project(":anvil-core-domain")) + jvmMainImplementation(libs.brigadier) + jvmMainImplementation(platform(libs.adventure.bom)) + jvmMainImplementation("net.kyori:adventure-api") + jvmMainImplementation(libs.logging.api) +} diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AgentCommand.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AgentCommand.kt new file mode 100644 index 000000000..b8c9a7270 --- /dev/null +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AgentCommand.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.agent.command + +object AgentCommand diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt new file mode 100644 index 000000000..2bdde3b09 --- /dev/null +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt @@ -0,0 +1,16 @@ +package org.anvilpowered.anvil.agent.command + +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.mojang.brigadier.tree.CommandNode +import net.kyori.adventure.text.Component +import org.anvilpowered.anvil.agent.platform.PluginManager +import org.anvilpowered.anvil.user.CommandSource + +context(PluginManager.Scope) +fun createPlugins(): CommandNode = + LiteralArgumentBuilder.literal("plugins") + .requiresPermission("anvil.agent.plugins") + .executesSingleSuccess { context -> + val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } + context.source.sendMessage(Component.text("Plugins: $pluginNamesString")) + }.build() diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt new file mode 100644 index 000000000..1d6fe6757 --- /dev/null +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt @@ -0,0 +1,15 @@ +package org.anvilpowered.anvil.agent.command + +import com.mojang.brigadier.builder.ArgumentBuilder +import com.mojang.brigadier.context.CommandContext +import org.anvilpowered.anvil.user.CommandSource +import org.anvilpowered.anvil.user.hasPermissionSet + +internal fun > T.requiresPermission(permission: String): T = + requires { it.hasPermissionSet(permission) } + +internal fun > T.executesSingleSuccess(block: (CommandContext) -> Unit) = + executes { context -> + block(context) + 1 + } diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/platform/PluginManager.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/platform/PluginManager.kt new file mode 100644 index 000000000..abef4ca7a --- /dev/null +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/platform/PluginManager.kt @@ -0,0 +1,11 @@ +package org.anvilpowered.anvil.agent.platform + +import org.anvilpowered.anvil.platform.AgentPlugin + +interface PluginManager { + val plugins: List + + interface Scope { + val pluginManager: PluginManager + } +} diff --git a/agent/build.gradle.kts b/agent/build.gradle.kts index 3614e4182..eb60dde26 100644 --- a/agent/build.gradle.kts +++ b/agent/build.gradle.kts @@ -1,3 +1,9 @@ plugins { id("kotlin-jvm.base-conventions") + alias(libs.plugins.shadow) +} + +dependencies { + commonMainImplementation(project(":anvil-agent-mc-sponge")) + commonMainImplementation(project(":anvil-agent-mc-velocity")) } diff --git a/agent/infrastructure/build.gradle.kts b/agent/infrastructure/build.gradle.kts new file mode 100644 index 000000000..69bb7ad8d --- /dev/null +++ b/agent/infrastructure/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainImplementation(libs.bundles.ktor.client) + commonMainImplementation(libs.bundles.ktor.server) +} diff --git a/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/client/AgentClient.kt b/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/client/AgentClient.kt new file mode 100644 index 000000000..7e56da9d5 --- /dev/null +++ b/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/client/AgentClient.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.agent.http.client + +object AgentClient diff --git a/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/server/AgentServer.kt b/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/server/AgentServer.kt new file mode 100644 index 000000000..13130a9da --- /dev/null +++ b/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/server/AgentServer.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.agent.http.server + +object AgentServer diff --git a/agent/sponge/build.gradle.kts b/agent/mc/sponge/build.gradle.kts similarity index 95% rename from agent/sponge/build.gradle.kts rename to agent/mc/sponge/build.gradle.kts index ec0cc6899..13e6a4969 100644 --- a/agent/sponge/build.gradle.kts +++ b/agent/mc/sponge/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } sponge { - apiVersion("10.0.0-SNAPSHOT") + apiVersion("8.1.0-SNAPSHOT") license("AGPL-3.0") loader { name(PluginLoaders.JAVA_PLAIN) diff --git a/agent/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt b/agent/mc/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt similarity index 59% rename from agent/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt rename to agent/mc/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt index 22a4ee68f..e63bde163 100644 --- a/agent/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt +++ b/agent/mc/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt @@ -1,14 +1,18 @@ package org.anvilpowered.anvil.agent +import com.google.inject.Inject +import org.apache.logging.log4j.Logger import org.spongepowered.api.event.Listener import org.spongepowered.api.event.lifecycle.ConstructPluginEvent import org.spongepowered.plugin.builtin.jvm.Plugin @Plugin("anvil-agent") -class AnvilSpongePlugin { +class AnvilSpongePlugin @Inject constructor( + private val logger: Logger, +) { @Listener fun onServerStart(event: ConstructPluginEvent) { - println("Hello, world! ${event.plugin()}") + logger.warn("Hello, world! ${event.plugin()}") } } diff --git a/agent/mc/velocity/build.gradle.kts b/agent/mc/velocity/build.gradle.kts new file mode 100644 index 000000000..3626b9e1b --- /dev/null +++ b/agent/mc/velocity/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("kotlin-jvm.base-conventions") + kotlin("kapt") +} + +dependencies { + commonMainApi(project(":anvil-agent-application")) + jvmMainImplementation(libs.velocity) + kapt(libs.velocity) +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(11)) + } +} diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt new file mode 100644 index 000000000..fdf322f26 --- /dev/null +++ b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt @@ -0,0 +1,26 @@ +package org.anvilpowered.anvil.agent + +import com.google.inject.Inject +import com.velocitypowered.api.plugin.Plugin +import com.velocitypowered.api.proxy.ProxyServer +import com.velocitypowered.api.proxy.server.RegisteredServer +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.future.asDeferred +import kotlinx.coroutines.runBlocking +import org.slf4j.Logger +import kotlin.jvm.optionals.getOrNull + +@Plugin( + id = "anvil-agent", + name = "Anvil Agent", + version = "0.4.0-SNAPSHOT", + authors = ["AnvilPowered"], +) +class AnvilVelocityPlugin @Inject constructor( + private val proxyServer: ProxyServer, + private val logger: Logger, +) { + init { + logger.info("Hello, world from anvil-agent!") + } +} diff --git a/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts b/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts index 78e189513..a40e0e951 100644 --- a/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts @@ -4,5 +4,6 @@ extensions.getByName("kotlin").apply { js(IR) { browser() binaries.executable() + useCommonJs() } } diff --git a/cockpit/application/build.gradle.kts b/cockpit/application/build.gradle.kts new file mode 100644 index 000000000..e65e91907 --- /dev/null +++ b/cockpit/application/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(project(":anvil-core-domain")) +} diff --git a/cockpit/application/src/jvmMain/kotlin/org/anvilpowered/anvil/cockpit/usecase/gametype/create.kt b/cockpit/application/src/jvmMain/kotlin/org/anvilpowered/anvil/cockpit/usecase/gametype/create.kt new file mode 100644 index 000000000..0e38b8076 --- /dev/null +++ b/cockpit/application/src/jvmMain/kotlin/org/anvilpowered/anvil/cockpit/usecase/gametype/create.kt @@ -0,0 +1,10 @@ +package org.anvilpowered.anvil.cockpit.usecase.gametype + +import org.anvilpowered.anvil.entity.GameType + +suspend fun GameType.Companion.create( + name: String, + website: String, +) { + +} diff --git a/agent/velocity/build.gradle.kts b/cockpit/backend/build.gradle.kts similarity index 100% rename from agent/velocity/build.gradle.kts rename to cockpit/backend/build.gradle.kts diff --git a/server/build.gradle.kts b/cockpit/build.gradle.kts similarity index 100% rename from server/build.gradle.kts rename to cockpit/build.gradle.kts diff --git a/cockpit/domain/build.gradle.kts b/cockpit/domain/build.gradle.kts new file mode 100644 index 000000000..e65e91907 --- /dev/null +++ b/cockpit/domain/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(project(":anvil-core-domain")) +} diff --git a/ui/build.gradle.kts b/cockpit/ui/build.gradle.kts similarity index 80% rename from ui/build.gradle.kts rename to cockpit/ui/build.gradle.kts index ca1174af2..3a8c47d6e 100644 --- a/ui/build.gradle.kts +++ b/cockpit/ui/build.gradle.kts @@ -6,7 +6,7 @@ fun kotlinw(target: String): String = "org.jetbrains.kotlin-wrappers:kotlin-$target" dependencies { - commonMainImplementation(project(":anvil-domain")) + commonMainImplementation(project(":anvil-core-domain")) commonMainImplementation(libs.redux) jsMainImplementation(enforcedPlatform(kotlinw("wrappers-bom:1.0.0-pre.480"))) @@ -20,4 +20,6 @@ dependencies { jsMainImplementation(npm("date-fns", "2.29.3")) jsMainImplementation(npm("@date-io/date-fns", "2.16.0")) + jsMainImplementation(npm("uuid", "9.0.0")) + jsMainImplementation(npm("is-sorted", "1.0.5")) } diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt similarity index 92% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt rename to cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt index fa56a5fb6..ec290230c 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt +++ b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt @@ -1,6 +1,5 @@ package org.anvilpowered.anvil.ui -import csstype.em import csstype.number import csstype.px import js.core.jso @@ -11,6 +10,7 @@ import mui.material.Toolbar import mui.material.styles.ThemeProvider import mui.material.styles.createTheme import mui.system.sx +import org.anvilpowered.anvil.datastore.Crypto import react.FC import react.Props import react.create @@ -20,6 +20,8 @@ import web.dom.document import web.html.HTML.div fun main() { + println("UUID_a: ${Crypto.randomUUID()}") + val root = document.createElement(div) .also { document.body.appendChild(it) } @@ -32,7 +34,7 @@ private val darkTheme = createTheme( palette = jso { mode = PaletteMode.dark } - } + }, ) private val App = FC { diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt similarity index 98% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt rename to cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt index c418abf53..d2be05d91 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt +++ b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt @@ -4,6 +4,7 @@ import csstype.BoxSizing import csstype.minus import csstype.pct import csstype.px +import emotion.styled.styled import mui.material.AppBar import mui.material.Drawer import mui.material.DrawerAnchor diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt similarity index 100% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt rename to cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt new file mode 100644 index 000000000..57e7767e2 --- /dev/null +++ b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt @@ -0,0 +1,4 @@ +package org.anvilpowered.anvil.ui + +import org.anvilpowered.anvil.datastore.UUID + diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt similarity index 100% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt rename to cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt similarity index 100% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt rename to cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt similarity index 100% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt rename to cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt similarity index 100% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt rename to cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt diff --git a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt similarity index 98% rename from ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt rename to cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt index 122a35a8e..1a75d7c21 100644 --- a/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt +++ b/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt @@ -17,7 +17,7 @@ import mui.material.Typography import mui.material.styles.TypographyVariant import mui.system.sx import org.anvilpowered.anvil.ui.component.SearchBox -import org.anvilpowered.anvil.user.Server +import org.anvilpowered.anvil.Server import react.FC import react.Props import react.router.useNavigate diff --git a/ui/src/jsMain/resources/index.html b/cockpit/ui/src/jsMain/resources/index.html similarity index 84% rename from ui/src/jsMain/resources/index.html rename to cockpit/ui/src/jsMain/resources/index.html index e0cd3ee40..1e65671f9 100644 --- a/ui/src/jsMain/resources/index.html +++ b/cockpit/ui/src/jsMain/resources/index.html @@ -7,7 +7,7 @@ Kotlin MUI Showcase - + diff --git a/server/impl/build.gradle.kts b/core/build.gradle.kts similarity index 100% rename from server/impl/build.gradle.kts rename to core/build.gradle.kts diff --git a/core/db/build.gradle.kts b/core/db/build.gradle.kts new file mode 100644 index 000000000..e7193102b --- /dev/null +++ b/core/db/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(project(":anvil-core-domain")) + jvmMainApi(platform(libs.exposed.bom)) + jvmMainApi(libs.bundles.exposed) +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActionsImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActionsImpl.kt new file mode 100644 index 000000000..641d46246 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActionsImpl.kt @@ -0,0 +1,30 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.entity.DomainEntity +import org.anvilpowered.anvil.entity.GameType +import org.anvilpowered.anvil.entity.GameTypes +import org.anvilpowered.anvil.entity.setValuesFrom +import org.anvilpowered.anvil.entity.toGameType +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction + +class GameTypeRepositoryActionsImpl : GameTypeRepositoryActions { + + override suspend fun DomainEntity.Repository.save(item: GameType): GameType = + newSaveTransaction(GameTypes, { setValuesFrom(item) }, ResultRow::toGameType) + + override suspend fun DomainEntity.Repository.findById(uuid: UUID): GameType? = + newSuspendedTransaction { GameTypes.select(GameTypes.id eq uuid).firstOrNull()?.toGameType() } + + override suspend fun DomainEntity.Repository<*>.deleteById(uuid: UUID): Boolean = + newSuspendedTransaction { GameTypes.deleteWhere { GameTypes.id eq uuid } > 0 } + + override suspend fun DomainEntity.Repository.findByName(name: String): GameType? = + newSuspendedTransaction { GameTypes.select(GameTypes.name eq name).firstOrNull()?.toGameType() } + + override suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? = + newSuspendedTransaction { GameTypes.select(GameTypes.website eq website).firstOrNull()?.toGameType() } +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt new file mode 100644 index 000000000..7efa1b057 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt @@ -0,0 +1,20 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.entity.DomainEntity +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.Table +import org.jetbrains.exposed.sql.insert +import org.jetbrains.exposed.sql.statements.InsertStatement +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction + +internal suspend fun newSaveTransaction( + table: T, + toTable: context(T) InsertStatement.() -> Unit, + toEntity: ResultRow.() -> E, +): E { + val fromDB = newSuspendedTransaction { + table.insert { toTable(it) } + }.resultedValues?.firstOrNull()?.toEntity() + checkNotNull(fromDB) { "Failed to save entity" } + return fromDB +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt new file mode 100644 index 000000000..7b414b0e0 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt @@ -0,0 +1,9 @@ +package org.anvilpowered.anvil.entity + +import org.jetbrains.exposed.dao.id.UUIDTable +import org.jetbrains.exposed.sql.javatime.timestamp + +abstract class AnvilTable(name: String) : UUIDTable(name) { + val createdUtc = timestamp("created_utc") + val updatedUtc = timestamp("updated_utc") // TODO: Make sure postgres updates this field +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt new file mode 100644 index 000000000..075cb0204 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt @@ -0,0 +1,27 @@ +package org.anvilpowered.anvil.entity + +import kotlinx.datetime.toJavaInstant +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.statements.InsertStatement + +object GameTypes : AnvilTable("game_types") { + val name = varchar("name", 255).uniqueIndex() + val website = varchar("website", 255) +} + +context(GameTypes) +fun InsertStatement<*>.setValuesFrom(gameType: GameType) { + this[name] = gameType.name + this[website] = gameType.website + this[id] = gameType.id + this[createdUtc] = gameType.createdUtc.toJavaInstant() + this[updatedUtc] = gameType.updatedUtc.toJavaInstant() +} + +fun ResultRow.toGameType(): GameType { + return GameType( + name = this[GameTypes.name], + website = this[GameTypes.website], + id = this[GameTypes.id].value, + ) +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt new file mode 100644 index 000000000..fa048e918 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt @@ -0,0 +1,21 @@ +package org.anvilpowered.anvil.entity + +import org.jetbrains.exposed.dao.UUIDEntity +import org.jetbrains.exposed.dao.UUIDEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.UUIDTable +import java.util.UUID + +object ServerNodes : UUIDTable("server_nodes") { + val name = varchar("name", 255).uniqueIndex() + val gameTypeId = reference("game_type_id", GameTypes) +} + +class ServerNode(id: EntityID) : UUIDEntity(id) { + var name by ServerNodes.name + var gameTypeId by ServerNodes.gameTypeId + var gameType by GameTypeEntity referencedOn ServerNodes.gameTypeId + + companion object : UUIDEntityClass(ServerNodes, ServerNode::class.java, ::ServerNode) +} + diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt new file mode 100644 index 000000000..27008dcb0 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt @@ -0,0 +1,18 @@ +package org.anvilpowered.anvil.entity + +import org.jetbrains.exposed.dao.UUIDEntity +import org.jetbrains.exposed.dao.UUIDEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.UUIDTable +import java.util.UUID + +object Users : UUIDTable("users") { + val email = varchar("email", 255).uniqueIndex() + val minecraftUsername = varchar("minecraftUsername", 16).uniqueIndex() +} + +class User(id: EntityID) : UUIDEntity(id) { + companion object : UUIDEntityClass(Users, User::class.java, ::User) + var email by Users.email + var minecraftUsername by Users.minecraftUsername +} diff --git a/core/db/src/jvmMain/resources/application.conf b/core/db/src/jvmMain/resources/application.conf new file mode 100644 index 000000000..05697b0ee --- /dev/null +++ b/core/db/src/jvmMain/resources/application.conf @@ -0,0 +1,9 @@ +ktor { + development = false + deployment { + port = 8080 + } + application { + modules = [ org.anvilpowered.anvil.cockpit.MainKt.main ] + } +} diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts new file mode 100644 index 000000000..4325510f6 --- /dev/null +++ b/core/domain/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("kotlin-js.base-conventions") + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(libs.kotlinx.datetime) + jvmMainApi(platform(libs.adventure.bom)) + jvmMainApi("net.kyori:adventure-api") + jvmMainApi(libs.coroutines) + jsMainImplementation(npm("uuid", "9.0.0")) +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt new file mode 100644 index 000000000..5e225ba95 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt @@ -0,0 +1,6 @@ +package org.anvilpowered.anvil + +interface Anvil { + + +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Server.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Server.kt similarity index 72% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Server.kt rename to core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Server.kt index 502cfd2a6..436e72fcd 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Server.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Server.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil interface Server { val id: String diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActions.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActions.kt new file mode 100644 index 000000000..220f00cf8 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActions.kt @@ -0,0 +1,11 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.entity.DomainEntity +import org.anvilpowered.anvil.entity.GameType + +interface GameTypeRepositoryActions : RepositoryActions { + + suspend fun DomainEntity.Repository.findByName(name: String): GameType? + + suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryActions.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryActions.kt new file mode 100644 index 000000000..266ac7bb8 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryActions.kt @@ -0,0 +1,12 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.entity.DomainEntity + +interface RepositoryActions { + + suspend fun DomainEntity.Repository.save(item: T): T + + suspend fun DomainEntity.Repository.findById(uuid: UUID): T? + + suspend fun DomainEntity.Repository<*>.deleteById(uuid: UUID): Boolean +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeRepositoryActions.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeRepositoryActions.kt new file mode 100644 index 000000000..06e830527 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeRepositoryActions.kt @@ -0,0 +1,9 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.entity.DomainEntity +import org.anvilpowered.anvil.entity.ServerNode + +interface ServerNodeRepositoryActions : RepositoryActions { + + suspend fun DomainEntity.Repository.findByName(name: String): ServerNode? +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt new file mode 100644 index 000000000..8bc6b9db4 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt @@ -0,0 +1,7 @@ +package org.anvilpowered.anvil.datastore + +expect class UUID + +expect object Crypto { + fun randomUUID(): UUID +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/DomainEntity.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/DomainEntity.kt new file mode 100644 index 000000000..4507e39c7 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/DomainEntity.kt @@ -0,0 +1,12 @@ +package org.anvilpowered.anvil.entity + +import kotlinx.datetime.Instant +import org.anvilpowered.anvil.datastore.UUID + +interface DomainEntity { + val id: UUID + val createdUtc: Instant + val updatedUtc: Instant + + interface Repository +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt new file mode 100644 index 000000000..0a4325bd7 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt @@ -0,0 +1,16 @@ +package org.anvilpowered.anvil.entity + +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant +import org.anvilpowered.anvil.datastore.Crypto +import org.anvilpowered.anvil.datastore.UUID + +data class GameType( + val name: String, + val website: String, + override val id: UUID = Crypto.randomUUID(), + override val createdUtc: Instant = Clock.System.now(), // TODO: UTC now + override val updatedUtc: Instant = createdUtc, +) : DomainEntity { + companion object Repository : DomainEntity.Repository +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt new file mode 100644 index 000000000..1ce62e0e8 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt @@ -0,0 +1,16 @@ +package org.anvilpowered.anvil.entity + +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant +import org.anvilpowered.anvil.datastore.Crypto +import org.anvilpowered.anvil.datastore.UUID + +data class ServerNode( + val name: String, + val gameType: GameType, + override val id: UUID = Crypto.randomUUID(), + override val createdUtc: Instant = Clock.System.now(), // TODO: UTC now + override val updatedUtc: Instant = createdUtc, +) : DomainEntity { + companion object Repository : DomainEntity.Repository +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlatform.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlatform.kt new file mode 100644 index 000000000..846970b33 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlatform.kt @@ -0,0 +1,9 @@ +package org.anvilpowered.anvil.platform + +interface AgentPlatform { + val name: String + val gameVersion: String + val platformVersion: String + val isProxy: Boolean + val plugins: List +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlugin.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlugin.kt new file mode 100644 index 000000000..54cf133b7 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlugin.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.platform + +interface AgentPlugin { + val name: String +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/UniversalPlugin.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/UniversalPlugin.kt new file mode 100644 index 000000000..f927730a3 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/UniversalPlugin.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.platform + +interface UniversalPlugin { + val name: String +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Audience.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Audience.kt new file mode 100644 index 000000000..0170ddcb6 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Audience.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.user + +expect interface Audience { + open fun sendMessage(message: Component) +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/CommandSource.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/CommandSource.kt new file mode 100644 index 000000000..fab52f6e6 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/CommandSource.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.user + +interface CommandSource : Audience, PermissionSubject diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Component.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Component.kt new file mode 100644 index 000000000..46220640f --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Component.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.user + +expect interface Component diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/PermissionSubject.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/PermissionSubject.kt new file mode 100644 index 000000000..329d3ea54 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/PermissionSubject.kt @@ -0,0 +1,17 @@ +package org.anvilpowered.anvil.user + +interface PermissionSubject { + + /** + * Checks if the subject has the specified permission. + * + * - A value of `true` indicates that the subject has the permission explicitly set. + * - A value of `false` indicates that the subject has the permission explicitly set to false. + * - A value of `null` indicates that the subject does not have the permission explicitly set. + */ + fun hasPermission(permission: String): Boolean? +} + +fun PermissionSubject.hasPermissionSet(permission: String): Boolean = hasPermission(permission) == true +fun PermissionSubject.hasPermissionUnset(permission: String): Boolean = hasPermission(permission) == null +fun PermissionSubject.hasPermissionNotSet(permission: String): Boolean = hasPermission(permission) == false diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt new file mode 100644 index 000000000..e71af3fe9 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.user + +interface Player : CommandSource { + val user: User +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt similarity index 61% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt rename to core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt index 747fd9bc0..f68a6dd61 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt @@ -1,5 +1,5 @@ package org.anvilpowered.anvil.user -interface User { +interface User : PermissionSubject { val name: String } diff --git a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt b/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt new file mode 100644 index 000000000..95e4d9abe --- /dev/null +++ b/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt @@ -0,0 +1,9 @@ +package org.anvilpowered.anvil.datastore + +actual typealias UUID = String + +@JsName("crypto") +actual external object Crypto { + actual fun randomUUID(): UUID +} + diff --git a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Audience.kt b/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Audience.kt new file mode 100644 index 000000000..332b771db --- /dev/null +++ b/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Audience.kt @@ -0,0 +1,6 @@ +package org.anvilpowered.anvil.user + +actual interface Audience { + actual fun sendMessage(message: Component) { + } +} diff --git a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Component.kt b/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Component.kt new file mode 100644 index 000000000..ba4b2afc5 --- /dev/null +++ b/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Component.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.user + +actual interface Component diff --git a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt b/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt new file mode 100644 index 000000000..6534ac31b --- /dev/null +++ b/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt @@ -0,0 +1,10 @@ +package org.anvilpowered.anvil.datastore + +actual typealias UUID = java.util.UUID + +actual object Crypto { + actual fun randomUUID(): UUID = UUID.randomUUID() +} + +fun foo() { +} diff --git a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Audience.kt b/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Audience.kt new file mode 100644 index 000000000..847254f78 --- /dev/null +++ b/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Audience.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.user + +actual typealias Audience = net.kyori.adventure.audience.Audience diff --git a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Component.kt b/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Component.kt new file mode 100644 index 000000000..32413ae0c --- /dev/null +++ b/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Component.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.user + +actual typealias Component = net.kyori.adventure.text.Component diff --git a/core/web/build.gradle.kts b/core/web/build.gradle.kts new file mode 100644 index 000000000..8e23cf0d2 --- /dev/null +++ b/core/web/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + id("kotlin-jvm.base-conventions") + alias(libs.plugins.ktor) + application +} + +application { + mainClass.set("io.ktor.server.netty.EngineMain") +} + +dependencies { + commonMainImplementation(project(":anvil-core-domain")) + jvmMainImplementation(libs.bundles.ktor.client) + jvmMainImplementation(libs.bundles.ktor.server) +} diff --git a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/AddAgent.kt b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/AddAgent.kt new file mode 100644 index 000000000..f1f052d08 --- /dev/null +++ b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/AddAgent.kt @@ -0,0 +1,9 @@ +package org.anvilpowered.anvil.web + +import org.anvilpowered.anvil.datastore.GameTypeRepositoryActions +import org.anvilpowered.anvil.entity.GameType +import java.util.UUID + +suspend fun GameTypeRepositoryActions.bar() { + GameType.findById(UUID.randomUUID()) +} diff --git a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Foo.kt b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Foo.kt new file mode 100644 index 000000000..54df5f648 --- /dev/null +++ b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Foo.kt @@ -0,0 +1,4 @@ +package org.anvilpowered.anvil.web + +class Foo { +} diff --git a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Main.kt b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Main.kt new file mode 100644 index 000000000..4d1730eb0 --- /dev/null +++ b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Main.kt @@ -0,0 +1,15 @@ +package org.anvilpowered.anvil.web + +import io.ktor.server.application.Application +import io.ktor.server.application.call +import io.ktor.server.response.respondText +import io.ktor.server.routing.get +import io.ktor.server.routing.routing + +fun Application.main() { + routing { + get("/") { + call.respondText("Hello, world!") + } + } +} diff --git a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/web-platforms.kt b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/web-platforms.kt new file mode 100644 index 000000000..dd3f79159 --- /dev/null +++ b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/web-platforms.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.web + +object WebClient + +object WebServer diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts deleted file mode 100644 index 163ce308c..000000000 --- a/domain/build.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -plugins { - id("kotlin-js.base-conventions") - id("kotlin-jvm.base-conventions") -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eac6271fd..5b0c16887 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,17 +1,24 @@ [versions] -kmongo = "4.8.0" -kotlin = "1.8.0" -ktor = "2.2.2" +#kmongo = "4.8.0" +kotlin = "1.8.20" +ktor = "2.2.4" +log4j = "2.20.0" + [libraries] -coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2" +adventure-bom = "net.kyori:adventure-bom:4.12.0" annotations = "org.jetbrains:annotations:24.0.0" -kmongo-core = { module = "org.litote.kmongo:kmongo", version.ref = "kmongo" } -kmongo-async = { module = "org.litote.kmongo:kmongo-async", version.ref = "kmongo" } -kmongo-coroutine = { module = "org.litote.kmongo:kmongo-coroutine-serialization", version.ref = "kmongo" } +brigadier = "com.mojang:brigadier:1.0.18" +coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0-Beta" +exposed-bom = "org.jetbrains.exposed:exposed-bom:0.41.1" +exposed-core = { module = "org.jetbrains.exposed:exposed-core" } +exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } +exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc" } +exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time" } kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" -kotlinx-serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" +kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.0" +kotlinx-serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0" ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" } ktor-serialization = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } ktor-server-auth = { module = "io.ktor:ktor-server-auth", version.ref = "ktor" } @@ -21,12 +28,21 @@ ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" ktor-server-resources = { module = "io.ktor:ktor-server-resources", version.ref = "ktor" } ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = "ktor" } ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" } +logging-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } +logging-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.5.5" +velocity = "com.velocitypowered:velocity-api:3.1.1" + +[bundles] +exposed = ["exposed-core", "exposed-dao", "exposed-jdbc", "exposed-java-time"] +ktor-client = ["ktor-client-cio", "ktor-serialization"] +ktor-server = ["ktor-server-auth", "ktor-server-content-negotiation", "ktor-server-cors", "ktor-server-netty", "ktor-server-resources", "ktor-server-sessions", "ktor-server-status-pages"] [plugins] kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } -ktlint = "org.jlleitschuh.gradle.ktlint:11.0.0" -shadow = "com.github.johnrengelman.shadow:7.1.2" +ktlint = "org.jlleitschuh.gradle.ktlint:11.3.1" +shadow = "com.github.johnrengelman.shadow:8.1.0" sponge = "org.spongepowered.gradle.plugin:2.1.1" +ktor = { id = "io.ktor.plugin", version.ref = "ktor" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..ccebba7710deaf9f98673a68957ea02138b60d0a 100644 GIT binary patch delta 5094 zcmZu#c|6qH|DG9RA4`noBZNWrC2N)tSqjO%%aX0^O4dPAB*iC6_9R<`apl^#h-_oY z)(k_0v8Fxp{fyi9-uwN%e)GpU&v~BrS>~KG^PF=MNmQjIDr&QHR7f-kM{%U_u*1=5 zGC}ae5(^Rrg9QY8$x^}oiJ0d2O9YW{J~$dD1ovlvh&0B4L)!4S=z;Hac>K{#9q9cKq;>>BtKo1!+gw`yqE zSK8x^jC|B!qmSW#uyb@T^CkB9qRd{N3V-rEi}AEgoU_J27lw_0X`}c0&m9JhxM;RK z54_gdZ(u?R5`B3}NeVal2NTHqlktM`2eTF28%6BZCWW$-shf0l-BOVSm)hU58MTPy zDcY-5777j;ccU!Yba8wH=X6OdPJ8O5Kp^3gUNo>!b=xb6T2F&LiC2eBJj8KuLPW!4 zw3V^NnAKZm^D?tmliCvzi>UtoDH%V#%SM0d*NS+m%4}qO<)M1E{OpQ(v&ZNc`vdi| zEGlVi$Dgxy1p6+k0qGLQt(JwxZxLCZ4>wJ=sb0v%Ki?*+!ic_2exumn{%Co|| z-axdK#RUC;P|vqbe?L`K!j;sUo=uuR_#ZkRvBf%Txo6{OL&I(?dz?47Z(DcX3KTw> zGY%A=kX;fBkq$F^sX|-)1Qkg##+n-Ci{qJVPj@P?l_1Y`nD^v>fZ3HMX%(4p-TlD(>yWwJij!6Jw}l7h>CIm@Ou5B@$Wy`Ky*814%Mdi1GfG1zDG9NogaoVHHr4gannv4?w6g&10!j=lKM zFW;@=Z0}vAPAxA=R4)|`J??*$|Fh`5=ks*V7TapX`+=4n*{aXxRhh-EGX_Xrzjb4r zn0vO7Cc~wtyeM_8{**~9y7>+}1JV8Buhg%*hy|PUc#!vw#W(HFTL|BpM)U0>JxG6S zLnqn1!0++RyyJ>5VU<4mDv8>Q#{EtgS3mj7Hx}Zkr0tz1}h8Kn6q`MiwC z{Y#;D!-ndlImST(C@(*i5f0U(jD29G7g#nkiPX zki6M$QYX_fNH=E4_eg9*FFZ3wF9YAKC}CP89Kl(GNS(Ag994)0$OL4-fj_1EdR}ARB#-vP_$bWF`Qk58+ z4Jq*-YkcmCuo9U%oxGeYe7Be=?n}pX+x>ob(8oPLDUPiIryT8v*N4@0{s_VYALi;lzj19ivLJKaXt7~UfU|mu9zjbhPnIhG2`uI34urWWA9IO{ z_1zJ)lwSs{qt3*UnD}3qB^kcRZ?``>IDn>qp8L96bRaZH)Zl`!neewt(wjSk1i#zf zb8_{x_{WRBm9+0CF4+nE)NRe6K8d|wOWN)&-3jCDiK5mj>77=s+TonlH5j`nb@rB5 z5NX?Z1dk`E#$BF{`(D>zISrMo4&}^wmUIyYL-$PWmEEfEn-U0tx_vy$H6|+ zi{ytv2@JXBsot|%I5s74>W1K{-cvj0BYdNiRJz*&jrV9>ZXYZhEMULcM=fCmxkN&l zEoi=)b)Vazc5TQC&Q$oEZETy@!`Gnj`qoXl7mcwdY@3a-!SpS2Mau|uK#++@>H8QC zr2ld8;<_8We%@E?S=E?=e9c$BL^9X?bj*4W;<+B&OOe+3{<`6~*fC(=`TO>o^A(Y! zA`Qc1ky?*6xjVfR?ugE~oY`Gtzhw^{Z@E6vZ`mMRAp>Odpa!m zzWmtjT|Lj^qiZMfj%%un-o$Eu>*v12qF{$kCKai^?DF=$^tfyV%m9;W@pm-BZn_6b z{jsXY3!U`%9hzk6n7YyHY%48NhjI6jjuUn?Xfxe0`ARD_Q+T_QBZ{ zUK@!63_Wr`%9q_rh`N4=J=m;v>T{Y=ZLKN^m?(KZQ2J%|3`hV0iogMHJ} zY6&-nXirq$Yhh*CHY&Qf*b@@>LPTMf z(cMorwW?M11RN{H#~ApKT)F!;R#fBHahZGhmy>Sox`rk>>q&Y)RG$-QwH$_TWk^hS zTq2TC+D-cB21|$g4D=@T`-ATtJ?C=aXS4Q}^`~XjiIRszCB^cvW0OHe5;e~9D%D10 zl4yP4O=s-~HbL7*4>#W52eiG7*^Hi)?@-#*7C^X5@kGwK+paI>_a2qxtW zU=xV7>QQROWQqVfPcJ$4GSx`Y23Z&qnS?N;%mjHL*EVg3pBT{V7bQUI60jtBTS?i~ zycZ4xqJ<*3FSC6_^*6f)N|sgB5Bep(^%)$=0cczl>j&n~KR!7WC|3;Zoh_^GuOzRP zo2Hxf50w9?_4Qe368fZ0=J|fR*jO_EwFB1I^g~i)roB|KWKf49-)!N%Ggb%w=kB8)(+_%kE~G!(73aF=yCmM3Cfb9lV$G!b zoDIxqY{dH>`SILGHEJwq%rwh46_i`wkZS-NY95qdNE)O*y^+k#JlTEij8NT(Y_J!W zFd+YFoZB|auOz~A@A{V*c)o7E(a=wHvb@8g5PnVJ&7D+Fp8ABV z5`&LD-<$jPy{-y*V^SqM)9!#_Pj2-x{m$z+9Z*o|JTBGgXYYVM;g|VbitDUfnVn$o zO)6?CZcDklDoODzj+ti@i#WcqPoZ!|IPB98LW!$-p+a4xBVM@%GEGZKmNjQMhh)zv z7D){Gpe-Dv=~>c9f|1vANF&boD=Nb1Dv>4~eD636Lldh?#zD5{6JlcR_b*C_Enw&~ z5l2(w(`{+01xb1FCRfD2ap$u(h1U1B6e&8tQrnC}Cy0GR=i^Uue26Rc6Dx}!4#K*0 zaxt`a+px7-Z!^(U1WN2#kdN#OeR|2z+C@b@w+L67VEi&ZpAdg+8`HJT=wIMJqibhT ztb3PFzsq&7jzQuod3xp7uL?h-7rYao&0MiT_Bux;U*N#ebGv92o(jM2?`1!N2W_M* zeo9$%hEtIy;=`8z1c|kL&ZPn0y`N)i$Y1R9>K!el{moiy)014448YC#9=K zwO3weN|8!`5bU_#f(+ZrVd*9`7Uw?!q?yo&7sk&DJ;#-^tcCtqt5*A(V;&LdHq7Hg zI6sC@!ly9p$^@v&XDsgIuv;9#w^!C1n5+10-tEw~ZdO1kqMDYyDl!5__o}f3hYe2M zCeO)~m&&=JZn%cVH3HzPlcE`9^@``2u+!Y}Remn)DLMHc-h5A9ATgs;7F7=u2=vBlDRbjeYvyNby=TvpI{5nb2@J_YTEEEj4q<@zaGSC_i&xxD!6)d zG{1??({Ma<=Wd4JL%bnEXoBOU_0bbNy3p%mFrMW>#c zzPEvryBevZVUvT^2P&Zobk#9j>vSIW_t?AHy>(^x-Bx~(mvNYb_%$ZFg(s5~oka+Kp(GU68I$h(Vq|fZ zC_u1FM|S)=ldt#5q>&p4r%%p)*7|Rf0}B#-FwHDTo*|P6HB_rz%R;{==hpl#xTt@VLdSrrf~g^ z`IA8ZV1b`UazYpnkn28h&U)$(gdZ*f{n`&kH%Oy54&Z;ebjlh4x?JmnjFAALu}EG} zfGmQ$5vEMJMH`a=+*src#dWK&N1^LFxK9Sa#q_rja$JWra09we<2oL9Q9Sx)?kZFW z$jhOFGE~VcihYlkaZv8?uA7v$*}?2h6i%Qmgc4n~3E(O_`YCRGy~}`NFaj@(?Wz;GS_?T+RqU{S)eD1j$1Gr;C^m z7zDK=xaJ^6``=#Y-2ssNfdRqh0ntJrutGV5Nv&WI%3k1wmD5n+0aRe{0k^!>LFReN zx1g*E>nbyx03KU~UT6->+rG%(owLF=beJxK&a0F;ie1GZ^eKg-VEZb&=s&ajKS#6w zjvC6J#?b|U_(%@uq$c#Q@V_me0S1%)pKz9--{EKwyM}_gOj*Og-NEWLDF_oFtPjG; zXCZ7%#=s}RKr&_5RFN@=H(015AGl4XRN9Bc51`;WWt%vzQvzexDI2BZ@xP~^2$I&7 zA(ndsgLsmA*su8p-~IS q+ZJUZM}`4#Zi@l2F-#HCw*??ha2ta#9s8?H3%YId(*zJG6aF78h1yF1 delta 5107 zcmY*d1zc0@|J{HQlai7V5+f#EN-H%&UP4MFm6QgFfuJK4DG4u#ARsbQL4i>MB1q|w zmWd#pqd~BR-yN@ieE-|$^W1aKIZtf&-p_fyw{(Uwc7_sWYDh^12cY!qXvcPQ!qF;q@b0nYU7 zP&ht}K7j%}P%%|ffm;4F0^i3P0R`a!2wm89L5P3Kfu;tTZJre<{N5}AzsH+E3DS`Q zJLIl`LRMf`JOTBLf(;IV(9(h{(}dXK!cPoSLm(o@fz8vRz}6fOw%3}3VYOsCczLF` za2RTsCWa2sS-uw(6|HLJg)Xf@S8#|+(Z5Y)ER+v+8;btfB3&9sWH6<=U}0)o-jIts zsi?Nko;No&JyZI%@1G&zsG5kKo^Zd7rk_9VIUao9;fC~nv(T0F&Af0&Rp`?x94EIS zUBPyBe5R5#okNiB1Xe--q4|hPyGzhJ?Lurt#Ci09BQ+}rlHpBhm;EmfLw{EbCz)sg zgseAE#f$met1jo;`Z6ihk?O1be3aa$IGV69{nzagziA!M*~E5lMc(Sp+NGm2IUjmn zql((DU9QP~Tn1pt6L`}|$Na-v(P+Zg&?6bAN@2u%KiB*Gmf}Z)R zMENRJgjKMqVbMpzPO{`!J~2Jyu7&xXnTDW?V?IJgy+-35q1)-J8T**?@_-2H`%X+6f5 zIRv`uLp&*?g7L~6+3O*saXT~gWsmhF*FNKw4X$29ePKi02G*)ysenhHv{u9-y?_do ztT(Cu04pk>51n}zu~=wgToY5Cx|MTlNw}GR>+`|6CAhQn=bh@S<7N)`w};;KTywDU z=QWO@RBj$WKOXSgCWg{BD`xl&DS!G}`Mm3$)=%3jzO_C+s+mfTFH5JL>}*(JKs@MqX|o2b#ZBX5P;p7;c)$F1y4HwvJ?KA938$rd)gn_U^CcUtmdaBW57 zlPph>Fz&L`cSScFjcj+7Jif3vxb20Ag~FPstm?9#OrD$e?Y~#1osDB0CFZ9Mu&%iE zSj~wZpFqu6!k%BT)}$F@Z%(d-Pqy07`N8ch2F7z^=S-!r-@j{#&{SM@a8O$P#SySx zZLD_z=I300OCA1YmKV0^lo@>^)THfZvW}s<$^w^#^Ce=kO5ymAnk>H7pK!+NJ-+F7 z1Bb6Y=r)0nZ+hRXUyD+BKAyecZxb+$JTHK5k(nWv*5%2a+u*GDt|rpReYQ}vft zXrIt#!kGO85o^~|9Oc-M5A!S@9Q)O$$&g8u>1=ew?T35h8B{-Z_S78oe=E(-YZhBPe@Y1sUt63A-Cdv>D1nIT~=Rub6$?8g>meFb7Ic@w^%@RN2z72oPZ#Ta%b(P1|&6I z61iO<8hT*)p19Bgd0JgXP{^c{P2~K@^DIXv=dF(u|DFfqD^dMIl8-x)xKIpJRZru@ zDxicyYJG}mh}=1Dfg%B$#H`CiAxPTj^;f4KRMZHUz-_x6)lEq!^mu%72*PI=t$6{Uql#dqm4 zClgaN63!&?v*enz4k1sbaM+yCqUf+i9rw$(YrY%ir1+%cWRB<;r}$8si!6QcNAk~J zk3?dejBaC`>=T<=y=>QVt*4kL>SwYwn$(4ES793qaH)>n(axyV3R5jdXDh#e-N0K- zuUgk|N^|3*D1!Wlz-!M*b}Zc5=;K6I+>1N$&Q%)&8LWUiTYi&aQIj(luA< zN5R<8Y8L#*i0xBio$jWcaiZ4S2w3#R@CGemesy~akKP)2GojQF6!$}!_RdUJPBevX zG#~uz%Yirb0@1wgQ;ayb=qD}6{=QXxjuZQ@@kxbN!QWhtEvuhS2yAZe8fZy6*4Inr zdSyR9Dec4HrE|I=z-U;IlH;_h#7e^Hq}gaJ<-z^}{*s!m^66wu2=(*EM0UaV*&u1q zJrq!K23TO8a(ecSQFdD$y+`xu)Xk36Z*;1i{hS=H2E<8<5yHuHG~22-S+Jq|3HMAw z%qBz3auT=M!=5F|Wqke|I^E8pmJ-}>_DwX5w%d3MSdC>xW%$ocm8w8HRdZ|^#cEt1 zM*I7S6sLQq;;Mecet(Q()+?s+&MeVLOvx}(MkvytkvLHl7h*N0AT1#AqC&(he(^%przH`KqA$z_dAvJJb409@F)fYwD$JW_{_Oie8!@VdJE zU>D$@B?LawAf5$;`AZ1E!krn=aAC%4+YQrzL!59yl1;|T2)u=RBYA8lk0Ek&gS!Rb zt0&hVuyhSa0}rpZGjTA>Gz}>Uv*4)F zf7S%D2nfA7x?gPEXZWk8DZimQs#xi0?So_k`2zb!UVQEAcbvjPLK9v>J~!awnxGpq zEh$EPOc4q&jywmglnC&D)1-P0DH!@)x;uJwMHdhPh>ZLWDw+p1pf52{X2dk{_|UOmakJa4MHu?CY`6Hhv!!d7=aNwiB5z zb*Wlq1zf^3iDlPf)b_SzI*{JCx2jN;*s~ra8NeB!PghqP!0po-ZL?0Jk;2~*~sCQ<%wU`mRImd)~!23RS?XJu|{u( ztFPy3*F=ZhJmBugTv48WX)4U*pNmm~4oD4}$*-92&<)n=R)5lT z-VpbEDk>(C1hoo#-H_u0`#%L6L$ zln(}h2*Cl(5(JtVM{YZ26@Fwmp;?Qt}9$_F%`?+-JHbC;bPZj8PLq9 zWo-KFw!i&r8WuA-!3F_m9!24Z(RhalAUR~_H#Ln=$%b5GY z)oB)zO%J5TY}&BXq^7#M>euVL%01Tzj4$6^ZOjT*7@zr~q@6GEjGi)nbwzSL`TiLN z{DVG~I$w@%^#tD{>1Ap@%=XogG_^Hvy_xiRn4yy?LKsC+ zU!S79X8orh&D%>1S`x2iyi&(iG&r#YT{}~iy(FIOo8?MZU#eo*c*(RjAGj@uDi zARJur)-*{n0PgW~&mFeg`MJ?(Kr;NUom)jh?ozZtyywN9bea6ikQlh}953Oul~N%4 z@Sx!@>?l1e7V*@HZMJx!gMo0TeXdU~#W6^n?YVQJ$)nuFRkvKbfwv_s*2g(!wPO|@ zvuXF=2MiPIX)A7x!|BthSa$GB%ECnuZe_Scx&AlnC z!~6C_SF24#@^VMIw)a-7{00}}Cr5NImPbW8OTIHoo6@NcxLVTna8<<;uy~YaaeMnd z;k_ynYc_8jQn9vW_W8QLkgaHtmwGC}wRcgZ^I^GPbz{lW)p#YYoinez1MjkY%6LBd z+Vr>j&^!?b-*Vk>8I!28o`r3w&^Lal8@=50zV4&9V9oXI{^r8;JmVeos&wf?O!;_o zk))^k*1fvYw9?WrS!sG2TcX`hH@Y3mF&@{i05;_AV{>Umi8{uZP_0W5_1V2yHU<)E z+qviK*7SJtnL;76{WK!?Pv$-!w$08<%8Qy|sB|P%GiV1<+dHw*sj!C~SjsB6+1L@so+Q~n# z+Uc5+Uz+mGmkR@>H7D*c?mm8WQz;3VOpktU_DeBi>3#@z zmLe;3gP<7KPy>~k47nEeT?G?7e2g6316Xdb_y+ja5C9Ayg6QTNr~&Kbs(1>7zp|f@le;9B z1e(+Ga%jPWR7oc}=XcB4$z?YD)l;%#U;}~gZzGViI=fwu9OAPCCK!0w>Ay^#$b49k zT&|M?JaIyRT<;@*t_jp1ifWPvL;{maf6o0T#X!#9YX;0Q;LTQ0}0tg^_Ru4pkSr4#P zmnW|D0`A#Ie6pEfBDv39=jN2;kiUoT6I&kChsbI!jMuY6zuZql5!&i%5!c zjsHlXtjT;NV?jAb`%vy)JOK_j1rponLqc>(2qgYlLPEs>|0QV<=Pw~C`fLFKJJitt zyC6003{rxCsmtGKjhB%W2W~*%vKH8l$pZoOFT*K@uL9%CD^3rh=ZtuTU1 zJpf4|%n^yjh#dKSSCJI8;YU*CD!8Wv20*e5`-fya^75@ADLU^RdHDg3Bk3k6)dGi7 z!!z;|O1h$8q!vO*w6 I6Xdi10eY*&F8}}l diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bdc9a83b1..7161bf2bc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-rc-1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d6..79a61d421 100755 --- a/gradlew +++ b/gradlew @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac diff --git a/settings.gradle.kts b/settings.gradle.kts index 068c53915..ace5967a4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,8 @@ dependencyResolutionManagement { // repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { mavenCentral() + maven("https://libraries.minecraft.net") + maven("https://repo.papermc.io/repository/maven-public/") // maven("https://repo.spongepowered.org/repository/maven-public/") } } @@ -20,12 +22,19 @@ rootProject.name = "anvil" sequenceOf( "agent", - "agent-sponge", - "agent-velocity", - "domain", - "server", - "server-impl", - "ui", + "agent-application", + "agent-infrastructure", + "agent-mc-sponge", + "agent-mc-velocity", + "cockpit", + "cockpit-application", + "cockpit-backend", + "cockpit-domain", + "cockpit-ui", + "core", + "core-db", + "core-domain", + "core-web", ).forEach { val project = ":anvil-$it" include(project) From 2a14346d6ee8c98d309c639c2ed4e0aa19759d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 7 Apr 2023 23:19:44 +0200 Subject: [PATCH 14/77] Add kontour and fix other stuff --- agent/application/build.gradle.kts | 9 ++-- agent/mc/sponge/build.gradle.kts | 1 - authors | 1 + .../src/main/kotlin/anvil-publish.gradle.kts | 43 ++++++++++++++++++ build.gradle.kts | 1 - ...oryActionsImpl.kt => GameTypeScopeImpl.kt} | 19 ++++---- .../anvil/datastore/RepositoryExtensions.kt | 2 +- .../anvil/datastore/ServerNodeScopeImpl.kt | 45 +++++++++++++++++++ .../anvilpowered/anvil/entity/AnvilTable.kt | 5 +-- .../anvilpowered/anvil/entity/GameTypes.kt | 18 +++----- .../anvil/entity/MinecraftUsers.kt | 22 +++++++++ .../anvilpowered/anvil/entity/ServerNodes.kt | 24 +++++----- .../org/anvilpowered/anvil/entity/Users.kt | 22 +++++---- core/domain/build.gradle.kts | 2 + .../anvil/datastore/GameTypeJoin.kt | 9 ++++ .../datastore/GameTypeRepositoryActions.kt | 11 ----- .../anvil/datastore/GameTypeScope.kt | 17 +++++++ .../anvil/datastore/RepositoryActions.kt | 12 ----- .../datastore/ServerNodeRepositoryActions.kt | 9 ---- .../anvil/datastore/ServerNodeScope.kt | 16 +++++++ .../org/anvilpowered/anvil/datastore/UUID.kt | 7 --- .../anvilpowered/anvil/entity/DomainEntity.kt | 12 ----- .../org/anvilpowered/anvil/entity/GameType.kt | 16 ++++--- .../anvil/entity/MinecraftUser.kt | 20 +++++++++ .../anvilpowered/anvil/entity/ServerNode.kt | 16 ++++--- .../org/anvilpowered/anvil/entity/User.kt | 22 +++++++++ .../org/anvilpowered/anvil/datastore/UUID.kt | 9 ---- .../org/anvilpowered/anvil/datastore/UUID.kt | 10 ----- gradle/libs.versions.toml | 1 + gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 1 + 31 files changed, 269 insertions(+), 135 deletions(-) create mode 100644 authors create mode 100644 build-logic/src/main/kotlin/anvil-publish.gradle.kts rename core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/{GameTypeRepositoryActionsImpl.kt => GameTypeScopeImpl.kt} (62%) create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeJoin.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActions.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryActions.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeRepositoryActions.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/DomainEntity.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUser.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt delete mode 100644 core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt delete mode 100644 core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt diff --git a/agent/application/build.gradle.kts b/agent/application/build.gradle.kts index 7730ff1fa..13af9d4a3 100644 --- a/agent/application/build.gradle.kts +++ b/agent/application/build.gradle.kts @@ -1,11 +1,12 @@ plugins { id("kotlin-jvm.base-conventions") + id("anvil-publish") } dependencies { commonMainApi(project(":anvil-core-domain")) - jvmMainImplementation(libs.brigadier) - jvmMainImplementation(platform(libs.adventure.bom)) - jvmMainImplementation("net.kyori:adventure-api") - jvmMainImplementation(libs.logging.api) + jvmMainApi(libs.brigadier) + jvmMainApi(platform(libs.adventure.bom)) + jvmMainApi("net.kyori:adventure-api") + jvmMainApi(libs.logging.api) } diff --git a/agent/mc/sponge/build.gradle.kts b/agent/mc/sponge/build.gradle.kts index 13e6a4969..68e2138cd 100644 --- a/agent/mc/sponge/build.gradle.kts +++ b/agent/mc/sponge/build.gradle.kts @@ -1,6 +1,5 @@ import org.spongepowered.gradle.plugin.config.PluginLoaders -@Suppress("DSL_SCOPE_VIOLATION") // https://youtrack.jetbrains.com/issue/KTIJ-19369 plugins { id("kotlin-jvm.base-conventions") alias(libs.plugins.sponge) diff --git a/authors b/authors new file mode 100644 index 000000000..6f52bd28f --- /dev/null +++ b/authors @@ -0,0 +1 @@ +alexstaeding,Alexander Städing diff --git a/build-logic/src/main/kotlin/anvil-publish.gradle.kts b/build-logic/src/main/kotlin/anvil-publish.gradle.kts new file mode 100644 index 000000000..0b636324a --- /dev/null +++ b/build-logic/src/main/kotlin/anvil-publish.gradle.kts @@ -0,0 +1,43 @@ +import java.net.URI + +plugins { + `maven-publish` +} + +extensions.configure { + repositories { + maven { + credentials { + username = project.findProperty("sonatypeUsername") as? String + password = project.findProperty("sonatypePassword") as? String + } + val releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" + val snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots" + url = URI(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl) + } + } + publications.withType { + pom { + name.set("anvil") + url.set("https://www.anvilpowered.org") + scm { + url.set("https://github.com/anvilpowered/anvil") + connection.set("scm:git:https://github.com/anvilpowered/anvil.git") + developerConnection.set("scm:git:https://github.com/anvilpowered/anvil.git") + } + licenses { + license { + name.set("GNU AFFERO GENERAL PUBLIC LICENSE Version 3") + url.set("https://www.gnu.org/licenses/agpl-3.0.html") + distribution.set("repo") + } + } + developers { + rootProject.file("authors").readLines() + .asSequence() + .map { it.split(",") } + .forEach { (_id, _name) -> developer { id.set(_id); name.set(_name) } } + } + } + } +} diff --git a/build.gradle.kts b/build.gradle.kts index cf1b0e700..8180dc248 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,5 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -@Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.ktlint) diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActionsImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt similarity index 62% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActionsImpl.kt rename to core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt index 641d46246..1711067dc 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActionsImpl.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt @@ -1,6 +1,5 @@ package org.anvilpowered.anvil.datastore -import org.anvilpowered.anvil.entity.DomainEntity import org.anvilpowered.anvil.entity.GameType import org.anvilpowered.anvil.entity.GameTypes import org.anvilpowered.anvil.entity.setValuesFrom @@ -10,21 +9,23 @@ import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.deleteWhere import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID -class GameTypeRepositoryActionsImpl : GameTypeRepositoryActions { +internal object GameTypeScopeImpl : GameTypeScope { - override suspend fun DomainEntity.Repository.save(item: GameType): GameType = + override suspend fun DomainEntity.Repository.create(item: GameType.CreateDto): GameType = newSaveTransaction(GameTypes, { setValuesFrom(item) }, ResultRow::toGameType) - override suspend fun DomainEntity.Repository.findById(uuid: UUID): GameType? = - newSuspendedTransaction { GameTypes.select(GameTypes.id eq uuid).firstOrNull()?.toGameType() } + override suspend fun DomainEntity.Repository.findById(id: UUID): GameType? = + newSuspendedTransaction { GameTypes.select(GameTypes.id eq id).firstOrNull()?.toGameType() } - override suspend fun DomainEntity.Repository<*>.deleteById(uuid: UUID): Boolean = - newSuspendedTransaction { GameTypes.deleteWhere { GameTypes.id eq uuid } > 0 } + override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean = + newSuspendedTransaction { GameTypes.deleteWhere { GameTypes.id eq id } > 0 } - override suspend fun DomainEntity.Repository.findByName(name: String): GameType? = + override suspend fun DomainEntity.Repository.findByName(name: String): GameType? = newSuspendedTransaction { GameTypes.select(GameTypes.name eq name).firstOrNull()?.toGameType() } - override suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? = + override suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? = newSuspendedTransaction { GameTypes.select(GameTypes.website eq website).firstOrNull()?.toGameType() } } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt index 7efa1b057..71f690d71 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt @@ -1,11 +1,11 @@ package org.anvilpowered.anvil.datastore -import org.anvilpowered.anvil.entity.DomainEntity import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.Table import org.jetbrains.exposed.sql.insert import org.jetbrains.exposed.sql.statements.InsertStatement import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.DomainEntity internal suspend fun newSaveTransaction( table: T, diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt new file mode 100644 index 000000000..60a6a7e3d --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt @@ -0,0 +1,45 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.entity.* +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.mapLazy +import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.UUID + +internal object ServerNodeScopeImpl : ServerNodeScope { + + override suspend fun DomainEntity.Repository.findById(id: UUID): ServerNode? = + newSuspendedTransaction { + (ServerNodes innerJoin GameTypes).select { ServerNodes.id eq id }.firstOrNull()?.toServerNode() + } + + override fun DomainEntity.Repository.findByGameType(): GameTypeJoin> = GameTypeJoinImpl + + override suspend fun DomainEntity.Repository.create(item: ServerNode.CreateDto): ServerNode = + newSaveTransaction(ServerNodes, { setValuesFrom(item) }, ResultRow::toServerNode) + + override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean = + newSuspendedTransaction { ServerNodes.deleteWhere { ServerNodes.id eq id } > 0 } + + private object GameTypeJoinImpl : GameTypeJoin> { + override suspend fun id(id: UUID): SizedIterable = + newSuspendedTransaction { + (ServerNodes innerJoin GameTypes).select { GameTypes.id eq id }.mapLazy { it.toServerNode() } + } + + override suspend fun name(name: String): SizedIterable = + newSuspendedTransaction { + (ServerNodes innerJoin GameTypes).select { GameTypes.name eq name }.mapLazy { it.toServerNode() } + } + + override suspend fun website(website: String): SizedIterable = + newSuspendedTransaction { + (ServerNodes innerJoin GameTypes).select { GameTypes.website eq website }.mapLazy { it.toServerNode() } + } + } +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt index 7b414b0e0..5c5005d90 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt @@ -1,9 +1,8 @@ package org.anvilpowered.anvil.entity import org.jetbrains.exposed.dao.id.UUIDTable -import org.jetbrains.exposed.sql.javatime.timestamp abstract class AnvilTable(name: String) : UUIDTable(name) { - val createdUtc = timestamp("created_utc") - val updatedUtc = timestamp("updated_utc") // TODO: Make sure postgres updates this field +// val createdUtc = timestamp("created_utc") +// val updatedUtc = timestamp("updated_utc") // TODO: Make sure postgres updates this field } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt index 075cb0204..63ecb219e 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt @@ -1,6 +1,5 @@ package org.anvilpowered.anvil.entity -import kotlinx.datetime.toJavaInstant import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.statements.InsertStatement @@ -10,18 +9,13 @@ object GameTypes : AnvilTable("game_types") { } context(GameTypes) -fun InsertStatement<*>.setValuesFrom(gameType: GameType) { +fun InsertStatement<*>.setValuesFrom(gameType: GameType.CreateDto) { this[name] = gameType.name this[website] = gameType.website - this[id] = gameType.id - this[createdUtc] = gameType.createdUtc.toJavaInstant() - this[updatedUtc] = gameType.updatedUtc.toJavaInstant() } -fun ResultRow.toGameType(): GameType { - return GameType( - name = this[GameTypes.name], - website = this[GameTypes.website], - id = this[GameTypes.id].value, - ) -} +fun ResultRow.toGameType() = GameType( + name = this[GameTypes.name], + website = this[GameTypes.website], + id = this[GameTypes.id].value, +) diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt new file mode 100644 index 000000000..78e163f59 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt @@ -0,0 +1,22 @@ +package org.anvilpowered.anvil.entity + +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.statements.InsertStatement + +object MinecraftUsers : AnvilTable("minecraft_users") { + val username = varchar("name", 255).uniqueIndex() + val userId = reference("user_id", Users) +} + +context(MinecraftUsers) +fun InsertStatement<*>.setValuesFrom(minecraftUser: MinecraftUser.CreateDto) { + this[username] = minecraftUser.username + this[userId] = minecraftUser.userId + this[id] = minecraftUser.id +} + +fun ResultRow.toMinecraftUser() = MinecraftUser( + username = this[MinecraftUsers.username], + userId = this[MinecraftUsers.userId].value, + id = this[MinecraftUsers.id].value, +) diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt index fa048e918..e365f138c 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt @@ -1,21 +1,21 @@ package org.anvilpowered.anvil.entity -import org.jetbrains.exposed.dao.UUIDEntity -import org.jetbrains.exposed.dao.UUIDEntityClass -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.dao.id.UUIDTable -import java.util.UUID +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.statements.InsertStatement -object ServerNodes : UUIDTable("server_nodes") { +object ServerNodes : AnvilTable("server_nodes") { val name = varchar("name", 255).uniqueIndex() val gameTypeId = reference("game_type_id", GameTypes) } -class ServerNode(id: EntityID) : UUIDEntity(id) { - var name by ServerNodes.name - var gameTypeId by ServerNodes.gameTypeId - var gameType by GameTypeEntity referencedOn ServerNodes.gameTypeId - - companion object : UUIDEntityClass(ServerNodes, ServerNode::class.java, ::ServerNode) +context(ServerNodes) +fun InsertStatement<*>.setValuesFrom(serverNode: ServerNode.CreateDto) { + this[name] = serverNode.name + this[gameTypeId] = serverNode.gameTypeId } +fun ResultRow.toServerNode() = ServerNode( + name = this[ServerNodes.name], + gameType = toGameType(), + id = this[ServerNodes.id].value, +) diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt index 27008dcb0..72faa3fa7 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt @@ -1,18 +1,22 @@ package org.anvilpowered.anvil.entity -import org.jetbrains.exposed.dao.UUIDEntity -import org.jetbrains.exposed.dao.UUIDEntityClass -import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.UUIDTable -import java.util.UUID +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.statements.InsertStatement object Users : UUIDTable("users") { + val username = varchar("username", 255).uniqueIndex() val email = varchar("email", 255).uniqueIndex() - val minecraftUsername = varchar("minecraftUsername", 16).uniqueIndex() } -class User(id: EntityID) : UUIDEntity(id) { - companion object : UUIDEntityClass(Users, User::class.java, ::User) - var email by Users.email - var minecraftUsername by Users.minecraftUsername +context(Users) +fun InsertStatement<*>.setValuesFrom(user: User.CreateDto) { + this[username] = user.username + this[email] = user.email } + +fun ResultRow.toUser() = User( + username = this[Users.username], + email = this[Users.email], + id = this[Users.id].value, +) diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts index 4325510f6..6edf25420 100644 --- a/core/domain/build.gradle.kts +++ b/core/domain/build.gradle.kts @@ -1,10 +1,12 @@ plugins { id("kotlin-js.base-conventions") id("kotlin-jvm.base-conventions") + id("anvil-publish") } dependencies { commonMainApi(libs.kotlinx.datetime) + commonMainApi(libs.kontour) jvmMainApi(platform(libs.adventure.bom)) jvmMainApi("net.kyori:adventure-api") jvmMainApi(libs.coroutines) diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeJoin.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeJoin.kt new file mode 100644 index 000000000..1d0adc61a --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeJoin.kt @@ -0,0 +1,9 @@ +package org.anvilpowered.anvil.datastore + +import org.sourcegrade.kontour.UUID + +interface GameTypeJoin { + suspend fun id(id: UUID): R + suspend fun name(name: String): R + suspend fun website(website: String): R +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActions.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActions.kt deleted file mode 100644 index 220f00cf8..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeRepositoryActions.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.anvilpowered.anvil.datastore - -import org.anvilpowered.anvil.entity.DomainEntity -import org.anvilpowered.anvil.entity.GameType - -interface GameTypeRepositoryActions : RepositoryActions { - - suspend fun DomainEntity.Repository.findByName(name: String): GameType? - - suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? -} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt new file mode 100644 index 000000000..535ceda3f --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt @@ -0,0 +1,17 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.entity.GameType +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.scope.CreateScope +import org.sourcegrade.kontour.scope.DeleteScope +import org.sourcegrade.kontour.scope.FindScope + +interface GameTypeScope : + CreateScope, + FindScope, + DeleteScope { + + suspend fun DomainEntity.Repository.findByName(name: String): GameType? + + suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryActions.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryActions.kt deleted file mode 100644 index 266ac7bb8..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryActions.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.anvilpowered.anvil.datastore - -import org.anvilpowered.anvil.entity.DomainEntity - -interface RepositoryActions { - - suspend fun DomainEntity.Repository.save(item: T): T - - suspend fun DomainEntity.Repository.findById(uuid: UUID): T? - - suspend fun DomainEntity.Repository<*>.deleteById(uuid: UUID): Boolean -} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeRepositoryActions.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeRepositoryActions.kt deleted file mode 100644 index 06e830527..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeRepositoryActions.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.anvilpowered.anvil.datastore - -import org.anvilpowered.anvil.entity.DomainEntity -import org.anvilpowered.anvil.entity.ServerNode - -interface ServerNodeRepositoryActions : RepositoryActions { - - suspend fun DomainEntity.Repository.findByName(name: String): ServerNode? -} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt new file mode 100644 index 000000000..755e7bf37 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt @@ -0,0 +1,16 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.entity.ServerNode +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.scope.CreateScope +import org.sourcegrade.kontour.scope.DeleteScope +import org.sourcegrade.kontour.scope.FindScope + +interface ServerNodeScope : + CreateScope, + FindScope, + DeleteScope { + + fun DomainEntity.Repository.findByGameType(): GameTypeJoin> +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt deleted file mode 100644 index 8bc6b9db4..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.anvilpowered.anvil.datastore - -expect class UUID - -expect object Crypto { - fun randomUUID(): UUID -} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/DomainEntity.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/DomainEntity.kt deleted file mode 100644 index 4507e39c7..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/DomainEntity.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.anvilpowered.anvil.entity - -import kotlinx.datetime.Instant -import org.anvilpowered.anvil.datastore.UUID - -interface DomainEntity { - val id: UUID - val createdUtc: Instant - val updatedUtc: Instant - - interface Repository -} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt index 0a4325bd7..0ecb523e9 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt @@ -1,16 +1,20 @@ package org.anvilpowered.anvil.entity -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant -import org.anvilpowered.anvil.datastore.Crypto -import org.anvilpowered.anvil.datastore.UUID +import org.sourcegrade.kontour.Creates +import org.sourcegrade.kontour.Crypto +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID data class GameType( val name: String, val website: String, override val id: UUID = Crypto.randomUUID(), - override val createdUtc: Instant = Clock.System.now(), // TODO: UTC now - override val updatedUtc: Instant = createdUtc, ) : DomainEntity { + + data class CreateDto( + val name: String, + val website: String, + ) : Creates + companion object Repository : DomainEntity.Repository } diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUser.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUser.kt new file mode 100644 index 000000000..d3b88b7fe --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUser.kt @@ -0,0 +1,20 @@ +package org.anvilpowered.anvil.entity + +import org.sourcegrade.kontour.Creates +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID + +data class MinecraftUser( + val username: String, + val userId: UUID, + override val id: UUID, +) : DomainEntity { + + data class CreateDto( + val username: String, + val userId: UUID, + val id: UUID, + ) : Creates + + companion object Repository : DomainEntity.Repository +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt index 1ce62e0e8..06cc9c760 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt @@ -1,16 +1,20 @@ package org.anvilpowered.anvil.entity -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant -import org.anvilpowered.anvil.datastore.Crypto -import org.anvilpowered.anvil.datastore.UUID +import org.sourcegrade.kontour.Creates +import org.sourcegrade.kontour.Crypto +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID data class ServerNode( val name: String, val gameType: GameType, override val id: UUID = Crypto.randomUUID(), - override val createdUtc: Instant = Clock.System.now(), // TODO: UTC now - override val updatedUtc: Instant = createdUtc, ) : DomainEntity { + + data class CreateDto( + val name: String, + val gameTypeId: UUID, + ) : Creates + companion object Repository : DomainEntity.Repository } diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt new file mode 100644 index 000000000..72fc474d2 --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt @@ -0,0 +1,22 @@ +package org.anvilpowered.anvil.entity + +import org.sourcegrade.kontour.Creates +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID +import org.sourcegrade.kontour.action.FindActions + +data class User( + val username: String, + val email: String, + val minecraftUsers: List, + override val id: UUID, +) : DomainEntity { + + data class CreateDto( + val username: String, + val email: String, + ) : Creates + + companion object Repository : DomainEntity.Repository +} + diff --git a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt b/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt deleted file mode 100644 index 95e4d9abe..000000000 --- a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.anvilpowered.anvil.datastore - -actual typealias UUID = String - -@JsName("crypto") -actual external object Crypto { - actual fun randomUUID(): UUID -} - diff --git a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt b/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt deleted file mode 100644 index 6534ac31b..000000000 --- a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/UUID.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.anvilpowered.anvil.datastore - -actual typealias UUID = java.util.UUID - -actual object Crypto { - actual fun randomUUID(): UUID = UUID.randomUUID() -} - -fun foo() { -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5b0c16887..b5b5e1076 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,7 @@ exposed-core = { module = "org.jetbrains.exposed:exposed-core" } exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc" } exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time" } +kontour = "org.sourcegrade:kontour-domain:0.1.0-SNAPSHOT" kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.0" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7161bf2bc..0baedb4a3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-rc-1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-rc-3-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index ace5967a4..0e61a88dd 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,7 @@ dependencyResolutionManagement { // repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { + mavenLocal() mavenCentral() maven("https://libraries.minecraft.net") maven("https://repo.papermc.io/repository/maven-public/") From cb6ce62ea6941718e3378a3e60289d3985110d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 18 Apr 2023 00:14:22 +0200 Subject: [PATCH 15/77] Progress --- .gitignore | 8 +- agent/application/build.gradle.kts | 10 +- .../{AgentCommand.kt => AnvilCommand.kt} | 2 +- .../agent/command/AnvilPluginsCommand.kt | 13 ++- .../anvil/agent/command/ArgumentExtensions.kt | 27 ++++-- agent/mc/velocity/build.gradle.kts | 11 +-- .../anvil/agent/ExamplePlugin.java | 60 ++++++++++++ .../anvil/agent/AnvilVelocityPlugin.kt | 91 +++++++++++++++++-- .../kotlin-jvm.base-conventions.gradle.kts | 9 +- build.gradle.kts | 21 ++--- .../anvil/cockpit/usecase/gametype/create.kt | 10 -- .../anvil/datastore/GameTypeScopeImpl.kt | 18 ++++ core/domain/build.gradle.kts | 11 ++- .../kotlin/org/anvilpowered/anvil/Anvil.kt | 18 ++++ .../org/anvilpowered/anvil/entity/User.kt | 2 - gradle/libs.versions.toml | 8 +- 16 files changed, 242 insertions(+), 77 deletions(-) rename agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/{AgentCommand.kt => AnvilCommand.kt} (69%) create mode 100644 agent/mc/velocity/src/jvmMain/java/org/anvilpowered/anvil/agent/ExamplePlugin.java delete mode 100644 cockpit/application/src/jvmMain/kotlin/org/anvilpowered/anvil/cockpit/usecase/gametype/create.kt diff --git a/.gitignore b/.gitignore index c764c9366..9f803fb42 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ ### Intellij ### .idea/ *.iws -/out/ +out/ *.iml .idea_modules/ atlassian-ide-plugin.xml @@ -72,12 +72,10 @@ $RECYCLE.BIN/ ### Gradle ### .gradle -/build/ -out/ +# build/ already defined under netbeans gradle-app.setting !gradle-wrapper.jar .gradletasknamecache -.git/ - +### Kotlin/JS ### yarn.lock diff --git a/agent/application/build.gradle.kts b/agent/application/build.gradle.kts index 13af9d4a3..ec169329f 100644 --- a/agent/application/build.gradle.kts +++ b/agent/application/build.gradle.kts @@ -1,12 +1,14 @@ plugins { id("kotlin-jvm.base-conventions") id("anvil-publish") + alias(libs.plugins.shadow) + `java-library` } dependencies { + compileOnlyApi(platform(libs.adventure.bom)) commonMainApi(project(":anvil-core-domain")) - jvmMainApi(libs.brigadier) - jvmMainApi(platform(libs.adventure.bom)) - jvmMainApi("net.kyori:adventure-api") - jvmMainApi(libs.logging.api) + commonMainApi("net.kyori:adventure-api") // TODO: -> compileOnly ASAP +// compileOnlyApi(libs.logging.api) + commonMainApi(libs.kbrig.core) } diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AgentCommand.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilCommand.kt similarity index 69% rename from agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AgentCommand.kt rename to agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilCommand.kt index b8c9a7270..b779f7160 100644 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AgentCommand.kt +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilCommand.kt @@ -1,3 +1,3 @@ package org.anvilpowered.anvil.agent.command -object AgentCommand +object AnvilCommand diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt index 2bdde3b09..ea903dabd 100644 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt @@ -1,16 +1,19 @@ package org.anvilpowered.anvil.agent.command -import com.mojang.brigadier.builder.LiteralArgumentBuilder -import com.mojang.brigadier.tree.CommandNode import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.agent.platform.PluginManager import org.anvilpowered.anvil.user.CommandSource +import org.anvilpowered.kbrig.builder.LiteralArgumentBuilder +import org.anvilpowered.kbrig.builder.executesSingleSuccess +import org.anvilpowered.kbrig.tree.LiteralCommandNode context(PluginManager.Scope) -fun createPlugins(): CommandNode = - LiteralArgumentBuilder.literal("plugins") +fun AnvilCommand.createPlugins(): LiteralCommandNode { + return LiteralArgumentBuilder("plugins") .requiresPermission("anvil.agent.plugins") .executesSingleSuccess { context -> val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } - context.source.sendMessage(Component.text("Plugins: $pluginNamesString")) + context.source.sendMessage(Component.text("Plugins: $pluginNamesString").color(NamedTextColor.AQUA)) }.build() +} diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt index 1d6fe6757..9281f2fe0 100644 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt @@ -1,15 +1,26 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.agent.command -import com.mojang.brigadier.builder.ArgumentBuilder -import com.mojang.brigadier.context.CommandContext import org.anvilpowered.anvil.user.CommandSource import org.anvilpowered.anvil.user.hasPermissionSet +import org.anvilpowered.kbrig.builder.ArgumentBuilder internal fun > T.requiresPermission(permission: String): T = requires { it.hasPermissionSet(permission) } - -internal fun > T.executesSingleSuccess(block: (CommandContext) -> Unit) = - executes { context -> - block(context) - 1 - } diff --git a/agent/mc/velocity/build.gradle.kts b/agent/mc/velocity/build.gradle.kts index 3626b9e1b..21af5ade1 100644 --- a/agent/mc/velocity/build.gradle.kts +++ b/agent/mc/velocity/build.gradle.kts @@ -4,13 +4,8 @@ plugins { } dependencies { - commonMainApi(project(":anvil-agent-application")) - jvmMainImplementation(libs.velocity) + jvmMainApi(project(":anvil-agent-application")) + jvmMainCompileOnly(libs.velocity) kapt(libs.velocity) -} - -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(11)) - } + commonMainImplementation(libs.kbrig.brigadier) } diff --git a/agent/mc/velocity/src/jvmMain/java/org/anvilpowered/anvil/agent/ExamplePlugin.java b/agent/mc/velocity/src/jvmMain/java/org/anvilpowered/anvil/agent/ExamplePlugin.java new file mode 100644 index 000000000..19e2ab537 --- /dev/null +++ b/agent/mc/velocity/src/jvmMain/java/org/anvilpowered/anvil/agent/ExamplePlugin.java @@ -0,0 +1,60 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.agent; + +import com.google.inject.Inject; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.velocitypowered.api.command.BrigadierCommand; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.proxy.ProxyServer; +import net.kyori.adventure.text.Component; +import org.anvilpowered.anvil.user.MyCommandSource; +import org.anvilpowered.kbrig.brigadier.BrigadierConverter; +import org.anvilpowered.kbrig.tree.SourceConverter; + +public class ExamplePlugin { + + @Inject + private ProxyServer proxyServer; + + @Subscribe + void onProxyInit(ProxyInitializeEvent event) { +class BridgeSource implements MyCommandSource { + private final CommandSource velocityCommandSource; + + BridgeSource(CommandSource velocityCommandSource) { + this.velocityCommandSource = velocityCommandSource; + } + + public void sendMessage(Component message) { + velocityCommandSource.sendMessage(message); + } +} + +final LiteralCommandNode mappedSourceNode = + BrigadierConverter.toBrigadier( + SourceConverter.mapSource(CustomCommand.createPing(), BridgeSource::new) + ); + +proxyServer.getCommandManager().register(new BrigadierCommand(mappedSourceNode)); + + } +} diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt index fdf322f26..b5c3f3702 100644 --- a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt +++ b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt @@ -1,14 +1,36 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.agent import com.google.inject.Inject +import com.velocitypowered.api.command.BrigadierCommand +import com.velocitypowered.api.command.CommandSource +import com.velocitypowered.api.event.Subscribe +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent +import com.velocitypowered.api.permission.Tristate import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.proxy.ProxyServer -import com.velocitypowered.api.proxy.server.RegisteredServer -import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.future.asDeferred -import kotlinx.coroutines.runBlocking +import net.kyori.adventure.text.Component +import org.anvilpowered.anvil.agent.command.createPingCommand +import org.anvilpowered.kbrig.brigadier.toBrigadier +import org.anvilpowered.kbrig.tree.mapSource import org.slf4j.Logger -import kotlin.jvm.optionals.getOrNull @Plugin( id = "anvil-agent", @@ -20,7 +42,62 @@ class AnvilVelocityPlugin @Inject constructor( private val proxyServer: ProxyServer, private val logger: Logger, ) { - init { - logger.info("Hello, world from anvil-agent!") + + @Subscribe + fun onProxyInit(event: ProxyInitializeEvent) { + logger.info("Anvil Agent is running!") +// val pluginManager = object : PluginManager { +// override val plugins: List +// get() = proxyServer.pluginManager.plugins.map { +// object : AgentPlugin { +// override val name: String +// get() = it.description.id!! +// } +// } +// } +// val scope = object : PluginManager.Scope { +// override val pluginManager: PluginManager +// get() = pluginManager +// } +// registerCommands(scope) +// logger.info("Registered commands") + + class BridgeSource(private val velocityCommandSource: CommandSource) : MyCommandSource { + override fun sendMessage(message: Component) = velocityCommandSource.sendMessage(message) + } + + val commandNode = createPingCommand() + .mapSource<_, CommandSource> { BridgeSource(it) } + .toBrigadier() + + proxyServer.commandManager.register(BrigadierCommand(commandNode)) + + + + } + +// private fun registerCommands(pluginManagerScope: PluginManager.Scope) { +// with(pluginManagerScope) { +// proxyServer.commandManager.register( +// BrigadierCommand( +// AnvilCommand.createPlugins() +// .mapSource<_, VelocityCommandSource> { BridgeSource(it) } +// .toBrigadier(), +// ), +// ) +// } +// } +} + +//class BridgeSource(private val original: VelocityCommandSource) : ForwardingAudience.Single, MyCommandSource { +// override fun audience(): Audience = original +// override fun hasPermission(permission: String): Boolean? = original.getPermissionValue(permission).toBoolean() +//} + +fun Tristate.toBoolean(): Boolean? { + return when (this) { + Tristate.TRUE -> true + Tristate.FALSE -> false + Tristate.UNDEFINED -> null } } diff --git a/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts b/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts index 5dc11d1a0..4c2a04019 100644 --- a/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts @@ -4,14 +4,7 @@ extensions.getByName("kotlin").apply { jvm { withJava() compilations.all { - kotlinOptions { - jvmTarget = "17" - freeCompilerArgs = listOf("-Xcontext-receivers") - } + jvmToolchain(17) } } } - -dependencies { - "jvmMainImplementation"(kotlin("reflect")) -} diff --git a/build.gradle.kts b/build.gradle.kts index 8180dc248..2b1b0b993 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - plugins { alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.ktlint) @@ -16,15 +14,16 @@ allprojects { project.findProperty("buildNumber") ?.takeIf { version.toString().contains("SNAPSHOT") } ?.also { version = version.toString().replace("SNAPSHOT", "RC$it") } - tasks { - withType { - kotlinOptions.jvmTarget = "17" - kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" - } - withType { - options.encoding = "UTF-8" - targetCompatibility = "17" - sourceCompatibility = "17" + kotlin { + targets.all { + compilations.all { + kotlinOptions { + freeCompilerArgs += listOf( + "-opt-in=kotlin.RequiresOptIn", + "-Xcontext-receivers", + ) + } + } } } } diff --git a/cockpit/application/src/jvmMain/kotlin/org/anvilpowered/anvil/cockpit/usecase/gametype/create.kt b/cockpit/application/src/jvmMain/kotlin/org/anvilpowered/anvil/cockpit/usecase/gametype/create.kt deleted file mode 100644 index 0e38b8076..000000000 --- a/cockpit/application/src/jvmMain/kotlin/org/anvilpowered/anvil/cockpit/usecase/gametype/create.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.anvilpowered.anvil.cockpit.usecase.gametype - -import org.anvilpowered.anvil.entity.GameType - -suspend fun GameType.Companion.create( - name: String, - website: String, -) { - -} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt index 1711067dc..dab306eb9 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.datastore import org.anvilpowered.anvil.entity.GameType diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts index 6edf25420..56a69e729 100644 --- a/core/domain/build.gradle.kts +++ b/core/domain/build.gradle.kts @@ -2,13 +2,16 @@ plugins { id("kotlin-js.base-conventions") id("kotlin-jvm.base-conventions") id("anvil-publish") + `java-library` } dependencies { commonMainApi(libs.kotlinx.datetime) - commonMainApi(libs.kontour) - jvmMainApi(platform(libs.adventure.bom)) - jvmMainApi("net.kyori:adventure-api") - jvmMainApi(libs.coroutines) + commonMainApi(libs.kontour) { + exclude("org.slf4j") + } + commonMainApi(libs.coroutines) + compileOnlyApi(platform(libs.adventure.bom)) + compileOnlyApi("net.kyori:adventure-api") jsMainImplementation(npm("uuid", "9.0.0")) } diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt index 5e225ba95..21b1f80e9 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil interface Anvil { diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt index 72fc474d2..b0d57c559 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt @@ -3,7 +3,6 @@ package org.anvilpowered.anvil.entity import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.UUID -import org.sourcegrade.kontour.action.FindActions data class User( val username: String, @@ -19,4 +18,3 @@ data class User( companion object Repository : DomainEntity.Repository } - diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b5b5e1076..4df55194b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,17 +4,17 @@ kotlin = "1.8.20" ktor = "2.2.4" log4j = "2.20.0" - [libraries] adventure-bom = "net.kyori:adventure-bom:4.12.0" annotations = "org.jetbrains:annotations:24.0.0" -brigadier = "com.mojang:brigadier:1.0.18" coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0-Beta" exposed-bom = "org.jetbrains.exposed:exposed-bom:0.41.1" exposed-core = { module = "org.jetbrains.exposed:exposed-core" } exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc" } exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time" } +kbrig-brigadier = "org.anvilpowered:kbrig-brigadier:0.1.0-SNAPSHOT" +kbrig-core = "org.anvilpowered:kbrig-core:0.1.0-SNAPSHOT" kontour = "org.sourcegrade:kontour-domain:0.1.0-SNAPSHOT" kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" @@ -31,8 +31,8 @@ ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" } logging-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } logging-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } -redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.5.5" -velocity = "com.velocitypowered:velocity-api:3.1.1" +redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.6.1" +velocity = "com.velocitypowered:velocity-api:3.2.0-SNAPSHOT" [bundles] exposed = ["exposed-core", "exposed-dao", "exposed-jdbc", "exposed-java-time"] From ab7b91fa5a69e5d81432f29e32a38575dcad7197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 21 Apr 2023 11:09:51 +0200 Subject: [PATCH 16/77] Renamed some stuff and fix dependencies --- agent/application/build.gradle.kts | 4 ++-- .../anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt | 2 +- .../anvilpowered/anvil/agent/command/ArgumentExtensions.kt | 2 +- .../jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt | 4 ++-- .../org/anvilpowered/anvil/entity/{User.kt => AnvilUser.kt} | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) rename core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/{User.kt => AnvilUser.kt} (76%) diff --git a/agent/application/build.gradle.kts b/agent/application/build.gradle.kts index ec169329f..869699bc5 100644 --- a/agent/application/build.gradle.kts +++ b/agent/application/build.gradle.kts @@ -6,9 +6,9 @@ plugins { } dependencies { - compileOnlyApi(platform(libs.adventure.bom)) commonMainApi(project(":anvil-core-domain")) - commonMainApi("net.kyori:adventure-api") // TODO: -> compileOnly ASAP + jvmMainApi(platform(libs.adventure.bom)) + jvmMainApi("net.kyori:adventure-api") // TODO: -> compileOnly ASAP // compileOnlyApi(libs.logging.api) commonMainApi(libs.kbrig.core) } diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt index ea903dabd..4d02e52b7 100644 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt @@ -1,9 +1,9 @@ package org.anvilpowered.anvil.agent.command -import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.agent.platform.PluginManager import org.anvilpowered.anvil.user.CommandSource +import org.anvilpowered.anvil.user.Component import org.anvilpowered.kbrig.builder.LiteralArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt index 9281f2fe0..e0a4d9837 100644 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt @@ -22,5 +22,5 @@ import org.anvilpowered.anvil.user.CommandSource import org.anvilpowered.anvil.user.hasPermissionSet import org.anvilpowered.kbrig.builder.ArgumentBuilder -internal fun > T.requiresPermission(permission: String): T = +fun > B.requiresPermission(permission: String): B = requires { it.hasPermissionSet(permission) } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt index 72faa3fa7..08ebb3bb8 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt @@ -10,12 +10,12 @@ object Users : UUIDTable("users") { } context(Users) -fun InsertStatement<*>.setValuesFrom(user: User.CreateDto) { +fun InsertStatement<*>.setValuesFrom(user: AnvilUser.CreateDto) { this[username] = user.username this[email] = user.email } -fun ResultRow.toUser() = User( +fun ResultRow.toUser() = AnvilUser( username = this[Users.username], email = this[Users.email], id = this[Users.id].value, diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt similarity index 76% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt rename to core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt index b0d57c559..fb9b1ec32 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/User.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt @@ -4,7 +4,7 @@ import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.UUID -data class User( +data class AnvilUser( val username: String, val email: String, val minecraftUsers: List, @@ -14,7 +14,7 @@ data class User( data class CreateDto( val username: String, val email: String, - ) : Creates + ) : Creates - companion object Repository : DomainEntity.Repository + companion object Repository : DomainEntity.Repository } From a286224af018e784425b1263fa3500250802a8d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 21 Apr 2023 11:58:46 +0200 Subject: [PATCH 17/77] Upgradle to v8.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 61608 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 ++++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ccebba7710deaf9f98673a68957ea02138b60d0a..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 8979 zcmY*fV{{$d(moANW81db*tXT!Nn`UgX2ZtD$%&n`v2C-lt;YD?@2-14?EPcUv!0n* z`^Ws4HP4i8L%;4p*JkD-J9ja2aKi!sX@~#-MY5?EPBK~fXAl)Ti}^QGH@6h+V+|}F zv=1RqQxhWW9!hTvYE!)+*m%jEL^9caK;am9X8QP~a9X0N6(=WSX8KF#WpU-6TjyR3 zpKhscivP97d$DGc{KI(f#g07u{Jr0wn#+qNr}yW}2N3{Kx0lCq%p4LBKil*QDTEyR zg{{&=GAy_O0VJ(8ZbtS4tPeeeILKK(M?HtQY!6K^wt zxsPH>E%g%V@=!B;kWF54$xjC&4hO!ZEG0QFMHLqe!tgH;%vO62BQj||nokbX&2kxF zzg#N!2M|NxFL#YdwOL8}>iDLr%2=!LZvk_&`AMrm7Zm%#_{Ot_qw=HkdVg{f9hYHF zlRF*9kxo~FPfyBD!^d6MbD?BRZj(4u9j!5}HFUt+$#Jd48Fd~ahe@)R9Z2M1t%LHa z_IP|tDb0CDl(fsEbvIYawJLJ7hXfpVw)D-)R-mHdyn5uZYefN0rZ-#KDzb`gsow;v zGX>k|g5?D%Vn_}IJIgf%nAz{@j0FCIEVWffc1Z+lliA}L+WJY=MAf$GeI7xw5YD1) z;BJn$T;JI5vTbZ&4aYfmd-XPQd)YQ~d({>(^5u>Y^5rfxEUDci9I5?dXp6{zHG=Tc z6$rLd^C~60=K4ptlZ%Fl-%QLc-x{y=zU$%&4ZU}4&Yu?jF4eqB#kTHhty`Aq=kJE% zzq(5OS9o1t-)}S}`chh1Uu-Sl?ljxMDVIy5j`97Eqg7L~Ak9NSZ?!5M>5TRMXfD#} zFlMmFnr%?ra>vkvJQjmWa8oB{63qPo1L#LAht%FG|6CEe9KP2&VNe_HNb7M}pd*!t zpGL0vzCU02%iK@AKWxP^64fz-U#%u~D+FV?*KdPY9C_9{Ggn;Y;;iKE0b|}KmC&f(WIDcFtvRPDju z?Dc&_dP4*hh!%!6(nYB*TEJs<4zn*V0Nw1O4VzYaNZul>anE2Feb@T$XkI?)u6VK$bg* z22AY7|Ju!_jwc2@JX(;SUE>VDWRD|d56WYUGLAAwPYXU9K&NgY{t{dyMskUBgV%@p zMVcFn>W|hJA?3S?$k!M|1S2e1A&_~W2p$;O2Wpn`$|8W(@~w>RR4kxHdEr`+q|>m@ zTYp%Ut+g`T#HkyE5zw<5uhFvt2=k5fM3!8OxvGgMRS|t7RaJn7!2$r_-~a%C7@*Dq zGUp2g0N^HzLU=%bROVFi2J;#`7#WGTUI$r!(wmbJlbS`E#ZpNp7vOR#TwPQWNf$IW zoX>v@6S8n6+HhUZB7V^A`Y9t4ngdfUFZrDOayMVvg&=RY4@0Z~L|vW)DZTIvqA)%D zi!pa)8L7BipsVh5-LMH4bmwt2?t88YUfIRf!@8^gX$xpKTE^WpM!-=3?UVw^Cs`Y7 z2b<*~Q=1uqs79{h&H_8+X%><4qSbz_cSEa;Hkdmtq5uwGTY+|APD{i_zYhLXqT7HO zT^Am_tW?Cmn%N~MC0!9mYt-~WK;hj-SnayMwqAAHo#^ALwkg0>72&W}5^4%|Z|@T; zwwBQTg*&eXC}j8 zra77(XC^p&&o;KrZ$`_)C$@SDWT+p$3!;ZB#yhnK{CxQc&?R}ZQMcp`!!eXLLhiP8W zM=McHAMnUMlar8XLXk&jx#HBH3U0jbhJuqa~#l`aB)N6;WI(Im322o#{K&92l6(K z)(;=;-m!%9@j#WSA1uniU(^x(UTi+%idMd)x*!*Hub0Rg7DblI!cqo9QUZf29Y#?XN!K!|ovJ7~!^H}!zsaMl(57lpztQ7V zyo#`qJ4jv1zGAW2uIkU3o&7_=lYWz3=SR!sgfuYp{Um<*H%uW8MdUT2&o*QKjD3PEH zHz;H}qCN~`GFsJ_xz$9xga*@VzJTH7-3lggkBM&7xlz5#qWfkgi=#j%{&f-NMsaSv zeIZ60Jpw}QV+t`ovOJxVhYCXe8E7r*eLCJ{lP6sqc}BYrhjXlt(6e9nw=2Le1gOT0 zZX!q9r#DZ&8_cAhWPeq~CJkGvpRU&q8>rR@RBW4~@3j1X>RBum#U z1wjcEdB`|@sXAWxk2*TOj> zr(j{nr1;Mk3x^gvAtZsahY=ou{eAJi-d(XISF-?+Q6{Um4+lu?aA=S33@k=6^OT?F z8TE`ha;q@=ZQ-dlt!q49;Wjjl<&Yee^!h5MFkd)Oj=fsvxytK%!B z-P#YJ)8^dMi=wpKmt43|apX6v2dNXzZ-WHlLEh`JoKFNjCK7LhO^P5XW?Y~rjGcIpv$2v41rE}~0{aj9NVpDXGdD6W8{fyzioQdu&xkn8 zhT*^NY0zv>Om?h3XAku3p-4SHkK@fXrpi{T=@#bwY76TsD4$tAHAhXAStdb$odc z02~lZyb!fG_7qrU_F5 zoOG|pEwdyDhLXDwlU>T|;LF@ACJk(qZ*2h6GB@33mKk};HO^CQM(N7@Ml5|8IeHzt zdG4f$q}SNYA4P=?jV!mJ%3hRKwi&!wFptWZRq4bpV9^b7&L>nW%~Y|junw!jHj%85 z3Ck6%`Y=Abvrujnm{`OtE0uQkeX@3JPzj#iO#eNoAX6cDhM+cc2mLk8;^bG62mtjQ zj|kxI2W|4n{VqMqB?@YnA0y}@Mju)&j3UQ4tSdH=Eu?>i7A50b%i$pc{YJki7ubq7 zVTDqdkGjeAuZdF)KBwR6LZob}7`2935iKIU2-I;88&?t16c-~TNWIcQ8C_cE_F1tv z*>4<_kimwX^CQtFrlk)i!3-+2zD|=!D43Qqk-LtpPnX#QQt%eullxHat97k=00qR|b2|M}`q??yf+h~};_PJ2bLeEeteO3rh+H{9otNQDki^lu)(`a~_x(8NWLE*rb%T=Z~s?JC|G zXNnO~2SzW)H}p6Zn%WqAyadG=?$BXuS(x-2(T!E&sBcIz6`w=MdtxR<7M`s6-#!s+ znhpkcNMw{c#!F%#O!K*?(Hl(;Tgl9~WYBB(P@9KHb8ZkLN>|}+pQ)K#>ANpV1IM{Q z8qL^PiNEOrY*%!7Hj!CwRT2CN4r(ipJA%kCc&s;wOfrweu)H!YlFM z247pwv!nFWbTKq&zm4UVH^d?H2M276ny~@v5jR2>@ihAmcdZI-ah(&)7uLQM5COqg?hjX2<75QU4o5Q7 zZ5gG;6RMhxLa5NFTXgegSXb0a%aPdmLL4=`ox2smE)lDn^!;^PNftzTf~n{NH7uh_ zc9sKmx@q1InUh_BgI3C!f>`HnO~X`9#XTI^Yzaj1928gz8ClI!WIB&2!&;M18pf0T zsZ81LY3$-_O`@4$vrO`Cb&{apkvUwrA0Z49YfZYD)V4;c2&`JPJuwN_o~2vnyW_b! z%yUSS5K{a*t>;WJr&$A_&}bLTTXK23<;*EiNHHF-F<#hy8v2eegrqnE=^gt+|8R5o z_80IY4&-!2`uISX6lb0kCVmkQ{D}HMGUAkCe`I~t2~99(<#}{E;{+Y0!FU>leSP(M zuMoSOEfw3OC5kQ~Y2)EMlJceJlh}p?uw}!cq?h44=b2k@T1;6KviZGc_zbeTtTE$@EDwUcjxd#fpK=W*U@S#U|YKz{#qbb*|BpcaU!>6&Ir zhsA+ywgvk54%Nj>!!oH>MQ+L~36v1pV%^pOmvo7sT|N}$U!T6l^<3W2 z6}mT7Cl=IQo%Y~d%l=+;vdK)yW!C>Es-~b^E?IjUU4h6<86tun6rO#?!37B)M8>ph zJ@`~09W^@5=}sWg8`~ew=0>0*V^b9eG=rBIGbe3Ko$pj!0CBUTmF^Q}l7|kCeB(pX zi6UvbUJWfKcA&PDq?2HrMnJBTW#nm$(vPZE;%FRM#ge$S)i4!y$ShDwduz@EPp3H? z`+%=~-g6`Ibtrb=QsH3w-bKCX1_aGKo4Q7n-zYp->k~KE!(K@VZder&^^hIF6AhiG z;_ig2NDd_hpo!W1Un{GcB@e{O@P3zHnj;@SzYCxsImCHJS5I&^s-J6?cw92qeK8}W zk<_SvajS&d_tDP~>nhkJSoN>UZUHs?)bDY`{`;D^@wMW0@!H1I_BYphly0iqq^Jp; z_aD>eHbu@e6&PUQ4*q*ik0i*$Ru^_@`Mbyrscb&`8|c=RWZ>Ybs16Q?Cj1r6RQA5! zOeuxfzWm(fX!geO(anpBCOV|a&mu|$4cZ<*{pb1F{`-cm1)yB6AGm7b=GV@r*DataJ^I!>^lCvS_@AftZiwtpszHmq{UVl zKL9164tmF5g>uOZ({Jg~fH~QyHd#h#E;WzSYO~zt)_ZMhefdm5*H1K-#=_kw#o%ch zgX|C$K4l4IY8=PV6Q{T8dd`*6MG-TlsTEaA&W{EuwaoN+-BDdSL2>|lwiZ++4eR8h zNS1yJdbhAWjW4k`i1KL)l#G*Y=a0ouTbg8R1aUU`8X7p*AnO+uaNF9mwa+ooA)hlj zR26XBpQ-{6E9;PQAvq2<%!M1;@Q%r@xZ16YRyL&v}9F`Nnx#RLUc<78w$S zZElh==Rnr2u<*qKY|aUR9(A|{cURqP81O-1a@X)khheokEhC}BS-g~|zRbn-igmID z$Ww!O0-j!t(lx>-JH+0KW3*Bgafpm>%n=`(ZLa^TWd*-je!Xi7H*bZ8pz`HPFYeC? zk>`W)4Cj6*A3A8g$MEhp*<@qO&&>3<4YI%0YAMmQvD3 z${78Fa2mqiI>P7|gE)xs$cg3~^?UBb4y6B4Z#0Fzy zN8Gf!c+$uPS`VRB=wRV1f)>+PEHBYco<1?ceXET}Q-tKI=E`21<15xTe@%Bhk$v09 zVpoL_wNuw)@^O+C@VCeuWM}(%C(%lTJ}7n)JVV!^0H!3@)ydq#vEt;_*+xos$9i?{ zCw5^ZcNS&GzaeBmPg6IKrbT`OSuKg$wai+5K}$mTO-Z$s3Y+vb3G}x%WqlnQS1;|Z zlZ$L{onq1Ag#5JrM)%6~ToQ}NmM2A(7X5gy$nVI=tQFOm;7|Oeij{xb_KU{d@%)2z zsVqzTl@XPf(a95;P;oBm9Hlpo`9)D9>G>!Bj=ZmX{ces=aC~E^$rTO5hO$#X65jEA zMj1(p+HXdOh7FAV;(_)_RR#P>&NW?&4C7K1Y$C$i**g;KOdu|JI_Ep zV-N$wuDRkn6=k|tCDXU%d=YvT!M1nU?JY;Pl`dxQX5+660TX7~q@ukEKc!Iqy2y)KuG^Q-Y%$;SR&Mv{%=CjphG1_^dkUM=qI*3Ih^Bk621n`6;q(D;nB_y|~ zW*1ps&h|wcET!#~+Ptsiex~YVhDiIREiw1=uwlNpPyqDZ`qqv9GtKwvxnFE}ME93fD9(Iq zz=f&4ZpD~+qROW6Y2AjPj9pH*r_pS_f@tLl88dbkO9LG0+|4*Xq(Eo7fr5MVg{n<+p>H{LGr}UzToqfk_x6(2YB~-^7>%X z+331Ob|NyMST64u|1dK*#J>qEW@dKNj-u}3MG)ZQi~#GzJ_S4n5lb7vu&>;I-M49a z0Uc#GD-KjO`tQ5ftuSz<+`rT)cLio$OJDLtC`t)bE+Nu@Rok2;`#zv1=n z7_CZr&EhVy{jq(eJPS)XA>!7t<&ormWI~w0@Y#VKjK)`KAO~3|%+{ z$HKIF?86~jH*1p=`j#}8ON0{mvoiN7fS^N+TzF~;9G0_lQ?(OT8!b1F8a~epAH#uA zSN+goE<-psRqPXdG7}w=ddH=QAL|g}x5%l-`Kh69D4{M?jv!l))<@jxLL$Eg2vt@E zc6w`$?_z%awCE~ca)9nMvj($VH%2!?w3c(5Y4&ZC2q#yQ=r{H2O839eoBJ{rfMTs8 zn2aL6e6?;LY#&(BvX_gC6uFK`0yt zJbUATdyz5d3lRyV!rwbj0hVg#KHdK0^A7_3KA%gKi#F#-^K%1XQbeF49arI2LA|Bj z?=;VxKbZo(iQmHB5eAg=8IPRqyskQNR!&KEPrGv&kMr(8`4oe?vd?sIZJK+JY04kc zXWk)4N|~*|0$4sUV3U6W6g+Z3;nN<~n4H17QT*%MCLt_huVl@QkV`A`jyq<|q=&F_ zPEOotTu9?zGKaPJ#9P&ljgW!|Vxhe+l85%G5zpD5kAtn*ZC})qEy!v`_R}EcOn)&# z-+B52@Zle@$!^-N@<_=LKF}fqQkwf1rE(OQP&8!En}jqr-l0A0K>77K8{zT%wVpT~ zMgDx}RUG$jgaeqv*E~<#RT?Q)(RGi8bUm(1X?2OAG2!LbBR+u1r7$}s=lKqu&VjXP zUw3L9DH({yj)M%OqP%GC+$}o0iG|*hN-Ecv3bxS|Mxpmz*%x`w7~=o9BKfEVzr~K- zo&Fh`wZ{#1Jd5QFM4&!PabL!tf%TfJ4wi;45AqWe$x}8*c2cgqua`(6@ErE&P{K5M zQfwGQ4Qg&M3r4^^$B?_AdLzqtxn5nb#kItDY?BTW z#hShspeIDJ1FDmfq@dz1TT`OV;SS0ImUp`P6GzOqB3dPfzf?+w^40!Wn*4s!E;iHW zNzpDG+Vmtnh%CyfAX>X z{Y=vt;yb z;TBRZpw##Kh$l<8qq5|3LkrwX%MoxqWwclBS6|7LDM(I31>$_w=;{=HcyWlak3xM1 z_oaOa)a;AtV{*xSj6v|x%a42{h@X-cr%#HO5hWbuKRGTZS)o=^Id^>H5}0p_(BEXX zx3VnRUj6&1JjDI);c=#EYcsg;D5TFlhe)=nAycR1N)YSHQvO+P5hKe9T0ggZT{oF@ z#i3V4TpQlO1A8*TWn|e}UWZ(OU;Isd^ zb<#Vj`~W_-S_=lDR#223!xq8sRjAAVSY2MhRyUyHa-{ql=zyMz?~i_c&dS>eb>s>#q#$UI+!&6MftpQvxHA@f|k2(G9z zAQCx-lJ-AT;PnX%dY5}N$m6tFt5h6;Mf78TmFUN9#4*qBNg4it3-s22P+|Rw zG@X%R0sm*X07ZZEOJRbDkcjr}tvaVWlrwJ#7KYEw&X`2lDa@qb!0*SHa%+-FU!83q zY{R15$vfL56^Nj42#vGQlQ%coT4bLr2s5Y0zBFp8u&F(+*%k4xE1{s75Q?P(SL7kf zhG?3rfM9V*b?>dOpwr%uGH7Xfk1HZ!*k`@CNM77g_mGN=ucMG&QX19B!%y77w?g#b z%k3x6q_w_%ghL;9Zk_J#V{hxK%6j`?-`UN?^e%(L6R#t#97kZaOr1{&<8VGVs1O>} z6~!myW`ja01v%qy%WI=8WI!cf#YA8KNRoU>`_muCqpt_;F@rkVeDY}F7puI_wBPH9 zgRGre(X_z4PUO5!VDSyg)bea1x_a7M z4AJ?dd9rf{*P`AY+w?g_TyJlB5Nks~1$@PxdtpUGGG##7j<$g&BhKq0mXTva{;h5E ztcN!O17bquKEDC#;Yw2yE>*=|WdZT9+ycgUR^f?~+TY-E552AZlzYn{-2CLRV9mn8 z+zNoWLae^P{co`F?)r;f!C=nnl*1+DI)mZY!frp~f%6tX2g=?zQL^d-j^t1~+xYgK zv;np&js@X=_e7F&&ZUX|N6Q2P0L=fWoBuh*L7$3~$-A)sdy6EQ@Pd-)|7lDA@%ra2 z4jL@^w92&KC>H(=v2j!tVE_3w0KogtrNjgPBsTvW F{TFmrHLU;u delta 8469 zcmY*q~ZGqoW{=01$bgB@1Nex`%9%S2I04)5Jw9+UyLS&r+9O2bq{gY;dCa zHW3WY0%Dem?S7n5JZO%*yiT9fb!XGk9^Q`o-EO{a^j%&)ZsxsSN@2k2eFx1*psqn0e*crIbAO}Rd~_BifMu*q7SUn{>WD$=7n_$uiQ0wGc$?u1hM%gf??nL?m22h!8{ zYmFMLvx6fjz*nwF^tAqx1uv0yEW9-tcIV5Q{HNh`9PMsuqD8VE%oAs5FsWa0mLV$L zPAF5e^$tJ8_Kwp!$N1M<#Z154n!X6hFpk8)eMLu; zaXS71&`24 zV`x~}yAxBw##Oj@qo_@DcBqc+2TB&=bJyZWTeR55zG<{Z@T^hSbMdm~Ikkr?4{7WT zcjPyu>0sDjl7&?TL@ z)cW?lW@Pfwu#nm7E1%6*nBIzQrKhHl`t54$-m>j8f%0vVr?N0PTz`}VrYAl+8h^O~ zuWQj@aZSZmGPtcVjGq-EQ1V`)%x{HZ6pT-tZttJOQm?q-#KzchbH>>5-jEX*K~KDa z#oO&Qf4$@}ZGQ7gxn<;D$ziphThbi6zL^YC;J#t0GCbjY)NHdqF=M4e(@|DUPY_=F zLcX1HAJ+O-3VkU#LW`4;=6szwwo%^R4#UK}HdAXK` z{m!VZj5q9tVYL=^TqPH*6?>*yr>VxyYF4tY{~?qJ*eIoIU0}-TLepzga4g}}D7#Qu zn;6I;l!`xaL^8r*Tz*h`^(xJCnuVR_O@Gl*Q}y$lp%!kxD`%zN19WTIf`VX*M=cDp z*s4<9wP|ev;PARRV`g$R*QV@rr%Ku~z(2-s>nt{JI$357vnFAz9!ZsiiH#4wOt+!1 zM;h;EN__zBn)*-A^l!`b?b*VI-?)Sj6&Ov3!j9k$5+#w)M>`AExCm0!#XL+E{Bp)s;Hochs+-@@)7_XDMPby#p<9mLu+S{8e2Jn`1`1nrffBfy4u)p7FFQWzgYt zXC}GypRdkTUS+mP!jSH$K71PYI%QI-{m;DvlRb*|4GMPmvURv0uD2bvS%FOSe_$4zc--*>gfRMKN|D ztP^WFfGEkcm?sqXoyRmuCgb?bSG17#QSv4~XsbPH>BE%;bZQ_HQb?q%CjykL7CWDf z!rtrPk~46_!{V`V<;AjAza;w-F%t1^+b|r_um$#1cHZ1|WpVUS&1aq?Mnss|HVDRY z*sVYNB+4#TJAh4#rGbr}oSnxjD6_LIkanNvZ9_#bm?$HKKdDdg4%vxbm-t@ZcKr#x z6<$$VPNBpWM2S+bf5IBjY3-IY2-BwRfW_DonEaXa=h{xOH%oa~gPW6LTF26Y*M)$N z=9i`Y8};Qgr#zvU)_^yU5yB;9@yJjrMvc4T%}a|jCze826soW-d`V~eo%RTh)&#XR zRe<8$42S2oz|NVcB%rG(FP2U&X>3 z4M^}|K{v64>~rob;$GO55t;Nb&T+A3u(>P6;wtp6DBGWbX|3EZBDAM2DCo&4w|WGpi;~qUY?Ofg$pX&`zR~)lr)8}z^U3U38Nrtnmf~e7$i=l>+*R%hQgDrj%P7F zIjyBCj2$Td=Fp=0Dk{=8d6cIcW6zhK!$>k*uC^f}c6-NR$ zd<)oa+_fQDyY-}9DsPBvh@6EvLZ}c)C&O-+wY|}RYHbc2cdGuNcJ7#yE}9=!Vt-Q~ z4tOePK!0IJ0cW*jOkCO? zS-T!bE{5LD&u!I4tqy;dI*)#e^i)uIDxU?8wK1COP3Qk{$vM3Sm8(F2VwM?1A+dle z6`M6bbZye|kew%w9l`GS74yhLluJU5R=#!&zGwB7lmTt}&eCt0g(-a;Mom-{lL6u~ zFgjyUs1$K*0R51qQTW_165~#WRrMxiUx{0F#+tvgtcjV$U|Z}G*JWo6)8f!+(4o>O zuaAxLfUl;GHI}A}Kc>A8h^v6C-9bb}lw@rtA*4Q8)z>0oa6V1>N4GFyi&v69#x&CwK*^!w&$`dv zQKRMKcN$^=$?4to7X4I`?PKGi(=R}d8cv{74o|9FwS zvvTg0D~O%bQpbp@{r49;r~5`mcE^P<9;Zi$?4LP-^P^kuY#uBz$F!u1d{Ens6~$Od zf)dV+8-4!eURXZZ;lM4rJw{R3f1Ng<9nn2_RQUZDrOw5+DtdAIv*v@3ZBU9G)sC&y!vM28daSH7(SKNGcV z&5x#e#W2eY?XN@jyOQiSj$BlXkTG3uAL{D|PwoMp$}f3h5o7b4Y+X#P)0jlolgLn9xC%zr3jr$gl$8?II`DO6gIGm;O`R`bN{;DlXaY4b`>x6xH=Kl@ z!>mh~TLOo)#dTb~F;O z8hpjW9Ga?AX&&J+T#RM6u*9x{&%I8m?vk4eDWz^l2N_k(TbeBpIwcV4FhL(S$4l5p z@{n7|sax){t!3t4O!`o(dYCNh90+hl|p%V_q&cwBzT*?Nu*D0wZ)fPXv z@*;`TO7T0WKtFh8~mQx;49VG_`l`g|&VK}LysK%eU4})Cvvg3YN)%;zI?;_Nr z)5zuU1^r3h;Y+mJov*->dOOj>RV^u2*|RraaQWsY5N?Uu)fKJOCSL2^G=RB%(4K{* zx!^cB@I|kJR`b+5IK}(6)m=O{49P5E^)!XvD5zVuzJH{01^#$@Cn514w41BB;FAoS2SYl3SRrOBDLfl5MvgA3 zU6{T?BW}l~8vU;q@p9IOM(=;WdioeQmt?X|=L9kyM&ZsNc*-Knv8@U*O96T@4ZiJ$ zeFL2}pw_~Tm3d4#q!zZS0km@vYgym33C0h(6D)6|Y)*UXI^T`(QPQh$WF?&h(3QYh zqGw@?BTk@VA_VxK@z?a@UrMhY zUD16oqx4$$6J_k0HnXgARm}N#(^yA1MLdbwmEqHnX*JdHN>$5k2E|^_bL< zGf5Z+D!9dXR>^(5F&5gIew1%kJtFUwI5P1~I$4LL_6)3RPzw|@2vV;Q^MeQUKzc=KxSTTX`}u%z?h~;qI#%dE@OZwehZyDBsWTc&tOC1c%HS#AyTJ= zQixj=BNVaRS*G!;B$}cJljeiVQabC25O+xr4A+32HVb;@+%r}$^u4-R?^3yij)0xb z86i@aoVxa%?bfOE;Bgvm&8_8K(M-ZEj*u9ms_Hk#2eL`PSnD#At!0l{f!v`&Kg}M$n(&R)?AigC5Z?T7Jv^lrDL!yYS{4 zq_H}oezX-Svu>dp)wE@khE@aR5vY=;{C-8Hws++5LDpArYd)U47jc-;f~07_TPa^1 zO`0+uIq)@?^!%JXCDid+nt|c@NG1+ce@ijUX&@rV9UiT|m+t-nqVB7?&UX*|{yDBFw9x52&dTh@;CL)Q?6s1gL=CUQTX7#TJPs9cpw<4>GFMUKo|f{! z&(%2hP6ghr%UFVO-N^v9l|tKy>&e%8us}wT0N*l(tezoctVtLmNdGPOF6oaAGJI5R zZ*|k@z3H!~Mm9fXw{bbP6?lV-j#Rfgnjf++O7*|5vz2#XK;kk ztJbi%r0{U5@QwHYfwdjtqJ6?;X{Ul3?W0O0bZ$k*y z4jWsNedRoCb7_|>nazmq{T3Y_{<5IO&zQ?9&uS@iL+|K|eXy^F>-60HDoVvovHelY zy6p(}H^7b+$gu@7xLn_^oQryjVu#pRE5&-w5ZLCK&)WJ5jJF{B>y;-=)C;xbF#wig zNxN^>TwzZbV+{+M?}UfbFSe#(x$c)|d_9fRLLHH?Xbn!PoM{(+S5IEFRe4$aHg~hP zJYt`h&?WuNs4mVAmk$yeM;8?R6;YBMp8VilyM!RXWj<95=yp=4@y?`Ua8 znR^R?u&g%`$Wa~usp|pO$aMF-en!DrolPjD_g#{8X1f=#_7hH8i|WF+wMqmxUm*!G z*4p980g{sgR9?{}B+a0yiOdR()tWE8u)vMPxAdK)?$M+O_S+;nB34@o<%lGJbXbP` z5)<({mNpHp&45UvN`b&K5SD#W){}6Y_d4v~amZPGg|3GdlWDB;;?a=Z{dd zELTfXnjCqq{Dgbh9c%LjK!Epi1TGI{A7AP|eg2@TFQiUd4Bo!JsCqsS-8ml`j{gM& zEd7yU`djX!EX2I{WZq=qasFzdDWD`Z?ULFVIP!(KQP=fJh5QC9D|$JGV95jv)!sYWY?irpvh06rw&O?iIvMMj=X zr%`aa(|{Ad=Vr9%Q(61{PB-V_(3A%p&V#0zGKI1O(^;tkS{>Y<`Ql@_-b7IOT&@?l zavh?#FW?5otMIjq+Bp?Lq)w7S(0Vp0o!J*~O1>av;)Cdok@h&JKaoHDV6IVtJ?N#XY=lknPN+SN8@3Gb+D-X*y5pQ)wnIpQlRR!Rd)@0LdA85}1 zu7W6tJ*p26ovz+`YCPePT>-+p@T_QsW$uE`McLlXb;k}!wwWuh$YC4qHRd=RS!s>2 zo39VCB-#Ew?PAYOx`x!@0qa5lZKrE?PJEwVfkww#aB_$CLKlkzHSIi4p3#IeyA@u@ z`x^!`0HJxe>#V7+Grku^in>Ppz|TD*`Ca4X%R3Yo|J=!)l$vYks|KhG{1CEfyuzK( zLjCz{5l}9>$J=FC?59^85awK0$;^9t9UxwOU8kP7ReVCc*rPOr(9uMY*aCZi2=JBu z(D0svsJRB&a9nY;6|4kMr1Er5kUVOh1TuBwa3B2C<+rS|xJo&Lnx3K-*P83eXQCJ= z(htQSA3hgOMcs`#NdYB17#zP_1N_P0peHrNo1%NsYn=;PgLXTic6b#{Y0Z~x9Ffav z^3eO+diquPfo1AXW*>G(JcGn{yN?segqKL$Wc9po(Kex z#tw_};zd++we+MPhOOgaXSmguul67JOvBysmg?wRf=OUeh(XyRcyY@8RTV@xck_c~ zLFMWAWb4^7xwR)3iO1PIs1<}L3CMJ1L-}s=>_y!`!FvYf^pJO|&nII{!Dz+b?=bUd zPJUUn))z)-TcpqKF(1tr-x1;lS?SB@mT#O7skl0sER{a|d?&>EKKaw* zQ>D^m*pNgV`54BKv?knU-T5bcvBKnI@KZo^UYjKp{2hpCo?_6v(Sg77@nQa{tSKbn zUgMtF>A3hndGocRY+Snm#)Q4%`|Qq3YTOU^uG}BGlz!B=zb?vB16sN&6J`L(k1r+$ z5G6E9tJ~Iwd!d!NH7Q%Z@BR@0e{p6#XF2))?FLAVG`npIjih*I+0!f6;+DM zLOP-qDsm9=ZrI!lfSDn%XuF17$j~gZE@I}S(Ctw&Te75P5?Fj%FLT;p-tm33FaUQc z5cR;$SwV|N0xmjox3V~XL3sV?YN}U0kkfmygW@a5JOCGgce6JyzGmgN$?NM%4;wEhUMg0uTTB~L==1Fvc(6)KMLmU z(12l^#g&9OpF7+Ll30F6(q=~>NIY=-YUJJ}@&;!RYnq*xA9h!iMi`t;B2SUqbyNGn zye@*0#Uu`OQy%utS%IA%$M1f4B|bOH={!3K1=Tc7Ra|%qZgZ{mjAGKXb)}jUu1mQ_ zRW7<;tkHv(m7E0m>**8D;+2ddTL>EcH_1YqCaTTu_#6Djm z*64!w#=Hz<>Fi1n+P}l#-)0e0P4o+D8^^Mk& zhHeJoh2paKlO+8r?$tx`qEcm|PSt6|1$1q?r@VvvMd1!*zAy3<`X9j?ZI|;jE-F(H zIn1+sm(zAnoJArtytHC|0&F0`i*dy-PiwbD-+j`ezvd4C`%F1y^7t}2aww}ZlPk)t z=Y`tm#jNM$d`pG%F42Xmg_pZnEnvC%avz=xNs!=6b%%JSuc(WObezkCeZ#C|3PpXj zkR8hDPyTIUv~?<%*)6=8`WfPPyB9goi+p$1N2N<%!tS2wopT2x`2IZi?|_P{GA|I5 z?7DP*?Gi#2SJZ!x#W9Npm)T;=;~Swyeb*!P{I^s@o5m_3GS2Lg?VUeBdOeae7&s5$ zSL_VuTJih_fq7g8O8b0g+GbmE+xG}^Wx`g~{mWTyr@=h zKlAymoHeZa`DgR?Pj8Yc+I|MrSB>X*ts#wNFOJxs!3aGE)xeTHlF`fC5^g(DTacl$ zx!ezQJdwIyc$8RyNS~Wh{0pp>8NcW)*J=7AQYdT?(QhJuq4u`QniZ!%6l{KWp-0Xp z4ZC6(E(_&c$$U_cmGFslsyX6(62~m*z8Yx2p+F5xmD%6A7eOnx`1lJA-Mrc#&xZWJ zzXV{{OIgzYaq|D4k^j%z|8JB8GnRu3hw#8Z@({sSmsF(x>!w0Meg5y(zg!Z0S^0k# z5x^g1@L;toCK$NB|Fn Date: Thu, 4 May 2023 14:27:59 +0200 Subject: [PATCH 18/77] Work more on domain and commands --- .../agent/command/AnvilPluginsCommand.kt | 4 +- .../anvil/agent/command/CustomCommandScope.kt | 20 ++++++ .../anvil/agent/ExamplePlugin.java | 60 ---------------- .../anvil/agent/AnvilVelocityPlugin.kt | 69 ++++--------------- .../anvil/agent/ProxyServerScope.kt | 7 ++ .../agent/command/VelocityCustomCommand.kt | 68 ++++++++++++++++++ .../user/AnvilVelocityPermissionSubject.kt | 22 ++++++ .../anvil/agent/user/AnvilVelocityPlayer.kt | 20 ++++++ .../anvil/entity/MinecraftUsers.kt | 4 +- .../anvil/datastore/GameTypeScope.kt | 9 +-- .../anvil/datastore/GameUserScope.kt | 13 ++++ .../anvil/datastore/ServerNodeScope.kt | 9 +-- .../anvilpowered/anvil/entity/AnvilUser.kt | 2 +- ...{MinecraftUser.kt => MinecraftUserData.kt} | 6 +- .../anvilpowered/anvil/user/DiscordUser.kt | 6 ++ .../org/anvilpowered/anvil/user/GameUser.kt | 18 +++++ .../org/anvilpowered/anvil/user/Player.kt | 2 +- .../org/anvilpowered/anvil/user/User.kt | 5 -- gradle/wrapper/gradle-wrapper.properties | 2 +- 19 files changed, 201 insertions(+), 145 deletions(-) create mode 100644 agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/CustomCommandScope.kt delete mode 100644 agent/mc/velocity/src/jvmMain/java/org/anvilpowered/anvil/agent/ExamplePlugin.java create mode 100644 agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/ProxyServerScope.kt create mode 100644 agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/VelocityCustomCommand.kt create mode 100644 agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPermissionSubject.kt create mode 100644 agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPlayer.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameUserScope.kt rename core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/{MinecraftUser.kt => MinecraftUserData.kt} (84%) create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/DiscordUser.kt create mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUser.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt index 4d02e52b7..dc3d2485a 100644 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt @@ -4,13 +4,13 @@ import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.agent.platform.PluginManager import org.anvilpowered.anvil.user.CommandSource import org.anvilpowered.anvil.user.Component -import org.anvilpowered.kbrig.builder.LiteralArgumentBuilder +import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess import org.anvilpowered.kbrig.tree.LiteralCommandNode context(PluginManager.Scope) fun AnvilCommand.createPlugins(): LiteralCommandNode { - return LiteralArgumentBuilder("plugins") + return ArgumentBuilder.literal("plugins") .requiresPermission("anvil.agent.plugins") .executesSingleSuccess { context -> val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/CustomCommandScope.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/CustomCommandScope.kt new file mode 100644 index 000000000..a2ccbc9af --- /dev/null +++ b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/CustomCommandScope.kt @@ -0,0 +1,20 @@ +package org.anvilpowered.anvil.agent.command + +import org.anvilpowered.anvil.user.CommandSource +import org.anvilpowered.anvil.user.GameUser +import org.anvilpowered.anvil.user.Player +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder +import org.anvilpowered.kbrig.context.CommandContext + +interface CustomCommandScope { + fun ArgumentBuilder.Companion.player( + name: String = "player", + command: (context: CommandContext, player: Player) -> Int, + ): RequiredArgumentBuilder + + fun ArgumentBuilder.Companion.gameUser( + name: String = "gameUser", + command: (context: CommandContext, gameUser: GameUser) -> Int, + ): RequiredArgumentBuilder +} diff --git a/agent/mc/velocity/src/jvmMain/java/org/anvilpowered/anvil/agent/ExamplePlugin.java b/agent/mc/velocity/src/jvmMain/java/org/anvilpowered/anvil/agent/ExamplePlugin.java deleted file mode 100644 index 19e2ab537..000000000 --- a/agent/mc/velocity/src/jvmMain/java/org/anvilpowered/anvil/agent/ExamplePlugin.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.agent; - -import com.google.inject.Inject; -import com.mojang.brigadier.tree.LiteralCommandNode; -import com.velocitypowered.api.command.BrigadierCommand; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.event.Subscribe; -import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; -import com.velocitypowered.api.proxy.ProxyServer; -import net.kyori.adventure.text.Component; -import org.anvilpowered.anvil.user.MyCommandSource; -import org.anvilpowered.kbrig.brigadier.BrigadierConverter; -import org.anvilpowered.kbrig.tree.SourceConverter; - -public class ExamplePlugin { - - @Inject - private ProxyServer proxyServer; - - @Subscribe - void onProxyInit(ProxyInitializeEvent event) { -class BridgeSource implements MyCommandSource { - private final CommandSource velocityCommandSource; - - BridgeSource(CommandSource velocityCommandSource) { - this.velocityCommandSource = velocityCommandSource; - } - - public void sendMessage(Component message) { - velocityCommandSource.sendMessage(message); - } -} - -final LiteralCommandNode mappedSourceNode = - BrigadierConverter.toBrigadier( - SourceConverter.mapSource(CustomCommand.createPing(), BridgeSource::new) - ); - -proxyServer.getCommandManager().register(new BrigadierCommand(mappedSourceNode)); - - } -} diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt index b5c3f3702..a37b9c432 100644 --- a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt +++ b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt @@ -19,18 +19,16 @@ package org.anvilpowered.anvil.agent import com.google.inject.Inject -import com.velocitypowered.api.command.BrigadierCommand -import com.velocitypowered.api.command.CommandSource import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.permission.Tristate import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.proxy.ProxyServer -import net.kyori.adventure.text.Component -import org.anvilpowered.anvil.agent.command.createPingCommand -import org.anvilpowered.kbrig.brigadier.toBrigadier -import org.anvilpowered.kbrig.tree.mapSource +import net.kyori.adventure.audience.Audience +import net.kyori.adventure.audience.ForwardingAudience +import org.anvilpowered.anvil.user.CommandSource import org.slf4j.Logger +import com.velocitypowered.api.command.CommandSource as VelocityCommandSource @Plugin( id = "anvil-agent", @@ -46,58 +44,17 @@ class AnvilVelocityPlugin @Inject constructor( @Subscribe fun onProxyInit(event: ProxyInitializeEvent) { logger.info("Anvil Agent is running!") -// val pluginManager = object : PluginManager { -// override val plugins: List -// get() = proxyServer.pluginManager.plugins.map { -// object : AgentPlugin { -// override val name: String -// get() = it.description.id!! -// } -// } -// } -// val scope = object : PluginManager.Scope { -// override val pluginManager: PluginManager -// get() = pluginManager -// } -// registerCommands(scope) -// logger.info("Registered commands") - - class BridgeSource(private val velocityCommandSource: CommandSource) : MyCommandSource { - override fun sendMessage(message: Component) = velocityCommandSource.sendMessage(message) - } - - val commandNode = createPingCommand() - .mapSource<_, CommandSource> { BridgeSource(it) } - .toBrigadier() - - proxyServer.commandManager.register(BrigadierCommand(commandNode)) - - +// val commandNode = AnvilCommand.createPlugins() +// .mapSource<_, VelocityCommandSource> { BridgeSource(it) } +// .toBrigadier() +// +// proxyServer.commandManager.register(BrigadierCommand(commandNode)) } - -// private fun registerCommands(pluginManagerScope: PluginManager.Scope) { -// with(pluginManagerScope) { -// proxyServer.commandManager.register( -// BrigadierCommand( -// AnvilCommand.createPlugins() -// .mapSource<_, VelocityCommandSource> { BridgeSource(it) } -// .toBrigadier(), -// ), -// ) -// } -// } } -//class BridgeSource(private val original: VelocityCommandSource) : ForwardingAudience.Single, MyCommandSource { -// override fun audience(): Audience = original -// override fun hasPermission(permission: String): Boolean? = original.getPermissionValue(permission).toBoolean() -//} - -fun Tristate.toBoolean(): Boolean? { - return when (this) { - Tristate.TRUE -> true - Tristate.FALSE -> false - Tristate.UNDEFINED -> null - } +class BridgeSource(private val original: VelocityCommandSource) : ForwardingAudience.Single, CommandSource { + override fun audience(): Audience = original + override fun hasPermission(permission: String): Boolean? = original.getPermissionValue(permission).toBoolean() } + diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/ProxyServerScope.kt b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/ProxyServerScope.kt new file mode 100644 index 000000000..96e15d29f --- /dev/null +++ b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/ProxyServerScope.kt @@ -0,0 +1,7 @@ +package org.anvilpowered.anvil.agent + +import com.velocitypowered.api.proxy.ProxyServer + +interface ProxyServerScope { + val proxyServer: ProxyServer +} diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/VelocityCustomCommand.kt b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/VelocityCustomCommand.kt new file mode 100644 index 000000000..ab44e91bc --- /dev/null +++ b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/VelocityCustomCommand.kt @@ -0,0 +1,68 @@ +package org.anvilpowered.anvil.agent.command + +import kotlinx.coroutines.coroutineScope +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.anvilpowered.anvil.agent.ProxyServerScope +import org.anvilpowered.anvil.agent.user.toAnvil +import org.anvilpowered.anvil.datastore.GameUserScope +import org.anvilpowered.anvil.user.CommandSource +import org.anvilpowered.anvil.user.GameUser +import org.anvilpowered.anvil.user.Player +import org.anvilpowered.kbrig.argument.StringArgumentType +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder +import org.anvilpowered.kbrig.builder.executesSuspending +import org.anvilpowered.kbrig.context.CommandContext +import org.anvilpowered.kbrig.context.get +import kotlin.jvm.optionals.getOrNull + +class VelocityCustomCommand : CustomCommandScope { + + context(ProxyServerScope) + override fun ArgumentBuilder.Companion.player( + name: String, + command: (context: CommandContext, player: Player) -> Int, + ): RequiredArgumentBuilder = + required(name, StringArgumentType.SingleWord) + .suggests { _, builder -> + proxyServer.allPlayers.forEach { player -> builder.suggest(player.username) } + builder.build() + } + .executes { context -> + val playerName = context.get(name) + proxyServer.getPlayer(playerName).getOrNull()?.let { velocityPlayer -> + command(context, velocityPlayer.toAnvil()) + } ?: run { + context.source.sendMessage( + Component.text() + .append(Component.text("Player with name ", NamedTextColor.RED)) + .append(Component.text(playerName, NamedTextColor.GOLD)) + .append(Component.text(" not found!", NamedTextColor.RED)), + ) + 0 + } + } + + context(ProxyServerScope, GameUserScope) + override fun ArgumentBuilder.Companion.gameUser( + name: String, + command: (context: CommandContext, gameUser: GameUser) -> Int, + ): RequiredArgumentBuilder = + required(name, StringArgumentType.SingleWord) + .suggests { _, builder -> + GameUser.getAllUserNames(startWith = builder.input).forEach { name -> builder.suggest(name) } + builder.build() + } + .executesSuspending { context -> + val gameUserName = context.get(name) + + GameUser.findByUsername(gameUserName)?.let { gameUser -> + command(context, gameUser) + } ?: run { + + } + + command(context, ) + } +} diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPermissionSubject.kt b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPermissionSubject.kt new file mode 100644 index 000000000..ec4225d24 --- /dev/null +++ b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPermissionSubject.kt @@ -0,0 +1,22 @@ +package org.anvilpowered.anvil.agent.user + +import com.velocitypowered.api.permission.Tristate +import org.anvilpowered.anvil.user.PermissionSubject +import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject + +fun VelocityPermissionSubject.toAnvil(): PermissionSubject = AnvilVelocityPermissionSubject(this) + +private class AnvilVelocityPermissionSubject( + private val velocityPermissionSubject: VelocityPermissionSubject, +) : PermissionSubject { + override fun hasPermission(permission: String): Boolean? = + velocityPermissionSubject.getPermissionValue(permission).toBoolean() +} + +private fun Tristate.toBoolean(): Boolean? { + return when (this) { + Tristate.TRUE -> true + Tristate.FALSE -> false + Tristate.UNDEFINED -> null + } +} diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPlayer.kt b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPlayer.kt new file mode 100644 index 000000000..e1ab7c9be --- /dev/null +++ b/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPlayer.kt @@ -0,0 +1,20 @@ +package org.anvilpowered.anvil.agent.user + +import org.anvilpowered.anvil.user.Audience +import org.anvilpowered.anvil.user.GameUser +import org.anvilpowered.anvil.user.PermissionSubject +import org.anvilpowered.anvil.user.Player +import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject +import com.velocitypowered.api.proxy.Player as VelocityPlayer + +fun VelocityPlayer.toAnvil(): Player = AnvilVelocityPlayer(this) + +private class AnvilVelocityPlayer( + val velocityPlayer: VelocityPlayer, +) : Player, + Audience by velocityPlayer, + PermissionSubject by (velocityPlayer as VelocityPermissionSubject).toAnvil() { + + override val user: GameUser + get() = TODO("Not yet implemented") +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt index 78e163f59..7e5a4a22f 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt @@ -9,13 +9,13 @@ object MinecraftUsers : AnvilTable("minecraft_users") { } context(MinecraftUsers) -fun InsertStatement<*>.setValuesFrom(minecraftUser: MinecraftUser.CreateDto) { +fun InsertStatement<*>.setValuesFrom(minecraftUser: MinecraftUserData.CreateDto) { this[username] = minecraftUser.username this[userId] = minecraftUser.userId this[id] = minecraftUser.id } -fun ResultRow.toMinecraftUser() = MinecraftUser( +fun ResultRow.toMinecraftUser() = MinecraftUserData( username = this[MinecraftUsers.username], userId = this[MinecraftUsers.userId].value, id = this[MinecraftUsers.id].value, diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt index 535ceda3f..5e03715c1 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt @@ -2,14 +2,9 @@ package org.anvilpowered.anvil.datastore import org.anvilpowered.anvil.entity.GameType import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.scope.CreateScope -import org.sourcegrade.kontour.scope.DeleteScope -import org.sourcegrade.kontour.scope.FindScope +import org.sourcegrade.kontour.scope.CrudScope -interface GameTypeScope : - CreateScope, - FindScope, - DeleteScope { +interface GameTypeScope : CrudScope { suspend fun DomainEntity.Repository.findByName(name: String): GameType? diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameUserScope.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameUserScope.kt new file mode 100644 index 000000000..76418422d --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameUserScope.kt @@ -0,0 +1,13 @@ +package org.anvilpowered.anvil.datastore + +import org.anvilpowered.anvil.user.GameUser +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.scope.CrudScope + +interface GameUserScope : CrudScope { + + suspend fun DomainEntity.Repository.getAllUserNames(startWith: String = ""): SizedIterable + + suspend fun DomainEntity.Repository.findByUsername(username: String): GameUser? +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt index 755e7bf37..cd8e44e99 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt @@ -3,14 +3,9 @@ package org.anvilpowered.anvil.datastore import org.anvilpowered.anvil.entity.ServerNode import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.scope.CreateScope -import org.sourcegrade.kontour.scope.DeleteScope -import org.sourcegrade.kontour.scope.FindScope +import org.sourcegrade.kontour.scope.CrudScope -interface ServerNodeScope : - CreateScope, - FindScope, - DeleteScope { +interface ServerNodeScope : CrudScope { fun DomainEntity.Repository.findByGameType(): GameTypeJoin> } diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt index fb9b1ec32..60d45648d 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt @@ -7,7 +7,7 @@ import org.sourcegrade.kontour.UUID data class AnvilUser( val username: String, val email: String, - val minecraftUsers: List, + val minecraftUsers: List, override val id: UUID, ) : DomainEntity { diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUser.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUserData.kt similarity index 84% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUser.kt rename to core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUserData.kt index d3b88b7fe..e5dad4d86 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUser.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUserData.kt @@ -4,7 +4,7 @@ import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.UUID -data class MinecraftUser( +data class MinecraftUserData( val username: String, val userId: UUID, override val id: UUID, @@ -14,7 +14,7 @@ data class MinecraftUser( val username: String, val userId: UUID, val id: UUID, - ) : Creates + ) : Creates - companion object Repository : DomainEntity.Repository + companion object Repository : DomainEntity.Repository } diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/DiscordUser.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/DiscordUser.kt new file mode 100644 index 000000000..efdf4db0c --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/DiscordUser.kt @@ -0,0 +1,6 @@ +package org.anvilpowered.anvil.user + +import org.sourcegrade.kontour.DomainEntity + +interface DiscordUser : DomainEntity { +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUser.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUser.kt new file mode 100644 index 000000000..9e60508ec --- /dev/null +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUser.kt @@ -0,0 +1,18 @@ +package org.anvilpowered.anvil.user + +import org.sourcegrade.kontour.Creates +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID + +interface GameUser : DomainEntity, PermissionSubject { + val username: String + val userId: UUID + + data class CreateDto( + val username: String, + val userId: UUID, + val id: UUID, + ) : Creates + + companion object Repository : DomainEntity.Repository +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt index e71af3fe9..7a958d3da 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt +++ b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt @@ -1,5 +1,5 @@ package org.anvilpowered.anvil.user interface Player : CommandSource { - val user: User + val user: GameUser } diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt deleted file mode 100644 index f68a6dd61..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/User.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.anvilpowered.anvil.user - -interface User : PermissionSubject { - val name: String -} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c85a1f75..37aef8d3f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 56d0e4f7a93009bab75784a8e9d7c7ace1615af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 7 May 2023 23:26:55 +0200 Subject: [PATCH 19/77] Lots of refactoring and cleanup --- .../anvil/agent/command/AnvilCommand.kt | 3 - .../anvil/agent/command/CustomCommandScope.kt | 20 ------- .../anvil/agent/platform/PluginManager.kt | 11 ---- agent/build.gradle.kts | 9 --- agent/infrastructure/build.gradle.kts | 8 --- .../anvil/agent/http/client/AgentClient.kt | 3 - .../anvil/agent/http/server/AgentServer.kt | 3 - api/build.gradle.kts | 9 +++ api/game/build.gradle.kts | 8 +++ .../anvilpowered/anvil/api/GameApiBindings.kt | 25 ++++++++ api/game/velocity/build.gradle.kts | 8 +++ .../anvilpowered/anvil/api/AnvilVelocity.kt | 22 +++++++ .../org/anvilpowered/anvil/api/ApiBindings.kt | 25 ++++++++ .../anvilpowered/anvil/api/LoggingScope.kt | 32 ++++++++++ api/web/build.gradle.kts | 9 +++ {core => app/cli}/build.gradle.kts | 1 + .../cockpit}/application/build.gradle.kts | 2 +- .../cockpit}/backend/build.gradle.kts | 0 {cockpit => app/cockpit}/build.gradle.kts | 0 .../cockpit}/domain/build.gradle.kts | 2 +- {cockpit => app/cockpit}/ui/build.gradle.kts | 2 +- .../kotlin/org/anvilpowered/anvil/ui/App.kt | 0 .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 0 .../org/anvilpowered/anvil/ui/Routing.kt | 0 .../org/anvilpowered/anvil/ui/UUIDStuff.kt | 0 .../anvil/ui/component/SearchBox.kt | 0 .../anvil/ui/component/Sidebar.kt | 0 .../anvil/ui/page/dashboard/Home.kt | 0 .../anvil/ui/page/servers/Create.kt | 0 .../anvil/ui/page/servers/Home.kt | 2 +- .../ui/src/jsMain/resources/index.html | 0 .../plugin}/build.gradle.kts | 7 +-- .../mc => app/plugin}/sponge/build.gradle.kts | 0 .../anvil/plugin}/AnvilSpongePlugin.kt | 2 +- .../anvil/plugin/command/AnvilCommand.kt | 15 +++++ .../plugin}/command/AnvilPluginsCommand.kt | 13 ++--- .../plugin}/command/ArgumentExtensions.kt | 6 +- app/plugin/velocity/build.gradle.kts | 12 ++++ .../anvil/plugin/AnvilVelocityPlugin.kt | 35 +++++++++++ .../plugin/AnvilVelocityPluginBootstrap.kt | 26 +++------ .../kotlin-jvm.base-conventions.gradle.kts | 3 +- .../anvil/platform/AgentPlatform.kt | 9 --- .../anvil/platform/AgentPlugin.kt | 5 -- .../anvil/platform/UniversalPlugin.kt | 5 -- .../org/anvilpowered/anvil/user/Component.kt | 3 - .../org/anvilpowered/anvil/user/Component.kt | 3 - core/web/build.gradle.kts | 15 ----- .../org/anvilpowered/anvil/web/AddAgent.kt | 9 --- .../kotlin/org/anvilpowered/anvil/web/Foo.kt | 4 -- .../kotlin/org/anvilpowered/anvil/web/Main.kt | 15 ----- .../anvilpowered/anvil/web/web-platforms.kt | 5 -- {core/domain => domain}/build.gradle.kts | 5 +- .../org/anvilpowered/anvil/domain}/Anvil.kt | 2 +- .../org/anvilpowered/anvil/domain}/Server.kt | 2 +- .../domain/command/GameUserCommandScope.kt | 32 ++++++++++ .../domain/command/PlayerCommandScope.kt | 15 +++++ .../anvil/domain}/datastore/GameTypeJoin.kt | 2 +- .../anvil/domain}/datastore/GameTypeScope.kt | 4 +- .../anvil/domain}/datastore/GameUserScope.kt | 4 +- .../domain}/datastore/ServerNodeScope.kt | 4 +- .../anvil/domain}/entity/AnvilUser.kt | 2 +- .../anvil/domain}/entity/GameType.kt | 2 +- .../anvil/domain}/entity/MinecraftUserData.kt | 2 +- .../anvil/domain}/entity/ServerNode.kt | 2 +- .../anvil/domain/platform/GamePlatform.kt | 6 ++ .../anvil/domain/platform/Platform.kt | 24 ++++++++ .../anvil/domain/platform/Plugin.kt | 5 ++ .../anvil/domain/platform/PluginManager.kt | 27 +++++++++ .../anvil/domain}/user/Audience.kt | 2 +- .../anvil/domain}/user/CommandSource.kt | 2 +- .../anvil/domain/user/Component.kt | 3 + .../anvil/domain}/user/DiscordUser.kt | 2 +- .../anvil/domain}/user/GameUser.kt | 2 +- .../anvil/domain}/user/PermissionSubject.kt | 2 +- .../anvilpowered/anvil/domain}/user/Player.kt | 2 +- .../anvil/domain}/user/Audience.kt | 2 +- .../anvil/domain/user/Component.kt | 3 + .../anvil/domain}/user/Audience.kt | 2 +- .../anvil/domain}/user/Component.kt | 2 +- gradle/libs.versions.toml | 15 +++-- infrastructure/build.gradle.kts | 12 ++++ {core => infrastructure}/db/build.gradle.kts | 2 +- .../anvil/datastore/GameTypeScopeImpl.kt | 3 +- .../anvil/datastore/RepositoryExtensions.kt | 0 .../anvil/datastore/ServerNodeScopeImpl.kt | 3 + .../anvilpowered/anvil/entity/AnvilTable.kt | 0 .../anvilpowered/anvil/entity/GameTypes.kt | 1 + .../anvil/entity/MinecraftUsers.kt | 1 + .../anvilpowered/anvil/entity/ServerNodes.kt | 1 + .../org/anvilpowered/anvil/entity/Users.kt | 1 + .../db/src/jvmMain/resources/application.conf | 0 infrastructure/game/build.gradle.kts | 8 +++ infrastructure/game/sponge/build.gradle.kts | 7 +++ .../game}/velocity/build.gradle.kts | 6 +- .../anvilpowered/anvil}/ProxyServerScope.kt | 2 +- .../anvilpowered/anvil/VelocityApiBindings.kt | 32 ++++++++++ .../anvil}/command/VelocityCustomCommand.kt | 41 +++---------- .../anvil/command/VelocitySourceConverter.kt | 30 ++++++++++ .../anvil/platform/VelocityGamePlatform.kt | 31 ++++++++++ .../anvil/platform/VelocityPlugin.kt | 29 ++++++++++ .../anvil/platform/VelocityPluginManager.kt | 34 +++++++++++ .../anvil/user/AnvilVelocityCommandSource.kt | 30 ++++++++++ .../user/AnvilVelocityPermissionSubject.kt | 14 ++--- .../anvil}/user/AnvilVelocityPlayer.kt | 18 ++++-- .../anvil/http/client/AgentClient.kt | 3 + .../anvil/http/server/AgentServer.kt | 3 + .../command/CommonGameUserCommandScope.kt | 58 +++++++++++++++++++ settings.gradle.kts | 32 +++++----- 108 files changed, 710 insertions(+), 267 deletions(-) delete mode 100644 agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilCommand.kt delete mode 100644 agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/CustomCommandScope.kt delete mode 100644 agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/platform/PluginManager.kt delete mode 100644 agent/build.gradle.kts delete mode 100644 agent/infrastructure/build.gradle.kts delete mode 100644 agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/client/AgentClient.kt delete mode 100644 agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/server/AgentServer.kt create mode 100644 api/build.gradle.kts create mode 100644 api/game/build.gradle.kts create mode 100644 api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt create mode 100644 api/game/velocity/build.gradle.kts create mode 100644 api/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/api/AnvilVelocity.kt create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggingScope.kt create mode 100644 api/web/build.gradle.kts rename {core => app/cli}/build.gradle.kts (61%) rename {cockpit => app/cockpit}/application/build.gradle.kts (58%) rename {cockpit => app/cockpit}/backend/build.gradle.kts (100%) rename {cockpit => app/cockpit}/build.gradle.kts (100%) rename {cockpit => app/cockpit}/domain/build.gradle.kts (58%) rename {cockpit => app/cockpit}/ui/build.gradle.kts (92%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt (100%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt (100%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt (100%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt (100%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt (100%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt (100%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt (100%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt (100%) rename {cockpit => app/cockpit}/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt (97%) rename {cockpit => app/cockpit}/ui/src/jsMain/resources/index.html (100%) rename {agent/application => app/plugin}/build.gradle.kts (65%) rename {agent/mc => app/plugin}/sponge/build.gradle.kts (100%) rename {agent/mc/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent => app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin}/AnvilSpongePlugin.kt (92%) create mode 100644 app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt rename {agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent => app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin}/command/AnvilPluginsCommand.kt (69%) rename {agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent => app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin}/command/ArgumentExtensions.kt (85%) create mode 100644 app/plugin/velocity/build.gradle.kts create mode 100644 app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt rename agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt => app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt (61%) delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlatform.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlugin.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/UniversalPlugin.kt delete mode 100644 core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Component.kt delete mode 100644 core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Component.kt delete mode 100644 core/web/build.gradle.kts delete mode 100644 core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/AddAgent.kt delete mode 100644 core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Foo.kt delete mode 100644 core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Main.kt delete mode 100644 core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/web-platforms.kt rename {core/domain => domain}/build.gradle.kts (73%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/Anvil.kt (95%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/Server.kt (71%) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/datastore/GameTypeJoin.kt (79%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/datastore/GameTypeScope.kt (77%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/datastore/GameUserScope.kt (81%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/datastore/ServerNodeScope.kt (75%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/entity/AnvilUser.kt (91%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/entity/GameType.kt (91%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/entity/MinecraftUserData.kt (91%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/entity/ServerNode.kt (91%) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatform.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Platform.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Plugin.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/user/Audience.kt (63%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/user/CommandSource.kt (56%) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/user/DiscordUser.kt (66%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/user/GameUser.kt (90%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/user/PermissionSubject.kt (94%) rename {core/domain/src/commonMain/kotlin/org/anvilpowered/anvil => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain}/user/Player.kt (58%) rename {core/domain/src/jsMain/kotlin/org/anvilpowered/anvil => domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain}/user/Audience.kt (66%) create mode 100644 domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt rename {core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil => domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain}/user/Audience.kt (60%) rename {core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil => domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain}/user/Component.kt (60%) create mode 100644 infrastructure/build.gradle.kts rename {core => infrastructure}/db/build.gradle.kts (75%) rename {core => infrastructure}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt (95%) rename {core => infrastructure}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt (100%) rename {core => infrastructure}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt (92%) rename {core => infrastructure}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt (100%) rename {core => infrastructure}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt (91%) rename {core => infrastructure}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt (92%) rename {core => infrastructure}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt (91%) rename {core => infrastructure}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt (92%) rename {core => infrastructure}/db/src/jvmMain/resources/application.conf (100%) create mode 100644 infrastructure/game/build.gradle.kts create mode 100644 infrastructure/game/sponge/build.gradle.kts rename {agent/mc => infrastructure/game}/velocity/build.gradle.kts (62%) rename {agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent => infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil}/ProxyServerScope.kt (75%) create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt rename {agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent => infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil}/command/VelocityCustomCommand.kt (53%) create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt rename {agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent => infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil}/user/AnvilVelocityPermissionSubject.kt (66%) rename {agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent => infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil}/user/AnvilVelocityPlayer.kt (59%) create mode 100644 infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt create mode 100644 infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt create mode 100644 infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilCommand.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilCommand.kt deleted file mode 100644 index b779f7160..000000000 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilCommand.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.agent.command - -object AnvilCommand diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/CustomCommandScope.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/CustomCommandScope.kt deleted file mode 100644 index a2ccbc9af..000000000 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/CustomCommandScope.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.anvilpowered.anvil.agent.command - -import org.anvilpowered.anvil.user.CommandSource -import org.anvilpowered.anvil.user.GameUser -import org.anvilpowered.anvil.user.Player -import org.anvilpowered.kbrig.builder.ArgumentBuilder -import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder -import org.anvilpowered.kbrig.context.CommandContext - -interface CustomCommandScope { - fun ArgumentBuilder.Companion.player( - name: String = "player", - command: (context: CommandContext, player: Player) -> Int, - ): RequiredArgumentBuilder - - fun ArgumentBuilder.Companion.gameUser( - name: String = "gameUser", - command: (context: CommandContext, gameUser: GameUser) -> Int, - ): RequiredArgumentBuilder -} diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/platform/PluginManager.kt b/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/platform/PluginManager.kt deleted file mode 100644 index abef4ca7a..000000000 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/platform/PluginManager.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.anvilpowered.anvil.agent.platform - -import org.anvilpowered.anvil.platform.AgentPlugin - -interface PluginManager { - val plugins: List - - interface Scope { - val pluginManager: PluginManager - } -} diff --git a/agent/build.gradle.kts b/agent/build.gradle.kts deleted file mode 100644 index eb60dde26..000000000 --- a/agent/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") - alias(libs.plugins.shadow) -} - -dependencies { - commonMainImplementation(project(":anvil-agent-mc-sponge")) - commonMainImplementation(project(":anvil-agent-mc-velocity")) -} diff --git a/agent/infrastructure/build.gradle.kts b/agent/infrastructure/build.gradle.kts deleted file mode 100644 index 69bb7ad8d..000000000 --- a/agent/infrastructure/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") -} - -dependencies { - commonMainImplementation(libs.bundles.ktor.client) - commonMainImplementation(libs.bundles.ktor.server) -} diff --git a/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/client/AgentClient.kt b/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/client/AgentClient.kt deleted file mode 100644 index 7e56da9d5..000000000 --- a/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/client/AgentClient.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.agent.http.client - -object AgentClient diff --git a/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/server/AgentServer.kt b/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/server/AgentServer.kt deleted file mode 100644 index 13130a9da..000000000 --- a/agent/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/agent/http/server/AgentServer.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.agent.http.server - -object AgentServer diff --git a/api/build.gradle.kts b/api/build.gradle.kts new file mode 100644 index 000000000..a6a46c2dd --- /dev/null +++ b/api/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("kotlin-jvm.base-conventions") + id("kotlin-js.base-conventions") +} + +dependencies { + commonMainApi(libs.logging) + commonMainApi(project(":anvil-domain")) +} diff --git a/api/game/build.gradle.kts b/api/game/build.gradle.kts new file mode 100644 index 000000000..8df7fd196 --- /dev/null +++ b/api/game/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(project(":anvil-api")) + commonMainRuntimeOnly(project(":anvil-infrastructure-game")) +} diff --git a/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt b/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt new file mode 100644 index 000000000..cb2536224 --- /dev/null +++ b/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt @@ -0,0 +1,25 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api + +import org.anvilpowered.anvil.domain.platform.GamePlatform + +interface GameApiBindings : + ApiBindings, + GamePlatform diff --git a/api/game/velocity/build.gradle.kts b/api/game/velocity/build.gradle.kts new file mode 100644 index 000000000..d2fdc5c36 --- /dev/null +++ b/api/game/velocity/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(project(":anvil-api-game")) + commonMainImplementation(project(":anvil-infrastructure-game-velocity")) +} diff --git a/api/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/api/AnvilVelocity.kt b/api/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/api/AnvilVelocity.kt new file mode 100644 index 000000000..eb51cd480 --- /dev/null +++ b/api/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/api/AnvilVelocity.kt @@ -0,0 +1,22 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api + +object AnvilVelocity { +} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt new file mode 100644 index 000000000..d8f0f1fa8 --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt @@ -0,0 +1,25 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api + +import org.anvilpowered.anvil.domain.platform.Platform + +interface ApiBindings : + LoggingScope, + Platform diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggingScope.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggingScope.kt new file mode 100644 index 000000000..5172c983d --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggingScope.kt @@ -0,0 +1,32 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api + +import org.lighthousegames.logging.KmLog +import org.lighthousegames.logging.logging + +interface LoggingScope { + val logger: KmLog + + companion object { + fun create(name: String): LoggingScope = object : LoggingScope { + override val logger: KmLog = logging(name) + } + } +} diff --git a/api/web/build.gradle.kts b/api/web/build.gradle.kts new file mode 100644 index 000000000..2ec45f6ee --- /dev/null +++ b/api/web/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainImplementation(project(":anvil-domain")) + jvmMainImplementation(libs.bundles.ktor.client) + jvmMainImplementation(libs.bundles.ktor.server) +} diff --git a/core/build.gradle.kts b/app/cli/build.gradle.kts similarity index 61% rename from core/build.gradle.kts rename to app/cli/build.gradle.kts index 3614e4182..66e5f6f49 100644 --- a/core/build.gradle.kts +++ b/app/cli/build.gradle.kts @@ -1,3 +1,4 @@ plugins { id("kotlin-jvm.base-conventions") + alias(libs.plugins.shadow) } diff --git a/cockpit/application/build.gradle.kts b/app/cockpit/application/build.gradle.kts similarity index 58% rename from cockpit/application/build.gradle.kts rename to app/cockpit/application/build.gradle.kts index e65e91907..f645fd732 100644 --- a/cockpit/application/build.gradle.kts +++ b/app/cockpit/application/build.gradle.kts @@ -3,5 +3,5 @@ plugins { } dependencies { - commonMainApi(project(":anvil-core-domain")) + commonMainApi(project(":anvil-domain")) } diff --git a/cockpit/backend/build.gradle.kts b/app/cockpit/backend/build.gradle.kts similarity index 100% rename from cockpit/backend/build.gradle.kts rename to app/cockpit/backend/build.gradle.kts diff --git a/cockpit/build.gradle.kts b/app/cockpit/build.gradle.kts similarity index 100% rename from cockpit/build.gradle.kts rename to app/cockpit/build.gradle.kts diff --git a/cockpit/domain/build.gradle.kts b/app/cockpit/domain/build.gradle.kts similarity index 58% rename from cockpit/domain/build.gradle.kts rename to app/cockpit/domain/build.gradle.kts index e65e91907..f645fd732 100644 --- a/cockpit/domain/build.gradle.kts +++ b/app/cockpit/domain/build.gradle.kts @@ -3,5 +3,5 @@ plugins { } dependencies { - commonMainApi(project(":anvil-core-domain")) + commonMainApi(project(":anvil-domain")) } diff --git a/cockpit/ui/build.gradle.kts b/app/cockpit/ui/build.gradle.kts similarity index 92% rename from cockpit/ui/build.gradle.kts rename to app/cockpit/ui/build.gradle.kts index 3a8c47d6e..1833f7cc7 100644 --- a/cockpit/ui/build.gradle.kts +++ b/app/cockpit/ui/build.gradle.kts @@ -6,7 +6,7 @@ fun kotlinw(target: String): String = "org.jetbrains.kotlin-wrappers:kotlin-$target" dependencies { - commonMainImplementation(project(":anvil-core-domain")) + commonMainImplementation(project(":anvil-domain")) commonMainImplementation(libs.redux) jsMainImplementation(enforcedPlatform(kotlinw("wrappers-bom:1.0.0-pre.480"))) diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt similarity index 100% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt similarity index 100% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt similarity index 100% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt similarity index 100% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt similarity index 100% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt similarity index 100% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt similarity index 100% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt similarity index 100% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt diff --git a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt similarity index 97% rename from cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt rename to app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt index 1a75d7c21..11b6e9312 100644 --- a/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt +++ b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt @@ -17,7 +17,7 @@ import mui.material.Typography import mui.material.styles.TypographyVariant import mui.system.sx import org.anvilpowered.anvil.ui.component.SearchBox -import org.anvilpowered.anvil.Server +import org.anvilpowered.anvil.domain.Server import react.FC import react.Props import react.router.useNavigate diff --git a/cockpit/ui/src/jsMain/resources/index.html b/app/cockpit/ui/src/jsMain/resources/index.html similarity index 100% rename from cockpit/ui/src/jsMain/resources/index.html rename to app/cockpit/ui/src/jsMain/resources/index.html diff --git a/agent/application/build.gradle.kts b/app/plugin/build.gradle.kts similarity index 65% rename from agent/application/build.gradle.kts rename to app/plugin/build.gradle.kts index 869699bc5..4ebad4448 100644 --- a/agent/application/build.gradle.kts +++ b/app/plugin/build.gradle.kts @@ -1,14 +1,11 @@ plugins { id("kotlin-jvm.base-conventions") - id("anvil-publish") - alias(libs.plugins.shadow) - `java-library` } dependencies { - commonMainApi(project(":anvil-core-domain")) + commonMainApi(project(":anvil-api-game")) jvmMainApi(platform(libs.adventure.bom)) - jvmMainApi("net.kyori:adventure-api") // TODO: -> compileOnly ASAP + jvmMainApi("net.kyori:adventure-api") // TODO: -> compileOnlyApi ASAP // compileOnlyApi(libs.logging.api) commonMainApi(libs.kbrig.core) } diff --git a/agent/mc/sponge/build.gradle.kts b/app/plugin/sponge/build.gradle.kts similarity index 100% rename from agent/mc/sponge/build.gradle.kts rename to app/plugin/sponge/build.gradle.kts diff --git a/agent/mc/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt b/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt similarity index 92% rename from agent/mc/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt rename to app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt index e63bde163..5d88e0bba 100644 --- a/agent/mc/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilSpongePlugin.kt +++ b/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.agent +package org.anvilpowered.anvil.plugin import com.google.inject.Inject import org.apache.logging.log4j.Logger diff --git a/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt new file mode 100644 index 000000000..62de5ecd8 --- /dev/null +++ b/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt @@ -0,0 +1,15 @@ +package org.anvilpowered.anvil.plugin.command + +import org.anvilpowered.anvil.domain.platform.PluginManager +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.tree.LiteralCommandNode + +object AnvilCommand { + context(PluginManager.Scope) + fun create(): LiteralCommandNode { + return ArgumentBuilder.literal("anvil") + .then(createPlugins()) + .build() + } +} diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt b/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt similarity index 69% rename from agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt rename to app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt index dc3d2485a..5d27c9911 100644 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/AnvilPluginsCommand.kt +++ b/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt @@ -1,19 +1,18 @@ -package org.anvilpowered.anvil.agent.command +package org.anvilpowered.anvil.plugin.command import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.agent.platform.PluginManager -import org.anvilpowered.anvil.user.CommandSource -import org.anvilpowered.anvil.user.Component +import org.anvilpowered.anvil.domain.platform.PluginManager +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess import org.anvilpowered.kbrig.tree.LiteralCommandNode context(PluginManager.Scope) -fun AnvilCommand.createPlugins(): LiteralCommandNode { - return ArgumentBuilder.literal("plugins") +fun AnvilCommand.createPlugins(): LiteralCommandNode = + ArgumentBuilder.literal("plugins") .requiresPermission("anvil.agent.plugins") .executesSingleSuccess { context -> val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } context.source.sendMessage(Component.text("Plugins: $pluginNamesString").color(NamedTextColor.AQUA)) }.build() -} diff --git a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt b/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/ArgumentExtensions.kt similarity index 85% rename from agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt rename to app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/ArgumentExtensions.kt index e0a4d9837..8aefc8a58 100644 --- a/agent/application/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/ArgumentExtensions.kt +++ b/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/ArgumentExtensions.kt @@ -16,10 +16,10 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.agent.command +package org.anvilpowered.anvil.plugin.command -import org.anvilpowered.anvil.user.CommandSource -import org.anvilpowered.anvil.user.hasPermissionSet +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.user.hasPermissionSet import org.anvilpowered.kbrig.builder.ArgumentBuilder fun > B.requiresPermission(permission: String): B = diff --git a/app/plugin/velocity/build.gradle.kts b/app/plugin/velocity/build.gradle.kts new file mode 100644 index 000000000..74fe6f0a0 --- /dev/null +++ b/app/plugin/velocity/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("kotlin-jvm.base-conventions") + kotlin("kapt") +} + +dependencies { + jvmMainImplementation(project(":anvil-app-plugin")) + jvmMainImplementation(project(":anvil-infrastructure-game-velocity")) + jvmMainCompileOnly(libs.velocity) + kapt(libs.velocity) + commonMainImplementation(libs.kbrig.brigadier) +} diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt new file mode 100644 index 000000000..54722d85f --- /dev/null +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -0,0 +1,35 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.plugin + +import com.velocitypowered.api.command.BrigadierCommand +import org.anvilpowered.anvil.VelocityApiBindings +import org.anvilpowered.anvil.plugin.command.AnvilCommand + +context(VelocityApiBindings) +class AnvilVelocityPlugin { + + fun registerCommands() { + logger.info { "Anvil Agent is running!" } + proxyServer.commandManager.register(BrigadierCommand( + AnvilCommand.create() + )) + } + +} diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt similarity index 61% rename from agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt rename to app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index a37b9c432..434d8444e 100644 --- a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -16,19 +16,16 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.agent +package org.anvilpowered.anvil.plugin import com.google.inject.Inject import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyInitializeEvent -import com.velocitypowered.api.permission.Tristate import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.proxy.ProxyServer -import net.kyori.adventure.audience.Audience -import net.kyori.adventure.audience.ForwardingAudience -import org.anvilpowered.anvil.user.CommandSource +import org.anvilpowered.anvil.VelocityApiBindings +import org.anvilpowered.anvil.plugin.command.AnvilCommand import org.slf4j.Logger -import com.velocitypowered.api.command.CommandSource as VelocityCommandSource @Plugin( id = "anvil-agent", @@ -36,25 +33,16 @@ import com.velocitypowered.api.command.CommandSource as VelocityCommandSource version = "0.4.0-SNAPSHOT", authors = ["AnvilPowered"], ) -class AnvilVelocityPlugin @Inject constructor( +class AnvilVelocityPluginBootstrap @Inject constructor( private val proxyServer: ProxyServer, private val logger: Logger, ) { + val services = VelocityApiBindings(proxyServer) + @Subscribe fun onProxyInit(event: ProxyInitializeEvent) { logger.info("Anvil Agent is running!") - -// val commandNode = AnvilCommand.createPlugins() -// .mapSource<_, VelocityCommandSource> { BridgeSource(it) } -// .toBrigadier() -// -// proxyServer.commandManager.register(BrigadierCommand(commandNode)) + proxyServer.commandManager.register(BrigadierCommand(AnvilCommand.create())) } } - -class BridgeSource(private val original: VelocityCommandSource) : ForwardingAudience.Single, CommandSource { - override fun audience(): Audience = original - override fun hasPermission(permission: String): Boolean? = original.getPermissionValue(permission).toBoolean() -} - diff --git a/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts b/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts index 4c2a04019..f166b60f2 100644 --- a/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts @@ -1,10 +1,11 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension extensions.getByName("kotlin").apply { + jvmToolchain(17) jvm { withJava() compilations.all { - jvmToolchain(17) + kotlinOptions.jvmTarget = "17" } } } diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlatform.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlatform.kt deleted file mode 100644 index 846970b33..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlatform.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.anvilpowered.anvil.platform - -interface AgentPlatform { - val name: String - val gameVersion: String - val platformVersion: String - val isProxy: Boolean - val plugins: List -} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlugin.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlugin.kt deleted file mode 100644 index 54cf133b7..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/AgentPlugin.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.anvilpowered.anvil.platform - -interface AgentPlugin { - val name: String -} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/UniversalPlugin.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/UniversalPlugin.kt deleted file mode 100644 index f927730a3..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/platform/UniversalPlugin.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.anvilpowered.anvil.platform - -interface UniversalPlugin { - val name: String -} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Component.kt b/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Component.kt deleted file mode 100644 index 46220640f..000000000 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Component.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.user - -expect interface Component diff --git a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Component.kt b/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Component.kt deleted file mode 100644 index ba4b2afc5..000000000 --- a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Component.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.user - -actual interface Component diff --git a/core/web/build.gradle.kts b/core/web/build.gradle.kts deleted file mode 100644 index 8e23cf0d2..000000000 --- a/core/web/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") - alias(libs.plugins.ktor) - application -} - -application { - mainClass.set("io.ktor.server.netty.EngineMain") -} - -dependencies { - commonMainImplementation(project(":anvil-core-domain")) - jvmMainImplementation(libs.bundles.ktor.client) - jvmMainImplementation(libs.bundles.ktor.server) -} diff --git a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/AddAgent.kt b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/AddAgent.kt deleted file mode 100644 index f1f052d08..000000000 --- a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/AddAgent.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.anvilpowered.anvil.web - -import org.anvilpowered.anvil.datastore.GameTypeRepositoryActions -import org.anvilpowered.anvil.entity.GameType -import java.util.UUID - -suspend fun GameTypeRepositoryActions.bar() { - GameType.findById(UUID.randomUUID()) -} diff --git a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Foo.kt b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Foo.kt deleted file mode 100644 index 54df5f648..000000000 --- a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Foo.kt +++ /dev/null @@ -1,4 +0,0 @@ -package org.anvilpowered.anvil.web - -class Foo { -} diff --git a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Main.kt b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Main.kt deleted file mode 100644 index 4d1730eb0..000000000 --- a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/Main.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.anvilpowered.anvil.web - -import io.ktor.server.application.Application -import io.ktor.server.application.call -import io.ktor.server.response.respondText -import io.ktor.server.routing.get -import io.ktor.server.routing.routing - -fun Application.main() { - routing { - get("/") { - call.respondText("Hello, world!") - } - } -} diff --git a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/web-platforms.kt b/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/web-platforms.kt deleted file mode 100644 index dd3f79159..000000000 --- a/core/web/src/commonMain/kotlin/org/anvilpowered/anvil/web/web-platforms.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.anvilpowered.anvil.web - -object WebClient - -object WebServer diff --git a/core/domain/build.gradle.kts b/domain/build.gradle.kts similarity index 73% rename from core/domain/build.gradle.kts rename to domain/build.gradle.kts index 56a69e729..a5470c0a2 100644 --- a/core/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -6,12 +6,13 @@ plugins { } dependencies { + commonMainApi(libs.kbrig.core) commonMainApi(libs.kotlinx.datetime) commonMainApi(libs.kontour) { exclude("org.slf4j") } commonMainApi(libs.coroutines) - compileOnlyApi(platform(libs.adventure.bom)) - compileOnlyApi("net.kyori:adventure-api") + jvmMainApi(platform(libs.adventure.bom)) + jvmMainApi("net.kyori:adventure-api") jsMainImplementation(npm("uuid", "9.0.0")) } diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt similarity index 95% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt index 21b1f80e9..a72fc7e39 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Anvil.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil +package org.anvilpowered.anvil.domain interface Anvil { diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Server.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Server.kt similarity index 71% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Server.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Server.kt index 436e72fcd..444ed8112 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/Server.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Server.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil +package org.anvilpowered.anvil.domain interface Server { val id: String diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt new file mode 100644 index 000000000..b48456cf5 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt @@ -0,0 +1,32 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.command + +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder +import org.anvilpowered.kbrig.context.CommandContext + +interface GameUserCommandScope { + fun ArgumentBuilder.Companion.gameUser( + name: String = "gameUser", + command: (context: CommandContext, gameUser: GameUser) -> Int, + ): RequiredArgumentBuilder +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt new file mode 100644 index 000000000..78d78279e --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt @@ -0,0 +1,15 @@ +package org.anvilpowered.anvil.domain.command + +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder +import org.anvilpowered.kbrig.context.CommandContext + +interface PlayerCommandScope { + + fun ArgumentBuilder.Companion.player( + name: String = "player", + command: (context: CommandContext, player: Player) -> Int, + ): RequiredArgumentBuilder +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeJoin.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeJoin.kt similarity index 79% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeJoin.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeJoin.kt index 1d0adc61a..5d83d0bfb 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeJoin.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeJoin.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.datastore +package org.anvilpowered.anvil.domain.datastore import org.sourcegrade.kontour.UUID diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeScope.kt similarity index 77% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeScope.kt index 5e03715c1..5f4561620 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScope.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeScope.kt @@ -1,6 +1,6 @@ -package org.anvilpowered.anvil.datastore +package org.anvilpowered.anvil.domain.datastore -import org.anvilpowered.anvil.entity.GameType +import org.anvilpowered.anvil.domain.entity.GameType import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.scope.CrudScope diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameUserScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameUserScope.kt similarity index 81% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameUserScope.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameUserScope.kt index 76418422d..481615d8f 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/GameUserScope.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameUserScope.kt @@ -1,6 +1,6 @@ -package org.anvilpowered.anvil.datastore +package org.anvilpowered.anvil.domain.datastore -import org.anvilpowered.anvil.user.GameUser +import org.anvilpowered.anvil.domain.user.GameUser import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.SizedIterable import org.sourcegrade.kontour.scope.CrudScope diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/ServerNodeScope.kt similarity index 75% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/ServerNodeScope.kt index cd8e44e99..2760008bf 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScope.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/ServerNodeScope.kt @@ -1,6 +1,6 @@ -package org.anvilpowered.anvil.datastore +package org.anvilpowered.anvil.domain.datastore -import org.anvilpowered.anvil.entity.ServerNode +import org.anvilpowered.anvil.domain.entity.ServerNode import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.SizedIterable import org.sourcegrade.kontour.scope.CrudScope diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/AnvilUser.kt similarity index 91% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/AnvilUser.kt index 60d45648d..8cedff51a 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/AnvilUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/AnvilUser.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.entity +package org.anvilpowered.anvil.domain.entity import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/GameType.kt similarity index 91% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/GameType.kt index 0ecb523e9..77842e086 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/GameType.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/GameType.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.entity +package org.anvilpowered.anvil.domain.entity import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.Crypto diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUserData.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/MinecraftUserData.kt similarity index 91% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUserData.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/MinecraftUserData.kt index e5dad4d86..b2aeeb488 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUserData.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/MinecraftUserData.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.entity +package org.anvilpowered.anvil.domain.entity import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/ServerNode.kt similarity index 91% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/ServerNode.kt index 06cc9c760..c6a420cfb 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/entity/ServerNode.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/ServerNode.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.entity +package org.anvilpowered.anvil.domain.entity import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.Crypto diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatform.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatform.kt new file mode 100644 index 000000000..f5ff60975 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatform.kt @@ -0,0 +1,6 @@ +package org.anvilpowered.anvil.domain.platform + +interface GamePlatform : Platform { + val isProxy: Boolean + val plugins: List +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Platform.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Platform.kt new file mode 100644 index 000000000..b7d05c567 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Platform.kt @@ -0,0 +1,24 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.platform + +interface Platform { + val name: String + val platformVersion: String +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Plugin.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Plugin.kt new file mode 100644 index 000000000..a1e78735d --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Plugin.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.domain.platform + +interface Plugin { + val name: String +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt new file mode 100644 index 000000000..30d507fdc --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt @@ -0,0 +1,27 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.platform + +interface PluginManager { + val plugins: List + + interface Scope { + val pluginManager: PluginManager + } +} diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Audience.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt similarity index 63% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Audience.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt index 0170ddcb6..7d97eb26f 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Audience.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user expect interface Audience { open fun sendMessage(message: Component) diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/CommandSource.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/CommandSource.kt similarity index 56% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/CommandSource.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/CommandSource.kt index fab52f6e6..ff650bda4 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/CommandSource.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/CommandSource.kt @@ -1,3 +1,3 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user interface CommandSource : Audience, PermissionSubject diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt new file mode 100644 index 000000000..5c90af21e --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.domain.user + +expect interface Component diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/DiscordUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt similarity index 66% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/DiscordUser.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt index efdf4db0c..1dedd703b 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/DiscordUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user import org.sourcegrade.kontour.DomainEntity diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt similarity index 90% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUser.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt index 9e60508ec..ad46c9771 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/PermissionSubject.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/PermissionSubject.kt similarity index 94% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/PermissionSubject.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/PermissionSubject.kt index 329d3ea54..7818813b8 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/PermissionSubject.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/PermissionSubject.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user interface PermissionSubject { diff --git a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt similarity index 58% rename from core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt index 7a958d3da..2ac1cf2f4 100644 --- a/core/domain/src/commonMain/kotlin/org/anvilpowered/anvil/user/Player.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user interface Player : CommandSource { val user: GameUser diff --git a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Audience.kt b/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt similarity index 66% rename from core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Audience.kt rename to domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt index 332b771db..51d2fac2a 100644 --- a/core/domain/src/jsMain/kotlin/org/anvilpowered/anvil/user/Audience.kt +++ b/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user actual interface Audience { actual fun sendMessage(message: Component) { diff --git a/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt b/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt new file mode 100644 index 000000000..657c86b2a --- /dev/null +++ b/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.domain.user + +actual interface Component diff --git a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Audience.kt b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt similarity index 60% rename from core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Audience.kt rename to domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt index 847254f78..4dd300379 100644 --- a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Audience.kt +++ b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt @@ -1,3 +1,3 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user actual typealias Audience = net.kyori.adventure.audience.Audience diff --git a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Component.kt b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt similarity index 60% rename from core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Component.kt rename to domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt index 32413ae0c..fa080f581 100644 --- a/core/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/user/Component.kt +++ b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt @@ -1,3 +1,3 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain.user actual typealias Component = net.kyori.adventure.text.Component diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4df55194b..2037eb2e4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,13 @@ [versions] #kmongo = "4.8.0" -kotlin = "1.8.20" -ktor = "2.2.4" +kotlin = "1.8.21" +ktor = "2.3.0" log4j = "2.20.0" [libraries] adventure-bom = "net.kyori:adventure-bom:4.12.0" annotations = "org.jetbrains:annotations:24.0.0" -coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0-Beta" +coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0" exposed-bom = "org.jetbrains.exposed:exposed-bom:0.41.1" exposed-core = { module = "org.jetbrains.exposed:exposed-core" } exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } @@ -17,10 +17,11 @@ kbrig-brigadier = "org.anvilpowered:kbrig-brigadier:0.1.0-SNAPSHOT" kbrig-core = "org.anvilpowered:kbrig-core:0.1.0-SNAPSHOT" kontour = "org.sourcegrade:kontour-domain:0.1.0-SNAPSHOT" kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" -kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" +kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0" kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.0" kotlinx-serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0" ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" } +ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" } ktor-serialization = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } ktor-server-auth = { module = "io.ktor:ktor-server-auth", version.ref = "ktor" } ktor-server-content-negotiation = { module = "io.ktor:ktor-server-content-negotiation", version.ref = "ktor" } @@ -29,9 +30,11 @@ ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" ktor-server-resources = { module = "io.ktor:ktor-server-resources", version.ref = "ktor" } ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = "ktor" } ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" } -logging-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } -logging-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } +logging = "org.lighthousegames:logging:1.3.0" +log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } +log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.6.1" +sponge = "org.spongepowered:spongeapi:8.1.0" velocity = "com.velocitypowered:velocity-api:3.2.0-SNAPSHOT" [bundles] diff --git a/infrastructure/build.gradle.kts b/infrastructure/build.gradle.kts new file mode 100644 index 000000000..2586daf82 --- /dev/null +++ b/infrastructure/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("kotlin-jvm.base-conventions") + id("kotlin-js.base-conventions") +} + +dependencies { + commonMainImplementation(project(":anvil-api")) + commonMainImplementation(libs.ktor.serialization) + jvmMainImplementation(libs.bundles.ktor.server) + jvmMainImplementation(libs.ktor.client.cio) + jsMainImplementation(libs.ktor.client.js) +} diff --git a/core/db/build.gradle.kts b/infrastructure/db/build.gradle.kts similarity index 75% rename from core/db/build.gradle.kts rename to infrastructure/db/build.gradle.kts index e7193102b..8977fd71a 100644 --- a/core/db/build.gradle.kts +++ b/infrastructure/db/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } dependencies { - commonMainApi(project(":anvil-core-domain")) + commonMainApi(project(":anvil-domain")) jvmMainApi(platform(libs.exposed.bom)) jvmMainApi(libs.bundles.exposed) } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt similarity index 95% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt index dab306eb9..c22c3fd22 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt @@ -18,7 +18,8 @@ package org.anvilpowered.anvil.datastore -import org.anvilpowered.anvil.entity.GameType +import org.anvilpowered.anvil.domain.datastore.GameTypeScope +import org.anvilpowered.anvil.domain.entity.GameType import org.anvilpowered.anvil.entity.GameTypes import org.anvilpowered.anvil.entity.setValuesFrom import org.anvilpowered.anvil.entity.toGameType diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt similarity index 92% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt index 60a6a7e3d..1a87eca86 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt @@ -1,5 +1,8 @@ package org.anvilpowered.anvil.datastore +import org.anvilpowered.anvil.domain.datastore.GameTypeJoin +import org.anvilpowered.anvil.domain.datastore.ServerNodeScope +import org.anvilpowered.anvil.domain.entity.ServerNode import org.anvilpowered.anvil.entity.* import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt similarity index 91% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt index 63ecb219e..90e59ccff 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt @@ -1,5 +1,6 @@ package org.anvilpowered.anvil.entity +import org.anvilpowered.anvil.domain.entity.GameType import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.statements.InsertStatement diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt similarity index 92% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt index 7e5a4a22f..cbc8791ab 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt @@ -1,5 +1,6 @@ package org.anvilpowered.anvil.entity +import org.anvilpowered.anvil.domain.entity.MinecraftUserData import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.statements.InsertStatement diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt similarity index 91% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt index e365f138c..877e4fa78 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt @@ -1,5 +1,6 @@ package org.anvilpowered.anvil.entity +import org.anvilpowered.anvil.domain.entity.ServerNode import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.statements.InsertStatement diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt similarity index 92% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt index 08ebb3bb8..7db3ae3fa 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt @@ -1,5 +1,6 @@ package org.anvilpowered.anvil.entity +import org.anvilpowered.anvil.domain.entity.AnvilUser import org.jetbrains.exposed.dao.id.UUIDTable import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.statements.InsertStatement diff --git a/core/db/src/jvmMain/resources/application.conf b/infrastructure/db/src/jvmMain/resources/application.conf similarity index 100% rename from core/db/src/jvmMain/resources/application.conf rename to infrastructure/db/src/jvmMain/resources/application.conf diff --git a/infrastructure/game/build.gradle.kts b/infrastructure/game/build.gradle.kts new file mode 100644 index 000000000..d06780119 --- /dev/null +++ b/infrastructure/game/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(project(":anvil-infrastructure")) + commonMainApi(project(":anvil-api-game")) +} diff --git a/infrastructure/game/sponge/build.gradle.kts b/infrastructure/game/sponge/build.gradle.kts new file mode 100644 index 000000000..cfb084ad3 --- /dev/null +++ b/infrastructure/game/sponge/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainImplementation(project(":anvil-domain")) +} diff --git a/agent/mc/velocity/build.gradle.kts b/infrastructure/game/velocity/build.gradle.kts similarity index 62% rename from agent/mc/velocity/build.gradle.kts rename to infrastructure/game/velocity/build.gradle.kts index 21af5ade1..bd47d4021 100644 --- a/agent/mc/velocity/build.gradle.kts +++ b/infrastructure/game/velocity/build.gradle.kts @@ -1,11 +1,9 @@ plugins { id("kotlin-jvm.base-conventions") - kotlin("kapt") } dependencies { - jvmMainApi(project(":anvil-agent-application")) - jvmMainCompileOnly(libs.velocity) - kapt(libs.velocity) + commonMainImplementation(project(":anvil-infrastructure-game")) commonMainImplementation(libs.kbrig.brigadier) + jvmMainCompileOnly(libs.velocity) } diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/ProxyServerScope.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt similarity index 75% rename from agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/ProxyServerScope.kt rename to infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt index 96e15d29f..d920b40bd 100644 --- a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/ProxyServerScope.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.agent +package org.anvilpowered.anvil import com.velocitypowered.api.proxy.ProxyServer diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt new file mode 100644 index 000000000..7ee4310f7 --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt @@ -0,0 +1,32 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil + +import com.velocitypowered.api.proxy.ProxyServer +import org.anvilpowered.anvil.api.GameApiBindings +import org.anvilpowered.anvil.api.LoggingScope +import org.anvilpowered.anvil.domain.platform.GamePlatform +import org.anvilpowered.anvil.domain.platform.PluginManager +import org.anvilpowered.anvil.platform.VelocityGamePlatform +import org.anvilpowered.anvil.platform.VelocityPluginManager + +class VelocityApiBindings(val proxyServer: ProxyServer) : GameApiBindings, + GamePlatform by VelocityGamePlatform(proxyServer), + LoggingScope by LoggingScope.create("anvil-velocity"), + PluginManager.Scope by VelocityPluginManager.createScope(proxyServer.pluginManager) diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/VelocityCustomCommand.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt similarity index 53% rename from agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/VelocityCustomCommand.kt rename to infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt index ab44e91bc..2206cb817 100644 --- a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/command/VelocityCustomCommand.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt @@ -1,25 +1,22 @@ -package org.anvilpowered.anvil.agent.command +package org.anvilpowered.anvil.command -import kotlinx.coroutines.coroutineScope import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.agent.ProxyServerScope -import org.anvilpowered.anvil.agent.user.toAnvil -import org.anvilpowered.anvil.datastore.GameUserScope -import org.anvilpowered.anvil.user.CommandSource -import org.anvilpowered.anvil.user.GameUser -import org.anvilpowered.anvil.user.Player +import org.anvilpowered.anvil.ProxyServerScope +import org.anvilpowered.anvil.domain.command.PlayerCommandScope +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.user.toAnvil import org.anvilpowered.kbrig.argument.StringArgumentType import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder -import org.anvilpowered.kbrig.builder.executesSuspending import org.anvilpowered.kbrig.context.CommandContext import org.anvilpowered.kbrig.context.get import kotlin.jvm.optionals.getOrNull -class VelocityCustomCommand : CustomCommandScope { +context(ProxyServerScope) +class VelocityCustomCommand : PlayerCommandScope { - context(ProxyServerScope) override fun ArgumentBuilder.Companion.player( name: String, command: (context: CommandContext, player: Player) -> Int, @@ -43,26 +40,4 @@ class VelocityCustomCommand : CustomCommandScope { 0 } } - - context(ProxyServerScope, GameUserScope) - override fun ArgumentBuilder.Companion.gameUser( - name: String, - command: (context: CommandContext, gameUser: GameUser) -> Int, - ): RequiredArgumentBuilder = - required(name, StringArgumentType.SingleWord) - .suggests { _, builder -> - GameUser.getAllUserNames(startWith = builder.input).forEach { name -> builder.suggest(name) } - builder.build() - } - .executesSuspending { context -> - val gameUserName = context.get(name) - - GameUser.findByUsername(gameUserName)?.let { gameUser -> - command(context, gameUser) - } ?: run { - - } - - command(context, ) - } } diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt new file mode 100644 index 000000000..539cd3668 --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt @@ -0,0 +1,30 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +@file:JvmName("VelocitySourceConverter") + +package org.anvilpowered.anvil.command + +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.user.toAnvil +import org.anvilpowered.kbrig.tree.ArgumentCommandNode +import org.anvilpowered.kbrig.tree.mapSource +import com.velocitypowered.api.command.CommandSource as VelocityCommandSource + +fun ArgumentCommandNode.mapToVelocitySource(): ArgumentCommandNode = + mapSource { it.toAnvil() } diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt new file mode 100644 index 000000000..a9a500772 --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt @@ -0,0 +1,31 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.platform + +import com.velocitypowered.api.proxy.ProxyServer +import org.anvilpowered.anvil.domain.platform.GamePlatform +import org.anvilpowered.anvil.domain.platform.Plugin + +internal class VelocityGamePlatform(private val proxyServer: ProxyServer) : GamePlatform { + override val name: String = "velocity" + override val platformVersion: String = proxyServer.version.version + override val isProxy: Boolean = true + override val plugins: List + get() = proxyServer.pluginManager.plugins.map { it.toAnvilPlugin() } +} diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt new file mode 100644 index 000000000..e5fca8c85 --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt @@ -0,0 +1,29 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.platform + +import com.velocitypowered.api.plugin.PluginContainer +import org.anvilpowered.anvil.domain.platform.Plugin + +internal class VelocityPlugin(private val container: PluginContainer) : Plugin { + override val name: String + get() = container.description.id +} + +internal fun PluginContainer.toAnvilPlugin() = VelocityPlugin(this) diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt new file mode 100644 index 000000000..e87b8ac03 --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt @@ -0,0 +1,34 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.platform + +import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.domain.platform.PluginManager +import com.velocitypowered.api.plugin.PluginManager as BackingPluginManager + +internal class VelocityPluginManager(private val backing: BackingPluginManager) : PluginManager { + override val plugins: List + get() = backing.plugins.map { VelocityPlugin(it) } + + companion object { + fun createScope(backing: BackingPluginManager) = object : PluginManager.Scope { + override val pluginManager: PluginManager = VelocityPluginManager(backing) + } + } +} diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt new file mode 100644 index 000000000..5f9d05bc0 --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt @@ -0,0 +1,30 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.user.PermissionSubject +import com.velocitypowered.api.command.CommandSource as VelocityCommandSource + +fun VelocityCommandSource.toAnvil(): CommandSource = AnvilVelocityCommandSource(this) + +private class AnvilVelocityCommandSource( + private val velocityCommandSource: VelocityCommandSource, +) : CommandSource, + PermissionSubject by velocityCommandSource.toAnvil() diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPermissionSubject.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPermissionSubject.kt similarity index 66% rename from agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPermissionSubject.kt rename to infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPermissionSubject.kt index ec4225d24..e1f9bc141 100644 --- a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPermissionSubject.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPermissionSubject.kt @@ -1,7 +1,7 @@ -package org.anvilpowered.anvil.agent.user +package org.anvilpowered.anvil.user import com.velocitypowered.api.permission.Tristate -import org.anvilpowered.anvil.user.PermissionSubject +import org.anvilpowered.anvil.domain.user.PermissionSubject import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject fun VelocityPermissionSubject.toAnvil(): PermissionSubject = AnvilVelocityPermissionSubject(this) @@ -13,10 +13,8 @@ private class AnvilVelocityPermissionSubject( velocityPermissionSubject.getPermissionValue(permission).toBoolean() } -private fun Tristate.toBoolean(): Boolean? { - return when (this) { - Tristate.TRUE -> true - Tristate.FALSE -> false - Tristate.UNDEFINED -> null - } +private fun Tristate.toBoolean(): Boolean? = when (this) { + Tristate.TRUE -> true + Tristate.FALSE -> false + Tristate.UNDEFINED -> null } diff --git a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPlayer.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt similarity index 59% rename from agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPlayer.kt rename to infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt index e1ab7c9be..dacfd67b3 100644 --- a/agent/mc/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/agent/user/AnvilVelocityPlayer.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt @@ -1,9 +1,10 @@ -package org.anvilpowered.anvil.agent.user +package org.anvilpowered.anvil.user -import org.anvilpowered.anvil.user.Audience -import org.anvilpowered.anvil.user.GameUser -import org.anvilpowered.anvil.user.PermissionSubject -import org.anvilpowered.anvil.user.Player +import org.anvilpowered.anvil.domain.user.Audience +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.PermissionSubject +import org.anvilpowered.anvil.domain.user.Player +import kotlin.math.pow import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject import com.velocitypowered.api.proxy.Player as VelocityPlayer @@ -18,3 +19,10 @@ private class AnvilVelocityPlayer( override val user: GameUser get() = TODO("Not yet implemented") } + + +fun foo(op1: Float, op2: Float) { + + '1'.code - '0'.code + +} diff --git a/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt b/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt new file mode 100644 index 000000000..7b4016edb --- /dev/null +++ b/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.plugin.http.client + +object AgentClient diff --git a/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt b/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt new file mode 100644 index 000000000..c017db761 --- /dev/null +++ b/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt @@ -0,0 +1,3 @@ +package org.anvilpowered.anvil.plugin.http.server + +object AgentServer diff --git a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt b/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt new file mode 100644 index 000000000..d6e08bbd0 --- /dev/null +++ b/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt @@ -0,0 +1,58 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.command + +import net.kyori.adventure.text.format.NamedTextColor +import org.anvilpowered.anvil.domain.command.GameUserCommandScope +import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.kbrig.argument.StringArgumentType +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder +import org.anvilpowered.kbrig.builder.executesSuspending +import org.anvilpowered.kbrig.context.CommandContext +import org.anvilpowered.kbrig.context.get + +context(org.anvilpowered.anvil.domain.datastore.GameUserScope) +class CommonGameUserCommandScope : GameUserCommandScope { + override fun ArgumentBuilder.Companion.gameUser( + name: String, + command: (context: CommandContext, gameUser: GameUser) -> Int, + ): RequiredArgumentBuilder = + required(name, StringArgumentType.SingleWord) + .suggests { _, builder -> + GameUser.getAllUserNames(startWith = builder.input).forEach { name -> builder.suggest(name) } + builder.build() + } + .executesSuspending { context -> + val gameUserName = context.get(name) + GameUser.findByUsername(gameUserName)?.let { gameUser -> + command(context, gameUser) + } ?: run { + context.source.sendMessage( + Component.text() + .append(Component.text("GameUser with name ", NamedTextColor.RED)) + .append(Component.text(gameUserName, NamedTextColor.GOLD)) + .append(Component.text(" not found!", NamedTextColor.RED)), + ) + 0 + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 0e61a88dd..3a01bfec6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,20 +22,24 @@ pluginManagement { rootProject.name = "anvil" sequenceOf( - "agent", - "agent-application", - "agent-infrastructure", - "agent-mc-sponge", - "agent-mc-velocity", - "cockpit", - "cockpit-application", - "cockpit-backend", - "cockpit-domain", - "cockpit-ui", - "core", - "core-db", - "core-domain", - "core-web", + "api", + "api-game", + "api-web", + "app-plugin", + "app-plugin-sponge", + "app-plugin-velocity", + "app-cockpit", + "app-cockpit-application", + "app-cockpit-backend", + "app-cockpit-domain", + "app-cockpit-ui", + "app-cli", + "domain", + "infrastructure", + "infrastructure-db", + "infrastructure-game", + "infrastructure-game-sponge", + "infrastructure-game-velocity", ).forEach { val project = ":anvil-$it" include(project) From 79073ac950337017215b536488b0913e1d67e1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 12 May 2023 14:52:35 +0200 Subject: [PATCH 20/77] Clean up and fix publishing --- api/build.gradle.kts | 1 + api/game/build.gradle.kts | 1 + api/game/velocity/build.gradle.kts | 8 ----- .../anvilpowered/anvil/api/AnvilVelocity.kt | 22 -------------- .../anvil/api/user}/ArgumentExtensions.kt | 6 ++-- .../org/anvilpowered/anvil/ui/UUIDStuff.kt | 4 --- app/plugin/build.gradle.kts | 8 ++--- app/plugin/core/build.gradle.kts | 11 +++++++ .../anvil/plugin/command/AnvilCommand.kt | 2 +- .../plugin/command/AnvilPluginsCommand.kt | 3 +- app/plugin/sponge/build.gradle.kts | 5 ++++ app/plugin/velocity/build.gradle.kts | 4 +-- domain/build.gradle.kts | 1 + .../anvil/domain/command/CommandSource.kt | 29 +++++++++++++++++++ .../domain/command/GameUserCommandScope.kt | 3 +- .../domain/command/PlayerCommandScope.kt | 1 - .../anvil/domain/user/CommandSource.kt | 3 -- .../anvil/domain/user/GameUser.kt | 6 ++++ .../anvilpowered/anvil/domain/user/Player.kt | 2 +- .../anvilpowered/anvil/domain/user/User.kt | 11 +++++++ gradle/libs.versions.toml | 2 +- infrastructure/build.gradle.kts | 1 + infrastructure/game/build.gradle.kts | 1 + infrastructure/game/sponge/build.gradle.kts | 1 + infrastructure/game/velocity/build.gradle.kts | 1 + .../anvil/command/VelocityCustomCommand.kt | 4 +-- .../anvil/command/VelocitySourceConverter.kt | 19 ++++++++++-- .../anvil/user/AnvilVelocityCommandSource.kt | 19 ++++++++++-- .../anvil/user/AnvilVelocityPlayer.kt | 8 ----- .../command/CommonGameUserCommandScope.kt | 6 ++-- settings.gradle.kts | 1 + 31 files changed, 121 insertions(+), 73 deletions(-) delete mode 100644 api/game/velocity/build.gradle.kts delete mode 100644 api/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/api/AnvilVelocity.kt rename {app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command => api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user}/ArgumentExtensions.kt (85%) delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt create mode 100644 app/plugin/core/build.gradle.kts rename app/plugin/{ => core}/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt (88%) rename app/plugin/{ => core}/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt (87%) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/CommandSource.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt diff --git a/api/build.gradle.kts b/api/build.gradle.kts index a6a46c2dd..d8687f0ff 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("kotlin-jvm.base-conventions") id("kotlin-js.base-conventions") + id("anvil-publish") } dependencies { diff --git a/api/game/build.gradle.kts b/api/game/build.gradle.kts index 8df7fd196..358e69e73 100644 --- a/api/game/build.gradle.kts +++ b/api/game/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("kotlin-jvm.base-conventions") + id("anvil-publish") } dependencies { diff --git a/api/game/velocity/build.gradle.kts b/api/game/velocity/build.gradle.kts deleted file mode 100644 index d2fdc5c36..000000000 --- a/api/game/velocity/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") -} - -dependencies { - commonMainApi(project(":anvil-api-game")) - commonMainImplementation(project(":anvil-infrastructure-game-velocity")) -} diff --git a/api/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/api/AnvilVelocity.kt b/api/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/api/AnvilVelocity.kt deleted file mode 100644 index eb51cd480..000000000 --- a/api/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/api/AnvilVelocity.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api - -object AnvilVelocity { -} diff --git a/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/ArgumentExtensions.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt similarity index 85% rename from app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/ArgumentExtensions.kt rename to api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt index 8aefc8a58..02052b002 100644 --- a/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/ArgumentExtensions.kt +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt @@ -16,11 +16,11 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.plugin.command +package org.anvilpowered.anvil.api.user -import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.hasPermissionSet import org.anvilpowered.kbrig.builder.ArgumentBuilder fun > B.requiresPermission(permission: String): B = - requires { it.hasPermissionSet(permission) } + requires { it.permissionSubject.hasPermissionSet(permission) } diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt deleted file mode 100644 index 57e7767e2..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/UUIDStuff.kt +++ /dev/null @@ -1,4 +0,0 @@ -package org.anvilpowered.anvil.ui - -import org.anvilpowered.anvil.datastore.UUID - diff --git a/app/plugin/build.gradle.kts b/app/plugin/build.gradle.kts index 4ebad4448..f624da0f7 100644 --- a/app/plugin/build.gradle.kts +++ b/app/plugin/build.gradle.kts @@ -1,11 +1,9 @@ plugins { id("kotlin-jvm.base-conventions") + alias(libs.plugins.shadow) } dependencies { - commonMainApi(project(":anvil-api-game")) - jvmMainApi(platform(libs.adventure.bom)) - jvmMainApi("net.kyori:adventure-api") // TODO: -> compileOnlyApi ASAP -// compileOnlyApi(libs.logging.api) - commonMainApi(libs.kbrig.core) + commonMainImplementation(project(":anvil-app-plugin-sponge")) + commonMainImplementation(project(":anvil-app-plugin-velocity")) } diff --git a/app/plugin/core/build.gradle.kts b/app/plugin/core/build.gradle.kts new file mode 100644 index 000000000..4ebad4448 --- /dev/null +++ b/app/plugin/core/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("kotlin-jvm.base-conventions") +} + +dependencies { + commonMainApi(project(":anvil-api-game")) + jvmMainApi(platform(libs.adventure.bom)) + jvmMainApi("net.kyori:adventure-api") // TODO: -> compileOnlyApi ASAP +// compileOnlyApi(libs.logging.api) + commonMainApi(libs.kbrig.core) +} diff --git a/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt similarity index 88% rename from app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt rename to app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt index 62de5ecd8..27260ee6d 100644 --- a/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt @@ -1,7 +1,7 @@ package org.anvilpowered.anvil.plugin.command import org.anvilpowered.anvil.domain.platform.PluginManager -import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt similarity index 87% rename from app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt rename to app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt index 5d27c9911..4d62ee31d 100644 --- a/app/plugin/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt @@ -1,8 +1,9 @@ package org.anvilpowered.anvil.plugin.command import net.kyori.adventure.text.format.NamedTextColor +import org.anvilpowered.anvil.api.user.requiresPermission import org.anvilpowered.anvil.domain.platform.PluginManager -import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess diff --git a/app/plugin/sponge/build.gradle.kts b/app/plugin/sponge/build.gradle.kts index 68e2138cd..4aa25cc6b 100644 --- a/app/plugin/sponge/build.gradle.kts +++ b/app/plugin/sponge/build.gradle.kts @@ -6,6 +6,11 @@ plugins { alias(libs.plugins.shadow) } +dependencies { + commonMainImplementation(project(":anvil-app-plugin-core")) + commonMainImplementation(project(":anvil-infrastructure-game-sponge")) +} + sponge { apiVersion("8.1.0-SNAPSHOT") license("AGPL-3.0") diff --git a/app/plugin/velocity/build.gradle.kts b/app/plugin/velocity/build.gradle.kts index 74fe6f0a0..ad7188a16 100644 --- a/app/plugin/velocity/build.gradle.kts +++ b/app/plugin/velocity/build.gradle.kts @@ -4,8 +4,8 @@ plugins { } dependencies { - jvmMainImplementation(project(":anvil-app-plugin")) - jvmMainImplementation(project(":anvil-infrastructure-game-velocity")) + commonMainImplementation(project(":anvil-app-plugin-core")) + commonMainImplementation(project(":anvil-infrastructure-game-velocity")) jvmMainCompileOnly(libs.velocity) kapt(libs.velocity) commonMainImplementation(libs.kbrig.brigadier) diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index a5470c0a2..3fa6655a1 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -14,5 +14,6 @@ dependencies { commonMainApi(libs.coroutines) jvmMainApi(platform(libs.adventure.bom)) jvmMainApi("net.kyori:adventure-api") + jvmMainApi("net.kyori:adventure-text-minimessage") jsMainImplementation(npm("uuid", "9.0.0")) } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt new file mode 100644 index 000000000..d59ec3e2f --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt @@ -0,0 +1,29 @@ +package org.anvilpowered.anvil.domain.command + +import org.anvilpowered.anvil.domain.user.Audience +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.PermissionSubject +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.User + +interface CommandSource { + + val audience: Audience + + val permissionSubject: PermissionSubject + + /** + * The [Player] associated with the executed command, if any. + */ + val player: Player? + + /** + * The [User] associated with the executed command, if any. + */ + val user: User? + + /** + * The [GameUser] user associated with the executed command, if any. + */ + val gameUser: GameUser? +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt index b48456cf5..0ad422b4a 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt @@ -18,7 +18,6 @@ package org.anvilpowered.anvil.domain.command -import org.anvilpowered.anvil.domain.user.CommandSource import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder @@ -27,6 +26,6 @@ import org.anvilpowered.kbrig.context.CommandContext interface GameUserCommandScope { fun ArgumentBuilder.Companion.gameUser( name: String = "gameUser", - command: (context: CommandContext, gameUser: GameUser) -> Int, + command: suspend (context: CommandContext, gameUser: GameUser) -> Int, ): RequiredArgumentBuilder } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt index 78d78279e..f0e753664 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt @@ -1,6 +1,5 @@ package org.anvilpowered.anvil.domain.command -import org.anvilpowered.anvil.domain.user.CommandSource import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/CommandSource.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/CommandSource.kt deleted file mode 100644 index ff650bda4..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/CommandSource.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -interface CommandSource : Audience, PermissionSubject diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt index ad46c9771..373a2d7fd 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt @@ -4,8 +4,14 @@ import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.UUID +/** + * A user of a game of the Anvil platform. + * + * Represents a single user of a game. + */ interface GameUser : DomainEntity, PermissionSubject { val username: String + val nickname: String val userId: UUID data class CreateDto( diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt index 2ac1cf2f4..d28688671 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt @@ -1,5 +1,5 @@ package org.anvilpowered.anvil.domain.user -interface Player : CommandSource { +interface Player : Audience, PermissionSubject { val user: GameUser } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt new file mode 100644 index 000000000..e398edb30 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt @@ -0,0 +1,11 @@ +package org.anvilpowered.anvil.domain.user + +import org.sourcegrade.kontour.DomainEntity + +/** + * A user of the Anvil platform. + * + * Represents a single universal user across all games and platforms. + */ +interface User : DomainEntity { +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2037eb2e4..99334dcbe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ ktor = "2.3.0" log4j = "2.20.0" [libraries] -adventure-bom = "net.kyori:adventure-bom:4.12.0" +adventure-bom = "net.kyori:adventure-bom:4.13.1" annotations = "org.jetbrains:annotations:24.0.0" coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0" exposed-bom = "org.jetbrains.exposed:exposed-bom:0.41.1" diff --git a/infrastructure/build.gradle.kts b/infrastructure/build.gradle.kts index 2586daf82..7e288d45d 100644 --- a/infrastructure/build.gradle.kts +++ b/infrastructure/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("kotlin-jvm.base-conventions") id("kotlin-js.base-conventions") + id("anvil-publish") } dependencies { diff --git a/infrastructure/game/build.gradle.kts b/infrastructure/game/build.gradle.kts index d06780119..d81a790d3 100644 --- a/infrastructure/game/build.gradle.kts +++ b/infrastructure/game/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("kotlin-jvm.base-conventions") + id("anvil-publish") } dependencies { diff --git a/infrastructure/game/sponge/build.gradle.kts b/infrastructure/game/sponge/build.gradle.kts index cfb084ad3..a98363857 100644 --- a/infrastructure/game/sponge/build.gradle.kts +++ b/infrastructure/game/sponge/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("kotlin-jvm.base-conventions") + id("anvil-publish") } dependencies { diff --git a/infrastructure/game/velocity/build.gradle.kts b/infrastructure/game/velocity/build.gradle.kts index bd47d4021..fbe65e207 100644 --- a/infrastructure/game/velocity/build.gradle.kts +++ b/infrastructure/game/velocity/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("kotlin-jvm.base-conventions") + id("anvil-publish") } dependencies { diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt index 2206cb817..18fe28183 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt @@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.ProxyServerScope import org.anvilpowered.anvil.domain.command.PlayerCommandScope -import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.user.toAnvil import org.anvilpowered.kbrig.argument.StringArgumentType @@ -31,7 +31,7 @@ class VelocityCustomCommand : PlayerCommandScope { proxyServer.getPlayer(playerName).getOrNull()?.let { velocityPlayer -> command(context, velocityPlayer.toAnvil()) } ?: run { - context.source.sendMessage( + context.source.audience.sendMessage( Component.text() .append(Component.text("Player with name ", NamedTextColor.RED)) .append(Component.text(playerName, NamedTextColor.GOLD)) diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt index 539cd3668..9ce4824b7 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt @@ -20,11 +20,24 @@ package org.anvilpowered.anvil.command -import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.user.toAnvil +import org.anvilpowered.kbrig.brigadier.toBrigadier import org.anvilpowered.kbrig.tree.ArgumentCommandNode +import org.anvilpowered.kbrig.tree.LiteralCommandNode import org.anvilpowered.kbrig.tree.mapSource +import com.mojang.brigadier.tree.ArgumentCommandNode as BrigadierArgumentCommandNode +import com.mojang.brigadier.tree.LiteralCommandNode as BrigadierLiteralCommandNode1 import com.velocitypowered.api.command.CommandSource as VelocityCommandSource -fun ArgumentCommandNode.mapToVelocitySource(): ArgumentCommandNode = - mapSource { it.toAnvil() } +/** + * Converts a kbrig argument command node to a velocity brigadier argument command node. + */ +fun ArgumentCommandNode.toVelocity(): BrigadierArgumentCommandNode = + mapSource { it.toAnvil() }.toBrigadier() + +/** + * Converts a kbrig literal command node to a velocity brigadier literal command node. + */ +fun LiteralCommandNode.toVelocity(): BrigadierLiteralCommandNode1 = + mapSource { it.toAnvil() }.toBrigadier() diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt index 5f9d05bc0..a594b1a8b 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt @@ -18,13 +18,26 @@ package org.anvilpowered.anvil.user -import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.user.Audience +import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.PermissionSubject +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.User import com.velocitypowered.api.command.CommandSource as VelocityCommandSource +import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject +import com.velocitypowered.api.proxy.Player as VelocityPlayer fun VelocityCommandSource.toAnvil(): CommandSource = AnvilVelocityCommandSource(this) private class AnvilVelocityCommandSource( private val velocityCommandSource: VelocityCommandSource, -) : CommandSource, - PermissionSubject by velocityCommandSource.toAnvil() +) : CommandSource { + override val audience: Audience = velocityCommandSource + override val permissionSubject: PermissionSubject = (velocityCommandSource as VelocityPermissionSubject).toAnvil() + override val player: Player? = (velocityCommandSource as? VelocityPlayer)?.toAnvil() + override val user: User? + get() = TODO("Not yet implemented") + override val gameUser: GameUser? + get() = TODO("Not yet implemented") +} diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt index dacfd67b3..0d465c209 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt @@ -4,7 +4,6 @@ import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.PermissionSubject import org.anvilpowered.anvil.domain.user.Player -import kotlin.math.pow import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject import com.velocitypowered.api.proxy.Player as VelocityPlayer @@ -19,10 +18,3 @@ private class AnvilVelocityPlayer( override val user: GameUser get() = TODO("Not yet implemented") } - - -fun foo(op1: Float, op2: Float) { - - '1'.code - '0'.code - -} diff --git a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt b/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt index d6e08bbd0..6468c3a35 100644 --- a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt +++ b/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt @@ -20,7 +20,7 @@ package org.anvilpowered.anvil.command import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.domain.command.GameUserCommandScope -import org.anvilpowered.anvil.domain.user.CommandSource +import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.kbrig.argument.StringArgumentType @@ -34,7 +34,7 @@ context(org.anvilpowered.anvil.domain.datastore.GameUserScope) class CommonGameUserCommandScope : GameUserCommandScope { override fun ArgumentBuilder.Companion.gameUser( name: String, - command: (context: CommandContext, gameUser: GameUser) -> Int, + command: suspend (context: CommandContext, gameUser: GameUser) -> Int, ): RequiredArgumentBuilder = required(name, StringArgumentType.SingleWord) .suggests { _, builder -> @@ -46,7 +46,7 @@ class CommonGameUserCommandScope : GameUserCommandScope { GameUser.findByUsername(gameUserName)?.let { gameUser -> command(context, gameUser) } ?: run { - context.source.sendMessage( + context.source.audience.sendMessage( Component.text() .append(Component.text("GameUser with name ", NamedTextColor.RED)) .append(Component.text(gameUserName, NamedTextColor.GOLD)) diff --git a/settings.gradle.kts b/settings.gradle.kts index 3a01bfec6..777995f13 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,6 +26,7 @@ sequenceOf( "api-game", "api-web", "app-plugin", + "app-plugin-core", "app-plugin-sponge", "app-plugin-velocity", "app-cockpit", From 30217efc3fb9167c5a4fdc68307932937d83ff47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 12 May 2023 15:20:10 +0200 Subject: [PATCH 21/77] Improve API for creating GameApiBindings --- .../anvilpowered/anvil/api/GameApiBindings.kt | 4 ++- .../org/anvilpowered/anvil/api/ApiBindings.kt | 4 ++- .../datastore/CommonGameUserScope.kt | 29 +++++++++++++++++++ .../anvilpowered/anvil/VelocityApiBindings.kt | 19 +++++++++--- .../command/CommonGameUserCommandScope.kt | 3 +- 5 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt diff --git a/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt b/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt index cb2536224..9274e92c3 100644 --- a/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt +++ b/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt @@ -18,8 +18,10 @@ package org.anvilpowered.anvil.api +import org.anvilpowered.anvil.domain.command.GameUserCommandScope import org.anvilpowered.anvil.domain.platform.GamePlatform interface GameApiBindings : ApiBindings, - GamePlatform + GamePlatform, + GameUserCommandScope diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt index d8f0f1fa8..973160f95 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt @@ -22,4 +22,6 @@ import org.anvilpowered.anvil.domain.platform.Platform interface ApiBindings : LoggingScope, - Platform + Platform { + companion object +} diff --git a/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt b/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt new file mode 100644 index 000000000..61078ef8a --- /dev/null +++ b/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt @@ -0,0 +1,29 @@ +package org.anvilpowered.anvil.infrastructure.datastore + +import org.anvilpowered.anvil.domain.datastore.GameUserScope +import org.anvilpowered.anvil.domain.user.GameUser +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.UUID + +class CommonGameUserScope : GameUserScope { + override suspend fun DomainEntity.Repository.getAllUserNames(startWith: String): SizedIterable { + TODO("Not yet implemented") + } + + override suspend fun DomainEntity.Repository.findByUsername(username: String): GameUser? { + TODO("Not yet implemented") + } + + override suspend fun DomainEntity.Repository.create(item: GameUser.CreateDto): GameUser { + TODO("Not yet implemented") + } + + override suspend fun DomainEntity.Repository.findById(id: UUID): GameUser? { + TODO("Not yet implemented") + } + + override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean { + TODO("Not yet implemented") + } +} diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt index 7ee4310f7..4faaf8de3 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt @@ -19,14 +19,25 @@ package org.anvilpowered.anvil import com.velocitypowered.api.proxy.ProxyServer +import org.anvilpowered.anvil.api.ApiBindings import org.anvilpowered.anvil.api.GameApiBindings import org.anvilpowered.anvil.api.LoggingScope +import org.anvilpowered.anvil.command.CommonGameUserCommandScope +import org.anvilpowered.anvil.domain.command.GameUserCommandScope import org.anvilpowered.anvil.domain.platform.GamePlatform import org.anvilpowered.anvil.domain.platform.PluginManager +import org.anvilpowered.anvil.infrastructure.datastore.CommonGameUserScope import org.anvilpowered.anvil.platform.VelocityGamePlatform import org.anvilpowered.anvil.platform.VelocityPluginManager -class VelocityApiBindings(val proxyServer: ProxyServer) : GameApiBindings, - GamePlatform by VelocityGamePlatform(proxyServer), - LoggingScope by LoggingScope.create("anvil-velocity"), - PluginManager.Scope by VelocityPluginManager.createScope(proxyServer.pluginManager) +fun ApiBindings.Companion.createVelocity(proxyServer: ProxyServer): GameApiBindings { + val gameUserScope = CommonGameUserScope() + + class VelocityApiBindings(val proxyServer: ProxyServer) : GameApiBindings, + GamePlatform by VelocityGamePlatform(proxyServer), + LoggingScope by LoggingScope.create("anvil-velocity"), + PluginManager.Scope by VelocityPluginManager.createScope(proxyServer.pluginManager), + GameUserCommandScope by (with(gameUserScope) { CommonGameUserCommandScope() }) + + return VelocityApiBindings(proxyServer) +} diff --git a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt b/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt index 6468c3a35..669bd0114 100644 --- a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt +++ b/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt @@ -21,6 +21,7 @@ package org.anvilpowered.anvil.command import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.domain.command.GameUserCommandScope import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.datastore.GameUserScope import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.kbrig.argument.StringArgumentType @@ -30,7 +31,7 @@ import org.anvilpowered.kbrig.builder.executesSuspending import org.anvilpowered.kbrig.context.CommandContext import org.anvilpowered.kbrig.context.get -context(org.anvilpowered.anvil.domain.datastore.GameUserScope) +context(GameUserScope) class CommonGameUserCommandScope : GameUserCommandScope { override fun ArgumentBuilder.Companion.gameUser( name: String, From d83a03a518e4fb0f139f18b65720682392784102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 12 May 2023 15:58:02 +0200 Subject: [PATCH 22/77] Fix dependency on infra --- infrastructure/db/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infrastructure/db/build.gradle.kts b/infrastructure/db/build.gradle.kts index 8977fd71a..7894df5a6 100644 --- a/infrastructure/db/build.gradle.kts +++ b/infrastructure/db/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } dependencies { - commonMainApi(project(":anvil-domain")) + commonMainApi(project(":anvil-infrastructure")) jvmMainApi(platform(libs.exposed.bom)) jvmMainApi(libs.bundles.exposed) } From ca5a36045bccf51a458494ae0bc3e310f585487a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 6 Jun 2023 11:08:45 +0200 Subject: [PATCH 23/77] Work on db subsystem --- api/build.gradle.kts | 8 +- .../anvil/api/system/GameTypeApi.kt | 24 ++++++ .../anvil/api/system/GameTypeDto.kt | 40 +++++++++ .../anvil/api/user/ArgumentExtensions.kt | 2 +- .../anvil/api/user/GameUserApi.kt | 24 ++++++ .../anvil/api/user/GameUserDto.kt | 42 ++++++++++ .../anvilpowered/anvil/api/user/UserApi.kt | 24 ++++++ .../anvilpowered/anvil/api/user/UserDto.kt | 40 +++++++++ .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 1 - app/plugin/sponge/build.gradle.kts | 6 ++ domain/build.gradle.kts | 3 +- .../anvil/domain/command/CommandSource.kt | 14 ++-- .../anvil/domain/datastore/GameTypeScope.kt | 12 --- .../anvil/domain/datastore/GameUserScope.kt | 13 --- .../anvil/domain/datastore/ServerNodeScope.kt | 11 --- .../anvil/domain/entity/AnvilUser.kt | 20 ----- .../anvil/domain/entity/GameType.kt | 20 ----- .../anvil/domain/entity/MinecraftUserData.kt | 20 ----- .../anvil/domain/entity/ServerNode.kt | 20 ----- .../anvil/domain/system/GameType.kt | 45 ++++++++++ .../{datastore => system}/GameTypeJoin.kt | 2 +- .../anvil/domain/system/ServerNode.kt | 44 ++++++++++ .../anvil/domain/system/ServerNodeScope.kt | 24 ++++++ .../anvil/domain/user/GameUser.kt | 33 ++++++-- .../anvilpowered/anvil/domain/user/Player.kt | 8 +- .../user/{PermissionSubject.kt => Subject.kt} | 8 +- .../anvilpowered/anvil/domain/user/User.kt | 38 ++++++++- .../anvil/domain/user/UserFacetScope.kt | 32 +++++++ gradle/libs.versions.toml | 3 +- infrastructure/build.gradle.kts | 2 +- .../anvil/datastore/ServerNodeScopeImpl.kt | 48 ----------- .../datastore/RepositoryExtensions.kt | 2 +- .../system/DbGameTypeScope.kt} | 13 ++- .../anvil/db/system/DbServerNodeScope.kt | 83 +++++++++++++++++++ .../anvilpowered/anvil/db/system/GameTypes.kt | 49 +++++++++++ .../anvilpowered/anvil/db/user/DbUserScope.kt | 77 +++++++++++++++++ .../anvilpowered/anvil/db/user/GameUsers.kt | 43 ++++++++++ .../org/anvilpowered/anvil/db/user/Users.kt | 43 ++++++++++ .../anvilpowered/anvil/entity/GameTypes.kt | 22 ----- .../anvil/entity/MinecraftUsers.kt | 23 ----- .../anvilpowered/anvil/entity/ServerNodes.kt | 30 ++++--- .../org/anvilpowered/anvil/entity/Users.kt | 23 ----- infrastructure/game/sponge/build.gradle.kts | 5 +- .../anvil/user/AnvilSpongeGameUser.kt | 40 +++++++++ .../anvil/user/AnvilSpongePlayer.kt | 33 ++++++++ .../anvil/user/AnvilSpongeSubject.kt | 38 +++++++++ .../anvil/user/SpongeGameUserFactory.kt | 29 +++++++ .../datastore/CommonGameUserScope.kt | 2 +- .../anvil/command/VelocityCustomCommand.kt | 4 +- .../anvil/user/AnvilVelocityCommandSource.kt | 17 ++-- .../anvil/user/AnvilVelocityGameUser.kt | 40 +++++++++ .../user/AnvilVelocityPermissionSubject.kt | 20 ----- .../anvil/user/AnvilVelocityPlayer.kt | 12 +-- .../anvil/user/AnvilVelocitySubject.kt | 20 +++++ .../anvil/user/VelocityGameUserFactory.kt | 26 ++++++ .../anvil/user/GameUserFactory.kt | 31 +++++++ .../command/CommonGameUserCommandScope.kt | 2 +- settings.gradle.kts | 3 +- 58 files changed, 1038 insertions(+), 323 deletions(-) create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeApi.kt create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeDto.kt create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserApi.kt create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserDto.kt create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserApi.kt create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserDto.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeScope.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameUserScope.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/ServerNodeScope.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/AnvilUser.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/GameType.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/MinecraftUserData.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/ServerNode.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/{datastore => system}/GameTypeJoin.kt (79%) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeScope.kt rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/{PermissionSubject.kt => Subject.kt} (57%) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacetScope.kt delete mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt rename infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/{ => db}/datastore/RepositoryExtensions.kt (94%) rename infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/{datastore/GameTypeScopeImpl.kt => db/system/DbGameTypeScope.kt} (84%) create mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbServerNodeScope.kt create mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypes.kt create mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt create mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUsers.kt create mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt delete mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt delete mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt delete mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt create mode 100644 infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt create mode 100644 infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt create mode 100644 infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt create mode 100644 infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt delete mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPermissionSubject.kt create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt create mode 100644 infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt create mode 100644 infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUserFactory.kt diff --git a/api/build.gradle.kts b/api/build.gradle.kts index d8687f0ff..1eb0c9cd7 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -4,7 +4,13 @@ plugins { id("anvil-publish") } +repositories { + mavenLocal() + mavenCentral() +} + dependencies { - commonMainApi(libs.logging) + commonMainApi("org.lighthousegames:logging:1.3.0") +// commonMainImplementation(libs.logging) commonMainApi(project(":anvil-domain")) } diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeApi.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeApi.kt new file mode 100644 index 000000000..0d27da805 --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeApi.kt @@ -0,0 +1,24 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api.system + +import org.anvilpowered.anvil.domain.system.GameType + +interface GameTypeApi : GameType.DbScope { +} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeDto.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeDto.kt new file mode 100644 index 000000000..6371b2218 --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeDto.kt @@ -0,0 +1,40 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api.system + +import org.anvilpowered.anvil.domain.system.GameType +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.UUID + +sealed interface GameTypeDto : Dto { + + override val entity: GameType + get() = GameType(id) + + data class Basic( + override val id: UUID, + val name: String, + ) : GameTypeDto + + data class Full( + override val id: UUID, + val name: String, + val website: String, + ) : GameTypeDto +} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt index 02052b002..823fdd594 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt @@ -23,4 +23,4 @@ import org.anvilpowered.anvil.domain.user.hasPermissionSet import org.anvilpowered.kbrig.builder.ArgumentBuilder fun > B.requiresPermission(permission: String): B = - requires { it.permissionSubject.hasPermissionSet(permission) } + requires { it.subject.hasPermissionSet(permission) } diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserApi.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserApi.kt new file mode 100644 index 000000000..6addd3ae9 --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserApi.kt @@ -0,0 +1,24 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api.user + +import org.anvilpowered.anvil.domain.user.GameUser + +interface GameUserApi : GameUser.PlatformScope, GameUser.DbScope { +} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserDto.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserDto.kt new file mode 100644 index 000000000..76a968e65 --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserDto.kt @@ -0,0 +1,42 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api.user + +import org.anvilpowered.anvil.api.system.GameTypeDto +import org.anvilpowered.anvil.domain.user.GameUser +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.UUID + +sealed interface GameUserDto : Dto { + + override val entity: GameUser + get() = GameUser(id) + + data class Basic( + override val id: UUID, + val username: String, + ) : GameUserDto + + data class Mid( + override val id: UUID, + val user: UserDto.Basic, + val gameType: GameTypeDto.Basic, + val username: String, + ) : GameUserDto +} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserApi.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserApi.kt new file mode 100644 index 000000000..1520d1548 --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserApi.kt @@ -0,0 +1,24 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api.user + +import org.anvilpowered.anvil.domain.user.User + +interface UserApi : User.PlatformScope, User.DbScope { +} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserDto.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserDto.kt new file mode 100644 index 000000000..fefc99c34 --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserDto.kt @@ -0,0 +1,40 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.api.user + +import org.anvilpowered.anvil.domain.user.User +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.UUID + +sealed interface UserDto : Dto { + + override val entity: User + get() = User(id) + + data class Basic( + override val id: UUID, + val username: String, + ) : UserDto + + data class Full( + override val id: UUID, + val username: String, + val email: String, + ) : UserDto +} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt index d2be05d91..c418abf53 100644 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt +++ b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt @@ -4,7 +4,6 @@ import csstype.BoxSizing import csstype.minus import csstype.pct import csstype.px -import emotion.styled.styled import mui.material.AppBar import mui.material.Drawer import mui.material.DrawerAnchor diff --git a/app/plugin/sponge/build.gradle.kts b/app/plugin/sponge/build.gradle.kts index 4aa25cc6b..7485b0794 100644 --- a/app/plugin/sponge/build.gradle.kts +++ b/app/plugin/sponge/build.gradle.kts @@ -6,6 +6,12 @@ plugins { alias(libs.plugins.shadow) } +// TODO: Should not be necessary, but it seems sponge is nuking the repositories define in settings +repositories { + mavenLocal() + mavenCentral() +} + dependencies { commonMainImplementation(project(":anvil-app-plugin-core")) commonMainImplementation(project(":anvil-infrastructure-game-sponge")) diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 3fa6655a1..ea8fcfb4d 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -6,12 +6,13 @@ plugins { } dependencies { + commonMainApi(libs.annotations) commonMainApi(libs.kbrig.core) commonMainApi(libs.kotlinx.datetime) commonMainApi(libs.kontour) { exclude("org.slf4j") } - commonMainApi(libs.coroutines) + commonMainApi(libs.kotlinx.coroutines) jvmMainApi(platform(libs.adventure.bom)) jvmMainApi("net.kyori:adventure-api") jvmMainApi("net.kyori:adventure-text-minimessage") diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt index d59ec3e2f..96175023c 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt @@ -2,26 +2,26 @@ package org.anvilpowered.anvil.domain.command import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.PermissionSubject +import org.anvilpowered.anvil.domain.user.Subject import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.domain.user.User interface CommandSource { + /** + * The [User] associated with the executed command, if any. + */ + val user: User? + val audience: Audience - val permissionSubject: PermissionSubject + val subject: Subject /** * The [Player] associated with the executed command, if any. */ val player: Player? - /** - * The [User] associated with the executed command, if any. - */ - val user: User? - /** * The [GameUser] user associated with the executed command, if any. */ diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeScope.kt deleted file mode 100644 index 5f4561620..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeScope.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.anvilpowered.anvil.domain.datastore - -import org.anvilpowered.anvil.domain.entity.GameType -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.scope.CrudScope - -interface GameTypeScope : CrudScope { - - suspend fun DomainEntity.Repository.findByName(name: String): GameType? - - suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameUserScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameUserScope.kt deleted file mode 100644 index 481615d8f..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameUserScope.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.anvilpowered.anvil.domain.datastore - -import org.anvilpowered.anvil.domain.user.GameUser -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.scope.CrudScope - -interface GameUserScope : CrudScope { - - suspend fun DomainEntity.Repository.getAllUserNames(startWith: String = ""): SizedIterable - - suspend fun DomainEntity.Repository.findByUsername(username: String): GameUser? -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/ServerNodeScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/ServerNodeScope.kt deleted file mode 100644 index 2760008bf..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/ServerNodeScope.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.anvilpowered.anvil.domain.datastore - -import org.anvilpowered.anvil.domain.entity.ServerNode -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.scope.CrudScope - -interface ServerNodeScope : CrudScope { - - fun DomainEntity.Repository.findByGameType(): GameTypeJoin> -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/AnvilUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/AnvilUser.kt deleted file mode 100644 index 8cedff51a..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/AnvilUser.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.anvilpowered.anvil.domain.entity - -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -data class AnvilUser( - val username: String, - val email: String, - val minecraftUsers: List, - override val id: UUID, -) : DomainEntity { - - data class CreateDto( - val username: String, - val email: String, - ) : Creates - - companion object Repository : DomainEntity.Repository -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/GameType.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/GameType.kt deleted file mode 100644 index 77842e086..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/GameType.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.anvilpowered.anvil.domain.entity - -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.Crypto -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -data class GameType( - val name: String, - val website: String, - override val id: UUID = Crypto.randomUUID(), -) : DomainEntity { - - data class CreateDto( - val name: String, - val website: String, - ) : Creates - - companion object Repository : DomainEntity.Repository -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/MinecraftUserData.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/MinecraftUserData.kt deleted file mode 100644 index b2aeeb488..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/MinecraftUserData.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.anvilpowered.anvil.domain.entity - -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -data class MinecraftUserData( - val username: String, - val userId: UUID, - override val id: UUID, -) : DomainEntity { - - data class CreateDto( - val username: String, - val userId: UUID, - val id: UUID, - ) : Creates - - companion object Repository : DomainEntity.Repository -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/ServerNode.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/ServerNode.kt deleted file mode 100644 index c6a420cfb..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/entity/ServerNode.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.anvilpowered.anvil.domain.entity - -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.Crypto -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -data class ServerNode( - val name: String, - val gameType: GameType, - override val id: UUID = Crypto.randomUUID(), -) : DomainEntity { - - data class CreateDto( - val name: String, - val gameTypeId: UUID, - ) : Creates - - companion object Repository : DomainEntity.Repository -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt new file mode 100644 index 000000000..8ffb1dc37 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt @@ -0,0 +1,45 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.system + +import org.sourcegrade.kontour.Creates +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID +import org.sourcegrade.kontour.scope.CrudScope + +data class GameType(override val id: UUID) : DomainEntity { + + data class CreateDto( + val name: String, + val website: String, + ) : Creates + + interface DbScope : CrudScope { + + suspend fun GameType.getName(): String + + suspend fun GameType.getWebsite(): String + + suspend fun DomainEntity.Repository.findByName(name: String): GameType? + + suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? + } + + companion object Repository : DomainEntity.Repository +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeJoin.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeJoin.kt similarity index 79% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeJoin.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeJoin.kt index 5d83d0bfb..b4e2fc03f 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/datastore/GameTypeJoin.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeJoin.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.domain.datastore +package org.anvilpowered.anvil.domain.system import org.sourcegrade.kontour.UUID diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt new file mode 100644 index 000000000..09bed0cc5 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt @@ -0,0 +1,44 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.system + +import org.sourcegrade.kontour.Creates +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.UUID +import org.sourcegrade.kontour.scope.CrudScope + +data class ServerNode(override val id: UUID) : DomainEntity { + + data class CreateDto( + val name: String, + val gameTypeId: UUID, + ) : Creates + + interface DbScope : CrudScope { + + suspend fun ServerNode.getName(): String + + suspend fun ServerNode.getGameType(): GameType + + suspend fun DomainEntity.Repository.findByGameType(): GameTypeJoin> + } + + companion object Repository : DomainEntity.Repository +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeScope.kt new file mode 100644 index 000000000..f70c62372 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeScope.kt @@ -0,0 +1,24 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.system + +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.scope.CrudScope + diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt index 373a2d7fd..339c74dd2 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt @@ -1,24 +1,45 @@ package org.anvilpowered.anvil.domain.user +import org.anvilpowered.anvil.domain.system.GameType import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.SizedIterable import org.sourcegrade.kontour.UUID +import org.sourcegrade.kontour.scope.CrudScope /** * A user of a game of the Anvil platform. * * Represents a single user of a game. */ -interface GameUser : DomainEntity, PermissionSubject { - val username: String - val nickname: String - val userId: UUID +data class GameUser(override val id: UUID) : DomainEntity { data class CreateDto( - val username: String, - val userId: UUID, val id: UUID, + val userId: UUID, + val gameTypeId: UUID, + val username: String, ) : Creates + interface PlatformScope : UserFacetScope { + + val GameUser.subject: Subject + + val GameUser.player: Player? + } + + interface DbScope : CrudScope { + + suspend fun GameUser.getUserId(): UUID + + suspend fun GameUser.getGameType(): GameType + + suspend fun GameUser.getNickname(): String? + + suspend fun DomainEntity.Repository.getAllUserNames(startWith: String = ""): SizedIterable + + suspend fun DomainEntity.Repository.findByUsername(username: String): GameUser? + } + companion object Repository : DomainEntity.Repository } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt index d28688671..d3b999f14 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt @@ -1,5 +1,9 @@ package org.anvilpowered.anvil.domain.user -interface Player : Audience, PermissionSubject { - val user: GameUser +/** + * An online player. + */ +interface Player : UserFacetScope, Subject, Audience { + + val gameUser: GameUser } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/PermissionSubject.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Subject.kt similarity index 57% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/PermissionSubject.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Subject.kt index 7818813b8..4634ed354 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/PermissionSubject.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Subject.kt @@ -1,6 +1,6 @@ package org.anvilpowered.anvil.domain.user -interface PermissionSubject { +interface Subject { /** * Checks if the subject has the specified permission. @@ -12,6 +12,6 @@ interface PermissionSubject { fun hasPermission(permission: String): Boolean? } -fun PermissionSubject.hasPermissionSet(permission: String): Boolean = hasPermission(permission) == true -fun PermissionSubject.hasPermissionUnset(permission: String): Boolean = hasPermission(permission) == null -fun PermissionSubject.hasPermissionNotSet(permission: String): Boolean = hasPermission(permission) == false +fun Subject.hasPermissionSet(permission: String): Boolean = hasPermission(permission) == true +fun Subject.hasPermissionUnset(permission: String): Boolean = hasPermission(permission) == null +fun Subject.hasPermissionNotSet(permission: String): Boolean = hasPermission(permission) == false diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt index e398edb30..c7a44e97b 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt @@ -1,11 +1,47 @@ package org.anvilpowered.anvil.domain.user +import org.anvilpowered.anvil.domain.system.GameType +import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID +import org.sourcegrade.kontour.scope.CrudScope /** * A user of the Anvil platform. * * Represents a single universal user across all games and platforms. */ -interface User : DomainEntity { +data class User(override val id: UUID) : DomainEntity { + + data class CreateDto( + val id: UUID, + val username: String, + val email: String, + ) : Creates + + /** + * Operations scoped within a platform context. + */ + interface PlatformScope { + + val User.gameUser: GameUser + + val User.player: Player? + } + + /** + * Operations scoped within a database context. + */ + interface DbScope : CrudScope { + + suspend fun User.getUsername(): String + + suspend fun User.getEmail(): String + + suspend fun User.getGameUsers(gameType: GameType? = null): List + + suspend fun DomainEntity.Repository.findByUsername(username: String): User? + } + + companion object Repository : DomainEntity.Repository } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacetScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacetScope.kt new file mode 100644 index 000000000..c3f53726a --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacetScope.kt @@ -0,0 +1,32 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.user + +import org.sourcegrade.kontour.DomainEntity + +/** + * Some facet of a user which holds a reference to the parent [User]. + */ +interface UserFacetScope { + + /** + * The parent [User] represented by this facet. + */ + val E.user: User +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 99334dcbe..9516e7952 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,12 @@ [versions] #kmongo = "4.8.0" -kotlin = "1.8.21" +kotlin = "1.9.0-Beta" ktor = "2.3.0" log4j = "2.20.0" [libraries] adventure-bom = "net.kyori:adventure-bom:4.13.1" annotations = "org.jetbrains:annotations:24.0.0" -coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0" exposed-bom = "org.jetbrains.exposed:exposed-bom:0.41.1" exposed-core = { module = "org.jetbrains.exposed:exposed-core" } exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } diff --git a/infrastructure/build.gradle.kts b/infrastructure/build.gradle.kts index 7e288d45d..ebc5fc76e 100644 --- a/infrastructure/build.gradle.kts +++ b/infrastructure/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } dependencies { - commonMainImplementation(project(":anvil-api")) + commonMainApi(project(":anvil-api")) commonMainImplementation(libs.ktor.serialization) jvmMainImplementation(libs.bundles.ktor.server) jvmMainImplementation(libs.ktor.client.cio) diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt deleted file mode 100644 index 1a87eca86..000000000 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/ServerNodeScopeImpl.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.anvilpowered.anvil.datastore - -import org.anvilpowered.anvil.domain.datastore.GameTypeJoin -import org.anvilpowered.anvil.domain.datastore.ServerNodeScope -import org.anvilpowered.anvil.domain.entity.ServerNode -import org.anvilpowered.anvil.entity.* -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.mapLazy -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.UUID - -internal object ServerNodeScopeImpl : ServerNodeScope { - - override suspend fun DomainEntity.Repository.findById(id: UUID): ServerNode? = - newSuspendedTransaction { - (ServerNodes innerJoin GameTypes).select { ServerNodes.id eq id }.firstOrNull()?.toServerNode() - } - - override fun DomainEntity.Repository.findByGameType(): GameTypeJoin> = GameTypeJoinImpl - - override suspend fun DomainEntity.Repository.create(item: ServerNode.CreateDto): ServerNode = - newSaveTransaction(ServerNodes, { setValuesFrom(item) }, ResultRow::toServerNode) - - override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean = - newSuspendedTransaction { ServerNodes.deleteWhere { ServerNodes.id eq id } > 0 } - - private object GameTypeJoinImpl : GameTypeJoin> { - override suspend fun id(id: UUID): SizedIterable = - newSuspendedTransaction { - (ServerNodes innerJoin GameTypes).select { GameTypes.id eq id }.mapLazy { it.toServerNode() } - } - - override suspend fun name(name: String): SizedIterable = - newSuspendedTransaction { - (ServerNodes innerJoin GameTypes).select { GameTypes.name eq name }.mapLazy { it.toServerNode() } - } - - override suspend fun website(website: String): SizedIterable = - newSuspendedTransaction { - (ServerNodes innerJoin GameTypes).select { GameTypes.website eq website }.mapLazy { it.toServerNode() } - } - } -} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt similarity index 94% rename from infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt index 71f690d71..7545bafc2 100644 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/RepositoryExtensions.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.datastore +package org.anvilpowered.anvil.db.datastore import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.Table diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbGameTypeScope.kt similarity index 84% rename from infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt rename to infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbGameTypeScope.kt index c22c3fd22..2054e89c4 100644 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/datastore/GameTypeScopeImpl.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbGameTypeScope.kt @@ -16,12 +16,11 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.datastore +package org.anvilpowered.anvil.db.system -import org.anvilpowered.anvil.domain.datastore.GameTypeScope -import org.anvilpowered.anvil.domain.entity.GameType -import org.anvilpowered.anvil.entity.GameTypes -import org.anvilpowered.anvil.entity.setValuesFrom +import org.anvilpowered.anvil.db.datastore.newSaveTransaction +import org.anvilpowered.anvil.db.user.setValuesFrom +import org.anvilpowered.anvil.domain.system.GameType import org.anvilpowered.anvil.entity.toGameType import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq @@ -31,10 +30,10 @@ import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransacti import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.UUID -internal object GameTypeScopeImpl : GameTypeScope { +internal class DbGameTypeScope : GameType.DbScope { override suspend fun DomainEntity.Repository.create(item: GameType.CreateDto): GameType = - newSaveTransaction(GameTypes, { setValuesFrom(item) }, ResultRow::toGameType) + newSaveTransaction(GameTypes, { org.anvilpowered.anvil.db.user.setValuesFrom(item) }, ResultRow::toGameType) override suspend fun DomainEntity.Repository.findById(id: UUID): GameType? = newSuspendedTransaction { GameTypes.select(GameTypes.id eq id).firstOrNull()?.toGameType() } diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbServerNodeScope.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbServerNodeScope.kt new file mode 100644 index 000000000..4df98919e --- /dev/null +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbServerNodeScope.kt @@ -0,0 +1,83 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.system + +import org.anvilpowered.anvil.domain.system.GameType +import org.anvilpowered.anvil.domain.system.GameTypeJoin +import org.anvilpowered.anvil.domain.system.ServerNode +import org.anvilpowered.anvil.entity.* +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.mapLazy +import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.UUID + +internal object DbServerNodeScope : ServerNode.DbScope { + + override suspend fun DomainEntity.Repository.findById(id: UUID): ServerNode? = + newSuspendedTransaction { + DbServerNode.findById(id)?.let { ServerNode(it.id.value) } + } + + override suspend fun ServerNode.getName(): String = newSuspendedTransaction { + (DbServerNode.findById(this@getName.id) ?: throw NoSuchElementException()) + .name + } + + override suspend fun ServerNode.getGameType(): GameType = newSuspendedTransaction { + val resultId = (DbServerNode.findById(this@getGameType.id) ?: throw NoSuchElementException()) + .gameTypeId.value + GameType(resultId) + } + + override suspend fun DomainEntity.Repository.findByGameType(): GameTypeJoin> = GameTypeJoinImpl + + override suspend fun DomainEntity.Repository.create(item: ServerNode.CreateDto): ServerNode = TODO() +// newSaveTransaction(ServerNodes, { setValuesFrom(item) }, ResultRow::toServerNode) + + override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean = + newSuspendedTransaction { ServerNodes.deleteWhere { ServerNodes.id eq id } > 0 } + + private object GameTypeJoinImpl : GameTypeJoin> { + override suspend fun id(id: UUID): SizedIterable = + newSuspendedTransaction { +// val t= (ServerNodes innerJoin GameTypes).select { GameTypes.id eq id }.mapLazy { it.toServerNode() } + + (DbGameType.findById(id) ?: throw NoSuchElementException()) + .serverNodes + + TODO() + } + + override suspend fun name(name: String): SizedIterable = + newSuspendedTransaction { + (ServerNodes innerJoin GameTypes).select { GameTypes.name eq name }.mapLazy { it.toServerNode() } + TODO() + } + + override suspend fun website(website: String): SizedIterable = + newSuspendedTransaction { + (ServerNodes innerJoin GameTypes).select { GameTypes.website eq website }.mapLazy { it.toServerNode() } + TODO() + } + } +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypes.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypes.kt new file mode 100644 index 000000000..6727f3e1b --- /dev/null +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypes.kt @@ -0,0 +1,49 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.system + +import org.jetbrains.exposed.dao.UUIDEntity +import org.jetbrains.exposed.dao.UUIDEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.UUIDTable +import java.util.UUID + +object GameTypes : UUIDTable("game_types") { + val name = varchar("name", 255).uniqueIndex() + val website = varchar("website", 255) +} + +class DbGameType(id: EntityID) : UUIDEntity(id) { + var name by GameTypes.name + var website by GameTypes.website + + companion object : UUIDEntityClass(GameTypes) +} + +//context(GameTypes) +//fun InsertStatement<*>.setValuesFrom(gameType: GameType.CreateDto) { +// this[name] = gameType.name +// this[website] = gameType.website +//} +// +//fun ResultRow.toGameType() = GameType( +// name = this[GameTypes.name], +// website = this[GameTypes.website], +// id = this[GameTypes.id].value, +//) diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt new file mode 100644 index 000000000..df0ef5579 --- /dev/null +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt @@ -0,0 +1,77 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.user + +import org.anvilpowered.anvil.api.user.UserDto +import org.anvilpowered.anvil.domain.system.GameType +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.User +import org.anvilpowered.anvil.user.GameUserFactory +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.UUID +import org.sourcegrade.kontour.UnknownDtoException +import org.sourcegrade.kontour.scope.findDtoById +import kotlin.reflect.KClass + +context(GameUserFactory.Scope) +internal class DbUserScope : User.DbScope { + override suspend fun User.getUsername(): String { + TODO("Not yet implemented") + } + + override suspend fun User.getEmail(): String = newSuspendedTransaction { + DbUser.findById(this@getEmail.id)?.email ?: throw NoSuchElementException() + } + + override suspend fun User.getGameUsers(gameType: GameType?): List = newSuspendedTransaction { + (DbUser.findById(this@getGameUsers.id) ?: throw NoSuchElementException()) + .gameUsers.map { gameUserFactory.createGameUser(it.id.value) } + } + + override suspend fun DomainEntity.Repository.findByUsername(username: String): User? { + DbUser.findById() + } + + override suspend fun DomainEntity.Repository.create(item: User.CreateDto): User { + TODO("Not yet implemented") + } + + override suspend fun > DomainEntity.Repository.findById( + id: UUID, dtoType: KClass, + ): D? = newSuspendedTransaction { + DbUser.findById(id)?.let { + @Suppress("UNCHECKED_CAST") + when (dtoType) { + UserDto.Basic::class -> UserDto.Basic(id, it.username) + UserDto.Full::class -> UserDto.Full(id, it.username, it.email) + else -> throw UnknownDtoException(dtoType, User::class) + } as D + } + } + + override suspend fun DomainEntity.Repository.findById(id: UUID): User? { + TODO("Not yet implemented") + } + + override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean { + val result: UserDto.Full? = findDtoById(id) + } +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUsers.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUsers.kt new file mode 100644 index 000000000..5c8b5fd31 --- /dev/null +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUsers.kt @@ -0,0 +1,43 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.user + +import org.anvilpowered.anvil.db.system.DbGameType +import org.anvilpowered.anvil.db.system.GameTypes +import org.jetbrains.exposed.dao.UUIDEntity +import org.jetbrains.exposed.dao.UUIDEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.UUIDTable +import org.sourcegrade.kontour.UUID + +object GameUsers : UUIDTable("game_users") { + val userId = reference("user_id", Users) + val gameTypeId = reference("game_type_id", GameTypes) + val username = varchar("username", 255).uniqueIndex() + val nickname = varchar("nickname", 255).nullable() +} + +class DbGameUser(id: EntityID) : UUIDEntity(id) { + var user: DbUser by DbUser referencedOn GameUsers.userId + var gameType: DbGameType by DbGameType referencedOn GameUsers.gameTypeId + var username: String by GameUsers.username + var nickname: String? by GameUsers.nickname + + companion object : UUIDEntityClass(GameUsers) +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt new file mode 100644 index 000000000..7230d15a3 --- /dev/null +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt @@ -0,0 +1,43 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.user + +import org.anvilpowered.anvil.db.system.DbGameType +import org.anvilpowered.anvil.db.system.GameTypes +import org.jetbrains.exposed.dao.UUIDEntity +import org.jetbrains.exposed.dao.UUIDEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.UUIDTable +import org.jetbrains.exposed.sql.SizedIterable +import org.sourcegrade.kontour.UUID + +object Users : UUIDTable("users") { + val username = varchar("username", 255).uniqueIndex() + val email = varchar("email", 255).uniqueIndex() + val gameTypeId = reference("game_type_id", GameTypes) +} + +class DbUser(id: EntityID) : UUIDEntity(id) { + var username: String by Users.username + var email: String by Users.email + var gameType: DbGameType by DbGameType referencedOn Users.gameTypeId + val gameUsers: SizedIterable by DbGameUser referrersOn GameUsers.userId + + companion object : UUIDEntityClass(Users) +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt deleted file mode 100644 index 90e59ccff..000000000 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/GameTypes.kt +++ /dev/null @@ -1,22 +0,0 @@ -package org.anvilpowered.anvil.entity - -import org.anvilpowered.anvil.domain.entity.GameType -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.statements.InsertStatement - -object GameTypes : AnvilTable("game_types") { - val name = varchar("name", 255).uniqueIndex() - val website = varchar("website", 255) -} - -context(GameTypes) -fun InsertStatement<*>.setValuesFrom(gameType: GameType.CreateDto) { - this[name] = gameType.name - this[website] = gameType.website -} - -fun ResultRow.toGameType() = GameType( - name = this[GameTypes.name], - website = this[GameTypes.website], - id = this[GameTypes.id].value, -) diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt deleted file mode 100644 index cbc8791ab..000000000 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/MinecraftUsers.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.anvilpowered.anvil.entity - -import org.anvilpowered.anvil.domain.entity.MinecraftUserData -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.statements.InsertStatement - -object MinecraftUsers : AnvilTable("minecraft_users") { - val username = varchar("name", 255).uniqueIndex() - val userId = reference("user_id", Users) -} - -context(MinecraftUsers) -fun InsertStatement<*>.setValuesFrom(minecraftUser: MinecraftUserData.CreateDto) { - this[username] = minecraftUser.username - this[userId] = minecraftUser.userId - this[id] = minecraftUser.id -} - -fun ResultRow.toMinecraftUser() = MinecraftUserData( - username = this[MinecraftUsers.username], - userId = this[MinecraftUsers.userId].value, - id = this[MinecraftUsers.id].value, -) diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt index 877e4fa78..3a7cb2e23 100644 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt @@ -1,22 +1,26 @@ package org.anvilpowered.anvil.entity -import org.anvilpowered.anvil.domain.entity.ServerNode -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.statements.InsertStatement +import org.anvilpowered.anvil.db.system.DbGameType +import org.anvilpowered.anvil.db.system.DbGameType.Companion.referrersOn +import org.anvilpowered.anvil.db.system.GameTypes +import org.jetbrains.exposed.dao.UUIDEntity +import org.jetbrains.exposed.dao.UUIDEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.UUIDTable +import org.jetbrains.exposed.sql.SizedIterable +import org.sourcegrade.kontour.UUID -object ServerNodes : AnvilTable("server_nodes") { +object ServerNodes : UUIDTable("server_nodes") { val name = varchar("name", 255).uniqueIndex() val gameTypeId = reference("game_type_id", GameTypes) } -context(ServerNodes) -fun InsertStatement<*>.setValuesFrom(serverNode: ServerNode.CreateDto) { - this[name] = serverNode.name - this[gameTypeId] = serverNode.gameTypeId +class DbServerNode(id: EntityID) : UUIDEntity(id) { + var name by ServerNodes.name + var gameTypeId by ServerNodes.gameTypeId + var gameType by DbGameType referencedOn ServerNodes.gameTypeId + + companion object : UUIDEntityClass(ServerNodes) } -fun ResultRow.toServerNode() = ServerNode( - name = this[ServerNodes.name], - gameType = toGameType(), - id = this[ServerNodes.id].value, -) +val DbGameType.serverNodes: SizedIterable by DbServerNode referrersOn ServerNodes.gameTypeId diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt deleted file mode 100644 index 7db3ae3fa..000000000 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/Users.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.anvilpowered.anvil.entity - -import org.anvilpowered.anvil.domain.entity.AnvilUser -import org.jetbrains.exposed.dao.id.UUIDTable -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.statements.InsertStatement - -object Users : UUIDTable("users") { - val username = varchar("username", 255).uniqueIndex() - val email = varchar("email", 255).uniqueIndex() -} - -context(Users) -fun InsertStatement<*>.setValuesFrom(user: AnvilUser.CreateDto) { - this[username] = user.username - this[email] = user.email -} - -fun ResultRow.toUser() = AnvilUser( - username = this[Users.username], - email = this[Users.email], - id = this[Users.id].value, -) diff --git a/infrastructure/game/sponge/build.gradle.kts b/infrastructure/game/sponge/build.gradle.kts index a98363857..3cf75ed9e 100644 --- a/infrastructure/game/sponge/build.gradle.kts +++ b/infrastructure/game/sponge/build.gradle.kts @@ -4,5 +4,8 @@ plugins { } dependencies { - commonMainImplementation(project(":anvil-domain")) +// commonMainImplementation(libs.coroutines) + commonMainImplementation(libs.kotlinx.coroutines) + commonMainImplementation(project(":anvil-infrastructure-game")) + jvmMainImplementation(libs.sponge) } diff --git a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt b/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt new file mode 100644 index 000000000..9fd0dee9d --- /dev/null +++ b/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt @@ -0,0 +1,40 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.Subject +import org.sourcegrade.kontour.UUID +import kotlin.jvm.optionals.getOrNull +import org.spongepowered.api.entity.living.player.User as SpongeUser + +fun SpongeUser.toAnvilGameUser(): GameUser = SpongeGameUser(this) + +private class SpongeGameUser( + val spongeUser: SpongeUser, +) : GameUser, + Subject by spongeUser.toAnvilSubject() { + override val id: UUID + get() = spongeUser.uniqueId() + override val username: String + get() = spongeUser.name() + override val player: Player? + get() = spongeUser.player().getOrNull()?.toAnvilPlayer() +} diff --git a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt b/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt new file mode 100644 index 000000000..a408fbf84 --- /dev/null +++ b/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt @@ -0,0 +1,33 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.Subject +import org.spongepowered.api.entity.living.player.server.ServerPlayer as SpongePlayer + +fun SpongePlayer.toAnvilPlayer(): Player = AnvilSpongePlayer(this) + +private class AnvilSpongePlayer( + val spongePlayer: SpongePlayer, +) : Player, + Subject by spongePlayer.toAnvilSubject() { + override val gameUser: GameUser = spongePlayer.user().toAnvilGameUser() +} diff --git a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt b/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt new file mode 100644 index 000000000..eed68c01e --- /dev/null +++ b/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt @@ -0,0 +1,38 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.Subject +import org.spongepowered.api.util.Tristate +import org.spongepowered.api.service.permission.Subject as SpongeSubject + +fun SpongeSubject.toAnvilSubject(): Subject = AnvilSpongeSubject(this) + +private class AnvilSpongeSubject( + private val spongeSubject: SpongeSubject, +) : Subject { + override fun hasPermission(permission: String): Boolean? = + spongeSubject.permissionValue(permission).toBoolean() +} + +private fun Tristate.toBoolean(): Boolean? = when (this) { + Tristate.TRUE -> true + Tristate.FALSE -> false + Tristate.UNDEFINED -> null +} diff --git a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt b/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt new file mode 100644 index 000000000..77c0b0699 --- /dev/null +++ b/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt @@ -0,0 +1,29 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import kotlinx.coroutines.future.asDeferred +import org.anvilpowered.anvil.domain.user.GameUser +import org.sourcegrade.kontour.UUID +import org.spongepowered.api.Sponge + +class SpongeGameUserFactory : GameUserFactory { + override suspend fun createGameUser(id: UUID): GameUser = + Sponge.server().userManager().loadOrCreate(id).asDeferred().await().toAnvilGameUser() +} diff --git a/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt b/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt index 61078ef8a..1cec15f3c 100644 --- a/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt +++ b/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt @@ -1,6 +1,6 @@ package org.anvilpowered.anvil.infrastructure.datastore -import org.anvilpowered.anvil.domain.datastore.GameUserScope +import org.anvilpowered.anvil.domain.user.GameUserScope import org.anvilpowered.anvil.domain.user.GameUser import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.SizedIterable diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt index 18fe28183..fcf7e6602 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt @@ -6,7 +6,7 @@ import org.anvilpowered.anvil.ProxyServerScope import org.anvilpowered.anvil.domain.command.PlayerCommandScope import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.user.toAnvil +import org.anvilpowered.anvil.user.toAnvilPlayer import org.anvilpowered.kbrig.argument.StringArgumentType import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder @@ -29,7 +29,7 @@ class VelocityCustomCommand : PlayerCommandScope { .executes { context -> val playerName = context.get(name) proxyServer.getPlayer(playerName).getOrNull()?.let { velocityPlayer -> - command(context, velocityPlayer.toAnvil()) + command(context, velocityPlayer.toAnvilPlayer()) } ?: run { context.source.audience.sendMessage( Component.text() diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt index a594b1a8b..3b4a69a04 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt @@ -19,25 +19,22 @@ package org.anvilpowered.anvil.user import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.user.User import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.PermissionSubject import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.User +import org.anvilpowered.anvil.domain.user.Subject import com.velocitypowered.api.command.CommandSource as VelocityCommandSource -import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject import com.velocitypowered.api.proxy.Player as VelocityPlayer fun VelocityCommandSource.toAnvil(): CommandSource = AnvilVelocityCommandSource(this) private class AnvilVelocityCommandSource( - private val velocityCommandSource: VelocityCommandSource, + velocityCommandSource: VelocityCommandSource, ) : CommandSource { override val audience: Audience = velocityCommandSource - override val permissionSubject: PermissionSubject = (velocityCommandSource as VelocityPermissionSubject).toAnvil() - override val player: Player? = (velocityCommandSource as? VelocityPlayer)?.toAnvil() - override val user: User? - get() = TODO("Not yet implemented") - override val gameUser: GameUser? - get() = TODO("Not yet implemented") + override val subject: Subject = velocityCommandSource.toAnvilSubject() + override val player: Player? = (velocityCommandSource as? VelocityPlayer)?.toAnvilPlayer() + override val user: User? = player?.user + override val gameUser: GameUser? = player?.gameUser } diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt new file mode 100644 index 000000000..e0130c557 --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt @@ -0,0 +1,40 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.Player +import org.sourcegrade.kontour.UUID + +/** + * Velocity does not have an offline player concept, so we must handle it ourselves. + */ +internal class AnvilVelocityGameUser( + override val id: UUID, +) : GameUser { + override val username: String + get() = TODO("Not yet implemented") + override val player: Player? + get() = TODO("Not yet implemented") + + override fun hasPermission(permission: String): Boolean? { + TODO("Not yet implemented") + } + +} diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPermissionSubject.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPermissionSubject.kt deleted file mode 100644 index e1f9bc141..000000000 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPermissionSubject.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.anvilpowered.anvil.user - -import com.velocitypowered.api.permission.Tristate -import org.anvilpowered.anvil.domain.user.PermissionSubject -import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject - -fun VelocityPermissionSubject.toAnvil(): PermissionSubject = AnvilVelocityPermissionSubject(this) - -private class AnvilVelocityPermissionSubject( - private val velocityPermissionSubject: VelocityPermissionSubject, -) : PermissionSubject { - override fun hasPermission(permission: String): Boolean? = - velocityPermissionSubject.getPermissionValue(permission).toBoolean() -} - -private fun Tristate.toBoolean(): Boolean? = when (this) { - Tristate.TRUE -> true - Tristate.FALSE -> false - Tristate.UNDEFINED -> null -} diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt index 0d465c209..cd4323ea9 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt @@ -1,20 +1,20 @@ package org.anvilpowered.anvil.user +import org.anvilpowered.anvil.domain.user.User import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.PermissionSubject import org.anvilpowered.anvil.domain.user.Player -import com.velocitypowered.api.permission.PermissionSubject as VelocityPermissionSubject +import org.anvilpowered.anvil.domain.user.Subject import com.velocitypowered.api.proxy.Player as VelocityPlayer -fun VelocityPlayer.toAnvil(): Player = AnvilVelocityPlayer(this) +fun VelocityPlayer.toAnvilPlayer(): Player = AnvilVelocityPlayer(this) private class AnvilVelocityPlayer( val velocityPlayer: VelocityPlayer, ) : Player, Audience by velocityPlayer, - PermissionSubject by (velocityPlayer as VelocityPermissionSubject).toAnvil() { + Subject by velocityPlayer.toAnvilSubject() { - override val user: GameUser - get() = TODO("Not yet implemented") + override val user: User = User(velocityPlayer.uniqueId, velocityPlayer.username) + override val gameUser: GameUser = AnvilVelocityGameUser(velocityPlayer.uniqueId) } diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt new file mode 100644 index 000000000..d1ea145c1 --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt @@ -0,0 +1,20 @@ +package org.anvilpowered.anvil.user + +import com.velocitypowered.api.permission.Tristate +import org.anvilpowered.anvil.domain.user.Subject +import com.velocitypowered.api.permission.PermissionSubject as VelocitySubject + +fun VelocitySubject.toAnvilSubject(): Subject = AnvilVelocitySubject(this) + +private class AnvilVelocitySubject( + private val velocitySubject: VelocitySubject, +) : Subject { + override fun hasPermission(permission: String): Boolean? = + velocitySubject.getPermissionValue(permission).toBoolean() +} + +private fun Tristate.toBoolean(): Boolean? = when (this) { + Tristate.TRUE -> true + Tristate.FALSE -> false + Tristate.UNDEFINED -> null +} diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt new file mode 100644 index 000000000..69596c10e --- /dev/null +++ b/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt @@ -0,0 +1,26 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.GameUser +import org.sourcegrade.kontour.UUID + +class VelocityGameUserFactory : GameUserFactory { + override suspend fun createGameUser(id: UUID): GameUser = AnvilVelocityGameUser(id) +} diff --git a/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUserFactory.kt b/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUserFactory.kt new file mode 100644 index 000000000..679e8c2b8 --- /dev/null +++ b/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUserFactory.kt @@ -0,0 +1,31 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.GameUser +import org.sourcegrade.kontour.UUID + +interface GameUserFactory { + + suspend fun createGameUser(id: UUID): GameUser + + interface Scope { + val gameUserFactory: GameUserFactory + } +} diff --git a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt b/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt index 669bd0114..ed035b0d1 100644 --- a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt +++ b/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt @@ -21,7 +21,7 @@ package org.anvilpowered.anvil.command import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.domain.command.GameUserCommandScope import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.datastore.GameUserScope +import org.anvilpowered.anvil.domain.user.GameUserScope import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.kbrig.argument.StringArgumentType diff --git a/settings.gradle.kts b/settings.gradle.kts index 777995f13..cf19f3b01 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,9 +5,10 @@ dependencyResolutionManagement { repositories { mavenLocal() mavenCentral() + maven("https://oss.sonatype.org/content/repositories/snapshots/") maven("https://libraries.minecraft.net") maven("https://repo.papermc.io/repository/maven-public/") -// maven("https://repo.spongepowered.org/repository/maven-public/") + maven("https://repo.spongepowered.org/repository/maven-public/") } } From 746266bf48cd242a15a1054715f32e823257e979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 6 Jun 2023 16:02:15 +0200 Subject: [PATCH 24/77] Fix DbUserScope --- .../anvilpowered/anvil/domain/user/User.kt | 1 - .../anvilpowered/anvil/db/user/DbUserScope.kt | 39 ++++++++++++------- .../org/anvilpowered/anvil/db/user/Users.kt | 4 -- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt index c7a44e97b..b0eb65e17 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt @@ -14,7 +14,6 @@ import org.sourcegrade.kontour.scope.CrudScope data class User(override val id: UUID) : DomainEntity { data class CreateDto( - val id: UUID, val username: String, val email: String, ) : Creates diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt index df0ef5579..53a17e898 100644 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt @@ -24,37 +24,50 @@ import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.User import org.anvilpowered.anvil.user.GameUserFactory import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.Crypto import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.Dto import org.sourcegrade.kontour.UUID import org.sourcegrade.kontour.UnknownDtoException -import org.sourcegrade.kontour.scope.findDtoById import kotlin.reflect.KClass context(GameUserFactory.Scope) internal class DbUserScope : User.DbScope { + + context(User) + private fun DbUser.Companion.findByContextId(): DbUser? = DbUser.findById(id) + override suspend fun User.getUsername(): String { - TODO("Not yet implemented") + return newSuspendedTransaction { + DbUser.findByContextId()?.username ?: throw NoSuchElementException() + } } override suspend fun User.getEmail(): String = newSuspendedTransaction { - DbUser.findById(this@getEmail.id)?.email ?: throw NoSuchElementException() + DbUser.findByContextId()?.email ?: throw NoSuchElementException() } override suspend fun User.getGameUsers(gameType: GameType?): List = newSuspendedTransaction { - (DbUser.findById(this@getGameUsers.id) ?: throw NoSuchElementException()) + (DbUser.findByContextId() ?: throw NoSuchElementException()) .gameUsers.map { gameUserFactory.createGameUser(it.id.value) } } - override suspend fun DomainEntity.Repository.findByUsername(username: String): User? { - DbUser.findById() + override suspend fun DomainEntity.Repository.findByUsername(username: String): User? = newSuspendedTransaction { + DbUser.find { Users.username eq username }.firstOrNull()?.let { User(it.id.value) } } - override suspend fun DomainEntity.Repository.create(item: User.CreateDto): User { - TODO("Not yet implemented") + override suspend fun DomainEntity.Repository.create(item: User.CreateDto): User = newSuspendedTransaction { + DbUser.new(Crypto.randomUUID()) { + username = item.username + email = item.email + }.id.value.let(::User) } - override suspend fun > DomainEntity.Repository.findById( + override suspend fun User.exists(): Boolean = newSuspendedTransaction { + DbUser.findByContextId() != null + } + + override suspend fun > DomainEntity.Repository.findDtoById( id: UUID, dtoType: KClass, ): D? = newSuspendedTransaction { DbUser.findById(id)?.let { @@ -67,11 +80,7 @@ internal class DbUserScope : User.DbScope { } } - override suspend fun DomainEntity.Repository.findById(id: UUID): User? { - TODO("Not yet implemented") - } - - override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean { - val result: UserDto.Full? = findDtoById(id) + override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean = newSuspendedTransaction { + DbUser.findById(id)?.delete() != null } } diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt index 7230d15a3..43b2ce66b 100644 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt +++ b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt @@ -18,8 +18,6 @@ package org.anvilpowered.anvil.db.user -import org.anvilpowered.anvil.db.system.DbGameType -import org.anvilpowered.anvil.db.system.GameTypes import org.jetbrains.exposed.dao.UUIDEntity import org.jetbrains.exposed.dao.UUIDEntityClass import org.jetbrains.exposed.dao.id.EntityID @@ -30,13 +28,11 @@ import org.sourcegrade.kontour.UUID object Users : UUIDTable("users") { val username = varchar("username", 255).uniqueIndex() val email = varchar("email", 255).uniqueIndex() - val gameTypeId = reference("game_type_id", GameTypes) } class DbUser(id: EntityID) : UUIDEntity(id) { var username: String by Users.username var email: String by Users.email - var gameType: DbGameType by DbGameType referencedOn Users.gameTypeId val gameUsers: SizedIterable by DbGameUser referrersOn GameUsers.userId companion object : UUIDEntityClass(Users) From 16b82c2d53cd6c8a1dd2edc215bc57e7bcc32eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 7 Jul 2023 10:38:25 +0200 Subject: [PATCH 25/77] Kotlin 1.9 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9516e7952..32b470590 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] #kmongo = "4.8.0" -kotlin = "1.9.0-Beta" +kotlin = "1.9.0" ktor = "2.3.0" log4j = "2.20.0" From 6a80f8484034fc95dcdcac1936e5598a2bdaef12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 14 Jul 2023 21:16:37 +0200 Subject: [PATCH 26/77] Write db repositories --- api/build.gradle.kts | 1 + api/game/build.gradle.kts | 2 +- .../kotlin/org/anvilpowered/anvil/ui/App.kt | 2 +- .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 2 +- .../anvil/ui/page/dashboard/Home.kt | 4 +- .../anvil/ui/page/servers/Create.kt | 1 - .../anvil/ui/page/servers/Home.kt | 2 +- .../anvil/plugin/command/AnvilCommand.kt | 2 +- .../plugin/command/AnvilPluginsCommand.kt | 4 +- app/plugin/sponge/build.gradle.kts | 2 +- app/plugin/velocity/build.gradle.kts | 4 +- .../anvil/plugin/AnvilVelocityPlugin.kt | 9 +- {infrastructure => core}/build.gradle.kts | 0 {infrastructure => core}/db/build.gradle.kts | 2 +- .../anvil/db/RepositoryScopeImpl.kt | 40 +++++++++ .../db/datastore/RepositoryExtensions.kt | 0 .../anvil/db/system/GameTypeRepositoryImpl.kt | 59 +++++++++++++ .../anvil/db/system/GameTypeTable.kt | 24 ++---- .../db/system/ServerNodeRepositoryImpl.kt | 70 +++++++++++++++ .../anvil/db/system/ServerNodeTable.kt | 38 ++++++++ .../db/user/DiscordUserRepositoryImpl.kt | 48 +++++++++++ .../anvil/db/user/DiscordUserTable.kt | 36 ++++++++ .../anvil/db/user/GameUserRepositoryImpl.kt | 60 +++++++++++++ .../anvil/db/user/GameUserTable.kt | 22 ++--- .../anvil/db/user/UserRepositoryImpl.kt | 52 +++++++++++ .../anvilpowered/anvil/db/user/UserTable.kt | 12 +-- .../anvilpowered/anvil/entity/AnvilTable.kt | 0 .../db/src/jvmMain/resources/application.conf | 0 .../game/build.gradle.kts | 2 +- .../game/sponge/build.gradle.kts | 2 +- .../anvil/user/AnvilSpongeGameUser.kt | 0 .../anvil/user/AnvilSpongePlayer.kt | 0 .../anvil/user/AnvilSpongeSubject.kt | 0 .../anvil/user/SpongeGameUserFactory.kt | 2 +- .../game/velocity/build.gradle.kts | 2 +- .../anvilpowered/anvil/ProxyServerScope.kt | 0 .../anvilpowered/anvil/VelocityApiBindings.kt | 4 +- .../anvil/command/VelocityCustomCommand.kt | 2 +- .../anvil/command/VelocitySourceConverter.kt | 0 .../anvil/platform/VelocityGamePlatform.kt | 0 .../anvil/platform/VelocityPlugin.kt | 0 .../anvil/platform/VelocityPluginManager.kt | 0 .../anvil/user/AnvilVelocityCommandSource.kt | 2 +- .../anvil/user/AnvilVelocityGameUser.kt | 12 ++- .../anvil/user/AnvilVelocityPlayer.kt | 6 +- .../anvil/user/AnvilVelocitySubject.kt | 0 .../anvil/user/VelocityGameUserFactory.kt | 4 +- .../anvil/http/client/AgentClient.kt | 0 .../anvil/http/server/AgentServer.kt | 0 .../command/CommonGameUserCommandScope.kt | 10 +-- .../org/anvilpowered/anvil/domain/Anvil.kt | 5 +- .../anvil/domain/RepositoryScope.kt | 20 ++--- .../anvil/domain/command/CommandSource.kt | 2 +- .../domain/platform/GamePlatformScope.kt | 8 +- .../anvil/domain/system/GameType.kt | 14 --- .../anvil/domain/system/GameTypeRepository.kt | 28 ++++++ .../anvil/domain/system/ServerNode.kt | 13 --- ...erNodeScope.kt => ServerNodeRepository.kt} | 7 +- .../anvil/domain/user/DiscordUser.kt | 9 +- .../domain/user/DiscordUserRepository.kt | 7 +- .../anvil/domain/user/GameUser.kt | 20 +---- ...serFacetScope.kt => GameUserRepository.kt} | 15 ++-- .../anvilpowered/anvil/domain/user/Player.kt | 2 +- .../anvilpowered/anvil/domain/user/User.kt | 18 ---- .../anvil/domain/user/UserFacet.kt | 6 +- .../anvil/domain/user/UserRepository.kt | 25 ++++++ .../anvil/db/system/DbGameTypeScope.kt | 49 ----------- .../anvil/db/system/DbServerNodeScope.kt | 83 ------------------ .../anvilpowered/anvil/db/user/DbUserScope.kt | 86 ------------------- .../anvilpowered/anvil/entity/ServerNodes.kt | 26 ------ .../datastore/CommonGameUserScope.kt | 29 ------- settings.gradle.kts | 10 +-- 72 files changed, 571 insertions(+), 457 deletions(-) rename {infrastructure => core}/build.gradle.kts (100%) rename {infrastructure => core}/db/build.gradle.kts (74%) create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt rename {infrastructure => core}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt (100%) create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt rename infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypes.kt => core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt (66%) create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt rename infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUsers.kt => core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt (63%) create mode 100644 core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt rename infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt => core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt (76%) rename {infrastructure => core}/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt (100%) rename {infrastructure => core}/db/src/jvmMain/resources/application.conf (100%) rename {infrastructure => core}/game/build.gradle.kts (72%) rename {infrastructure => core}/game/sponge/build.gradle.kts (77%) rename {infrastructure => core}/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt (100%) rename {infrastructure => core}/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt (100%) rename {infrastructure => core}/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt (100%) rename {infrastructure => core}/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt (94%) rename {infrastructure => core}/game/velocity/build.gradle.kts (72%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt (100%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt (92%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt (100%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt (100%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt (100%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt (100%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt (100%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt (100%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt (84%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt (77%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt (100%) rename {infrastructure => core}/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt (86%) rename {infrastructure => core}/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt (100%) rename {infrastructure => core}/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt (100%) rename {infrastructure => core}/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt (89%) rename infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUserFactory.kt => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt (61%) rename api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserApi.kt => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatformScope.kt (83%) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeRepository.kt rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/{ServerNodeScope.kt => ServerNodeRepository.kt} (81%) rename api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserApi.kt => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt (82%) rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/{UserFacetScope.kt => GameUserRepository.kt} (73%) rename api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeApi.kt => domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt (85%) create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt delete mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbGameTypeScope.kt delete mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbServerNodeScope.kt delete mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt delete mode 100644 infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt delete mode 100644 infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 1eb0c9cd7..3efe21aa1 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -11,6 +11,7 @@ repositories { dependencies { commonMainApi("org.lighthousegames:logging:1.3.0") + jvmMainImplementation("co.touchlab:stately-concurrency:1.2.5") // commonMainImplementation(libs.logging) commonMainApi(project(":anvil-domain")) } diff --git a/api/game/build.gradle.kts b/api/game/build.gradle.kts index 358e69e73..2adff502f 100644 --- a/api/game/build.gradle.kts +++ b/api/game/build.gradle.kts @@ -5,5 +5,5 @@ plugins { dependencies { commonMainApi(project(":anvil-api")) - commonMainRuntimeOnly(project(":anvil-infrastructure-game")) + commonMainRuntimeOnly(project(":anvil-core-game")) } diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt index ec290230c..9510b3b67 100644 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt +++ b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt @@ -10,7 +10,7 @@ import mui.material.Toolbar import mui.material.styles.ThemeProvider import mui.material.styles.createTheme import mui.system.sx -import org.anvilpowered.anvil.datastore.Crypto +import org.sourcegrade.kontour.Crypto import react.FC import react.Props import react.create diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt index c418abf53..7dd3671e3 100644 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt +++ b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt @@ -24,7 +24,7 @@ import react.router.useNavigate import mui.icons.material.Dashboard as DashboardIcon import mui.icons.material.Storage as StorageIcon -val drawerWidth = 240; +val drawerWidth = 240 val Menu = FC { diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt index b9ae96b7e..4912c8c82 100644 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt +++ b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt @@ -20,7 +20,7 @@ val DashboardHome = FC { feugiat vivamus at augue. At augue eget arcu dictum varius duis at consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa sapien faucibus et molestie ac. - """.trimIndent() + """.trimIndent() +""" Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non @@ -34,6 +34,6 @@ val DashboardHome = FC { feugiat vivamus at augue. At augue eget arcu dictum varius duis at consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa sapien faucibus et molestie ac. - """.trimIndent() + """.trimIndent() } } diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt index 64015c1b2..d518eaecb 100644 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt +++ b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt @@ -23,7 +23,6 @@ import mui.material.Container import mui.material.Divider import mui.material.IconButton import mui.material.Snackbar -import mui.material.SnackbarOrigin import mui.material.SnackbarOriginHorizontal import mui.material.SnackbarOriginVertical import mui.material.SvgIconColor diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt index 11b6e9312..571a00cdc 100644 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt +++ b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt @@ -16,8 +16,8 @@ import mui.material.Toolbar import mui.material.Typography import mui.material.styles.TypographyVariant import mui.system.sx -import org.anvilpowered.anvil.ui.component.SearchBox import org.anvilpowered.anvil.domain.Server +import org.anvilpowered.anvil.ui.component.SearchBox import react.FC import react.Props import react.router.useNavigate diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt index 27260ee6d..0a9e62ddb 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt @@ -1,7 +1,7 @@ package org.anvilpowered.anvil.plugin.command -import org.anvilpowered.anvil.domain.platform.PluginManager import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.platform.PluginManager import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt index 4d62ee31d..fb960f7fe 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt @@ -2,8 +2,8 @@ package org.anvilpowered.anvil.plugin.command import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.api.user.requiresPermission -import org.anvilpowered.anvil.domain.platform.PluginManager import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.platform.PluginManager import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess @@ -15,5 +15,5 @@ fun AnvilCommand.createPlugins(): LiteralCommandNode = .requiresPermission("anvil.agent.plugins") .executesSingleSuccess { context -> val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } - context.source.sendMessage(Component.text("Plugins: $pluginNamesString").color(NamedTextColor.AQUA)) + context.source.audience.sendMessage(Component.text("Plugins: $pluginNamesString").color(NamedTextColor.AQUA)) }.build() diff --git a/app/plugin/sponge/build.gradle.kts b/app/plugin/sponge/build.gradle.kts index 7485b0794..269690c48 100644 --- a/app/plugin/sponge/build.gradle.kts +++ b/app/plugin/sponge/build.gradle.kts @@ -14,7 +14,7 @@ repositories { dependencies { commonMainImplementation(project(":anvil-app-plugin-core")) - commonMainImplementation(project(":anvil-infrastructure-game-sponge")) + commonMainImplementation(project(":anvil-core-game-sponge")) } sponge { diff --git a/app/plugin/velocity/build.gradle.kts b/app/plugin/velocity/build.gradle.kts index ad7188a16..0b2242978 100644 --- a/app/plugin/velocity/build.gradle.kts +++ b/app/plugin/velocity/build.gradle.kts @@ -1,11 +1,11 @@ -plugins { + plugins { id("kotlin-jvm.base-conventions") kotlin("kapt") } dependencies { commonMainImplementation(project(":anvil-app-plugin-core")) - commonMainImplementation(project(":anvil-infrastructure-game-velocity")) + commonMainImplementation(project(":anvil-core-game-velocity")) jvmMainCompileOnly(libs.velocity) kapt(libs.velocity) commonMainImplementation(libs.kbrig.brigadier) diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt index 54722d85f..2a83db3ec 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -27,9 +27,10 @@ class AnvilVelocityPlugin { fun registerCommands() { logger.info { "Anvil Agent is running!" } - proxyServer.commandManager.register(BrigadierCommand( - AnvilCommand.create() - )) + proxyServer.commandManager.register( + BrigadierCommand( + AnvilCommand.create(), + ), + ) } - } diff --git a/infrastructure/build.gradle.kts b/core/build.gradle.kts similarity index 100% rename from infrastructure/build.gradle.kts rename to core/build.gradle.kts diff --git a/infrastructure/db/build.gradle.kts b/core/db/build.gradle.kts similarity index 74% rename from infrastructure/db/build.gradle.kts rename to core/db/build.gradle.kts index 7894df5a6..ae9838a01 100644 --- a/infrastructure/db/build.gradle.kts +++ b/core/db/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } dependencies { - commonMainApi(project(":anvil-infrastructure")) + commonMainApi(project(":anvil-core")) jvmMainApi(platform(libs.exposed.bom)) jvmMainApi(libs.bundles.exposed) } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt new file mode 100644 index 000000000..6660d5f0c --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt @@ -0,0 +1,40 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db + +import org.anvilpowered.anvil.db.system.ServerNodeRepositoryImpl +import org.anvilpowered.anvil.db.user.DiscordUserRepositoryImpl +import org.anvilpowered.anvil.db.user.GameUserRepositoryImpl +import org.anvilpowered.anvil.db.user.UserRepositoryImpl +import org.anvilpowered.anvil.domain.RepositoryScope +import org.anvilpowered.anvil.domain.system.ServerNodeRepository +import org.anvilpowered.anvil.domain.user.DiscordUserRepository +import org.anvilpowered.anvil.domain.user.GameUserRepository +import org.anvilpowered.anvil.domain.user.UserRepository + +object RepositoryScopeImpl : RepositoryScope { + override val discordUserRepository: DiscordUserRepository + get() = DiscordUserRepositoryImpl + override val gameUserRepository: GameUserRepository + get() = GameUserRepositoryImpl + override val userRepository: UserRepository + get() = UserRepositoryImpl + override val serverNodeRepository: ServerNodeRepository + get() = ServerNodeRepositoryImpl +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt similarity index 100% rename from infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt rename to core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt new file mode 100644 index 000000000..810a12f39 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt @@ -0,0 +1,59 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.system + +import org.anvilpowered.anvil.domain.system.GameType +import org.anvilpowered.anvil.domain.system.GameTypeRepository +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.UUID +import kotlin.reflect.KClass + +internal object GameTypeRepositoryImpl : GameTypeRepository { + override suspend fun findByName(name: String): GameType? = newSuspendedTransaction { + GameTypeEntity.find(GameTypeTable.name eq name).firstOrNull() + ?.let { GameType(it.id.value) } + } + + override suspend fun findByWebsite(website: String): GameType? = newSuspendedTransaction { + GameTypeEntity.find(GameTypeTable.website eq website).firstOrNull() + ?.let { GameType(it.id.value) } + } + + override suspend fun create(item: GameType.CreateDto): GameType = newSuspendedTransaction { + GameTypeEntity.new { + name = item.name + website = item.website + }.let { GameType(it.id.value) } + } + + override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { + TODO() + } + + override suspend fun exists(id: UUID): Boolean = newSuspendedTransaction { + GameTypeEntity.findById(id) != null + } + + override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { + GameTypeTable.deleteWhere { GameTypeTable.id eq id } > 0 + } +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypes.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt similarity index 66% rename from infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypes.kt rename to core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt index 6727f3e1b..36053ba8b 100644 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypes.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt @@ -22,28 +22,18 @@ import org.jetbrains.exposed.dao.UUIDEntity import org.jetbrains.exposed.dao.UUIDEntityClass import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.UUIDTable +import org.jetbrains.exposed.sql.SizedIterable import java.util.UUID -object GameTypes : UUIDTable("game_types") { +internal object GameTypeTable : UUIDTable("game_types") { val name = varchar("name", 255).uniqueIndex() val website = varchar("website", 255) } -class DbGameType(id: EntityID) : UUIDEntity(id) { - var name by GameTypes.name - var website by GameTypes.website +internal class GameTypeEntity(id: EntityID) : UUIDEntity(id) { + var name by GameTypeTable.name + var website by GameTypeTable.website + val serverNodes: SizedIterable by ServerNodeEntity referrersOn ServerNodeTable.gameTypeId - companion object : UUIDEntityClass(GameTypes) + companion object : UUIDEntityClass(GameTypeTable) } - -//context(GameTypes) -//fun InsertStatement<*>.setValuesFrom(gameType: GameType.CreateDto) { -// this[name] = gameType.name -// this[website] = gameType.website -//} -// -//fun ResultRow.toGameType() = GameType( -// name = this[GameTypes.name], -// website = this[GameTypes.website], -// id = this[GameTypes.id].value, -//) diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt new file mode 100644 index 000000000..22366229d --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt @@ -0,0 +1,70 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.system + +import org.anvilpowered.anvil.domain.system.GameTypeJoin +import org.anvilpowered.anvil.domain.system.ServerNode +import org.anvilpowered.anvil.domain.system.ServerNodeRepository +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.UUID +import kotlin.reflect.KClass + +internal object ServerNodeRepositoryImpl : ServerNodeRepository { + + override suspend fun exists(id: UUID): Boolean = + newSuspendedTransaction { ServerNodeEntity.findById(id) != null } + + override suspend fun findByGameType(): GameTypeJoin> = GameTypeJoinImpl + + override suspend fun create(item: ServerNode.CreateDto): ServerNode = TODO() + override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { + TODO("Not yet implemented") + } + + override suspend fun deleteById(id: UUID): Boolean = + newSuspendedTransaction { ServerNodeTable.deleteWhere { ServerNodeTable.id eq id } > 0 } + + private object GameTypeJoinImpl : GameTypeJoin> { + override suspend fun id(id: UUID): SizedIterable = + newSuspendedTransaction { +// val t= (ServerNodeTable innerJoin GameTypes).select { GameTypes.id eq id }.mapLazy { it.toServerNode() } + + (GameTypeEntity.findById(id) ?: throw NoSuchElementException()) + .serverNodes + + TODO() + } + + override suspend fun name(name: String): SizedIterable = + newSuspendedTransaction { +// (ServerNodeTable innerJoin GameTypes).select { GameTypes.name eq name }.mapLazy { it.toServerNode() } + TODO() + } + + override suspend fun website(website: String): SizedIterable = + newSuspendedTransaction { +// (ServerNodeTable innerJoin GameTypes).select { GameTypes.website eq website }.mapLazy { it.toServerNode() } + TODO() + } + } +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt new file mode 100644 index 000000000..350386332 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt @@ -0,0 +1,38 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.system + +import org.jetbrains.exposed.dao.UUIDEntity +import org.jetbrains.exposed.dao.UUIDEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.UUIDTable +import org.sourcegrade.kontour.UUID + +internal object ServerNodeTable : UUIDTable("server_nodes") { + val name = varchar("name", 255).uniqueIndex() + val gameTypeId = reference("game_type_id", GameTypeTable) +} + +internal class ServerNodeEntity(id: EntityID) : UUIDEntity(id) { + var name by ServerNodeTable.name + var gameTypeId by ServerNodeTable.gameTypeId + var gameType by GameTypeEntity referencedOn ServerNodeTable.gameTypeId + + companion object : UUIDEntityClass(ServerNodeTable) +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt new file mode 100644 index 000000000..ada7c8f1c --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt @@ -0,0 +1,48 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.user + +import org.anvilpowered.anvil.domain.user.DiscordUser +import org.anvilpowered.anvil.domain.user.DiscordUserRepository +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.UUID +import kotlin.reflect.KClass + +object DiscordUserRepositoryImpl : DiscordUserRepository { + override suspend fun create(item: DiscordUser.CreateDto): DiscordUser = newSuspendedTransaction { + DiscordUserEntity.new(item.id) { + discordId = item.discordId + }.let { DiscordUser(it.id.value) } + } + + override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { + TODO("Not yet implemented") + } + + override suspend fun exists(id: UUID): Boolean = newSuspendedTransaction { + DiscordUserEntity.findById(id) != null + } + + override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { + DiscordUserTable.deleteWhere { DiscordUserTable.id eq id } > 0 + } +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt new file mode 100644 index 000000000..9cfbaace8 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt @@ -0,0 +1,36 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.user + +import org.jetbrains.exposed.dao.UUIDEntity +import org.jetbrains.exposed.dao.UUIDEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.UUIDTable +import java.util.UUID + +internal object DiscordUserTable : UUIDTable("discord_users") { + val discordId = ulong("discord_id").uniqueIndex() +} + +internal class DiscordUserEntity(id: EntityID) : UUIDEntity(id) { + var discordId by DiscordUserTable.discordId.transform({ it.toULong() }, { it.toString() }) + val user: UserEntity by UserEntity referencedOn DiscordUserTable.id + + companion object : UUIDEntityClass(DiscordUserTable) +} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt new file mode 100644 index 000000000..6490ef298 --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt @@ -0,0 +1,60 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.user + +import org.anvilpowered.anvil.db.system.GameTypeEntity +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.GameUserRepository +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.mapLazy +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.SizedIterable +import org.sourcegrade.kontour.UUID +import kotlin.reflect.KClass + +object GameUserRepositoryImpl : GameUserRepository { + override suspend fun getAllUserNames(startWith: String): SizedIterable = newSuspendedTransaction { + GameUserEntity.find { GameUserTable.username like "$startWith%" }.mapLazy { it.username } + } + + override suspend fun findByUsername(username: String): GameUser? = newSuspendedTransaction { + GameUserEntity.find { GameUserTable.username eq username }.firstOrNull()?.let { GameUser(it.id.value) } + } + + override suspend fun create(item: GameUser.CreateDto): GameUser = newSuspendedTransaction { + GameUserEntity.new(item.id) { + user = UserEntity[item.userId] + gameType = GameTypeEntity[item.gameTypeId] + username = item.username + }.let { GameUser(it.id.value) } + } + + override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { + TODO() + } + + override suspend fun exists(id: UUID): Boolean = + newSuspendedTransaction { GameUserEntity.findById(id) != null } + + override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { + GameUserTable.deleteWhere { GameUserTable.id eq id } > 0 + } +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUsers.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt similarity index 63% rename from infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUsers.kt rename to core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt index 5c8b5fd31..c538fa69c 100644 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUsers.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt @@ -18,26 +18,26 @@ package org.anvilpowered.anvil.db.user -import org.anvilpowered.anvil.db.system.DbGameType -import org.anvilpowered.anvil.db.system.GameTypes +import org.anvilpowered.anvil.db.system.GameTypeEntity +import org.anvilpowered.anvil.db.system.GameTypeTable import org.jetbrains.exposed.dao.UUIDEntity import org.jetbrains.exposed.dao.UUIDEntityClass import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.UUIDTable import org.sourcegrade.kontour.UUID -object GameUsers : UUIDTable("game_users") { - val userId = reference("user_id", Users) - val gameTypeId = reference("game_type_id", GameTypes) +internal object GameUserTable : UUIDTable("game_users") { + val userId = reference("user_id", UserTable) + val gameTypeId = reference("game_type_id", GameTypeTable) val username = varchar("username", 255).uniqueIndex() val nickname = varchar("nickname", 255).nullable() } -class DbGameUser(id: EntityID) : UUIDEntity(id) { - var user: DbUser by DbUser referencedOn GameUsers.userId - var gameType: DbGameType by DbGameType referencedOn GameUsers.gameTypeId - var username: String by GameUsers.username - var nickname: String? by GameUsers.nickname +internal class GameUserEntity(id: EntityID) : UUIDEntity(id) { + var user: UserEntity by UserEntity referencedOn GameUserTable.userId + var gameType: GameTypeEntity by GameTypeEntity referencedOn GameUserTable.gameTypeId + var username: String by GameUserTable.username + var nickname: String? by GameUserTable.nickname - companion object : UUIDEntityClass(GameUsers) + companion object : UUIDEntityClass(GameUserTable) } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt new file mode 100644 index 000000000..18198e91a --- /dev/null +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt @@ -0,0 +1,52 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.db.user + +import org.anvilpowered.anvil.domain.user.User +import org.anvilpowered.anvil.domain.user.UserRepository +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.Dto +import org.sourcegrade.kontour.UUID +import kotlin.reflect.KClass + +object UserRepositoryImpl : UserRepository { + override suspend fun findByUsername(username: String): User? = newSuspendedTransaction { + UserEntity.find { UserTable.username eq username }.firstOrNull()?.let { User(it.id.value) } + } + + override suspend fun create(item: User.CreateDto): User = newSuspendedTransaction { + UserEntity.new { + username = item.username + email = item.email + }.let { User(it.id.value) } + } + + override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { + TODO("Not yet implemented") + } + + override suspend fun exists(id: UUID): Boolean = + newSuspendedTransaction { UserEntity.findById(id) != null } + + override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { + UserTable.deleteWhere { UserTable.id eq id } > 0 + } +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt similarity index 76% rename from infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt rename to core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt index 43b2ce66b..27a58c45c 100644 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/Users.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt @@ -25,15 +25,15 @@ import org.jetbrains.exposed.dao.id.UUIDTable import org.jetbrains.exposed.sql.SizedIterable import org.sourcegrade.kontour.UUID -object Users : UUIDTable("users") { +internal object UserTable : UUIDTable("users") { val username = varchar("username", 255).uniqueIndex() val email = varchar("email", 255).uniqueIndex() } -class DbUser(id: EntityID) : UUIDEntity(id) { - var username: String by Users.username - var email: String by Users.email - val gameUsers: SizedIterable by DbGameUser referrersOn GameUsers.userId +internal class UserEntity(id: EntityID) : UUIDEntity(id) { + var username: String by UserTable.username + var email: String by UserTable.email + val gameUsers: SizedIterable by GameUserEntity referrersOn GameUserTable.userId - companion object : UUIDEntityClass(Users) + companion object : UUIDEntityClass(UserTable) } diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt similarity index 100% rename from infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt rename to core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt diff --git a/infrastructure/db/src/jvmMain/resources/application.conf b/core/db/src/jvmMain/resources/application.conf similarity index 100% rename from infrastructure/db/src/jvmMain/resources/application.conf rename to core/db/src/jvmMain/resources/application.conf diff --git a/infrastructure/game/build.gradle.kts b/core/game/build.gradle.kts similarity index 72% rename from infrastructure/game/build.gradle.kts rename to core/game/build.gradle.kts index d81a790d3..0fc848acb 100644 --- a/infrastructure/game/build.gradle.kts +++ b/core/game/build.gradle.kts @@ -4,6 +4,6 @@ plugins { } dependencies { - commonMainApi(project(":anvil-infrastructure")) + commonMainApi(project(":anvil-core")) commonMainApi(project(":anvil-api-game")) } diff --git a/infrastructure/game/sponge/build.gradle.kts b/core/game/sponge/build.gradle.kts similarity index 77% rename from infrastructure/game/sponge/build.gradle.kts rename to core/game/sponge/build.gradle.kts index 3cf75ed9e..22fb824b1 100644 --- a/infrastructure/game/sponge/build.gradle.kts +++ b/core/game/sponge/build.gradle.kts @@ -6,6 +6,6 @@ plugins { dependencies { // commonMainImplementation(libs.coroutines) commonMainImplementation(libs.kotlinx.coroutines) - commonMainImplementation(project(":anvil-infrastructure-game")) + commonMainImplementation(project(":anvil-core-game")) jvmMainImplementation(libs.sponge) } diff --git a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt similarity index 100% rename from infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt rename to core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt diff --git a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt similarity index 100% rename from infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt rename to core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt diff --git a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt similarity index 100% rename from infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt rename to core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt diff --git a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt similarity index 94% rename from infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt rename to core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt index 77c0b0699..64f679e10 100644 --- a/infrastructure/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt @@ -23,7 +23,7 @@ import org.anvilpowered.anvil.domain.user.GameUser import org.sourcegrade.kontour.UUID import org.spongepowered.api.Sponge -class SpongeGameUserFactory : GameUserFactory { +class SpongeGameUserFactory : GameUserPlatformScopeFactory { override suspend fun createGameUser(id: UUID): GameUser = Sponge.server().userManager().loadOrCreate(id).asDeferred().await().toAnvilGameUser() } diff --git a/infrastructure/game/velocity/build.gradle.kts b/core/game/velocity/build.gradle.kts similarity index 72% rename from infrastructure/game/velocity/build.gradle.kts rename to core/game/velocity/build.gradle.kts index fbe65e207..30f69dc3f 100644 --- a/infrastructure/game/velocity/build.gradle.kts +++ b/core/game/velocity/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } dependencies { - commonMainImplementation(project(":anvil-infrastructure-game")) + commonMainImplementation(project(":anvil-core-game")) commonMainImplementation(libs.kbrig.brigadier) jvmMainCompileOnly(libs.velocity) } diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt similarity index 100% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt similarity index 92% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt index 4faaf8de3..71b75c2fd 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt @@ -26,14 +26,14 @@ import org.anvilpowered.anvil.command.CommonGameUserCommandScope import org.anvilpowered.anvil.domain.command.GameUserCommandScope import org.anvilpowered.anvil.domain.platform.GamePlatform import org.anvilpowered.anvil.domain.platform.PluginManager -import org.anvilpowered.anvil.infrastructure.datastore.CommonGameUserScope import org.anvilpowered.anvil.platform.VelocityGamePlatform import org.anvilpowered.anvil.platform.VelocityPluginManager fun ApiBindings.Companion.createVelocity(proxyServer: ProxyServer): GameApiBindings { val gameUserScope = CommonGameUserScope() - class VelocityApiBindings(val proxyServer: ProxyServer) : GameApiBindings, + class VelocityApiBindings(val proxyServer: ProxyServer) : + GameApiBindings, GamePlatform by VelocityGamePlatform(proxyServer), LoggingScope by LoggingScope.create("anvil-velocity"), PluginManager.Scope by VelocityPluginManager.createScope(proxyServer.pluginManager), diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt similarity index 100% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt index fcf7e6602..c57ca5bac 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt @@ -3,8 +3,8 @@ package org.anvilpowered.anvil.command import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.ProxyServerScope -import org.anvilpowered.anvil.domain.command.PlayerCommandScope import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.command.PlayerCommandScope import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.user.toAnvilPlayer import org.anvilpowered.kbrig.argument.StringArgumentType diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt similarity index 100% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt similarity index 100% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt similarity index 100% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt similarity index 100% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt similarity index 100% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt index 3b4a69a04..c9649e988 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt @@ -19,11 +19,11 @@ package org.anvilpowered.anvil.user import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.User import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.domain.user.Subject +import org.anvilpowered.anvil.domain.user.User import com.velocitypowered.api.command.CommandSource as VelocityCommandSource import com.velocitypowered.api.proxy.Player as VelocityPlayer diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt similarity index 84% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt index e0130c557..e00bfa86c 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt @@ -18,7 +18,6 @@ package org.anvilpowered.anvil.user -import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player import org.sourcegrade.kontour.UUID @@ -26,15 +25,14 @@ import org.sourcegrade.kontour.UUID * Velocity does not have an offline player concept, so we must handle it ourselves. */ internal class AnvilVelocityGameUser( - override val id: UUID, -) : GameUser { - override val username: String + val id: UUID, +) { + val username: String get() = TODO("Not yet implemented") - override val player: Player? + val player: Player? get() = TODO("Not yet implemented") - override fun hasPermission(permission: String): Boolean? { + fun hasPermission(permission: String): Boolean? { TODO("Not yet implemented") } - } diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt similarity index 77% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt index cd4323ea9..e5442c5dc 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt @@ -1,10 +1,10 @@ package org.anvilpowered.anvil.user -import org.anvilpowered.anvil.domain.user.User import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.domain.user.Subject +import org.anvilpowered.anvil.domain.user.User import com.velocitypowered.api.proxy.Player as VelocityPlayer fun VelocityPlayer.toAnvilPlayer(): Player = AnvilVelocityPlayer(this) @@ -15,6 +15,6 @@ private class AnvilVelocityPlayer( Audience by velocityPlayer, Subject by velocityPlayer.toAnvilSubject() { - override val user: User = User(velocityPlayer.uniqueId, velocityPlayer.username) - override val gameUser: GameUser = AnvilVelocityGameUser(velocityPlayer.uniqueId) + override val user: User = User(velocityPlayer.uniqueId) + override val gameUser: GameUser = GameUser(velocityPlayer.uniqueId) } diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt similarity index 100% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt diff --git a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt similarity index 86% rename from infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt index 69596c10e..1ac26577d 100644 --- a/infrastructure/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt @@ -21,6 +21,6 @@ package org.anvilpowered.anvil.user import org.anvilpowered.anvil.domain.user.GameUser import org.sourcegrade.kontour.UUID -class VelocityGameUserFactory : GameUserFactory { - override suspend fun createGameUser(id: UUID): GameUser = AnvilVelocityGameUser(id) +class VelocityGameUserFactory : GameUserPlatformScopeFactory { + override suspend fun createGameUser(id: UUID): GameUser = GameUser(id) } diff --git a/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt b/core/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt similarity index 100% rename from infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt rename to core/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt diff --git a/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt b/core/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt similarity index 100% rename from infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt rename to core/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt diff --git a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt similarity index 89% rename from infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt index ed035b0d1..ed032013f 100644 --- a/infrastructure/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt @@ -19,9 +19,9 @@ package org.anvilpowered.anvil.command import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.domain.command.GameUserCommandScope +import org.anvilpowered.anvil.domain.RepositoryScope import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.GameUserScope +import org.anvilpowered.anvil.domain.command.GameUserCommandScope import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.kbrig.argument.StringArgumentType @@ -31,7 +31,7 @@ import org.anvilpowered.kbrig.builder.executesSuspending import org.anvilpowered.kbrig.context.CommandContext import org.anvilpowered.kbrig.context.get -context(GameUserScope) +context(RepositoryScope) class CommonGameUserCommandScope : GameUserCommandScope { override fun ArgumentBuilder.Companion.gameUser( name: String, @@ -39,12 +39,12 @@ class CommonGameUserCommandScope : GameUserCommandScope { ): RequiredArgumentBuilder = required(name, StringArgumentType.SingleWord) .suggests { _, builder -> - GameUser.getAllUserNames(startWith = builder.input).forEach { name -> builder.suggest(name) } + gameUserRepository.getAllUserNames(startWith = builder.input).forEach { name -> builder.suggest(name) } builder.build() } .executesSuspending { context -> val gameUserName = context.get(name) - GameUser.findByUsername(gameUserName)?.let { gameUser -> + gameUserRepository.findByUsername(gameUserName)?.let { gameUser -> command(context, gameUser) } ?: run { context.source.audience.sendMessage( diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt index a72fc7e39..37b9c103e 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt @@ -18,7 +18,4 @@ package org.anvilpowered.anvil.domain -interface Anvil { - - -} +interface Anvil diff --git a/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUserFactory.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt similarity index 61% rename from infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUserFactory.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt index 679e8c2b8..761aeb5e4 100644 --- a/infrastructure/src/commonMain/kotlin/org/anvilpowered/anvil/user/GameUserFactory.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt @@ -16,16 +16,16 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.domain -import org.anvilpowered.anvil.domain.user.GameUser -import org.sourcegrade.kontour.UUID +import org.anvilpowered.anvil.domain.system.ServerNodeRepository +import org.anvilpowered.anvil.domain.user.DiscordUserRepository +import org.anvilpowered.anvil.domain.user.GameUserRepository +import org.anvilpowered.anvil.domain.user.UserRepository -interface GameUserFactory { - - suspend fun createGameUser(id: UUID): GameUser - - interface Scope { - val gameUserFactory: GameUserFactory - } +interface RepositoryScope { + val discordUserRepository: DiscordUserRepository + val gameUserRepository: GameUserRepository + val userRepository: UserRepository + val serverNodeRepository: ServerNodeRepository } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt index 96175023c..dd549aba3 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt @@ -2,8 +2,8 @@ package org.anvilpowered.anvil.domain.command import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Subject import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.Subject import org.anvilpowered.anvil.domain.user.User interface CommandSource { diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserApi.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatformScope.kt similarity index 83% rename from api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserApi.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatformScope.kt index 6addd3ae9..c832618c8 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserApi.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatformScope.kt @@ -16,9 +16,11 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.api.user +package org.anvilpowered.anvil.domain.platform import org.anvilpowered.anvil.domain.user.GameUser -interface GameUserApi : GameUser.PlatformScope, GameUser.DbScope { -} +/** + * The union of all scopes a platform should provide. + */ +interface GamePlatformScope : GameUser.GamePlatformScope diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt index 8ffb1dc37..451ab1fbd 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt @@ -21,7 +21,6 @@ package org.anvilpowered.anvil.domain.system import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.UUID -import org.sourcegrade.kontour.scope.CrudScope data class GameType(override val id: UUID) : DomainEntity { @@ -29,17 +28,4 @@ data class GameType(override val id: UUID) : DomainEntity { val name: String, val website: String, ) : Creates - - interface DbScope : CrudScope { - - suspend fun GameType.getName(): String - - suspend fun GameType.getWebsite(): String - - suspend fun DomainEntity.Repository.findByName(name: String): GameType? - - suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? - } - - companion object Repository : DomainEntity.Repository } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeRepository.kt new file mode 100644 index 000000000..7b501c625 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeRepository.kt @@ -0,0 +1,28 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.system + +import org.sourcegrade.kontour.Repository + +interface GameTypeRepository : Repository { + + suspend fun findByName(name: String): GameType? + + suspend fun findByWebsite(website: String): GameType? +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt index 09bed0cc5..e3afeeb35 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt @@ -20,9 +20,7 @@ package org.anvilpowered.anvil.domain.system import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.SizedIterable import org.sourcegrade.kontour.UUID -import org.sourcegrade.kontour.scope.CrudScope data class ServerNode(override val id: UUID) : DomainEntity { @@ -30,15 +28,4 @@ data class ServerNode(override val id: UUID) : DomainEntity { val name: String, val gameTypeId: UUID, ) : Creates - - interface DbScope : CrudScope { - - suspend fun ServerNode.getName(): String - - suspend fun ServerNode.getGameType(): GameType - - suspend fun DomainEntity.Repository.findByGameType(): GameTypeJoin> - } - - companion object Repository : DomainEntity.Repository } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt similarity index 81% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeScope.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt index f70c62372..3cbb9b330 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeScope.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt @@ -18,7 +18,10 @@ package org.anvilpowered.anvil.domain.system -import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.Repository import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.scope.CrudScope +interface ServerNodeRepository : Repository { + + suspend fun findByGameType(): GameTypeJoin> +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt index 1dedd703b..73580dbad 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt @@ -1,6 +1,13 @@ package org.anvilpowered.anvil.domain.user +import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.UUID -interface DiscordUser : DomainEntity { +data class DiscordUser(override val id: UUID) : DomainEntity { + + data class CreateDto( + val id: UUID, + val discordId: String, + ) : Creates } diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserApi.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt similarity index 82% rename from api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserApi.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt index 1520d1548..4a0104f87 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserApi.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt @@ -16,9 +16,8 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.api.user +package org.anvilpowered.anvil.domain.user -import org.anvilpowered.anvil.domain.user.User +import org.sourcegrade.kontour.Repository -interface UserApi : User.PlatformScope, User.DbScope { -} +interface DiscordUserRepository : Repository diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt index 339c74dd2..cac60fbe2 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt @@ -1,11 +1,8 @@ package org.anvilpowered.anvil.domain.user -import org.anvilpowered.anvil.domain.system.GameType import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.SizedIterable import org.sourcegrade.kontour.UUID -import org.sourcegrade.kontour.scope.CrudScope /** * A user of a game of the Anvil platform. @@ -21,25 +18,10 @@ data class GameUser(override val id: UUID) : DomainEntity { val username: String, ) : Creates - interface PlatformScope : UserFacetScope { + interface GamePlatformScope { val GameUser.subject: Subject val GameUser.player: Player? } - - interface DbScope : CrudScope { - - suspend fun GameUser.getUserId(): UUID - - suspend fun GameUser.getGameType(): GameType - - suspend fun GameUser.getNickname(): String? - - suspend fun DomainEntity.Repository.getAllUserNames(startWith: String = ""): SizedIterable - - suspend fun DomainEntity.Repository.findByUsername(username: String): GameUser? - } - - companion object Repository : DomainEntity.Repository } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacetScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt similarity index 73% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacetScope.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt index c3f53726a..ef8389041 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacetScope.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt @@ -18,15 +18,12 @@ package org.anvilpowered.anvil.domain.user -import org.sourcegrade.kontour.DomainEntity +import org.sourcegrade.kontour.Repository +import org.sourcegrade.kontour.SizedIterable -/** - * Some facet of a user which holds a reference to the parent [User]. - */ -interface UserFacetScope { +interface GameUserRepository : Repository { + + suspend fun getAllUserNames(startWith: String = ""): SizedIterable - /** - * The parent [User] represented by this facet. - */ - val E.user: User + suspend fun findByUsername(username: String): GameUser? } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt index d3b999f14..9747e2d50 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt @@ -3,7 +3,7 @@ package org.anvilpowered.anvil.domain.user /** * An online player. */ -interface Player : UserFacetScope, Subject, Audience { +interface Player : UserFacet, Subject, Audience { val gameUser: GameUser } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt index b0eb65e17..24e758d09 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt @@ -1,10 +1,8 @@ package org.anvilpowered.anvil.domain.user -import org.anvilpowered.anvil.domain.system.GameType import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.UUID -import org.sourcegrade.kontour.scope.CrudScope /** * A user of the Anvil platform. @@ -27,20 +25,4 @@ data class User(override val id: UUID) : DomainEntity { val User.player: Player? } - - /** - * Operations scoped within a database context. - */ - interface DbScope : CrudScope { - - suspend fun User.getUsername(): String - - suspend fun User.getEmail(): String - - suspend fun User.getGameUsers(gameType: GameType? = null): List - - suspend fun DomainEntity.Repository.findByUsername(username: String): User? - } - - companion object Repository : DomainEntity.Repository } diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeApi.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt similarity index 85% rename from api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeApi.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt index 0d27da805..c6d39773c 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeApi.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt @@ -16,9 +16,9 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.api.system +package org.anvilpowered.anvil.domain.user -import org.anvilpowered.anvil.domain.system.GameType +interface UserFacet { -interface GameTypeApi : GameType.DbScope { + val user: User } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt new file mode 100644 index 000000000..bdecb95c6 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt @@ -0,0 +1,25 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.domain.user + +import org.sourcegrade.kontour.Repository + +interface UserRepository : Repository { + suspend fun findByUsername(username: String): User? +} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbGameTypeScope.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbGameTypeScope.kt deleted file mode 100644 index 2054e89c4..000000000 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbGameTypeScope.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.system - -import org.anvilpowered.anvil.db.datastore.newSaveTransaction -import org.anvilpowered.anvil.db.user.setValuesFrom -import org.anvilpowered.anvil.domain.system.GameType -import org.anvilpowered.anvil.entity.toGameType -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -internal class DbGameTypeScope : GameType.DbScope { - - override suspend fun DomainEntity.Repository.create(item: GameType.CreateDto): GameType = - newSaveTransaction(GameTypes, { org.anvilpowered.anvil.db.user.setValuesFrom(item) }, ResultRow::toGameType) - - override suspend fun DomainEntity.Repository.findById(id: UUID): GameType? = - newSuspendedTransaction { GameTypes.select(GameTypes.id eq id).firstOrNull()?.toGameType() } - - override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean = - newSuspendedTransaction { GameTypes.deleteWhere { GameTypes.id eq id } > 0 } - - override suspend fun DomainEntity.Repository.findByName(name: String): GameType? = - newSuspendedTransaction { GameTypes.select(GameTypes.name eq name).firstOrNull()?.toGameType() } - - override suspend fun DomainEntity.Repository.findByWebsite(website: String): GameType? = - newSuspendedTransaction { GameTypes.select(GameTypes.website eq website).firstOrNull()?.toGameType() } -} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbServerNodeScope.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbServerNodeScope.kt deleted file mode 100644 index 4df98919e..000000000 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/DbServerNodeScope.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.system - -import org.anvilpowered.anvil.domain.system.GameType -import org.anvilpowered.anvil.domain.system.GameTypeJoin -import org.anvilpowered.anvil.domain.system.ServerNode -import org.anvilpowered.anvil.entity.* -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.mapLazy -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.UUID - -internal object DbServerNodeScope : ServerNode.DbScope { - - override suspend fun DomainEntity.Repository.findById(id: UUID): ServerNode? = - newSuspendedTransaction { - DbServerNode.findById(id)?.let { ServerNode(it.id.value) } - } - - override suspend fun ServerNode.getName(): String = newSuspendedTransaction { - (DbServerNode.findById(this@getName.id) ?: throw NoSuchElementException()) - .name - } - - override suspend fun ServerNode.getGameType(): GameType = newSuspendedTransaction { - val resultId = (DbServerNode.findById(this@getGameType.id) ?: throw NoSuchElementException()) - .gameTypeId.value - GameType(resultId) - } - - override suspend fun DomainEntity.Repository.findByGameType(): GameTypeJoin> = GameTypeJoinImpl - - override suspend fun DomainEntity.Repository.create(item: ServerNode.CreateDto): ServerNode = TODO() -// newSaveTransaction(ServerNodes, { setValuesFrom(item) }, ResultRow::toServerNode) - - override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean = - newSuspendedTransaction { ServerNodes.deleteWhere { ServerNodes.id eq id } > 0 } - - private object GameTypeJoinImpl : GameTypeJoin> { - override suspend fun id(id: UUID): SizedIterable = - newSuspendedTransaction { -// val t= (ServerNodes innerJoin GameTypes).select { GameTypes.id eq id }.mapLazy { it.toServerNode() } - - (DbGameType.findById(id) ?: throw NoSuchElementException()) - .serverNodes - - TODO() - } - - override suspend fun name(name: String): SizedIterable = - newSuspendedTransaction { - (ServerNodes innerJoin GameTypes).select { GameTypes.name eq name }.mapLazy { it.toServerNode() } - TODO() - } - - override suspend fun website(website: String): SizedIterable = - newSuspendedTransaction { - (ServerNodes innerJoin GameTypes).select { GameTypes.website eq website }.mapLazy { it.toServerNode() } - TODO() - } - } -} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt deleted file mode 100644 index 53a17e898..000000000 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DbUserScope.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.user - -import org.anvilpowered.anvil.api.user.UserDto -import org.anvilpowered.anvil.domain.system.GameType -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.User -import org.anvilpowered.anvil.user.GameUserFactory -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.Crypto -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.Dto -import org.sourcegrade.kontour.UUID -import org.sourcegrade.kontour.UnknownDtoException -import kotlin.reflect.KClass - -context(GameUserFactory.Scope) -internal class DbUserScope : User.DbScope { - - context(User) - private fun DbUser.Companion.findByContextId(): DbUser? = DbUser.findById(id) - - override suspend fun User.getUsername(): String { - return newSuspendedTransaction { - DbUser.findByContextId()?.username ?: throw NoSuchElementException() - } - } - - override suspend fun User.getEmail(): String = newSuspendedTransaction { - DbUser.findByContextId()?.email ?: throw NoSuchElementException() - } - - override suspend fun User.getGameUsers(gameType: GameType?): List = newSuspendedTransaction { - (DbUser.findByContextId() ?: throw NoSuchElementException()) - .gameUsers.map { gameUserFactory.createGameUser(it.id.value) } - } - - override suspend fun DomainEntity.Repository.findByUsername(username: String): User? = newSuspendedTransaction { - DbUser.find { Users.username eq username }.firstOrNull()?.let { User(it.id.value) } - } - - override suspend fun DomainEntity.Repository.create(item: User.CreateDto): User = newSuspendedTransaction { - DbUser.new(Crypto.randomUUID()) { - username = item.username - email = item.email - }.id.value.let(::User) - } - - override suspend fun User.exists(): Boolean = newSuspendedTransaction { - DbUser.findByContextId() != null - } - - override suspend fun > DomainEntity.Repository.findDtoById( - id: UUID, dtoType: KClass, - ): D? = newSuspendedTransaction { - DbUser.findById(id)?.let { - @Suppress("UNCHECKED_CAST") - when (dtoType) { - UserDto.Basic::class -> UserDto.Basic(id, it.username) - UserDto.Full::class -> UserDto.Full(id, it.username, it.email) - else -> throw UnknownDtoException(dtoType, User::class) - } as D - } - } - - override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean = newSuspendedTransaction { - DbUser.findById(id)?.delete() != null - } -} diff --git a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt b/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt deleted file mode 100644 index 3a7cb2e23..000000000 --- a/infrastructure/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/ServerNodes.kt +++ /dev/null @@ -1,26 +0,0 @@ -package org.anvilpowered.anvil.entity - -import org.anvilpowered.anvil.db.system.DbGameType -import org.anvilpowered.anvil.db.system.DbGameType.Companion.referrersOn -import org.anvilpowered.anvil.db.system.GameTypes -import org.jetbrains.exposed.dao.UUIDEntity -import org.jetbrains.exposed.dao.UUIDEntityClass -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.dao.id.UUIDTable -import org.jetbrains.exposed.sql.SizedIterable -import org.sourcegrade.kontour.UUID - -object ServerNodes : UUIDTable("server_nodes") { - val name = varchar("name", 255).uniqueIndex() - val gameTypeId = reference("game_type_id", GameTypes) -} - -class DbServerNode(id: EntityID) : UUIDEntity(id) { - var name by ServerNodes.name - var gameTypeId by ServerNodes.gameTypeId - var gameType by DbGameType referencedOn ServerNodes.gameTypeId - - companion object : UUIDEntityClass(ServerNodes) -} - -val DbGameType.serverNodes: SizedIterable by DbServerNode referrersOn ServerNodes.gameTypeId diff --git a/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt b/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt deleted file mode 100644 index 1cec15f3c..000000000 --- a/infrastructure/game/src/commonMain/kotlin/org/anvilpowered/anvil/infrastructure/datastore/CommonGameUserScope.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.anvilpowered.anvil.infrastructure.datastore - -import org.anvilpowered.anvil.domain.user.GameUserScope -import org.anvilpowered.anvil.domain.user.GameUser -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.UUID - -class CommonGameUserScope : GameUserScope { - override suspend fun DomainEntity.Repository.getAllUserNames(startWith: String): SizedIterable { - TODO("Not yet implemented") - } - - override suspend fun DomainEntity.Repository.findByUsername(username: String): GameUser? { - TODO("Not yet implemented") - } - - override suspend fun DomainEntity.Repository.create(item: GameUser.CreateDto): GameUser { - TODO("Not yet implemented") - } - - override suspend fun DomainEntity.Repository.findById(id: UUID): GameUser? { - TODO("Not yet implemented") - } - - override suspend fun DomainEntity.Repository.deleteById(id: UUID): Boolean { - TODO("Not yet implemented") - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index cf19f3b01..535391889 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -37,11 +37,11 @@ sequenceOf( "app-cockpit-ui", "app-cli", "domain", - "infrastructure", - "infrastructure-db", - "infrastructure-game", - "infrastructure-game-sponge", - "infrastructure-game-velocity", + "core", + "core-db", + "core-game", + "core-game-sponge", + "core-game-velocity", ).forEach { val project = ":anvil-$it" include(project) From 9ea408593e7ebfad76e3008d0f03bc36841725ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 15 Jul 2023 00:29:29 +0200 Subject: [PATCH 27/77] Get velocity plugin working --- .../anvilpowered/anvil/api/GameApiBindings.kt | 27 --------- .../org/anvilpowered/anvil/api/AnvilApi.kt | 27 +++++++++ .../org/anvilpowered/anvil/api/ApiBindings.kt | 27 --------- .../api/{LoggingScope.kt => LoggerScope.kt} | 4 +- .../anvil/ui/page/servers/Home.kt | 2 +- .../anvil/plugin/command/AnvilCommand.kt | 4 +- .../plugin/command/AnvilPluginsCommand.kt | 8 ++- app/plugin/velocity/build.gradle.kts | 2 +- .../anvil/plugin/AnvilVelocityPlugin.kt | 17 +++--- .../plugin/AnvilVelocityPluginBootstrap.kt | 12 ++-- .../anvil/db/system/GameTypeRepositoryImpl.kt | 4 ++ .../db/system/ServerNodeRepositoryImpl.kt | 1 + .../db/user/DiscordUserRepositoryImpl.kt | 2 + .../anvil/db/user/GameUserRepositoryImpl.kt | 4 ++ .../anvil/db/user/UserRepositoryImpl.kt | 8 ++- .../anvilpowered/anvil/db/user/UserTable.kt | 4 +- core/game/build.gradle.kts | 1 + .../anvil/user/AnvilSpongeGameUser.kt | 40 ------------- .../anvil/user/AnvilSpongePlayer.kt | 34 ++++------- .../anvil/user/AnvilSpongeSubject.kt | 18 ------ .../anvil/user/SpongeGameUserFactory.kt | 29 --------- .../anvil/user/SpongeGameUserScope.kt | 16 +++++ .../anvilpowered/anvil/AnvilVelocityApi.kt | 21 +++++++ .../anvilpowered/anvil/ProxyServerScope.kt | 7 --- .../anvilpowered/anvil/VelocityApiBindings.kt | 43 -------------- ...actory.kt => VelocityGamePlatformScope.kt} | 14 +++-- .../anvil/command/VelocityCustomCommand.kt | 4 +- .../anvil/command/VelocitySourceConverter.kt | 6 +- ...ityGamePlatform.kt => VelocityPlatform.kt} | 2 +- .../anvil/platform/VelocityPluginManager.kt | 6 -- .../anvil/user/AnvilVelocityCommandSource.kt | 5 +- .../anvil/user/AnvilVelocityGameUser.kt | 38 ------------ .../anvil/user/AnvilVelocityPlayer.kt | 5 +- .../anvil/user/VelocityGameUserScope.kt | 14 +++++ .../command/CommonGameUserCommandScope.kt | 59 ------------------- .../anvil/core/Slf4jDelegateLogger.kt | 42 +++++++++++++ .../org/anvilpowered/anvil/domain/Anvil.kt | 21 ------- .../anvil/domain/GamePlatformScope.kt | 10 ++++ .../anvil/domain/RepositoryScope.kt | 1 + .../anvil/domain/command/CommandSource.kt | 5 +- .../domain/platform/GamePlatformScope.kt | 26 -------- .../anvil/domain/platform/PluginManager.kt | 4 -- .../anvil/domain/{ => system}/Server.kt | 2 +- .../anvil/domain/user/GameUser.kt | 4 +- .../anvilpowered/anvil/domain/user/User.kt | 1 - .../anvil/domain/user/UserFacet.kt | 4 +- .../anvil/domain/user/UserRepository.kt | 2 + .../anvil/domain/command/GameUserCommands.kt | 37 ++++++++++++ 48 files changed, 260 insertions(+), 414 deletions(-) delete mode 100644 api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt create mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt delete mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt rename api/src/commonMain/kotlin/org/anvilpowered/anvil/api/{LoggingScope.kt => LoggerScope.kt} (91%) delete mode 100644 core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt delete mode 100644 core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt create mode 100644 core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt create mode 100644 core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt delete mode 100644 core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt delete mode 100644 core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt rename core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/{user/VelocityGameUserFactory.kt => VelocityGamePlatformScope.kt} (64%) rename core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/{VelocityGamePlatform.kt => VelocityPlatform.kt} (93%) delete mode 100644 core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt create mode 100644 core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt create mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt create mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/GamePlatformScope.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatformScope.kt rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/{ => system}/Server.kt (67%) create mode 100644 domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommands.kt diff --git a/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt b/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt deleted file mode 100644 index 9274e92c3..000000000 --- a/api/game/src/jvmMain/kotlin/org/anvilpowered/anvil/api/GameApiBindings.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api - -import org.anvilpowered.anvil.domain.command.GameUserCommandScope -import org.anvilpowered.anvil.domain.platform.GamePlatform - -interface GameApiBindings : - ApiBindings, - GamePlatform, - GameUserCommandScope diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt new file mode 100644 index 000000000..cbfd2d22e --- /dev/null +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt @@ -0,0 +1,27 @@ +package org.anvilpowered.anvil.api + +import org.anvilpowered.anvil.domain.platform.Platform +import org.anvilpowered.anvil.domain.platform.PluginManager + +/** + * To create an instance of this interface, use the `AnvilApi.create` function. + * This is available for each platform in the corresponding `anvil-core-game-` module. + * + * Generally, the method will look something like this: + * ```kt + * AnvilApi.create<<>>("my-plugin", ....) + * ``` + * + * For example, for Velocity: + * + * ```kt + * AnvilApi.createVelocity("my-plugin", ....) + * ``` + */ +interface AnvilApi : LoggerScope { + val platform: Platform + + val pluginManager: PluginManager + + companion object +} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt deleted file mode 100644 index 973160f95..000000000 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/ApiBindings.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api - -import org.anvilpowered.anvil.domain.platform.Platform - -interface ApiBindings : - LoggingScope, - Platform { - companion object -} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggingScope.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggerScope.kt similarity index 91% rename from api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggingScope.kt rename to api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggerScope.kt index 5172c983d..6ae145a66 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggingScope.kt +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggerScope.kt @@ -21,11 +21,11 @@ package org.anvilpowered.anvil.api import org.lighthousegames.logging.KmLog import org.lighthousegames.logging.logging -interface LoggingScope { +interface LoggerScope { val logger: KmLog companion object { - fun create(name: String): LoggingScope = object : LoggingScope { + fun create(name: String): LoggerScope = object : LoggerScope { override val logger: KmLog = logging(name) } } diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt index 571a00cdc..777bb5e1c 100644 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt +++ b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt @@ -16,7 +16,7 @@ import mui.material.Toolbar import mui.material.Typography import mui.material.styles.TypographyVariant import mui.system.sx -import org.anvilpowered.anvil.domain.Server +import org.anvilpowered.anvil.domain.system.Server import org.anvilpowered.anvil.ui.component.SearchBox import react.FC import react.Props diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt index 0a9e62ddb..45562dbb7 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt @@ -1,12 +1,12 @@ package org.anvilpowered.anvil.plugin.command +import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.platform.PluginManager import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode object AnvilCommand { - context(PluginManager.Scope) + context(AnvilApi) fun create(): LiteralCommandNode { return ArgumentBuilder.literal("anvil") .then(createPlugins()) diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt index fb960f7fe..a4096aeea 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt @@ -1,19 +1,21 @@ package org.anvilpowered.anvil.plugin.command import net.kyori.adventure.text.format.NamedTextColor +import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.api.user.requiresPermission import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.platform.PluginManager import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess import org.anvilpowered.kbrig.tree.LiteralCommandNode -context(PluginManager.Scope) +context(AnvilApi) fun AnvilCommand.createPlugins(): LiteralCommandNode = ArgumentBuilder.literal("plugins") .requiresPermission("anvil.agent.plugins") .executesSingleSuccess { context -> val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } - context.source.audience.sendMessage(Component.text("Plugins: $pluginNamesString").color(NamedTextColor.AQUA)) + context.source.audience.sendMessage( + Component.text("Plugins: $pluginNamesString").color(NamedTextColor.AQUA), + ) }.build() diff --git a/app/plugin/velocity/build.gradle.kts b/app/plugin/velocity/build.gradle.kts index 0b2242978..cb65bfd68 100644 --- a/app/plugin/velocity/build.gradle.kts +++ b/app/plugin/velocity/build.gradle.kts @@ -1,4 +1,4 @@ - plugins { +plugins { id("kotlin-jvm.base-conventions") kotlin("kapt") } diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt index 2a83db3ec..db02e6fb5 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -19,18 +19,17 @@ package org.anvilpowered.anvil.plugin import com.velocitypowered.api.command.BrigadierCommand -import org.anvilpowered.anvil.VelocityApiBindings +import org.anvilpowered.anvil.AnvilVelocityApi +import org.anvilpowered.anvil.command.toVelocity import org.anvilpowered.anvil.plugin.command.AnvilCommand -context(VelocityApiBindings) +context(AnvilVelocityApi) class AnvilVelocityPlugin { - fun registerCommands() { - logger.info { "Anvil Agent is running!" } - proxyServer.commandManager.register( - BrigadierCommand( - AnvilCommand.create(), - ), - ) + init { + logger.info { "Registering commands..." } + proxyServer.commandManager + .register(BrigadierCommand(AnvilCommand.create().toVelocity())) + logger.info { "Registered commands!" } } } diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index 434d8444e..237c1c4cb 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -23,8 +23,8 @@ import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.VelocityApiBindings -import org.anvilpowered.anvil.plugin.command.AnvilCommand +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.createVelocity import org.slf4j.Logger @Plugin( @@ -34,15 +34,17 @@ import org.slf4j.Logger authors = ["AnvilPowered"], ) class AnvilVelocityPluginBootstrap @Inject constructor( - private val proxyServer: ProxyServer, private val logger: Logger, + private val proxyServer: ProxyServer, ) { - val services = VelocityApiBindings(proxyServer) + private val plugin = with(AnvilApi.createVelocity(logger, proxyServer)) { + AnvilVelocityPlugin() + } @Subscribe fun onProxyInit(event: ProxyInitializeEvent) { logger.info("Anvil Agent is running!") - proxyServer.commandManager.register(BrigadierCommand(AnvilCommand.create())) + proxyServer.eventManager.register(this, plugin) } } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt index 810a12f39..e0796cf7d 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt @@ -38,6 +38,10 @@ internal object GameTypeRepositoryImpl : GameTypeRepository { ?.let { GameType(it.id.value) } } + override suspend fun countAll(): Long = newSuspendedTransaction { + GameTypeEntity.all().count() + } + override suspend fun create(item: GameType.CreateDto): GameType = newSuspendedTransaction { GameTypeEntity.new { name = item.name diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt index 22366229d..79d205dc0 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt @@ -35,6 +35,7 @@ internal object ServerNodeRepositoryImpl : ServerNodeRepository { newSuspendedTransaction { ServerNodeEntity.findById(id) != null } override suspend fun findByGameType(): GameTypeJoin> = GameTypeJoinImpl + override suspend fun countAll(): Long = newSuspendedTransaction { ServerNodeEntity.all().count() } override suspend fun create(item: ServerNode.CreateDto): ServerNode = TODO() override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt index ada7c8f1c..7deaacd59 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt @@ -28,6 +28,8 @@ import org.sourcegrade.kontour.UUID import kotlin.reflect.KClass object DiscordUserRepositoryImpl : DiscordUserRepository { + override suspend fun countAll(): Long = newSuspendedTransaction { DiscordUserEntity.all().count() } + override suspend fun create(item: DiscordUser.CreateDto): DiscordUser = newSuspendedTransaction { DiscordUserEntity.new(item.id) { discordId = item.discordId diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt index 6490ef298..d7f7c53b1 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt @@ -39,6 +39,10 @@ object GameUserRepositoryImpl : GameUserRepository { GameUserEntity.find { GameUserTable.username eq username }.firstOrNull()?.let { GameUser(it.id.value) } } + override suspend fun countAll(): Long = newSuspendedTransaction { + GameUserEntity.all().count() + } + override suspend fun create(item: GameUser.CreateDto): GameUser = newSuspendedTransaction { GameUserEntity.new(item.id) { user = UserEntity[item.userId] diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt index 18198e91a..ea4bc27f4 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt @@ -28,14 +28,20 @@ import org.sourcegrade.kontour.UUID import kotlin.reflect.KClass object UserRepositoryImpl : UserRepository { + override suspend fun findByGameId(id: UUID): User? = newSuspendedTransaction { + // TODO: Does this send two queries to the database? + GameUserEntity.findById(id)?.let { User(it.user.id.value) } + } + override suspend fun findByUsername(username: String): User? = newSuspendedTransaction { UserEntity.find { UserTable.username eq username }.firstOrNull()?.let { User(it.id.value) } } + override suspend fun countAll(): Long = newSuspendedTransaction { UserEntity.all().count() } + override suspend fun create(item: User.CreateDto): User = newSuspendedTransaction { UserEntity.new { username = item.username - email = item.email }.let { User(it.id.value) } } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt index 27a58c45c..1b546c894 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt @@ -27,12 +27,12 @@ import org.sourcegrade.kontour.UUID internal object UserTable : UUIDTable("users") { val username = varchar("username", 255).uniqueIndex() - val email = varchar("email", 255).uniqueIndex() + val email = varchar("email", 255).uniqueIndex().nullable() } internal class UserEntity(id: EntityID) : UUIDEntity(id) { var username: String by UserTable.username - var email: String by UserTable.email + var email: String? by UserTable.email val gameUsers: SizedIterable by GameUserEntity referrersOn GameUserTable.userId companion object : UUIDEntityClass(UserTable) diff --git a/core/game/build.gradle.kts b/core/game/build.gradle.kts index 0fc848acb..219b574a5 100644 --- a/core/game/build.gradle.kts +++ b/core/game/build.gradle.kts @@ -5,5 +5,6 @@ plugins { dependencies { commonMainApi(project(":anvil-core")) + commonMainApi(project(":anvil-core-db")) commonMainApi(project(":anvil-api-game")) } diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt deleted file mode 100644 index 9fd0dee9d..000000000 --- a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeGameUser.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.user - -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import org.sourcegrade.kontour.UUID -import kotlin.jvm.optionals.getOrNull -import org.spongepowered.api.entity.living.player.User as SpongeUser - -fun SpongeUser.toAnvilGameUser(): GameUser = SpongeGameUser(this) - -private class SpongeGameUser( - val spongeUser: SpongeUser, -) : GameUser, - Subject by spongeUser.toAnvilSubject() { - override val id: UUID - get() = spongeUser.uniqueId() - override val username: String - get() = spongeUser.name() - override val player: Player? - get() = spongeUser.player().getOrNull()?.toAnvilPlayer() -} diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt index a408fbf84..d441dd74a 100644 --- a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt @@ -1,33 +1,21 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - package org.anvilpowered.anvil.user +import org.anvilpowered.anvil.db.RepositoryScopeImpl import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.domain.user.Subject -import org.spongepowered.api.entity.living.player.server.ServerPlayer as SpongePlayer +import org.anvilpowered.anvil.domain.user.User +import org.spongepowered.api.entity.living.player.server.ServerPlayer -fun SpongePlayer.toAnvilPlayer(): Player = AnvilSpongePlayer(this) +fun ServerPlayer.toAnvilPlayer(): Player = AnvilSpongePlayer(this) -private class AnvilSpongePlayer( - val spongePlayer: SpongePlayer, +class AnvilSpongePlayer( + val spongePlayer: ServerPlayer, ) : Player, Subject by spongePlayer.toAnvilSubject() { - override val gameUser: GameUser = spongePlayer.user().toAnvilGameUser() + override val gameUser: GameUser + get() = GameUser(spongePlayer.uniqueId()) + + override suspend fun getUserOrNull(): User? = + RepositoryScopeImpl.userRepository.findByGameId(spongePlayer.uniqueId()) } diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt index eed68c01e..48a5142dd 100644 --- a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt @@ -1,21 +1,3 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - package org.anvilpowered.anvil.user import org.anvilpowered.anvil.domain.user.Subject diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt deleted file mode 100644 index 64f679e10..000000000 --- a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserFactory.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.user - -import kotlinx.coroutines.future.asDeferred -import org.anvilpowered.anvil.domain.user.GameUser -import org.sourcegrade.kontour.UUID -import org.spongepowered.api.Sponge - -class SpongeGameUserFactory : GameUserPlatformScopeFactory { - override suspend fun createGameUser(id: UUID): GameUser = - Sponge.server().userManager().loadOrCreate(id).asDeferred().await().toAnvilGameUser() -} diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt new file mode 100644 index 000000000..15cfd0d0d --- /dev/null +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt @@ -0,0 +1,16 @@ +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.Subject +import org.spongepowered.api.Sponge +import kotlin.jvm.optionals.getOrNull + +class SpongeGameUserScope : GameUser.GamePlatformScope { + init { + } + override val GameUser.subject: Subject? + get() = Sponge.server().player(id).getOrNull()?.toAnvilSubject() + override val GameUser.player: Player? + get() = Sponge.server().player(id).getOrNull()?.toAnvilPlayer() +} diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt new file mode 100644 index 000000000..c4e13bf7c --- /dev/null +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt @@ -0,0 +1,21 @@ +package org.anvilpowered.anvil + +import com.velocitypowered.api.proxy.ProxyServer +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.core.Slf4jDelegateLogger +import org.anvilpowered.anvil.platform.VelocityPlatform +import org.anvilpowered.anvil.platform.VelocityPluginManager +import org.slf4j.Logger as VelocityLogger + +interface AnvilVelocityApi : AnvilApi { + val proxyServer: ProxyServer +} + +fun AnvilApi.Companion.createVelocity(logger: VelocityLogger, proxyServer: ProxyServer): AnvilVelocityApi { + return object : AnvilVelocityApi { + override val logger = Slf4jDelegateLogger(logger) + override val platform = VelocityPlatform(proxyServer) + override val pluginManager = VelocityPluginManager(proxyServer.pluginManager) + override val proxyServer: ProxyServer = proxyServer + } +} diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt deleted file mode 100644 index d920b40bd..000000000 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/ProxyServerScope.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.anvilpowered.anvil - -import com.velocitypowered.api.proxy.ProxyServer - -interface ProxyServerScope { - val proxyServer: ProxyServer -} diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt deleted file mode 100644 index 71b75c2fd..000000000 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityApiBindings.kt +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil - -import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.api.ApiBindings -import org.anvilpowered.anvil.api.GameApiBindings -import org.anvilpowered.anvil.api.LoggingScope -import org.anvilpowered.anvil.command.CommonGameUserCommandScope -import org.anvilpowered.anvil.domain.command.GameUserCommandScope -import org.anvilpowered.anvil.domain.platform.GamePlatform -import org.anvilpowered.anvil.domain.platform.PluginManager -import org.anvilpowered.anvil.platform.VelocityGamePlatform -import org.anvilpowered.anvil.platform.VelocityPluginManager - -fun ApiBindings.Companion.createVelocity(proxyServer: ProxyServer): GameApiBindings { - val gameUserScope = CommonGameUserScope() - - class VelocityApiBindings(val proxyServer: ProxyServer) : - GameApiBindings, - GamePlatform by VelocityGamePlatform(proxyServer), - LoggingScope by LoggingScope.create("anvil-velocity"), - PluginManager.Scope by VelocityPluginManager.createScope(proxyServer.pluginManager), - GameUserCommandScope by (with(gameUserScope) { CommonGameUserCommandScope() }) - - return VelocityApiBindings(proxyServer) -} diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt similarity index 64% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt index 1ac26577d..a600bbbd3 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserFactory.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt @@ -16,11 +16,17 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil +import com.velocitypowered.api.proxy.ProxyServer +import org.anvilpowered.anvil.domain.GamePlatformScope import org.anvilpowered.anvil.domain.user.GameUser -import org.sourcegrade.kontour.UUID +import org.anvilpowered.anvil.user.VelocityGameUserScope -class VelocityGameUserFactory : GameUserPlatformScopeFactory { - override suspend fun createGameUser(id: UUID): GameUser = GameUser(id) +fun GamePlatformScope.Companion.createVelocity(proxyServer: ProxyServer): GamePlatformScope { + class Velocity(val proxyServer: ProxyServer) : + GamePlatformScope, + GameUser.GamePlatformScope by VelocityGameUserScope(proxyServer) + + return Velocity(proxyServer) } diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt index c57ca5bac..db71f4d2d 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt @@ -2,7 +2,7 @@ package org.anvilpowered.anvil.command import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.ProxyServerScope +import org.anvilpowered.anvil.AnvilVelocityApi import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.command.PlayerCommandScope import org.anvilpowered.anvil.domain.user.Player @@ -14,7 +14,7 @@ import org.anvilpowered.kbrig.context.CommandContext import org.anvilpowered.kbrig.context.get import kotlin.jvm.optionals.getOrNull -context(ProxyServerScope) +context(AnvilVelocityApi) class VelocityCustomCommand : PlayerCommandScope { override fun ArgumentBuilder.Companion.player( diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt index 9ce4824b7..1ebe55dcb 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt @@ -21,7 +21,7 @@ package org.anvilpowered.anvil.command import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.user.toAnvil +import org.anvilpowered.anvil.user.toAnvilCommandSource import org.anvilpowered.kbrig.brigadier.toBrigadier import org.anvilpowered.kbrig.tree.ArgumentCommandNode import org.anvilpowered.kbrig.tree.LiteralCommandNode @@ -34,10 +34,10 @@ import com.velocitypowered.api.command.CommandSource as VelocityCommandSource * Converts a kbrig argument command node to a velocity brigadier argument command node. */ fun ArgumentCommandNode.toVelocity(): BrigadierArgumentCommandNode = - mapSource { it.toAnvil() }.toBrigadier() + mapSource { it.toAnvilCommandSource() }.toBrigadier() /** * Converts a kbrig literal command node to a velocity brigadier literal command node. */ fun LiteralCommandNode.toVelocity(): BrigadierLiteralCommandNode1 = - mapSource { it.toAnvil() }.toBrigadier() + mapSource { it.toAnvilCommandSource() }.toBrigadier() diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt similarity index 93% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt index a9a500772..26bd42e00 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityGamePlatform.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt @@ -22,7 +22,7 @@ import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.domain.platform.GamePlatform import org.anvilpowered.anvil.domain.platform.Plugin -internal class VelocityGamePlatform(private val proxyServer: ProxyServer) : GamePlatform { +internal class VelocityPlatform(private val proxyServer: ProxyServer) : GamePlatform { override val name: String = "velocity" override val platformVersion: String = proxyServer.version.version override val isProxy: Boolean = true diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt index e87b8ac03..3d2011124 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt @@ -25,10 +25,4 @@ import com.velocitypowered.api.plugin.PluginManager as BackingPluginManager internal class VelocityPluginManager(private val backing: BackingPluginManager) : PluginManager { override val plugins: List get() = backing.plugins.map { VelocityPlugin(it) } - - companion object { - fun createScope(backing: BackingPluginManager) = object : PluginManager.Scope { - override val pluginManager: PluginManager = VelocityPluginManager(backing) - } - } } diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt index c9649e988..2170b58f3 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt @@ -27,7 +27,7 @@ import org.anvilpowered.anvil.domain.user.User import com.velocitypowered.api.command.CommandSource as VelocityCommandSource import com.velocitypowered.api.proxy.Player as VelocityPlayer -fun VelocityCommandSource.toAnvil(): CommandSource = AnvilVelocityCommandSource(this) +fun VelocityCommandSource.toAnvilCommandSource(): CommandSource = AnvilVelocityCommandSource(this) private class AnvilVelocityCommandSource( velocityCommandSource: VelocityCommandSource, @@ -35,6 +35,7 @@ private class AnvilVelocityCommandSource( override val audience: Audience = velocityCommandSource override val subject: Subject = velocityCommandSource.toAnvilSubject() override val player: Player? = (velocityCommandSource as? VelocityPlayer)?.toAnvilPlayer() - override val user: User? = player?.user override val gameUser: GameUser? = player?.gameUser + + override suspend fun getUserOrNull(): User? = player?.getUserOrNull() } diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt deleted file mode 100644 index e00bfa86c..000000000 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityGameUser.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.user - -import org.anvilpowered.anvil.domain.user.Player -import org.sourcegrade.kontour.UUID - -/** - * Velocity does not have an offline player concept, so we must handle it ourselves. - */ -internal class AnvilVelocityGameUser( - val id: UUID, -) { - val username: String - get() = TODO("Not yet implemented") - val player: Player? - get() = TODO("Not yet implemented") - - fun hasPermission(permission: String): Boolean? { - TODO("Not yet implemented") - } -} diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt index e5442c5dc..7174b7f36 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt @@ -1,5 +1,6 @@ package org.anvilpowered.anvil.user +import org.anvilpowered.anvil.db.RepositoryScopeImpl import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player @@ -15,6 +16,8 @@ private class AnvilVelocityPlayer( Audience by velocityPlayer, Subject by velocityPlayer.toAnvilSubject() { - override val user: User = User(velocityPlayer.uniqueId) override val gameUser: GameUser = GameUser(velocityPlayer.uniqueId) + + override suspend fun getUserOrNull(): User? = + RepositoryScopeImpl.userRepository.findByGameId(velocityPlayer.uniqueId) } diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt new file mode 100644 index 000000000..a8140fbb5 --- /dev/null +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt @@ -0,0 +1,14 @@ +package org.anvilpowered.anvil.user + +import com.velocitypowered.api.proxy.ProxyServer +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.Subject +import kotlin.jvm.optionals.getOrNull + +class VelocityGameUserScope(private val proxyServer: ProxyServer) : GameUser.GamePlatformScope { + override val GameUser.subject: Subject? + get() = proxyServer.getPlayer(id).getOrNull()?.toAnvilSubject() + override val GameUser.player: Player? + get() = proxyServer.getPlayer(id).getOrNull()?.toAnvilPlayer() +} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt deleted file mode 100644 index ed032013f..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/command/CommonGameUserCommandScope.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.command - -import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.domain.RepositoryScope -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.command.GameUserCommandScope -import org.anvilpowered.anvil.domain.user.Component -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.kbrig.argument.StringArgumentType -import org.anvilpowered.kbrig.builder.ArgumentBuilder -import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder -import org.anvilpowered.kbrig.builder.executesSuspending -import org.anvilpowered.kbrig.context.CommandContext -import org.anvilpowered.kbrig.context.get - -context(RepositoryScope) -class CommonGameUserCommandScope : GameUserCommandScope { - override fun ArgumentBuilder.Companion.gameUser( - name: String, - command: suspend (context: CommandContext, gameUser: GameUser) -> Int, - ): RequiredArgumentBuilder = - required(name, StringArgumentType.SingleWord) - .suggests { _, builder -> - gameUserRepository.getAllUserNames(startWith = builder.input).forEach { name -> builder.suggest(name) } - builder.build() - } - .executesSuspending { context -> - val gameUserName = context.get(name) - gameUserRepository.findByUsername(gameUserName)?.let { gameUser -> - command(context, gameUser) - } ?: run { - context.source.audience.sendMessage( - Component.text() - .append(Component.text("GameUser with name ", NamedTextColor.RED)) - .append(Component.text(gameUserName, NamedTextColor.GOLD)) - .append(Component.text(" not found!", NamedTextColor.RED)), - ) - 0 - } - } -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt new file mode 100644 index 000000000..44161ff6c --- /dev/null +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt @@ -0,0 +1,42 @@ +package org.anvilpowered.anvil.core + +import org.lighthousegames.logging.KmLog +import org.slf4j.Logger + +class Slf4jDelegateLogger( + private val delegate: Logger, +) : KmLog(delegate.name) { + + override fun verbose(tag: String, msg: String) { + super.verbose(tag, msg) + delegate.trace(msg) + } + + override fun debug(tag: String, msg: String) { + super.debug(tag, msg) + delegate.debug(msg) + } + + override fun info(tag: String, msg: String) { + super.info(tag, msg) + delegate.info(msg) + } + + override fun warn(tag: String, msg: String, t: Throwable?) { + super.warn(tag, msg, t) + if (t != null) { + delegate.warn(msg, t) + } else { + delegate.warn(msg) + } + } + + override fun error(tag: String, msg: String, t: Throwable?) { + super.error(tag, msg, t) + if (t != null) { + delegate.error(msg, t) + } else { + delegate.error(msg) + } + } +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt deleted file mode 100644 index 37b9c103e..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Anvil.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.domain - -interface Anvil diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/GamePlatformScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/GamePlatformScope.kt new file mode 100644 index 000000000..961e4bde7 --- /dev/null +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/GamePlatformScope.kt @@ -0,0 +1,10 @@ +package org.anvilpowered.anvil.domain + +import org.anvilpowered.anvil.domain.user.GameUser + +/** + * The union of all scopes a platform should provide. + */ +interface GamePlatformScope : GameUser.GamePlatformScope { + companion object +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt index 761aeb5e4..e38c37a0d 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt @@ -28,4 +28,5 @@ interface RepositoryScope { val gameUserRepository: GameUserRepository val userRepository: UserRepository val serverNodeRepository: ServerNodeRepository + companion object } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt index dd549aba3..3a0a97105 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt @@ -5,13 +5,14 @@ import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.domain.user.Subject import org.anvilpowered.anvil.domain.user.User +import org.anvilpowered.anvil.domain.user.UserFacet -interface CommandSource { +interface CommandSource : UserFacet { /** * The [User] associated with the executed command, if any. */ - val user: User? + override suspend fun getUserOrNull(): User? val audience: Audience diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatformScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatformScope.kt deleted file mode 100644 index c832618c8..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatformScope.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.domain.platform - -import org.anvilpowered.anvil.domain.user.GameUser - -/** - * The union of all scopes a platform should provide. - */ -interface GamePlatformScope : GameUser.GamePlatformScope diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt index 30d507fdc..f5f9dbdc5 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt @@ -20,8 +20,4 @@ package org.anvilpowered.anvil.domain.platform interface PluginManager { val plugins: List - - interface Scope { - val pluginManager: PluginManager - } } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Server.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/Server.kt similarity index 67% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Server.kt rename to domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/Server.kt index 444ed8112..9315b2754 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/Server.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/Server.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.domain +package org.anvilpowered.anvil.domain.system interface Server { val id: String diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt index cac60fbe2..2b7055607 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt @@ -18,9 +18,9 @@ data class GameUser(override val id: UUID) : DomainEntity { val username: String, ) : Creates - interface GamePlatformScope { + interface GamePlatformScope { // TODO: Maybe just GameScope? - val GameUser.subject: Subject + val GameUser.subject: Subject? val GameUser.player: Player? } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt index 24e758d09..2b142f805 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt @@ -13,7 +13,6 @@ data class User(override val id: UUID) : DomainEntity { data class CreateDto( val username: String, - val email: String, ) : Creates /** diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt index c6d39773c..11772c792 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt @@ -20,5 +20,7 @@ package org.anvilpowered.anvil.domain.user interface UserFacet { - val user: User + suspend fun getUserOrNull(): User? + + suspend fun getUser(): User = getUserOrNull() ?: throw IllegalStateException("User not found") } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt index bdecb95c6..dedf81753 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt @@ -19,7 +19,9 @@ package org.anvilpowered.anvil.domain.user import org.sourcegrade.kontour.Repository +import org.sourcegrade.kontour.UUID interface UserRepository : Repository { + suspend fun findByGameId(id: UUID): User? suspend fun findByUsername(username: String): User? } diff --git a/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommands.kt b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommands.kt new file mode 100644 index 000000000..a0fedb8e4 --- /dev/null +++ b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommands.kt @@ -0,0 +1,37 @@ +package org.anvilpowered.anvil.domain.command + +import net.kyori.adventure.text.format.NamedTextColor +import org.anvilpowered.anvil.domain.RepositoryScope +import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.kbrig.argument.StringArgumentType +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder +import org.anvilpowered.kbrig.builder.executesSuspending +import org.anvilpowered.kbrig.context.CommandContext +import org.anvilpowered.kbrig.context.get + +context(RepositoryScope) +fun ArgumentBuilder.Companion.gameUser( + name: String, + command: suspend (context: CommandContext, gameUser: GameUser) -> Int, +): RequiredArgumentBuilder = + required(name, StringArgumentType.SingleWord) + .suggests { _, builder -> + gameUserRepository.getAllUserNames(startWith = builder.input).forEach { name -> builder.suggest(name) } + builder.build() + } + .executesSuspending { context -> + val gameUserName = context.get(name) + gameUserRepository.findByUsername(gameUserName)?.let { gameUser -> + command(context, gameUser) + } ?: run { + context.source.audience.sendMessage( + Component.text() + .append(Component.text("GameUser with name ", NamedTextColor.RED)) + .append(Component.text(gameUserName, NamedTextColor.GOLD)) + .append(Component.text(" not found!", NamedTextColor.RED)), + ) + 0 + } + } From 57273040a4e5958136fb2e0ca1c7c7d7bef8f30f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 15 Jul 2023 12:51:52 +0200 Subject: [PATCH 28/77] Clean up some AnvilApi stuff --- app/plugin/build.gradle.kts | 8 +++ .../anvilpowered/anvil/plugin/AnvilPlugin.kt | 6 ++ .../anvil/plugin/AnvilVelocityPlugin.kt | 4 +- .../plugin/AnvilVelocityPluginBootstrap.kt | 3 +- .../anvilpowered/anvil/AnvilVelocityApi.kt | 56 +++++++++++++++++++ gradle.properties | 1 + gradle/wrapper/gradle-wrapper.properties | 2 +- 7 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt create mode 100644 gradle.properties diff --git a/app/plugin/build.gradle.kts b/app/plugin/build.gradle.kts index f624da0f7..2d2326ea2 100644 --- a/app/plugin/build.gradle.kts +++ b/app/plugin/build.gradle.kts @@ -1,3 +1,5 @@ +@file:Suppress("UnstableApiUsage") + plugins { id("kotlin-jvm.base-conventions") alias(libs.plugins.shadow) @@ -7,3 +9,9 @@ dependencies { commonMainImplementation(project(":anvil-app-plugin-sponge")) commonMainImplementation(project(":anvil-app-plugin-velocity")) } + +tasks { + shadowJar { + archiveFileName = "anvil-agent-${project.version}.jar" + } +} diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt new file mode 100644 index 000000000..792c87f09 --- /dev/null +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt @@ -0,0 +1,6 @@ +package org.anvilpowered.anvil.plugin + +interface AnvilPlugin { + + fun registerCommands() +} diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt index db02e6fb5..10e9d02a2 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -24,9 +24,9 @@ import org.anvilpowered.anvil.command.toVelocity import org.anvilpowered.anvil.plugin.command.AnvilCommand context(AnvilVelocityApi) -class AnvilVelocityPlugin { +class AnvilVelocityPlugin : AnvilPlugin { - init { + override fun registerCommands() { logger.info { "Registering commands..." } proxyServer.commandManager .register(BrigadierCommand(AnvilCommand.create().toVelocity())) diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index 237c1c4cb..1619bbf17 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -38,7 +38,7 @@ class AnvilVelocityPluginBootstrap @Inject constructor( private val proxyServer: ProxyServer, ) { - private val plugin = with(AnvilApi.createVelocity(logger, proxyServer)) { + private val plugin: AnvilPlugin = with(AnvilApi.createVelocity(logger, proxyServer)) { AnvilVelocityPlugin() } @@ -46,5 +46,6 @@ class AnvilVelocityPluginBootstrap @Inject constructor( fun onProxyInit(event: ProxyInitializeEvent) { logger.info("Anvil Agent is running!") proxyServer.eventManager.register(this, plugin) + plugin.registerCommands() } } diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt index c4e13bf7c..6d2dc12a5 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt @@ -7,10 +7,66 @@ import org.anvilpowered.anvil.platform.VelocityPlatform import org.anvilpowered.anvil.platform.VelocityPluginManager import org.slf4j.Logger as VelocityLogger +/** + * A subtype of [AnvilApi] that also provides access to Velocity-specific APIs such as [ProxyServer]. + * + * To create an instance of this interface, use [AnvilApi.Companion.createVelocity]. + * + * If you are using Java, the method [AnvilVelocityApi.doNotUse] is provided as an alternative. + */ interface AnvilVelocityApi : AnvilApi { val proxyServer: ProxyServer + + companion object { + /** + * Creates an Anvil API instance for Velocity. + * + * This method is meant as an alternative to [AnvilApi.Companion.createVelocity] for Java users. + * + * In Kotlin, you should use [AnvilApi.Companion.createVelocity] instead. + */ + @JvmStatic + @JvmName("create") + fun doNotUse(logger: VelocityLogger, proxyServer: ProxyServer): AnvilVelocityApi = + AnvilApi.createVelocity(logger, proxyServer) + } } +/** + * Creates an Anvil API instance for Velocity. + * + * The returned API instance can be used to access the Anvil API. + * It is intended to be used as a context receiver. + * + * For example, you can access it in a class like this: + * ```kt + * context(AnvilVelocityApi) // or AnvilApi if in common code + * class MyPlugin { + * fun foo() { + * logger.info { "Hello, world!" } // logger property of [AnvilApi] is accessed through context receiver + * } + * } + * ``` + * + * In order to invoke this constructor, you must have an instance of [AnvilVelocityApi] in the calling context. + * To bring an instance of [AnvilVelocityApi] into the calling context, you can use the [with] function: + * + * ```kt + * private val plugin = with(AnvilApi.createVelocity(logger, proxyServer)) { + * AnvilVelocityPlugin() + * } + * ``` + * + * Context receivers may also be used on individual functions. + * This is particularly useful for top-level functions: + * + * ```kt + * context(AnvilVelocityApi) // or AnvilApi if in common code + * fun foo() { + * logger.info { "Hello, world!" } // logger property of [AnvilApi] is accessed through context receiver + * } + * ``` + */ fun AnvilApi.Companion.createVelocity(logger: VelocityLogger, proxyServer: ProxyServer): AnvilVelocityApi { return object : AnvilVelocityApi { override val logger = Slf4jDelegateLogger(logger) diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..bfac9db08 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +systemProp.org.gradle.unsafe.kotlin.assignment=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d3f..17a8ddce2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 4bd9cc29609cd43cddcee87687a69085b78cdc8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 15 Jul 2023 14:04:40 +0200 Subject: [PATCH 29/77] Get some commands working --- api/game/build.gradle.kts | 9 --- app/plugin/core/build.gradle.kts | 2 +- .../anvil/plugin/PluginMessages.kt | 10 ++++ .../anvil/plugin/command/AnvilCommand.kt | 19 ++++-- .../anvil/plugin/command/common/Help.kt | 60 +++++++++++++++++++ .../anvil/plugin/command/plugin/Info.kt | 40 +++++++++++++ .../List.kt} | 8 +-- .../plugin/command/plugin/PluginCommand.kt | 28 +++++++++ core/game/build.gradle.kts | 2 +- settings.gradle.kts | 1 - 10 files changed, 158 insertions(+), 21 deletions(-) delete mode 100644 api/game/build.gradle.kts create mode 100644 app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt create mode 100644 app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt create mode 100644 app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt rename app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/{AnvilPluginsCommand.kt => plugin/List.kt} (71%) create mode 100644 app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt diff --git a/api/game/build.gradle.kts b/api/game/build.gradle.kts deleted file mode 100644 index 2adff502f..000000000 --- a/api/game/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") - id("anvil-publish") -} - -dependencies { - commonMainApi(project(":anvil-api")) - commonMainRuntimeOnly(project(":anvil-core-game")) -} diff --git a/app/plugin/core/build.gradle.kts b/app/plugin/core/build.gradle.kts index 4ebad4448..c33322193 100644 --- a/app/plugin/core/build.gradle.kts +++ b/app/plugin/core/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } dependencies { - commonMainApi(project(":anvil-api-game")) + commonMainApi(project(":anvil-api")) jvmMainApi(platform(libs.adventure.bom)) jvmMainApi("net.kyori:adventure-api") // TODO: -> compileOnlyApi ASAP // compileOnlyApi(libs.logging.api) diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt new file mode 100644 index 000000000..2bb92fac7 --- /dev/null +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt @@ -0,0 +1,10 @@ +package org.anvilpowered.anvil.plugin + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor + +object PluginMessages { + val pluginPrefix = Component.text("[Anvil Agent] ").color(NamedTextColor.GOLD) + val notEnoughArgs = Component.text("Not enough arguments!").color(NamedTextColor.RED) + val noPermission = Component.text("Insufficient Permissions!").color(NamedTextColor.RED) +} diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt index 45562dbb7..d86ec7338 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt @@ -2,14 +2,25 @@ package org.anvilpowered.anvil.plugin.command import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.plugin.command.common.addHelpChild +import org.anvilpowered.anvil.plugin.command.common.executesUsage +import org.anvilpowered.anvil.plugin.command.plugin.PluginCommand import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode +private val children = mapOf( + "help" to Component.text("Shows this help message"), + "plugin" to Component.text("Plugin management"), + "version" to Component.text("Shows the Anvil Agent version"), +) + object AnvilCommand { context(AnvilApi) - fun create(): LiteralCommandNode { - return ArgumentBuilder.literal("anvil") - .then(createPlugins()) + fun create(): LiteralCommandNode = + ArgumentBuilder.literal("anvil") + .addHelpChild("anvil", children) + .executesUsage("anvil", children.keys) + .then(PluginCommand.create()) .build() - } } diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt new file mode 100644 index 000000000..ea384157d --- /dev/null +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt @@ -0,0 +1,60 @@ +package org.anvilpowered.anvil.plugin.command.common + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.plugin.PluginMessages +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.executesSingleSuccess + +// TODO: Idea: Automatically detect usage from command node tree + +fun > B.executesUsage(usage: String): B = + executes { + it.source.audience.sendMessage( + Component.text() + .append(PluginMessages.pluginPrefix) + .append(Component.text("Command usage: ", NamedTextColor.GOLD)) + .append(Component.text("/$usage", NamedTextColor.AQUA)), + ) + 0 + } + +fun > B.executesUsage(baseName: String, children: Iterable): B = + executes { context -> + context.source.audience.sendMessage( + Component.text() + .append(PluginMessages.pluginPrefix) + .append(Component.text("Command usage: ", NamedTextColor.GOLD)) + .append(Component.text("/$baseName", NamedTextColor.GREEN)) + .append(Component.space()) + .append(Component.text("${children.joinToString("|")} ...", NamedTextColor.GREEN)) + .append(Component.newline()) + .append(Component.text("For more information see ", NamedTextColor.AQUA)) + .append(Component.text("/$baseName help", NamedTextColor.GREEN)), + ) + 0 + } + +fun > B.addHelpChild(baseName: String, children: Map): B = then( + ArgumentBuilder.literal("help").executesSingleSuccess { context -> + context.source.audience.sendMessage( + Component.text() + .append(PluginMessages.pluginPrefix) + .append(Component.text("Command usage: ", NamedTextColor.GOLD)) + .append(Component.text("/$baseName", NamedTextColor.GREEN)) + .append(Component.newline()) + .append(Component.text("Children:", NamedTextColor.AQUA)) + .append(Component.newline()) + .append( + children.map { (command, description) -> + Component.text() + .append(Component.text(" /$baseName ", NamedTextColor.DARK_GRAY)) + .append(Component.text(command, NamedTextColor.GREEN)) + .append(Component.space()) + .append(description.color(NamedTextColor.GRAY)) + }, + ), + ) + }, +) diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt new file mode 100644 index 000000000..b9aabcae8 --- /dev/null +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt @@ -0,0 +1,40 @@ +package org.anvilpowered.anvil.plugin.command.plugin + +import net.kyori.adventure.text.format.NamedTextColor +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.plugin.command.common.executesUsage +import org.anvilpowered.kbrig.Command +import org.anvilpowered.kbrig.argument.StringArgumentType +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.context.get +import org.anvilpowered.kbrig.tree.LiteralCommandNode + +context(AnvilApi) +fun PluginCommand.createInfo(): LiteralCommandNode = + ArgumentBuilder.literal("info") + .executesUsage("anvil plugin info ") + .then( + ArgumentBuilder.required("name", StringArgumentType.SingleWord) + .executes { context -> + val name = context.get("name") + val plugin = pluginManager.plugins.find { it.name == name } + if (plugin == null) { + context.source.audience.sendMessage( + Component.text() + .append(Component.text("Plugin not found: ").color(NamedTextColor.RED)) + .append(Component.text(name).color(NamedTextColor.WHITE)), + ) + 0 + } else { + context.source.audience.sendMessage( + Component.text() + .append(Component.text("Plugin: ").color(NamedTextColor.AQUA)) + .append(Component.text(plugin.name).color(NamedTextColor.WHITE)), + ) + Command.SINGLE_SUCCESS + } + } + .build(), + ).build() diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt similarity index 71% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt rename to app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt index a4096aeea..a472955bf 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilPluginsCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt @@ -1,8 +1,7 @@ -package org.anvilpowered.anvil.plugin.command +package org.anvilpowered.anvil.plugin.command.plugin import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.api.user.requiresPermission import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.kbrig.builder.ArgumentBuilder @@ -10,9 +9,8 @@ import org.anvilpowered.kbrig.builder.executesSingleSuccess import org.anvilpowered.kbrig.tree.LiteralCommandNode context(AnvilApi) -fun AnvilCommand.createPlugins(): LiteralCommandNode = - ArgumentBuilder.literal("plugins") - .requiresPermission("anvil.agent.plugins") +fun PluginCommand.createList(): LiteralCommandNode = + ArgumentBuilder.literal("list") .executesSingleSuccess { context -> val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } context.source.audience.sendMessage( diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt new file mode 100644 index 000000000..199eab441 --- /dev/null +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt @@ -0,0 +1,28 @@ +package org.anvilpowered.anvil.plugin.command.plugin + +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.api.user.requiresPermission +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.plugin.command.common.addHelpChild +import org.anvilpowered.anvil.plugin.command.common.executesUsage +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.tree.LiteralCommandNode + +private val children = mapOf( + "help" to Component.text("Shows this help message"), + "list" to Component.text("Lists all plugins"), + "info " to Component.text("Shows information about a plugin"), +) + +object PluginCommand { + context(AnvilApi) + fun create(): LiteralCommandNode = + ArgumentBuilder.literal("plugin") + .addHelpChild("anvil plugin", children) + .requiresPermission("anvil.agent.plugin") + .executesUsage("anvil plugin", children.keys) + .then(createList()) + .then(createInfo()) + .build() +} diff --git a/core/game/build.gradle.kts b/core/game/build.gradle.kts index 219b574a5..724171187 100644 --- a/core/game/build.gradle.kts +++ b/core/game/build.gradle.kts @@ -6,5 +6,5 @@ plugins { dependencies { commonMainApi(project(":anvil-core")) commonMainApi(project(":anvil-core-db")) - commonMainApi(project(":anvil-api-game")) + commonMainApi(project(":anvil-api")) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 535391889..49905bc74 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,7 +24,6 @@ rootProject.name = "anvil" sequenceOf( "api", - "api-game", "api-web", "app-plugin", "app-plugin-core", From 22f3df0671d234a228effa83d54ac70080826f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 15 Jul 2023 16:05:54 +0200 Subject: [PATCH 30/77] Start working on paper and sponge implementation --- .../org/anvilpowered/anvil/api/AnvilApi.kt | 3 +- .../anvilpowered/anvil/plugin/AnvilPlugin.kt | 4 +- .../anvil/plugin/command/AnvilCommand.kt | 6 +- .../anvil/plugin/command/common/Help.kt | 50 ++++++++-------- .../command/gameuser/GameUserCommand.kt | 23 ++++++++ .../anvil/plugin/command/gameuser/Info.kt | 20 +++++++ .../plugin/command/plugin/PluginCommand.kt | 6 +- app/plugin/paper/build.gradle.kts | 11 ++++ .../anvil/plugin/AnvilPaperPlugin.kt | 11 ++++ .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 12 ++++ app/plugin/sponge/build.gradle.kts | 1 + .../anvil/plugin/AnvilSpongePlugin.kt | 18 ++---- .../plugin/AnvilSpongePluginBootstrap.kt | 18 ++++++ .../anvil/plugin/AnvilVelocityPlugin.kt | 4 +- .../plugin/AnvilVelocityPluginBootstrap.kt | 2 +- core/game/paper/build.gradle.kts | 10 ++++ .../org/anvilpowered/anvil/AnvilPaperApi.kt | 19 ++++++ .../anvil/platform/PaperPlatform.kt | 15 +++++ .../anvil/platform/PaperPlugin.kt | 11 ++++ .../anvil/platform/PaperPluginManager.kt | 10 ++++ .../org/anvilpowered/anvil/AnvilSpongeApi.kt | 58 +++++++++++++++++++ .../anvil/platform/SpongePlatform.kt | 16 +++++ .../anvil/platform/SpongePlugin.kt | 11 ++++ .../anvil/platform/SpongePluginManager.kt | 10 ++++ .../anvilpowered/anvil/AnvilVelocityApi.kt | 4 +- .../anvil/platform/VelocityPlatform.kt | 4 +- .../anvil/platform/VelocityPlugin.kt | 4 +- .../anvil/core/JULDelegateLogger.kt | 42 ++++++++++++++ .../anvil/core/Slf4jDelegateLogger.kt | 12 ++-- gradle/libs.versions.toml | 2 + settings.gradle.kts | 2 + 31 files changed, 356 insertions(+), 63 deletions(-) create mode 100644 app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt create mode 100644 app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt create mode 100644 app/plugin/paper/build.gradle.kts create mode 100644 app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt create mode 100644 app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt create mode 100644 app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt create mode 100644 core/game/paper/build.gradle.kts create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt create mode 100644 core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt create mode 100644 core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt create mode 100644 core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt create mode 100644 core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt create mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/JULDelegateLogger.kt diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt index cbfd2d22e..a023fd0eb 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt @@ -1,5 +1,6 @@ package org.anvilpowered.anvil.api +import org.anvilpowered.anvil.domain.RepositoryScope import org.anvilpowered.anvil.domain.platform.Platform import org.anvilpowered.anvil.domain.platform.PluginManager @@ -18,7 +19,7 @@ import org.anvilpowered.anvil.domain.platform.PluginManager * AnvilApi.createVelocity("my-plugin", ....) * ``` */ -interface AnvilApi : LoggerScope { +interface AnvilApi : LoggerScope, RepositoryScope { val platform: Platform val pluginManager: PluginManager diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt index 792c87f09..09f4384b8 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt @@ -1,6 +1,6 @@ package org.anvilpowered.anvil.plugin -interface AnvilPlugin { +abstract class AnvilPlugin { - fun registerCommands() +// abstract fun registerCommands() } diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt index d86ec7338..7863498d5 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt @@ -3,8 +3,7 @@ package org.anvilpowered.anvil.plugin.command import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Component -import org.anvilpowered.anvil.plugin.command.common.addHelpChild -import org.anvilpowered.anvil.plugin.command.common.executesUsage +import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.anvil.plugin.command.plugin.PluginCommand import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode @@ -19,8 +18,7 @@ object AnvilCommand { context(AnvilApi) fun create(): LiteralCommandNode = ArgumentBuilder.literal("anvil") - .addHelpChild("anvil", children) - .executesUsage("anvil", children.keys) + .addHelp("anvil", children) .then(PluginCommand.create()) .build() } diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt index ea384157d..945da57ef 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt @@ -20,7 +20,7 @@ fun > B.executesUsage(usage: String): B = 0 } -fun > B.executesUsage(baseName: String, children: Iterable): B = +fun > B.addHelp(baseName: String, children: Map): B = executes { context -> context.source.audience.sendMessage( Component.text() @@ -28,33 +28,31 @@ fun > B.executesUsage(baseName: String, ch .append(Component.text("Command usage: ", NamedTextColor.GOLD)) .append(Component.text("/$baseName", NamedTextColor.GREEN)) .append(Component.space()) - .append(Component.text("${children.joinToString("|")} ...", NamedTextColor.GREEN)) + .append(Component.text("${children.keys.joinToString("|")} ...", NamedTextColor.GREEN)) .append(Component.newline()) .append(Component.text("For more information see ", NamedTextColor.AQUA)) .append(Component.text("/$baseName help", NamedTextColor.GREEN)), ) 0 - } - -fun > B.addHelpChild(baseName: String, children: Map): B = then( - ArgumentBuilder.literal("help").executesSingleSuccess { context -> - context.source.audience.sendMessage( - Component.text() - .append(PluginMessages.pluginPrefix) - .append(Component.text("Command usage: ", NamedTextColor.GOLD)) - .append(Component.text("/$baseName", NamedTextColor.GREEN)) - .append(Component.newline()) - .append(Component.text("Children:", NamedTextColor.AQUA)) - .append(Component.newline()) - .append( - children.map { (command, description) -> - Component.text() - .append(Component.text(" /$baseName ", NamedTextColor.DARK_GRAY)) - .append(Component.text(command, NamedTextColor.GREEN)) - .append(Component.space()) - .append(description.color(NamedTextColor.GRAY)) - }, - ), - ) - }, -) + }.then( + ArgumentBuilder.literal("help").executesSingleSuccess { context -> + context.source.audience.sendMessage( + Component.text() + .append(PluginMessages.pluginPrefix) + .append(Component.text("Command usage: ", NamedTextColor.GOLD)) + .append(Component.text("/$baseName", NamedTextColor.GREEN)) + .append(Component.newline()) + .append(Component.text("Children:", NamedTextColor.AQUA)) + .append(Component.newline()) + .append( + children.map { (command, description) -> + Component.text() + .append(Component.text(" /$baseName ", NamedTextColor.DARK_GRAY)) + .append(Component.text(command, NamedTextColor.GREEN)) + .append(Component.space()) + .append(description.color(NamedTextColor.GRAY)) + }, + ), + ) + }, + ) diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt new file mode 100644 index 000000000..8e19dfa0f --- /dev/null +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt @@ -0,0 +1,23 @@ +package org.anvilpowered.anvil.plugin.command.gameuser + +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.api.user.requiresPermission +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.plugin.command.common.addHelp +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.tree.LiteralCommandNode + +private val children = mapOf( + "help" to Component.text("Shows this help message"), + "info" to Component.text("Shows information about a game user"), +) + +object GameUserCommand { + context(AnvilApi) + fun create(): LiteralCommandNode = + ArgumentBuilder.literal("gameuser") + .addHelp("anvil gameuser", children) + .requiresPermission("anvil.agent.gameuser") + .build() +} diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt new file mode 100644 index 000000000..5a87443c1 --- /dev/null +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt @@ -0,0 +1,20 @@ +package org.anvilpowered.anvil.plugin.command.gameuser + +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.plugin.command.common.addHelp +import org.anvilpowered.anvil.plugin.command.common.executesUsage +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.tree.LiteralCommandNode + +private val children = mapOf( + "help" to Component.text("Shows this help message"), + "info" to Component.text("Shows information about a game user"), +) + +context(AnvilApi) +fun GameUserCommand.createInfo(): LiteralCommandNode = + ArgumentBuilder.literal("info") + .executesUsage("anvil gameuser info ") + .build() diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt index 199eab441..47d8df4cc 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt @@ -4,8 +4,7 @@ import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.api.user.requiresPermission import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Component -import org.anvilpowered.anvil.plugin.command.common.addHelpChild -import org.anvilpowered.anvil.plugin.command.common.executesUsage +import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode @@ -19,9 +18,8 @@ object PluginCommand { context(AnvilApi) fun create(): LiteralCommandNode = ArgumentBuilder.literal("plugin") - .addHelpChild("anvil plugin", children) + .addHelp("anvil plugin", children) .requiresPermission("anvil.agent.plugin") - .executesUsage("anvil plugin", children.keys) .then(createList()) .then(createInfo()) .build() diff --git a/app/plugin/paper/build.gradle.kts b/app/plugin/paper/build.gradle.kts new file mode 100644 index 000000000..56ebcaaad --- /dev/null +++ b/app/plugin/paper/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("kotlin-jvm.base-conventions") + alias(libs.plugins.shadow) +} + +dependencies { + commonMainImplementation(project(":anvil-app-plugin-core")) + commonMainImplementation(project(":anvil-core-game-paper")) + jvmMainCompileOnly(libs.brigadier) + jvmMainCompileOnly(libs.paper) +} diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt new file mode 100644 index 000000000..3a8c575dd --- /dev/null +++ b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt @@ -0,0 +1,11 @@ +package org.anvilpowered.anvil.plugin + +import org.anvilpowered.anvil.AnvilPaperApi +import org.bukkit.Bukkit +import org.bukkit.plugin.PluginBase +import org.bukkit.plugin.java.JavaPlugin + +context(AnvilPaperApi) +class AnvilPaperPlugin : AnvilPlugin() { + +} diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt new file mode 100644 index 000000000..33c2b01ab --- /dev/null +++ b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -0,0 +1,12 @@ +@file:Suppress("UnstableApiUsage") + +package org.anvilpowered.anvil.plugin + +import io.papermc.paper.plugin.bootstrap.BootstrapContext +import io.papermc.paper.plugin.bootstrap.PluginBootstrap + +class AnvilPaperPluginBootstrap : PluginBootstrap{ + override fun bootstrap(context: BootstrapContext) { + TODO("Not yet implemented") + } +} diff --git a/app/plugin/sponge/build.gradle.kts b/app/plugin/sponge/build.gradle.kts index 269690c48..028f10d73 100644 --- a/app/plugin/sponge/build.gradle.kts +++ b/app/plugin/sponge/build.gradle.kts @@ -15,6 +15,7 @@ repositories { dependencies { commonMainImplementation(project(":anvil-app-plugin-core")) commonMainImplementation(project(":anvil-core-game-sponge")) + jvmMainCompileOnly(libs.brigadier) } sponge { diff --git a/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt b/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt index 5d88e0bba..02b417356 100644 --- a/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt +++ b/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt @@ -1,18 +1,12 @@ package org.anvilpowered.anvil.plugin -import com.google.inject.Inject -import org.apache.logging.log4j.Logger -import org.spongepowered.api.event.Listener -import org.spongepowered.api.event.lifecycle.ConstructPluginEvent -import org.spongepowered.plugin.builtin.jvm.Plugin +import com.mojang.brigadier.tree.LiteralCommandNode +import org.anvilpowered.anvil.AnvilSpongeApi +import org.spongepowered.api.event.lifecycle.RegisterCommandEvent -@Plugin("anvil-agent") -class AnvilSpongePlugin @Inject constructor( - private val logger: Logger, -) { +context(AnvilSpongeApi) +class AnvilSpongePlugin : AnvilPlugin() { + fun registerCommands(event: RegisterCommandEvent>) { - @Listener - fun onServerStart(event: ConstructPluginEvent) { - logger.warn("Hello, world! ${event.plugin()}") } } diff --git a/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt b/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt new file mode 100644 index 000000000..2a64c9659 --- /dev/null +++ b/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt @@ -0,0 +1,18 @@ +package org.anvilpowered.anvil.plugin + +import com.google.inject.Inject +import org.apache.logging.log4j.Logger +import org.spongepowered.api.event.Listener +import org.spongepowered.api.event.lifecycle.ConstructPluginEvent +import org.spongepowered.plugin.builtin.jvm.Plugin + +@Plugin("anvil-agent") +class AnvilSpongePluginBootstrap @Inject constructor( + private val logger: Logger, +) { + + @Listener + fun onServerStart(event: ConstructPluginEvent) { + logger.warn("Hello, world! ${event.plugin()}") + } +} diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt index 10e9d02a2..f8c604f0a 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -24,9 +24,9 @@ import org.anvilpowered.anvil.command.toVelocity import org.anvilpowered.anvil.plugin.command.AnvilCommand context(AnvilVelocityApi) -class AnvilVelocityPlugin : AnvilPlugin { +class AnvilVelocityPlugin : AnvilPlugin() { - override fun registerCommands() { + fun registerCommands() { logger.info { "Registering commands..." } proxyServer.commandManager .register(BrigadierCommand(AnvilCommand.create().toVelocity())) diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index 1619bbf17..46c10b627 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -38,7 +38,7 @@ class AnvilVelocityPluginBootstrap @Inject constructor( private val proxyServer: ProxyServer, ) { - private val plugin: AnvilPlugin = with(AnvilApi.createVelocity(logger, proxyServer)) { + private val plugin = with(AnvilApi.createVelocity(logger, proxyServer)) { AnvilVelocityPlugin() } diff --git a/core/game/paper/build.gradle.kts b/core/game/paper/build.gradle.kts new file mode 100644 index 000000000..9a63c0897 --- /dev/null +++ b/core/game/paper/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + id("kotlin-jvm.base-conventions") + id("anvil-publish") +} + +dependencies { + commonMainImplementation(project(":anvil-core-game")) + commonMainImplementation(libs.kbrig.brigadier) + jvmMainCompileOnly(libs.paper) +} diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt new file mode 100644 index 000000000..1017591a7 --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt @@ -0,0 +1,19 @@ +package org.anvilpowered.anvil + +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.core.JULDelegateLogger +import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.domain.RepositoryScope +import org.anvilpowered.anvil.platform.PaperPlatform +import org.anvilpowered.anvil.platform.PaperPluginManager +import org.bukkit.Bukkit + +interface AnvilPaperApi : AnvilApi + +fun AnvilApi.Companion.createPaper(): AnvilPaperApi { + return object : AnvilPaperApi, RepositoryScope by RepositoryScopeImpl { + override val logger = JULDelegateLogger(Bukkit.getLogger()) + override val platform = PaperPlatform + override val pluginManager = PaperPluginManager + } +} diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt new file mode 100644 index 000000000..ec8ecc3b5 --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt @@ -0,0 +1,15 @@ +package org.anvilpowered.anvil.platform + +import org.anvilpowered.anvil.domain.platform.GamePlatform +import org.anvilpowered.anvil.domain.platform.Plugin +import org.bukkit.Bukkit + +internal object PaperPlatform : GamePlatform { + override val isProxy: Boolean = false + override val plugins: List + get() = Bukkit.getPluginManager().plugins.map { it.toAnvilPlugin() } + override val name: String + get() = "paper" + override val platformVersion: String + get() = Bukkit.getBukkitVersion() +} diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt new file mode 100644 index 000000000..4087bf5c6 --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt @@ -0,0 +1,11 @@ +package org.anvilpowered.anvil.platform + +import org.anvilpowered.anvil.domain.platform.Plugin +import org.bukkit.plugin.Plugin as BukkitPlugin + +internal fun BukkitPlugin.toAnvilPlugin() = PaperPlugin(this) + +class PaperPlugin(private val delegate: BukkitPlugin) : Plugin { + override val name: String + get() = delegate.name +} diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt new file mode 100644 index 000000000..e25c43dd4 --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt @@ -0,0 +1,10 @@ +package org.anvilpowered.anvil.platform + +import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.domain.platform.PluginManager +import org.bukkit.Bukkit + +internal object PaperPluginManager : PluginManager { + override val plugins: List + get() = Bukkit.getPluginManager().plugins.map { it.toAnvilPlugin() } +} diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt new file mode 100644 index 000000000..cb5ce9b4e --- /dev/null +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt @@ -0,0 +1,58 @@ +package org.anvilpowered.anvil + +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.core.Slf4jDelegateLogger +import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.domain.RepositoryScope +import org.anvilpowered.anvil.platform.SpongePlatform +import org.anvilpowered.anvil.platform.SpongePluginManager +import org.slf4j.Logger + +interface AnvilSpongeApi : AnvilApi { + + companion object +} + + +/** + * Creates an Anvil API instance for Sponge. + * + * The returned API instance can be used to access the Anvil API. + * It is intended to be used as a context receiver. + * + * For example, you can access it in a class like this: + * ```kt + * context(AnvilSpongeApi) // or AnvilApi if in common code + * class MyPlugin { + * fun foo() { + * logger.info { "Hello, world!" } // logger property of [AnvilApi] is accessed through context receiver + * } + * } + * ``` + * + * In order to invoke this constructor, you must have an instance of [AnvilSpongeApi] in the calling context. + * To bring an instance of [AnvilSpongeApi] into the calling context, you can use the [with] function: + * + * ```kt + * private val plugin = with(AnvilApi.createSponge(logger, proxyServer)) { + * AnvilSpongePlugin() + * } + * ``` + * + * Context receivers may also be used on individual functions. + * This is particularly useful for top-level functions: + * + * ```kt + * context(AnvilSpongeApi) // or AnvilApi if in common code + * fun foo() { + * logger.info { "Hello, world!" } // logger property of [AnvilApi] is accessed through context receiver + * } + * ``` + */ +fun AnvilApi.Companion.createSponge(logger: Logger): AnvilSpongeApi { + return object : AnvilSpongeApi, RepositoryScope by RepositoryScopeImpl { + override val logger = Slf4jDelegateLogger(logger) + override val platform = SpongePlatform + override val pluginManager = SpongePluginManager + } +} diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt new file mode 100644 index 000000000..67531cdd4 --- /dev/null +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt @@ -0,0 +1,16 @@ +package org.anvilpowered.anvil.platform + +import org.anvilpowered.anvil.domain.platform.GamePlatform +import org.anvilpowered.anvil.domain.platform.Plugin +import org.spongepowered.api.Platform +import org.spongepowered.api.Sponge + +internal object SpongePlatform : GamePlatform { + override val isProxy: Boolean = false + override val plugins: List + get() = Sponge.pluginManager().plugins().map { it.toAnvilPlugin() } + override val name: String + get() = "sponge" + override val platformVersion: String + get() = Sponge.platform().container(Platform.Component.IMPLEMENTATION).metadata().version().qualifier +} diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt new file mode 100644 index 000000000..d2948c9e1 --- /dev/null +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt @@ -0,0 +1,11 @@ +package org.anvilpowered.anvil.platform + +import org.anvilpowered.anvil.domain.platform.Plugin +import org.spongepowered.plugin.PluginContainer + +internal fun PluginContainer.toAnvilPlugin() = SpongePlugin(this) + +internal class SpongePlugin(private val container: PluginContainer) : Plugin { + override val name: String + get() = container.metadata().id() +} diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt new file mode 100644 index 000000000..92a6af9e1 --- /dev/null +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt @@ -0,0 +1,10 @@ +package org.anvilpowered.anvil.platform + +import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.domain.platform.PluginManager +import org.spongepowered.api.Sponge + +internal object SpongePluginManager : PluginManager { + override val plugins: List + get() = Sponge.pluginManager().plugins().map { it.toAnvilPlugin() } +} diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt index 6d2dc12a5..1c8713077 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt @@ -3,6 +3,8 @@ package org.anvilpowered.anvil import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.core.Slf4jDelegateLogger +import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.domain.RepositoryScope import org.anvilpowered.anvil.platform.VelocityPlatform import org.anvilpowered.anvil.platform.VelocityPluginManager import org.slf4j.Logger as VelocityLogger @@ -68,7 +70,7 @@ interface AnvilVelocityApi : AnvilApi { * ``` */ fun AnvilApi.Companion.createVelocity(logger: VelocityLogger, proxyServer: ProxyServer): AnvilVelocityApi { - return object : AnvilVelocityApi { + return object : AnvilVelocityApi, RepositoryScope by RepositoryScopeImpl { override val logger = Slf4jDelegateLogger(logger) override val platform = VelocityPlatform(proxyServer) override val pluginManager = VelocityPluginManager(proxyServer.pluginManager) diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt index 26bd42e00..93c345b99 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt @@ -23,9 +23,9 @@ import org.anvilpowered.anvil.domain.platform.GamePlatform import org.anvilpowered.anvil.domain.platform.Plugin internal class VelocityPlatform(private val proxyServer: ProxyServer) : GamePlatform { - override val name: String = "velocity" - override val platformVersion: String = proxyServer.version.version override val isProxy: Boolean = true override val plugins: List get() = proxyServer.pluginManager.plugins.map { it.toAnvilPlugin() } + override val name: String = "velocity" + override val platformVersion: String = proxyServer.version.version } diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt index e5fca8c85..c82351225 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt @@ -21,9 +21,9 @@ package org.anvilpowered.anvil.platform import com.velocitypowered.api.plugin.PluginContainer import org.anvilpowered.anvil.domain.platform.Plugin +internal fun PluginContainer.toAnvilPlugin() = VelocityPlugin(this) + internal class VelocityPlugin(private val container: PluginContainer) : Plugin { override val name: String get() = container.description.id } - -internal fun PluginContainer.toAnvilPlugin() = VelocityPlugin(this) diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/JULDelegateLogger.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/JULDelegateLogger.kt new file mode 100644 index 000000000..c36390c2a --- /dev/null +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/JULDelegateLogger.kt @@ -0,0 +1,42 @@ +package org.anvilpowered.anvil.core + +import org.lighthousegames.logging.KmLog +import java.util.logging.Level +import java.util.logging.Logger + +class JULDelegateLogger( + private val delegate: Logger, +) : KmLog(delegate.name) { + override fun verbose(tag: String, msg: String) { + super.verbose(tag, msg) + delegate.log(Level.FINEST, msg) + } + + override fun debug(tag: String, msg: String) { + super.debug(tag, msg) + delegate.log(Level.FINE, msg) + } + + override fun info(tag: String, msg: String) { + super.info(tag, msg) + delegate.log(Level.INFO, msg) + } + + override fun warn(tag: String, msg: String, t: Throwable?) { + super.warn(tag, msg, t) + if (t == null) { + delegate.log(Level.WARNING, msg) + } else { + delegate.log(Level.WARNING, msg, t) + } + } + + override fun error(tag: String, msg: String, t: Throwable?) { + super.error(tag, msg, t) + if (t == null) { + delegate.log(Level.SEVERE, msg) + } else { + delegate.log(Level.SEVERE, msg, t) + } + } +} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt index 44161ff6c..d6c625de4 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt @@ -24,19 +24,19 @@ class Slf4jDelegateLogger( override fun warn(tag: String, msg: String, t: Throwable?) { super.warn(tag, msg, t) - if (t != null) { - delegate.warn(msg, t) - } else { + if (t == null) { delegate.warn(msg) + } else { + delegate.warn(msg, t) } } override fun error(tag: String, msg: String, t: Throwable?) { super.error(tag, msg, t) - if (t != null) { - delegate.error(msg, t) - } else { + if (t == null) { delegate.error(msg) + } else { + delegate.error(msg, t) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 32b470590..169403bf0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ log4j = "2.20.0" [libraries] adventure-bom = "net.kyori:adventure-bom:4.13.1" annotations = "org.jetbrains:annotations:24.0.0" +brigadier = "com.mojang:brigadier:1.0.18" exposed-bom = "org.jetbrains.exposed:exposed-bom:0.41.1" exposed-core = { module = "org.jetbrains.exposed:exposed-core" } exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } @@ -32,6 +33,7 @@ ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", versio logging = "org.lighthousegames:logging:1.3.0" log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } +paper = "io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT" redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.6.1" sponge = "org.spongepowered:spongeapi:8.1.0" velocity = "com.velocitypowered:velocity-api:3.2.0-SNAPSHOT" diff --git a/settings.gradle.kts b/settings.gradle.kts index 49905bc74..5f8bd94f8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,6 +27,7 @@ sequenceOf( "api-web", "app-plugin", "app-plugin-core", + "app-plugin-paper", "app-plugin-sponge", "app-plugin-velocity", "app-cockpit", @@ -39,6 +40,7 @@ sequenceOf( "core", "core-db", "core-game", + "core-game-paper", "core-game-sponge", "core-game-velocity", ).forEach { From 7679be56d43b2694322e57cd899c1baffb321796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 16 Jul 2023 12:50:48 +0200 Subject: [PATCH 31/77] AAAaa --- app/plugin/build.gradle.kts | 1 + .../anvilpowered/anvil/plugin/AnvilPlugin.kt | 12 +++++- app/plugin/paper/build.gradle.kts | 8 ++++ .../anvil/plugin/AnvilPaperPlugin.kt | 14 ++++-- .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 16 ++++--- .../anvil/plugin/AnvilVelocityPlugin.kt | 8 ++-- .../anvil/db/user/UserRepositoryImpl.kt | 2 +- .../anvil/command/AnvilPaperCommandSource.kt | 31 +++++++++++++ .../anvil/command/PaperCustomCommand.kt | 43 +++++++++++++++++++ .../anvil/command/PaperSourceConverter.kt | 43 +++++++++++++++++++ .../anvil/user/AnvilPaperPlayer.kt | 22 ++++++++++ .../anvil/user/AnvilPaperSubject.kt | 13 ++++++ .../anvil/user/AnvilSpongePlayer.kt | 7 ++- .../anvil/user/SpongeGameUserScope.kt | 2 - .../AnvilVelocityCommandSource.kt | 4 +- .../anvil/command/VelocitySourceConverter.kt | 1 - .../anvil/user/AnvilVelocityPlayer.kt | 2 +- .../anvil/domain/user/UserRepository.kt | 2 +- gradle/libs.versions.toml | 1 + 19 files changed, 206 insertions(+), 26 deletions(-) create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt create mode 100644 core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt rename core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/{user => command}/AnvilVelocityCommandSource.kt (92%) diff --git a/app/plugin/build.gradle.kts b/app/plugin/build.gradle.kts index 2d2326ea2..f0bc6ddd1 100644 --- a/app/plugin/build.gradle.kts +++ b/app/plugin/build.gradle.kts @@ -6,6 +6,7 @@ plugins { } dependencies { + commonMainImplementation(project(":anvil-app-plugin-paper")) commonMainImplementation(project(":anvil-app-plugin-sponge")) commonMainImplementation(project(":anvil-app-plugin-velocity")) } diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt index 09f4384b8..e03ba5bcb 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt @@ -1,6 +1,16 @@ package org.anvilpowered.anvil.plugin +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.plugin.command.AnvilCommand +import org.anvilpowered.kbrig.tree.LiteralCommandNode + +context(AnvilApi) abstract class AnvilPlugin { -// abstract fun registerCommands() + fun registerCommands(registrationCallback: (LiteralCommandNode) -> Unit) { + logger.info { "Registering commands..." } + registrationCallback(AnvilCommand.create()) + logger.info { "Registered commands!" } + } } diff --git a/app/plugin/paper/build.gradle.kts b/app/plugin/paper/build.gradle.kts index 56ebcaaad..fa0995684 100644 --- a/app/plugin/paper/build.gradle.kts +++ b/app/plugin/paper/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("kotlin-jvm.base-conventions") alias(libs.plugins.shadow) + alias(libs.plugins.pluginyml) } dependencies { @@ -9,3 +10,10 @@ dependencies { jvmMainCompileOnly(libs.brigadier) jvmMainCompileOnly(libs.paper) } + +paper { + main = "org.anvilpowered.anvil.plugin.AnvilPaperPluginBootstrap" + foliaSupported = true + apiVersion = "1.19" + authors = rootProject.file("authors").readLines().map { it.substringBefore(',') } +} diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt index 3a8c575dd..4389fe60e 100644 --- a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt +++ b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt @@ -1,11 +1,17 @@ package org.anvilpowered.anvil.plugin +import io.papermc.paper.command.brigadier.CommandBuilder import org.anvilpowered.anvil.AnvilPaperApi -import org.bukkit.Bukkit -import org.bukkit.plugin.PluginBase -import org.bukkit.plugin.java.JavaPlugin +import org.anvilpowered.anvil.command.toPaper +import org.bukkit.plugin.Plugin context(AnvilPaperApi) class AnvilPaperPlugin : AnvilPlugin() { - + fun registerCommands(bootstrap: Plugin) { + registerCommands { command -> + CommandBuilder.newCommandBuilder(bootstrap, "test") + .forward(command.toPaper(), null, false) + .register() + } + } } diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt index 33c2b01ab..c364d9ff4 100644 --- a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt +++ b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -2,11 +2,17 @@ package org.anvilpowered.anvil.plugin -import io.papermc.paper.plugin.bootstrap.BootstrapContext -import io.papermc.paper.plugin.bootstrap.PluginBootstrap +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.createPaper +import org.bukkit.plugin.java.JavaPlugin -class AnvilPaperPluginBootstrap : PluginBootstrap{ - override fun bootstrap(context: BootstrapContext) { - TODO("Not yet implemented") +class AnvilPaperPluginBootstrap : JavaPlugin() { + + private val plugin = with(AnvilApi.createPaper()) { + AnvilPaperPlugin() + } + + override fun onLoad() { + plugin.registerCommands(this) } } diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt index f8c604f0a..5da5cf4b7 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -21,15 +21,13 @@ package org.anvilpowered.anvil.plugin import com.velocitypowered.api.command.BrigadierCommand import org.anvilpowered.anvil.AnvilVelocityApi import org.anvilpowered.anvil.command.toVelocity -import org.anvilpowered.anvil.plugin.command.AnvilCommand context(AnvilVelocityApi) class AnvilVelocityPlugin : AnvilPlugin() { fun registerCommands() { - logger.info { "Registering commands..." } - proxyServer.commandManager - .register(BrigadierCommand(AnvilCommand.create().toVelocity())) - logger.info { "Registered commands!" } + registerCommands { command -> + proxyServer.commandManager.register(BrigadierCommand(command.toVelocity())) + } } } diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt index ea4bc27f4..4a29ef14d 100644 --- a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt +++ b/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt @@ -28,7 +28,7 @@ import org.sourcegrade.kontour.UUID import kotlin.reflect.KClass object UserRepositoryImpl : UserRepository { - override suspend fun findByGameId(id: UUID): User? = newSuspendedTransaction { + override suspend fun findByGameUserId(id: UUID): User? = newSuspendedTransaction { // TODO: Does this send two queries to the database? GameUserEntity.findById(id)?.let { User(it.user.id.value) } } diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt new file mode 100644 index 000000000..a0ae942ad --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt @@ -0,0 +1,31 @@ +package org.anvilpowered.anvil.command + +import io.papermc.paper.command.brigadier.CommandSourceStack +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.user.Audience +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.Subject +import org.anvilpowered.anvil.domain.user.User +import org.anvilpowered.anvil.user.toAnvilPlayer +import org.anvilpowered.anvil.user.toAnvilSubject +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player as PaperPlayer + +fun CommandSender.toAnvilCommandSource(): CommandSource = AnvilPaperCommandSource(this) + +@Suppress("UnstableApiUsage") +fun CommandSourceStack.toAnvilCommandSource(): CommandSource = AnvilPaperCommandSource(sender) + +private class AnvilPaperCommandSource( + paperCommandSource: CommandSender, +) : CommandSource { + override val audience: Audience = paperCommandSource + override val subject: Subject = paperCommandSource.toAnvilSubject() + override val player: Player? = (paperCommandSource as? PaperPlayer)?.toAnvilPlayer() + override val gameUser: GameUser? = player?.gameUser + + override suspend fun getUserOrNull(): User? { + TODO("Not yet implemented") + } +} diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt new file mode 100644 index 000000000..6f0bedba8 --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt @@ -0,0 +1,43 @@ +package org.anvilpowered.anvil.command + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.anvilpowered.anvil.AnvilPaperApi +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.domain.command.PlayerCommandScope +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.user.toAnvilPlayer +import org.anvilpowered.kbrig.argument.StringArgumentType +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder +import org.anvilpowered.kbrig.context.CommandContext +import org.anvilpowered.kbrig.context.get +import org.bukkit.Bukkit + +context(AnvilPaperApi) +class PaperCustomCommand : PlayerCommandScope { + + override fun ArgumentBuilder.Companion.player( + name: String, + command: (context: CommandContext, player: Player) -> Int, + ): RequiredArgumentBuilder = + required(name, StringArgumentType.SingleWord) + .suggests { _, builder -> + Bukkit.getOnlinePlayers().forEach { player -> builder.suggest(player.name) } + builder.build() + } + .executes { context -> + val playerName = context.get(name) + Bukkit.getPlayer(playerName)?.let { paperPlayer -> + command(context, paperPlayer.toAnvilPlayer()) + } ?: run { + context.source.audience.sendMessage( + Component.text() + .append(Component.text("Player with name ", NamedTextColor.RED)) + .append(Component.text(playerName, NamedTextColor.GOLD)) + .append(Component.text(" not found!", NamedTextColor.RED)), + ) + 0 + } + } +} diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt new file mode 100644 index 000000000..d49e70509 --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt @@ -0,0 +1,43 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +@file:JvmName("PaperSourceConverter") +@file:Suppress("UnstableApiUsage") + +package org.anvilpowered.anvil.command + +import io.papermc.paper.command.brigadier.CommandSourceStack +import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.kbrig.brigadier.toBrigadier +import org.anvilpowered.kbrig.tree.ArgumentCommandNode +import org.anvilpowered.kbrig.tree.LiteralCommandNode +import org.anvilpowered.kbrig.tree.mapSource +import com.mojang.brigadier.tree.ArgumentCommandNode as BrigadierArgumentCommandNode +import com.mojang.brigadier.tree.LiteralCommandNode as BrigadierLiteralCommandNode1 + +/** + * Converts a kbrig argument command node to a velocity brigadier argument command node. + */ +fun ArgumentCommandNode.toPaper(): BrigadierArgumentCommandNode = + mapSource { it.toAnvilCommandSource() }.toBrigadier() + +/** + * Converts a kbrig literal command node to a velocity brigadier literal command node. + */ +fun LiteralCommandNode.toPaper(): BrigadierLiteralCommandNode1 = + mapSource { it.toAnvilCommandSource() }.toBrigadier() diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt new file mode 100644 index 000000000..aac5ab2df --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt @@ -0,0 +1,22 @@ +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.domain.user.Audience +import org.anvilpowered.anvil.domain.user.GameUser +import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.domain.user.Subject +import org.anvilpowered.anvil.domain.user.User +import org.bukkit.entity.Player as PaperPlayer + +fun PaperPlayer.toAnvilPlayer(): Player = AnvilPaperPlayer(this) + +private class AnvilPaperPlayer( + val paperPlayer: PaperPlayer, +) : Player, + Audience by paperPlayer, + Subject by paperPlayer.toAnvilSubject() { + override val gameUser: GameUser = GameUser(paperPlayer.uniqueId) + + override suspend fun getUserOrNull(): User? = + RepositoryScopeImpl.userRepository.findByGameUserId(paperPlayer.uniqueId) +} diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt new file mode 100644 index 000000000..82c6addc2 --- /dev/null +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt @@ -0,0 +1,13 @@ +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.domain.user.Subject +import org.bukkit.permissions.Permissible + +fun Permissible.toAnvilSubject(): Subject = AnvilPaperSubject(this) + +private class AnvilPaperSubject( + private val paperSubject: Permissible, +) : Subject { + override fun hasPermission(permission: String): Boolean? = + paperSubject.permissionValue(permission).toBoolean() +} diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt index d441dd74a..f7d2100dd 100644 --- a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt @@ -9,13 +9,12 @@ import org.spongepowered.api.entity.living.player.server.ServerPlayer fun ServerPlayer.toAnvilPlayer(): Player = AnvilSpongePlayer(this) -class AnvilSpongePlayer( +private class AnvilSpongePlayer( val spongePlayer: ServerPlayer, ) : Player, Subject by spongePlayer.toAnvilSubject() { - override val gameUser: GameUser - get() = GameUser(spongePlayer.uniqueId()) + override val gameUser: GameUser = GameUser(spongePlayer.uniqueId()) override suspend fun getUserOrNull(): User? = - RepositoryScopeImpl.userRepository.findByGameId(spongePlayer.uniqueId()) + RepositoryScopeImpl.userRepository.findByGameUserId(spongePlayer.uniqueId()) } diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt index 15cfd0d0d..18bde391b 100644 --- a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt +++ b/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt @@ -7,8 +7,6 @@ import org.spongepowered.api.Sponge import kotlin.jvm.optionals.getOrNull class SpongeGameUserScope : GameUser.GamePlatformScope { - init { - } override val GameUser.subject: Subject? get() = Sponge.server().player(id).getOrNull()?.toAnvilSubject() override val GameUser.player: Player? diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt similarity index 92% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt rename to core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt index 2170b58f3..607404b5b 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityCommandSource.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.command import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Audience @@ -24,6 +24,8 @@ import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.domain.user.Subject import org.anvilpowered.anvil.domain.user.User +import org.anvilpowered.anvil.user.toAnvilPlayer +import org.anvilpowered.anvil.user.toAnvilSubject import com.velocitypowered.api.command.CommandSource as VelocityCommandSource import com.velocitypowered.api.proxy.Player as VelocityPlayer diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt index 1ebe55dcb..7a26ed643 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt @@ -21,7 +21,6 @@ package org.anvilpowered.anvil.command import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.user.toAnvilCommandSource import org.anvilpowered.kbrig.brigadier.toBrigadier import org.anvilpowered.kbrig.tree.ArgumentCommandNode import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt index 7174b7f36..e3b3a71ce 100644 --- a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt +++ b/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt @@ -19,5 +19,5 @@ private class AnvilVelocityPlayer( override val gameUser: GameUser = GameUser(velocityPlayer.uniqueId) override suspend fun getUserOrNull(): User? = - RepositoryScopeImpl.userRepository.findByGameId(velocityPlayer.uniqueId) + RepositoryScopeImpl.userRepository.findByGameUserId(velocityPlayer.uniqueId) } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt index dedf81753..c5d5f5e72 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt @@ -22,6 +22,6 @@ import org.sourcegrade.kontour.Repository import org.sourcegrade.kontour.UUID interface UserRepository : Repository { - suspend fun findByGameId(id: UUID): User? + suspend fun findByGameUserId(id: UUID): User? suspend fun findByUsername(username: String): User? } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 169403bf0..24abff4d2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -48,6 +48,7 @@ kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ktlint = "org.jlleitschuh.gradle.ktlint:11.3.1" +pluginyml = "net.minecrell.plugin-yml.paper:0.6.0" shadow = "com.github.johnrengelman.shadow:8.1.0" sponge = "org.spongepowered.gradle.plugin:2.1.1" ktor = { id = "io.ktor.plugin", version.ref = "ktor" } From 9385df2021a672e05efd3f590b4821c14265ab5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Mon, 17 Jul 2023 18:36:52 +0200 Subject: [PATCH 32/77] Get commands working on paper --- .../anvil/plugin/command/common/Help.kt | 20 +++++++++++-------- app/plugin/paper/build.gradle.kts | 1 + .../anvil/plugin/AnvilPaperPlugin.kt | 12 +++++------ .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 16 ++++++++++++--- .../anvil/command/PaperSourceConverter.kt | 19 ++++++++++++++++++ .../anvil/user/AnvilPaperSubject.kt | 12 +++++++++-- 6 files changed, 61 insertions(+), 19 deletions(-) diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt index 945da57ef..5ef2d920e 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt +++ b/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt @@ -1,6 +1,7 @@ package org.anvilpowered.anvil.plugin.command.common import net.kyori.adventure.text.Component +import net.kyori.adventure.text.JoinConfiguration import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.plugin.PluginMessages @@ -42,16 +43,19 @@ fun > B.addHelp(baseName: String, children .append(Component.text("Command usage: ", NamedTextColor.GOLD)) .append(Component.text("/$baseName", NamedTextColor.GREEN)) .append(Component.newline()) - .append(Component.text("Children:", NamedTextColor.AQUA)) + .append(Component.text("Subcommands:", NamedTextColor.AQUA)) .append(Component.newline()) .append( - children.map { (command, description) -> - Component.text() - .append(Component.text(" /$baseName ", NamedTextColor.DARK_GRAY)) - .append(Component.text(command, NamedTextColor.GREEN)) - .append(Component.space()) - .append(description.color(NamedTextColor.GRAY)) - }, + Component.join( + JoinConfiguration.newlines(), + children.map { (command, description) -> + Component.text() + .append(Component.text(" /$baseName ", NamedTextColor.DARK_GRAY)) + .append(Component.text(command, NamedTextColor.GREEN)) + .append(Component.space()) + .append(description.color(NamedTextColor.GRAY)) + }, + ), ), ) }, diff --git a/app/plugin/paper/build.gradle.kts b/app/plugin/paper/build.gradle.kts index fa0995684..f602f705a 100644 --- a/app/plugin/paper/build.gradle.kts +++ b/app/plugin/paper/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { } paper { + name = "anvil-agent" main = "org.anvilpowered.anvil.plugin.AnvilPaperPluginBootstrap" foliaSupported = true apiVersion = "1.19" diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt index 4389fe60e..d61e29c6b 100644 --- a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt +++ b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt @@ -1,17 +1,17 @@ +@file:Suppress("UnstableApiUsage") + package org.anvilpowered.anvil.plugin -import io.papermc.paper.command.brigadier.CommandBuilder +import io.papermc.paper.event.server.ServerResourcesLoadEvent import org.anvilpowered.anvil.AnvilPaperApi -import org.anvilpowered.anvil.command.toPaper +import org.anvilpowered.anvil.command.toPaperRoot import org.bukkit.plugin.Plugin context(AnvilPaperApi) class AnvilPaperPlugin : AnvilPlugin() { - fun registerCommands(bootstrap: Plugin) { + fun registerCommands(bootstrap: Plugin, event: ServerResourcesLoadEvent) { registerCommands { command -> - CommandBuilder.newCommandBuilder(bootstrap, "test") - .forward(command.toPaper(), null, false) - .register() + event.commands.register(command.toPaperRoot(bootstrap)) } } } diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt index c364d9ff4..3abbb4d0b 100644 --- a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt +++ b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -2,17 +2,27 @@ package org.anvilpowered.anvil.plugin +import io.papermc.paper.event.server.ServerResourcesLoadEvent import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.createPaper +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin -class AnvilPaperPluginBootstrap : JavaPlugin() { +class AnvilPaperPluginBootstrap : JavaPlugin(), Listener { private val plugin = with(AnvilApi.createPaper()) { AnvilPaperPlugin() } - override fun onLoad() { - plugin.registerCommands(this) + override fun onEnable() { + logger.info { "Registering events" } + server.pluginManager.registerEvents(this, this) + } + + @EventHandler + fun load(event: ServerResourcesLoadEvent) { + logger.info { "Load event" } + plugin.registerCommands(this, event) } } diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt index d49e70509..c7a4103ba 100644 --- a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt @@ -21,12 +21,14 @@ package org.anvilpowered.anvil.command +import io.papermc.paper.command.brigadier.CommandBuilder import io.papermc.paper.command.brigadier.CommandSourceStack import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.kbrig.brigadier.toBrigadier import org.anvilpowered.kbrig.tree.ArgumentCommandNode import org.anvilpowered.kbrig.tree.LiteralCommandNode import org.anvilpowered.kbrig.tree.mapSource +import org.bukkit.plugin.Plugin import com.mojang.brigadier.tree.ArgumentCommandNode as BrigadierArgumentCommandNode import com.mojang.brigadier.tree.LiteralCommandNode as BrigadierLiteralCommandNode1 @@ -41,3 +43,20 @@ fun ArgumentCommandNode.toPaper(): BrigadierArgumentComman */ fun LiteralCommandNode.toPaper(): BrigadierLiteralCommandNode1 = mapSource { it.toAnvilCommandSource() }.toBrigadier() + +/** + * Paper requires some extra steps for command registration. + * + * Unfortunately, it is not possible to directly register a brigadier type. + * It is necessary to register Paper's custom [CommandBuilder]. + * + * This method effectively clones the target command node into a newly created [CommandBuilder]. + */ +fun LiteralCommandNode.toPaperRoot(plugin: Plugin): CommandBuilder { + val delegate = toPaper() + val builder = CommandBuilder.newCommandBuilder(plugin, delegate.literal) + delegate.children.forEach { builder.then(it) } + builder.requires(delegate.requirement) + builder.executes(delegate.command) + return builder +} diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt index 82c6addc2..59656d19b 100644 --- a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt @@ -8,6 +8,14 @@ fun Permissible.toAnvilSubject(): Subject = AnvilPaperSubject(this) private class AnvilPaperSubject( private val paperSubject: Permissible, ) : Subject { - override fun hasPermission(permission: String): Boolean? = - paperSubject.permissionValue(permission).toBoolean() + override fun hasPermission(permission: String): Boolean? { + return if (paperSubject.hasPermission(permission)) { + true + } else if (paperSubject.isPermissionSet(permission)) { + false + } else { + null + } + } + } From 484bd3539d31eb9da7bb28403829b9dd637108a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Mon, 17 Jul 2023 19:46:13 +0200 Subject: [PATCH 33/77] fix copy paste error --- .../org/anvilpowered/anvil/command/PaperSourceConverter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt index c7a4103ba..8dc77aab3 100644 --- a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt @@ -33,13 +33,13 @@ import com.mojang.brigadier.tree.ArgumentCommandNode as BrigadierArgumentCommand import com.mojang.brigadier.tree.LiteralCommandNode as BrigadierLiteralCommandNode1 /** - * Converts a kbrig argument command node to a velocity brigadier argument command node. + * Converts a kbrig argument command node to a paper brigadier argument command node. */ fun ArgumentCommandNode.toPaper(): BrigadierArgumentCommandNode = mapSource { it.toAnvilCommandSource() }.toBrigadier() /** - * Converts a kbrig literal command node to a velocity brigadier literal command node. + * Converts a kbrig literal command node to a paper brigadier literal command node. */ fun LiteralCommandNode.toPaper(): BrigadierLiteralCommandNode1 = mapSource { it.toAnvilCommandSource() }.toBrigadier() From 54fb20c644afceae77962faf7f20c9d724ab457e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 18 Jul 2023 15:16:00 +0200 Subject: [PATCH 34/77] Update for paper changes --- .../anvil/plugin/AnvilPaperPlugin.kt | 4 ++-- .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 3 +++ .../anvil/command/PaperSourceConverter.kt | 19 ------------------- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt index d61e29c6b..a834f6a86 100644 --- a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt +++ b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt @@ -4,14 +4,14 @@ package org.anvilpowered.anvil.plugin import io.papermc.paper.event.server.ServerResourcesLoadEvent import org.anvilpowered.anvil.AnvilPaperApi -import org.anvilpowered.anvil.command.toPaperRoot +import org.anvilpowered.anvil.command.toPaper import org.bukkit.plugin.Plugin context(AnvilPaperApi) class AnvilPaperPlugin : AnvilPlugin() { fun registerCommands(bootstrap: Plugin, event: ServerResourcesLoadEvent) { registerCommands { command -> - event.commands.register(command.toPaperRoot(bootstrap)) + event.commands.register(bootstrap, command.toPaper()) } } } diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt index 3abbb4d0b..92e07782e 100644 --- a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt +++ b/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -2,9 +2,12 @@ package org.anvilpowered.anvil.plugin +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import io.papermc.paper.command.brigadier.CommandSourceStack import io.papermc.paper.event.server.ServerResourcesLoadEvent import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.createPaper +import org.anvilpowered.anvil.domain.user.Component import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt index 8dc77aab3..f080c2bbe 100644 --- a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt +++ b/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt @@ -21,14 +21,12 @@ package org.anvilpowered.anvil.command -import io.papermc.paper.command.brigadier.CommandBuilder import io.papermc.paper.command.brigadier.CommandSourceStack import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.kbrig.brigadier.toBrigadier import org.anvilpowered.kbrig.tree.ArgumentCommandNode import org.anvilpowered.kbrig.tree.LiteralCommandNode import org.anvilpowered.kbrig.tree.mapSource -import org.bukkit.plugin.Plugin import com.mojang.brigadier.tree.ArgumentCommandNode as BrigadierArgumentCommandNode import com.mojang.brigadier.tree.LiteralCommandNode as BrigadierLiteralCommandNode1 @@ -43,20 +41,3 @@ fun ArgumentCommandNode.toPaper(): BrigadierArgumentComman */ fun LiteralCommandNode.toPaper(): BrigadierLiteralCommandNode1 = mapSource { it.toAnvilCommandSource() }.toBrigadier() - -/** - * Paper requires some extra steps for command registration. - * - * Unfortunately, it is not possible to directly register a brigadier type. - * It is necessary to register Paper's custom [CommandBuilder]. - * - * This method effectively clones the target command node into a newly created [CommandBuilder]. - */ -fun LiteralCommandNode.toPaperRoot(plugin: Plugin): CommandBuilder { - val delegate = toPaper() - val builder = CommandBuilder.newCommandBuilder(plugin, delegate.literal) - delegate.children.forEach { builder.then(it) } - builder.requires(delegate.requirement) - builder.executes(delegate.command) - return builder -} From a598c6a676d0c496279599ea2dd13fe02cc06ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 19 Jul 2023 12:38:01 +0200 Subject: [PATCH 35/77] Simplify module structure --- api/web/build.gradle.kts | 9 ---- app/plugin/paper/build.gradle.kts | 2 +- app/plugin/sponge/build.gradle.kts | 2 +- app/plugin/velocity/build.gradle.kts | 2 +- core/build.gradle.kts | 6 +-- core/db/build.gradle.kts | 9 ---- core/game/build.gradle.kts | 10 ----- .../anvil/http/client/AgentClient.kt | 3 -- .../anvil/http/server/AgentServer.kt | 3 -- .../anvil/core/JULDelegateLogger.kt | 42 ------------------- .../anvil/core/Slf4jDelegateLogger.kt | 42 ------------------- .../anvil/db/RepositoryScopeImpl.kt | 0 .../db/datastore/RepositoryExtensions.kt | 0 .../anvil/db/system/GameTypeRepositoryImpl.kt | 0 .../anvil/db/system/GameTypeTable.kt | 0 .../db/system/ServerNodeRepositoryImpl.kt | 0 .../anvil/db/system/ServerNodeTable.kt | 0 .../db/user/DiscordUserRepositoryImpl.kt | 0 .../anvil/db/user/DiscordUserTable.kt | 0 .../anvil/db/user/GameUserRepositoryImpl.kt | 0 .../anvil/db/user/GameUserTable.kt | 0 .../anvil/db/user/UserRepositoryImpl.kt | 0 .../anvilpowered/anvil/db/user/UserTable.kt | 0 .../anvilpowered/anvil/entity/AnvilTable.kt | 0 .../src/jvmMain/resources/application.conf | 0 {core/game/paper => paper}/build.gradle.kts | 2 +- .../org/anvilpowered/anvil/AnvilPaperApi.kt | 0 .../anvil/command/AnvilPaperCommandSource.kt | 0 .../anvil/command/PaperCustomCommand.kt | 0 .../anvil/command/PaperSourceConverter.kt | 0 .../anvil/platform/PaperPlatform.kt | 0 .../anvil/platform/PaperPlugin.kt | 0 .../anvil/platform/PaperPluginManager.kt | 0 .../anvil/user/AnvilPaperPlayer.kt | 0 .../anvil/user/AnvilPaperSubject.kt | 0 settings.gradle.kts | 9 ++-- {core/game/sponge => sponge}/build.gradle.kts | 3 +- .../org/anvilpowered/anvil/AnvilSpongeApi.kt | 0 .../anvil/platform/SpongePlatform.kt | 0 .../anvil/platform/SpongePlugin.kt | 0 .../anvil/platform/SpongePluginManager.kt | 0 .../anvil/user/AnvilSpongePlayer.kt | 0 .../anvil/user/AnvilSpongeSubject.kt | 0 .../anvil/user/SpongeGameUserScope.kt | 0 .../velocity => velocity}/build.gradle.kts | 2 +- .../anvilpowered/anvil/AnvilVelocityApi.kt | 0 .../anvil/VelocityGamePlatformScope.kt | 0 .../command/AnvilVelocityCommandSource.kt | 0 .../anvil/command/VelocityCustomCommand.kt | 0 .../anvil/command/VelocitySourceConverter.kt | 0 .../anvil/platform/VelocityPlatform.kt | 0 .../anvil/platform/VelocityPlugin.kt | 0 .../anvil/platform/VelocityPluginManager.kt | 0 .../anvil/user/AnvilVelocityPlayer.kt | 0 .../anvil/user/AnvilVelocitySubject.kt | 0 .../anvil/user/VelocityGameUserScope.kt | 0 56 files changed, 11 insertions(+), 135 deletions(-) delete mode 100644 api/web/build.gradle.kts delete mode 100644 core/db/build.gradle.kts delete mode 100644 core/game/build.gradle.kts delete mode 100644 core/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt delete mode 100644 core/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/JULDelegateLogger.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt (100%) rename core/{db => }/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt (100%) rename core/{db => }/src/jvmMain/resources/application.conf (100%) rename {core/game/paper => paper}/build.gradle.kts (75%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt (100%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt (100%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt (100%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt (100%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt (100%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt (100%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt (100%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt (100%) rename {core/game/paper => paper}/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt (100%) rename {core/game/sponge => sponge}/build.gradle.kts (63%) rename {core/game/sponge => sponge}/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt (100%) rename {core/game/sponge => sponge}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt (100%) rename {core/game/sponge => sponge}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt (100%) rename {core/game/sponge => sponge}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt (100%) rename {core/game/sponge => sponge}/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt (100%) rename {core/game/sponge => sponge}/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt (100%) rename {core/game/sponge => sponge}/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt (100%) rename {core/game/velocity => velocity}/build.gradle.kts (75%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt (100%) rename {core/game/velocity => velocity}/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt (100%) diff --git a/api/web/build.gradle.kts b/api/web/build.gradle.kts deleted file mode 100644 index 2ec45f6ee..000000000 --- a/api/web/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") -} - -dependencies { - commonMainImplementation(project(":anvil-domain")) - jvmMainImplementation(libs.bundles.ktor.client) - jvmMainImplementation(libs.bundles.ktor.server) -} diff --git a/app/plugin/paper/build.gradle.kts b/app/plugin/paper/build.gradle.kts index f602f705a..6997042e8 100644 --- a/app/plugin/paper/build.gradle.kts +++ b/app/plugin/paper/build.gradle.kts @@ -6,7 +6,7 @@ plugins { dependencies { commonMainImplementation(project(":anvil-app-plugin-core")) - commonMainImplementation(project(":anvil-core-game-paper")) + commonMainImplementation(project(":anvil-paper")) jvmMainCompileOnly(libs.brigadier) jvmMainCompileOnly(libs.paper) } diff --git a/app/plugin/sponge/build.gradle.kts b/app/plugin/sponge/build.gradle.kts index 028f10d73..2d50ac8d2 100644 --- a/app/plugin/sponge/build.gradle.kts +++ b/app/plugin/sponge/build.gradle.kts @@ -14,7 +14,7 @@ repositories { dependencies { commonMainImplementation(project(":anvil-app-plugin-core")) - commonMainImplementation(project(":anvil-core-game-sponge")) + commonMainImplementation(project(":anvil-sponge")) jvmMainCompileOnly(libs.brigadier) } diff --git a/app/plugin/velocity/build.gradle.kts b/app/plugin/velocity/build.gradle.kts index cb65bfd68..55577fbed 100644 --- a/app/plugin/velocity/build.gradle.kts +++ b/app/plugin/velocity/build.gradle.kts @@ -5,7 +5,7 @@ plugins { dependencies { commonMainImplementation(project(":anvil-app-plugin-core")) - commonMainImplementation(project(":anvil-core-game-velocity")) + commonMainImplementation(project(":anvil-velocity")) jvmMainCompileOnly(libs.velocity) kapt(libs.velocity) commonMainImplementation(libs.kbrig.brigadier) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index ebc5fc76e..ac6a2b377 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -6,8 +6,6 @@ plugins { dependencies { commonMainApi(project(":anvil-api")) - commonMainImplementation(libs.ktor.serialization) - jvmMainImplementation(libs.bundles.ktor.server) - jvmMainImplementation(libs.ktor.client.cio) - jsMainImplementation(libs.ktor.client.js) + jvmMainApi(platform(libs.exposed.bom)) + jvmMainApi(libs.bundles.exposed) } diff --git a/core/db/build.gradle.kts b/core/db/build.gradle.kts deleted file mode 100644 index ae9838a01..000000000 --- a/core/db/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") -} - -dependencies { - commonMainApi(project(":anvil-core")) - jvmMainApi(platform(libs.exposed.bom)) - jvmMainApi(libs.bundles.exposed) -} diff --git a/core/game/build.gradle.kts b/core/game/build.gradle.kts deleted file mode 100644 index 724171187..000000000 --- a/core/game/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") - id("anvil-publish") -} - -dependencies { - commonMainApi(project(":anvil-core")) - commonMainApi(project(":anvil-core-db")) - commonMainApi(project(":anvil-api")) -} diff --git a/core/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt b/core/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt deleted file mode 100644 index 7b4016edb..000000000 --- a/core/src/commonMain/kotlin/org/anvilpowered/anvil/http/client/AgentClient.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.plugin.http.client - -object AgentClient diff --git a/core/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt b/core/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt deleted file mode 100644 index c017db761..000000000 --- a/core/src/commonMain/kotlin/org/anvilpowered/anvil/http/server/AgentServer.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.plugin.http.server - -object AgentServer diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/JULDelegateLogger.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/JULDelegateLogger.kt deleted file mode 100644 index c36390c2a..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/JULDelegateLogger.kt +++ /dev/null @@ -1,42 +0,0 @@ -package org.anvilpowered.anvil.core - -import org.lighthousegames.logging.KmLog -import java.util.logging.Level -import java.util.logging.Logger - -class JULDelegateLogger( - private val delegate: Logger, -) : KmLog(delegate.name) { - override fun verbose(tag: String, msg: String) { - super.verbose(tag, msg) - delegate.log(Level.FINEST, msg) - } - - override fun debug(tag: String, msg: String) { - super.debug(tag, msg) - delegate.log(Level.FINE, msg) - } - - override fun info(tag: String, msg: String) { - super.info(tag, msg) - delegate.log(Level.INFO, msg) - } - - override fun warn(tag: String, msg: String, t: Throwable?) { - super.warn(tag, msg, t) - if (t == null) { - delegate.log(Level.WARNING, msg) - } else { - delegate.log(Level.WARNING, msg, t) - } - } - - override fun error(tag: String, msg: String, t: Throwable?) { - super.error(tag, msg, t) - if (t == null) { - delegate.log(Level.SEVERE, msg) - } else { - delegate.log(Level.SEVERE, msg, t) - } - } -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt deleted file mode 100644 index d6c625de4..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/Slf4jDelegateLogger.kt +++ /dev/null @@ -1,42 +0,0 @@ -package org.anvilpowered.anvil.core - -import org.lighthousegames.logging.KmLog -import org.slf4j.Logger - -class Slf4jDelegateLogger( - private val delegate: Logger, -) : KmLog(delegate.name) { - - override fun verbose(tag: String, msg: String) { - super.verbose(tag, msg) - delegate.trace(msg) - } - - override fun debug(tag: String, msg: String) { - super.debug(tag, msg) - delegate.debug(msg) - } - - override fun info(tag: String, msg: String) { - super.info(tag, msg) - delegate.info(msg) - } - - override fun warn(tag: String, msg: String, t: Throwable?) { - super.warn(tag, msg, t) - if (t == null) { - delegate.warn(msg) - } else { - delegate.warn(msg, t) - } - } - - override fun error(tag: String, msg: String, t: Throwable?) { - super.error(tag, msg, t) - if (t == null) { - delegate.error(msg) - } else { - delegate.error(msg, t) - } - } -} diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt diff --git a/core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt similarity index 100% rename from core/db/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt diff --git a/core/db/src/jvmMain/resources/application.conf b/core/src/jvmMain/resources/application.conf similarity index 100% rename from core/db/src/jvmMain/resources/application.conf rename to core/src/jvmMain/resources/application.conf diff --git a/core/game/paper/build.gradle.kts b/paper/build.gradle.kts similarity index 75% rename from core/game/paper/build.gradle.kts rename to paper/build.gradle.kts index 9a63c0897..ab5ed5362 100644 --- a/core/game/paper/build.gradle.kts +++ b/paper/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } dependencies { - commonMainImplementation(project(":anvil-core-game")) + commonMainImplementation(project(":anvil-core")) commonMainImplementation(libs.kbrig.brigadier) jvmMainCompileOnly(libs.paper) } diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt diff --git a/core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt similarity index 100% rename from core/game/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt rename to paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index 5f8bd94f8..91ba86bb5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,7 +24,6 @@ rootProject.name = "anvil" sequenceOf( "api", - "api-web", "app-plugin", "app-plugin-core", "app-plugin-paper", @@ -38,11 +37,9 @@ sequenceOf( "app-cli", "domain", "core", - "core-db", - "core-game", - "core-game-paper", - "core-game-sponge", - "core-game-velocity", + "paper", + "sponge", + "velocity", ).forEach { val project = ":anvil-$it" include(project) diff --git a/core/game/sponge/build.gradle.kts b/sponge/build.gradle.kts similarity index 63% rename from core/game/sponge/build.gradle.kts rename to sponge/build.gradle.kts index 22fb824b1..318fb677f 100644 --- a/core/game/sponge/build.gradle.kts +++ b/sponge/build.gradle.kts @@ -4,8 +4,7 @@ plugins { } dependencies { -// commonMainImplementation(libs.coroutines) commonMainImplementation(libs.kotlinx.coroutines) - commonMainImplementation(project(":anvil-core-game")) + commonMainImplementation(project(":anvil-core")) jvmMainImplementation(libs.sponge) } diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt similarity index 100% rename from core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt rename to sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt similarity index 100% rename from core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt rename to sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt similarity index 100% rename from core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt rename to sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt similarity index 100% rename from core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt rename to sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt similarity index 100% rename from core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt rename to sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt similarity index 100% rename from core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt rename to sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt diff --git a/core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt similarity index 100% rename from core/game/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt rename to sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt diff --git a/core/game/velocity/build.gradle.kts b/velocity/build.gradle.kts similarity index 75% rename from core/game/velocity/build.gradle.kts rename to velocity/build.gradle.kts index 30f69dc3f..86e9d8642 100644 --- a/core/game/velocity/build.gradle.kts +++ b/velocity/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } dependencies { - commonMainImplementation(project(":anvil-core-game")) + commonMainImplementation(project(":anvil-core")) commonMainImplementation(libs.kbrig.brigadier) jvmMainCompileOnly(libs.velocity) } diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt diff --git a/core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt similarity index 100% rename from core/game/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt rename to velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt From 4471850bd9f68f6a620d5be5749434d8bfef5333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 1 Sep 2023 20:13:53 +0200 Subject: [PATCH 36/77] Work on stuff --- .../{GameTypeDto.kt => GameTypeService.kt} | 20 +----- .../anvilpowered/anvil/api/user/UserDto.kt | 40 ------------ .../anvil/api/user/UserManager.kt | 10 ++- .../anvil/{ => core}/entity/AnvilTable.kt | 2 +- .../anvil/core/user/UserManagerImpl.kt | 16 +++-- .../anvil/db/RepositoryExtensions.kt | 38 +++++------ .../db/datastore/RepositoryExtensions.kt | 20 ------ .../anvil/db/system/GameTypeRepositoryImpl.kt | 63 ------------------- .../anvil/db/system/GameTypeTable.kt | 39 ------------ .../db/system/ServerNodeRepositoryImpl.kt | 1 - .../db/user/DiscordUserRepositoryImpl.kt | 11 +--- .../anvil/db/user/GameUserRepositoryImpl.kt | 19 +++--- .../anvil/db/user/GameUserTable.kt | 16 +++-- .../anvil/db/user/UserRepositoryImpl.kt | 51 +++++++++++---- .../anvilpowered/anvil/db/user/UserTable.kt | 8 +++ .../anvil/domain/system/GameTypeJoin.kt | 9 --- .../domain/system/ServerNodeRepository.kt | 2 +- .../anvil/domain/user/DiscordUser.kt | 11 ++-- .../domain/user/DiscordUserRepository.kt | 2 +- .../anvil/domain/user/GameUser.kt | 15 +++-- .../anvil/domain/user/GameUserRepository.kt | 2 +- .../anvilpowered/anvil/domain/user/User.kt | 7 ++- .../anvil/domain/user/UserRepository.kt | 8 +++ .../org/anvilpowered/anvil/AnvilPaperApi.kt | 2 +- .../anvil/user/AnvilPaperPlayer.kt | 2 +- .../org/anvilpowered/anvil/AnvilSpongeApi.kt | 2 +- .../anvil/user/AnvilSpongePlayer.kt | 2 +- .../anvilpowered/anvil/AnvilVelocityApi.kt | 2 +- .../anvil/user/AnvilVelocityPlayer.kt | 2 +- 29 files changed, 136 insertions(+), 286 deletions(-) rename api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/{GameTypeDto.kt => GameTypeService.kt} (64%) delete mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserDto.kt rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeRepository.kt => api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserManager.kt (74%) rename core/src/jvmMain/kotlin/org/anvilpowered/anvil/{ => core}/entity/AnvilTable.kt (85%) rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt => core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/user/UserManagerImpl.kt (73%) rename api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserDto.kt => core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryExtensions.kt (52%) delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeJoin.kt diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeDto.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeService.kt similarity index 64% rename from api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeDto.kt rename to api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeService.kt index 6371b2218..a21fbd1a3 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeDto.kt +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeService.kt @@ -18,23 +18,7 @@ package org.anvilpowered.anvil.api.system -import org.anvilpowered.anvil.domain.system.GameType -import org.sourcegrade.kontour.Dto -import org.sourcegrade.kontour.UUID +interface GameTypeService { -sealed interface GameTypeDto : Dto { - - override val entity: GameType - get() = GameType(id) - - data class Basic( - override val id: UUID, - val name: String, - ) : GameTypeDto - - data class Full( - override val id: UUID, - val name: String, - val website: String, - ) : GameTypeDto + fun getCurrentGameType(): String } diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserDto.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserDto.kt deleted file mode 100644 index fefc99c34..000000000 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserDto.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.user - -import org.anvilpowered.anvil.domain.user.User -import org.sourcegrade.kontour.Dto -import org.sourcegrade.kontour.UUID - -sealed interface UserDto : Dto { - - override val entity: User - get() = User(id) - - data class Basic( - override val id: UUID, - val username: String, - ) : UserDto - - data class Full( - override val id: UUID, - val username: String, - val email: String, - ) : UserDto -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeRepository.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserManager.kt similarity index 74% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeRepository.kt rename to api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserManager.kt index 7b501c625..abae20ba5 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeRepository.kt +++ b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserManager.kt @@ -16,13 +16,11 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.domain.system +package org.anvilpowered.anvil.api.user -import org.sourcegrade.kontour.Repository +import org.sourcegrade.kontour.UUID -interface GameTypeRepository : Repository { +interface UserManager { - suspend fun findByName(name: String): GameType? - - suspend fun findByWebsite(website: String): GameType? + suspend fun ensureExists(gameUserId: UUID) } diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt similarity index 85% rename from core/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt index 5c5005d90..548146750 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.entity +package org.anvilpowered.anvil.core.entity import org.jetbrains.exposed.dao.id.UUIDTable diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/user/UserManagerImpl.kt similarity index 73% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/user/UserManagerImpl.kt index 451ab1fbd..a4dc1c4ba 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameType.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/user/UserManagerImpl.kt @@ -16,16 +16,14 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.domain.system +package org.anvilpowered.anvil.core.user -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.DomainEntity +import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.api.user.UserManager import org.sourcegrade.kontour.UUID -data class GameType(override val id: UUID) : DomainEntity { - - data class CreateDto( - val name: String, - val website: String, - ) : Creates +context(AnvilApi) +class UserManagerImpl : UserManager { + override suspend fun ensureExists(gameUserId: UUID) { + } } diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserDto.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryExtensions.kt similarity index 52% rename from api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserDto.kt rename to core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryExtensions.kt index 76a968e65..f19249ac2 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/GameUserDto.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryExtensions.kt @@ -16,27 +16,23 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.api.user +package org.anvilpowered.anvil.db -import org.anvilpowered.anvil.api.system.GameTypeDto -import org.anvilpowered.anvil.domain.user.GameUser -import org.sourcegrade.kontour.Dto -import org.sourcegrade.kontour.UUID +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.Table +import org.jetbrains.exposed.sql.insert +import org.jetbrains.exposed.sql.statements.InsertStatement +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.sourcegrade.kontour.DomainEntity -sealed interface GameUserDto : Dto { - - override val entity: GameUser - get() = GameUser(id) - - data class Basic( - override val id: UUID, - val username: String, - ) : GameUserDto - - data class Mid( - override val id: UUID, - val user: UserDto.Basic, - val gameType: GameTypeDto.Basic, - val username: String, - ) : GameUserDto +internal suspend fun newSaveTransaction( + table: T, + toTable: context(T) InsertStatement.() -> Unit, + toEntity: ResultRow.() -> E, +): E { + val fromDB = newSuspendedTransaction { + table.insert { toTable(it) } + }.resultedValues?.firstOrNull()?.toEntity() + checkNotNull(fromDB) { "Failed to save entity" } + return fromDB } diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt deleted file mode 100644 index 7545bafc2..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/datastore/RepositoryExtensions.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.anvilpowered.anvil.db.datastore - -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.Table -import org.jetbrains.exposed.sql.insert -import org.jetbrains.exposed.sql.statements.InsertStatement -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.DomainEntity - -internal suspend fun newSaveTransaction( - table: T, - toTable: context(T) InsertStatement.() -> Unit, - toEntity: ResultRow.() -> E, -): E { - val fromDB = newSuspendedTransaction { - table.insert { toTable(it) } - }.resultedValues?.firstOrNull()?.toEntity() - checkNotNull(fromDB) { "Failed to save entity" } - return fromDB -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt deleted file mode 100644 index e0796cf7d..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeRepositoryImpl.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.system - -import org.anvilpowered.anvil.domain.system.GameType -import org.anvilpowered.anvil.domain.system.GameTypeRepository -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.Dto -import org.sourcegrade.kontour.UUID -import kotlin.reflect.KClass - -internal object GameTypeRepositoryImpl : GameTypeRepository { - override suspend fun findByName(name: String): GameType? = newSuspendedTransaction { - GameTypeEntity.find(GameTypeTable.name eq name).firstOrNull() - ?.let { GameType(it.id.value) } - } - - override suspend fun findByWebsite(website: String): GameType? = newSuspendedTransaction { - GameTypeEntity.find(GameTypeTable.website eq website).firstOrNull() - ?.let { GameType(it.id.value) } - } - - override suspend fun countAll(): Long = newSuspendedTransaction { - GameTypeEntity.all().count() - } - - override suspend fun create(item: GameType.CreateDto): GameType = newSuspendedTransaction { - GameTypeEntity.new { - name = item.name - website = item.website - }.let { GameType(it.id.value) } - } - - override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { - TODO() - } - - override suspend fun exists(id: UUID): Boolean = newSuspendedTransaction { - GameTypeEntity.findById(id) != null - } - - override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { - GameTypeTable.deleteWhere { GameTypeTable.id eq id } > 0 - } -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt deleted file mode 100644 index 36053ba8b..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/GameTypeTable.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.system - -import org.jetbrains.exposed.dao.UUIDEntity -import org.jetbrains.exposed.dao.UUIDEntityClass -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.dao.id.UUIDTable -import org.jetbrains.exposed.sql.SizedIterable -import java.util.UUID - -internal object GameTypeTable : UUIDTable("game_types") { - val name = varchar("name", 255).uniqueIndex() - val website = varchar("website", 255) -} - -internal class GameTypeEntity(id: EntityID) : UUIDEntity(id) { - var name by GameTypeTable.name - var website by GameTypeTable.website - val serverNodes: SizedIterable by ServerNodeEntity referrersOn ServerNodeTable.gameTypeId - - companion object : UUIDEntityClass(GameTypeTable) -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt index 79d205dc0..fb9784308 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt @@ -18,7 +18,6 @@ package org.anvilpowered.anvil.db.system -import org.anvilpowered.anvil.domain.system.GameTypeJoin import org.anvilpowered.anvil.domain.system.ServerNode import org.anvilpowered.anvil.domain.system.ServerNodeRepository import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt index 7deaacd59..cccc10052 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt @@ -23,21 +23,16 @@ import org.anvilpowered.anvil.domain.user.DiscordUserRepository import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.deleteWhere import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.Dto import org.sourcegrade.kontour.UUID -import kotlin.reflect.KClass object DiscordUserRepositoryImpl : DiscordUserRepository { override suspend fun countAll(): Long = newSuspendedTransaction { DiscordUserEntity.all().count() } - override suspend fun create(item: DiscordUser.CreateDto): DiscordUser = newSuspendedTransaction { + override suspend fun create(item: DiscordUser): DiscordUser = newSuspendedTransaction { DiscordUserEntity.new(item.id) { discordId = item.discordId - }.let { DiscordUser(it.id.value) } - } - - override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { - TODO("Not yet implemented") + } + item } override suspend fun exists(id: UUID): Boolean = newSuspendedTransaction { diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt index d7f7c53b1..01062db26 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt @@ -18,17 +18,15 @@ package org.anvilpowered.anvil.db.user -import org.anvilpowered.anvil.db.system.GameTypeEntity import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.GameUserRepository import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.deleteWhere import org.jetbrains.exposed.sql.mapLazy +import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.Dto import org.sourcegrade.kontour.SizedIterable import org.sourcegrade.kontour.UUID -import kotlin.reflect.KClass object GameUserRepositoryImpl : GameUserRepository { override suspend fun getAllUserNames(startWith: String): SizedIterable = newSuspendedTransaction { @@ -36,23 +34,22 @@ object GameUserRepositoryImpl : GameUserRepository { } override suspend fun findByUsername(username: String): GameUser? = newSuspendedTransaction { - GameUserEntity.find { GameUserTable.username eq username }.firstOrNull()?.let { GameUser(it.id.value) } + GameUserTable.select { GameUserTable.username eq username } + .firstOrNull() + ?.toGameUser() } override suspend fun countAll(): Long = newSuspendedTransaction { GameUserEntity.all().count() } - override suspend fun create(item: GameUser.CreateDto): GameUser = newSuspendedTransaction { + override suspend fun create(item: GameUser): GameUser = newSuspendedTransaction { GameUserEntity.new(item.id) { user = UserEntity[item.userId] - gameType = GameTypeEntity[item.gameTypeId] + gameType = item.gameType username = item.username - }.let { GameUser(it.id.value) } - } - - override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { - TODO() + } + item } override suspend fun exists(id: UUID): Boolean = diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt index c538fa69c..6e8191fe7 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt @@ -18,26 +18,34 @@ package org.anvilpowered.anvil.db.user -import org.anvilpowered.anvil.db.system.GameTypeEntity -import org.anvilpowered.anvil.db.system.GameTypeTable +import org.anvilpowered.anvil.domain.user.GameUser import org.jetbrains.exposed.dao.UUIDEntity import org.jetbrains.exposed.dao.UUIDEntityClass import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.UUIDTable +import org.jetbrains.exposed.sql.ResultRow import org.sourcegrade.kontour.UUID internal object GameUserTable : UUIDTable("game_users") { val userId = reference("user_id", UserTable) - val gameTypeId = reference("game_type_id", GameTypeTable) val username = varchar("username", 255).uniqueIndex() + val gameType = varchar("game_type", 255) val nickname = varchar("nickname", 255).nullable() } internal class GameUserEntity(id: EntityID) : UUIDEntity(id) { var user: UserEntity by UserEntity referencedOn GameUserTable.userId - var gameType: GameTypeEntity by GameTypeEntity referencedOn GameUserTable.gameTypeId var username: String by GameUserTable.username + var gameType: String by GameUserTable.gameType var nickname: String? by GameUserTable.nickname companion object : UUIDEntityClass(GameUserTable) } + +internal fun ResultRow.toGameUser() = GameUser( + id = this[GameUserTable.id].value, + userId = this[GameUserTable.userId].value, + username = this[GameUserTable.username], + gameType = this[GameUserTable.gameType], + nickname = this[GameUserTable.nickname] +) diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt index 4a29ef14d..7170688d5 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt @@ -22,19 +22,51 @@ import org.anvilpowered.anvil.domain.user.User import org.anvilpowered.anvil.domain.user.UserRepository import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.deleteWhere +import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.Dto import org.sourcegrade.kontour.UUID -import kotlin.reflect.KClass object UserRepositoryImpl : UserRepository { + + override suspend fun initializeFromGameUser( + gameUserId: UUID, + username: String, + ): User = newSuspendedTransaction { + val userId = GameUserTable + .slice(listOf(GameUserTable.id, GameUserTable.userId)) + .select { GameUserTable.id eq gameUserId } + .firstOrNull() + ?.get(GameUserTable.userId) + + // if a game user exists, a user must also already exist + + userId?.let { + return@let User(it.value, username) + } + + // otherwise, create a new user and game user + + val user = UserEntity.new { + this.username = username + } + + GameUserEntity.new { + this.user = user + this.gameType + }.let { User(it.id.value, username) } + } + override suspend fun findByGameUserId(id: UUID): User? = newSuspendedTransaction { - // TODO: Does this send two queries to the database? - GameUserEntity.findById(id)?.let { User(it.user.id.value) } + GameUserTable.innerJoin(UserTable) + .select { GameUserTable.id eq id } + .firstOrNull() + ?.toUser() } override suspend fun findByUsername(username: String): User? = newSuspendedTransaction { - UserEntity.find { UserTable.username eq username }.firstOrNull()?.let { User(it.id.value) } + UserTable.select { UserTable.username eq username } + .firstOrNull() + ?.toUser() } override suspend fun countAll(): Long = newSuspendedTransaction { UserEntity.all().count() } @@ -42,16 +74,13 @@ object UserRepositoryImpl : UserRepository { override suspend fun create(item: User.CreateDto): User = newSuspendedTransaction { UserEntity.new { username = item.username - }.let { User(it.id.value) } + }.let { User(it.id.value, item.username, item.email) } } - override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { - TODO("Not yet implemented") + override suspend fun exists(id: UUID): Boolean = newSuspendedTransaction { + UserEntity.findById(id) != null } - override suspend fun exists(id: UUID): Boolean = - newSuspendedTransaction { UserEntity.findById(id) != null } - override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { UserTable.deleteWhere { UserTable.id eq id } > 0 } diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt index 1b546c894..c5034e3f7 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt +++ b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt @@ -18,10 +18,12 @@ package org.anvilpowered.anvil.db.user +import org.anvilpowered.anvil.domain.user.User import org.jetbrains.exposed.dao.UUIDEntity import org.jetbrains.exposed.dao.UUIDEntityClass import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.UUIDTable +import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.SizedIterable import org.sourcegrade.kontour.UUID @@ -37,3 +39,9 @@ internal class UserEntity(id: EntityID) : UUIDEntity(id) { companion object : UUIDEntityClass(UserTable) } + +internal fun ResultRow.toUser() = User( + id = this[UserTable.id].value, + username = this[UserTable.username], + email = this[UserTable.email] +) diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeJoin.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeJoin.kt deleted file mode 100644 index b4e2fc03f..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/GameTypeJoin.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.anvilpowered.anvil.domain.system - -import org.sourcegrade.kontour.UUID - -interface GameTypeJoin { - suspend fun id(id: UUID): R - suspend fun name(name: String): R - suspend fun website(website: String): R -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt index 3cbb9b330..6ac77eb95 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt @@ -23,5 +23,5 @@ import org.sourcegrade.kontour.SizedIterable interface ServerNodeRepository : Repository { - suspend fun findByGameType(): GameTypeJoin> + suspend fun findByGameType(gameType: String): SizedIterable } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt index 73580dbad..bd66b46db 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt @@ -4,10 +4,7 @@ import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity import org.sourcegrade.kontour.UUID -data class DiscordUser(override val id: UUID) : DomainEntity { - - data class CreateDto( - val id: UUID, - val discordId: String, - ) : Creates -} +data class DiscordUser( + override val id: UUID, + val discordId: String, +) : DomainEntity, Creates diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt index 4a0104f87..813961ff2 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt @@ -20,4 +20,4 @@ package org.anvilpowered.anvil.domain.user import org.sourcegrade.kontour.Repository -interface DiscordUserRepository : Repository +interface DiscordUserRepository : Repository diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt index 2b7055607..b6fea3ac3 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt @@ -9,14 +9,13 @@ import org.sourcegrade.kontour.UUID * * Represents a single user of a game. */ -data class GameUser(override val id: UUID) : DomainEntity { - - data class CreateDto( - val id: UUID, - val userId: UUID, - val gameTypeId: UUID, - val username: String, - ) : Creates +data class GameUser( + override val id: UUID, + val userId: UUID, + val username: String, + val gameType: String, + val nickname: String? = null, +) : DomainEntity, Creates { interface GamePlatformScope { // TODO: Maybe just GameScope? diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt index ef8389041..bdfd96d86 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt @@ -21,7 +21,7 @@ package org.anvilpowered.anvil.domain.user import org.sourcegrade.kontour.Repository import org.sourcegrade.kontour.SizedIterable -interface GameUserRepository : Repository { +interface GameUserRepository : Repository { suspend fun getAllUserNames(startWith: String = ""): SizedIterable diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt index 2b142f805..a8eb15465 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt @@ -9,10 +9,15 @@ import org.sourcegrade.kontour.UUID * * Represents a single universal user across all games and platforms. */ -data class User(override val id: UUID) : DomainEntity { +data class User( + override val id: UUID, + val username: String, + val email: String? = null, +) : DomainEntity { data class CreateDto( val username: String, + val email: String? = null, ) : Creates /** diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt index c5d5f5e72..4498562fd 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt +++ b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt @@ -22,6 +22,14 @@ import org.sourcegrade.kontour.Repository import org.sourcegrade.kontour.UUID interface UserRepository : Repository { + /** + * This method is used to initialize a user from a game user. + * If a game user with the given ID does not exist, it will be created. + * Call this to ensure that the given game user has a corresponding user in the database. + * + * This method is idempotent. + */ + suspend fun initializeFromGameUser(gameUserId: UUID, username: String): User suspend fun findByGameUserId(id: UUID): User? suspend fun findByUsername(username: String): User? } diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt index 1017591a7..e056de1df 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt +++ b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt @@ -2,7 +2,7 @@ package org.anvilpowered.anvil import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.core.JULDelegateLogger -import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.core.db.RepositoryScopeImpl import org.anvilpowered.anvil.domain.RepositoryScope import org.anvilpowered.anvil.platform.PaperPlatform import org.anvilpowered.anvil.platform.PaperPluginManager diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt index aac5ab2df..f9e0c1dc8 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt +++ b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt @@ -1,6 +1,6 @@ package org.anvilpowered.anvil.user -import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.core.db.RepositoryScopeImpl import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt index cb5ce9b4e..7acbb114e 100644 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt +++ b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt @@ -2,7 +2,7 @@ package org.anvilpowered.anvil import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.core.Slf4jDelegateLogger -import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.core.db.RepositoryScopeImpl import org.anvilpowered.anvil.domain.RepositoryScope import org.anvilpowered.anvil.platform.SpongePlatform import org.anvilpowered.anvil.platform.SpongePluginManager diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt index f7d2100dd..669e4c0f3 100644 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt +++ b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt @@ -1,6 +1,6 @@ package org.anvilpowered.anvil.user -import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.core.db.RepositoryScopeImpl import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player import org.anvilpowered.anvil.domain.user.Subject diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt index 1c8713077..1d05f90d0 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt +++ b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt @@ -3,7 +3,7 @@ package org.anvilpowered.anvil import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.core.Slf4jDelegateLogger -import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.core.db.RepositoryScopeImpl import org.anvilpowered.anvil.domain.RepositoryScope import org.anvilpowered.anvil.platform.VelocityPlatform import org.anvilpowered.anvil.platform.VelocityPluginManager diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt index e3b3a71ce..dc4435965 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt +++ b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt @@ -1,6 +1,6 @@ package org.anvilpowered.anvil.user -import org.anvilpowered.anvil.db.RepositoryScopeImpl +import org.anvilpowered.anvil.core.db.RepositoryScopeImpl import org.anvilpowered.anvil.domain.user.Audience import org.anvilpowered.anvil.domain.user.GameUser import org.anvilpowered.anvil.domain.user.Player From bd18e0458734332a1d6fc4cf29c7d282b8f9e80e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 17 Sep 2023 23:39:46 +0200 Subject: [PATCH 37/77] Clean stuff up --- api/build.gradle.kts | 17 -- .../org/anvilpowered/anvil/api/AnvilApi.kt | 28 --- .../org/anvilpowered/anvil/api/LoggerScope.kt | 32 --- .../anvil/api/user/ArgumentExtensions.kt | 26 --- app/cli/build.gradle.kts | 1 - app/cockpit/application/build.gradle.kts | 7 - app/cockpit/backend/build.gradle.kts | 3 - app/cockpit/build.gradle.kts | 3 - app/cockpit/domain/build.gradle.kts | 7 - app/cockpit/ui/build.gradle.kts | 25 --- .../kotlin/org/anvilpowered/anvil/ui/App.kt | 57 ----- .../kotlin/org/anvilpowered/anvil/ui/Menu.kt | 72 ------- .../org/anvilpowered/anvil/ui/Routing.kt | 39 ---- .../anvil/ui/component/SearchBox.kt | 48 ----- .../anvil/ui/component/Sidebar.kt | 21 -- .../anvil/ui/page/dashboard/Home.kt | 39 ---- .../anvil/ui/page/servers/Create.kt | 198 ------------------ .../anvil/ui/page/servers/Home.kt | 81 ------- .../ui/src/jsMain/resources/index.html | 13 -- app/plugin/build.gradle.kts | 9 +- app/plugin/core/build.gradle.kts | 12 +- app/plugin/paper/build.gradle.kts | 9 +- app/plugin/sponge/build.gradle.kts | 7 +- app/plugin/velocity/build.gradle.kts | 9 +- .../src/main/kotlin/anvil-publish.gradle.kts | 3 +- .../kotlin-js.base-conventions.gradle.kts | 9 - .../kotlin-jvm.base-conventions.gradle.kts | 11 - build.gradle.kts | 19 +- core/build.gradle.kts | 15 +- .../anvil/core/user/UserManagerImpl.kt | 29 --- .../anvil/db/RepositoryExtensions.kt | 38 ---- .../anvil/db/RepositoryScopeImpl.kt | 40 ---- .../db/system/ServerNodeRepositoryImpl.kt | 70 ------- .../anvil/db/system/ServerNodeTable.kt | 38 ---- .../db/user/DiscordUserRepositoryImpl.kt | 45 ---- .../anvil/db/user/DiscordUserTable.kt | 36 ---- .../anvil/db/user/GameUserRepositoryImpl.kt | 61 ------ .../anvil/db/user/GameUserTable.kt | 51 ----- .../anvil/db/user/UserRepositoryImpl.kt | 87 -------- .../anvilpowered/anvil/db/user/UserTable.kt | 47 ----- .../kotlin/org/anvilpowered/anvil/AnvilApi.kt | 33 ++- .../org/anvilpowered/anvil/LoggerScope.kt | 15 +- .../org/anvilpowered/anvil/RepositoryScope.kt | 11 +- .../anvilpowered/anvil}/entity/AnvilTable.kt | 2 +- .../anvil}/platform/GamePlatform.kt | 2 +- .../anvilpowered/anvil}/platform/Platform.kt | 2 +- .../org/anvilpowered/anvil/platform/Plugin.kt | 5 + .../anvil}/platform/PluginManager.kt | 2 +- .../org/anvilpowered/anvil}/system/Server.kt | 2 +- .../anvilpowered/anvil}/system/ServerNode.kt | 2 +- .../org/anvilpowered/anvil/user/Player.kt | 11 +- .../org/anvilpowered/anvil/user/Subject.kt | 22 +- .../resources/application.conf | 0 domain/build.gradle.kts | 20 -- .../anvil/domain/GamePlatformScope.kt | 10 - .../anvil/domain/command/CommandSource.kt | 30 --- .../domain/command/GameUserCommandScope.kt | 31 --- .../domain/command/PlayerCommandScope.kt | 14 -- .../anvil/domain/platform/Plugin.kt | 5 - .../domain/system/ServerNodeRepository.kt | 27 --- .../anvil/domain/user/Audience.kt | 5 - .../anvil/domain/user/Component.kt | 3 - .../anvil/domain/user/DiscordUser.kt | 10 - .../domain/user/DiscordUserRepository.kt | 23 -- .../anvil/domain/user/GameUser.kt | 26 --- .../anvil/domain/user/GameUserRepository.kt | 29 --- .../anvilpowered/anvil/domain/user/Player.kt | 9 - .../anvilpowered/anvil/domain/user/Subject.kt | 17 -- .../anvilpowered/anvil/domain/user/User.kt | 32 --- .../anvil/domain/user/Audience.kt | 6 - .../anvil/domain/user/Component.kt | 3 - .../anvil/domain/command/GameUserCommands.kt | 37 ---- .../anvil/domain/user/Audience.kt | 3 - .../anvil/domain/user/Component.kt | 3 - gradle/libs.versions.toml | 4 +- paper/build.gradle.kts | 7 +- sponge/build.gradle.kts | 7 +- velocity/build.gradle.kts | 7 +- 78 files changed, 115 insertions(+), 1724 deletions(-) delete mode 100644 api/build.gradle.kts delete mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt delete mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggerScope.kt delete mode 100644 api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt delete mode 100644 app/cockpit/application/build.gradle.kts delete mode 100644 app/cockpit/backend/build.gradle.kts delete mode 100644 app/cockpit/build.gradle.kts delete mode 100644 app/cockpit/domain/build.gradle.kts delete mode 100644 app/cockpit/ui/build.gradle.kts delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt delete mode 100644 app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt delete mode 100644 app/cockpit/ui/src/jsMain/resources/index.html delete mode 100644 build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts delete mode 100644 build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/user/UserManagerImpl.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryExtensions.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt delete mode 100644 core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt => core/src/main/kotlin/org/anvilpowered/anvil/AnvilApi.kt (55%) rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt => core/src/main/kotlin/org/anvilpowered/anvil/LoggerScope.kt (75%) rename api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeService.kt => core/src/main/kotlin/org/anvilpowered/anvil/RepositoryScope.kt (74%) rename core/src/{jvmMain/kotlin/org/anvilpowered/anvil/core => main/kotlin/org/anvilpowered/anvil}/entity/AnvilTable.kt (85%) rename {domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain => core/src/main/kotlin/org/anvilpowered/anvil}/platform/GamePlatform.kt (66%) rename {domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain => core/src/main/kotlin/org/anvilpowered/anvil}/platform/Platform.kt (94%) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/platform/Plugin.kt rename {domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain => core/src/main/kotlin/org/anvilpowered/anvil}/platform/PluginManager.kt (94%) rename {domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain => core/src/main/kotlin/org/anvilpowered/anvil}/system/Server.kt (67%) rename {domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain => core/src/main/kotlin/org/anvilpowered/anvil}/system/ServerNode.kt (96%) rename api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserManager.kt => core/src/main/kotlin/org/anvilpowered/anvil/user/Player.kt (84%) rename domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt => core/src/main/kotlin/org/anvilpowered/anvil/user/Subject.kt (52%) rename core/src/{jvmMain => main}/resources/application.conf (100%) delete mode 100644 domain/build.gradle.kts delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/GamePlatformScope.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Plugin.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Subject.kt delete mode 100644 domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt delete mode 100644 domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt delete mode 100644 domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt delete mode 100644 domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommands.kt delete mode 100644 domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt delete mode 100644 domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt diff --git a/api/build.gradle.kts b/api/build.gradle.kts deleted file mode 100644 index 3efe21aa1..000000000 --- a/api/build.gradle.kts +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") - id("kotlin-js.base-conventions") - id("anvil-publish") -} - -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - commonMainApi("org.lighthousegames:logging:1.3.0") - jvmMainImplementation("co.touchlab:stately-concurrency:1.2.5") -// commonMainImplementation(libs.logging) - commonMainApi(project(":anvil-domain")) -} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt deleted file mode 100644 index a023fd0eb..000000000 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/AnvilApi.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.anvilpowered.anvil.api - -import org.anvilpowered.anvil.domain.RepositoryScope -import org.anvilpowered.anvil.domain.platform.Platform -import org.anvilpowered.anvil.domain.platform.PluginManager - -/** - * To create an instance of this interface, use the `AnvilApi.create` function. - * This is available for each platform in the corresponding `anvil-core-game-` module. - * - * Generally, the method will look something like this: - * ```kt - * AnvilApi.create<<>>("my-plugin", ....) - * ``` - * - * For example, for Velocity: - * - * ```kt - * AnvilApi.createVelocity("my-plugin", ....) - * ``` - */ -interface AnvilApi : LoggerScope, RepositoryScope { - val platform: Platform - - val pluginManager: PluginManager - - companion object -} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggerScope.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggerScope.kt deleted file mode 100644 index 6ae145a66..000000000 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/LoggerScope.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api - -import org.lighthousegames.logging.KmLog -import org.lighthousegames.logging.logging - -interface LoggerScope { - val logger: KmLog - - companion object { - fun create(name: String): LoggerScope = object : LoggerScope { - override val logger: KmLog = logging(name) - } - } -} diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt b/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt deleted file mode 100644 index 823fdd594..000000000 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/ArgumentExtensions.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.api.user - -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.hasPermissionSet -import org.anvilpowered.kbrig.builder.ArgumentBuilder - -fun > B.requiresPermission(permission: String): B = - requires { it.subject.hasPermissionSet(permission) } diff --git a/app/cli/build.gradle.kts b/app/cli/build.gradle.kts index 66e5f6f49..f63bbd2b9 100644 --- a/app/cli/build.gradle.kts +++ b/app/cli/build.gradle.kts @@ -1,4 +1,3 @@ plugins { - id("kotlin-jvm.base-conventions") alias(libs.plugins.shadow) } diff --git a/app/cockpit/application/build.gradle.kts b/app/cockpit/application/build.gradle.kts deleted file mode 100644 index f645fd732..000000000 --- a/app/cockpit/application/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") -} - -dependencies { - commonMainApi(project(":anvil-domain")) -} diff --git a/app/cockpit/backend/build.gradle.kts b/app/cockpit/backend/build.gradle.kts deleted file mode 100644 index 3614e4182..000000000 --- a/app/cockpit/backend/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") -} diff --git a/app/cockpit/build.gradle.kts b/app/cockpit/build.gradle.kts deleted file mode 100644 index 3614e4182..000000000 --- a/app/cockpit/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") -} diff --git a/app/cockpit/domain/build.gradle.kts b/app/cockpit/domain/build.gradle.kts deleted file mode 100644 index f645fd732..000000000 --- a/app/cockpit/domain/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id("kotlin-jvm.base-conventions") -} - -dependencies { - commonMainApi(project(":anvil-domain")) -} diff --git a/app/cockpit/ui/build.gradle.kts b/app/cockpit/ui/build.gradle.kts deleted file mode 100644 index 1833f7cc7..000000000 --- a/app/cockpit/ui/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id("kotlin-js.base-conventions") -} - -fun kotlinw(target: String): String = - "org.jetbrains.kotlin-wrappers:kotlin-$target" - -dependencies { - commonMainImplementation(project(":anvil-domain")) - commonMainImplementation(libs.redux) - jsMainImplementation(enforcedPlatform(kotlinw("wrappers-bom:1.0.0-pre.480"))) - - jsMainImplementation(kotlinw("react")) - jsMainImplementation(kotlinw("react-dom")) - jsMainImplementation(kotlinw("react-router-dom")) - - jsMainImplementation(kotlinw("emotion")) - jsMainImplementation(kotlinw("mui")) - jsMainImplementation(kotlinw("mui-icons")) - - jsMainImplementation(npm("date-fns", "2.29.3")) - jsMainImplementation(npm("@date-io/date-fns", "2.16.0")) - jsMainImplementation(npm("uuid", "9.0.0")) - jsMainImplementation(npm("is-sorted", "1.0.5")) -} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt deleted file mode 100644 index 9510b3b67..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/App.kt +++ /dev/null @@ -1,57 +0,0 @@ -package org.anvilpowered.anvil.ui - -import csstype.number -import csstype.px -import js.core.jso -import mui.material.Box -import mui.material.CssBaseline -import mui.material.PaletteMode -import mui.material.Toolbar -import mui.material.styles.ThemeProvider -import mui.material.styles.createTheme -import mui.system.sx -import org.sourcegrade.kontour.Crypto -import react.FC -import react.Props -import react.create -import react.dom.client.createRoot -import react.router.dom.HashRouter -import web.dom.document -import web.html.HTML.div - -fun main() { - println("UUID_a: ${Crypto.randomUUID()}") - - val root = document.createElement(div) - .also { document.body.appendChild(it) } - - createRoot(root) - .render(App.create()) -} - -private val darkTheme = createTheme( - jso { - palette = jso { - mode = PaletteMode.dark - } - }, -) - -private val App = FC { - // TODO: Convert to BrowserRouter and figure out how to fix webpack for SPA - HashRouter { - ThemeProvider { - theme = darkTheme - CssBaseline() - Menu() - Box { - sx { - flexGrow = number(1.0) - marginLeft = drawerWidth.px - } - Toolbar() - Routing() - } - } - } -} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt deleted file mode 100644 index 7dd3671e3..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Menu.kt +++ /dev/null @@ -1,72 +0,0 @@ -package org.anvilpowered.anvil.ui - -import csstype.BoxSizing -import csstype.minus -import csstype.pct -import csstype.px -import mui.material.AppBar -import mui.material.Drawer -import mui.material.DrawerAnchor -import mui.material.DrawerVariant -import mui.material.ListItemIcon -import mui.material.ListItemText -import mui.material.MenuItem -import mui.material.MenuList -import mui.material.Toolbar -import mui.material.Typography -import mui.material.styles.TypographyVariant -import mui.system.sx -import org.anvilpowered.anvil.ui.component.SectionTypography -import react.FC -import react.Props -import react.ReactNode -import react.router.useNavigate -import mui.icons.material.Dashboard as DashboardIcon -import mui.icons.material.Storage as StorageIcon - -val drawerWidth = 240 - -val Menu = FC { - - val nav = useNavigate() - - AppBar { - sx { - width = 100.pct - drawerWidth.px - marginLeft = drawerWidth.px - } - Toolbar { - Typography { - variant = TypographyVariant.h6 - +"Anvil Dashboard" - } - } - } - Drawer { - sx { - width = drawerWidth.px - "& .MuiDrawer-paper" { - width = drawerWidth.px - boxSizing = BoxSizing.borderBox - } - } - variant = DrawerVariant.permanent - anchor = DrawerAnchor.left - Toolbar() - SectionTypography { - text = "Home" - } - MenuList { - MenuItem { - onClick = { nav("/dashboard") } - ListItemIcon { DashboardIcon() } - ListItemText { primary = ReactNode("Dashboard") } - } - MenuItem { - onClick = { nav("/servers") } - ListItemIcon { StorageIcon() } - ListItemText { primary = ReactNode("Servers") } - } - } - } -} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt deleted file mode 100644 index 518c960ef..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/Routing.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.anvilpowered.anvil.ui - -import mui.material.Typography -import org.anvilpowered.anvil.ui.page.dashboard.DashboardHome -import org.anvilpowered.anvil.ui.page.servers.ServersCreate -import org.anvilpowered.anvil.ui.page.servers.ServersHome -import react.FC -import react.Props -import react.create -import react.router.Navigate -import react.router.Route -import react.router.Routes - -val Routing = FC { - Routes { - Route { - path = "/dashboard" - element = DashboardHome.create() - } - Route { - path = "/servers" - element = ServersHome.create() - } - Route { - path = "/servers/create" - element = ServersCreate.create() - } - Route { - path = "/" - element = Navigate.create { - to = "/dashboard" - } - } - Route { - path = "*" - element = Typography.create { +"404 page not found" } - } - } -} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt deleted file mode 100644 index 94ce67cec..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/SearchBox.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.anvilpowered.anvil.ui.component - -import csstype.AlignItems -import csstype.Display -import csstype.LineStyle -import csstype.NamedColor -import csstype.ch -import csstype.px -import mui.material.InputBase -import mui.material.Paper -import mui.material.styles.Theme -import mui.material.styles.create -import mui.material.styles.useTheme -import mui.system.PropsWithSx -import mui.system.sx -import react.FC -import mui.icons.material.Search as SearchIcon - -val SearchBox = FC { - - val theme = useTheme() - - Paper { - sx { - display = Display.flex - alignItems = AlignItems.center - padding = 3.px - borderColor = NamedColor.gray - borderWidth = 1.px - borderStyle = LineStyle.solid - borderRadius = 8.px - } - SearchIcon() - InputBase { - sx { - width = 20.ch - transition = theme.transitions.create("width") { - easing = theme.transitions.easing.easeIn - duration = theme.transitions.duration.shortest - } - focusWithin { - width = 34.ch - } - } - placeholder = "Search..." - } - } -} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt deleted file mode 100644 index 48f3ee737..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/component/Sidebar.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.anvilpowered.anvil.ui.component - -import csstype.em -import mui.material.Typography -import mui.material.styles.TypographyVariant -import mui.system.sx -import react.FC -import react.Props - -external interface SectionTypographyProps : Props { - var text: String -} - -val SectionTypography = FC { - Typography { - sx { paddingLeft = 1.em } - variant = TypographyVariant.overline - noWrap = true - +it.text - } -} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt deleted file mode 100644 index 4912c8c82..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/dashboard/Home.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.anvilpowered.anvil.ui.page.dashboard - -import mui.material.Typography -import react.FC -import react.Props - -val DashboardHome = FC { - Typography { - paragraph = true - +""" - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod - tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non - enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus - imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. - Convallis convallis tellus id interdum velit laoreet id donec ultrices. - Odio morbi quis commodo odio aenean sed adipiscing. Amet nisl suscipit - adipiscing bibendum est ultricies integer quis. Cursus euismod quis viverra - nibh cras. Metus vulputate eu scelerisque felis imperdiet proin fermentum - leo. Mauris commodo quis imperdiet massa tincidunt. Cras tincidunt lobortis - feugiat vivamus at augue. At augue eget arcu dictum varius duis at - consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa - sapien faucibus et molestie ac. - """.trimIndent() - +""" - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod - tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non - enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus - imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. - Convallis convallis tellus id interdum velit laoreet id donec ultrices. - Odio morbi quis commodo odio aenean sed adipiscing. Amet nisl suscipit - adipiscing bibendum est ultricies integer quis. Cursus euismod quis viverra - nibh cras. Metus vulputate eu scelerisque felis imperdiet proin fermentum - leo. Mauris commodo quis imperdiet massa tincidunt. Cras tincidunt lobortis - feugiat vivamus at augue. At augue eget arcu dictum varius duis at - consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa - sapien faucibus et molestie ac. - """.trimIndent() - } -} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt deleted file mode 100644 index d518eaecb..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Create.kt +++ /dev/null @@ -1,198 +0,0 @@ -package org.anvilpowered.anvil.ui.page.servers - -import csstype.AlignItems -import csstype.Auto -import csstype.Display -import csstype.JustifyContent -import csstype.em -import csstype.number -import csstype.pct -import csstype.px -import js.core.jso -import mui.icons.material.ArrowBack -import mui.material.Alert -import mui.material.AlertColor -import mui.material.Box -import mui.material.Button -import mui.material.ButtonVariant -import mui.material.Card -import mui.material.CardActions -import mui.material.CardContent -import mui.material.CircularProgress -import mui.material.Container -import mui.material.Divider -import mui.material.IconButton -import mui.material.Snackbar -import mui.material.SnackbarOriginHorizontal -import mui.material.SnackbarOriginVertical -import mui.material.SvgIconColor -import mui.material.TextField -import mui.material.Toolbar -import mui.material.Typography -import mui.material.styles.TypographyVariant -import mui.system.sx -import react.FC -import react.Props -import react.ReactNode -import react.dom.onChange -import react.router.useNavigate -import react.useState -import web.navigator.navigator -import kotlin.random.Random -import kotlin.random.nextUInt -import mui.icons.material.Check as CheckIcon -import mui.icons.material.Close as CloseIcon - -val ServersCreate = FC { - - val nav = useNavigate() - var isValidName by useState() - var isNameDirty by useState(false) - var generatedConnectionString by useState() - var copySnackOpen by useState(false) - val random by useState(Random(1)) - - Toolbar { - sx { - display = Display.flex - gap = 16.px - } - Typography { - sx { - flexGrow = number(1.0) - } - variant = TypographyVariant.overline - +"Create Server" - } - IconButton { - onClick = { nav("/servers") } - ArrowBack() - } - } - - Divider() - - Container { - maxWidth = "lg" - Box { - sx { - margin = 2.em - } - Typography { - variant = TypographyVariant.h5 - +"Step 1: Server Information" - } - Divider { - sx { - marginTop = 1.em - marginBottom = 2.em - } - } - Box { - sx { - display = Display.flex - alignItems = AlignItems.center - gap = 1.em - marginBottom = 2.em - } - TextField { - id = "server-name" - label = ReactNode("Server Name") - onChange = { - isValidName = it.target.asDynamic().value.length > 0 - } - } - when { - isValidName == true -> CheckIcon { color = SvgIconColor.success } - isNameDirty && isValidName == false -> CloseIcon() - isNameDirty && isValidName == null -> CircularProgress() - } - Box { - sx { - flexGrow = number(1.0) - } - } - Button { - variant = ButtonVariant.outlined - disabled = isValidName != true - onClick = { - generatedConnectionString = random.nextUInt().toString() - } - if (generatedConnectionString == null) { - +"Generate Connection String" - } else { - +"Regenerate Connection String" - } - } - } - - Typography { - variant = TypographyVariant.h5 - +"Step 2: Copy Connection String" - } - Divider { - sx { - marginTop = 1.em - marginBottom = 2.em - } - } - - Card { - sx { - marginTop = 2.em - width = 100.pct - } - CardContent { - sx { - height = 120.px - } - Typography { - variant = TypographyVariant.overline - +"Connection String" - } - generatedConnectionString?.let { - Box { - sx { - display = Display.flex - justifyContent = JustifyContent.center - } - Typography { - variant = TypographyVariant.h5 - +it - } - } - } - } - CardActions { - Button { - sx { - marginLeft = Auto.auto - } - variant = ButtonVariant.outlined - disabled = generatedConnectionString == null - generatedConnectionString?.let { cs -> - onClick = { - navigator.clipboard.writeText(cs) - copySnackOpen = true - } - } - +"Copy" - } - } - } - } - } - Snackbar { - anchorOrigin = jso { - vertical = SnackbarOriginVertical.bottom - horizontal = SnackbarOriginHorizontal.center - } - open = copySnackOpen - autoHideDuration = 2000 - onClose = { _, _ -> copySnackOpen = false } - Alert { - severity = AlertColor.success - +"Copied to clipboard!" - } - } -} diff --git a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt b/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt deleted file mode 100644 index 777bb5e1c..000000000 --- a/app/cockpit/ui/src/jsMain/kotlin/org/anvilpowered/anvil/ui/page/servers/Home.kt +++ /dev/null @@ -1,81 +0,0 @@ -package org.anvilpowered.anvil.ui.page.servers - -import csstype.Display -import csstype.number -import csstype.px -import mui.material.IconButton -import mui.material.Paper -import mui.material.Table -import mui.material.TableBody -import mui.material.TableCell -import mui.material.TableCellAlign -import mui.material.TableContainer -import mui.material.TableHead -import mui.material.TableRow -import mui.material.Toolbar -import mui.material.Typography -import mui.material.styles.TypographyVariant -import mui.system.sx -import org.anvilpowered.anvil.domain.system.Server -import org.anvilpowered.anvil.ui.component.SearchBox -import react.FC -import react.Props -import react.router.useNavigate -import mui.icons.material.Add as AddIcon - -private data class ServerImpl( - override val id: String, - override val playerCount: Int, - override val maxPlayerCount: Int, -) : Server - -val demoData = listOf( - ServerImpl("Spawn", 5, 150), - ServerImpl("Wild 1", 17, 100), - ServerImpl("Wild 2", 23, 100), - ServerImpl("Wild 3", 39, 100), - ServerImpl("Wild 4", 24, 100), -) - -val ServersHome = FC { - - val nav = useNavigate() - - Toolbar { - sx { - display = Display.flex - gap = 16.px - } - Typography { - sx { - flexGrow = number(1.0) - } - variant = TypographyVariant.overline - +"Servers" - } - SearchBox() - IconButton { - onClick = { nav("/servers/create") } - AddIcon() - } - } - TableContainer { - component = Paper - Table { - TableHead { - TableRow { - TableCell { +"Server Name" } - TableCell { align = TableCellAlign.right; +"Players" } - } - } - TableBody { - demoData.forEach { server -> - TableRow { - TableCell { +server.id } - TableCell { align = TableCellAlign.right; +"${server.playerCount}/${server.maxPlayerCount}" } - } - } - } - } - } -} diff --git a/app/cockpit/ui/src/jsMain/resources/index.html b/app/cockpit/ui/src/jsMain/resources/index.html deleted file mode 100644 index 1e65671f9..000000000 --- a/app/cockpit/ui/src/jsMain/resources/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Kotlin MUI Showcase - - - - - - diff --git a/app/plugin/build.gradle.kts b/app/plugin/build.gradle.kts index f0bc6ddd1..13f9e2439 100644 --- a/app/plugin/build.gradle.kts +++ b/app/plugin/build.gradle.kts @@ -1,14 +1,11 @@ -@file:Suppress("UnstableApiUsage") - plugins { - id("kotlin-jvm.base-conventions") alias(libs.plugins.shadow) } dependencies { - commonMainImplementation(project(":anvil-app-plugin-paper")) - commonMainImplementation(project(":anvil-app-plugin-sponge")) - commonMainImplementation(project(":anvil-app-plugin-velocity")) + implementation(project(":anvil-app-plugin-paper")) + implementation(project(":anvil-app-plugin-sponge")) + implementation(project(":anvil-app-plugin-velocity")) } tasks { diff --git a/app/plugin/core/build.gradle.kts b/app/plugin/core/build.gradle.kts index c33322193..5dee6c2ac 100644 --- a/app/plugin/core/build.gradle.kts +++ b/app/plugin/core/build.gradle.kts @@ -1,11 +1,7 @@ -plugins { - id("kotlin-jvm.base-conventions") -} - dependencies { - commonMainApi(project(":anvil-api")) - jvmMainApi(platform(libs.adventure.bom)) - jvmMainApi("net.kyori:adventure-api") // TODO: -> compileOnlyApi ASAP + api(project(":anvil-api")) + api(platform(libs.adventure.bom)) + api("net.kyori:adventure-api") // TODO: -> compileOnlyApi ASAP // compileOnlyApi(libs.logging.api) - commonMainApi(libs.kbrig.core) + api(libs.kbrig.core) } diff --git a/app/plugin/paper/build.gradle.kts b/app/plugin/paper/build.gradle.kts index 6997042e8..410816522 100644 --- a/app/plugin/paper/build.gradle.kts +++ b/app/plugin/paper/build.gradle.kts @@ -1,14 +1,13 @@ plugins { - id("kotlin-jvm.base-conventions") alias(libs.plugins.shadow) alias(libs.plugins.pluginyml) } dependencies { - commonMainImplementation(project(":anvil-app-plugin-core")) - commonMainImplementation(project(":anvil-paper")) - jvmMainCompileOnly(libs.brigadier) - jvmMainCompileOnly(libs.paper) + implementation(project(":anvil-app-plugin-core")) + implementation(project(":anvil-paper")) + compileOnly(libs.brigadier) + compileOnly(libs.paper) } paper { diff --git a/app/plugin/sponge/build.gradle.kts b/app/plugin/sponge/build.gradle.kts index 2d50ac8d2..ff047b646 100644 --- a/app/plugin/sponge/build.gradle.kts +++ b/app/plugin/sponge/build.gradle.kts @@ -1,7 +1,6 @@ import org.spongepowered.gradle.plugin.config.PluginLoaders plugins { - id("kotlin-jvm.base-conventions") alias(libs.plugins.sponge) alias(libs.plugins.shadow) } @@ -13,9 +12,9 @@ repositories { } dependencies { - commonMainImplementation(project(":anvil-app-plugin-core")) - commonMainImplementation(project(":anvil-sponge")) - jvmMainCompileOnly(libs.brigadier) + implementation(project(":anvil-app-plugin-core")) + implementation(project(":anvil-sponge")) + compileOnly(libs.brigadier) } sponge { diff --git a/app/plugin/velocity/build.gradle.kts b/app/plugin/velocity/build.gradle.kts index 55577fbed..ff0c12f5e 100644 --- a/app/plugin/velocity/build.gradle.kts +++ b/app/plugin/velocity/build.gradle.kts @@ -1,12 +1,11 @@ plugins { - id("kotlin-jvm.base-conventions") kotlin("kapt") } dependencies { - commonMainImplementation(project(":anvil-app-plugin-core")) - commonMainImplementation(project(":anvil-velocity")) - jvmMainCompileOnly(libs.velocity) + implementation(project(":anvil-app-plugin-core")) + implementation(project(":anvil-velocity")) + compileOnly(libs.velocity) kapt(libs.velocity) - commonMainImplementation(libs.kbrig.brigadier) + implementation(libs.kbrig.brigadier) } diff --git a/build-logic/src/main/kotlin/anvil-publish.gradle.kts b/build-logic/src/main/kotlin/anvil-publish.gradle.kts index 0b636324a..a9229cd7a 100644 --- a/build-logic/src/main/kotlin/anvil-publish.gradle.kts +++ b/build-logic/src/main/kotlin/anvil-publish.gradle.kts @@ -16,7 +16,8 @@ extensions.configure { url = URI(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl) } } - publications.withType { + publications.register("maven") { + from(components["java"]) pom { name.set("anvil") url.set("https://www.anvilpowered.org") diff --git a/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts b/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts deleted file mode 100644 index a40e0e951..000000000 --- a/build-logic/src/main/kotlin/kotlin-js.base-conventions.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension - -extensions.getByName("kotlin").apply { - js(IR) { - browser() - binaries.executable() - useCommonJs() - } -} diff --git a/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts b/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts deleted file mode 100644 index f166b60f2..000000000 --- a/build-logic/src/main/kotlin/kotlin-jvm.base-conventions.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension - -extensions.getByName("kotlin").apply { - jvmToolchain(17) - jvm { - withJava() - compilations.all { - kotlinOptions.jvmTarget = "17" - } - } -} diff --git a/build.gradle.kts b/build.gradle.kts index 2b1b0b993..7e4bd2519 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,12 @@ plugins { - alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.kotlin.jvm) alias(libs.plugins.ktlint) - id("kotlin-jvm.base-conventions") } val projectVersion = file("version").readLines().first() allprojects { - apply(plugin = "org.jetbrains.kotlin.multiplatform") + apply(plugin = "org.jetbrains.kotlin.jvm") apply(plugin = "org.jlleitschuh.gradle.ktlint") group = "org.anvilpowered" version = projectVersion @@ -15,15 +14,11 @@ allprojects { ?.takeIf { version.toString().contains("SNAPSHOT") } ?.also { version = version.toString().replace("SNAPSHOT", "RC$it") } kotlin { - targets.all { - compilations.all { - kotlinOptions { - freeCompilerArgs += listOf( - "-opt-in=kotlin.RequiresOptIn", - "-Xcontext-receivers", - ) - } - } + compilerOptions { + freeCompilerArgs = listOf( + "-opt-in=kotlin.RequiresOptIn", + "-Xcontext-receivers", + ) } } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index ac6a2b377..2a4fcca5d 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,11 +1,16 @@ plugins { - id("kotlin-jvm.base-conventions") - id("kotlin-js.base-conventions") id("anvil-publish") + `java-library` } dependencies { - commonMainApi(project(":anvil-api")) - jvmMainApi(platform(libs.exposed.bom)) - jvmMainApi(libs.bundles.exposed) + api(project(":anvil-api")) + + api(platform(libs.exposed.bom)) + api(libs.bundles.exposed) + + compileOnlyApi(platform(libs.adventure.bom)) + compileOnlyApi("net.kyori:adventure-api") + + api(libs.kontour) } diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/user/UserManagerImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/user/UserManagerImpl.kt deleted file mode 100644 index a4dc1c4ba..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/user/UserManagerImpl.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.core.user - -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.api.user.UserManager -import org.sourcegrade.kontour.UUID - -context(AnvilApi) -class UserManagerImpl : UserManager { - override suspend fun ensureExists(gameUserId: UUID) { - } -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryExtensions.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryExtensions.kt deleted file mode 100644 index f19249ac2..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryExtensions.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db - -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.Table -import org.jetbrains.exposed.sql.insert -import org.jetbrains.exposed.sql.statements.InsertStatement -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.DomainEntity - -internal suspend fun newSaveTransaction( - table: T, - toTable: context(T) InsertStatement.() -> Unit, - toEntity: ResultRow.() -> E, -): E { - val fromDB = newSuspendedTransaction { - table.insert { toTable(it) } - }.resultedValues?.firstOrNull()?.toEntity() - checkNotNull(fromDB) { "Failed to save entity" } - return fromDB -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt deleted file mode 100644 index 6660d5f0c..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/RepositoryScopeImpl.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db - -import org.anvilpowered.anvil.db.system.ServerNodeRepositoryImpl -import org.anvilpowered.anvil.db.user.DiscordUserRepositoryImpl -import org.anvilpowered.anvil.db.user.GameUserRepositoryImpl -import org.anvilpowered.anvil.db.user.UserRepositoryImpl -import org.anvilpowered.anvil.domain.RepositoryScope -import org.anvilpowered.anvil.domain.system.ServerNodeRepository -import org.anvilpowered.anvil.domain.user.DiscordUserRepository -import org.anvilpowered.anvil.domain.user.GameUserRepository -import org.anvilpowered.anvil.domain.user.UserRepository - -object RepositoryScopeImpl : RepositoryScope { - override val discordUserRepository: DiscordUserRepository - get() = DiscordUserRepositoryImpl - override val gameUserRepository: GameUserRepository - get() = GameUserRepositoryImpl - override val userRepository: UserRepository - get() = UserRepositoryImpl - override val serverNodeRepository: ServerNodeRepository - get() = ServerNodeRepositoryImpl -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt deleted file mode 100644 index fb9784308..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeRepositoryImpl.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.system - -import org.anvilpowered.anvil.domain.system.ServerNode -import org.anvilpowered.anvil.domain.system.ServerNodeRepository -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.Dto -import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.UUID -import kotlin.reflect.KClass - -internal object ServerNodeRepositoryImpl : ServerNodeRepository { - - override suspend fun exists(id: UUID): Boolean = - newSuspendedTransaction { ServerNodeEntity.findById(id) != null } - - override suspend fun findByGameType(): GameTypeJoin> = GameTypeJoinImpl - override suspend fun countAll(): Long = newSuspendedTransaction { ServerNodeEntity.all().count() } - - override suspend fun create(item: ServerNode.CreateDto): ServerNode = TODO() - override suspend fun > findDtoById(id: UUID, dtoType: KClass): D? { - TODO("Not yet implemented") - } - - override suspend fun deleteById(id: UUID): Boolean = - newSuspendedTransaction { ServerNodeTable.deleteWhere { ServerNodeTable.id eq id } > 0 } - - private object GameTypeJoinImpl : GameTypeJoin> { - override suspend fun id(id: UUID): SizedIterable = - newSuspendedTransaction { -// val t= (ServerNodeTable innerJoin GameTypes).select { GameTypes.id eq id }.mapLazy { it.toServerNode() } - - (GameTypeEntity.findById(id) ?: throw NoSuchElementException()) - .serverNodes - - TODO() - } - - override suspend fun name(name: String): SizedIterable = - newSuspendedTransaction { -// (ServerNodeTable innerJoin GameTypes).select { GameTypes.name eq name }.mapLazy { it.toServerNode() } - TODO() - } - - override suspend fun website(website: String): SizedIterable = - newSuspendedTransaction { -// (ServerNodeTable innerJoin GameTypes).select { GameTypes.website eq website }.mapLazy { it.toServerNode() } - TODO() - } - } -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt deleted file mode 100644 index 350386332..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/system/ServerNodeTable.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.system - -import org.jetbrains.exposed.dao.UUIDEntity -import org.jetbrains.exposed.dao.UUIDEntityClass -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.dao.id.UUIDTable -import org.sourcegrade.kontour.UUID - -internal object ServerNodeTable : UUIDTable("server_nodes") { - val name = varchar("name", 255).uniqueIndex() - val gameTypeId = reference("game_type_id", GameTypeTable) -} - -internal class ServerNodeEntity(id: EntityID) : UUIDEntity(id) { - var name by ServerNodeTable.name - var gameTypeId by ServerNodeTable.gameTypeId - var gameType by GameTypeEntity referencedOn ServerNodeTable.gameTypeId - - companion object : UUIDEntityClass(ServerNodeTable) -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt deleted file mode 100644 index cccc10052..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserRepositoryImpl.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.user - -import org.anvilpowered.anvil.domain.user.DiscordUser -import org.anvilpowered.anvil.domain.user.DiscordUserRepository -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.UUID - -object DiscordUserRepositoryImpl : DiscordUserRepository { - override suspend fun countAll(): Long = newSuspendedTransaction { DiscordUserEntity.all().count() } - - override suspend fun create(item: DiscordUser): DiscordUser = newSuspendedTransaction { - DiscordUserEntity.new(item.id) { - discordId = item.discordId - } - item - } - - override suspend fun exists(id: UUID): Boolean = newSuspendedTransaction { - DiscordUserEntity.findById(id) != null - } - - override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { - DiscordUserTable.deleteWhere { DiscordUserTable.id eq id } > 0 - } -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt deleted file mode 100644 index 9cfbaace8..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/DiscordUserTable.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.user - -import org.jetbrains.exposed.dao.UUIDEntity -import org.jetbrains.exposed.dao.UUIDEntityClass -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.dao.id.UUIDTable -import java.util.UUID - -internal object DiscordUserTable : UUIDTable("discord_users") { - val discordId = ulong("discord_id").uniqueIndex() -} - -internal class DiscordUserEntity(id: EntityID) : UUIDEntity(id) { - var discordId by DiscordUserTable.discordId.transform({ it.toULong() }, { it.toString() }) - val user: UserEntity by UserEntity referencedOn DiscordUserTable.id - - companion object : UUIDEntityClass(DiscordUserTable) -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt deleted file mode 100644 index 01062db26..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserRepositoryImpl.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.user - -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.GameUserRepository -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.mapLazy -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.SizedIterable -import org.sourcegrade.kontour.UUID - -object GameUserRepositoryImpl : GameUserRepository { - override suspend fun getAllUserNames(startWith: String): SizedIterable = newSuspendedTransaction { - GameUserEntity.find { GameUserTable.username like "$startWith%" }.mapLazy { it.username } - } - - override suspend fun findByUsername(username: String): GameUser? = newSuspendedTransaction { - GameUserTable.select { GameUserTable.username eq username } - .firstOrNull() - ?.toGameUser() - } - - override suspend fun countAll(): Long = newSuspendedTransaction { - GameUserEntity.all().count() - } - - override suspend fun create(item: GameUser): GameUser = newSuspendedTransaction { - GameUserEntity.new(item.id) { - user = UserEntity[item.userId] - gameType = item.gameType - username = item.username - } - item - } - - override suspend fun exists(id: UUID): Boolean = - newSuspendedTransaction { GameUserEntity.findById(id) != null } - - override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { - GameUserTable.deleteWhere { GameUserTable.id eq id } > 0 - } -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt deleted file mode 100644 index 6e8191fe7..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/GameUserTable.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.user - -import org.anvilpowered.anvil.domain.user.GameUser -import org.jetbrains.exposed.dao.UUIDEntity -import org.jetbrains.exposed.dao.UUIDEntityClass -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.dao.id.UUIDTable -import org.jetbrains.exposed.sql.ResultRow -import org.sourcegrade.kontour.UUID - -internal object GameUserTable : UUIDTable("game_users") { - val userId = reference("user_id", UserTable) - val username = varchar("username", 255).uniqueIndex() - val gameType = varchar("game_type", 255) - val nickname = varchar("nickname", 255).nullable() -} - -internal class GameUserEntity(id: EntityID) : UUIDEntity(id) { - var user: UserEntity by UserEntity referencedOn GameUserTable.userId - var username: String by GameUserTable.username - var gameType: String by GameUserTable.gameType - var nickname: String? by GameUserTable.nickname - - companion object : UUIDEntityClass(GameUserTable) -} - -internal fun ResultRow.toGameUser() = GameUser( - id = this[GameUserTable.id].value, - userId = this[GameUserTable.userId].value, - username = this[GameUserTable.username], - gameType = this[GameUserTable.gameType], - nickname = this[GameUserTable.nickname] -) diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt deleted file mode 100644 index 7170688d5..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserRepositoryImpl.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.user - -import org.anvilpowered.anvil.domain.user.User -import org.anvilpowered.anvil.domain.user.UserRepository -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import org.sourcegrade.kontour.UUID - -object UserRepositoryImpl : UserRepository { - - override suspend fun initializeFromGameUser( - gameUserId: UUID, - username: String, - ): User = newSuspendedTransaction { - val userId = GameUserTable - .slice(listOf(GameUserTable.id, GameUserTable.userId)) - .select { GameUserTable.id eq gameUserId } - .firstOrNull() - ?.get(GameUserTable.userId) - - // if a game user exists, a user must also already exist - - userId?.let { - return@let User(it.value, username) - } - - // otherwise, create a new user and game user - - val user = UserEntity.new { - this.username = username - } - - GameUserEntity.new { - this.user = user - this.gameType - }.let { User(it.id.value, username) } - } - - override suspend fun findByGameUserId(id: UUID): User? = newSuspendedTransaction { - GameUserTable.innerJoin(UserTable) - .select { GameUserTable.id eq id } - .firstOrNull() - ?.toUser() - } - - override suspend fun findByUsername(username: String): User? = newSuspendedTransaction { - UserTable.select { UserTable.username eq username } - .firstOrNull() - ?.toUser() - } - - override suspend fun countAll(): Long = newSuspendedTransaction { UserEntity.all().count() } - - override suspend fun create(item: User.CreateDto): User = newSuspendedTransaction { - UserEntity.new { - username = item.username - }.let { User(it.id.value, item.username, item.email) } - } - - override suspend fun exists(id: UUID): Boolean = newSuspendedTransaction { - UserEntity.findById(id) != null - } - - override suspend fun deleteById(id: UUID): Boolean = newSuspendedTransaction { - UserTable.deleteWhere { UserTable.id eq id } > 0 - } -} diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt b/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt deleted file mode 100644 index c5034e3f7..000000000 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/db/user/UserTable.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.db.user - -import org.anvilpowered.anvil.domain.user.User -import org.jetbrains.exposed.dao.UUIDEntity -import org.jetbrains.exposed.dao.UUIDEntityClass -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.dao.id.UUIDTable -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.SizedIterable -import org.sourcegrade.kontour.UUID - -internal object UserTable : UUIDTable("users") { - val username = varchar("username", 255).uniqueIndex() - val email = varchar("email", 255).uniqueIndex().nullable() -} - -internal class UserEntity(id: EntityID) : UUIDEntity(id) { - var username: String by UserTable.username - var email: String? by UserTable.email - val gameUsers: SizedIterable by GameUserEntity referrersOn GameUserTable.userId - - companion object : UUIDEntityClass(UserTable) -} - -internal fun ResultRow.toUser() = User( - id = this[UserTable.id].value, - username = this[UserTable.username], - email = this[UserTable.email] -) diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/AnvilApi.kt similarity index 55% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/AnvilApi.kt index e38c37a0d..99fd5876d 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/RepositoryScope.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/AnvilApi.kt @@ -16,17 +16,30 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.domain +package org.anvilpowered.anvil -import org.anvilpowered.anvil.domain.system.ServerNodeRepository -import org.anvilpowered.anvil.domain.user.DiscordUserRepository -import org.anvilpowered.anvil.domain.user.GameUserRepository -import org.anvilpowered.anvil.domain.user.UserRepository +import org.anvilpowered.anvil.platform.Platform +import org.anvilpowered.anvil.platform.PluginManager + +/** + * To create an instance of this interface, use the `AnvilApi.create` function. + * This is available for each platform in the corresponding `anvil-core-game-` module. + * + * Generally, the method will look something like this: + * ```kt + * AnvilApi.create<<>>("my-plugin", ....) + * ``` + * + * For example, for Velocity: + * + * ```kt + * AnvilApi.createVelocity("my-plugin", ....) + * ``` + */ +interface AnvilApi : LoggerScope, RepositoryScope { + val platform: Platform + + val pluginManager: PluginManager -interface RepositoryScope { - val discordUserRepository: DiscordUserRepository - val gameUserRepository: GameUserRepository - val userRepository: UserRepository - val serverNodeRepository: ServerNodeRepository companion object } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt b/core/src/main/kotlin/org/anvilpowered/anvil/LoggerScope.kt similarity index 75% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/LoggerScope.kt index 11772c792..6ad905c2e 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserFacet.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/LoggerScope.kt @@ -16,11 +16,14 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.domain.user +package org.anvilpowered.anvil -interface UserFacet { - - suspend fun getUserOrNull(): User? - - suspend fun getUser(): User = getUserOrNull() ?: throw IllegalStateException("User not found") +interface LoggerScope { +// val logger: KmLog +// +// companion object { +// fun create(name: String): LoggerScope = object : LoggerScope { +// override val logger: KmLog = logging(name) +// } +// } } diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeService.kt b/core/src/main/kotlin/org/anvilpowered/anvil/RepositoryScope.kt similarity index 74% rename from api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeService.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/RepositoryScope.kt index a21fbd1a3..6de907d07 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/system/GameTypeService.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/RepositoryScope.kt @@ -16,9 +16,12 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.api.system +package org.anvilpowered.anvil -interface GameTypeService { - - fun getCurrentGameType(): String +interface RepositoryScope { +// val discordUserRepository: DiscordUserRepository +// val gameUserRepository: GameUserRepository +// val userRepository: UserRepository +// val serverNodeRepository: ServerNodeRepository + companion object } diff --git a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt b/core/src/main/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt similarity index 85% rename from core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt index 548146750..5c5005d90 100644 --- a/core/src/jvmMain/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.core.entity +package org.anvilpowered.anvil.entity import org.jetbrains.exposed.dao.id.UUIDTable diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatform.kt b/core/src/main/kotlin/org/anvilpowered/anvil/platform/GamePlatform.kt similarity index 66% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatform.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/platform/GamePlatform.kt index f5ff60975..5b799f7a6 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/GamePlatform.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/platform/GamePlatform.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.domain.platform +package org.anvilpowered.anvil.platform interface GamePlatform : Platform { val isProxy: Boolean diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Platform.kt b/core/src/main/kotlin/org/anvilpowered/anvil/platform/Platform.kt similarity index 94% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Platform.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/platform/Platform.kt index b7d05c567..8a7e7e7c5 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Platform.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/platform/Platform.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.domain.platform +package org.anvilpowered.anvil.platform interface Platform { val name: String diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/platform/Plugin.kt b/core/src/main/kotlin/org/anvilpowered/anvil/platform/Plugin.kt new file mode 100644 index 000000000..a39bddb47 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/platform/Plugin.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.platform + +interface Plugin { + val name: String +} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt b/core/src/main/kotlin/org/anvilpowered/anvil/platform/PluginManager.kt similarity index 94% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/platform/PluginManager.kt index f5f9dbdc5..7cdb7bf6e 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/PluginManager.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/platform/PluginManager.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.domain.platform +package org.anvilpowered.anvil.platform interface PluginManager { val plugins: List diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/Server.kt b/core/src/main/kotlin/org/anvilpowered/anvil/system/Server.kt similarity index 67% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/Server.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/system/Server.kt index 9315b2754..175e9ee75 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/Server.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/system/Server.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.domain.system +package org.anvilpowered.anvil.system interface Server { val id: String diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt b/core/src/main/kotlin/org/anvilpowered/anvil/system/ServerNode.kt similarity index 96% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/system/ServerNode.kt index e3afeeb35..1b85be0c8 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNode.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/system/ServerNode.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.domain.system +package org.anvilpowered.anvil.system import org.sourcegrade.kontour.Creates import org.sourcegrade.kontour.DomainEntity diff --git a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserManager.kt b/core/src/main/kotlin/org/anvilpowered/anvil/user/Player.kt similarity index 84% rename from api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserManager.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/user/Player.kt index abae20ba5..7641ed07d 100644 --- a/api/src/commonMain/kotlin/org/anvilpowered/anvil/api/user/UserManager.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/user/Player.kt @@ -16,11 +16,12 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.api.user +package org.anvilpowered.anvil.user -import org.sourcegrade.kontour.UUID +import net.kyori.adventure.audience.Audience -interface UserManager { - - suspend fun ensureExists(gameUserId: UUID) +/** + * An online player. + */ +interface Player : Subject, Audience { } diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt b/core/src/main/kotlin/org/anvilpowered/anvil/user/Subject.kt similarity index 52% rename from domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/user/Subject.kt index 4498562fd..a32bd6bdc 100644 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/UserRepository.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/user/Subject.kt @@ -16,20 +16,20 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.domain.user +package org.anvilpowered.anvil.user -import org.sourcegrade.kontour.Repository -import org.sourcegrade.kontour.UUID +interface Subject { -interface UserRepository : Repository { /** - * This method is used to initialize a user from a game user. - * If a game user with the given ID does not exist, it will be created. - * Call this to ensure that the given game user has a corresponding user in the database. + * Checks if the subject has the specified permission. * - * This method is idempotent. + * - A value of `true` indicates that the subject has the permission explicitly set. + * - A value of `false` indicates that the subject has the permission explicitly set to false. + * - A value of `null` indicates that the subject does not have the permission explicitly set. */ - suspend fun initializeFromGameUser(gameUserId: UUID, username: String): User - suspend fun findByGameUserId(id: UUID): User? - suspend fun findByUsername(username: String): User? + fun hasPermission(permission: String): Boolean? } + +fun Subject.hasPermissionSet(permission: String): Boolean = hasPermission(permission) == true +fun Subject.hasPermissionUnset(permission: String): Boolean = hasPermission(permission) == null +fun Subject.hasPermissionNotSet(permission: String): Boolean = hasPermission(permission) == false diff --git a/core/src/jvmMain/resources/application.conf b/core/src/main/resources/application.conf similarity index 100% rename from core/src/jvmMain/resources/application.conf rename to core/src/main/resources/application.conf diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts deleted file mode 100644 index ea8fcfb4d..000000000 --- a/domain/build.gradle.kts +++ /dev/null @@ -1,20 +0,0 @@ -plugins { - id("kotlin-js.base-conventions") - id("kotlin-jvm.base-conventions") - id("anvil-publish") - `java-library` -} - -dependencies { - commonMainApi(libs.annotations) - commonMainApi(libs.kbrig.core) - commonMainApi(libs.kotlinx.datetime) - commonMainApi(libs.kontour) { - exclude("org.slf4j") - } - commonMainApi(libs.kotlinx.coroutines) - jvmMainApi(platform(libs.adventure.bom)) - jvmMainApi("net.kyori:adventure-api") - jvmMainApi("net.kyori:adventure-text-minimessage") - jsMainImplementation(npm("uuid", "9.0.0")) -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/GamePlatformScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/GamePlatformScope.kt deleted file mode 100644 index 961e4bde7..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/GamePlatformScope.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.anvilpowered.anvil.domain - -import org.anvilpowered.anvil.domain.user.GameUser - -/** - * The union of all scopes a platform should provide. - */ -interface GamePlatformScope : GameUser.GamePlatformScope { - companion object -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt deleted file mode 100644 index 3a0a97105..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/CommandSource.kt +++ /dev/null @@ -1,30 +0,0 @@ -package org.anvilpowered.anvil.domain.command - -import org.anvilpowered.anvil.domain.user.Audience -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import org.anvilpowered.anvil.domain.user.User -import org.anvilpowered.anvil.domain.user.UserFacet - -interface CommandSource : UserFacet { - - /** - * The [User] associated with the executed command, if any. - */ - override suspend fun getUserOrNull(): User? - - val audience: Audience - - val subject: Subject - - /** - * The [Player] associated with the executed command, if any. - */ - val player: Player? - - /** - * The [GameUser] user associated with the executed command, if any. - */ - val gameUser: GameUser? -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt deleted file mode 100644 index 0ad422b4a..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommandScope.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.domain.command - -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.kbrig.builder.ArgumentBuilder -import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder -import org.anvilpowered.kbrig.context.CommandContext - -interface GameUserCommandScope { - fun ArgumentBuilder.Companion.gameUser( - name: String = "gameUser", - command: suspend (context: CommandContext, gameUser: GameUser) -> Int, - ): RequiredArgumentBuilder -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt deleted file mode 100644 index f0e753664..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/command/PlayerCommandScope.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.anvilpowered.anvil.domain.command - -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.kbrig.builder.ArgumentBuilder -import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder -import org.anvilpowered.kbrig.context.CommandContext - -interface PlayerCommandScope { - - fun ArgumentBuilder.Companion.player( - name: String = "player", - command: (context: CommandContext, player: Player) -> Int, - ): RequiredArgumentBuilder -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Plugin.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Plugin.kt deleted file mode 100644 index a1e78735d..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/platform/Plugin.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.anvilpowered.anvil.domain.platform - -interface Plugin { - val name: String -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt deleted file mode 100644 index 6ac77eb95..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/system/ServerNodeRepository.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.domain.system - -import org.sourcegrade.kontour.Repository -import org.sourcegrade.kontour.SizedIterable - -interface ServerNodeRepository : Repository { - - suspend fun findByGameType(gameType: String): SizedIterable -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt deleted file mode 100644 index 7d97eb26f..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -expect interface Audience { - open fun sendMessage(message: Component) -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt deleted file mode 100644 index 5c90af21e..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -expect interface Component diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt deleted file mode 100644 index bd66b46db..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUser.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -data class DiscordUser( - override val id: UUID, - val discordId: String, -) : DomainEntity, Creates diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt deleted file mode 100644 index 813961ff2..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/DiscordUserRepository.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.domain.user - -import org.sourcegrade.kontour.Repository - -interface DiscordUserRepository : Repository diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt deleted file mode 100644 index b6fea3ac3..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUser.kt +++ /dev/null @@ -1,26 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -/** - * A user of a game of the Anvil platform. - * - * Represents a single user of a game. - */ -data class GameUser( - override val id: UUID, - val userId: UUID, - val username: String, - val gameType: String, - val nickname: String? = null, -) : DomainEntity, Creates { - - interface GamePlatformScope { // TODO: Maybe just GameScope? - - val GameUser.subject: Subject? - - val GameUser.player: Player? - } -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt deleted file mode 100644 index bdfd96d86..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/GameUserRepository.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.domain.user - -import org.sourcegrade.kontour.Repository -import org.sourcegrade.kontour.SizedIterable - -interface GameUserRepository : Repository { - - suspend fun getAllUserNames(startWith: String = ""): SizedIterable - - suspend fun findByUsername(username: String): GameUser? -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt deleted file mode 100644 index 9747e2d50..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Player.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -/** - * An online player. - */ -interface Player : UserFacet, Subject, Audience { - - val gameUser: GameUser -} diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Subject.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Subject.kt deleted file mode 100644 index 4634ed354..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/Subject.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -interface Subject { - - /** - * Checks if the subject has the specified permission. - * - * - A value of `true` indicates that the subject has the permission explicitly set. - * - A value of `false` indicates that the subject has the permission explicitly set to false. - * - A value of `null` indicates that the subject does not have the permission explicitly set. - */ - fun hasPermission(permission: String): Boolean? -} - -fun Subject.hasPermissionSet(permission: String): Boolean = hasPermission(permission) == true -fun Subject.hasPermissionUnset(permission: String): Boolean = hasPermission(permission) == null -fun Subject.hasPermissionNotSet(permission: String): Boolean = hasPermission(permission) == false diff --git a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt b/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt deleted file mode 100644 index a8eb15465..000000000 --- a/domain/src/commonMain/kotlin/org/anvilpowered/anvil/domain/user/User.kt +++ /dev/null @@ -1,32 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -/** - * A user of the Anvil platform. - * - * Represents a single universal user across all games and platforms. - */ -data class User( - override val id: UUID, - val username: String, - val email: String? = null, -) : DomainEntity { - - data class CreateDto( - val username: String, - val email: String? = null, - ) : Creates - - /** - * Operations scoped within a platform context. - */ - interface PlatformScope { - - val User.gameUser: GameUser - - val User.player: Player? - } -} diff --git a/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt b/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt deleted file mode 100644 index 51d2fac2a..000000000 --- a/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -actual interface Audience { - actual fun sendMessage(message: Component) { - } -} diff --git a/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt b/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt deleted file mode 100644 index 657c86b2a..000000000 --- a/domain/src/jsMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -actual interface Component diff --git a/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommands.kt b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommands.kt deleted file mode 100644 index a0fedb8e4..000000000 --- a/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/command/GameUserCommands.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.anvilpowered.anvil.domain.command - -import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.domain.RepositoryScope -import org.anvilpowered.anvil.domain.user.Component -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.kbrig.argument.StringArgumentType -import org.anvilpowered.kbrig.builder.ArgumentBuilder -import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder -import org.anvilpowered.kbrig.builder.executesSuspending -import org.anvilpowered.kbrig.context.CommandContext -import org.anvilpowered.kbrig.context.get - -context(RepositoryScope) -fun ArgumentBuilder.Companion.gameUser( - name: String, - command: suspend (context: CommandContext, gameUser: GameUser) -> Int, -): RequiredArgumentBuilder = - required(name, StringArgumentType.SingleWord) - .suggests { _, builder -> - gameUserRepository.getAllUserNames(startWith = builder.input).forEach { name -> builder.suggest(name) } - builder.build() - } - .executesSuspending { context -> - val gameUserName = context.get(name) - gameUserRepository.findByUsername(gameUserName)?.let { gameUser -> - command(context, gameUser) - } ?: run { - context.source.audience.sendMessage( - Component.text() - .append(Component.text("GameUser with name ", NamedTextColor.RED)) - .append(Component.text(gameUserName, NamedTextColor.GOLD)) - .append(Component.text(" not found!", NamedTextColor.RED)), - ) - 0 - } - } diff --git a/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt deleted file mode 100644 index 4dd300379..000000000 --- a/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Audience.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -actual typealias Audience = net.kyori.adventure.audience.Audience diff --git a/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt b/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt deleted file mode 100644 index fa080f581..000000000 --- a/domain/src/jvmMain/kotlin/org/anvilpowered/anvil/domain/user/Component.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.anvilpowered.anvil.domain.user - -actual typealias Component = net.kyori.adventure.text.Component diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 24abff4d2..16f671094 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] #kmongo = "4.8.0" -kotlin = "1.9.0" +kotlin = "1.9.10" ktor = "2.3.0" log4j = "2.20.0" @@ -45,7 +45,7 @@ ktor-server = ["ktor-server-auth", "ktor-server-content-negotiation", "ktor-serv [plugins] kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } -kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ktlint = "org.jlleitschuh.gradle.ktlint:11.3.1" pluginyml = "net.minecrell.plugin-yml.paper:0.6.0" diff --git a/paper/build.gradle.kts b/paper/build.gradle.kts index ab5ed5362..b7f6c5c75 100644 --- a/paper/build.gradle.kts +++ b/paper/build.gradle.kts @@ -1,10 +1,9 @@ plugins { - id("kotlin-jvm.base-conventions") id("anvil-publish") } dependencies { - commonMainImplementation(project(":anvil-core")) - commonMainImplementation(libs.kbrig.brigadier) - jvmMainCompileOnly(libs.paper) + implementation(project(":anvil-core")) + implementation(libs.kbrig.brigadier) + compileOnly(libs.paper) } diff --git a/sponge/build.gradle.kts b/sponge/build.gradle.kts index 318fb677f..79ed5f5da 100644 --- a/sponge/build.gradle.kts +++ b/sponge/build.gradle.kts @@ -1,10 +1,9 @@ plugins { - id("kotlin-jvm.base-conventions") id("anvil-publish") } dependencies { - commonMainImplementation(libs.kotlinx.coroutines) - commonMainImplementation(project(":anvil-core")) - jvmMainImplementation(libs.sponge) + implementation(libs.kotlinx.coroutines) + implementation(project(":anvil-core")) + implementation(libs.sponge) } diff --git a/velocity/build.gradle.kts b/velocity/build.gradle.kts index 86e9d8642..098748cb4 100644 --- a/velocity/build.gradle.kts +++ b/velocity/build.gradle.kts @@ -1,10 +1,9 @@ plugins { - id("kotlin-jvm.base-conventions") id("anvil-publish") } dependencies { - commonMainImplementation(project(":anvil-core")) - commonMainImplementation(libs.kbrig.brigadier) - jvmMainCompileOnly(libs.velocity) + implementation(project(":anvil-core")) + implementation(libs.kbrig.brigadier) + compileOnly(libs.velocity) } From 442547be9a1c5c8caa3243293cd1f7ecbdd63f76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 11 Nov 2023 13:36:50 +0100 Subject: [PATCH 38/77] Massive cleanup, it compiles again --- app/cli/build.gradle.kts | 3 -- app/plugin/core/build.gradle.kts | 6 +-- .../anvilpowered/anvil/plugin/AnvilPlugin.kt | 0 .../anvil/plugin/PluginMessages.kt | 0 .../anvil/plugin/command/AnvilCommand.kt | 2 +- .../anvil/plugin/command/common/Help.kt | 0 .../command/gameuser/GameUserCommand.kt | 6 +-- .../anvil/plugin/command/gameuser/Info.kt | 0 .../anvil/plugin/command/plugin/Info.kt | 0 .../anvil/plugin/command/plugin/List.kt | 0 .../plugin/command/plugin/PluginCommand.kt | 0 .../anvil/plugin/AnvilPaperPlugin.kt | 0 .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 0 .../anvil/plugin/AnvilSpongePlugin.kt | 2 +- .../plugin/AnvilSpongePluginBootstrap.kt | 0 .../anvil/plugin/AnvilVelocityPlugin.kt | 4 +- .../plugin/AnvilVelocityPluginBootstrap.kt | 2 +- build-logic/build.gradle.kts | 13 +++++++ .../src/main/kotlin/anvil-publish.gradle.kts | 5 +++ build.gradle.kts | 14 +++++++ core/build.gradle.kts | 5 +-- .../anvilpowered/anvil/{ => core}/AnvilApi.kt | 10 ++--- .../anvil/core/command/CommandSource.kt | 23 ++++++----- .../anvil/core/command/PlayerCommandScope.kt | 32 +++++++++++++++ .../db/DomainEntity.kt} | 21 +++++----- .../anvil/core/db/MutableRepository.kt | 24 ++++++++++++ .../anvilpowered/anvil/core/db/Pagination.kt | 32 +++++++++++++++ .../db/Repository.kt} | 16 ++++---- .../anvil/{ => core}/entity/AnvilTable.kt | 2 +- .../platform/GamePlatform.kt} | 15 ++----- .../anvil/{ => core}/platform/Platform.kt | 2 +- .../anvil/core/platform/Plugin.kt | 5 +++ .../{ => core}/platform/PluginManager.kt | 2 +- .../anvil/core/user/ArgumentExtensions.kt | 25 ++++++++++++ .../anvil/{ => core}/user/Player.kt | 2 +- .../anvil/{ => core}/user/Subject.kt | 2 +- .../anvil/platform/GamePlatform.kt | 6 --- .../org/anvilpowered/anvil/platform/Plugin.kt | 5 --- .../org/anvilpowered/anvil/system/Server.kt | 7 ---- gradle/libs.versions.toml | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../org/anvilpowered/anvil/AnvilPaperApi.kt | 19 --------- .../anvil/user/AnvilPaperPlayer.kt | 22 ----------- .../org/anvilpowered/anvil/AnvilPaperApi.kt | 14 +++++++ .../anvil/command/AnvilPaperCommandSource.kt | 15 ++----- .../anvil/command/PaperCustomCommand.kt | 6 +-- .../anvil/command/PaperSourceConverter.kt | 2 +- .../anvil/platform/PaperPlatform.kt | 4 +- .../anvil/platform/PaperPlugin.kt | 2 +- .../anvil/platform/PaperPluginManager.kt | 4 +- .../anvil/user/AnvilPaperPlayer.kt | 15 +++++++ .../anvil/user/AnvilPaperSubject.kt | 3 +- settings.gradle.kts | 8 ---- .../anvil/user/AnvilSpongePlayer.kt | 20 ---------- .../anvil/user/SpongeGameUserScope.kt | 14 ------- .../anvil/sponge}/AnvilSpongeApi.kt | 32 ++++++++++----- .../anvil/sponge}/platform/SpongePlatform.kt | 6 +-- .../anvil/sponge}/platform/SpongePlugin.kt | 4 +- .../sponge}/platform/SpongePluginManager.kt | 6 +-- .../anvil/sponge/user/AnvilSpongePlayer.kt | 13 +++++++ .../anvil/sponge}/user/AnvilSpongeSubject.kt | 4 +- velocity/build.gradle.kts | 3 +- .../anvil/user/AnvilVelocityPlayer.kt | 23 ----------- .../anvil/user/VelocityGameUserScope.kt | 14 ------- .../anvil/velocity}/AnvilVelocityApi.kt | 39 ++++++++++++------- .../command/AnvilVelocityCommandSource.kt | 19 ++++----- .../command/VelocityCustomCommand.kt | 12 +++--- .../command/VelocitySourceConverter.kt | 4 +- .../velocity}/platform/VelocityPlatform.kt | 6 +-- .../velocity}/platform/VelocityPlugin.kt | 4 +- .../platform/VelocityPluginManager.kt | 6 +-- .../velocity/user/AnvilVelocityPlayer.kt | 15 +++++++ .../velocity}/user/AnvilVelocitySubject.kt | 4 +- 73 files changed, 367 insertions(+), 294 deletions(-) delete mode 100644 app/cli/build.gradle.kts rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt (100%) rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt (100%) rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt (93%) rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt (100%) rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt (76%) rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt (100%) rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt (100%) rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt (100%) rename app/plugin/core/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt (100%) rename app/plugin/paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt (100%) rename app/plugin/paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt (100%) rename app/plugin/sponge/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt (85%) rename app/plugin/sponge/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt (100%) rename app/plugin/velocity/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt (90%) rename app/plugin/velocity/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt (96%) rename core/src/main/kotlin/org/anvilpowered/anvil/{ => core}/AnvilApi.kt (85%) rename velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt => core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt (60%) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt rename core/src/main/kotlin/org/anvilpowered/anvil/{LoggerScope.kt => core/db/DomainEntity.kt} (75%) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/db/Pagination.kt rename core/src/main/kotlin/org/anvilpowered/anvil/{RepositoryScope.kt => core/db/Repository.kt} (74%) rename core/src/main/kotlin/org/anvilpowered/anvil/{ => core}/entity/AnvilTable.kt (85%) rename core/src/main/kotlin/org/anvilpowered/anvil/{system/ServerNode.kt => core/platform/GamePlatform.kt} (70%) rename core/src/main/kotlin/org/anvilpowered/anvil/{ => core}/platform/Platform.kt (95%) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Plugin.kt rename core/src/main/kotlin/org/anvilpowered/anvil/{ => core}/platform/PluginManager.kt (94%) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/user/ArgumentExtensions.kt rename core/src/main/kotlin/org/anvilpowered/anvil/{ => core}/user/Player.kt (95%) rename core/src/main/kotlin/org/anvilpowered/anvil/{ => core}/user/Subject.kt (97%) delete mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/platform/GamePlatform.kt delete mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/platform/Plugin.kt delete mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/system/Server.kt delete mode 100644 paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt delete mode 100644 paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt create mode 100644 paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt rename paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt (64%) rename paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt (91%) rename paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt (97%) rename paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt (78%) rename paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt (84%) rename paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt (67%) create mode 100644 paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt rename paper/src/{jvmMain => main}/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt (90%) delete mode 100644 sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt delete mode 100644 sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt rename sponge/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/sponge}/AnvilSpongeApi.kt (57%) rename sponge/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/sponge}/platform/SpongePlatform.kt (75%) rename sponge/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/sponge}/platform/SpongePlugin.kt (73%) rename sponge/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/sponge}/platform/SpongePluginManager.kt (57%) create mode 100644 sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt rename sponge/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/sponge}/user/AnvilSpongeSubject.kt (85%) delete mode 100644 velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt delete mode 100644 velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt rename velocity/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/velocity}/AnvilVelocityApi.kt (63%) rename velocity/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/velocity}/command/AnvilVelocityCommandSource.kt (70%) rename velocity/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/velocity}/command/VelocityCustomCommand.kt (83%) rename velocity/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/velocity}/command/VelocitySourceConverter.kt (94%) rename velocity/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/velocity}/platform/VelocityPlatform.kt (88%) rename velocity/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/velocity}/platform/VelocityPlugin.kt (91%) rename velocity/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/velocity}/platform/VelocityPluginManager.kt (87%) create mode 100644 velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt rename velocity/src/{jvmMain/kotlin/org/anvilpowered/anvil => main/kotlin/org/anvilpowered/anvil/velocity}/user/AnvilVelocitySubject.kt (86%) diff --git a/app/cli/build.gradle.kts b/app/cli/build.gradle.kts deleted file mode 100644 index f63bbd2b9..000000000 --- a/app/cli/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - alias(libs.plugins.shadow) -} diff --git a/app/plugin/core/build.gradle.kts b/app/plugin/core/build.gradle.kts index 5dee6c2ac..d6d13c134 100644 --- a/app/plugin/core/build.gradle.kts +++ b/app/plugin/core/build.gradle.kts @@ -1,7 +1,7 @@ dependencies { - api(project(":anvil-api")) + api(project(":anvil-core")) api(platform(libs.adventure.bom)) - api("net.kyori:adventure-api") // TODO: -> compileOnlyApi ASAP + compileOnlyApi("net.kyori:adventure-api") // compileOnlyApi(libs.logging.api) - api(libs.kbrig.core) + api(libs.kbrig.brigadier) } diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt similarity index 100% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt similarity index 100% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt similarity index 93% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt index 7863498d5..34454bd61 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt @@ -1,7 +1,7 @@ package org.anvilpowered.anvil.plugin.command import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.anvil.plugin.command.plugin.PluginCommand diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt similarity index 100% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt similarity index 76% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt index 8e19dfa0f..a793e5d3d 100644 --- a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt @@ -1,9 +1,7 @@ package org.anvilpowered.anvil.plugin.command.gameuser -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.api.user.requiresPermission -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.Component +import net.kyori.adventure.text.Component +import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt similarity index 100% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt similarity index 100% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt similarity index 100% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt diff --git a/app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt similarity index 100% rename from app/plugin/core/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt similarity index 100% rename from app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt rename to app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt diff --git a/app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt similarity index 100% rename from app/plugin/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt rename to app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt diff --git a/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt similarity index 85% rename from app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt rename to app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt index 02b417356..8c8ebde6d 100644 --- a/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt +++ b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt @@ -1,7 +1,7 @@ package org.anvilpowered.anvil.plugin import com.mojang.brigadier.tree.LiteralCommandNode -import org.anvilpowered.anvil.AnvilSpongeApi +import org.anvilpowered.anvil.sponge.AnvilSpongeApi import org.spongepowered.api.event.lifecycle.RegisterCommandEvent context(AnvilSpongeApi) diff --git a/app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt similarity index 100% rename from app/plugin/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt rename to app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt similarity index 90% rename from app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt rename to app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt index 5da5cf4b7..1dc1170c1 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -19,8 +19,8 @@ package org.anvilpowered.anvil.plugin import com.velocitypowered.api.command.BrigadierCommand -import org.anvilpowered.anvil.AnvilVelocityApi -import org.anvilpowered.anvil.command.toVelocity +import org.anvilpowered.anvil.velocity.AnvilVelocityApi +import org.anvilpowered.anvil.velocity.command.toVelocity context(AnvilVelocityApi) class AnvilVelocityPlugin : AnvilPlugin() { diff --git a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt similarity index 96% rename from app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt rename to app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index 46c10b627..2c119467a 100644 --- a/app/plugin/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt +++ b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -24,7 +24,7 @@ import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.createVelocity +import org.anvilpowered.anvil.velocity.createVelocity import org.slf4j.Logger @Plugin( diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 279c3daf2..b51d43bb2 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { `kotlin-dsl` } @@ -5,3 +7,14 @@ plugins { dependencies { implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${libs.versions.kotlin.get()}") } + +tasks { + withType { + kotlinOptions.jvmTarget = "17" + } + withType { + options.encoding = "UTF-8" + sourceCompatibility = "17" + targetCompatibility = "17" + } +} diff --git a/build-logic/src/main/kotlin/anvil-publish.gradle.kts b/build-logic/src/main/kotlin/anvil-publish.gradle.kts index a9229cd7a..21cf6fa47 100644 --- a/build-logic/src/main/kotlin/anvil-publish.gradle.kts +++ b/build-logic/src/main/kotlin/anvil-publish.gradle.kts @@ -4,6 +4,11 @@ plugins { `maven-publish` } +extensions.configure { + withJavadocJar() + withSourcesJar() +} + extensions.configure { repositories { maven { diff --git a/build.gradle.kts b/build.gradle.kts index 7e4bd2519..ccbe5071a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.ktlint) @@ -8,6 +10,7 @@ val projectVersion = file("version").readLines().first() allprojects { apply(plugin = "org.jetbrains.kotlin.jvm") apply(plugin = "org.jlleitschuh.gradle.ktlint") + apply(plugin = "java-library") group = "org.anvilpowered" version = projectVersion project.findProperty("buildNumber") @@ -21,4 +24,15 @@ allprojects { ) } } + + tasks { + withType { + kotlinOptions.jvmTarget = "17" + } + withType { + options.encoding = "UTF-8" + sourceCompatibility = "17" + targetCompatibility = "17" + } + } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 2a4fcca5d..9a7ee2e2c 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -4,13 +4,10 @@ plugins { } dependencies { - api(project(":anvil-api")) - api(platform(libs.exposed.bom)) api(libs.bundles.exposed) + api(libs.kbrig.brigadier) compileOnlyApi(platform(libs.adventure.bom)) compileOnlyApi("net.kyori:adventure-api") - - api(libs.kontour) } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/AnvilApi.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt similarity index 85% rename from core/src/main/kotlin/org/anvilpowered/anvil/AnvilApi.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt index 99fd5876d..2b39d68c4 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/AnvilApi.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt @@ -16,14 +16,14 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil +package org.anvilpowered.anvil.core -import org.anvilpowered.anvil.platform.Platform -import org.anvilpowered.anvil.platform.PluginManager +import org.anvilpowered.anvil.core.platform.Platform +import org.anvilpowered.anvil.core.platform.PluginManager /** * To create an instance of this interface, use the `AnvilApi.create` function. - * This is available for each platform in the corresponding `anvil-core-game-` module. + * This is available for each platform in the corresponding `anvil-` module. * * Generally, the method will look something like this: * ```kt @@ -36,7 +36,7 @@ import org.anvilpowered.anvil.platform.PluginManager * AnvilApi.createVelocity("my-plugin", ....) * ``` */ -interface AnvilApi : LoggerScope, RepositoryScope { +interface AnvilApi { val platform: Platform val pluginManager: PluginManager diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt similarity index 60% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt index a600bbbd3..5cc4bc5cf 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/VelocityGamePlatformScope.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt @@ -16,17 +16,20 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil +package org.anvilpowered.anvil.core.command -import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.domain.GamePlatformScope -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.user.VelocityGameUserScope +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.Subject -fun GamePlatformScope.Companion.createVelocity(proxyServer: ProxyServer): GamePlatformScope { - class Velocity(val proxyServer: ProxyServer) : - GamePlatformScope, - GameUser.GamePlatformScope by VelocityGameUserScope(proxyServer) +interface CommandSource { - return Velocity(proxyServer) + val audience: Audience + + val subject: Subject + + /** + * The [Player] associated with the executed command, if any. + */ + val player: Player? } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt new file mode 100644 index 000000000..2dfe27aca --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt @@ -0,0 +1,32 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.command + +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.kbrig.builder.ArgumentBuilder +import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder +import org.anvilpowered.kbrig.context.CommandContext + +interface PlayerCommandScope { + + fun ArgumentBuilder.Companion.player( + name: String = "player", + command: (context: CommandContext, player: Player) -> Int, + ): RequiredArgumentBuilder +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/LoggerScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/DomainEntity.kt similarity index 75% rename from core/src/main/kotlin/org/anvilpowered/anvil/LoggerScope.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/db/DomainEntity.kt index 6ad905c2e..214fa3c53 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/LoggerScope.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/DomainEntity.kt @@ -16,14 +16,17 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil +package org.anvilpowered.anvil.core.db -interface LoggerScope { -// val logger: KmLog -// -// companion object { -// fun create(name: String): LoggerScope = object : LoggerScope { -// override val logger: KmLog = logging(name) -// } -// } +import java.util.UUID + +interface DomainEntity { + val id: UUID + // TODO: createdUtc, updatedUtc +} + +interface DomainFacet { + suspend fun getOriginal(): E } + +interface Creates diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt new file mode 100644 index 000000000..278feb824 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt @@ -0,0 +1,24 @@ +/* + * Kontour - SourceGrade.org + * Copyright (C) 2023 Alexander Städing + * Copyright (C) 2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.db + +interface MutableRepository> : Repository { + suspend fun create(item: C): E +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Pagination.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Pagination.kt new file mode 100644 index 000000000..b1343bef2 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Pagination.kt @@ -0,0 +1,32 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.db + +import kotlin.reflect.KProperty1 + +interface Pagination> { + fun limit(n: Int, offset: Long = 0): Pagination + fun sortBy(field: KProperty1>, direction: SortDirection = SortDirection.ASCENDING): Pagination + fun build(): List +} + +enum class SortDirection { + ASCENDING, + DESCENDING, +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/RepositoryScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt similarity index 74% rename from core/src/main/kotlin/org/anvilpowered/anvil/RepositoryScope.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt index 6de907d07..a9ed46363 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/RepositoryScope.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt @@ -16,12 +16,14 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil -interface RepositoryScope { -// val discordUserRepository: DiscordUserRepository -// val gameUserRepository: GameUserRepository -// val userRepository: UserRepository -// val serverNodeRepository: ServerNodeRepository - companion object +package org.anvilpowered.anvil.core.db + +import java.util.UUID + +interface Repository { + suspend fun getById(id: UUID): E? + suspend fun exists(id: UUID): Boolean + suspend fun countAll(): Long + suspend fun deleteById(id: UUID): Boolean } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt similarity index 85% rename from core/src/main/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt index 5c5005d90..548146750 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/entity/AnvilTable.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.entity +package org.anvilpowered.anvil.core.entity import org.jetbrains.exposed.dao.id.UUIDTable diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/system/ServerNode.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/GamePlatform.kt similarity index 70% rename from core/src/main/kotlin/org/anvilpowered/anvil/system/ServerNode.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/platform/GamePlatform.kt index 1b85be0c8..b8586a3fe 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/system/ServerNode.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/GamePlatform.kt @@ -16,16 +16,9 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.system +package org.anvilpowered.anvil.core.platform -import org.sourcegrade.kontour.Creates -import org.sourcegrade.kontour.DomainEntity -import org.sourcegrade.kontour.UUID - -data class ServerNode(override val id: UUID) : DomainEntity { - - data class CreateDto( - val name: String, - val gameTypeId: UUID, - ) : Creates +interface GamePlatform : Platform { + val isProxy: Boolean + val plugins: List } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/platform/Platform.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt similarity index 95% rename from core/src/main/kotlin/org/anvilpowered/anvil/platform/Platform.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt index 8a7e7e7c5..cb4552817 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/platform/Platform.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.core.platform interface Platform { val name: String diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Plugin.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Plugin.kt new file mode 100644 index 000000000..dfdfbbe57 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Plugin.kt @@ -0,0 +1,5 @@ +package org.anvilpowered.anvil.core.platform + +interface Plugin { + val name: String +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/platform/PluginManager.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/PluginManager.kt similarity index 94% rename from core/src/main/kotlin/org/anvilpowered/anvil/platform/PluginManager.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/platform/PluginManager.kt index 7cdb7bf6e..cb99c103d 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/platform/PluginManager.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/PluginManager.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.core.platform interface PluginManager { val plugins: List diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/ArgumentExtensions.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/ArgumentExtensions.kt new file mode 100644 index 000000000..3ca11fa6c --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/ArgumentExtensions.kt @@ -0,0 +1,25 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.user + +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.kbrig.builder.ArgumentBuilder + +fun > B.requiresPermission(permission: String): B = + requires { it.subject.hasPermissionSet(permission) } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/user/Player.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt similarity index 95% rename from core/src/main/kotlin/org/anvilpowered/anvil/user/Player.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt index 7641ed07d..bf32d0a00 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/user/Player.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.core.user import net.kyori.adventure.audience.Audience diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/user/Subject.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt similarity index 97% rename from core/src/main/kotlin/org/anvilpowered/anvil/user/Subject.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt index a32bd6bdc..9ed67dc40 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/user/Subject.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.core.user interface Subject { diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/platform/GamePlatform.kt b/core/src/main/kotlin/org/anvilpowered/anvil/platform/GamePlatform.kt deleted file mode 100644 index 5b799f7a6..000000000 --- a/core/src/main/kotlin/org/anvilpowered/anvil/platform/GamePlatform.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.anvilpowered.anvil.platform - -interface GamePlatform : Platform { - val isProxy: Boolean - val plugins: List -} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/platform/Plugin.kt b/core/src/main/kotlin/org/anvilpowered/anvil/platform/Plugin.kt deleted file mode 100644 index a39bddb47..000000000 --- a/core/src/main/kotlin/org/anvilpowered/anvil/platform/Plugin.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.anvilpowered.anvil.platform - -interface Plugin { - val name: String -} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/system/Server.kt b/core/src/main/kotlin/org/anvilpowered/anvil/system/Server.kt deleted file mode 100644 index 175e9ee75..000000000 --- a/core/src/main/kotlin/org/anvilpowered/anvil/system/Server.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.anvilpowered.anvil.system - -interface Server { - val id: String - val playerCount: Int - val maxPlayerCount: Int -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 16f671094..f95c8b32b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] #kmongo = "4.8.0" -kotlin = "1.9.10" +kotlin = "1.9.20" ktor = "2.3.0" log4j = "2.20.0" @@ -14,8 +14,6 @@ exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc" } exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time" } kbrig-brigadier = "org.anvilpowered:kbrig-brigadier:0.1.0-SNAPSHOT" -kbrig-core = "org.anvilpowered:kbrig-core:0.1.0-SNAPSHOT" -kontour = "org.sourcegrade:kontour-domain:0.1.0-SNAPSHOT" kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0" kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.0" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 17a8ddce2..744c64d12 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt deleted file mode 100644 index e056de1df..000000000 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.anvilpowered.anvil - -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.core.JULDelegateLogger -import org.anvilpowered.anvil.core.db.RepositoryScopeImpl -import org.anvilpowered.anvil.domain.RepositoryScope -import org.anvilpowered.anvil.platform.PaperPlatform -import org.anvilpowered.anvil.platform.PaperPluginManager -import org.bukkit.Bukkit - -interface AnvilPaperApi : AnvilApi - -fun AnvilApi.Companion.createPaper(): AnvilPaperApi { - return object : AnvilPaperApi, RepositoryScope by RepositoryScopeImpl { - override val logger = JULDelegateLogger(Bukkit.getLogger()) - override val platform = PaperPlatform - override val pluginManager = PaperPluginManager - } -} diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt b/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt deleted file mode 100644 index f9e0c1dc8..000000000 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt +++ /dev/null @@ -1,22 +0,0 @@ -package org.anvilpowered.anvil.user - -import org.anvilpowered.anvil.core.db.RepositoryScopeImpl -import org.anvilpowered.anvil.domain.user.Audience -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import org.anvilpowered.anvil.domain.user.User -import org.bukkit.entity.Player as PaperPlayer - -fun PaperPlayer.toAnvilPlayer(): Player = AnvilPaperPlayer(this) - -private class AnvilPaperPlayer( - val paperPlayer: PaperPlayer, -) : Player, - Audience by paperPlayer, - Subject by paperPlayer.toAnvilSubject() { - override val gameUser: GameUser = GameUser(paperPlayer.uniqueId) - - override suspend fun getUserOrNull(): User? = - RepositoryScopeImpl.userRepository.findByGameUserId(paperPlayer.uniqueId) -} diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt new file mode 100644 index 000000000..cb30eaebf --- /dev/null +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt @@ -0,0 +1,14 @@ +package org.anvilpowered.anvil + +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.platform.PaperPlatform +import org.anvilpowered.anvil.platform.PaperPluginManager + +interface AnvilPaperApi : AnvilApi + +fun AnvilApi.Companion.createPaper(): AnvilPaperApi { + return object : AnvilPaperApi { + override val platform = PaperPlatform + override val pluginManager = PaperPluginManager + } +} diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt similarity index 64% rename from paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt index a0ae942ad..098266ff5 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt @@ -1,12 +1,10 @@ package org.anvilpowered.anvil.command import io.papermc.paper.command.brigadier.CommandSourceStack -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.Audience -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import org.anvilpowered.anvil.domain.user.User +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.Subject import org.anvilpowered.anvil.user.toAnvilPlayer import org.anvilpowered.anvil.user.toAnvilSubject import org.bukkit.command.CommandSender @@ -23,9 +21,4 @@ private class AnvilPaperCommandSource( override val audience: Audience = paperCommandSource override val subject: Subject = paperCommandSource.toAnvilSubject() override val player: Player? = (paperCommandSource as? PaperPlayer)?.toAnvilPlayer() - override val gameUser: GameUser? = player?.gameUser - - override suspend fun getUserOrNull(): User? { - TODO("Not yet implemented") - } } diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt similarity index 91% rename from paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt index 6f0bedba8..f1cb444ce 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt @@ -3,9 +3,9 @@ package org.anvilpowered.anvil.command import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.AnvilPaperApi -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.command.PlayerCommandScope -import org.anvilpowered.anvil.domain.user.Player +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.core.command.PlayerCommandScope +import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.user.toAnvilPlayer import org.anvilpowered.kbrig.argument.StringArgumentType import org.anvilpowered.kbrig.builder.ArgumentBuilder diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt similarity index 97% rename from paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt index f080c2bbe..4e0700699 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt @@ -22,7 +22,7 @@ package org.anvilpowered.anvil.command import io.papermc.paper.command.brigadier.CommandSourceStack -import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.kbrig.brigadier.toBrigadier import org.anvilpowered.kbrig.tree.ArgumentCommandNode import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt similarity index 78% rename from paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt index ec8ecc3b5..96910b839 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt @@ -1,7 +1,7 @@ package org.anvilpowered.anvil.platform -import org.anvilpowered.anvil.domain.platform.GamePlatform -import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.core.platform.GamePlatform +import org.anvilpowered.anvil.core.platform.Plugin import org.bukkit.Bukkit internal object PaperPlatform : GamePlatform { diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt similarity index 84% rename from paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt index 4087bf5c6..93d6c2c34 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt @@ -1,6 +1,6 @@ package org.anvilpowered.anvil.platform -import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.core.platform.Plugin import org.bukkit.plugin.Plugin as BukkitPlugin internal fun BukkitPlugin.toAnvilPlugin() = PaperPlugin(this) diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt similarity index 67% rename from paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt index e25c43dd4..bbdfe51c2 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt @@ -1,7 +1,7 @@ package org.anvilpowered.anvil.platform -import org.anvilpowered.anvil.domain.platform.Plugin -import org.anvilpowered.anvil.domain.platform.PluginManager +import org.anvilpowered.anvil.core.platform.Plugin +import org.anvilpowered.anvil.core.platform.PluginManager import org.bukkit.Bukkit internal object PaperPluginManager : PluginManager { diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt new file mode 100644 index 000000000..56984ffd8 --- /dev/null +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt @@ -0,0 +1,15 @@ +package org.anvilpowered.anvil.user + +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.Subject +import org.bukkit.entity.Player as PaperPlayer + +fun PaperPlayer.toAnvilPlayer(): Player = AnvilPaperPlayer(this) + +private class AnvilPaperPlayer( + val paperPlayer: PaperPlayer, +) : Player, + Audience by paperPlayer, + Subject by paperPlayer.toAnvilSubject() { +} diff --git a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt similarity index 90% rename from paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt index 59656d19b..ac5e90722 100644 --- a/paper/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt @@ -1,6 +1,6 @@ package org.anvilpowered.anvil.user -import org.anvilpowered.anvil.domain.user.Subject +import org.anvilpowered.anvil.core.user.Subject import org.bukkit.permissions.Permissible fun Permissible.toAnvilSubject(): Subject = AnvilPaperSubject(this) @@ -17,5 +17,4 @@ private class AnvilPaperSubject( null } } - } diff --git a/settings.gradle.kts b/settings.gradle.kts index 91ba86bb5..d3f6a0886 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -23,19 +23,11 @@ pluginManagement { rootProject.name = "anvil" sequenceOf( - "api", "app-plugin", "app-plugin-core", "app-plugin-paper", "app-plugin-sponge", "app-plugin-velocity", - "app-cockpit", - "app-cockpit-application", - "app-cockpit-backend", - "app-cockpit-domain", - "app-cockpit-ui", - "app-cli", - "domain", "core", "paper", "sponge", diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt deleted file mode 100644 index 669e4c0f3..000000000 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongePlayer.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.anvilpowered.anvil.user - -import org.anvilpowered.anvil.core.db.RepositoryScopeImpl -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import org.anvilpowered.anvil.domain.user.User -import org.spongepowered.api.entity.living.player.server.ServerPlayer - -fun ServerPlayer.toAnvilPlayer(): Player = AnvilSpongePlayer(this) - -private class AnvilSpongePlayer( - val spongePlayer: ServerPlayer, -) : Player, - Subject by spongePlayer.toAnvilSubject() { - override val gameUser: GameUser = GameUser(spongePlayer.uniqueId()) - - override suspend fun getUserOrNull(): User? = - RepositoryScopeImpl.userRepository.findByGameUserId(spongePlayer.uniqueId()) -} diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt b/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt deleted file mode 100644 index 18bde391b..000000000 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/SpongeGameUserScope.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.anvilpowered.anvil.user - -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import org.spongepowered.api.Sponge -import kotlin.jvm.optionals.getOrNull - -class SpongeGameUserScope : GameUser.GamePlatformScope { - override val GameUser.subject: Subject? - get() = Sponge.server().player(id).getOrNull()?.toAnvilSubject() - override val GameUser.player: Player? - get() = Sponge.server().player(id).getOrNull()?.toAnvilPlayer() -} diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt similarity index 57% rename from sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt rename to sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt index 7acbb114e..ad49a09f4 100644 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilSpongeApi.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt @@ -1,11 +1,26 @@ -package org.anvilpowered.anvil +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.sponge -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.core.Slf4jDelegateLogger -import org.anvilpowered.anvil.core.db.RepositoryScopeImpl -import org.anvilpowered.anvil.domain.RepositoryScope -import org.anvilpowered.anvil.platform.SpongePlatform -import org.anvilpowered.anvil.platform.SpongePluginManager +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.sponge.platform.SpongePlatform +import org.anvilpowered.anvil.sponge.platform.SpongePluginManager import org.slf4j.Logger interface AnvilSpongeApi : AnvilApi { @@ -50,8 +65,7 @@ interface AnvilSpongeApi : AnvilApi { * ``` */ fun AnvilApi.Companion.createSponge(logger: Logger): AnvilSpongeApi { - return object : AnvilSpongeApi, RepositoryScope by RepositoryScopeImpl { - override val logger = Slf4jDelegateLogger(logger) + return object : AnvilSpongeApi { override val platform = SpongePlatform override val pluginManager = SpongePluginManager } diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt similarity index 75% rename from sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt rename to sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt index 67531cdd4..668b8e286 100644 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlatform.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt @@ -1,7 +1,7 @@ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.sponge.platform -import org.anvilpowered.anvil.domain.platform.GamePlatform -import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.core.platform.GamePlatform +import org.anvilpowered.anvil.core.platform.Plugin import org.spongepowered.api.Platform import org.spongepowered.api.Sponge diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlugin.kt similarity index 73% rename from sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt rename to sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlugin.kt index d2948c9e1..0ab42290f 100644 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePlugin.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlugin.kt @@ -1,6 +1,6 @@ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.sponge.platform -import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.core.platform.Plugin import org.spongepowered.plugin.PluginContainer internal fun PluginContainer.toAnvilPlugin() = SpongePlugin(this) diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePluginManager.kt similarity index 57% rename from sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt rename to sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePluginManager.kt index 92a6af9e1..20e23bf17 100644 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/SpongePluginManager.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePluginManager.kt @@ -1,7 +1,7 @@ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.sponge.platform -import org.anvilpowered.anvil.domain.platform.Plugin -import org.anvilpowered.anvil.domain.platform.PluginManager +import org.anvilpowered.anvil.core.platform.Plugin +import org.anvilpowered.anvil.core.platform.PluginManager import org.spongepowered.api.Sponge internal object SpongePluginManager : PluginManager { diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt new file mode 100644 index 000000000..551262117 --- /dev/null +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt @@ -0,0 +1,13 @@ +package org.anvilpowered.anvil.sponge.user + +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.Subject +import org.spongepowered.api.entity.living.player.server.ServerPlayer + +fun ServerPlayer.toAnvilPlayer(): Player = AnvilSpongePlayer(this) + +private class AnvilSpongePlayer( + val spongePlayer: ServerPlayer, +) : Player, + Subject by spongePlayer.toAnvilSubject() { +} diff --git a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt similarity index 85% rename from sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt rename to sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt index 48a5142dd..89a3ed8aa 100644 --- a/sponge/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilSpongeSubject.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt @@ -1,6 +1,6 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.sponge.user -import org.anvilpowered.anvil.domain.user.Subject +import org.anvilpowered.anvil.core.user.Subject import org.spongepowered.api.util.Tristate import org.spongepowered.api.service.permission.Subject as SpongeSubject diff --git a/velocity/build.gradle.kts b/velocity/build.gradle.kts index 098748cb4..e5db47a84 100644 --- a/velocity/build.gradle.kts +++ b/velocity/build.gradle.kts @@ -4,6 +4,5 @@ plugins { dependencies { implementation(project(":anvil-core")) - implementation(libs.kbrig.brigadier) - compileOnly(libs.velocity) + compileOnlyApi(libs.velocity) } diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt deleted file mode 100644 index dc4435965..000000000 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocityPlayer.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.anvilpowered.anvil.user - -import org.anvilpowered.anvil.core.db.RepositoryScopeImpl -import org.anvilpowered.anvil.domain.user.Audience -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import org.anvilpowered.anvil.domain.user.User -import com.velocitypowered.api.proxy.Player as VelocityPlayer - -fun VelocityPlayer.toAnvilPlayer(): Player = AnvilVelocityPlayer(this) - -private class AnvilVelocityPlayer( - val velocityPlayer: VelocityPlayer, -) : Player, - Audience by velocityPlayer, - Subject by velocityPlayer.toAnvilSubject() { - - override val gameUser: GameUser = GameUser(velocityPlayer.uniqueId) - - override suspend fun getUserOrNull(): User? = - RepositoryScopeImpl.userRepository.findByGameUserId(velocityPlayer.uniqueId) -} diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt b/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt deleted file mode 100644 index a8140fbb5..000000000 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/VelocityGameUserScope.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.anvilpowered.anvil.user - -import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import kotlin.jvm.optionals.getOrNull - -class VelocityGameUserScope(private val proxyServer: ProxyServer) : GameUser.GamePlatformScope { - override val GameUser.subject: Subject? - get() = proxyServer.getPlayer(id).getOrNull()?.toAnvilSubject() - override val GameUser.player: Player? - get() = proxyServer.getPlayer(id).getOrNull()?.toAnvilPlayer() -} diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt similarity index 63% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt rename to velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index 1d05f90d0..6d4a1106b 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -1,13 +1,27 @@ -package org.anvilpowered.anvil +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.velocity import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.core.Slf4jDelegateLogger -import org.anvilpowered.anvil.core.db.RepositoryScopeImpl -import org.anvilpowered.anvil.domain.RepositoryScope -import org.anvilpowered.anvil.platform.VelocityPlatform -import org.anvilpowered.anvil.platform.VelocityPluginManager -import org.slf4j.Logger as VelocityLogger +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.velocity.platform.VelocityPlatform +import org.anvilpowered.anvil.velocity.platform.VelocityPluginManager /** * A subtype of [AnvilApi] that also provides access to Velocity-specific APIs such as [ProxyServer]. @@ -29,8 +43,8 @@ interface AnvilVelocityApi : AnvilApi { */ @JvmStatic @JvmName("create") - fun doNotUse(logger: VelocityLogger, proxyServer: ProxyServer): AnvilVelocityApi = - AnvilApi.createVelocity(logger, proxyServer) + fun doNotUse(proxyServer: ProxyServer): AnvilVelocityApi = + AnvilApi.createVelocity(proxyServer) } } @@ -69,9 +83,8 @@ interface AnvilVelocityApi : AnvilApi { * } * ``` */ -fun AnvilApi.Companion.createVelocity(logger: VelocityLogger, proxyServer: ProxyServer): AnvilVelocityApi { - return object : AnvilVelocityApi, RepositoryScope by RepositoryScopeImpl { - override val logger = Slf4jDelegateLogger(logger) +fun AnvilApi.Companion.createVelocity(proxyServer: ProxyServer): AnvilVelocityApi { + return object : AnvilVelocityApi { override val platform = VelocityPlatform(proxyServer) override val pluginManager = VelocityPluginManager(proxyServer.pluginManager) override val proxyServer: ProxyServer = proxyServer diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt similarity index 70% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt rename to velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt index 607404b5b..fb16e5253 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/AnvilVelocityCommandSource.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt @@ -16,16 +16,14 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.command +package org.anvilpowered.anvil.velocity.command -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.Audience -import org.anvilpowered.anvil.domain.user.GameUser -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.domain.user.Subject -import org.anvilpowered.anvil.domain.user.User -import org.anvilpowered.anvil.user.toAnvilPlayer -import org.anvilpowered.anvil.user.toAnvilSubject +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.Subject +import org.anvilpowered.anvil.velocity.user.toAnvilPlayer +import org.anvilpowered.anvil.velocity.user.toAnvilSubject import com.velocitypowered.api.command.CommandSource as VelocityCommandSource import com.velocitypowered.api.proxy.Player as VelocityPlayer @@ -37,7 +35,4 @@ private class AnvilVelocityCommandSource( override val audience: Audience = velocityCommandSource override val subject: Subject = velocityCommandSource.toAnvilSubject() override val player: Player? = (velocityCommandSource as? VelocityPlayer)?.toAnvilPlayer() - override val gameUser: GameUser? = player?.gameUser - - override suspend fun getUserOrNull(): User? = player?.getUserOrNull() } diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt similarity index 83% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt rename to velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt index db71f4d2d..4dda32e6d 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocityCustomCommand.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt @@ -1,12 +1,12 @@ -package org.anvilpowered.anvil.command +package org.anvilpowered.anvil.velocity.command import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.AnvilVelocityApi -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.command.PlayerCommandScope -import org.anvilpowered.anvil.domain.user.Player -import org.anvilpowered.anvil.user.toAnvilPlayer +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.core.command.PlayerCommandScope +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.velocity.AnvilVelocityApi +import org.anvilpowered.anvil.velocity.user.toAnvilPlayer import org.anvilpowered.kbrig.argument.StringArgumentType import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocitySourceConverter.kt similarity index 94% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt rename to velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocitySourceConverter.kt index 7a26ed643..6b8081a33 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/command/VelocitySourceConverter.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocitySourceConverter.kt @@ -18,9 +18,9 @@ @file:JvmName("VelocitySourceConverter") -package org.anvilpowered.anvil.command +package org.anvilpowered.anvil.velocity.command -import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.kbrig.brigadier.toBrigadier import org.anvilpowered.kbrig.tree.ArgumentCommandNode import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt similarity index 88% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt rename to velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt index 93c345b99..101104175 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlatform.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt @@ -16,11 +16,11 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.velocity.platform import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.domain.platform.GamePlatform -import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.core.platform.GamePlatform +import org.anvilpowered.anvil.core.platform.Plugin internal class VelocityPlatform(private val proxyServer: ProxyServer) : GamePlatform { override val isProxy: Boolean = true diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlugin.kt similarity index 91% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt rename to velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlugin.kt index c82351225..0ae806175 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPlugin.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlugin.kt @@ -16,10 +16,10 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.velocity.platform import com.velocitypowered.api.plugin.PluginContainer -import org.anvilpowered.anvil.domain.platform.Plugin +import org.anvilpowered.anvil.core.platform.Plugin internal fun PluginContainer.toAnvilPlugin() = VelocityPlugin(this) diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPluginManager.kt similarity index 87% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt rename to velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPluginManager.kt index 3d2011124..e2fab5327 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/platform/VelocityPluginManager.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPluginManager.kt @@ -16,10 +16,10 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.velocity.platform -import org.anvilpowered.anvil.domain.platform.Plugin -import org.anvilpowered.anvil.domain.platform.PluginManager +import org.anvilpowered.anvil.core.platform.Plugin +import org.anvilpowered.anvil.core.platform.PluginManager import com.velocitypowered.api.plugin.PluginManager as BackingPluginManager internal class VelocityPluginManager(private val backing: BackingPluginManager) : PluginManager { diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt new file mode 100644 index 000000000..564ca35b5 --- /dev/null +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt @@ -0,0 +1,15 @@ +package org.anvilpowered.anvil.velocity.user + +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.Subject +import com.velocitypowered.api.proxy.Player as VelocityPlayer + +fun VelocityPlayer.toAnvilPlayer(): Player = AnvilVelocityPlayer(this) + +private class AnvilVelocityPlayer( + val velocityPlayer: VelocityPlayer, +) : Player, + Audience by velocityPlayer, + Subject by velocityPlayer.toAnvilSubject() { +} diff --git a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt similarity index 86% rename from velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt rename to velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt index d1ea145c1..02d2bba77 100644 --- a/velocity/src/jvmMain/kotlin/org/anvilpowered/anvil/user/AnvilVelocitySubject.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt @@ -1,7 +1,7 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.velocity.user import com.velocitypowered.api.permission.Tristate -import org.anvilpowered.anvil.domain.user.Subject +import org.anvilpowered.anvil.core.user.Subject import com.velocitypowered.api.permission.PermissionSubject as VelocitySubject fun VelocitySubject.toAnvilSubject(): Subject = AnvilVelocitySubject(this) From 4c2435920925906604b1bdf8c4c7f6bd4da53bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 11 Nov 2023 13:49:44 +0100 Subject: [PATCH 39/77] Fix formatting and add Player.id --- .../org/anvilpowered/anvil/plugin/command/gameuser/Info.kt | 1 - .../org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt | 3 --- .../kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt | 1 - .../main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt | 1 - .../src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt | 3 +++ .../kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt | 2 ++ .../kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt | 1 - .../org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt | 2 ++ .../anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt | 2 ++ 9 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt index 5a87443c1..e825afb71 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt @@ -3,7 +3,6 @@ package org.anvilpowered.anvil.plugin.command.gameuser import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.domain.command.CommandSource import org.anvilpowered.anvil.domain.user.Component -import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.anvil.plugin.command.common.executesUsage import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt index 92e07782e..3abbb4d0b 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -2,12 +2,9 @@ package org.anvilpowered.anvil.plugin -import com.mojang.brigadier.builder.LiteralArgumentBuilder -import io.papermc.paper.command.brigadier.CommandSourceStack import io.papermc.paper.event.server.ServerResourcesLoadEvent import org.anvilpowered.anvil.api.AnvilApi import org.anvilpowered.anvil.createPaper -import org.anvilpowered.anvil.domain.user.Component import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin diff --git a/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt index 8c8ebde6d..211b4291c 100644 --- a/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt +++ b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt @@ -7,6 +7,5 @@ import org.spongepowered.api.event.lifecycle.RegisterCommandEvent context(AnvilSpongeApi) class AnvilSpongePlugin : AnvilPlugin() { fun registerCommands(event: RegisterCommandEvent>) { - } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt index a9ed46363..bda8ef0da 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt @@ -16,7 +16,6 @@ * along with this program. If not, see . */ - package org.anvilpowered.anvil.core.db import java.util.UUID diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt index bf32d0a00..3f5f68e69 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt @@ -19,9 +19,12 @@ package org.anvilpowered.anvil.core.user import net.kyori.adventure.audience.Audience +import java.util.UUID /** * An online player. */ interface Player : Subject, Audience { + + val id: UUID } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt index 56984ffd8..07b24a499 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt @@ -3,6 +3,7 @@ package org.anvilpowered.anvil.user import net.kyori.adventure.audience.Audience import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.Subject +import java.util.UUID import org.bukkit.entity.Player as PaperPlayer fun PaperPlayer.toAnvilPlayer(): Player = AnvilPaperPlayer(this) @@ -12,4 +13,5 @@ private class AnvilPaperPlayer( ) : Player, Audience by paperPlayer, Subject by paperPlayer.toAnvilSubject() { + override val id: UUID = paperPlayer.uniqueId } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt index ad49a09f4..d3657ec2e 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt @@ -28,7 +28,6 @@ interface AnvilSpongeApi : AnvilApi { companion object } - /** * Creates an Anvil API instance for Sponge. * diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt index 551262117..48e1404ce 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt @@ -3,6 +3,7 @@ package org.anvilpowered.anvil.sponge.user import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.Subject import org.spongepowered.api.entity.living.player.server.ServerPlayer +import java.util.UUID fun ServerPlayer.toAnvilPlayer(): Player = AnvilSpongePlayer(this) @@ -10,4 +11,5 @@ private class AnvilSpongePlayer( val spongePlayer: ServerPlayer, ) : Player, Subject by spongePlayer.toAnvilSubject() { + override val id: UUID = spongePlayer.uniqueId() } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt index 564ca35b5..d2be75bd5 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt @@ -3,6 +3,7 @@ package org.anvilpowered.anvil.velocity.user import net.kyori.adventure.audience.Audience import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.Subject +import java.util.UUID import com.velocitypowered.api.proxy.Player as VelocityPlayer fun VelocityPlayer.toAnvilPlayer(): Player = AnvilVelocityPlayer(this) @@ -12,4 +13,5 @@ private class AnvilVelocityPlayer( ) : Player, Audience by velocityPlayer, Subject by velocityPlayer.toAnvilSubject() { + override val id: UUID = velocityPlayer.uniqueId } From 40bb94581d87bb1a7bc26317e5cdadb2f2d565c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 14 Nov 2023 10:08:37 +0100 Subject: [PATCH 40/77] Fix creation of AnvilApi and other compile errors --- .../org/anvilpowered/anvil/plugin/AnvilPlugin.kt | 8 ++++---- .../anvil/plugin/command/AnvilCommand.kt | 4 ++-- .../anvil/plugin/command/common/Help.kt | 2 +- .../plugin/command/gameuser/GameUserCommand.kt | 2 ++ .../anvil/plugin/command/gameuser/Info.kt | 6 +++--- .../anvil/plugin/command/plugin/Info.kt | 6 +++--- .../anvil/plugin/command/plugin/List.kt | 6 +++--- .../anvil/plugin/command/plugin/PluginCommand.kt | 8 ++++---- .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 2 +- .../anvil/plugin/AnvilVelocityPluginBootstrap.kt | 6 ++++-- core/build.gradle.kts | 1 + .../kotlin/org/anvilpowered/anvil/core/AnvilApi.kt | 4 ++++ gradle/libs.versions.toml | 5 ++--- .../kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt | 7 +++++++ .../org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt | 6 ++++-- .../anvilpowered/anvil/velocity/AnvilVelocityApi.kt | 13 ++++++++++--- 16 files changed, 55 insertions(+), 31 deletions(-) diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt index e03ba5bcb..f76b1dead 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt @@ -1,7 +1,7 @@ package org.anvilpowered.anvil.plugin -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.plugin.command.AnvilCommand import org.anvilpowered.kbrig.tree.LiteralCommandNode @@ -9,8 +9,8 @@ context(AnvilApi) abstract class AnvilPlugin { fun registerCommands(registrationCallback: (LiteralCommandNode) -> Unit) { - logger.info { "Registering commands..." } + logger.info("Registering commands...") registrationCallback(AnvilCommand.create()) - logger.info { "Registered commands!" } + logger.info("Registered commands!") } } diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt index 34454bd61..6060317af 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt @@ -1,8 +1,8 @@ package org.anvilpowered.anvil.plugin.command -import org.anvilpowered.anvil.api.AnvilApi +import net.kyori.adventure.text.Component +import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.core.command.CommandSource -import org.anvilpowered.anvil.domain.user.Component import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.anvil.plugin.command.plugin.PluginCommand import org.anvilpowered.kbrig.builder.ArgumentBuilder diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt index 5ef2d920e..845ea6057 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt @@ -3,7 +3,7 @@ package org.anvilpowered.anvil.plugin.command.common import net.kyori.adventure.text.Component import net.kyori.adventure.text.JoinConfiguration import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.domain.command.CommandSource +import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.plugin.PluginMessages import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt index a793e5d3d..e24c32f65 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt @@ -2,6 +2,8 @@ package org.anvilpowered.anvil.plugin.command.gameuser import net.kyori.adventure.text.Component import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.core.user.requiresPermission import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt index e825afb71..3f5d8349f 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt @@ -1,8 +1,8 @@ package org.anvilpowered.anvil.plugin.command.gameuser -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.Component +import net.kyori.adventure.text.Component +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.plugin.command.common.executesUsage import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt index b9aabcae8..3895afbae 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt @@ -1,9 +1,9 @@ package org.anvilpowered.anvil.plugin.command.plugin +import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.plugin.command.common.executesUsage import org.anvilpowered.kbrig.Command import org.anvilpowered.kbrig.argument.StringArgumentType diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt index a472955bf..2f5b899cd 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt @@ -1,9 +1,9 @@ package org.anvilpowered.anvil.plugin.command.plugin +import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.Component +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt index 47d8df4cc..c20716e19 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt @@ -1,9 +1,9 @@ package org.anvilpowered.anvil.plugin.command.plugin -import org.anvilpowered.anvil.api.AnvilApi -import org.anvilpowered.anvil.api.user.requiresPermission -import org.anvilpowered.anvil.domain.command.CommandSource -import org.anvilpowered.anvil.domain.user.Component +import net.kyori.adventure.text.Component +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.core.user.requiresPermission import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt index 3abbb4d0b..122b16ee6 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -3,7 +3,7 @@ package org.anvilpowered.anvil.plugin import io.papermc.paper.event.server.ServerResourcesLoadEvent -import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.createPaper import org.bukkit.event.EventHandler import org.bukkit.event.Listener diff --git a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index 2c119467a..acc2aecdf 100644 --- a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt +++ b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -19,11 +19,12 @@ package org.anvilpowered.anvil.plugin import com.google.inject.Inject +import com.google.inject.Injector import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.api.AnvilApi +import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.velocity.createVelocity import org.slf4j.Logger @@ -36,9 +37,10 @@ import org.slf4j.Logger class AnvilVelocityPluginBootstrap @Inject constructor( private val logger: Logger, private val proxyServer: ProxyServer, + injector: Injector, ) { - private val plugin = with(AnvilApi.createVelocity(logger, proxyServer)) { + private val plugin = with(AnvilApi.createVelocity(injector)) { AnvilVelocityPlugin() } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 9a7ee2e2c..2bbf8dce9 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -7,6 +7,7 @@ dependencies { api(platform(libs.exposed.bom)) api(libs.bundles.exposed) api(libs.kbrig.brigadier) + api(libs.logging.api) compileOnlyApi(platform(libs.adventure.bom)) compileOnlyApi("net.kyori:adventure-api") diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt index 2b39d68c4..f68ca0e4d 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt @@ -20,6 +20,7 @@ package org.anvilpowered.anvil.core import org.anvilpowered.anvil.core.platform.Platform import org.anvilpowered.anvil.core.platform.PluginManager +import org.apache.logging.log4j.Logger /** * To create an instance of this interface, use the `AnvilApi.create` function. @@ -37,6 +38,9 @@ import org.anvilpowered.anvil.core.platform.PluginManager * ``` */ interface AnvilApi { + + val logger: Logger + val platform: Platform val pluginManager: PluginManager diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f95c8b32b..33dbb2715 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,9 +28,8 @@ ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" ktor-server-resources = { module = "io.ktor:ktor-server-resources", version.ref = "ktor" } ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = "ktor" } ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" } -logging = "org.lighthousegames:logging:1.3.0" -log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } -log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } +logging-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } +logging-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } paper = "io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT" redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.6.1" sponge = "org.spongepowered:spongeapi:8.1.0" diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt index cb30eaebf..4989eae99 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt @@ -1,13 +1,20 @@ +@file:Suppress("UnstableApiUsage") + package org.anvilpowered.anvil import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.platform.PaperPlatform import org.anvilpowered.anvil.platform.PaperPluginManager +import org.apache.logging.log4j.LogManager +import org.apache.logging.log4j.Logger +import org.bukkit.plugin.java.JavaPlugin interface AnvilPaperApi : AnvilApi +context(JavaPlugin) fun AnvilApi.Companion.createPaper(): AnvilPaperApi { return object : AnvilPaperApi { + override val logger: Logger = LogManager.getLogger(pluginMeta.name) override val platform = PaperPlatform override val pluginManager = PaperPluginManager } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt index d3657ec2e..0a21041c1 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt @@ -18,10 +18,11 @@ package org.anvilpowered.anvil.sponge +import com.google.inject.Injector import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.sponge.platform.SpongePlatform import org.anvilpowered.anvil.sponge.platform.SpongePluginManager -import org.slf4j.Logger +import org.apache.logging.log4j.Logger interface AnvilSpongeApi : AnvilApi { @@ -63,8 +64,9 @@ interface AnvilSpongeApi : AnvilApi { * } * ``` */ -fun AnvilApi.Companion.createSponge(logger: Logger): AnvilSpongeApi { +fun AnvilApi.Companion.createSponge(injector: Injector): AnvilSpongeApi { return object : AnvilSpongeApi { + override val logger: Logger = injector.getInstance(Logger::class.java) override val platform = SpongePlatform override val pluginManager = SpongePluginManager } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index 6d4a1106b..58f9502e0 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -18,10 +18,14 @@ package org.anvilpowered.anvil.velocity +import com.google.inject.Injector +import com.velocitypowered.api.plugin.PluginDescription import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.velocity.platform.VelocityPlatform import org.anvilpowered.anvil.velocity.platform.VelocityPluginManager +import org.apache.logging.log4j.LogManager +import org.apache.logging.log4j.Logger /** * A subtype of [AnvilApi] that also provides access to Velocity-specific APIs such as [ProxyServer]. @@ -43,8 +47,8 @@ interface AnvilVelocityApi : AnvilApi { */ @JvmStatic @JvmName("create") - fun doNotUse(proxyServer: ProxyServer): AnvilVelocityApi = - AnvilApi.createVelocity(proxyServer) + fun doNotUse(injector: Injector): AnvilVelocityApi = + AnvilApi.createVelocity(injector) } } @@ -83,8 +87,11 @@ interface AnvilVelocityApi : AnvilApi { * } * ``` */ -fun AnvilApi.Companion.createVelocity(proxyServer: ProxyServer): AnvilVelocityApi { +fun AnvilApi.Companion.createVelocity(injector: Injector): AnvilVelocityApi { + val proxyServer = injector.getInstance(ProxyServer::class.java) + val pluginDescription = injector.getInstance(PluginDescription::class.java) return object : AnvilVelocityApi { + override val logger: Logger = LogManager.getLogger(pluginDescription.id) override val platform = VelocityPlatform(proxyServer) override val pluginManager = VelocityPluginManager(proxyServer.pluginManager) override val proxyServer: ProxyServer = proxyServer From 52aece60720847d1c2de34596af9d5bf5350fdae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 14 Nov 2023 10:54:03 +0100 Subject: [PATCH 41/77] Add minimessage --- core/build.gradle.kts | 1 + gradle/libs.versions.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 2bbf8dce9..b1c2ee0f4 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -11,4 +11,5 @@ dependencies { compileOnlyApi(platform(libs.adventure.bom)) compileOnlyApi("net.kyori:adventure-api") + compileOnlyApi("net.kyori:adventure-text-minimessage") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 33dbb2715..284439f55 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ ktor = "2.3.0" log4j = "2.20.0" [libraries] -adventure-bom = "net.kyori:adventure-bom:4.13.1" +adventure-bom = "net.kyori:adventure-bom:4.14.0" annotations = "org.jetbrains:annotations:24.0.0" brigadier = "com.mojang:brigadier:1.0.18" exposed-bom = "org.jetbrains.exposed:exposed-bom:0.41.1" From f7d1be9885f5840fe31d417a18dc6b47a73cf77d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 14 Nov 2023 15:03:09 +0100 Subject: [PATCH 42/77] Add registry stuff --- core/build.gradle.kts | 1 + .../anvil/core/config/EnvironmentRegistry.kt | 33 +++++++++ .../org/anvilpowered/anvil/core/config/Key.kt | 73 +++++++++++++++++++ .../anvil/core/config/KeyNamespace.kt | 47 ++++++++++++ .../anvil/core/config/Registry.kt | 25 +++++++ .../anvil/core/config/TypeTokens.kt | 29 ++++++++ gradle/libs.versions.toml | 4 +- 7 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt diff --git a/core/build.gradle.kts b/core/build.gradle.kts index b1c2ee0f4..df6254544 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -8,6 +8,7 @@ dependencies { api(libs.bundles.exposed) api(libs.kbrig.brigadier) api(libs.logging.api) + api(libs.configurate.core) compileOnlyApi(platform(libs.adventure.bom)) compileOnlyApi("net.kyori:adventure-api") diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt new file mode 100644 index 000000000..2fa659658 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt @@ -0,0 +1,33 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +/** + * A [Registry] implementation that checks environment variables. + */ +class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { + override fun getStrict(key: Key): T? { + val value = System.getenv(key.name) ?: return delegate?.getStrict(key) + return key.parse(value) + } + + override fun getDefault(key: Key): T { + return delegate?.getDefault(key) ?: throw NoSuchElementException("No default value for key ${key.name}") + } +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt new file mode 100644 index 000000000..6334bade5 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -0,0 +1,73 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +context(KeyNamespace) +class Key( + val type: TypeToken, + val name: String, + val description: String? = null, + private val parser: (String) -> T? = getDefaultParser(type), // TODO: Proper parser interface with parsing exception + private val printer: (T) -> String = { it.toString() }, +) : Comparable> { + + val namespace: KeyNamespace = this@KeyNamespace + private val internalNamespace: KeyNamespaceImpl = this@KeyNamespace as KeyNamespaceImpl + + init { + check(name !in internalNamespace.keys) { "Key $name already exists in namespace $namespace" } + internalNamespace.keys[name] = this + } + + private val comparator = Comparator.comparing, String> { it.name } + .thenComparing(Comparator.comparing { it.type.type.typeName }) + + fun parse(value: String): T? = parser(value) + fun print(value: T): String = printer(value) + + override fun compareTo(other: Key): Int = comparator.compare(this, other) + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Key<*>) return false + return name == other.name && type.type == other.type.type + } + + override fun hashCode(): Int { + var result = type.hashCode() + result = 31 * result + name.hashCode() + return result + } + + override fun toString(): String = "Key(type=$type, name=$name, description=$description)" +} + +private fun getDefaultParser(type: TypeToken): (String) -> T? { + @Suppress("UNCHECKED_CAST") + return when (type.type) { + String::class.java -> { it -> it } + Int::class.java -> { it: String -> it.toIntOrNull() } + Long::class.java -> { it: String -> it.toLongOrNull() } + Float::class.java -> { it: String -> it.toFloatOrNull() } + Double::class.java -> { it: String -> it.toDoubleOrNull() } + Boolean::class.java -> { it: String -> it.toBooleanStrictOrNull() } + else -> throw IllegalArgumentException("There is no default parser for $type") + } as (String) -> T? +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt new file mode 100644 index 000000000..c6fd9e781 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt @@ -0,0 +1,47 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +sealed interface KeyNamespace { + val name: String + + operator fun get(keyName: String, type: TypeToken): Key? + + companion object { + fun create(name: String): KeyNamespace { + return KeyNamespaceImpl(name) + } + } +} + +internal class KeyNamespaceImpl(override val name: String) : KeyNamespace { + val keys: MutableMap> = mutableMapOf() + override fun get(keyName: String, type: TypeToken): Key? { + val key = keys[keyName] ?: return null + if (key.type != type) { + throw TypeCastException("Key $name has type ${key.type} which does not match provided type $type") + } + @Suppress("UNCHECKED_CAST") + return key as Key + } +} + +inline operator fun KeyNamespace.get(keyName: String): Key? = get(keyName, TypeToken.get(T::class.java)) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt new file mode 100644 index 000000000..31d9ccb4b --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt @@ -0,0 +1,25 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +interface Registry { + fun getStrict(key: Key): T? + fun getDefault(key: Key): T + operator fun get(key: Key): T = getStrict(key) ?: getDefault(key) +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt new file mode 100644 index 000000000..6e8b4f9d3 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt @@ -0,0 +1,29 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken +import java.time.ZoneId + +object TypeTokens { + val BOOLEAN: TypeToken = TypeToken.get(Boolean::class.java) + val INTEGER: TypeToken = TypeToken.get(Int::class.java) + val STRING: TypeToken = TypeToken.get(String::class.java) + val ZONE_ID: TypeToken = TypeToken.get(ZoneId::class.java) +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 284439f55..fcb891961 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -#kmongo = "4.8.0" +configurate = "4.1.2" kotlin = "1.9.20" ktor = "2.3.0" log4j = "2.20.0" @@ -8,6 +8,8 @@ log4j = "2.20.0" adventure-bom = "net.kyori:adventure-bom:4.14.0" annotations = "org.jetbrains:annotations:24.0.0" brigadier = "com.mojang:brigadier:1.0.18" +configurate-core = { module = "org.spongepowered:configurate-core", version.ref = "configurate" } +configurate-hocon = { module = "org.spongepowered:configurate-hocon", version.ref = "configurate" } exposed-bom = "org.jetbrains.exposed:exposed-bom:0.41.1" exposed-core = { module = "org.jetbrains.exposed:exposed-core" } exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } From 2ee92cb879705926dfd3c1977d491b9f3f39884c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 14 Nov 2023 15:13:40 +0100 Subject: [PATCH 43/77] Add add method to registry --- core/build.gradle.kts | 1 + .../kotlin/org/anvilpowered/anvil/core/config/Key.kt | 4 +--- .../anvilpowered/anvil/core/config/KeyNamespace.kt | 11 ++++++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index df6254544..1917c8bc8 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -9,6 +9,7 @@ dependencies { api(libs.kbrig.brigadier) api(libs.logging.api) api(libs.configurate.core) + api(libs.annotations) compileOnlyApi(platform(libs.adventure.bom)) compileOnlyApi("net.kyori:adventure-api") diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index 6334bade5..b073ebee2 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -30,11 +30,9 @@ class Key( ) : Comparable> { val namespace: KeyNamespace = this@KeyNamespace - private val internalNamespace: KeyNamespaceImpl = this@KeyNamespace as KeyNamespaceImpl init { - check(name !in internalNamespace.keys) { "Key $name already exists in namespace $namespace" } - internalNamespace.keys[name] = this + namespace.add(this) } private val comparator = Comparator.comparing, String> { it.name } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt index c6fd9e781..260cd9725 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt @@ -19,12 +19,16 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken +import org.jetbrains.annotations.ApiStatus -sealed interface KeyNamespace { +interface KeyNamespace { val name: String operator fun get(keyName: String, type: TypeToken): Key? + @ApiStatus.Internal + fun add(key: Key) + companion object { fun create(name: String): KeyNamespace { return KeyNamespaceImpl(name) @@ -34,6 +38,7 @@ sealed interface KeyNamespace { internal class KeyNamespaceImpl(override val name: String) : KeyNamespace { val keys: MutableMap> = mutableMapOf() + override fun get(keyName: String, type: TypeToken): Key? { val key = keys[keyName] ?: return null if (key.type != type) { @@ -42,6 +47,10 @@ internal class KeyNamespaceImpl(override val name: String) : KeyNamespace { @Suppress("UNCHECKED_CAST") return key as Key } + + override fun add(key: Key) { + keys[key.name] = key + } } inline operator fun KeyNamespace.get(keyName: String): Key? = get(keyName, TypeToken.get(T::class.java)) From 8aaef1b9d2441a00c74b8e381b62703979204879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 14 Nov 2023 15:28:15 +0100 Subject: [PATCH 44/77] Add KeyBuilder dsl --- .../org/anvilpowered/anvil/core/config/Key.kt | 33 ++++---- .../anvil/core/config/KeyBuilder.kt | 76 +++++++++++++++++ .../anvil/core/config/KeyBuilderDsl.kt | 22 +++++ .../anvil/core/config/KeyBuilderImpl.kt | 82 +++++++++++++++++++ 4 files changed, 197 insertions(+), 16 deletions(-) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderDsl.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index b073ebee2..fead98957 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -19,14 +19,16 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken +import kotlin.experimental.ExperimentalTypeInference context(KeyNamespace) -class Key( +class Key internal constructor( val type: TypeToken, val name: String, - val description: String? = null, - private val parser: (String) -> T? = getDefaultParser(type), // TODO: Proper parser interface with parsing exception - private val printer: (T) -> String = { it.toString() }, + val fallback: T, + val description: String?, + private val parser: (String) -> T?, + private val printer: (T) -> String, ) : Comparable> { val namespace: KeyNamespace = this@KeyNamespace @@ -55,17 +57,16 @@ class Key( } override fun toString(): String = "Key(type=$type, name=$name, description=$description)" -} -private fun getDefaultParser(type: TypeToken): (String) -> T? { - @Suppress("UNCHECKED_CAST") - return when (type.type) { - String::class.java -> { it -> it } - Int::class.java -> { it: String -> it.toIntOrNull() } - Long::class.java -> { it: String -> it.toLongOrNull() } - Float::class.java -> { it: String -> it.toFloatOrNull() } - Double::class.java -> { it: String -> it.toDoubleOrNull() } - Boolean::class.java -> { it: String -> it.toBooleanStrictOrNull() } - else -> throw IllegalArgumentException("There is no default parser for $type") - } as (String) -> T? + companion object { + fun builder(type: TypeToken): KeyBuilder { + return KeyBuilderImpl(type) + } + + context(KeyNamespace) + @OptIn(ExperimentalTypeInference::class) + inline fun build(@BuilderInference block: KeyBuilder.() -> Unit): Key { + return builder(object : TypeToken() {}).apply(block).build() + } + } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt new file mode 100644 index 000000000..705cf0590 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt @@ -0,0 +1,76 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +@KeyBuilderDsl +interface KeyBuilder { + /** + * Sets the name of the generated [Key] + * + * @param name The name to set + * @return `this` + */ + @KeyBuilderDsl + fun name(name: String): KeyBuilder + + /** + * Sets the fallback value of the generated [Key] + * + * @param fallbackValue The fallback value to set + * @return `this` + */ + @KeyBuilderDsl + fun fallback(fallbackValue: T?): KeyBuilder + + /** + * Sets the description of the generated [Key]. + * + * @param description The description to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun description(description: String?): KeyBuilder + + /** + * Sets the parser of the generated [Key]. + * + * @param parser The parser to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun parser(parser: ((String) -> T)?): KeyBuilder + + /** + * Sets the toStringer of the generated [Key]. + * + * @param toStringer The toStringer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun printer(toStringer: ((T) -> String)?): KeyBuilder + + /** + * Generates a [Key] based on this builder. + * + * @return The generated [Key] + */ + context(KeyNamespace) + @KeyBuilderDsl + fun build(): Key +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderDsl.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderDsl.kt new file mode 100644 index 000000000..e5482e386 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderDsl.kt @@ -0,0 +1,22 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +@DslMarker +annotation class KeyBuilderDsl diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt new file mode 100644 index 000000000..f937570ea --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt @@ -0,0 +1,82 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +internal class KeyBuilderImpl(type: TypeToken) : KeyBuilder { + private val type: TypeToken + private var name: String = "" + private var fallbackValue: T? = null + private var description: String? = null + private var parser: ((String) -> T)? = null + private var printer: ((T) -> String)? = null + + init { + this.type = type + } + + override fun name(name: String): KeyBuilderImpl { + this.name = name + return this + } + + override fun fallback(fallbackValue: T?): KeyBuilderImpl { + this.fallbackValue = fallbackValue + return this + } + + override fun description(description: String?): KeyBuilderImpl { + this.description = description + return this + } + + override fun parser(parser: ((String) -> T)?): KeyBuilderImpl { + this.parser = parser + return this + } + + override fun printer(printer: ((T) -> String)?): KeyBuilderImpl { + this.printer = printer + return this + } + + context(KeyNamespace) + override fun build(): Key = Key( + type, + name, + requireNotNull(fallbackValue) { "fallbackValue not set" }, + description, + parser ?: getDefaultParser(type), // TODO: Proper parser interface with parsing exception + printer ?: { it.toString() }, + ) +} + +private fun getDefaultParser(type: TypeToken): (String) -> T? { + @Suppress("UNCHECKED_CAST") + return when (type.type) { + String::class.java -> { it -> it } + Int::class.java -> { it: String -> it.toIntOrNull() } + Long::class.java -> { it: String -> it.toLongOrNull() } + Float::class.java -> { it: String -> it.toFloatOrNull() } + Double::class.java -> { it: String -> it.toDoubleOrNull() } + Boolean::class.java -> { it: String -> it.toBooleanStrictOrNull() } + else -> throw IllegalArgumentException("There is no default parser for $type") + } as (String) -> T? +} From b59e64249459fefc6e4b62c1dcce670b2cd2fecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 14 Nov 2023 15:42:32 +0100 Subject: [PATCH 45/77] Add Key.building PropertyDelegateProvider --- .../org/anvilpowered/anvil/core/config/Key.kt | 18 +++++++++++++++--- .../anvil/core/config/KeyBuilder.kt | 1 - gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index fead98957..5002232db 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -20,6 +20,8 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken import kotlin.experimental.ExperimentalTypeInference +import kotlin.properties.PropertyDelegateProvider +import kotlin.properties.ReadOnlyProperty context(KeyNamespace) class Key internal constructor( @@ -59,14 +61,24 @@ class Key internal constructor( override fun toString(): String = "Key(type=$type, name=$name, description=$description)" companion object { - fun builder(type: TypeToken): KeyBuilder { - return KeyBuilderImpl(type) - } + fun builder(type: TypeToken): KeyBuilder = KeyBuilderImpl(type) context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) inline fun build(@BuilderInference block: KeyBuilder.() -> Unit): Key { return builder(object : TypeToken() {}).apply(block).build() } + + context(KeyNamespace) + @OptIn(ExperimentalTypeInference::class) + inline fun building( + @BuilderInference crossinline block: KeyBuilder.() -> Unit, + ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> + val builder = builder(object : TypeToken() {}) + builder.name(property.name) + builder.block() + val key = builder.build() + ReadOnlyProperty { _, _ -> key } + } } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt index 705cf0590..3261fd4a0 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt @@ -71,6 +71,5 @@ interface KeyBuilder { * @return The generated [Key] */ context(KeyNamespace) - @KeyBuilderDsl fun build(): Key } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 744c64d12..309b4e18d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 985c46fef402d442ab6b2de4abc72bcd86a969da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Tue, 14 Nov 2023 15:46:36 +0100 Subject: [PATCH 46/77] Add NamedKeyBuilder --- .../org/anvilpowered/anvil/core/config/Key.kt | 4 ++-- .../anvil/core/config/KeyBuilder.kt | 20 +++++++++++-------- .../anvil/core/config/KeyBuilderImpl.kt | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index 5002232db..98ccad1c3 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -61,11 +61,11 @@ class Key internal constructor( override fun toString(): String = "Key(type=$type, name=$name, description=$description)" companion object { - fun builder(type: TypeToken): KeyBuilder = KeyBuilderImpl(type) + fun builder(type: TypeToken): NamedKeyBuilder = KeyBuilderImpl(type) context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) - inline fun build(@BuilderInference block: KeyBuilder.() -> Unit): Key { + inline fun build(@BuilderInference block: NamedKeyBuilder.() -> Unit): Key { return builder(object : TypeToken() {}).apply(block).build() } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt index 3261fd4a0..77431b25f 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt @@ -20,14 +20,6 @@ package org.anvilpowered.anvil.core.config @KeyBuilderDsl interface KeyBuilder { - /** - * Sets the name of the generated [Key] - * - * @param name The name to set - * @return `this` - */ - @KeyBuilderDsl - fun name(name: String): KeyBuilder /** * Sets the fallback value of the generated [Key] @@ -73,3 +65,15 @@ interface KeyBuilder { context(KeyNamespace) fun build(): Key } + +@KeyBuilderDsl +interface NamedKeyBuilder : KeyBuilder { + /** + * Sets the name of the generated [Key] + * + * @param name The name to set + * @return `this` + */ + @KeyBuilderDsl + fun name(name: String): KeyBuilder +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt index f937570ea..2cb41fb92 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt @@ -20,7 +20,7 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken -internal class KeyBuilderImpl(type: TypeToken) : KeyBuilder { +internal class KeyBuilderImpl(type: TypeToken) : NamedKeyBuilder { private val type: TypeToken private var name: String = "" private var fallbackValue: T? = null From 118ad12845da66ebb257df527aa650b11736f1b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 15 Nov 2023 12:24:54 +0100 Subject: [PATCH 47/77] Fix some parameter names and add Registry.Scope --- .../anvil/core/command/PlayerCommandScope.kt | 2 +- .../org/anvilpowered/anvil/core/config/Registry.kt | 4 ++++ .../anvilpowered/anvil/command/PaperCustomCommand.kt | 10 +++++----- .../anvil/velocity/command/VelocityCustomCommand.kt | 6 +++--- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt index 2dfe27aca..38277166c 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt @@ -26,7 +26,7 @@ import org.anvilpowered.kbrig.context.CommandContext interface PlayerCommandScope { fun ArgumentBuilder.Companion.player( - name: String = "player", + argumentName: String = "player", command: (context: CommandContext, player: Player) -> Int, ): RequiredArgumentBuilder } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt index 31d9ccb4b..57e2ea88d 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt @@ -22,4 +22,8 @@ interface Registry { fun getStrict(key: Key): T? fun getDefault(key: Key): T operator fun get(key: Key): T = getStrict(key) ?: getDefault(key) + + interface Scope { + val registry: Registry + } } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt index f1cb444ce..5ff09fc6b 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt @@ -18,23 +18,23 @@ context(AnvilPaperApi) class PaperCustomCommand : PlayerCommandScope { override fun ArgumentBuilder.Companion.player( - name: String, + argumentName: String, command: (context: CommandContext, player: Player) -> Int, ): RequiredArgumentBuilder = - required(name, StringArgumentType.SingleWord) + required(argumentName, StringArgumentType.SingleWord) .suggests { _, builder -> Bukkit.getOnlinePlayers().forEach { player -> builder.suggest(player.name) } builder.build() } .executes { context -> - val playerName = context.get(name) - Bukkit.getPlayer(playerName)?.let { paperPlayer -> + val username = context.get(argumentName) + Bukkit.getPlayer(username)?.let { paperPlayer -> command(context, paperPlayer.toAnvilPlayer()) } ?: run { context.source.audience.sendMessage( Component.text() .append(Component.text("Player with name ", NamedTextColor.RED)) - .append(Component.text(playerName, NamedTextColor.GOLD)) + .append(Component.text(username, NamedTextColor.GOLD)) .append(Component.text(" not found!", NamedTextColor.RED)), ) 0 diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt index 4dda32e6d..2447b459f 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt @@ -18,16 +18,16 @@ context(AnvilVelocityApi) class VelocityCustomCommand : PlayerCommandScope { override fun ArgumentBuilder.Companion.player( - name: String, + argumentName: String, command: (context: CommandContext, player: Player) -> Int, ): RequiredArgumentBuilder = - required(name, StringArgumentType.SingleWord) + required(argumentName, StringArgumentType.SingleWord) .suggests { _, builder -> proxyServer.allPlayers.forEach { player -> builder.suggest(player.username) } builder.build() } .executes { context -> - val playerName = context.get(name) + val playerName = context.get(argumentName) proxyServer.getPlayer(playerName).getOrNull()?.let { velocityPlayer -> command(context, velocityPlayer.toAnvilPlayer()) } ?: run { From 94cf092300a1b8811bec926e0026c67906cf1926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 15 Nov 2023 12:37:48 +0100 Subject: [PATCH 48/77] Add PlayerService --- .../org/anvilpowered/anvil/core/AnvilApi.kt | 3 +- .../anvil/core/user/PlayerService.kt | 34 ++++++++++++++++++ .../org/anvilpowered/anvil/AnvilPaperApi.kt | 3 ++ .../anvil/user/PaperPlayerService.kt | 35 ++++++++++++++++++ .../anvil/sponge/AnvilSpongeApi.kt | 3 ++ .../anvil/sponge/user/SpongePlayerService.kt | 35 ++++++++++++++++++ .../anvil/velocity/AnvilVelocityApi.kt | 6 ++-- .../anvil/velocity/ProxyServerScope.kt | 25 +++++++++++++ .../velocity/user/VelocityPlayerService.kt | 36 +++++++++++++++++++ 9 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt create mode 100644 paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt create mode 100644 sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt create mode 100644 velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/ProxyServerScope.kt create mode 100644 velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt index f68ca0e4d..a26f40538 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt @@ -20,6 +20,7 @@ package org.anvilpowered.anvil.core import org.anvilpowered.anvil.core.platform.Platform import org.anvilpowered.anvil.core.platform.PluginManager +import org.anvilpowered.anvil.core.user.PlayerService import org.apache.logging.log4j.Logger /** @@ -37,7 +38,7 @@ import org.apache.logging.log4j.Logger * AnvilApi.createVelocity("my-plugin", ....) * ``` */ -interface AnvilApi { +interface AnvilApi : PlayerService.Scope { val logger: Logger diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt new file mode 100644 index 000000000..b349340f6 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt @@ -0,0 +1,34 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.user + +import java.util.UUID + +interface PlayerService { + + operator fun get(username: String): Player? + + operator fun get(id: UUID): Player? + + fun getAll(startsWith: String): Sequence + + interface Scope { + val playerService: PlayerService + } +} diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt index 4989eae99..cb721d78c 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt @@ -3,8 +3,10 @@ package org.anvilpowered.anvil import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.user.PlayerService import org.anvilpowered.anvil.platform.PaperPlatform import org.anvilpowered.anvil.platform.PaperPluginManager +import org.anvilpowered.anvil.user.PaperPlayerService import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger import org.bukkit.plugin.java.JavaPlugin @@ -17,5 +19,6 @@ fun AnvilApi.Companion.createPaper(): AnvilPaperApi { override val logger: Logger = LogManager.getLogger(pluginMeta.name) override val platform = PaperPlatform override val pluginManager = PaperPluginManager + override val playerService: PlayerService = PaperPlayerService() } } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt new file mode 100644 index 000000000..e281521ba --- /dev/null +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt @@ -0,0 +1,35 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.user + +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.PlayerService +import org.bukkit.Bukkit +import java.util.UUID + +class PaperPlayerService : PlayerService { + override fun get(username: String): Player? = + Bukkit.getPlayerExact(username)?.toAnvilPlayer() + + override fun get(id: UUID): Player? = + Bukkit.getPlayer(id)?.toAnvilPlayer() + + override fun getAll(startsWith: String): Sequence = + Bukkit.getOnlinePlayers().asSequence().map { it.toAnvilPlayer() } +} diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt index 0a21041c1..b01aba1a9 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt @@ -20,8 +20,10 @@ package org.anvilpowered.anvil.sponge import com.google.inject.Injector import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.user.PlayerService import org.anvilpowered.anvil.sponge.platform.SpongePlatform import org.anvilpowered.anvil.sponge.platform.SpongePluginManager +import org.anvilpowered.anvil.sponge.user.SpongePlayerService import org.apache.logging.log4j.Logger interface AnvilSpongeApi : AnvilApi { @@ -69,5 +71,6 @@ fun AnvilApi.Companion.createSponge(injector: Injector): AnvilSpongeApi { override val logger: Logger = injector.getInstance(Logger::class.java) override val platform = SpongePlatform override val pluginManager = SpongePluginManager + override val playerService: PlayerService = SpongePlayerService() } } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt new file mode 100644 index 000000000..cbf45269d --- /dev/null +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt @@ -0,0 +1,35 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.sponge.user + +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.PlayerService +import org.spongepowered.api.Sponge +import java.util.UUID + +class SpongePlayerService : PlayerService { + override fun get(username: String): Player? = + Sponge.server().player(username).orElse(null)?.toAnvilPlayer() + + override fun get(id: UUID): Player? = + Sponge.server().player(id).orElse(null)?.toAnvilPlayer() + + override fun getAll(startsWith: String): Sequence = + Sponge.server().onlinePlayers().asSequence().map { it.toAnvilPlayer() } +} diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index 58f9502e0..d63da1adf 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -22,8 +22,10 @@ import com.google.inject.Injector import com.velocitypowered.api.plugin.PluginDescription import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.user.PlayerService import org.anvilpowered.anvil.velocity.platform.VelocityPlatform import org.anvilpowered.anvil.velocity.platform.VelocityPluginManager +import org.anvilpowered.anvil.velocity.user.VelocityPlayerService import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger @@ -34,8 +36,7 @@ import org.apache.logging.log4j.Logger * * If you are using Java, the method [AnvilVelocityApi.doNotUse] is provided as an alternative. */ -interface AnvilVelocityApi : AnvilApi { - val proxyServer: ProxyServer +interface AnvilVelocityApi : AnvilApi, ProxyServerScope { companion object { /** @@ -95,5 +96,6 @@ fun AnvilApi.Companion.createVelocity(injector: Injector): AnvilVelocityApi { override val platform = VelocityPlatform(proxyServer) override val pluginManager = VelocityPluginManager(proxyServer.pluginManager) override val proxyServer: ProxyServer = proxyServer + override val playerService: PlayerService = VelocityPlayerService() } } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/ProxyServerScope.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/ProxyServerScope.kt new file mode 100644 index 000000000..bcab6fc8c --- /dev/null +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/ProxyServerScope.kt @@ -0,0 +1,25 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.velocity + +import com.velocitypowered.api.proxy.ProxyServer + +interface ProxyServerScope { + val proxyServer: ProxyServer +} diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt new file mode 100644 index 000000000..d1f39ca42 --- /dev/null +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt @@ -0,0 +1,36 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.velocity.user + +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.PlayerService +import org.anvilpowered.anvil.velocity.ProxyServerScope +import java.util.UUID + +context(ProxyServerScope) +class VelocityPlayerService : PlayerService { + override fun get(username: String): Player? = + proxyServer.getPlayer(username).orElse(null)?.toAnvilPlayer() + + override fun get(id: UUID): Player? = + proxyServer.getPlayer(id).orElse(null)?.toAnvilPlayer() + + override fun getAll(startsWith: String): Sequence = + proxyServer.allPlayers.asSequence().map { it.toAnvilPlayer() } +} From 591fe285047311c370dde18f2d2c43f68c11a85c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 15 Nov 2023 12:37:58 +0100 Subject: [PATCH 49/77] Fix printer name --- .../kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt index 77431b25f..45c910a27 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt @@ -51,11 +51,11 @@ interface KeyBuilder { /** * Sets the toStringer of the generated [Key]. * - * @param toStringer The toStringer to set or `null` to remove it + * @param printer The toStringer to set or `null` to remove it * @return `this` */ @KeyBuilderDsl - fun printer(toStringer: ((T) -> String)?): KeyBuilder + fun printer(printer: ((T) -> String)?): KeyBuilder /** * Generates a [Key] based on this builder. From 47e73a07c172995aad6efd746ff9e2f600f58104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 15 Nov 2023 12:42:12 +0100 Subject: [PATCH 50/77] Update PlayerService.getAll --- .../org/anvilpowered/anvil/core/user/PlayerService.kt | 2 +- .../org/anvilpowered/anvil/user/PaperPlayerService.kt | 6 ++++-- .../anvilpowered/anvil/sponge/user/SpongePlayerService.kt | 6 ++++-- .../anvil/velocity/user/VelocityPlayerService.kt | 6 ++++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt index b349340f6..804e21e79 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt @@ -26,7 +26,7 @@ interface PlayerService { operator fun get(id: UUID): Player? - fun getAll(startsWith: String): Sequence + fun getAll(startsWith: String = ""): Sequence interface Scope { val playerService: PlayerService diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt index e281521ba..dc1cb1be8 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt @@ -30,6 +30,8 @@ class PaperPlayerService : PlayerService { override fun get(id: UUID): Player? = Bukkit.getPlayer(id)?.toAnvilPlayer() - override fun getAll(startsWith: String): Sequence = - Bukkit.getOnlinePlayers().asSequence().map { it.toAnvilPlayer() } + override fun getAll(startsWith: String): Sequence = when (startsWith) { + "" -> Bukkit.getOnlinePlayers().asSequence().map { it.toAnvilPlayer() } + else -> Bukkit.matchPlayer(startsWith).asSequence().map { it.toAnvilPlayer() } + } } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt index cbf45269d..c6bc1cfdf 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt @@ -30,6 +30,8 @@ class SpongePlayerService : PlayerService { override fun get(id: UUID): Player? = Sponge.server().player(id).orElse(null)?.toAnvilPlayer() - override fun getAll(startsWith: String): Sequence = - Sponge.server().onlinePlayers().asSequence().map { it.toAnvilPlayer() } + override fun getAll(startsWith: String): Sequence = when (startsWith) { + "" -> Sponge.server().onlinePlayers().asSequence().map { it.toAnvilPlayer() } + else -> Sponge.server().onlinePlayers().asSequence().filter { it.name().startsWith(startsWith) }.map { it.toAnvilPlayer() } + } } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt index d1f39ca42..48a85a313 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt @@ -31,6 +31,8 @@ class VelocityPlayerService : PlayerService { override fun get(id: UUID): Player? = proxyServer.getPlayer(id).orElse(null)?.toAnvilPlayer() - override fun getAll(startsWith: String): Sequence = - proxyServer.allPlayers.asSequence().map { it.toAnvilPlayer() } + override fun getAll(startsWith: String): Sequence = when (startsWith) { + "" -> proxyServer.allPlayers.asSequence().map { it.toAnvilPlayer() } + else -> proxyServer.matchPlayer(startsWith).asSequence().map { it.toAnvilPlayer() } + } } From 6d717fdc6e142121bae3eacae9d409811bf0d822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 15 Nov 2023 15:46:09 +0100 Subject: [PATCH 51/77] Add LoggerScope --- .../org/anvilpowered/anvil/core/AnvilApi.kt | 4 +-- .../anvilpowered/anvil/core/LoggerScope.kt | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/LoggerScope.kt diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt index a26f40538..e3a30f3eb 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt @@ -38,9 +38,7 @@ import org.apache.logging.log4j.Logger * AnvilApi.createVelocity("my-plugin", ....) * ``` */ -interface AnvilApi : PlayerService.Scope { - - val logger: Logger +interface AnvilApi : PlayerService.Scope, LoggerScope { val platform: Platform diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/LoggerScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/LoggerScope.kt new file mode 100644 index 000000000..ace9c8ab7 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/LoggerScope.kt @@ -0,0 +1,26 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core + +import org.apache.logging.log4j.Logger + +interface LoggerScope { + + val logger: Logger +} From 1ce7536c2364c09f82708624ff4836b6e9044a61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 15 Nov 2023 16:27:40 +0100 Subject: [PATCH 52/77] Fix paper subdir and add lots of command stuff --- .../anvil/plugin/AnvilPaperPlugin.kt | 4 +- .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 2 +- core/build.gradle.kts | 1 + .../anvilpowered/anvil/core/PlatformType.kt | 24 +++++++++++ .../anvil/core/command/CommandExecutor.kt | 24 +++++++++++ .../anvil/core/command/CommandSource.kt | 3 +- .../anvilpowered/anvil/core/user/Subject.kt | 4 +- .../org/anvilpowered/anvil/AnvilPaperApi.kt | 24 ----------- .../anvilpowered/anvil/paper/AnvilPaperApi.kt | 42 +++++++++++++++++++ .../command/AnvilPaperCommandSource.kt | 14 +++---- .../paper/command/PaperCommandExecutor.kt | 30 +++++++++++++ .../{ => paper}/command/PaperCustomCommand.kt | 6 +-- .../command/PaperSourceConverter.kt | 2 +- .../{ => paper}/platform/PaperPlatform.kt | 2 +- .../anvil/{ => paper}/platform/PaperPlugin.kt | 2 +- .../platform/PaperPluginManager.kt | 2 +- .../{ => paper}/user/AnvilPaperPlayer.kt | 10 ++--- .../{ => paper}/user/AnvilPaperSubject.kt | 8 ++-- .../{ => paper}/user/PaperPlayerService.kt | 2 +- .../sponge/user/AnvilSpongeCommandSource.kt | 36 ++++++++++++++++ .../anvil/sponge/user/AnvilSpongePlayer.kt | 6 +-- .../anvil/sponge/user/AnvilSpongeSubject.kt | 4 +- .../sponge/user/SpongeCommandExecutor.kt | 34 +++++++++++++++ .../command/AnvilVelocityCommandSource.kt | 8 ++-- .../command/VelocityCommandExecutor.kt | 35 ++++++++++++++++ .../velocity/user/AnvilVelocitySubject.kt | 4 +- 26 files changed, 269 insertions(+), 64 deletions(-) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/PlatformType.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt delete mode 100644 paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt create mode 100644 paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/command/AnvilPaperCommandSource.kt (59%) create mode 100644 paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/command/PaperCustomCommand.kt (92%) rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/command/PaperSourceConverter.kt (97%) rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/platform/PaperPlatform.kt (91%) rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/platform/PaperPlugin.kt (86%) rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/platform/PaperPluginManager.kt (86%) rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/user/AnvilPaperPlayer.kt (58%) rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/user/AnvilPaperSubject.kt (61%) rename paper/src/main/kotlin/org/anvilpowered/anvil/{ => paper}/user/PaperPlayerService.kt (97%) create mode 100644 sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeCommandSource.kt create mode 100644 sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt create mode 100644 velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt index a834f6a86..94ddac117 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt @@ -3,8 +3,8 @@ package org.anvilpowered.anvil.plugin import io.papermc.paper.event.server.ServerResourcesLoadEvent -import org.anvilpowered.anvil.AnvilPaperApi -import org.anvilpowered.anvil.command.toPaper +import org.anvilpowered.anvil.paper.AnvilPaperApi +import org.anvilpowered.anvil.paper.command.toPaper import org.bukkit.plugin.Plugin context(AnvilPaperApi) diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt index 122b16ee6..7f7c4f8cd 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -4,7 +4,7 @@ package org.anvilpowered.anvil.plugin import io.papermc.paper.event.server.ServerResourcesLoadEvent import org.anvilpowered.anvil.core.AnvilApi -import org.anvilpowered.anvil.createPaper +import org.anvilpowered.anvil.paper.createPaper import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 1917c8bc8..6717d11ed 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { api(libs.logging.api) api(libs.configurate.core) api(libs.annotations) + api(libs.kotlinx.coroutines) compileOnlyApi(platform(libs.adventure.bom)) compileOnlyApi("net.kyori:adventure-api") diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/PlatformType.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/PlatformType.kt new file mode 100644 index 000000000..54465eefb --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/PlatformType.kt @@ -0,0 +1,24 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core + +interface PlatformType { + + val platformDelegate: Any +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt new file mode 100644 index 000000000..dd8b0e89d --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt @@ -0,0 +1,24 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.command + +interface CommandExecutor { + + suspend fun execute(source: CommandSource, command: String): Boolean +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt index 5cc4bc5cf..d4ca756b2 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt @@ -19,10 +19,11 @@ package org.anvilpowered.anvil.core.command import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.PlatformType import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.Subject -interface CommandSource { +interface CommandSource : PlatformType { val audience: Audience diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt index 9ed67dc40..5ceb72228 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt @@ -18,7 +18,9 @@ package org.anvilpowered.anvil.core.user -interface Subject { +import org.anvilpowered.anvil.core.PlatformType + +interface Subject : PlatformType { /** * Checks if the subject has the specified permission. diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt deleted file mode 100644 index cb721d78c..000000000 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/AnvilPaperApi.kt +++ /dev/null @@ -1,24 +0,0 @@ -@file:Suppress("UnstableApiUsage") - -package org.anvilpowered.anvil - -import org.anvilpowered.anvil.core.AnvilApi -import org.anvilpowered.anvil.core.user.PlayerService -import org.anvilpowered.anvil.platform.PaperPlatform -import org.anvilpowered.anvil.platform.PaperPluginManager -import org.anvilpowered.anvil.user.PaperPlayerService -import org.apache.logging.log4j.LogManager -import org.apache.logging.log4j.Logger -import org.bukkit.plugin.java.JavaPlugin - -interface AnvilPaperApi : AnvilApi - -context(JavaPlugin) -fun AnvilApi.Companion.createPaper(): AnvilPaperApi { - return object : AnvilPaperApi { - override val logger: Logger = LogManager.getLogger(pluginMeta.name) - override val platform = PaperPlatform - override val pluginManager = PaperPluginManager - override val playerService: PlayerService = PaperPlayerService() - } -} diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt new file mode 100644 index 000000000..46a083bce --- /dev/null +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt @@ -0,0 +1,42 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +@file:Suppress("UnstableApiUsage") + +package org.anvilpowered.anvil.paper + +import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.user.PlayerService +import org.anvilpowered.anvil.paper.platform.PaperPlatform +import org.anvilpowered.anvil.paper.platform.PaperPluginManager +import org.anvilpowered.anvil.paper.user.PaperPlayerService +import org.apache.logging.log4j.LogManager +import org.apache.logging.log4j.Logger +import org.bukkit.plugin.java.JavaPlugin + +interface AnvilPaperApi : AnvilApi + +context(JavaPlugin) +fun AnvilApi.Companion.createPaper(): AnvilPaperApi { + return object : AnvilPaperApi { + override val logger: Logger = LogManager.getLogger(pluginMeta.name) + override val platform = PaperPlatform + override val pluginManager = PaperPluginManager + override val playerService: PlayerService = PaperPlayerService() + } +} diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/AnvilPaperCommandSource.kt similarity index 59% rename from paper/src/main/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/AnvilPaperCommandSource.kt index 098266ff5..c5323df1a 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/command/AnvilPaperCommandSource.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/AnvilPaperCommandSource.kt @@ -1,12 +1,12 @@ -package org.anvilpowered.anvil.command +package org.anvilpowered.anvil.paper.command import io.papermc.paper.command.brigadier.CommandSourceStack import net.kyori.adventure.audience.Audience import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.Subject -import org.anvilpowered.anvil.user.toAnvilPlayer -import org.anvilpowered.anvil.user.toAnvilSubject +import org.anvilpowered.anvil.paper.user.toAnvilPlayer +import org.anvilpowered.anvil.paper.user.toAnvilSubject import org.bukkit.command.CommandSender import org.bukkit.entity.Player as PaperPlayer @@ -16,9 +16,9 @@ fun CommandSender.toAnvilCommandSource(): CommandSource = AnvilPaperCommandSourc fun CommandSourceStack.toAnvilCommandSource(): CommandSource = AnvilPaperCommandSource(sender) private class AnvilPaperCommandSource( - paperCommandSource: CommandSender, + override val platformDelegate: CommandSender, ) : CommandSource { - override val audience: Audience = paperCommandSource - override val subject: Subject = paperCommandSource.toAnvilSubject() - override val player: Player? = (paperCommandSource as? PaperPlayer)?.toAnvilPlayer() + override val audience: Audience = platformDelegate + override val subject: Subject = platformDelegate.toAnvilSubject() + override val player: Player? = (platformDelegate as? PaperPlayer)?.toAnvilPlayer() } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt new file mode 100644 index 000000000..15b4c4a75 --- /dev/null +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt @@ -0,0 +1,30 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.paper.command + +import org.anvilpowered.anvil.core.command.CommandExecutor +import org.anvilpowered.anvil.core.command.CommandSource +import org.bukkit.Bukkit +import org.bukkit.command.CommandSender + +class PaperCommandExecutor : CommandExecutor { + override suspend fun execute(source: CommandSource, command: String): Boolean { + return Bukkit.dispatchCommand(source.platformDelegate as CommandSender, command) + } +} diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt similarity index 92% rename from paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt index 5ff09fc6b..b0b59f808 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperCustomCommand.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt @@ -1,12 +1,12 @@ -package org.anvilpowered.anvil.command +package org.anvilpowered.anvil.paper.command import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.AnvilPaperApi +import org.anvilpowered.anvil.paper.AnvilPaperApi import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.core.command.PlayerCommandScope import org.anvilpowered.anvil.core.user.Player -import org.anvilpowered.anvil.user.toAnvilPlayer +import org.anvilpowered.anvil.paper.user.toAnvilPlayer import org.anvilpowered.kbrig.argument.StringArgumentType import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.RequiredArgumentBuilder diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperSourceConverter.kt similarity index 97% rename from paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperSourceConverter.kt index 4e0700699..216762414 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/command/PaperSourceConverter.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperSourceConverter.kt @@ -19,7 +19,7 @@ @file:JvmName("PaperSourceConverter") @file:Suppress("UnstableApiUsage") -package org.anvilpowered.anvil.command +package org.anvilpowered.anvil.paper.command import io.papermc.paper.command.brigadier.CommandSourceStack import org.anvilpowered.anvil.core.command.CommandSource diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt similarity index 91% rename from paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt index 96910b839..0194f1675 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlatform.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.paper.platform import org.anvilpowered.anvil.core.platform.GamePlatform import org.anvilpowered.anvil.core.platform.Plugin diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlugin.kt similarity index 86% rename from paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlugin.kt index 93d6c2c34..9c15fac8b 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPlugin.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlugin.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.paper.platform import org.anvilpowered.anvil.core.platform.Plugin import org.bukkit.plugin.Plugin as BukkitPlugin diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPluginManager.kt similarity index 86% rename from paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPluginManager.kt index bbdfe51c2..eb0244799 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/platform/PaperPluginManager.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPluginManager.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.platform +package org.anvilpowered.anvil.paper.platform import org.anvilpowered.anvil.core.platform.Plugin import org.anvilpowered.anvil.core.platform.PluginManager diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt similarity index 58% rename from paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt index 07b24a499..b4e4554d7 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperPlayer.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.paper.user import net.kyori.adventure.audience.Audience import org.anvilpowered.anvil.core.user.Player @@ -9,9 +9,9 @@ import org.bukkit.entity.Player as PaperPlayer fun PaperPlayer.toAnvilPlayer(): Player = AnvilPaperPlayer(this) private class AnvilPaperPlayer( - val paperPlayer: PaperPlayer, + override val platformDelegate: PaperPlayer, ) : Player, - Audience by paperPlayer, - Subject by paperPlayer.toAnvilSubject() { - override val id: UUID = paperPlayer.uniqueId + Audience by platformDelegate, + Subject by platformDelegate.toAnvilSubject() { + override val id: UUID = platformDelegate.uniqueId } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperSubject.kt similarity index 61% rename from paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperSubject.kt index ac5e90722..3929c2c0a 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/user/AnvilPaperSubject.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperSubject.kt @@ -1,4 +1,4 @@ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.paper.user import org.anvilpowered.anvil.core.user.Subject import org.bukkit.permissions.Permissible @@ -6,12 +6,12 @@ import org.bukkit.permissions.Permissible fun Permissible.toAnvilSubject(): Subject = AnvilPaperSubject(this) private class AnvilPaperSubject( - private val paperSubject: Permissible, + override val platformDelegate: Permissible, ) : Subject { override fun hasPermission(permission: String): Boolean? { - return if (paperSubject.hasPermission(permission)) { + return if (platformDelegate.hasPermission(permission)) { true - } else if (paperSubject.isPermissionSet(permission)) { + } else if (platformDelegate.isPermissionSet(permission)) { false } else { null diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt similarity index 97% rename from paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt rename to paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt index dc1cb1be8..7653b9b93 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/user/PaperPlayerService.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.anvilpowered.anvil.user +package org.anvilpowered.anvil.paper.user import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.PlayerService diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeCommandSource.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeCommandSource.kt new file mode 100644 index 000000000..c3e2af3a0 --- /dev/null +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeCommandSource.kt @@ -0,0 +1,36 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.sponge.user + +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.core.user.Player +import org.anvilpowered.anvil.core.user.Subject +import org.spongepowered.api.command.parameter.CommandContext +import org.spongepowered.api.entity.living.player.server.ServerPlayer + +fun CommandContext.toAnvilCommandSource(): CommandSource = AnvilSpongeCommandSource(this) + +class AnvilSpongeCommandSource( + override val platformDelegate: CommandContext, +) : CommandSource { + override val audience: Audience = platformDelegate.cause().audience() + override val subject: Subject = platformDelegate.cause().subject().toAnvilSubject() + override val player: Player? = platformDelegate.cause().first(ServerPlayer::class.java).orElse(null)?.toAnvilPlayer() +} diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt index 48e1404ce..8c4f02be8 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt @@ -8,8 +8,8 @@ import java.util.UUID fun ServerPlayer.toAnvilPlayer(): Player = AnvilSpongePlayer(this) private class AnvilSpongePlayer( - val spongePlayer: ServerPlayer, + override val platformDelegate: ServerPlayer, ) : Player, - Subject by spongePlayer.toAnvilSubject() { - override val id: UUID = spongePlayer.uniqueId() + Subject by platformDelegate.toAnvilSubject() { + override val id: UUID = platformDelegate.uniqueId() } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt index 89a3ed8aa..359b8932b 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt @@ -7,10 +7,10 @@ import org.spongepowered.api.service.permission.Subject as SpongeSubject fun SpongeSubject.toAnvilSubject(): Subject = AnvilSpongeSubject(this) private class AnvilSpongeSubject( - private val spongeSubject: SpongeSubject, + override val platformDelegate: SpongeSubject, ) : Subject { override fun hasPermission(permission: String): Boolean? = - spongeSubject.permissionValue(permission).toBoolean() + platformDelegate.permissionValue(permission).toBoolean() } private fun Tristate.toBoolean(): Boolean? = when (this) { diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt new file mode 100644 index 000000000..a712ac195 --- /dev/null +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt @@ -0,0 +1,34 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.sponge.user + +import org.anvilpowered.anvil.core.command.CommandExecutor +import org.anvilpowered.anvil.core.command.CommandSource +import org.spongepowered.api.Sponge +import org.spongepowered.api.service.permission.Subject + +class SpongeCommandExecutor : CommandExecutor { + override suspend fun execute(source: CommandSource, command: String): Boolean { + return Sponge.server().commandManager().process( + source.subject.platformDelegate as Subject, + source.audience, + command, + ).isSuccess + } +} diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt index fb16e5253..327287310 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt @@ -30,9 +30,9 @@ import com.velocitypowered.api.proxy.Player as VelocityPlayer fun VelocityCommandSource.toAnvilCommandSource(): CommandSource = AnvilVelocityCommandSource(this) private class AnvilVelocityCommandSource( - velocityCommandSource: VelocityCommandSource, + override val platformDelegate: VelocityCommandSource, ) : CommandSource { - override val audience: Audience = velocityCommandSource - override val subject: Subject = velocityCommandSource.toAnvilSubject() - override val player: Player? = (velocityCommandSource as? VelocityPlayer)?.toAnvilPlayer() + override val audience: Audience = platformDelegate + override val subject: Subject = platformDelegate.toAnvilSubject() + override val player: Player? = (platformDelegate as? VelocityPlayer)?.toAnvilPlayer() } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt new file mode 100644 index 000000000..e4c21c8db --- /dev/null +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt @@ -0,0 +1,35 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.velocity.command + +import kotlinx.coroutines.future.await +import org.anvilpowered.anvil.core.command.CommandExecutor +import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.velocity.ProxyServerScope +import com.velocitypowered.api.command.CommandSource as VelocityCommandSource + +context(ProxyServerScope) +class VelocityCommandExecutor : CommandExecutor { + override suspend fun execute(source: CommandSource, command: String): Boolean { + return proxyServer.commandManager.executeAsync( + source.platformDelegate as VelocityCommandSource, + command, + ).await() + } +} diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt index 02d2bba77..8ac21996c 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt @@ -7,10 +7,10 @@ import com.velocitypowered.api.permission.PermissionSubject as VelocitySubject fun VelocitySubject.toAnvilSubject(): Subject = AnvilVelocitySubject(this) private class AnvilVelocitySubject( - private val velocitySubject: VelocitySubject, + override val platformDelegate: VelocitySubject, ) : Subject { override fun hasPermission(permission: String): Boolean? = - velocitySubject.getPermissionValue(permission).toBoolean() + platformDelegate.getPermissionValue(permission).toBoolean() } private fun Tristate.toBoolean(): Boolean? = when (this) { From 987e83033c5bb1be569e9875b4e9770d39113e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 15 Nov 2023 16:43:50 +0100 Subject: [PATCH 53/77] Add CommandExecutor.withLogging --- .../anvil/core/command/CommandExecutor.kt | 33 +++++++++++++++++++ .../paper/command/PaperCommandExecutor.kt | 4 +++ .../sponge/user/SpongeCommandExecutor.kt | 7 ++++ .../command/VelocityCommandExecutor.kt | 7 ++++ 4 files changed, 51 insertions(+) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt index dd8b0e89d..554dd8d2d 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt @@ -18,7 +18,40 @@ package org.anvilpowered.anvil.core.command +import org.anvilpowered.anvil.core.LoggerScope + interface CommandExecutor { suspend fun execute(source: CommandSource, command: String): Boolean + + suspend fun executeAsConsole(command: String): Boolean + + interface Scope { + val commandExecutor: CommandExecutor + } + + companion object { + context(Scope, LoggerScope) + fun withLogging(prefix: String = "command"): CommandExecutor = object : CommandExecutor { + private fun log(success: Boolean, prefix: String, command: String) { + if (success) { + logger.info("$prefix: $command") + } else { + logger.error("Failed to execute $prefix: $command") + } + } + + override suspend fun execute(source: CommandSource, command: String): Boolean { + val success = commandExecutor.execute(source, command) + log(success, prefix, command) + return success + } + + override suspend fun executeAsConsole(command: String): Boolean { + val success = commandExecutor.executeAsConsole(command) + log(success, "console via $prefix", command) + return success + } + } + } } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt index 15b4c4a75..506d43571 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt @@ -27,4 +27,8 @@ class PaperCommandExecutor : CommandExecutor { override suspend fun execute(source: CommandSource, command: String): Boolean { return Bukkit.dispatchCommand(source.platformDelegate as CommandSender, command) } + + override suspend fun executeAsConsole(command: String): Boolean { + return Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command) + } } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt index a712ac195..f114c21a4 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt @@ -31,4 +31,11 @@ class SpongeCommandExecutor : CommandExecutor { command, ).isSuccess } + + override suspend fun executeAsConsole(command: String): Boolean { + return Sponge.server().commandManager().process( + Sponge.systemSubject(), + command, + ).isSuccess + } } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt index e4c21c8db..3c25a076f 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt @@ -32,4 +32,11 @@ class VelocityCommandExecutor : CommandExecutor { command, ).await() } + + override suspend fun executeAsConsole(command: String): Boolean { + return proxyServer.commandManager.executeAsync( + proxyServer.consoleCommandSource, + command, + ).await() + } } From 8c535bf04e9bb74a9a2dd1b2d4c686608b52d430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 15 Nov 2023 18:41:07 +0100 Subject: [PATCH 54/77] Add username and displayname to Player --- .../main/kotlin/org/anvilpowered/anvil/core/user/Player.kt | 5 +++++ .../org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt | 3 +++ .../org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt | 3 +++ .../anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt | 3 +++ 4 files changed, 14 insertions(+) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt index 3f5f68e69..330c850af 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt @@ -19,6 +19,7 @@ package org.anvilpowered.anvil.core.user import net.kyori.adventure.audience.Audience +import net.kyori.adventure.text.Component import java.util.UUID /** @@ -27,4 +28,8 @@ import java.util.UUID interface Player : Subject, Audience { val id: UUID + + val username: String + + val displayname: Component } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt index b4e4554d7..4b780499a 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt @@ -1,6 +1,7 @@ package org.anvilpowered.anvil.paper.user import net.kyori.adventure.audience.Audience +import net.kyori.adventure.text.Component import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.Subject import java.util.UUID @@ -14,4 +15,6 @@ private class AnvilPaperPlayer( Audience by platformDelegate, Subject by platformDelegate.toAnvilSubject() { override val id: UUID = platformDelegate.uniqueId + override val username: String = platformDelegate.name + override val displayname: Component = platformDelegate.displayName() } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt index 8c4f02be8..948ea6195 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt @@ -1,5 +1,6 @@ package org.anvilpowered.anvil.sponge.user +import net.kyori.adventure.text.Component import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.Subject import org.spongepowered.api.entity.living.player.server.ServerPlayer @@ -12,4 +13,6 @@ private class AnvilSpongePlayer( ) : Player, Subject by platformDelegate.toAnvilSubject() { override val id: UUID = platformDelegate.uniqueId() + override val username: String = platformDelegate.name() + override val displayname: Component = platformDelegate.displayName().get() } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt index d2be75bd5..5e3f9872b 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt @@ -1,6 +1,7 @@ package org.anvilpowered.anvil.velocity.user import net.kyori.adventure.audience.Audience +import net.kyori.adventure.text.Component import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.Subject import java.util.UUID @@ -14,4 +15,6 @@ private class AnvilVelocityPlayer( Audience by velocityPlayer, Subject by velocityPlayer.toAnvilSubject() { override val id: UUID = velocityPlayer.uniqueId + override val username: String = velocityPlayer.username + override val displayname: Component = Component.text(velocityPlayer.username) } From e98cbf6393c5437e931131c09b387582d5ea942c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 18 Nov 2023 11:19:05 +0100 Subject: [PATCH 55/77] Add guava --- core/build.gradle.kts | 1 + gradle/libs.versions.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 6717d11ed..93c01cc43 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -11,6 +11,7 @@ dependencies { api(libs.configurate.core) api(libs.annotations) api(libs.kotlinx.coroutines) + api(libs.guava) compileOnlyApi(platform(libs.adventure.bom)) compileOnlyApi("net.kyori:adventure-api") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fcb891961..8b8571830 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,7 @@ exposed-core = { module = "org.jetbrains.exposed:exposed-core" } exposed-dao = { module = "org.jetbrains.exposed:exposed-dao" } exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc" } exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time" } +guava = "com.google.guava:guava:32.1.3-jre" kbrig-brigadier = "org.anvilpowered:kbrig-brigadier:0.1.0-SNAPSHOT" kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0" From db94d1322e113f8ce5c02b118d955b4cfc41d67b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 18 Nov 2023 17:22:59 +0100 Subject: [PATCH 56/77] Add Server --- .../org/anvilpowered/anvil/core/AnvilApi.kt | 7 ++---- .../anvil/core/platform/GamePlatform.kt | 24 ------------------- .../anvil/core/platform/Platform.kt | 5 +++- .../anvil/core/platform/Server.kt | 14 +++++++++++ .../anvilpowered/anvil/paper/AnvilPaperApi.kt | 8 ++++--- .../anvil/paper/platform/PaperPlatform.kt | 6 ++--- .../anvil/paper/platform/PaperServer.kt | 13 ++++++++++ .../anvil/sponge/AnvilSpongeApi.kt | 7 ++++-- .../anvil/sponge/platform/SpongePlatform.kt | 10 ++++---- .../anvil/sponge/platform/SpongeServer.kt | 13 ++++++++++ .../anvil/velocity/AnvilVelocityApi.kt | 8 ++++--- .../velocity/platform/VelocityPlatform.kt | 6 ++--- .../anvil/velocity/platform/VelocityServer.kt | 11 +++++++++ 13 files changed, 83 insertions(+), 49 deletions(-) delete mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/platform/GamePlatform.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt create mode 100644 paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt create mode 100644 sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt create mode 100644 velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt index e3a30f3eb..701a656c7 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt @@ -18,10 +18,9 @@ package org.anvilpowered.anvil.core -import org.anvilpowered.anvil.core.platform.Platform import org.anvilpowered.anvil.core.platform.PluginManager +import org.anvilpowered.anvil.core.platform.Server import org.anvilpowered.anvil.core.user.PlayerService -import org.apache.logging.log4j.Logger /** * To create an instance of this interface, use the `AnvilApi.create` function. @@ -38,9 +37,7 @@ import org.apache.logging.log4j.Logger * AnvilApi.createVelocity("my-plugin", ....) * ``` */ -interface AnvilApi : PlayerService.Scope, LoggerScope { - - val platform: Platform +interface AnvilApi : PlayerService.Scope, LoggerScope, Server.Scope { val pluginManager: PluginManager diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/GamePlatform.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/GamePlatform.kt deleted file mode 100644 index b8586a3fe..000000000 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/GamePlatform.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.core.platform - -interface GamePlatform : Platform { - val isProxy: Boolean - val plugins: List -} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt index cb4552817..0901fcfdb 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt @@ -20,5 +20,8 @@ package org.anvilpowered.anvil.core.platform interface Platform { val name: String - val platformVersion: String + val version: String + + val isProxy: Boolean + val plugins: List } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt new file mode 100644 index 000000000..72cc09718 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt @@ -0,0 +1,14 @@ +package org.anvilpowered.anvil.core.platform + +import net.kyori.adventure.audience.Audience + +interface Server { + + val platform: Platform + + val systemSubject: Audience + + interface Scope { + val server: Server + } +} diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt index 46a083bce..d533b7002 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt @@ -21,9 +21,11 @@ package org.anvilpowered.anvil.paper import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.platform.PluginManager +import org.anvilpowered.anvil.core.platform.Server import org.anvilpowered.anvil.core.user.PlayerService -import org.anvilpowered.anvil.paper.platform.PaperPlatform import org.anvilpowered.anvil.paper.platform.PaperPluginManager +import org.anvilpowered.anvil.paper.platform.PaperServer import org.anvilpowered.anvil.paper.user.PaperPlayerService import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger @@ -35,8 +37,8 @@ context(JavaPlugin) fun AnvilApi.Companion.createPaper(): AnvilPaperApi { return object : AnvilPaperApi { override val logger: Logger = LogManager.getLogger(pluginMeta.name) - override val platform = PaperPlatform - override val pluginManager = PaperPluginManager + override val server: Server = PaperServer + override val pluginManager: PluginManager = PaperPluginManager override val playerService: PlayerService = PaperPlayerService() } } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt index 0194f1675..6e87cba8c 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt @@ -1,15 +1,15 @@ package org.anvilpowered.anvil.paper.platform -import org.anvilpowered.anvil.core.platform.GamePlatform +import org.anvilpowered.anvil.core.platform.Platform import org.anvilpowered.anvil.core.platform.Plugin import org.bukkit.Bukkit -internal object PaperPlatform : GamePlatform { +internal object PaperPlatform : Platform { override val isProxy: Boolean = false override val plugins: List get() = Bukkit.getPluginManager().plugins.map { it.toAnvilPlugin() } override val name: String get() = "paper" - override val platformVersion: String + override val version: String get() = Bukkit.getBukkitVersion() } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt new file mode 100644 index 000000000..481b4abae --- /dev/null +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt @@ -0,0 +1,13 @@ +package org.anvilpowered.anvil.paper.platform + +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.platform.Platform +import org.anvilpowered.anvil.core.platform.Server +import org.bukkit.Bukkit + +object PaperServer : Server { + override val platform: Platform + get() = PaperPlatform + override val systemSubject: Audience + get() = Bukkit.getConsoleSender() +} diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt index b01aba1a9..a18ce7f26 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt @@ -20,9 +20,12 @@ package org.anvilpowered.anvil.sponge import com.google.inject.Injector import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.platform.PluginManager +import org.anvilpowered.anvil.core.platform.Server import org.anvilpowered.anvil.core.user.PlayerService import org.anvilpowered.anvil.sponge.platform.SpongePlatform import org.anvilpowered.anvil.sponge.platform.SpongePluginManager +import org.anvilpowered.anvil.sponge.platform.SpongeServer import org.anvilpowered.anvil.sponge.user.SpongePlayerService import org.apache.logging.log4j.Logger @@ -69,8 +72,8 @@ interface AnvilSpongeApi : AnvilApi { fun AnvilApi.Companion.createSponge(injector: Injector): AnvilSpongeApi { return object : AnvilSpongeApi { override val logger: Logger = injector.getInstance(Logger::class.java) - override val platform = SpongePlatform - override val pluginManager = SpongePluginManager + override val server: Server = SpongeServer + override val pluginManager: PluginManager = SpongePluginManager override val playerService: PlayerService = SpongePlayerService() } } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt index 668b8e286..b1382052c 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt @@ -1,16 +1,16 @@ package org.anvilpowered.anvil.sponge.platform -import org.anvilpowered.anvil.core.platform.GamePlatform +import org.anvilpowered.anvil.core.platform.Platform import org.anvilpowered.anvil.core.platform.Plugin -import org.spongepowered.api.Platform import org.spongepowered.api.Sponge +import org.spongepowered.api.Platform as SPlatform -internal object SpongePlatform : GamePlatform { +internal object SpongePlatform : Platform { override val isProxy: Boolean = false override val plugins: List get() = Sponge.pluginManager().plugins().map { it.toAnvilPlugin() } override val name: String get() = "sponge" - override val platformVersion: String - get() = Sponge.platform().container(Platform.Component.IMPLEMENTATION).metadata().version().qualifier + override val version: String + get() = Sponge.platform().container(SPlatform.Component.IMPLEMENTATION).metadata().version().qualifier } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt new file mode 100644 index 000000000..5625cdaef --- /dev/null +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt @@ -0,0 +1,13 @@ +package org.anvilpowered.anvil.sponge.platform + +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.platform.Platform +import org.anvilpowered.anvil.core.platform.Server +import org.spongepowered.api.Sponge + +object SpongeServer : Server { + override val platform: Platform + get() = SpongePlatform + override val systemSubject: Audience + get() = Sponge.systemSubject() +} diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index d63da1adf..adb886d3c 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -22,9 +22,11 @@ import com.google.inject.Injector import com.velocitypowered.api.plugin.PluginDescription import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.platform.PluginManager +import org.anvilpowered.anvil.core.platform.Server import org.anvilpowered.anvil.core.user.PlayerService -import org.anvilpowered.anvil.velocity.platform.VelocityPlatform import org.anvilpowered.anvil.velocity.platform.VelocityPluginManager +import org.anvilpowered.anvil.velocity.platform.VelocityServer import org.anvilpowered.anvil.velocity.user.VelocityPlayerService import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger @@ -93,8 +95,8 @@ fun AnvilApi.Companion.createVelocity(injector: Injector): AnvilVelocityApi { val pluginDescription = injector.getInstance(PluginDescription::class.java) return object : AnvilVelocityApi { override val logger: Logger = LogManager.getLogger(pluginDescription.id) - override val platform = VelocityPlatform(proxyServer) - override val pluginManager = VelocityPluginManager(proxyServer.pluginManager) + override val server: Server = VelocityServer(proxyServer) + override val pluginManager: PluginManager = VelocityPluginManager(proxyServer.pluginManager) override val proxyServer: ProxyServer = proxyServer override val playerService: PlayerService = VelocityPlayerService() } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt index 101104175..842386068 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt @@ -19,13 +19,13 @@ package org.anvilpowered.anvil.velocity.platform import com.velocitypowered.api.proxy.ProxyServer -import org.anvilpowered.anvil.core.platform.GamePlatform +import org.anvilpowered.anvil.core.platform.Platform import org.anvilpowered.anvil.core.platform.Plugin -internal class VelocityPlatform(private val proxyServer: ProxyServer) : GamePlatform { +internal class VelocityPlatform(private val proxyServer: ProxyServer) : Platform { override val isProxy: Boolean = true override val plugins: List get() = proxyServer.pluginManager.plugins.map { it.toAnvilPlugin() } override val name: String = "velocity" - override val platformVersion: String = proxyServer.version.version + override val version: String = proxyServer.version.version } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt new file mode 100644 index 000000000..92d3cd8ce --- /dev/null +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt @@ -0,0 +1,11 @@ +package org.anvilpowered.anvil.velocity.platform + +import com.velocitypowered.api.proxy.ProxyServer +import net.kyori.adventure.audience.Audience +import org.anvilpowered.anvil.core.platform.Platform +import org.anvilpowered.anvil.core.platform.Server + +class VelocityServer(proxyServer: ProxyServer) : Server { + override val platform: Platform = VelocityPlatform(proxyServer) + override val systemSubject: Audience = proxyServer.consoleCommandSource +} From 2222f351d65d6d922f769ae0f5962975e34f5a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 18 Nov 2023 17:30:09 +0100 Subject: [PATCH 57/77] Use better method names in Key --- .../anvil/core/config/EnvironmentRegistry.kt | 2 +- .../org/anvilpowered/anvil/core/config/Key.kt | 13 +++++----- .../anvil/core/config/KeyBuilder.kt | 4 +-- .../anvil/core/config/KeyBuilderImpl.kt | 25 ++++++++----------- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt index 2fa659658..9a325a848 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt @@ -24,7 +24,7 @@ package org.anvilpowered.anvil.core.config class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { override fun getStrict(key: Key): T? { val value = System.getenv(key.name) ?: return delegate?.getStrict(key) - return key.parse(value) + return key.deserialize(value) } override fun getDefault(key: Key): T { diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index 98ccad1c3..b5cd27903 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -29,8 +29,8 @@ class Key internal constructor( val name: String, val fallback: T, val description: String?, - private val parser: (String) -> T?, - private val printer: (T) -> String, + private val serializer: (T) -> String, + private val deserializer: (String) -> T?, ) : Comparable> { val namespace: KeyNamespace = this@KeyNamespace @@ -42,8 +42,8 @@ class Key internal constructor( private val comparator = Comparator.comparing, String> { it.name } .thenComparing(Comparator.comparing { it.type.type.typeName }) - fun parse(value: String): T? = parser(value) - fun print(value: T): String = printer(value) + fun serialize(value: T): String = serializer(value) + fun deserialize(value: String): T? = deserializer(value) override fun compareTo(other: Key): Int = comparator.compare(this, other) override fun equals(other: Any?): Boolean { @@ -65,9 +65,8 @@ class Key internal constructor( context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) - inline fun build(@BuilderInference block: NamedKeyBuilder.() -> Unit): Key { - return builder(object : TypeToken() {}).apply(block).build() - } + inline fun build(@BuilderInference block: NamedKeyBuilder.() -> Unit): Key = + builder(object : TypeToken() {}).apply(block).build() context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt index 45c910a27..0b6a8b127 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt @@ -46,7 +46,7 @@ interface KeyBuilder { * @return `this` */ @KeyBuilderDsl - fun parser(parser: ((String) -> T)?): KeyBuilder + fun deserializer(parser: ((String) -> T)?): KeyBuilder /** * Sets the toStringer of the generated [Key]. @@ -55,7 +55,7 @@ interface KeyBuilder { * @return `this` */ @KeyBuilderDsl - fun printer(printer: ((T) -> String)?): KeyBuilder + fun serializer(printer: ((T) -> String)?): KeyBuilder /** * Generates a [Key] based on this builder. diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt index 2cb41fb92..ed116e515 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt @@ -20,17 +20,12 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken -internal class KeyBuilderImpl(type: TypeToken) : NamedKeyBuilder { - private val type: TypeToken +internal class KeyBuilderImpl(private val type: TypeToken) : NamedKeyBuilder { private var name: String = "" private var fallbackValue: T? = null private var description: String? = null - private var parser: ((String) -> T)? = null - private var printer: ((T) -> String)? = null - - init { - this.type = type - } + private var serializer: ((T) -> String)? = null + private var deserializer: ((String) -> T)? = null override fun name(name: String): KeyBuilderImpl { this.name = name @@ -47,13 +42,13 @@ internal class KeyBuilderImpl(type: TypeToken) : NamedKeyBuilder return this } - override fun parser(parser: ((String) -> T)?): KeyBuilderImpl { - this.parser = parser + override fun serializer(printer: ((T) -> String)?): KeyBuilderImpl { + this.serializer = printer return this } - override fun printer(printer: ((T) -> String)?): KeyBuilderImpl { - this.printer = printer + override fun deserializer(parser: ((String) -> T)?): KeyBuilderImpl { + this.deserializer = parser return this } @@ -63,12 +58,12 @@ internal class KeyBuilderImpl(type: TypeToken) : NamedKeyBuilder name, requireNotNull(fallbackValue) { "fallbackValue not set" }, description, - parser ?: getDefaultParser(type), // TODO: Proper parser interface with parsing exception - printer ?: { it.toString() }, + serializer ?: { it.toString() }, + deserializer ?: getDefaultDeserializer(type), // TODO: Proper deserializer interface with parsing exception ) } -private fun getDefaultParser(type: TypeToken): (String) -> T? { +private fun getDefaultDeserializer(type: TypeToken): (String) -> T? { @Suppress("UNCHECKED_CAST") return when (type.type) { String::class.java -> { it -> it } From bacbfac426a99b128ff357c6e314c56644756677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 19 Nov 2023 13:27:26 +0100 Subject: [PATCH 58/77] Rework registry system with better support for List and Map types --- ...eyBuilderImpl.kt => AbstractKeyBuilder.kt} | 53 +++----- .../anvil/core/config/EnvironmentRegistry.kt | 54 +++++++- .../org/anvilpowered/anvil/core/config/Key.kt | 120 ++++++++++++----- .../anvil/core/config/KeyBuilder.kt | 79 ----------- .../anvil/core/config/KeyNamespace.kt | 6 +- .../anvilpowered/anvil/core/config/ListKey.kt | 62 +++++++++ .../anvil/core/config/ListKeyBuilder.kt | 89 +++++++++++++ .../anvilpowered/anvil/core/config/MapKey.kt | 85 ++++++++++++ .../anvil/core/config/MapKeyBuilder.kt | 126 ++++++++++++++++++ .../anvil/core/config/Registry.kt | 22 ++- .../anvil/core/config/SimpleKey.kt | 61 +++++++++ .../anvil/core/config/SimpleKeyBuilder.kt | 87 ++++++++++++ 12 files changed, 693 insertions(+), 151 deletions(-) rename core/src/main/kotlin/org/anvilpowered/anvil/core/config/{KeyBuilderImpl.kt => AbstractKeyBuilder.kt} (56%) delete mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt similarity index 56% rename from core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt rename to core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt index ed116e515..683effdb6 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderImpl.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt @@ -20,47 +20,36 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken -internal class KeyBuilderImpl(private val type: TypeToken) : NamedKeyBuilder { - private var name: String = "" - private var fallbackValue: T? = null - private var description: String? = null - private var serializer: ((T) -> String)? = null - private var deserializer: ((String) -> T)? = null +internal abstract class AbstractKeyBuilder< + T : Any, K : Key, B : Key.Builder, + AF : Key.BuilderFacet, NF : Key.NamedBuilderFacet, + >( + val type: TypeToken, +) : Key.Builder { - override fun name(name: String): KeyBuilderImpl { - this.name = name - return this - } + var name: String? = null + var fallback: T? = null + var description: String? = null - override fun fallback(fallbackValue: T?): KeyBuilderImpl { - this.fallbackValue = fallbackValue - return this - } + protected abstract fun self(): B - override fun description(description: String?): KeyBuilderImpl { - this.description = description - return this + override fun name(name: String): B { + this.name = name + return self() } - override fun serializer(printer: ((T) -> String)?): KeyBuilderImpl { - this.serializer = printer - return this + override fun fallback(fallback: T?): B { + this.fallback = fallback + return self() } - override fun deserializer(parser: ((String) -> T)?): KeyBuilderImpl { - this.deserializer = parser - return this + override fun description(description: String?): B { + this.description = description + return self() } - context(KeyNamespace) - override fun build(): Key = Key( - type, - name, - requireNotNull(fallbackValue) { "fallbackValue not set" }, - description, - serializer ?: { it.toString() }, - deserializer ?: getDefaultDeserializer(type), // TODO: Proper deserializer interface with parsing exception - ) + abstract fun asAnonymousFacet(): AF + abstract fun asNamedFacet(): NF } private fun getDefaultDeserializer(type: TypeToken): (String) -> T? { diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt index 9a325a848..279b67e69 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt @@ -22,12 +22,62 @@ package org.anvilpowered.anvil.core.config * A [Registry] implementation that checks environment variables. */ class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { - override fun getStrict(key: Key): T? { + override fun getStrict(key: SimpleKey): T? { val value = System.getenv(key.name) ?: return delegate?.getStrict(key) return key.deserialize(value) } - override fun getDefault(key: Key): T { + override fun getDefault(key: SimpleKey): T { return delegate?.getDefault(key) ?: throw NoSuchElementException("No default value for key ${key.name}") } + + override fun getStrict(key: ListKey): List? { + val value = System.getenv(key.name) ?: return delegate?.getStrict(key) + val tokens = value.split(",") + return tokens.mapNotNull { key.deserializeElement(it) } + } + + override fun getDefault(key: ListKey): List { + return delegate?.getDefault(key) ?: throw NoSuchElementException("No default value for key ${key.name}") + } + + override fun getStrict(key: ListKey, index: Int): E? { + val value = System.getenv(key.name) ?: return delegate?.getStrict(key, index) + val tokens = value.split(",") + return key.deserializeElement(tokens[index]) + } + + override fun getDefault(key: ListKey, index: Int): E { + return delegate?.getDefault(key, index) ?: throw NoSuchElementException("No default value for key ${key.name}") + } + + override fun getStrict(key: MapKey): Map? { + val value = System.getenv(key.name) ?: return delegate?.getStrict(key) + val tokens = value.split(",") + return tokens.associate { token -> + val (k, v) = token.split("=") + val mapKey = requireNotNull(key.deserializeKey(k)) { "Could not deserialize mapKey $k for key $key" } + val mapValue = requireNotNull(key.deserializeValue(v)) { "Could not deserialize mapValue $v for mapKey $k for key $key" } + mapKey to mapValue + } + } + + override fun getDefault(key: MapKey): Map { + return delegate?.getDefault(key) ?: throw NoSuchElementException("No default value for key ${key.name}") + } + + override fun getStrict(key: MapKey, mapKey: K): V? { + val value = System.getenv(key.name) ?: return delegate?.getStrict(key, mapKey) + return value.split(",").asSequence() + .map { it.split("=").zipWithNext().single() } + .firstOrNull { (k, _) -> + mapKey == requireNotNull(key.deserializeKey(k)) { "Could not deserialize mapKey $k for key $key" } + }?.let { (k, v) -> + requireNotNull(key.deserializeValue(v)) { "Could not deserialize mapValue $v for mapKey $k for key $key" } + } + } + + override fun getDefault(key: MapKey, mapKey: K): V { + return delegate?.getDefault(key, mapKey) ?: throw NoSuchElementException("No default value for key ${key.name}") + } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index b5cd27903..4473ef227 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -23,55 +23,111 @@ import kotlin.experimental.ExperimentalTypeInference import kotlin.properties.PropertyDelegateProvider import kotlin.properties.ReadOnlyProperty -context(KeyNamespace) -class Key internal constructor( - val type: TypeToken, - val name: String, - val fallback: T, - val description: String?, - private val serializer: (T) -> String, - private val deserializer: (String) -> T?, -) : Comparable> { - - val namespace: KeyNamespace = this@KeyNamespace - - init { - namespace.add(this) - } +interface Key : Comparable> { + + val type: TypeToken + + val name: String + + val fallback: T? - private val comparator = Comparator.comparing, String> { it.name } - .thenComparing(Comparator.comparing { it.type.type.typeName }) + val description: String? - fun serialize(value: T): String = serializer(value) - fun deserialize(value: String): T? = deserializer(value) + @KeyBuilderDsl + interface BuilderFacet, B : BuilderFacet> { + /** + * Sets the fallback value of the generated [Key] + * + * @param fallback The fallback value to set + * @return `this` + */ + @KeyBuilderDsl + fun fallback(fallback: T?): B - override fun compareTo(other: Key): Int = comparator.compare(this, other) - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is Key<*>) return false - return name == other.name && type.type == other.type.type + /** + * Sets the description of the generated [Key]. + * + * @param description The description to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun description(description: String?): B } - override fun hashCode(): Int { - var result = type.hashCode() - result = 31 * result + name.hashCode() - return result + @KeyBuilderDsl + interface NamedBuilderFacet, B : BuilderFacet> : BuilderFacet { + /** + * Sets the name of the generated [Key] + * + * @param name The name to set + * @return `this` + */ + @KeyBuilderDsl + fun name(name: String): B } - override fun toString(): String = "Key(type=$type, name=$name, description=$description)" + @KeyBuilderDsl + interface Builder, B : Builder> : NamedBuilderFacet { + /** + * Generates a [Key] based on this builder. + * + * @return The generated [Key] + */ + context(KeyNamespace) + @KeyBuilderDsl + fun build(): K + } companion object { - fun builder(type: TypeToken): NamedKeyBuilder = KeyBuilderImpl(type) + + @JvmStatic + val comparator: Comparator> = Comparator.comparing, String> { it.name } + .thenComparing(Comparator.comparing { it.type.type.typeName }) + + @JvmStatic + fun equals(a: Key<*>?, b: Key<*>?): Boolean { + if (a === b) return true + if (a == null || b == null) return false + return a.name == b.name && a.type.type.typeName == b.type.type.typeName + } + + @JvmStatic + fun hashCode(key: Key<*>): Int { + var result = key.type.hashCode() + result = 31 * result + key.name.hashCode() + return result + } + + fun simpleBuilder(type: TypeToken): SimpleKey.NamedBuilderFacet = AbstractKeyBuilder(type) + fun listBuilder(type: TypeToken): ListKey.NamedBuilderFacet = AbstractKeyBuilder(type) + fun mapBuilder(type: TypeToken): ListKey.NamedBuilderFacet = AbstractKeyBuilder(type) context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) - inline fun build(@BuilderInference block: NamedKeyBuilder.() -> Unit): Key = + inline fun build(@BuilderInference block: NamedBuilderFacet.() -> Unit): Key = builder(object : TypeToken() {}).apply(block).build() context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) inline fun building( - @BuilderInference crossinline block: KeyBuilder.() -> Unit, + @BuilderInference crossinline block: BuilderFacet.() -> Unit, + ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> + val builder = builder(object : TypeToken() {}) + builder.name(property.name) + builder.block() + val key = builder.build() + ReadOnlyProperty { _, _ -> key } + } + + context(KeyNamespace) + @OptIn(ExperimentalTypeInference::class) + inline fun buildList(@BuilderInference block: NamedBuilderFacet.() -> Unit): Key = + builder(object : TypeToken() {}).apply(block).build() + + context(KeyNamespace) + @OptIn(ExperimentalTypeInference::class) + inline fun buildingList( + @BuilderInference crossinline block: BuilderFacet.() -> Unit, ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> val builder = builder(object : TypeToken() {}) builder.name(property.name) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt deleted file mode 100644 index 0b6a8b127..000000000 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilder.kt +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.core.config - -@KeyBuilderDsl -interface KeyBuilder { - - /** - * Sets the fallback value of the generated [Key] - * - * @param fallbackValue The fallback value to set - * @return `this` - */ - @KeyBuilderDsl - fun fallback(fallbackValue: T?): KeyBuilder - - /** - * Sets the description of the generated [Key]. - * - * @param description The description to set or `null` to remove it - * @return `this` - */ - @KeyBuilderDsl - fun description(description: String?): KeyBuilder - - /** - * Sets the parser of the generated [Key]. - * - * @param parser The parser to set or `null` to remove it - * @return `this` - */ - @KeyBuilderDsl - fun deserializer(parser: ((String) -> T)?): KeyBuilder - - /** - * Sets the toStringer of the generated [Key]. - * - * @param printer The toStringer to set or `null` to remove it - * @return `this` - */ - @KeyBuilderDsl - fun serializer(printer: ((T) -> String)?): KeyBuilder - - /** - * Generates a [Key] based on this builder. - * - * @return The generated [Key] - */ - context(KeyNamespace) - fun build(): Key -} - -@KeyBuilderDsl -interface NamedKeyBuilder : KeyBuilder { - /** - * Sets the name of the generated [Key] - * - * @param name The name to set - * @return `this` - */ - @KeyBuilderDsl - fun name(name: String): KeyBuilder -} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt index 260cd9725..628833944 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt @@ -41,15 +41,15 @@ internal class KeyNamespaceImpl(override val name: String) : KeyNamespace { override fun get(keyName: String, type: TypeToken): Key? { val key = keys[keyName] ?: return null - if (key.type != type) { - throw TypeCastException("Key $name has type ${key.type} which does not match provided type $type") + if (key.meta.type != type) { + throw TypeCastException("Key $name has type ${key.meta.type} which does not match provided type $type") } @Suppress("UNCHECKED_CAST") return key as Key } override fun add(key: Key) { - keys[key.name] = key + keys[key.meta.name] = key } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt new file mode 100644 index 000000000..17b1ed1f2 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt @@ -0,0 +1,62 @@ +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +context(KeyNamespace) +class ListKey( + override val type: TypeToken>, + override val name: String, + override val fallback: List, + override val description: String?, + private val elementType: TypeToken, + private val elementSerializer: (E) -> String, + private val elementDeserializer: (String) -> E?, +) : Key> { + private val namespace: KeyNamespace = this@KeyNamespace + + init { + namespace.add(this) + } + + fun serializeElement(element: E): String = elementSerializer(element) + fun deserializeElement(element: String): E? = elementDeserializer(element) + + override fun compareTo(other: Key>): Int = Key.comparator.compare(this, other) + override fun equals(other: Any?): Boolean = (other as Key<*>?)?.let { Key.equals(this, it) } ?: false + override fun hashCode(): Int = Key.hashCode(this) + override fun toString(): String = "ListKey<$elementType>(name='$name')" + + @KeyBuilderDsl + interface BuilderFacet> : Key.BuilderFacet, ListKey, B> { + + /** + * Sets the element serializer of the generated [Key]. + * + * @param serializer The element serializer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun elementSerializer(serializer: ((E) -> String)?): B + + /** + * Sets the element deserializer of the generated [Key]. + * + * @param deserializer The element deserializer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun elementDeserializer(deserializer: ((String) -> E)?): B + } + + @KeyBuilderDsl + interface AnonymousBuilderFacet : BuilderFacet>, + Key.BuilderFacet, ListKey, AnonymousBuilderFacet> + + @KeyBuilderDsl + interface NamedBuilderFacet : BuilderFacet>, + Key.NamedBuilderFacet, ListKey, NamedBuilderFacet> + + @KeyBuilderDsl + interface Builder : BuilderFacet>, + Key.Builder, ListKey, Builder> +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt new file mode 100644 index 000000000..b0b2fc134 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt @@ -0,0 +1,89 @@ +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +internal class ListKeyBuilder( + type: TypeToken>, + private val elementType: TypeToken, +) : AbstractKeyBuilder, ListKey, ListKey.Builder, ListKey.AnonymousBuilderFacet, ListKey.NamedBuilderFacet>(type), + ListKey.Builder { + + private var elementSerializer: ((E) -> String)? = null + private var elementDeserializer: ((String) -> E)? = null + + override fun self(): ListKey.Builder = this + + override fun elementSerializer(serializer: ((E) -> String)?): ListKey.Builder { + this.elementSerializer = serializer + return this + } + + override fun elementDeserializer(deserializer: ((String) -> E)?): ListKey.Builder { + this.elementDeserializer = deserializer + return this + } + + context(KeyNamespace) + override fun build(): ListKey = ListKey( + type, + requireNotNull(name) { "Name is null" }, + requireNotNull(fallback) { "Fallback is null" }, + description, + elementType, + requireNotNull(elementSerializer) { "Element serializer is null" }, + requireNotNull(elementDeserializer) { "Element deserializer is null" }, + ) + + override fun asAnonymousFacet(): ListKey.AnonymousBuilderFacet { + return object : ListKey.AnonymousBuilderFacet { + override fun fallback(fallback: List?): ListKey.AnonymousBuilderFacet { + this@ListKeyBuilder.fallback(fallback) + return this + } + + override fun description(description: String?): ListKey.AnonymousBuilderFacet { + this@ListKeyBuilder.description(description) + return this + } + + override fun elementSerializer(serializer: ((E) -> String)?): ListKey.AnonymousBuilderFacet { + this@ListKeyBuilder.elementSerializer(serializer) + return this + } + + override fun elementDeserializer(deserializer: ((String) -> E)?): ListKey.AnonymousBuilderFacet { + this@ListKeyBuilder.elementDeserializer(deserializer) + return this + } + } + } + + override fun asNamedFacet(): ListKey.NamedBuilderFacet { + return object : ListKey.NamedBuilderFacet { + override fun fallback(fallback: List?): ListKey.NamedBuilderFacet { + this@ListKeyBuilder.fallback(fallback) + return this + } + + override fun description(description: String?): ListKey.NamedBuilderFacet { + this@ListKeyBuilder.description(description) + return this + } + + override fun name(name: String): ListKey.NamedBuilderFacet { + this@ListKeyBuilder.name(name) + return this + } + + override fun elementSerializer(serializer: ((E) -> String)?): ListKey.NamedBuilderFacet { + this@ListKeyBuilder.elementSerializer(serializer) + return this + } + + override fun elementDeserializer(deserializer: ((String) -> E)?): ListKey.NamedBuilderFacet { + this@ListKeyBuilder.elementDeserializer(deserializer) + return this + } + } + } +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt new file mode 100644 index 000000000..226172ba7 --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt @@ -0,0 +1,85 @@ +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +context(KeyNamespace) +class MapKey( + override val type: TypeToken>, + override val name: String, + override val fallback: Map, + override val description: String?, + private val keyType: TypeToken, + private val keySerializer: (K) -> String, + private val keyDeserializer: (String) -> K?, + private val valueType: TypeToken, + private val valueSerializer: (V) -> String, + private val valueDeserializer: (String) -> V?, +) : Key> { + private val namespace: KeyNamespace = this@KeyNamespace + + init { + namespace.add(this) + } + + fun serializeKey(key: K): String = keySerializer(key) + fun deserializeKey(key: String): K? = keyDeserializer(key) + fun serializeValue(value: V): String = valueSerializer(value) + fun deserializeValue(value: String): V? = valueDeserializer(value) + + override fun compareTo(other: Key>): Int = Key.comparator.compare(this, other) + override fun equals(other: Any?): Boolean = (other as Key<*>?)?.let { Key.equals(this, it) } ?: false + override fun hashCode(): Int = Key.hashCode(this) + override fun toString(): String = "MapKey<$keyType, $valueType>(name='$name')" + + @KeyBuilderDsl + interface BuilderFacet> : Key.BuilderFacet, MapKey, B> { + + /** + * Sets the key serializer of the generated [Key]. + * + * @param serializer The key serializer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun keySerializer(serializer: ((K) -> String)?): B + + /** + * Sets the key deserializer of the generated [Key]. + * + * @param deserializer The key deserializer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun keyDeserializer(deserializer: ((String) -> K)?): B + + /** + * Sets the value serializer of the generated [Key]. + * + * @param serializer The value serializer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun valueSerializer(serializer: ((V) -> String)?): B + + /** + * Sets the value deserializer of the generated [Key]. + * + * @param deserializer The value deserializer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun valueDeserializer(deserializer: ((String) -> V)?): B + } + + @KeyBuilderDsl + interface AnonymousBuilderFacet : BuilderFacet>, + Key.BuilderFacet, MapKey, AnonymousBuilderFacet> + + @KeyBuilderDsl + interface NamedBuilderFacet : BuilderFacet>, + Key.NamedBuilderFacet, MapKey, NamedBuilderFacet> + + @KeyBuilderDsl + interface Builder : BuilderFacet>, + Key.Builder, MapKey, Builder> +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt new file mode 100644 index 000000000..a870f051d --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt @@ -0,0 +1,126 @@ +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +internal class MapKeyBuilder( + type: TypeToken>, + private val keyType: TypeToken, + private val valueType: TypeToken, +) : AbstractKeyBuilder< + Map, MapKey, MapKey.Builder, MapKey.AnonymousBuilderFacet, + MapKey.NamedBuilderFacet, + >(type), MapKey.Builder { + private var keySerializer: ((K) -> String)? = null + private var keyDeserializer: ((String) -> K)? = null + private var valueSerializer: ((V) -> String)? = null + private var valueDeserializer: ((String) -> V)? = null + + override fun self(): MapKey.Builder = this + + override fun keySerializer(serializer: ((K) -> String)?): MapKey.Builder { + this.keySerializer = serializer + return this + } + + override fun keyDeserializer(deserializer: ((String) -> K)?): MapKey.Builder { + this.keyDeserializer = deserializer + return this + } + + override fun valueSerializer(serializer: ((V) -> String)?): MapKey.Builder { + this.valueSerializer = serializer + return this + } + + override fun valueDeserializer(deserializer: ((String) -> V)?): MapKey.Builder { + this.valueDeserializer = deserializer + return this + } + + context(KeyNamespace) + override fun build(): MapKey = MapKey( + type, + requireNotNull(name) { "Name is null" }, + requireNotNull(fallback) { "Fallback is null" }, + description, + keyType, + requireNotNull(keySerializer) { "Key serializer is null" }, + requireNotNull(keyDeserializer) { "Key deserializer is null" }, + valueType, + requireNotNull(valueSerializer) { "Value serializer is null" }, + requireNotNull(valueDeserializer) { "Value deserializer is null" }, + ) + + override fun asAnonymousFacet(): MapKey.AnonymousBuilderFacet { + return object : MapKey.AnonymousBuilderFacet { + override fun fallback(fallback: Map?): MapKey.AnonymousBuilderFacet { + this@MapKeyBuilder.fallback(fallback) + return this + } + + override fun description(description: String?): MapKey.AnonymousBuilderFacet { + this@MapKeyBuilder.description(description) + return this + } + + override fun keySerializer(serializer: ((K) -> String)?): MapKey.AnonymousBuilderFacet { + this@MapKeyBuilder.keySerializer(serializer) + return this + } + + override fun keyDeserializer(deserializer: ((String) -> K)?): MapKey.AnonymousBuilderFacet { + this@MapKeyBuilder.keyDeserializer(deserializer) + return this + } + + override fun valueSerializer(serializer: ((V) -> String)?): MapKey.AnonymousBuilderFacet { + this@MapKeyBuilder.valueSerializer(serializer) + return this + } + + override fun valueDeserializer(deserializer: ((String) -> V)?): MapKey.AnonymousBuilderFacet { + this@MapKeyBuilder.valueDeserializer(deserializer) + return this + } + } + } + + override fun asNamedFacet(): MapKey.NamedBuilderFacet { + return object : MapKey.NamedBuilderFacet { + override fun name(name: String): MapKey.NamedBuilderFacet { + this@MapKeyBuilder.name(name) + return this + } + + override fun fallback(fallback: Map?): MapKey.NamedBuilderFacet { + this@MapKeyBuilder.fallback(fallback) + return this + } + + override fun description(description: String?): MapKey.NamedBuilderFacet { + this@MapKeyBuilder.description(description) + return this + } + + override fun keySerializer(serializer: ((K) -> String)?): MapKey.NamedBuilderFacet { + this@MapKeyBuilder.keySerializer(serializer) + return this + } + + override fun keyDeserializer(deserializer: ((String) -> K)?): MapKey.NamedBuilderFacet { + this@MapKeyBuilder.keyDeserializer(deserializer) + return this + } + + override fun valueSerializer(serializer: ((V) -> String)?): MapKey.NamedBuilderFacet { + this@MapKeyBuilder.valueSerializer(serializer) + return this + } + + override fun valueDeserializer(deserializer: ((String) -> V)?): MapKey.NamedBuilderFacet { + this@MapKeyBuilder.valueDeserializer(deserializer) + return this + } + } + } +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt index 57e2ea88d..497be2373 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt @@ -19,9 +19,25 @@ package org.anvilpowered.anvil.core.config interface Registry { - fun getStrict(key: Key): T? - fun getDefault(key: Key): T - operator fun get(key: Key): T = getStrict(key) ?: getDefault(key) + fun getStrict(key: SimpleKey): T? + fun getDefault(key: SimpleKey): T + operator fun get(key: SimpleKey): T = getStrict(key) ?: getDefault(key) + + fun getStrict(key: ListKey): List? + fun getDefault(key: ListKey): List + operator fun get(key: ListKey): List = getStrict(key) ?: getDefault(key) + + fun getStrict(key: ListKey, index: Int): E? + fun getDefault(key: ListKey, index: Int): E + operator fun get(key: ListKey, index: Int): E = getStrict(key, index) ?: getDefault(key, index) + + fun getStrict(key: MapKey): Map? + fun getDefault(key: MapKey): Map + operator fun get(key: MapKey): Map = getStrict(key) ?: getDefault(key) + + fun getStrict(key: MapKey, mapKey: K): V? + fun getDefault(key: MapKey, mapKey: K): V + operator fun get(key: MapKey, mapKey: K): V = getStrict(key, mapKey) ?: getDefault(key, mapKey) interface Scope { val registry: Registry diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt new file mode 100644 index 000000000..b15e10aca --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt @@ -0,0 +1,61 @@ +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +context(KeyNamespace) +class SimpleKey( + override val type: TypeToken, + override val name: String, + override val fallback: T, + override val description: String?, + private val serializer: (T) -> String, + private val deserializer: (String) -> T?, +) : Key { + private val namespace: KeyNamespace = this@KeyNamespace + + init { + namespace.add(this) + } + + fun serialize(value: T): String = serializer(value) + fun deserialize(value: String): T? = deserializer(value) + + override fun compareTo(other: Key): Int = Key.comparator.compare(this, other) + override fun equals(other: Any?): Boolean = (other as Key<*>?)?.let { Key.equals(this, it) } ?: false + override fun hashCode(): Int = Key.hashCode(this) + override fun toString(): String = "SimpleKey(type=$type, name='$name')" + + @KeyBuilderDsl + interface BuilderFacet> : Key.BuilderFacet, B> { + + /** + * Sets the serializer of the generated [Key]. + * + * @param serializer The serializer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun serializer(serializer: ((T) -> String)?): B + + /** + * Sets the deserializer of the generated [Key]. + * + * @param deserializer The deserializer to set or `null` to remove it + * @return `this` + */ + @KeyBuilderDsl + fun deserializer(deserializer: ((String) -> T)?): B + } + + @KeyBuilderDsl + interface AnonymousBuilderFacet : BuilderFacet>, + Key.BuilderFacet, AnonymousBuilderFacet> + + @KeyBuilderDsl + interface NamedBuilderFacet : BuilderFacet>, + Key.NamedBuilderFacet, NamedBuilderFacet> + + @KeyBuilderDsl + interface Builder : BuilderFacet>, + Key.Builder, Builder> +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt new file mode 100644 index 000000000..d774ea18b --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt @@ -0,0 +1,87 @@ +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +internal class SimpleKeyBuilder( + type: TypeToken, +) : AbstractKeyBuilder, SimpleKey.Builder, SimpleKey.AnonymousBuilderFacet, SimpleKey.NamedBuilderFacet>(type), + SimpleKey.Builder { + + private var serializer: ((T) -> String)? = null + private var deserializer: ((String) -> T)? = null + + override fun self(): SimpleKey.Builder = this + + override fun serializer(serializer: ((T) -> String)?): SimpleKey.Builder { + this.serializer = serializer + return self() + } + + override fun deserializer(deserializer: ((String) -> T)?): SimpleKey.Builder { + this.deserializer = deserializer + return self() + } + + context(KeyNamespace) + override fun build(): SimpleKey = SimpleKey( + type, + requireNotNull(name) { "Name is null" }, + requireNotNull(fallback) { "Fallback is null" }, + description, + requireNotNull(serializer) { "Serializer is null" }, + requireNotNull(deserializer) { "Deserializer is null" }, + ) + + override fun asAnonymousFacet(): SimpleKey.AnonymousBuilderFacet { + return object : SimpleKey.AnonymousBuilderFacet { + override fun fallback(fallback: T?): SimpleKey.AnonymousBuilderFacet { + this@SimpleKeyBuilder.fallback(fallback).let {this } + return this + } + + override fun description(description: String?): SimpleKey.AnonymousBuilderFacet { + this@SimpleKeyBuilder.description(description) + return this + } + + override fun serializer(serializer: ((T) -> String)?): SimpleKey.AnonymousBuilderFacet { + this@SimpleKeyBuilder.serializer(serializer) + return this + } + + override fun deserializer(deserializer: ((String) -> T)?): SimpleKey.AnonymousBuilderFacet { + this@SimpleKeyBuilder.deserializer(deserializer) + return this + } + } + } + + override fun asNamedFacet(): SimpleKey.NamedBuilderFacet { + return object : SimpleKey.NamedBuilderFacet { + override fun name(name: String): SimpleKey.NamedBuilderFacet { + this@SimpleKeyBuilder.name(name) + return this + } + + override fun fallback(fallback: T?): SimpleKey.NamedBuilderFacet { + this@SimpleKeyBuilder.fallback(fallback) + return this + } + + override fun description(description: String?): SimpleKey.NamedBuilderFacet { + this@SimpleKeyBuilder.description(description) + return this + } + + override fun serializer(serializer: ((T) -> String)?): SimpleKey.NamedBuilderFacet { + this@SimpleKeyBuilder.serializer(serializer) + return this + } + + override fun deserializer(deserializer: ((String) -> T)?): SimpleKey.NamedBuilderFacet { + this@SimpleKeyBuilder.deserializer(deserializer) + return this + } + } + } +} From 401c8ca8ece06408ecbe0a5f804c5826c29cf034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 19 Nov 2023 15:14:09 +0100 Subject: [PATCH 59/77] Fix builder methods --- .../anvil/core/config/AbstractKeyBuilder.kt | 7 +- .../org/anvilpowered/anvil/core/config/Key.kt | 89 +++++++++++++++---- .../anvil/core/config/KeyNamespace.kt | 8 +- .../anvilpowered/anvil/core/config/ListKey.kt | 6 +- .../anvil/core/config/ListKeyBuilder.kt | 10 +-- .../anvilpowered/anvil/core/config/MapKey.kt | 6 +- .../anvil/core/config/MapKeyBuilder.kt | 15 ++-- .../anvil/core/config/SimpleKey.kt | 6 +- .../anvil/core/config/SimpleKeyBuilder.kt | 13 +-- 9 files changed, 111 insertions(+), 49 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt index 683effdb6..0db2ef761 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt @@ -21,11 +21,11 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken internal abstract class AbstractKeyBuilder< - T : Any, K : Key, B : Key.Builder, + T : Any, K : Key, B : Key.FacetedBuilder, AF : Key.BuilderFacet, NF : Key.NamedBuilderFacet, >( val type: TypeToken, -) : Key.Builder { +) : Key.FacetedBuilder { var name: String? = null var fallback: T? = null @@ -47,9 +47,6 @@ internal abstract class AbstractKeyBuilder< this.description = description return self() } - - abstract fun asAnonymousFacet(): AF - abstract fun asNamedFacet(): NF } private fun getDefaultDeserializer(type: TypeToken): (String) -> T? { diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index 4473ef227..03e5643d7 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -23,7 +23,7 @@ import kotlin.experimental.ExperimentalTypeInference import kotlin.properties.PropertyDelegateProvider import kotlin.properties.ReadOnlyProperty -interface Key : Comparable> { +sealed interface Key : Comparable> { val type: TypeToken @@ -66,7 +66,6 @@ interface Key : Comparable> { fun name(name: String): B } - @KeyBuilderDsl interface Builder, B : Builder> : NamedBuilderFacet { /** * Generates a [Key] based on this builder. @@ -78,6 +77,23 @@ interface Key : Comparable> { fun build(): K } + @KeyBuilderDsl + interface FacetedBuilder< + T : Any, K : Key, B : FacetedBuilder, + AF : BuilderFacet, NF : NamedBuilderFacet, + > : Builder { + + /** + * @return This builder as an (anonymous) [BuilderFacet] + */ + fun asAnonymousFacet(): AF + + /** + * @return This builder as a [NamedBuilderFacet] + */ + fun asNamedFacet(): NF + } + companion object { @JvmStatic @@ -98,40 +114,75 @@ interface Key : Comparable> { return result } - fun simpleBuilder(type: TypeToken): SimpleKey.NamedBuilderFacet = AbstractKeyBuilder(type) - fun listBuilder(type: TypeToken): ListKey.NamedBuilderFacet = AbstractKeyBuilder(type) - fun mapBuilder(type: TypeToken): ListKey.NamedBuilderFacet = AbstractKeyBuilder(type) + fun simpleBuilder(type: TypeToken): SimpleKey.FacetedBuilder = SimpleKeyBuilder(type) + + fun listBuilder( + type: TypeToken>, + elementType: TypeToken, + ): ListKey.FacetedBuilder = ListKeyBuilder(type, elementType) + + fun mapBuilder( + type: TypeToken>, + keyType: TypeToken, + valueType: TypeToken, + ): MapKey.FacetedBuilder = MapKeyBuilder(type, keyType, valueType) context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) - inline fun build(@BuilderInference block: NamedBuilderFacet.() -> Unit): Key = - builder(object : TypeToken() {}).apply(block).build() + inline fun buildSimple(@BuilderInference block: SimpleKey.NamedBuilderFacet.() -> Unit): SimpleKey { + val builder = simpleBuilder(object : TypeToken() {}) + builder.asNamedFacet().block() + return builder.build() + } context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) - inline fun building( - @BuilderInference crossinline block: BuilderFacet.() -> Unit, - ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> - val builder = builder(object : TypeToken() {}) + inline fun buildingSimple( + @BuilderInference crossinline block: SimpleKey.AnonymousBuilderFacet.() -> Unit, + ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> + val builder = simpleBuilder(object : TypeToken() {}) builder.name(property.name) - builder.block() + builder.asAnonymousFacet().block() val key = builder.build() ReadOnlyProperty { _, _ -> key } } context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) - inline fun buildList(@BuilderInference block: NamedBuilderFacet.() -> Unit): Key = - builder(object : TypeToken() {}).apply(block).build() + inline fun buildList(@BuilderInference block: ListKey.NamedBuilderFacet.() -> Unit): ListKey { + val builder = listBuilder(object : TypeToken>() {}, object : TypeToken() {}) + builder.asNamedFacet().block() + return builder.build() + } + + context(KeyNamespace) + @OptIn(ExperimentalTypeInference::class) + inline fun buildingList( + @BuilderInference crossinline block: ListKey.AnonymousBuilderFacet.() -> Unit, + ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> + val builder = listBuilder(object : TypeToken>() {}, object : TypeToken() {}) + builder.name(property.name) + builder.asAnonymousFacet().block() + val key = builder.build() + ReadOnlyProperty { _, _ -> key } + } + + context(KeyNamespace) + @OptIn(ExperimentalTypeInference::class) + inline fun buildMap(@BuilderInference block: MapKey.NamedBuilderFacet.() -> Unit): MapKey { + val builder = mapBuilder(object : TypeToken>() {}, object : TypeToken() {}, object : TypeToken() {}) + builder.asNamedFacet().block() + return builder.build() + } context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) - inline fun buildingList( - @BuilderInference crossinline block: BuilderFacet.() -> Unit, - ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> - val builder = builder(object : TypeToken() {}) + inline fun buildingMap( + @BuilderInference crossinline block: MapKey.AnonymousBuilderFacet.() -> Unit, + ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> + val builder = mapBuilder(object : TypeToken>() {}, object : TypeToken() {}, object : TypeToken() {}) builder.name(property.name) - builder.block() + builder.asAnonymousFacet().block() val key = builder.build() ReadOnlyProperty { _, _ -> key } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt index 628833944..23992789a 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt @@ -37,19 +37,19 @@ interface KeyNamespace { } internal class KeyNamespaceImpl(override val name: String) : KeyNamespace { - val keys: MutableMap> = mutableMapOf() + private val keys: MutableMap> = mutableMapOf() override fun get(keyName: String, type: TypeToken): Key? { val key = keys[keyName] ?: return null - if (key.meta.type != type) { - throw TypeCastException("Key $name has type ${key.meta.type} which does not match provided type $type") + if (key.type != type) { + throw TypeCastException("Key $name has type ${key.type} which does not match provided type $type") } @Suppress("UNCHECKED_CAST") return key as Key } override fun add(key: Key) { - keys[key.meta.name] = key + keys[key.name] = key } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt index 17b1ed1f2..9a6886fb0 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt @@ -3,7 +3,7 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken context(KeyNamespace) -class ListKey( +class ListKey internal constructor( override val type: TypeToken>, override val name: String, override val fallback: List, @@ -59,4 +59,8 @@ class ListKey( @KeyBuilderDsl interface Builder : BuilderFacet>, Key.Builder, ListKey, Builder> + + @KeyBuilderDsl + interface FacetedBuilder : BuilderFacet>, + Key.FacetedBuilder, ListKey, FacetedBuilder, AnonymousBuilderFacet, NamedBuilderFacet> } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt index b0b2fc134..bf28ea7ab 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt @@ -5,20 +5,20 @@ import io.leangen.geantyref.TypeToken internal class ListKeyBuilder( type: TypeToken>, private val elementType: TypeToken, -) : AbstractKeyBuilder, ListKey, ListKey.Builder, ListKey.AnonymousBuilderFacet, ListKey.NamedBuilderFacet>(type), - ListKey.Builder { +) : AbstractKeyBuilder, ListKey, ListKey.FacetedBuilder, ListKey.AnonymousBuilderFacet, ListKey.NamedBuilderFacet>(type), + ListKey.FacetedBuilder { private var elementSerializer: ((E) -> String)? = null private var elementDeserializer: ((String) -> E)? = null - override fun self(): ListKey.Builder = this + override fun self(): ListKey.FacetedBuilder = this - override fun elementSerializer(serializer: ((E) -> String)?): ListKey.Builder { + override fun elementSerializer(serializer: ((E) -> String)?): ListKey.FacetedBuilder { this.elementSerializer = serializer return this } - override fun elementDeserializer(deserializer: ((String) -> E)?): ListKey.Builder { + override fun elementDeserializer(deserializer: ((String) -> E)?): ListKey.FacetedBuilder { this.elementDeserializer = deserializer return this } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt index 226172ba7..92fc81da3 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt @@ -3,7 +3,7 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken context(KeyNamespace) -class MapKey( +class MapKey internal constructor( override val type: TypeToken>, override val name: String, override val fallback: Map, @@ -82,4 +82,8 @@ class MapKey( @KeyBuilderDsl interface Builder : BuilderFacet>, Key.Builder, MapKey, Builder> + + @KeyBuilderDsl + interface FacetedBuilder : BuilderFacet>, + Key.FacetedBuilder, MapKey, FacetedBuilder, AnonymousBuilderFacet, NamedBuilderFacet> } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt index a870f051d..f92dff818 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt @@ -7,32 +7,33 @@ internal class MapKeyBuilder( private val keyType: TypeToken, private val valueType: TypeToken, ) : AbstractKeyBuilder< - Map, MapKey, MapKey.Builder, MapKey.AnonymousBuilderFacet, + Map, MapKey, MapKey.FacetedBuilder, MapKey.AnonymousBuilderFacet, MapKey.NamedBuilderFacet, - >(type), MapKey.Builder { + >(type), MapKey.FacetedBuilder { + private var keySerializer: ((K) -> String)? = null private var keyDeserializer: ((String) -> K)? = null private var valueSerializer: ((V) -> String)? = null private var valueDeserializer: ((String) -> V)? = null - override fun self(): MapKey.Builder = this + override fun self(): MapKey.FacetedBuilder = this - override fun keySerializer(serializer: ((K) -> String)?): MapKey.Builder { + override fun keySerializer(serializer: ((K) -> String)?): MapKey.FacetedBuilder { this.keySerializer = serializer return this } - override fun keyDeserializer(deserializer: ((String) -> K)?): MapKey.Builder { + override fun keyDeserializer(deserializer: ((String) -> K)?): MapKey.FacetedBuilder { this.keyDeserializer = deserializer return this } - override fun valueSerializer(serializer: ((V) -> String)?): MapKey.Builder { + override fun valueSerializer(serializer: ((V) -> String)?): MapKey.FacetedBuilder { this.valueSerializer = serializer return this } - override fun valueDeserializer(deserializer: ((String) -> V)?): MapKey.Builder { + override fun valueDeserializer(deserializer: ((String) -> V)?): MapKey.FacetedBuilder { this.valueDeserializer = deserializer return this } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt index b15e10aca..8acdc1881 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt @@ -3,7 +3,7 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken context(KeyNamespace) -class SimpleKey( +class SimpleKey internal constructor( override val type: TypeToken, override val name: String, override val fallback: T, @@ -58,4 +58,8 @@ class SimpleKey( @KeyBuilderDsl interface Builder : BuilderFacet>, Key.Builder, Builder> + + @KeyBuilderDsl + interface FacetedBuilder : BuilderFacet>, + Key.FacetedBuilder, FacetedBuilder, AnonymousBuilderFacet, NamedBuilderFacet> } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt index d774ea18b..6b63b3588 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt @@ -4,20 +4,21 @@ import io.leangen.geantyref.TypeToken internal class SimpleKeyBuilder( type: TypeToken, -) : AbstractKeyBuilder, SimpleKey.Builder, SimpleKey.AnonymousBuilderFacet, SimpleKey.NamedBuilderFacet>(type), - SimpleKey.Builder { +) : AbstractKeyBuilder, SimpleKey.FacetedBuilder, SimpleKey.AnonymousBuilderFacet, SimpleKey.NamedBuilderFacet>( + type, +), SimpleKey.FacetedBuilder { private var serializer: ((T) -> String)? = null private var deserializer: ((String) -> T)? = null - override fun self(): SimpleKey.Builder = this + override fun self(): SimpleKey.FacetedBuilder = this - override fun serializer(serializer: ((T) -> String)?): SimpleKey.Builder { + override fun serializer(serializer: ((T) -> String)?): SimpleKey.FacetedBuilder { this.serializer = serializer return self() } - override fun deserializer(deserializer: ((String) -> T)?): SimpleKey.Builder { + override fun deserializer(deserializer: ((String) -> T)?): SimpleKey.FacetedBuilder { this.deserializer = deserializer return self() } @@ -35,7 +36,7 @@ internal class SimpleKeyBuilder( override fun asAnonymousFacet(): SimpleKey.AnonymousBuilderFacet { return object : SimpleKey.AnonymousBuilderFacet { override fun fallback(fallback: T?): SimpleKey.AnonymousBuilderFacet { - this@SimpleKeyBuilder.fallback(fallback).let {this } + this@SimpleKeyBuilder.fallback(fallback).let { this } return this } From 18dd5a302a20ad41e0a111fa6c24cf4bd1b27c73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 19 Nov 2023 15:17:10 +0100 Subject: [PATCH 60/77] Add QOL inline methods for Key building --- .../org/anvilpowered/anvil/core/config/Key.kt | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index 03e5643d7..7f1bd3484 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -127,10 +127,19 @@ sealed interface Key : Comparable> { valueType: TypeToken, ): MapKey.FacetedBuilder = MapKeyBuilder(type, keyType, valueType) + inline fun simpleBuilder() = + simpleBuilder(object : TypeToken() {}) + + inline fun listBuilder() = + listBuilder(object : TypeToken>() {}, object : TypeToken() {}) + + inline fun mapBuilder() = + mapBuilder(object : TypeToken>() {}, object : TypeToken() {}, object : TypeToken() {}) + context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) inline fun buildSimple(@BuilderInference block: SimpleKey.NamedBuilderFacet.() -> Unit): SimpleKey { - val builder = simpleBuilder(object : TypeToken() {}) + val builder = simpleBuilder() builder.asNamedFacet().block() return builder.build() } @@ -140,7 +149,7 @@ sealed interface Key : Comparable> { inline fun buildingSimple( @BuilderInference crossinline block: SimpleKey.AnonymousBuilderFacet.() -> Unit, ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> - val builder = simpleBuilder(object : TypeToken() {}) + val builder = simpleBuilder() builder.name(property.name) builder.asAnonymousFacet().block() val key = builder.build() @@ -150,7 +159,7 @@ sealed interface Key : Comparable> { context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) inline fun buildList(@BuilderInference block: ListKey.NamedBuilderFacet.() -> Unit): ListKey { - val builder = listBuilder(object : TypeToken>() {}, object : TypeToken() {}) + val builder = listBuilder() builder.asNamedFacet().block() return builder.build() } @@ -160,7 +169,7 @@ sealed interface Key : Comparable> { inline fun buildingList( @BuilderInference crossinline block: ListKey.AnonymousBuilderFacet.() -> Unit, ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> - val builder = listBuilder(object : TypeToken>() {}, object : TypeToken() {}) + val builder = listBuilder() builder.name(property.name) builder.asAnonymousFacet().block() val key = builder.build() @@ -170,7 +179,7 @@ sealed interface Key : Comparable> { context(KeyNamespace) @OptIn(ExperimentalTypeInference::class) inline fun buildMap(@BuilderInference block: MapKey.NamedBuilderFacet.() -> Unit): MapKey { - val builder = mapBuilder(object : TypeToken>() {}, object : TypeToken() {}, object : TypeToken() {}) + val builder = mapBuilder() builder.asNamedFacet().block() return builder.build() } @@ -180,7 +189,7 @@ sealed interface Key : Comparable> { inline fun buildingMap( @BuilderInference crossinline block: MapKey.AnonymousBuilderFacet.() -> Unit, ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> - val builder = mapBuilder(object : TypeToken>() {}, object : TypeToken() {}, object : TypeToken() {}) + val builder = mapBuilder() builder.name(property.name) builder.asAnonymousFacet().block() val key = builder.build() From 932272aa843b211ba960ff342dbe06e5f2c11586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sun, 19 Nov 2023 16:31:09 +0100 Subject: [PATCH 61/77] Add broadcastAudience to Server --- .../kotlin/org/anvilpowered/anvil/core/platform/Server.kt | 2 ++ .../org/anvilpowered/anvil/paper/platform/PaperServer.kt | 2 ++ .../org/anvilpowered/anvil/sponge/platform/SpongeServer.kt | 4 +++- .../anvilpowered/anvil/velocity/platform/VelocityServer.kt | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt index 72cc09718..b991be03d 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt @@ -6,6 +6,8 @@ interface Server { val platform: Platform + val broadcastAudience: Audience + val systemSubject: Audience interface Scope { diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt index 481b4abae..1f6c1c502 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt @@ -8,6 +8,8 @@ import org.bukkit.Bukkit object PaperServer : Server { override val platform: Platform get() = PaperPlatform + override val broadcastAudience: Audience + get() = Bukkit.getServer() override val systemSubject: Audience get() = Bukkit.getConsoleSender() } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt index 5625cdaef..c86bf85cc 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt @@ -8,6 +8,8 @@ import org.spongepowered.api.Sponge object SpongeServer : Server { override val platform: Platform get() = SpongePlatform + override val broadcastAudience: Audience + get() = Sponge.server().broadcastAudience() override val systemSubject: Audience - get() = Sponge.systemSubject() + get() = Sponge.game().systemSubject() } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt index 92d3cd8ce..2d2472e9f 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt @@ -7,5 +7,6 @@ import org.anvilpowered.anvil.core.platform.Server class VelocityServer(proxyServer: ProxyServer) : Server { override val platform: Platform = VelocityPlatform(proxyServer) + override val broadcastAudience: Audience = proxyServer override val systemSubject: Audience = proxyServer.consoleCommandSource } From 511ddc17b4a4c76894cc695d45ec244e54fb2518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Mon, 20 Nov 2023 12:10:39 +0100 Subject: [PATCH 62/77] Add latencyMs to Player --- core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt | 2 ++ .../org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt | 2 ++ .../org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt | 2 ++ .../org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt | 2 ++ 4 files changed, 8 insertions(+) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt index 330c850af..ca2d0d0d9 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt @@ -32,4 +32,6 @@ interface Player : Subject, Audience { val username: String val displayname: Component + + val latencyMs: Int } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt index 4b780499a..d024880e6 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt @@ -17,4 +17,6 @@ private class AnvilPaperPlayer( override val id: UUID = platformDelegate.uniqueId override val username: String = platformDelegate.name override val displayname: Component = platformDelegate.displayName() + override val latencyMs: Int + get() = platformDelegate.ping } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt index 948ea6195..80aeebe9d 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt @@ -15,4 +15,6 @@ private class AnvilSpongePlayer( override val id: UUID = platformDelegate.uniqueId() override val username: String = platformDelegate.name() override val displayname: Component = platformDelegate.displayName().get() + override val latencyMs: Int + get() = platformDelegate.connection().latency() } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt index 5e3f9872b..eb43dc546 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt @@ -17,4 +17,6 @@ private class AnvilVelocityPlayer( override val id: UUID = velocityPlayer.uniqueId override val username: String = velocityPlayer.username override val displayname: Component = Component.text(velocityPlayer.username) + override val latencyMs: Int + get() = velocityPlayer.ping.toInt() } From 24d97992432b490ce8d896d58d3c4ca76a2d6553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Wed, 22 Nov 2023 18:37:14 +0100 Subject: [PATCH 63/77] Replace context receiver DI with koin --- .../anvilpowered/anvil/plugin/AnvilPlugin.kt | 17 +++++--- ...AnvilCommand.kt => AnvilCommandBuilder.kt} | 8 ++-- .../anvil/plugin/command/plugin/Info.kt | 4 +- .../anvil/plugin/command/plugin/List.kt | 4 +- ...uginCommand.kt => PluginCommandBuilder.kt} | 5 +-- .../anvil/plugin/AnvilPaperPlugin.kt | 6 +-- .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 13 ++++-- .../anvil/plugin/AnvilSpongePlugin.kt | 4 +- .../anvil/plugin/AnvilVelocityPlugin.kt | 8 +++- .../plugin/AnvilVelocityPluginBootstrap.kt | 17 +++++--- core/build.gradle.kts | 1 + .../org/anvilpowered/anvil/core/AnvilApi.kt | 8 ++-- .../anvilpowered/anvil/core/LoggerScope.kt | 26 ----------- .../anvil/core/command/CommandExecutor.kt | 31 +------------ .../anvil/core/command/LoggingExecutor.kt | 43 +++++++++++++++++++ .../anvil/core/config/Registry.kt | 4 -- .../anvil/core/platform/Server.kt | 4 -- .../anvil/core/user/PlayerService.kt | 4 -- gradle/libs.versions.toml | 1 + .../anvilpowered/anvil/paper/AnvilPaperApi.kt | 13 ++++-- .../anvil/paper/command/PaperCustomCommand.kt | 2 - .../anvil/paper/user/PaperPlayerService.kt | 2 +- .../anvil/sponge/AnvilSpongeApi.kt | 13 +++--- .../anvil/sponge/user/SpongePlayerService.kt | 2 +- .../anvil/velocity/AnvilVelocityApi.kt | 33 +++++++++++--- .../anvil/velocity/ProxyServerScope.kt | 25 ----------- .../command/VelocityCommandExecutor.kt | 7 +-- .../velocity/command/VelocityCustomCommand.kt | 5 +-- .../velocity/user/VelocityPlayerService.kt | 5 +-- 29 files changed, 151 insertions(+), 164 deletions(-) rename app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/{AnvilCommand.kt => AnvilCommandBuilder.kt} (84%) rename app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/{PluginCommand.kt => PluginCommandBuilder.kt} (88%) delete mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/LoggerScope.kt create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/command/LoggingExecutor.kt delete mode 100644 velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/ProxyServerScope.kt diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt index f76b1dead..4ec8f5e1a 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt @@ -1,16 +1,19 @@ package org.anvilpowered.anvil.plugin -import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.core.command.CommandSource -import org.anvilpowered.anvil.plugin.command.AnvilCommand +import org.anvilpowered.anvil.plugin.command.AnvilCommandBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode +import org.apache.logging.log4j.Logger -context(AnvilApi) -abstract class AnvilPlugin { - +abstract class AnvilPlugin( + private val logger: Logger, + private val anvilCommandBuilder: AnvilCommandBuilder, +) { fun registerCommands(registrationCallback: (LiteralCommandNode) -> Unit) { + logger.info("Building command tree...") + val command = anvilCommandBuilder.create() logger.info("Registering commands...") - registrationCallback(AnvilCommand.create()) - logger.info("Registered commands!") + registrationCallback(command) + logger.info("Finished registering commands.") } } diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandBuilder.kt similarity index 84% rename from app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandBuilder.kt index 6060317af..b1f20b627 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommand.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandBuilder.kt @@ -1,10 +1,9 @@ package org.anvilpowered.anvil.plugin.command import net.kyori.adventure.text.Component -import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.plugin.command.common.addHelp -import org.anvilpowered.anvil.plugin.command.plugin.PluginCommand +import org.anvilpowered.anvil.plugin.command.plugin.PluginCommandBuilder import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode @@ -14,11 +13,10 @@ private val children = mapOf( "version" to Component.text("Shows the Anvil Agent version"), ) -object AnvilCommand { - context(AnvilApi) +class AnvilCommandBuilder(private val pluginCommandBuilder: PluginCommandBuilder) { fun create(): LiteralCommandNode = ArgumentBuilder.literal("anvil") .addHelp("anvil", children) - .then(PluginCommand.create()) + .then(pluginCommandBuilder.create()) .build() } diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt index 3895afbae..bd5f7f6c9 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt @@ -2,7 +2,6 @@ package org.anvilpowered.anvil.plugin.command.plugin import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.plugin.command.common.executesUsage import org.anvilpowered.kbrig.Command @@ -11,8 +10,7 @@ import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.context.get import org.anvilpowered.kbrig.tree.LiteralCommandNode -context(AnvilApi) -fun PluginCommand.createInfo(): LiteralCommandNode = +fun PluginCommandBuilder.createInfo(): LiteralCommandNode = ArgumentBuilder.literal("info") .executesUsage("anvil plugin info ") .then( diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt index 2f5b899cd..84c883b72 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt @@ -2,14 +2,12 @@ package org.anvilpowered.anvil.plugin.command.plugin import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess import org.anvilpowered.kbrig.tree.LiteralCommandNode -context(AnvilApi) -fun PluginCommand.createList(): LiteralCommandNode = +fun PluginCommandBuilder.createList(): LiteralCommandNode = ArgumentBuilder.literal("list") .executesSingleSuccess { context -> val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandBuilder.kt similarity index 88% rename from app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandBuilder.kt index c20716e19..5653f9f57 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommand.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandBuilder.kt @@ -1,8 +1,8 @@ package org.anvilpowered.anvil.plugin.command.plugin import net.kyori.adventure.text.Component -import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.core.command.CommandSource +import org.anvilpowered.anvil.core.platform.PluginManager import org.anvilpowered.anvil.core.user.requiresPermission import org.anvilpowered.anvil.plugin.command.common.addHelp import org.anvilpowered.kbrig.builder.ArgumentBuilder @@ -14,8 +14,7 @@ private val children = mapOf( "info " to Component.text("Shows information about a plugin"), ) -object PluginCommand { - context(AnvilApi) +class PluginCommandBuilder(val pluginManager: PluginManager) { fun create(): LiteralCommandNode = ArgumentBuilder.literal("plugin") .addHelp("anvil plugin", children) diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt index 94ddac117..ba74cb523 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt @@ -3,14 +3,12 @@ package org.anvilpowered.anvil.plugin import io.papermc.paper.event.server.ServerResourcesLoadEvent -import org.anvilpowered.anvil.paper.AnvilPaperApi import org.anvilpowered.anvil.paper.command.toPaper import org.bukkit.plugin.Plugin -context(AnvilPaperApi) -class AnvilPaperPlugin : AnvilPlugin() { +class AnvilPaperPlugin(private val plugin: AnvilPlugin) { fun registerCommands(bootstrap: Plugin, event: ServerResourcesLoadEvent) { - registerCommands { command -> + plugin.registerCommands { command -> event.commands.register(bootstrap, command.toPaper()) } } diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt index 7f7c4f8cd..74c958b78 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -8,16 +8,23 @@ import org.anvilpowered.anvil.paper.createPaper import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.koinApplication +import org.koin.dsl.module class AnvilPaperPluginBootstrap : JavaPlugin(), Listener { - private val plugin = with(AnvilApi.createPaper()) { - AnvilPaperPlugin() - } + private lateinit var plugin: AnvilPaperPlugin override fun onEnable() { logger.info { "Registering events" } server.pluginManager.registerEvents(this, this) + plugin = koinApplication { + modules( + AnvilApi.createPaper().module, + module { singleOf(::AnvilPaperPlugin) }, + ) + }.koin.get() } @EventHandler diff --git a/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt index 211b4291c..525627820 100644 --- a/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt +++ b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt @@ -1,11 +1,9 @@ package org.anvilpowered.anvil.plugin import com.mojang.brigadier.tree.LiteralCommandNode -import org.anvilpowered.anvil.sponge.AnvilSpongeApi import org.spongepowered.api.event.lifecycle.RegisterCommandEvent -context(AnvilSpongeApi) -class AnvilSpongePlugin : AnvilPlugin() { +class AnvilSpongePlugin(private val plugin: AnvilPlugin) { fun registerCommands(event: RegisterCommandEvent>) { } } diff --git a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt index 1dc1170c1..d3dca197f 100644 --- a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -19,14 +19,18 @@ package org.anvilpowered.anvil.plugin import com.velocitypowered.api.command.BrigadierCommand +import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.velocity.AnvilVelocityApi import org.anvilpowered.anvil.velocity.command.toVelocity context(AnvilVelocityApi) -class AnvilVelocityPlugin : AnvilPlugin() { +class AnvilVelocityPlugin( + private val proxyServer: ProxyServer, + private val plugin: AnvilPlugin, +) { fun registerCommands() { - registerCommands { command -> + plugin.registerCommands { command -> proxyServer.commandManager.register(BrigadierCommand(command.toVelocity())) } } diff --git a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index acc2aecdf..a46911e02 100644 --- a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt +++ b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -26,6 +26,9 @@ import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.velocity.createVelocity +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.koinApplication +import org.koin.dsl.module import org.slf4j.Logger @Plugin( @@ -37,17 +40,21 @@ import org.slf4j.Logger class AnvilVelocityPluginBootstrap @Inject constructor( private val logger: Logger, private val proxyServer: ProxyServer, - injector: Injector, + private val injector: Injector, ) { - private val plugin = with(AnvilApi.createVelocity(injector)) { - AnvilVelocityPlugin() - } + private lateinit var plugin: AnvilVelocityPlugin @Subscribe fun onProxyInit(event: ProxyInitializeEvent) { - logger.info("Anvil Agent is running!") + logger.info("Registering events") proxyServer.eventManager.register(this, plugin) + plugin = koinApplication { + modules( + AnvilApi.createVelocity(injector).module, + module { singleOf(::AnvilVelocityPlugin) }, + ) + }.koin.get() plugin.registerCommands() } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 93c01cc43..870440ad1 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { api(libs.annotations) api(libs.kotlinx.coroutines) api(libs.guava) + api(libs.koin) compileOnlyApi(platform(libs.adventure.bom)) compileOnlyApi("net.kyori:adventure-api") diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt index 701a656c7..caa3da840 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt @@ -18,9 +18,7 @@ package org.anvilpowered.anvil.core -import org.anvilpowered.anvil.core.platform.PluginManager -import org.anvilpowered.anvil.core.platform.Server -import org.anvilpowered.anvil.core.user.PlayerService +import org.koin.core.module.Module /** * To create an instance of this interface, use the `AnvilApi.create` function. @@ -37,9 +35,9 @@ import org.anvilpowered.anvil.core.user.PlayerService * AnvilApi.createVelocity("my-plugin", ....) * ``` */ -interface AnvilApi : PlayerService.Scope, LoggerScope, Server.Scope { +interface AnvilApi { - val pluginManager: PluginManager + val module: Module companion object } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/LoggerScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/LoggerScope.kt deleted file mode 100644 index ace9c8ab7..000000000 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/LoggerScope.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.core - -import org.apache.logging.log4j.Logger - -interface LoggerScope { - - val logger: Logger -} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt index 554dd8d2d..5feb82f96 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt @@ -18,40 +18,11 @@ package org.anvilpowered.anvil.core.command -import org.anvilpowered.anvil.core.LoggerScope +import org.apache.logging.log4j.Logger interface CommandExecutor { suspend fun execute(source: CommandSource, command: String): Boolean suspend fun executeAsConsole(command: String): Boolean - - interface Scope { - val commandExecutor: CommandExecutor - } - - companion object { - context(Scope, LoggerScope) - fun withLogging(prefix: String = "command"): CommandExecutor = object : CommandExecutor { - private fun log(success: Boolean, prefix: String, command: String) { - if (success) { - logger.info("$prefix: $command") - } else { - logger.error("Failed to execute $prefix: $command") - } - } - - override suspend fun execute(source: CommandSource, command: String): Boolean { - val success = commandExecutor.execute(source, command) - log(success, prefix, command) - return success - } - - override suspend fun executeAsConsole(command: String): Boolean { - val success = commandExecutor.executeAsConsole(command) - log(success, "console via $prefix", command) - return success - } - } - } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/LoggingExecutor.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/LoggingExecutor.kt new file mode 100644 index 000000000..54a206f6a --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/LoggingExecutor.kt @@ -0,0 +1,43 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.command + +import org.apache.logging.log4j.Logger + +fun CommandExecutor.withLogging(logger: Logger, prefix: String = "command"): CommandExecutor = object : CommandExecutor { + private fun log(success: Boolean, prefix: String, command: String) { + if (success) { + logger.info("$prefix: $command") + } else { + logger.error("Failed to execute $prefix: $command") + } + } + + override suspend fun execute(source: CommandSource, command: String): Boolean { + val success = this@withLogging.execute(source, command) + log(success, prefix, command) + return success + } + + override suspend fun executeAsConsole(command: String): Boolean { + val success = this@withLogging.executeAsConsole(command) + log(success, "console via $prefix", command) + return success + } +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt index 497be2373..27717ae76 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt @@ -38,8 +38,4 @@ interface Registry { fun getStrict(key: MapKey, mapKey: K): V? fun getDefault(key: MapKey, mapKey: K): V operator fun get(key: MapKey, mapKey: K): V = getStrict(key, mapKey) ?: getDefault(key, mapKey) - - interface Scope { - val registry: Registry - } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt index b991be03d..c8faabe21 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt @@ -9,8 +9,4 @@ interface Server { val broadcastAudience: Audience val systemSubject: Audience - - interface Scope { - val server: Server - } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt index 804e21e79..77d9653f4 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt @@ -27,8 +27,4 @@ interface PlayerService { operator fun get(id: UUID): Player? fun getAll(startsWith: String = ""): Sequence - - interface Scope { - val playerService: PlayerService - } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8b8571830..db598ffe6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,6 +17,7 @@ exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc" } exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time" } guava = "com.google.guava:guava:32.1.3-jre" kbrig-brigadier = "org.anvilpowered:kbrig-brigadier:0.1.0-SNAPSHOT" +koin = "io.insert-koin:koin-core:3.5.2-RC1" kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0" kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.0" diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt index d533b7002..56711de5d 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt @@ -30,15 +30,20 @@ import org.anvilpowered.anvil.paper.user.PaperPlayerService import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger import org.bukkit.plugin.java.JavaPlugin +import org.koin.core.module.Module +import org.koin.dsl.module interface AnvilPaperApi : AnvilApi context(JavaPlugin) fun AnvilApi.Companion.createPaper(): AnvilPaperApi { + val paperModule = module { + single { LogManager.getLogger(pluginMeta.name) } + single { PaperServer } + single { PaperPluginManager } + single { PaperPlayerService } + } return object : AnvilPaperApi { - override val logger: Logger = LogManager.getLogger(pluginMeta.name) - override val server: Server = PaperServer - override val pluginManager: PluginManager = PaperPluginManager - override val playerService: PlayerService = PaperPlayerService() + override val module: Module = paperModule } } diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt index b0b59f808..6ba847f1a 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt @@ -2,7 +2,6 @@ package org.anvilpowered.anvil.paper.command import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import org.anvilpowered.anvil.paper.AnvilPaperApi import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.core.command.PlayerCommandScope import org.anvilpowered.anvil.core.user.Player @@ -14,7 +13,6 @@ import org.anvilpowered.kbrig.context.CommandContext import org.anvilpowered.kbrig.context.get import org.bukkit.Bukkit -context(AnvilPaperApi) class PaperCustomCommand : PlayerCommandScope { override fun ArgumentBuilder.Companion.player( diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt index 7653b9b93..924ef8dcd 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt @@ -23,7 +23,7 @@ import org.anvilpowered.anvil.core.user.PlayerService import org.bukkit.Bukkit import java.util.UUID -class PaperPlayerService : PlayerService { +object PaperPlayerService : PlayerService { override fun get(username: String): Player? = Bukkit.getPlayerExact(username)?.toAnvilPlayer() diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt index a18ce7f26..e90b1a4f0 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt @@ -23,11 +23,11 @@ import org.anvilpowered.anvil.core.AnvilApi import org.anvilpowered.anvil.core.platform.PluginManager import org.anvilpowered.anvil.core.platform.Server import org.anvilpowered.anvil.core.user.PlayerService -import org.anvilpowered.anvil.sponge.platform.SpongePlatform import org.anvilpowered.anvil.sponge.platform.SpongePluginManager import org.anvilpowered.anvil.sponge.platform.SpongeServer import org.anvilpowered.anvil.sponge.user.SpongePlayerService import org.apache.logging.log4j.Logger +import org.koin.dsl.module interface AnvilSpongeApi : AnvilApi { @@ -70,10 +70,13 @@ interface AnvilSpongeApi : AnvilApi { * ``` */ fun AnvilApi.Companion.createSponge(injector: Injector): AnvilSpongeApi { + val spongeModule = module { + single { injector.getInstance(Logger::class.java) } + single { SpongeServer } + single { SpongePluginManager } + single { SpongePlayerService } + } return object : AnvilSpongeApi { - override val logger: Logger = injector.getInstance(Logger::class.java) - override val server: Server = SpongeServer - override val pluginManager: PluginManager = SpongePluginManager - override val playerService: PlayerService = SpongePlayerService() + override val module = spongeModule } } diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt index c6bc1cfdf..5e0c9daeb 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt @@ -23,7 +23,7 @@ import org.anvilpowered.anvil.core.user.PlayerService import org.spongepowered.api.Sponge import java.util.UUID -class SpongePlayerService : PlayerService { +object SpongePlayerService : PlayerService { override fun get(username: String): Player? = Sponge.server().player(username).orElse(null)?.toAnvilPlayer() diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index adb886d3c..e6cf9c698 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -19,6 +19,7 @@ package org.anvilpowered.anvil.velocity import com.google.inject.Injector +import com.velocitypowered.api.plugin.PluginContainer import com.velocitypowered.api.plugin.PluginDescription import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.core.AnvilApi @@ -30,6 +31,13 @@ import org.anvilpowered.anvil.velocity.platform.VelocityServer import org.anvilpowered.anvil.velocity.user.VelocityPlayerService import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger +import org.koin.core.context.KoinContext +import org.koin.core.context.startKoin +import org.koin.core.module.Module +import org.koin.core.module.dsl.bind +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.koinApplication +import org.koin.dsl.module /** * A subtype of [AnvilApi] that also provides access to Velocity-specific APIs such as [ProxyServer]. @@ -38,7 +46,7 @@ import org.apache.logging.log4j.Logger * * If you are using Java, the method [AnvilVelocityApi.doNotUse] is provided as an alternative. */ -interface AnvilVelocityApi : AnvilApi, ProxyServerScope { +interface AnvilVelocityApi : AnvilApi { companion object { /** @@ -93,11 +101,24 @@ interface AnvilVelocityApi : AnvilApi, ProxyServerScope { fun AnvilApi.Companion.createVelocity(injector: Injector): AnvilVelocityApi { val proxyServer = injector.getInstance(ProxyServer::class.java) val pluginDescription = injector.getInstance(PluginDescription::class.java) + val velocityModule = module { + single { LogManager.getLogger(pluginDescription.id) } + single { VelocityServer(proxyServer) } + single { VelocityPluginManager(proxyServer.pluginManager) } + single { proxyServer } + single { pluginDescription } + single { injector.getInstance(PluginContainer::class.java) } + singleOf(::VelocityPlayerService) { + bind() + } + } + + val koin = koinApplication { + modules(velocityModule) + }.koin + + return object : AnvilVelocityApi { - override val logger: Logger = LogManager.getLogger(pluginDescription.id) - override val server: Server = VelocityServer(proxyServer) - override val pluginManager: PluginManager = VelocityPluginManager(proxyServer.pluginManager) - override val proxyServer: ProxyServer = proxyServer - override val playerService: PlayerService = VelocityPlayerService() + override val module: Module = velocityModule } } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/ProxyServerScope.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/ProxyServerScope.kt deleted file mode 100644 index bcab6fc8c..000000000 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/ProxyServerScope.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.anvilpowered.anvil.velocity - -import com.velocitypowered.api.proxy.ProxyServer - -interface ProxyServerScope { - val proxyServer: ProxyServer -} diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt index 3c25a076f..6f66e4c44 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt @@ -18,14 +18,15 @@ package org.anvilpowered.anvil.velocity.command +import com.velocitypowered.api.proxy.ProxyServer import kotlinx.coroutines.future.await import org.anvilpowered.anvil.core.command.CommandExecutor import org.anvilpowered.anvil.core.command.CommandSource -import org.anvilpowered.anvil.velocity.ProxyServerScope import com.velocitypowered.api.command.CommandSource as VelocityCommandSource -context(ProxyServerScope) -class VelocityCommandExecutor : CommandExecutor { +class VelocityCommandExecutor( + private val proxyServer: ProxyServer, +) : CommandExecutor { override suspend fun execute(source: CommandSource, command: String): Boolean { return proxyServer.commandManager.executeAsync( source.platformDelegate as VelocityCommandSource, diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt index 2447b459f..c01700c2b 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt @@ -1,11 +1,11 @@ package org.anvilpowered.anvil.velocity.command +import com.velocitypowered.api.proxy.ProxyServer import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.core.command.PlayerCommandScope import org.anvilpowered.anvil.core.user.Player -import org.anvilpowered.anvil.velocity.AnvilVelocityApi import org.anvilpowered.anvil.velocity.user.toAnvilPlayer import org.anvilpowered.kbrig.argument.StringArgumentType import org.anvilpowered.kbrig.builder.ArgumentBuilder @@ -14,8 +14,7 @@ import org.anvilpowered.kbrig.context.CommandContext import org.anvilpowered.kbrig.context.get import kotlin.jvm.optionals.getOrNull -context(AnvilVelocityApi) -class VelocityCustomCommand : PlayerCommandScope { +class VelocityCustomCommand(private val proxyServer: ProxyServer) : PlayerCommandScope { override fun ArgumentBuilder.Companion.player( argumentName: String, diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt index 48a85a313..9a6a36f10 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt @@ -18,13 +18,12 @@ package org.anvilpowered.anvil.velocity.user +import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.core.user.Player import org.anvilpowered.anvil.core.user.PlayerService -import org.anvilpowered.anvil.velocity.ProxyServerScope import java.util.UUID -context(ProxyServerScope) -class VelocityPlayerService : PlayerService { +class VelocityPlayerService(private val proxyServer: ProxyServer) : PlayerService { override fun get(username: String): Player? = proxyServer.getPlayer(username).orElse(null)?.toAnvilPlayer() From 35ad48c84db49313361737c44177bcd43574f02a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Thu, 23 Nov 2023 09:38:53 +0100 Subject: [PATCH 64/77] Fix velocity api redundant code --- .../org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index e6cf9c698..0184f4433 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -113,11 +113,6 @@ fun AnvilApi.Companion.createVelocity(injector: Injector): AnvilVelocityApi { } } - val koin = koinApplication { - modules(velocityModule) - }.koin - - return object : AnvilVelocityApi { override val module: Module = velocityModule } From 3239c8e706d86d99528d5a4a15ac751704231369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Thu, 23 Nov 2023 09:44:28 +0100 Subject: [PATCH 65/77] Fix some issues in AnvilVelocityPluginBootstrap --- .../anvil/plugin/AnvilVelocityPluginBootstrap.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index a46911e02..462523db1 100644 --- a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt +++ b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -29,7 +29,6 @@ import org.anvilpowered.anvil.velocity.createVelocity import org.koin.core.module.dsl.singleOf import org.koin.dsl.koinApplication import org.koin.dsl.module -import org.slf4j.Logger @Plugin( id = "anvil-agent", @@ -38,7 +37,6 @@ import org.slf4j.Logger authors = ["AnvilPowered"], ) class AnvilVelocityPluginBootstrap @Inject constructor( - private val logger: Logger, private val proxyServer: ProxyServer, private val injector: Injector, ) { @@ -47,8 +45,6 @@ class AnvilVelocityPluginBootstrap @Inject constructor( @Subscribe fun onProxyInit(event: ProxyInitializeEvent) { - logger.info("Registering events") - proxyServer.eventManager.register(this, plugin) plugin = koinApplication { modules( AnvilApi.createVelocity(injector).module, @@ -56,5 +52,6 @@ class AnvilVelocityPluginBootstrap @Inject constructor( ) }.koin.get() plugin.registerCommands() + proxyServer.eventManager.register(this, plugin) } } From 580df1cf6c4ca14a76099a29757f49e36e340ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Thu, 23 Nov 2023 09:53:22 +0100 Subject: [PATCH 66/77] CommandBuilder -> CommandFactory --- .../kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt | 6 +++--- .../{AnvilCommandBuilder.kt => AnvilCommandFactory.kt} | 6 +++--- .../org/anvilpowered/anvil/plugin/command/plugin/Info.kt | 2 +- .../org/anvilpowered/anvil/plugin/command/plugin/List.kt | 2 +- .../{PluginCommandBuilder.kt => PluginCommandFactory.kt} | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) rename app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/{AnvilCommandBuilder.kt => AnvilCommandFactory.kt} (84%) rename app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/{PluginCommandBuilder.kt => PluginCommandFactory.kt} (93%) diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt index 4ec8f5e1a..959a8f926 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt @@ -1,17 +1,17 @@ package org.anvilpowered.anvil.plugin import org.anvilpowered.anvil.core.command.CommandSource -import org.anvilpowered.anvil.plugin.command.AnvilCommandBuilder +import org.anvilpowered.anvil.plugin.command.AnvilCommandFactory import org.anvilpowered.kbrig.tree.LiteralCommandNode import org.apache.logging.log4j.Logger abstract class AnvilPlugin( private val logger: Logger, - private val anvilCommandBuilder: AnvilCommandBuilder, + private val anvilCommandFactory: AnvilCommandFactory, ) { fun registerCommands(registrationCallback: (LiteralCommandNode) -> Unit) { logger.info("Building command tree...") - val command = anvilCommandBuilder.create() + val command = anvilCommandFactory.create() logger.info("Registering commands...") registrationCallback(command) logger.info("Finished registering commands.") diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandBuilder.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandFactory.kt similarity index 84% rename from app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandBuilder.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandFactory.kt index b1f20b627..c674f1398 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandBuilder.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandFactory.kt @@ -3,7 +3,7 @@ package org.anvilpowered.anvil.plugin.command import net.kyori.adventure.text.Component import org.anvilpowered.anvil.core.command.CommandSource import org.anvilpowered.anvil.plugin.command.common.addHelp -import org.anvilpowered.anvil.plugin.command.plugin.PluginCommandBuilder +import org.anvilpowered.anvil.plugin.command.plugin.PluginCommandFactory import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.tree.LiteralCommandNode @@ -13,10 +13,10 @@ private val children = mapOf( "version" to Component.text("Shows the Anvil Agent version"), ) -class AnvilCommandBuilder(private val pluginCommandBuilder: PluginCommandBuilder) { +class AnvilCommandFactory(private val pluginCommandFactory: PluginCommandFactory) { fun create(): LiteralCommandNode = ArgumentBuilder.literal("anvil") .addHelp("anvil", children) - .then(pluginCommandBuilder.create()) + .then(pluginCommandFactory.create()) .build() } diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt index bd5f7f6c9..aaf81f513 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt @@ -10,7 +10,7 @@ import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.context.get import org.anvilpowered.kbrig.tree.LiteralCommandNode -fun PluginCommandBuilder.createInfo(): LiteralCommandNode = +fun PluginCommandFactory.createInfo(): LiteralCommandNode = ArgumentBuilder.literal("info") .executesUsage("anvil plugin info ") .then( diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt index 84c883b72..35677b367 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt @@ -7,7 +7,7 @@ import org.anvilpowered.kbrig.builder.ArgumentBuilder import org.anvilpowered.kbrig.builder.executesSingleSuccess import org.anvilpowered.kbrig.tree.LiteralCommandNode -fun PluginCommandBuilder.createList(): LiteralCommandNode = +fun PluginCommandFactory.createList(): LiteralCommandNode = ArgumentBuilder.literal("list") .executesSingleSuccess { context -> val pluginNamesString = pluginManager.plugins.joinToString(", ") { it.name } diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandBuilder.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandFactory.kt similarity index 93% rename from app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandBuilder.kt rename to app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandFactory.kt index 5653f9f57..71e8dd0f2 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandBuilder.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandFactory.kt @@ -14,7 +14,7 @@ private val children = mapOf( "info " to Component.text("Shows information about a plugin"), ) -class PluginCommandBuilder(val pluginManager: PluginManager) { +class PluginCommandFactory(val pluginManager: PluginManager) { fun create(): LiteralCommandNode = ArgumentBuilder.literal("plugin") .addHelp("anvil plugin", children) From 3395e7ae81c120480a84226a0a0b8aa6464cb060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Thu, 23 Nov 2023 10:55:36 +0100 Subject: [PATCH 67/77] Add velocity ArgumentExtension --- .../anvil/velocity/user/ArgumentExtensions.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/ArgumentExtensions.kt diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/ArgumentExtensions.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/ArgumentExtensions.kt new file mode 100644 index 000000000..120787b0b --- /dev/null +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/ArgumentExtensions.kt @@ -0,0 +1,25 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.velocity.user + +import com.velocitypowered.api.command.CommandSource +import org.anvilpowered.kbrig.builder.ArgumentBuilder + +fun > B.requiresPermission(permission: String): B = + requires { it.hasPermission(permission) } From 44a541f5ba065b2c05a4ecb00ea4e9930d9f6ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Thu, 23 Nov 2023 11:55:20 +0100 Subject: [PATCH 68/77] Make these jvmstatic --- core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index 7f1bd3484..f491b8455 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -114,13 +114,16 @@ sealed interface Key : Comparable> { return result } + @JvmStatic fun simpleBuilder(type: TypeToken): SimpleKey.FacetedBuilder = SimpleKeyBuilder(type) + @JvmStatic fun listBuilder( type: TypeToken>, elementType: TypeToken, ): ListKey.FacetedBuilder = ListKeyBuilder(type, elementType) + @JvmStatic fun mapBuilder( type: TypeToken>, keyType: TypeToken, From f54297269411f2be49e683a3f13d7aca258c0675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Thu, 23 Nov 2023 12:33:28 +0100 Subject: [PATCH 69/77] Work on Key serialization --- .../anvil/core/config/AbstractKeyBuilder.kt | 13 ------- .../anvil/core/config/DefaultSerialization.kt | 34 +++++++++++++++++++ .../anvil/core/config/EnvironmentRegistry.kt | 26 ++++++-------- .../org/anvilpowered/anvil/core/config/Key.kt | 12 ++++++- .../anvilpowered/anvil/core/config/ListKey.kt | 18 +++++++--- .../anvil/core/config/ListKeyBuilder.kt | 4 +-- .../anvilpowered/anvil/core/config/MapKey.kt | 29 +++++++++++----- .../anvil/core/config/MapKeyBuilder.kt | 8 ++--- .../anvil/core/config/Registry.kt | 5 ++- .../anvil/core/config/SimpleKey.kt | 8 ++--- .../anvil/core/config/SimpleKeyBuilder.kt | 4 +-- 11 files changed, 105 insertions(+), 56 deletions(-) create mode 100644 core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt index 0db2ef761..9307d64d7 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt @@ -48,16 +48,3 @@ internal abstract class AbstractKeyBuilder< return self() } } - -private fun getDefaultDeserializer(type: TypeToken): (String) -> T? { - @Suppress("UNCHECKED_CAST") - return when (type.type) { - String::class.java -> { it -> it } - Int::class.java -> { it: String -> it.toIntOrNull() } - Long::class.java -> { it: String -> it.toLongOrNull() } - Float::class.java -> { it: String -> it.toFloatOrNull() } - Double::class.java -> { it: String -> it.toDoubleOrNull() } - Boolean::class.java -> { it: String -> it.toBooleanStrictOrNull() } - else -> throw IllegalArgumentException("There is no default parser for $type") - } as (String) -> T? -} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt new file mode 100644 index 000000000..2155864de --- /dev/null +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt @@ -0,0 +1,34 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2023 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.anvilpowered.anvil.core.config + +import io.leangen.geantyref.TypeToken + +internal fun Key.Companion.getDefaultDeserializer(type: TypeToken): (String) -> T { + @Suppress("UNCHECKED_CAST") + return when (type.type) { + String::class.java -> { it -> it } + Int::class.java -> { it: String -> it.toIntOrNull() } + Long::class.java -> { it: String -> it.toLongOrNull() } + Float::class.java -> { it: String -> it.toFloatOrNull() } + Double::class.java -> { it: String -> it.toDoubleOrNull() } + Boolean::class.java -> { it: String -> it.toBooleanStrictOrNull() } + else -> throw IllegalArgumentException("There is no default parser for $type") + } as (String) -> T +} diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt index 279b67e69..b0b91dbbc 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt @@ -22,23 +22,19 @@ package org.anvilpowered.anvil.core.config * A [Registry] implementation that checks environment variables. */ class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { + override fun getDefault(key: Key): T { + return delegate?.getDefault(key) ?: key.fallback + } + override fun getStrict(key: SimpleKey): T? { val value = System.getenv(key.name) ?: return delegate?.getStrict(key) return key.deserialize(value) } - override fun getDefault(key: SimpleKey): T { - return delegate?.getDefault(key) ?: throw NoSuchElementException("No default value for key ${key.name}") - } - override fun getStrict(key: ListKey): List? { val value = System.getenv(key.name) ?: return delegate?.getStrict(key) val tokens = value.split(",") - return tokens.mapNotNull { key.deserializeElement(it) } - } - - override fun getDefault(key: ListKey): List { - return delegate?.getDefault(key) ?: throw NoSuchElementException("No default value for key ${key.name}") + return tokens.map { key.deserializeElement(it) } } override fun getStrict(key: ListKey, index: Int): E? { @@ -48,7 +44,9 @@ class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { } override fun getDefault(key: ListKey, index: Int): E { - return delegate?.getDefault(key, index) ?: throw NoSuchElementException("No default value for key ${key.name}") + return delegate?.getDefault(key, index) + ?: key.fallback.getOrNull(index) + ?: throw NoSuchElementException("No default value for key ${key.name} at index $index") } override fun getStrict(key: MapKey): Map? { @@ -62,10 +60,6 @@ class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { } } - override fun getDefault(key: MapKey): Map { - return delegate?.getDefault(key) ?: throw NoSuchElementException("No default value for key ${key.name}") - } - override fun getStrict(key: MapKey, mapKey: K): V? { val value = System.getenv(key.name) ?: return delegate?.getStrict(key, mapKey) return value.split(",").asSequence() @@ -78,6 +72,8 @@ class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { } override fun getDefault(key: MapKey, mapKey: K): V { - return delegate?.getDefault(key, mapKey) ?: throw NoSuchElementException("No default value for key ${key.name}") + return delegate?.getDefault(key, mapKey) + ?: key.fallback[mapKey] + ?: throw NoSuchElementException("No default value for key ${key.name} with mapKey $mapKey") } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index f491b8455..ed686c786 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -29,10 +29,20 @@ sealed interface Key : Comparable> { val name: String - val fallback: T? + val fallback: T val description: String? + /** + * Serializes the given value in a simple [String] representation. + */ + fun serialize(value: T): String + + /** + * Deserializes the given value from a simple [String] representation. + */ + fun deserialize(value: String): T? + @KeyBuilderDsl interface BuilderFacet, B : BuilderFacet> { /** diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt index 9a6886fb0..abfda394c 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt @@ -9,8 +9,8 @@ class ListKey internal constructor( override val fallback: List, override val description: String?, private val elementType: TypeToken, - private val elementSerializer: (E) -> String, - private val elementDeserializer: (String) -> E?, + private val elementSerializer: ((E) -> String)?, + private val elementDeserializer: (String) -> E, ) : Key> { private val namespace: KeyNamespace = this@KeyNamespace @@ -18,8 +18,18 @@ class ListKey internal constructor( namespace.add(this) } - fun serializeElement(element: E): String = elementSerializer(element) - fun deserializeElement(element: String): E? = elementDeserializer(element) + fun serializeElement(element: E): String = elementSerializer?.invoke(element) ?: element.toString() + fun deserializeElement(element: String): E = elementDeserializer(element) + + override fun serialize(value: List): String { + return value.joinToString(",") { serializeElement(it) } + } + + override fun deserialize(value: String): List? { + return value.splitToSequence(",") + .map { deserializeElement(it) } + .toList() + } override fun compareTo(other: Key>): Int = Key.comparator.compare(this, other) override fun equals(other: Any?): Boolean = (other as Key<*>?)?.let { Key.equals(this, it) } ?: false diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt index bf28ea7ab..300eee72e 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt @@ -30,8 +30,8 @@ internal class ListKeyBuilder( requireNotNull(fallback) { "Fallback is null" }, description, elementType, - requireNotNull(elementSerializer) { "Element serializer is null" }, - requireNotNull(elementDeserializer) { "Element deserializer is null" }, + elementSerializer, + elementDeserializer ?: Key.getDefaultDeserializer(elementType), ) override fun asAnonymousFacet(): ListKey.AnonymousBuilderFacet { diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt index 92fc81da3..9eb47ef26 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt @@ -9,11 +9,11 @@ class MapKey internal constructor( override val fallback: Map, override val description: String?, private val keyType: TypeToken, - private val keySerializer: (K) -> String, - private val keyDeserializer: (String) -> K?, + private val keySerializer: ((K) -> String)?, + private val keyDeserializer: (String) -> K, private val valueType: TypeToken, - private val valueSerializer: (V) -> String, - private val valueDeserializer: (String) -> V?, + private val valueSerializer: ((V) -> String)?, + private val valueDeserializer: (String) -> V, ) : Key> { private val namespace: KeyNamespace = this@KeyNamespace @@ -21,10 +21,23 @@ class MapKey internal constructor( namespace.add(this) } - fun serializeKey(key: K): String = keySerializer(key) - fun deserializeKey(key: String): K? = keyDeserializer(key) - fun serializeValue(value: V): String = valueSerializer(value) - fun deserializeValue(value: String): V? = valueDeserializer(value) + fun serializeKey(mapKey: K): String = keySerializer?.invoke(mapKey) ?: mapKey.toString() + fun deserializeKey(mapKey: String): K = keyDeserializer(mapKey) + fun serializeValue(mapValue: V): String = valueSerializer?.invoke(mapValue) ?: mapValue.toString() + fun deserializeValue(mapValue: String): V = valueDeserializer(mapValue) + + override fun serialize(value: Map): String { + return value.entries.joinToString(",") { (key, value) -> + "${serializeKey(key)}=${serializeValue(value)}" + } + } + + override fun deserialize(value: String): Map { + return value.splitToSequence(",") + .map { it.split("=", limit = 2) } + .map { (key, value) -> deserializeKey(key) to deserializeValue(value) } + .toMap() + } override fun compareTo(other: Key>): Int = Key.comparator.compare(this, other) override fun equals(other: Any?): Boolean = (other as Key<*>?)?.let { Key.equals(this, it) } ?: false diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt index f92dff818..8e8e4b2c3 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt @@ -45,11 +45,11 @@ internal class MapKeyBuilder( requireNotNull(fallback) { "Fallback is null" }, description, keyType, - requireNotNull(keySerializer) { "Key serializer is null" }, - requireNotNull(keyDeserializer) { "Key deserializer is null" }, + keySerializer, + keyDeserializer ?: Key.getDefaultDeserializer(keyType), valueType, - requireNotNull(valueSerializer) { "Value serializer is null" }, - requireNotNull(valueDeserializer) { "Value deserializer is null" }, + valueSerializer, + valueDeserializer ?: Key.getDefaultDeserializer(valueType), ) override fun asAnonymousFacet(): MapKey.AnonymousBuilderFacet { diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt index 27717ae76..41ec45d48 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt @@ -19,12 +19,12 @@ package org.anvilpowered.anvil.core.config interface Registry { + fun getDefault(key: Key): T + fun getStrict(key: SimpleKey): T? - fun getDefault(key: SimpleKey): T operator fun get(key: SimpleKey): T = getStrict(key) ?: getDefault(key) fun getStrict(key: ListKey): List? - fun getDefault(key: ListKey): List operator fun get(key: ListKey): List = getStrict(key) ?: getDefault(key) fun getStrict(key: ListKey, index: Int): E? @@ -32,7 +32,6 @@ interface Registry { operator fun get(key: ListKey, index: Int): E = getStrict(key, index) ?: getDefault(key, index) fun getStrict(key: MapKey): Map? - fun getDefault(key: MapKey): Map operator fun get(key: MapKey): Map = getStrict(key) ?: getDefault(key) fun getStrict(key: MapKey, mapKey: K): V? diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt index 8acdc1881..820833ef5 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt @@ -8,8 +8,8 @@ class SimpleKey internal constructor( override val name: String, override val fallback: T, override val description: String?, - private val serializer: (T) -> String, - private val deserializer: (String) -> T?, + private val serializer: ((T) -> String)?, + private val deserializer: (String) -> T, ) : Key { private val namespace: KeyNamespace = this@KeyNamespace @@ -17,8 +17,8 @@ class SimpleKey internal constructor( namespace.add(this) } - fun serialize(value: T): String = serializer(value) - fun deserialize(value: String): T? = deserializer(value) + override fun serialize(value: T): String = serializer?.invoke(value) ?: value.toString() + override fun deserialize(value: String): T = deserializer(value) override fun compareTo(other: Key): Int = Key.comparator.compare(this, other) override fun equals(other: Any?): Boolean = (other as Key<*>?)?.let { Key.equals(this, it) } ?: false diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt index 6b63b3588..a42b38af4 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt @@ -29,8 +29,8 @@ internal class SimpleKeyBuilder( requireNotNull(name) { "Name is null" }, requireNotNull(fallback) { "Fallback is null" }, description, - requireNotNull(serializer) { "Serializer is null" }, - requireNotNull(deserializer) { "Deserializer is null" }, + serializer, + deserializer ?: Key.getDefaultDeserializer(type), ) override fun asAnonymousFacet(): SimpleKey.AnonymousBuilderFacet { From 4197e33de9db341cd6976a666239330aed0c9ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Thu, 23 Nov 2023 13:58:51 +0100 Subject: [PATCH 70/77] Fix weird kotlin bug and fix typetokens --- .../anvil/core/config/AbstractKeyBuilder.kt | 6 +- .../anvil/core/config/DefaultSerialization.kt | 3 +- .../org/anvilpowered/anvil/core/config/Key.kt | 78 +++++++------------ .../anvil/core/config/ListKeyBuilder.kt | 13 +++- .../anvil/core/config/MapKeyBuilder.kt | 22 +++--- .../anvil/core/config/SimpleKeyBuilder.kt | 2 +- .../anvil/core/config/TypeTokens.kt | 7 +- 7 files changed, 60 insertions(+), 71 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt index 9307d64d7..62cdf8b4e 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt @@ -20,12 +20,10 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken -internal abstract class AbstractKeyBuilder< +abstract class AbstractKeyBuilder< T : Any, K : Key, B : Key.FacetedBuilder, AF : Key.BuilderFacet, NF : Key.NamedBuilderFacet, - >( - val type: TypeToken, -) : Key.FacetedBuilder { + >(val type: TypeToken) : Key.FacetedBuilder { var name: String? = null var fallback: T? = null diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt index 2155864de..1050833a3 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt @@ -21,6 +21,7 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken internal fun Key.Companion.getDefaultDeserializer(type: TypeToken): (String) -> T { + println("getDefaultDeserializer($type)") @Suppress("UNCHECKED_CAST") return when (type.type) { String::class.java -> { it -> it } @@ -29,6 +30,6 @@ internal fun Key.Companion.getDefaultDeserializer(type: TypeToken): (Stri Float::class.java -> { it: String -> it.toFloatOrNull() } Double::class.java -> { it: String -> it.toDoubleOrNull() } Boolean::class.java -> { it: String -> it.toBooleanStrictOrNull() } - else -> throw IllegalArgumentException("There is no default parser for $type") + else -> throw IllegalArgumentException("There is no default parser for ${type.type}") } as (String) -> T } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index ed686c786..2992f2944 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -19,11 +19,10 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken -import kotlin.experimental.ExperimentalTypeInference import kotlin.properties.PropertyDelegateProvider import kotlin.properties.ReadOnlyProperty -sealed interface Key : Comparable> { +interface Key : Comparable> { val type: TypeToken @@ -106,63 +105,34 @@ sealed interface Key : Comparable> { companion object { - @JvmStatic val comparator: Comparator> = Comparator.comparing, String> { it.name } .thenComparing(Comparator.comparing { it.type.type.typeName }) - @JvmStatic fun equals(a: Key<*>?, b: Key<*>?): Boolean { if (a === b) return true if (a == null || b == null) return false return a.name == b.name && a.type.type.typeName == b.type.type.typeName } - @JvmStatic fun hashCode(key: Key<*>): Int { var result = key.type.hashCode() result = 31 * result + key.name.hashCode() return result } - @JvmStatic - fun simpleBuilder(type: TypeToken): SimpleKey.FacetedBuilder = SimpleKeyBuilder(type) - - @JvmStatic - fun listBuilder( - type: TypeToken>, - elementType: TypeToken, - ): ListKey.FacetedBuilder = ListKeyBuilder(type, elementType) - - @JvmStatic - fun mapBuilder( - type: TypeToken>, - keyType: TypeToken, - valueType: TypeToken, - ): MapKey.FacetedBuilder = MapKeyBuilder(type, keyType, valueType) - - inline fun simpleBuilder() = - simpleBuilder(object : TypeToken() {}) - - inline fun listBuilder() = - listBuilder(object : TypeToken>() {}, object : TypeToken() {}) - - inline fun mapBuilder() = - mapBuilder(object : TypeToken>() {}, object : TypeToken() {}, object : TypeToken() {}) - context(KeyNamespace) - @OptIn(ExperimentalTypeInference::class) - inline fun buildSimple(@BuilderInference block: SimpleKey.NamedBuilderFacet.() -> Unit): SimpleKey { - val builder = simpleBuilder() + inline fun buildSimple(type: TypeToken, block: SimpleKey.NamedBuilderFacet.() -> Unit): SimpleKey { + val builder = SimpleKeyBuilder(type) builder.asNamedFacet().block() return builder.build() } context(KeyNamespace) - @OptIn(ExperimentalTypeInference::class) - inline fun buildingSimple( - @BuilderInference crossinline block: SimpleKey.AnonymousBuilderFacet.() -> Unit, + inline fun buildingSimple( + type: TypeToken, + crossinline block: SimpleKey.AnonymousBuilderFacet.() -> Unit, ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> - val builder = simpleBuilder() + val builder = SimpleKeyBuilder(type) builder.name(property.name) builder.asAnonymousFacet().block() val key = builder.build() @@ -170,19 +140,21 @@ sealed interface Key : Comparable> { } context(KeyNamespace) - @OptIn(ExperimentalTypeInference::class) - inline fun buildList(@BuilderInference block: ListKey.NamedBuilderFacet.() -> Unit): ListKey { - val builder = listBuilder() + inline fun buildList( + elementType: TypeToken, + block: ListKey.NamedBuilderFacet.() -> Unit, + ): ListKey { + val builder = ListKeyBuilder(elementType) builder.asNamedFacet().block() return builder.build() } context(KeyNamespace) - @OptIn(ExperimentalTypeInference::class) - inline fun buildingList( - @BuilderInference crossinline block: ListKey.AnonymousBuilderFacet.() -> Unit, + inline fun buildingList( + elementType: TypeToken, + crossinline block: ListKey.AnonymousBuilderFacet.() -> Unit, ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> - val builder = listBuilder() + val builder = ListKeyBuilder(elementType) builder.name(property.name) builder.asAnonymousFacet().block() val key = builder.build() @@ -190,19 +162,23 @@ sealed interface Key : Comparable> { } context(KeyNamespace) - @OptIn(ExperimentalTypeInference::class) - inline fun buildMap(@BuilderInference block: MapKey.NamedBuilderFacet.() -> Unit): MapKey { - val builder = mapBuilder() + inline fun buildMap( + keyType: TypeToken, + valueType: TypeToken, + block: MapKey.NamedBuilderFacet.() -> Unit, + ): MapKey { + val builder = MapKeyBuilder(keyType, valueType) builder.asNamedFacet().block() return builder.build() } context(KeyNamespace) - @OptIn(ExperimentalTypeInference::class) - inline fun buildingMap( - @BuilderInference crossinline block: MapKey.AnonymousBuilderFacet.() -> Unit, + inline fun buildingMap( + keyType: TypeToken, + valueType: TypeToken, + crossinline block: MapKey.AnonymousBuilderFacet.() -> Unit, ): PropertyDelegateProvider>> = PropertyDelegateProvider { _, property -> - val builder = mapBuilder() + val builder = MapKeyBuilder(keyType, valueType) builder.name(property.name) builder.asAnonymousFacet().block() val key = builder.build() diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt index 300eee72e..10dc33d67 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt @@ -1,12 +1,13 @@ package org.anvilpowered.anvil.core.config +import io.leangen.geantyref.TypeFactory import io.leangen.geantyref.TypeToken -internal class ListKeyBuilder( - type: TypeToken>, +class ListKeyBuilder( private val elementType: TypeToken, -) : AbstractKeyBuilder, ListKey, ListKey.FacetedBuilder, ListKey.AnonymousBuilderFacet, ListKey.NamedBuilderFacet>(type), - ListKey.FacetedBuilder { +) : AbstractKeyBuilder, ListKey, ListKey.FacetedBuilder, ListKey.AnonymousBuilderFacet, ListKey.NamedBuilderFacet>( + createListTypeToken(elementType), +), ListKey.FacetedBuilder { private var elementSerializer: ((E) -> String)? = null private var elementDeserializer: ((String) -> E)? = null @@ -87,3 +88,7 @@ internal class ListKeyBuilder( } } } + +@Suppress("UNCHECKED_CAST") +private fun createListTypeToken(elementType: TypeToken): TypeToken> = + TypeToken.get(TypeFactory.parameterizedClass(List::class.java, elementType.type)) as TypeToken> diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt index 8e8e4b2c3..cbe400d99 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt @@ -1,15 +1,15 @@ package org.anvilpowered.anvil.core.config +import io.leangen.geantyref.TypeFactory import io.leangen.geantyref.TypeToken -internal class MapKeyBuilder( - type: TypeToken>, - private val keyType: TypeToken, - private val valueType: TypeToken, +class MapKeyBuilder( + private val mapKeyType: TypeToken, + private val mapValueType: TypeToken, ) : AbstractKeyBuilder< Map, MapKey, MapKey.FacetedBuilder, MapKey.AnonymousBuilderFacet, MapKey.NamedBuilderFacet, - >(type), MapKey.FacetedBuilder { + >(createMapTypeToken(mapKeyType, mapValueType)), MapKey.FacetedBuilder { private var keySerializer: ((K) -> String)? = null private var keyDeserializer: ((String) -> K)? = null @@ -44,12 +44,12 @@ internal class MapKeyBuilder( requireNotNull(name) { "Name is null" }, requireNotNull(fallback) { "Fallback is null" }, description, - keyType, + mapKeyType, keySerializer, - keyDeserializer ?: Key.getDefaultDeserializer(keyType), - valueType, + keyDeserializer ?: Key.getDefaultDeserializer(mapKeyType), + mapValueType, valueSerializer, - valueDeserializer ?: Key.getDefaultDeserializer(valueType), + valueDeserializer ?: Key.getDefaultDeserializer(mapValueType), ) override fun asAnonymousFacet(): MapKey.AnonymousBuilderFacet { @@ -125,3 +125,7 @@ internal class MapKeyBuilder( } } } + +@Suppress("UNCHECKED_CAST") +private fun createMapTypeToken(mapKeyType: TypeToken, mapValueType: TypeToken): TypeToken> = + TypeToken.get(TypeFactory.parameterizedClass(Map::class.java, mapKeyType.type, mapValueType.type)) as TypeToken> diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt index a42b38af4..caea0e9d5 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt @@ -2,7 +2,7 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken -internal class SimpleKeyBuilder( +class SimpleKeyBuilder( type: TypeToken, ) : AbstractKeyBuilder, SimpleKey.FacetedBuilder, SimpleKey.AnonymousBuilderFacet, SimpleKey.NamedBuilderFacet>( type, diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt index 6e8b4f9d3..8366fc67b 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt @@ -19,11 +19,16 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken +import net.kyori.adventure.text.Component import java.time.ZoneId -object TypeTokens { +@Suppress("PropertyName") +open class TypeTokens { val BOOLEAN: TypeToken = TypeToken.get(Boolean::class.java) val INTEGER: TypeToken = TypeToken.get(Int::class.java) val STRING: TypeToken = TypeToken.get(String::class.java) + val COMPONENT: TypeToken = TypeToken.get(Component::class.java) val ZONE_ID: TypeToken = TypeToken.get(ZoneId::class.java) + + companion object : TypeTokens() } From af08bc121b23a7a1ae1719dd5a0f54150774afba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Thu, 23 Nov 2023 14:50:49 +0100 Subject: [PATCH 71/77] Small fixes, add prefix to EnvironmentRegistry --- .../anvil/core/config/DefaultSerialization.kt | 1 - .../anvil/core/config/EnvironmentRegistry.kt | 16 ++++++++++------ gradle/libs.versions.toml | 4 ++-- .../anvil/velocity/AnvilVelocityApi.kt | 5 +++++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt index 1050833a3..31ae0b37b 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt @@ -21,7 +21,6 @@ package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken internal fun Key.Companion.getDefaultDeserializer(type: TypeToken): (String) -> T { - println("getDefaultDeserializer($type)") @Suppress("UNCHECKED_CAST") return when (type.type) { String::class.java -> { it -> it } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt index b0b91dbbc..b467cce8a 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt @@ -21,24 +21,28 @@ package org.anvilpowered.anvil.core.config /** * A [Registry] implementation that checks environment variables. */ -class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { +class EnvironmentRegistry(private val prefix: String, private val delegate: Registry? = null) : Registry { + + private val Key<*>.environmentName: String + get() = prefix + "_" + name + override fun getDefault(key: Key): T { return delegate?.getDefault(key) ?: key.fallback } override fun getStrict(key: SimpleKey): T? { - val value = System.getenv(key.name) ?: return delegate?.getStrict(key) + val value = System.getenv(key.environmentName) ?: return delegate?.getStrict(key) return key.deserialize(value) } override fun getStrict(key: ListKey): List? { - val value = System.getenv(key.name) ?: return delegate?.getStrict(key) + val value = System.getenv(key.environmentName) ?: return delegate?.getStrict(key) val tokens = value.split(",") return tokens.map { key.deserializeElement(it) } } override fun getStrict(key: ListKey, index: Int): E? { - val value = System.getenv(key.name) ?: return delegate?.getStrict(key, index) + val value = System.getenv(key.environmentName) ?: return delegate?.getStrict(key, index) val tokens = value.split(",") return key.deserializeElement(tokens[index]) } @@ -50,7 +54,7 @@ class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { } override fun getStrict(key: MapKey): Map? { - val value = System.getenv(key.name) ?: return delegate?.getStrict(key) + val value = System.getenv(key.environmentName) ?: return delegate?.getStrict(key) val tokens = value.split(",") return tokens.associate { token -> val (k, v) = token.split("=") @@ -61,7 +65,7 @@ class EnvironmentRegistry(private val delegate: Registry? = null) : Registry { } override fun getStrict(key: MapKey, mapKey: K): V? { - val value = System.getenv(key.name) ?: return delegate?.getStrict(key, mapKey) + val value = System.getenv(key.environmentName) ?: return delegate?.getStrict(key, mapKey) return value.split(",").asSequence() .map { it.split("=").zipWithNext().single() } .firstOrNull { (k, _) -> diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index db598ffe6..793e6dcbd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] configurate = "4.1.2" -kotlin = "1.9.20" +kotlin = "1.9.21" ktor = "2.3.0" log4j = "2.20.0" @@ -21,7 +21,7 @@ koin = "io.insert-koin:koin-core:3.5.2-RC1" kotest = "io.kotest:kotest-runner-junit5-jvm:5.5.4" kotlinx-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0" kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.0" -kotlinx-serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0" +kotlinx-serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.1" ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" } ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" } ktor-serialization = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index 0184f4433..be9b5cf6b 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -23,9 +23,11 @@ import com.velocitypowered.api.plugin.PluginContainer import com.velocitypowered.api.plugin.PluginDescription import com.velocitypowered.api.proxy.ProxyServer import org.anvilpowered.anvil.core.AnvilApi +import org.anvilpowered.anvil.core.command.CommandExecutor import org.anvilpowered.anvil.core.platform.PluginManager import org.anvilpowered.anvil.core.platform.Server import org.anvilpowered.anvil.core.user.PlayerService +import org.anvilpowered.anvil.velocity.command.VelocityCommandExecutor import org.anvilpowered.anvil.velocity.platform.VelocityPluginManager import org.anvilpowered.anvil.velocity.platform.VelocityServer import org.anvilpowered.anvil.velocity.user.VelocityPlayerService @@ -111,6 +113,9 @@ fun AnvilApi.Companion.createVelocity(injector: Injector): AnvilVelocityApi { singleOf(::VelocityPlayerService) { bind() } + singleOf(::VelocityCommandExecutor) { + bind() + } } return object : AnvilVelocityApi { From 90f4cc8f19fa41ea666a6783080958f076cb458f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Fri, 24 Nov 2023 11:35:50 +0100 Subject: [PATCH 72/77] Add MutableRepository.getOrCreate --- .../org/anvilpowered/anvil/core/db/MutableRepository.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt index 278feb824..c62358353 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt @@ -21,4 +21,10 @@ package org.anvilpowered.anvil.core.db interface MutableRepository> : Repository { suspend fun create(item: C): E + suspend fun getOrCreate(item: C): GetOrCreateResult + + data class GetOrCreateResult( + val entity: E, + val created: Boolean, + ) } From c8d3ed0676cc29efb2124c83f9ee901958064d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 25 Nov 2023 12:56:06 +0100 Subject: [PATCH 73/77] Rename getOrCreate -> put --- .../org/anvilpowered/anvil/core/db/MutableRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt index c62358353..7ef3c4c56 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt @@ -21,9 +21,9 @@ package org.anvilpowered.anvil.core.db interface MutableRepository> : Repository { suspend fun create(item: C): E - suspend fun getOrCreate(item: C): GetOrCreateResult + suspend fun put(item: C): PutResult - data class GetOrCreateResult( + data class PutResult( val entity: E, val created: Boolean, ) From f15857c1913021f76ab64fc086c81fbdf70e672d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Mon, 27 Nov 2023 14:27:42 +0100 Subject: [PATCH 74/77] Update copyright headers --- .../anvilpowered/anvil/plugin/AnvilPlugin.kt | 18 ++++++++++++++++++ .../anvil/plugin/PluginMessages.kt | 18 ++++++++++++++++++ .../plugin/command/AnvilCommandFactory.kt | 18 ++++++++++++++++++ .../anvil/plugin/command/common/Help.kt | 18 ++++++++++++++++++ .../plugin/command/gameuser/GameUserCommand.kt | 18 ++++++++++++++++++ .../anvil/plugin/command/gameuser/Info.kt | 18 ++++++++++++++++++ .../anvil/plugin/command/plugin/Info.kt | 18 ++++++++++++++++++ .../anvil/plugin/command/plugin/List.kt | 18 ++++++++++++++++++ .../command/plugin/PluginCommandFactory.kt | 18 ++++++++++++++++++ .../anvil/plugin/AnvilPaperPlugin.kt | 18 ++++++++++++++++++ .../anvil/plugin/AnvilPaperPluginBootstrap.kt | 18 ++++++++++++++++++ .../anvil/plugin/AnvilSpongePlugin.kt | 18 ++++++++++++++++++ .../anvil/plugin/AnvilSpongePluginBootstrap.kt | 18 ++++++++++++++++++ .../anvil/plugin/AnvilVelocityPlugin.kt | 2 +- .../plugin/AnvilVelocityPluginBootstrap.kt | 2 +- .../org/anvilpowered/anvil/core/AnvilApi.kt | 2 +- .../anvilpowered/anvil/core/PlatformType.kt | 2 +- .../anvil/core/command/CommandExecutor.kt | 2 +- .../anvil/core/command/CommandSource.kt | 2 +- .../anvil/core/command/LoggingExecutor.kt | 2 +- .../anvil/core/command/PlayerCommandScope.kt | 2 +- .../anvil/core/config/AbstractKeyBuilder.kt | 2 +- .../anvil/core/config/DefaultSerialization.kt | 2 +- .../anvil/core/config/EnvironmentRegistry.kt | 2 +- .../org/anvilpowered/anvil/core/config/Key.kt | 2 +- .../anvil/core/config/KeyBuilderDsl.kt | 2 +- .../anvil/core/config/KeyNamespace.kt | 2 +- .../anvilpowered/anvil/core/config/ListKey.kt | 18 ++++++++++++++++++ .../anvil/core/config/ListKeyBuilder.kt | 18 ++++++++++++++++++ .../anvilpowered/anvil/core/config/MapKey.kt | 18 ++++++++++++++++++ .../anvil/core/config/MapKeyBuilder.kt | 18 ++++++++++++++++++ .../anvilpowered/anvil/core/config/Registry.kt | 2 +- .../anvil/core/config/SimpleKey.kt | 18 ++++++++++++++++++ .../anvil/core/config/SimpleKeyBuilder.kt | 18 ++++++++++++++++++ .../anvil/core/config/TypeTokens.kt | 2 +- .../anvilpowered/anvil/core/db/DomainEntity.kt | 2 +- .../anvil/core/db/MutableRepository.kt | 5 ++--- .../anvilpowered/anvil/core/db/Pagination.kt | 2 +- .../anvilpowered/anvil/core/db/Repository.kt | 2 +- .../anvil/core/entity/AnvilTable.kt | 18 ++++++++++++++++++ .../anvil/core/platform/Platform.kt | 2 +- .../anvilpowered/anvil/core/platform/Plugin.kt | 18 ++++++++++++++++++ .../anvil/core/platform/PluginManager.kt | 2 +- .../anvilpowered/anvil/core/platform/Server.kt | 18 ++++++++++++++++++ .../anvil/core/user/ArgumentExtensions.kt | 2 +- .../org/anvilpowered/anvil/core/user/Player.kt | 2 +- .../anvil/core/user/PlayerService.kt | 2 +- .../anvilpowered/anvil/core/user/Subject.kt | 2 +- .../anvilpowered/anvil/paper/AnvilPaperApi.kt | 2 +- .../paper/command/AnvilPaperCommandSource.kt | 18 ++++++++++++++++++ .../paper/command/PaperCommandExecutor.kt | 2 +- .../anvil/paper/command/PaperCustomCommand.kt | 18 ++++++++++++++++++ .../paper/command/PaperSourceConverter.kt | 2 +- .../anvil/paper/platform/PaperPlatform.kt | 18 ++++++++++++++++++ .../anvil/paper/platform/PaperPlugin.kt | 18 ++++++++++++++++++ .../anvil/paper/platform/PaperPluginManager.kt | 18 ++++++++++++++++++ .../anvil/paper/platform/PaperServer.kt | 18 ++++++++++++++++++ .../anvil/paper/user/AnvilPaperPlayer.kt | 18 ++++++++++++++++++ .../anvil/paper/user/AnvilPaperSubject.kt | 18 ++++++++++++++++++ .../anvil/paper/user/PaperPlayerService.kt | 2 +- .../anvil/sponge/AnvilSpongeApi.kt | 2 +- .../anvil/sponge/platform/SpongePlatform.kt | 18 ++++++++++++++++++ .../anvil/sponge/platform/SpongePlugin.kt | 18 ++++++++++++++++++ .../sponge/platform/SpongePluginManager.kt | 18 ++++++++++++++++++ .../anvil/sponge/platform/SpongeServer.kt | 18 ++++++++++++++++++ .../sponge/user/AnvilSpongeCommandSource.kt | 2 +- .../anvil/sponge/user/AnvilSpongePlayer.kt | 18 ++++++++++++++++++ .../anvil/sponge/user/AnvilSpongeSubject.kt | 18 ++++++++++++++++++ .../anvil/sponge/user/SpongeCommandExecutor.kt | 2 +- .../anvil/sponge/user/SpongePlayerService.kt | 2 +- .../anvil/velocity/AnvilVelocityApi.kt | 2 +- .../command/AnvilVelocityCommandSource.kt | 2 +- .../command/VelocityCommandExecutor.kt | 2 +- .../velocity/command/VelocityCustomCommand.kt | 18 ++++++++++++++++++ .../command/VelocitySourceConverter.kt | 2 +- .../velocity/platform/VelocityPlatform.kt | 2 +- .../anvil/velocity/platform/VelocityPlugin.kt | 2 +- .../velocity/platform/VelocityPluginManager.kt | 2 +- .../anvil/velocity/platform/VelocityServer.kt | 18 ++++++++++++++++++ .../anvil/velocity/user/AnvilVelocityPlayer.kt | 18 ++++++++++++++++++ .../velocity/user/AnvilVelocitySubject.kt | 18 ++++++++++++++++++ .../anvil/velocity/user/ArgumentExtensions.kt | 2 +- .../velocity/user/VelocityPlayerService.kt | 2 +- 83 files changed, 764 insertions(+), 45 deletions(-) diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt index 959a8f926..22615d1dc 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPlugin.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin import org.anvilpowered.anvil.core.command.CommandSource diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt index 2bb92fac7..0b2272c45 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/PluginMessages.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin import net.kyori.adventure.text.Component diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandFactory.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandFactory.kt index c674f1398..5cf8845c0 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandFactory.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/AnvilCommandFactory.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin.command import net.kyori.adventure.text.Component diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt index 845ea6057..e6781b5ce 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/common/Help.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin.command.common import net.kyori.adventure.text.Component diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt index e24c32f65..dc0ae8c07 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/GameUserCommand.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin.command.gameuser import net.kyori.adventure.text.Component diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt index 3f5d8349f..5352e2dad 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/gameuser/Info.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin.command.gameuser import net.kyori.adventure.text.Component diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt index aaf81f513..bf24c7393 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/Info.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin.command.plugin import net.kyori.adventure.text.Component diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt index 35677b367..8faa88d29 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/List.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin.command.plugin import net.kyori.adventure.text.Component diff --git a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandFactory.kt b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandFactory.kt index 71e8dd0f2..c2f128b27 100644 --- a/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandFactory.kt +++ b/app/plugin/core/src/main/kotlin/org/anvilpowered/anvil/plugin/command/plugin/PluginCommandFactory.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin.command.plugin import net.kyori.adventure.text.Component diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt index ba74cb523..43565b616 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + @file:Suppress("UnstableApiUsage") package org.anvilpowered.anvil.plugin diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt index 74c958b78..b0309d107 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPluginBootstrap.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + @file:Suppress("UnstableApiUsage") package org.anvilpowered.anvil.plugin diff --git a/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt index 525627820..a7bac6560 100644 --- a/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt +++ b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePlugin.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin import com.mojang.brigadier.tree.LiteralCommandNode diff --git a/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt index 2a64c9659..96f07fe9f 100644 --- a/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt +++ b/app/plugin/sponge/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilSpongePluginBootstrap.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.plugin import com.google.inject.Inject diff --git a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt index d3dca197f..4ea01f456 100644 --- a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt +++ b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPlugin.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt index 462523db1..1333bc05e 100644 --- a/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt +++ b/app/plugin/velocity/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilVelocityPluginBootstrap.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt index caa3da840..9147b6b46 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/AnvilApi.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/PlatformType.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/PlatformType.kt index 54465eefb..adff97806 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/PlatformType.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/PlatformType.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt index 5feb82f96..79c25b597 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt index d4ca756b2..fe5997dd1 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandSource.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/LoggingExecutor.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/LoggingExecutor.kt index 54a206f6a..912720e16 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/LoggingExecutor.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/LoggingExecutor.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt index 38277166c..37adbe207 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/PlayerCommandScope.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt index 62cdf8b4e..245af8790 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/AbstractKeyBuilder.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt index 31ae0b37b..40a5c1d35 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/DefaultSerialization.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt index b467cce8a..aa24b8eb8 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/EnvironmentRegistry.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt index 2992f2944..c9ef9a2e8 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Key.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderDsl.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderDsl.kt index e5482e386..da06d4dde 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderDsl.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyBuilderDsl.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt index 23992789a..8e5156b99 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/KeyNamespace.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt index abfda394c..4d9e00c05 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt index 10dc33d67..c891d8f80 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeFactory diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt index 9eb47ef26..e090c4e30 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt index cbe400d99..7bd4d618a 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeFactory diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt index 41ec45d48..57813f155 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/Registry.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt index 820833ef5..f97371a12 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt index caea0e9d5..14915139f 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.config import io.leangen.geantyref.TypeToken diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt index 8366fc67b..55c1c6c9b 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/TypeTokens.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/DomainEntity.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/DomainEntity.kt index 214fa3c53..88dc49102 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/DomainEntity.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/DomainEntity.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt index 7ef3c4c56..4596dcacb 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/MutableRepository.kt @@ -1,7 +1,6 @@ /* - * Kontour - SourceGrade.org - * Copyright (C) 2023 Alexander Städing - * Copyright (C) 2023 Contributors + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Pagination.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Pagination.kt index b1343bef2..08e59e9eb 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Pagination.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Pagination.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt index bda8ef0da..7a2923e6d 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/db/Repository.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt index 548146750..f630fffe4 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/entity/AnvilTable.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.entity import org.jetbrains.exposed.dao.id.UUIDTable diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt index 0901fcfdb..d991d3bc0 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Platform.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Plugin.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Plugin.kt index dfdfbbe57..acbba67b5 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Plugin.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Plugin.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.platform interface Plugin { diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/PluginManager.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/PluginManager.kt index cb99c103d..1a71d5d4a 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/PluginManager.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/PluginManager.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt index c8faabe21..8218f9354 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/platform/Server.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.core.platform import net.kyori.adventure.audience.Audience diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/ArgumentExtensions.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/ArgumentExtensions.kt index 3ca11fa6c..daa4c2712 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/ArgumentExtensions.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/ArgumentExtensions.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt index ca2d0d0d9..a0dece50a 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Player.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt index 77d9653f4..70ad3578e 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/PlayerService.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt index 5ceb72228..5b8222a34 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/user/Subject.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt index 56711de5d..3b8acacd8 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/AnvilPaperApi.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/AnvilPaperCommandSource.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/AnvilPaperCommandSource.kt index c5323df1a..cf26c51aa 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/AnvilPaperCommandSource.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/AnvilPaperCommandSource.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.paper.command import io.papermc.paper.command.brigadier.CommandSourceStack diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt index 506d43571..f2d5346b2 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCommandExecutor.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt index 6ba847f1a..0ca69e529 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperCustomCommand.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.paper.command import net.kyori.adventure.text.Component diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperSourceConverter.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperSourceConverter.kt index 216762414..9c4dd0c61 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperSourceConverter.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/command/PaperSourceConverter.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt index 6e87cba8c..43cd2ac04 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlatform.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.paper.platform import org.anvilpowered.anvil.core.platform.Platform diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlugin.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlugin.kt index 9c15fac8b..5602fda17 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlugin.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPlugin.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.paper.platform import org.anvilpowered.anvil.core.platform.Plugin diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPluginManager.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPluginManager.kt index eb0244799..4692ca4db 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPluginManager.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperPluginManager.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.paper.platform import org.anvilpowered.anvil.core.platform.Plugin diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt index 1f6c1c502..b539d775d 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/platform/PaperServer.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.paper.platform import net.kyori.adventure.audience.Audience diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt index d024880e6..cb4acc7df 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperPlayer.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.paper.user import net.kyori.adventure.audience.Audience diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperSubject.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperSubject.kt index 3929c2c0a..5aeff22e7 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperSubject.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/AnvilPaperSubject.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.paper.user import org.anvilpowered.anvil.core.user.Subject diff --git a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt index 924ef8dcd..77679adfb 100644 --- a/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt +++ b/paper/src/main/kotlin/org/anvilpowered/anvil/paper/user/PaperPlayerService.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt index e90b1a4f0..075c4e5e6 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/AnvilSpongeApi.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt index b1382052c..344b32365 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlatform.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.sponge.platform import org.anvilpowered.anvil.core.platform.Platform diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlugin.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlugin.kt index 0ab42290f..a356845ee 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlugin.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePlugin.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.sponge.platform import org.anvilpowered.anvil.core.platform.Plugin diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePluginManager.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePluginManager.kt index 20e23bf17..db39ee2ed 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePluginManager.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongePluginManager.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.sponge.platform import org.anvilpowered.anvil.core.platform.Plugin diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt index c86bf85cc..c8508f259 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/platform/SpongeServer.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.sponge.platform import net.kyori.adventure.audience.Audience diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeCommandSource.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeCommandSource.kt index c3e2af3a0..f63e14b9b 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeCommandSource.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeCommandSource.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt index 80aeebe9d..f7b95ca20 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongePlayer.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.sponge.user import net.kyori.adventure.text.Component diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt index 359b8932b..54c0d6c9a 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/AnvilSpongeSubject.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.sponge.user import org.anvilpowered.anvil.core.user.Subject diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt index f114c21a4..1e950366e 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongeCommandExecutor.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt index 5e0c9daeb..689e884b3 100644 --- a/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt +++ b/sponge/src/main/kotlin/org/anvilpowered/anvil/sponge/user/SpongePlayerService.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index be9b5cf6b..66a287d99 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt index 327287310..2895f80d4 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/AnvilVelocityCommandSource.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt index 6f66e4c44..8e42a2a3b 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCommandExecutor.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt index c01700c2b..edb51127f 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocityCustomCommand.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.velocity.command import com.velocitypowered.api.proxy.ProxyServer diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocitySourceConverter.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocitySourceConverter.kt index 6b8081a33..288ffcd79 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocitySourceConverter.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/command/VelocitySourceConverter.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt index 842386068..cb3ac6188 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlatform.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlugin.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlugin.kt index 0ae806175..01b518049 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlugin.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPlugin.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPluginManager.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPluginManager.kt index e2fab5327..78e509873 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPluginManager.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityPluginManager.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt index 2d2472e9f..4d0a6b04f 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/platform/VelocityServer.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.velocity.platform import com.velocitypowered.api.proxy.ProxyServer diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt index eb43dc546..7156aeb58 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocityPlayer.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.velocity.user import net.kyori.adventure.audience.Audience diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt index 8ac21996c..f3766a51f 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/AnvilVelocitySubject.kt @@ -1,3 +1,21 @@ +/* + * Anvil - AnvilPowered.org + * Copyright (C) 2019-2024 Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package org.anvilpowered.anvil.velocity.user import com.velocitypowered.api.permission.Tristate diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/ArgumentExtensions.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/ArgumentExtensions.kt index 120787b0b..4ed22b5b7 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/ArgumentExtensions.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/ArgumentExtensions.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt index 9a6a36f10..6900fc9f7 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/user/VelocityPlayerService.kt @@ -1,6 +1,6 @@ /* * Anvil - AnvilPowered.org - * Copyright (C) 2019-2023 Contributors + * Copyright (C) 2019-2024 Contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by From 71e6019caabeecdb0803b94443f42b5dafc12034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 9 Dec 2023 21:38:52 +0100 Subject: [PATCH 75/77] Add anvil nexus instance and fix paper dependency --- gradle/libs.versions.toml | 2 +- settings.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 793e6dcbd..d7124d28e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,7 +34,7 @@ ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" } logging-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } logging-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } -paper = "io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT" +paper = "io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT" redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.6.1" sponge = "org.spongepowered:spongeapi:8.1.0" velocity = "com.velocitypowered:velocity-api:3.2.0-SNAPSHOT" diff --git a/settings.gradle.kts b/settings.gradle.kts index d3f6a0886..92380f763 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ dependencyResolutionManagement { // repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { - mavenLocal() + maven("https://nexus.anvilpowered.org/repository/maven-public/") mavenCentral() maven("https://oss.sonatype.org/content/repositories/snapshots/") maven("https://libraries.minecraft.net") From 23d6fc9fe1e4163209ff5bc0b4a212812db844b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 9 Dec 2023 21:39:00 +0100 Subject: [PATCH 76/77] Fix style and compilation error --- .../anvilpowered/anvil/plugin/AnvilPaperPlugin.kt | 2 +- .../anvil/core/command/CommandExecutor.kt | 2 -- .../org/anvilpowered/anvil/core/config/ListKey.kt | 12 ++++++++---- .../anvilpowered/anvil/core/config/ListKeyBuilder.kt | 3 ++- .../org/anvilpowered/anvil/core/config/MapKey.kt | 12 ++++++++---- .../anvilpowered/anvil/core/config/MapKeyBuilder.kt | 3 ++- .../org/anvilpowered/anvil/core/config/SimpleKey.kt | 12 ++++++++---- .../anvil/core/config/SimpleKeyBuilder.kt | 3 ++- .../anvilpowered/anvil/velocity/AnvilVelocityApi.kt | 3 --- 9 files changed, 31 insertions(+), 21 deletions(-) diff --git a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt index 43565b616..709ca5eea 100644 --- a/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt +++ b/app/plugin/paper/src/main/kotlin/org/anvilpowered/anvil/plugin/AnvilPaperPlugin.kt @@ -27,7 +27,7 @@ import org.bukkit.plugin.Plugin class AnvilPaperPlugin(private val plugin: AnvilPlugin) { fun registerCommands(bootstrap: Plugin, event: ServerResourcesLoadEvent) { plugin.registerCommands { command -> - event.commands.register(bootstrap, command.toPaper()) + event.commands.register(bootstrap.pluginMeta, command.toPaper()) } } } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt index 79c25b597..b9e474c51 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/command/CommandExecutor.kt @@ -18,8 +18,6 @@ package org.anvilpowered.anvil.core.command -import org.apache.logging.log4j.Logger - interface CommandExecutor { suspend fun execute(source: CommandSource, command: String): Boolean diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt index 4d9e00c05..09169b865 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKey.kt @@ -77,18 +77,22 @@ class ListKey internal constructor( } @KeyBuilderDsl - interface AnonymousBuilderFacet : BuilderFacet>, + interface AnonymousBuilderFacet : + BuilderFacet>, Key.BuilderFacet, ListKey, AnonymousBuilderFacet> @KeyBuilderDsl - interface NamedBuilderFacet : BuilderFacet>, + interface NamedBuilderFacet : + BuilderFacet>, Key.NamedBuilderFacet, ListKey, NamedBuilderFacet> @KeyBuilderDsl - interface Builder : BuilderFacet>, + interface Builder : + BuilderFacet>, Key.Builder, ListKey, Builder> @KeyBuilderDsl - interface FacetedBuilder : BuilderFacet>, + interface FacetedBuilder : + BuilderFacet>, Key.FacetedBuilder, ListKey, FacetedBuilder, AnonymousBuilderFacet, NamedBuilderFacet> } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt index c891d8f80..486c6a11c 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/ListKeyBuilder.kt @@ -25,7 +25,8 @@ class ListKeyBuilder( private val elementType: TypeToken, ) : AbstractKeyBuilder, ListKey, ListKey.FacetedBuilder, ListKey.AnonymousBuilderFacet, ListKey.NamedBuilderFacet>( createListTypeToken(elementType), -), ListKey.FacetedBuilder { +), + ListKey.FacetedBuilder { private var elementSerializer: ((E) -> String)? = null private var elementDeserializer: ((String) -> E)? = null diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt index e090c4e30..5410ccba0 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKey.kt @@ -103,18 +103,22 @@ class MapKey internal constructor( } @KeyBuilderDsl - interface AnonymousBuilderFacet : BuilderFacet>, + interface AnonymousBuilderFacet : + BuilderFacet>, Key.BuilderFacet, MapKey, AnonymousBuilderFacet> @KeyBuilderDsl - interface NamedBuilderFacet : BuilderFacet>, + interface NamedBuilderFacet : + BuilderFacet>, Key.NamedBuilderFacet, MapKey, NamedBuilderFacet> @KeyBuilderDsl - interface Builder : BuilderFacet>, + interface Builder : + BuilderFacet>, Key.Builder, MapKey, Builder> @KeyBuilderDsl - interface FacetedBuilder : BuilderFacet>, + interface FacetedBuilder : + BuilderFacet>, Key.FacetedBuilder, MapKey, FacetedBuilder, AnonymousBuilderFacet, NamedBuilderFacet> } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt index 7bd4d618a..8d5a44908 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/MapKeyBuilder.kt @@ -27,7 +27,8 @@ class MapKeyBuilder( ) : AbstractKeyBuilder< Map, MapKey, MapKey.FacetedBuilder, MapKey.AnonymousBuilderFacet, MapKey.NamedBuilderFacet, - >(createMapTypeToken(mapKeyType, mapValueType)), MapKey.FacetedBuilder { + >(createMapTypeToken(mapKeyType, mapValueType)), + MapKey.FacetedBuilder { private var keySerializer: ((K) -> String)? = null private var keyDeserializer: ((String) -> K)? = null diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt index f97371a12..d000a32e8 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKey.kt @@ -66,18 +66,22 @@ class SimpleKey internal constructor( } @KeyBuilderDsl - interface AnonymousBuilderFacet : BuilderFacet>, + interface AnonymousBuilderFacet : + BuilderFacet>, Key.BuilderFacet, AnonymousBuilderFacet> @KeyBuilderDsl - interface NamedBuilderFacet : BuilderFacet>, + interface NamedBuilderFacet : + BuilderFacet>, Key.NamedBuilderFacet, NamedBuilderFacet> @KeyBuilderDsl - interface Builder : BuilderFacet>, + interface Builder : + BuilderFacet>, Key.Builder, Builder> @KeyBuilderDsl - interface FacetedBuilder : BuilderFacet>, + interface FacetedBuilder : + BuilderFacet>, Key.FacetedBuilder, FacetedBuilder, AnonymousBuilderFacet, NamedBuilderFacet> } diff --git a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt index 14915139f..dbd6aa2e5 100644 --- a/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt +++ b/core/src/main/kotlin/org/anvilpowered/anvil/core/config/SimpleKeyBuilder.kt @@ -24,7 +24,8 @@ class SimpleKeyBuilder( type: TypeToken, ) : AbstractKeyBuilder, SimpleKey.FacetedBuilder, SimpleKey.AnonymousBuilderFacet, SimpleKey.NamedBuilderFacet>( type, -), SimpleKey.FacetedBuilder { +), + SimpleKey.FacetedBuilder { private var serializer: ((T) -> String)? = null private var deserializer: ((String) -> T)? = null diff --git a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt index 66a287d99..0c17808c0 100644 --- a/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt +++ b/velocity/src/main/kotlin/org/anvilpowered/anvil/velocity/AnvilVelocityApi.kt @@ -33,12 +33,9 @@ import org.anvilpowered.anvil.velocity.platform.VelocityServer import org.anvilpowered.anvil.velocity.user.VelocityPlayerService import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger -import org.koin.core.context.KoinContext -import org.koin.core.context.startKoin import org.koin.core.module.Module import org.koin.core.module.dsl.bind import org.koin.core.module.dsl.singleOf -import org.koin.dsl.koinApplication import org.koin.dsl.module /** From 34d1e5bcc32c41f75d82cfeda751534071b973f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20St=C3=A4ding?= Date: Sat, 9 Dec 2023 21:57:23 +0100 Subject: [PATCH 77/77] Update paper artifact version to -brigadier- --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d7124d28e..2ba5048b7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,7 +34,7 @@ ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = ktor-server-status-pages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" } logging-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } logging-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } -paper = "io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT" +paper = "io.papermc.paper:paper-api:1.20.2-brigadier-SNAPSHOT" redux = "org.reduxkotlin:redux-kotlin-threadsafe:0.6.1" sponge = "org.spongepowered:spongeapi:8.1.0" velocity = "com.velocitypowered:velocity-api:3.2.0-SNAPSHOT"