From aa5c411e5ae473319ddf53642b176396056b677b Mon Sep 17 00:00:00 2001 From: Christopher White <18whitechristop@gmail.com> Date: Sun, 14 Jul 2024 15:22:48 -0700 Subject: [PATCH] Begin multiversion support Signed-off-by: Christopher White <18whitechristop@gmail.com> --- core/pom.xml | 239 ++++++++ .../java/dev/pgm/community/Community.java | 5 +- .../dev/pgm/community/CommunityCommand.java | 70 +-- .../dev/pgm/community/CommunityConfig.java | 0 .../pgm/community/CommunityPermissions.java | 0 .../assistance/AssistanceRequest.java | 0 .../assistance/PlayerHelpRequest.java | 0 .../dev/pgm/community/assistance/Report.java | 0 .../community/assistance/ReportConfig.java | 0 .../commands/PlayerHelpCommand.java | 0 .../assistance/commands/ReportCommands.java | 63 +- .../assistance/feature/AssistanceFeature.java | 0 .../feature/AssistanceFeatureBase.java | 0 .../feature/types/NoDBAssistanceFeature.java | 0 .../feature/types/SQLAssistanceFeature.java | 8 +- .../assistance/menu/ReportCategory.java | 0 .../assistance/menu/ReportCategoryMenu.java | 0 .../assistance/menu/ReportReason.java | 0 .../assistance/menu/ReportReasonsMenu.java | 0 .../assistance/services/AssistanceQuery.java | 17 + .../services/SQLAssistanceService.java | 0 .../community/broadcast/BroadcastCommand.java | 0 .../community/broadcast/BroadcastConfig.java | 7 +- .../community/broadcast/BroadcastFeature.java | 0 .../management/ChatManagementCommand.java | 5 +- .../chat/management/ChatManagementConfig.java | 5 +- .../management/ChatManagementFeature.java | 40 +- .../chat/network/NetworkChatConfig.java | 0 .../chat/network/NetworkChatFeature.java | 6 +- .../chat/network/NetworkChatMessage.java | 0 .../commands/CommunityPluginCommand.java | 22 +- .../community/commands/ContainerCommand.java | 7 +- .../pgm/community/commands/FlightCommand.java | 31 +- .../community/commands/GamemodeCommand.java | 33 +- .../community/commands/ServerInfoCommand.java | 11 +- .../pgm/community/commands/StaffCommand.java | 28 +- .../pgm/community/commands/SudoCommand.java | 17 +- .../community/commands/VanishedCommand.java | 20 +- .../commands/graph/CommunityCommandGraph.java | 4 - .../injectors/CommandAudienceProvider.java | 0 .../commands/player/TargetPlayer.java | 0 .../commands/providers/GameModeParser.java | 0 .../providers/TargetPlayerParser.java | 0 .../community/database/DatabaseConfig.java | 0 .../database/DatabaseConnection.java | 29 +- .../dev/pgm/community/database/Query.java | 0 .../dev/pgm/community/database/Savable.java | 0 .../pgm/community/events/CommunityEvent.java | 0 .../events/PlayerHelpRequestEvent.java | 0 .../events/PlayerPunishmentEvent.java | 0 .../community/events/PlayerReportEvent.java | 0 .../events/UserProfileLoadEvent.java | 0 .../dev/pgm/community/feature/Feature.java | 0 .../pgm/community/feature/FeatureBase.java | 0 .../pgm/community/feature/FeatureManager.java | 9 - .../dev/pgm/community/feature/SQLFeature.java | 0 .../pgm/community/feature/SQLFeatureBase.java | 0 .../feature/config/FeatureConfig.java | 0 .../feature/config/FeatureConfigImpl.java | 0 .../pgm/community/freeze/FreezeCommand.java | 16 +- .../pgm/community/freeze/FreezeConfig.java | 0 .../pgm/community/freeze/FreezeFeature.java | 22 +- .../pgm/community/freeze/FreezeManager.java | 34 +- .../friends/FriendRequestStatus.java | 0 .../dev/pgm/community/friends/Friendship.java | 0 .../community/friends/FriendshipConfig.java | 0 .../friends/commands/FriendshipCommand.java | 481 +++++++++++++++ .../friends/feature/FriendshipFeature.java | 0 .../feature/FriendshipFeatureBase.java | 27 +- .../friends/feature/PGMFriendIntegration.java | 0 .../feature/types/SQLFriendshipFeature.java | 168 ++++++ .../friends/services/FriendshipQuery.java | 22 + .../services/SQLFriendshipService.java | 72 ++- .../pgm/community/info/InfoCommandConfig.java | 7 +- .../pgm/community/info/InfoCommandData.java | 0 .../community/info/InfoCommandsFeature.java | 12 +- .../menu/CommunityInventoryProvider.java | 0 .../pgm/community/menu/MapSelectionMenu.java | 96 ++- .../java/dev/pgm/community/menu/MenuItem.java | 0 .../pgm/community/menu/PageableInventory.java | 0 .../menu/PlayerSelectionProvider.java | 3 +- .../pgm/community/menu/StaticMenuItem.java | 0 .../moderation/ModerationConfig.java | 0 .../moderation/commands/BanCommand.java | 100 ++-- .../moderation/commands/KickCommand.java | 30 +- .../moderation/commands/MuteCommand.java | 139 +++++ .../commands/PunishmentCommand.java | 191 +++--- .../moderation/commands/ToolCommand.java | 0 .../moderation/commands/WarnCommand.java | 24 +- .../moderation/feature/ModerationFeature.java | 0 .../feature/ModerationFeatureBase.java | 152 +++-- .../feature/PGMPunishmentIntegration.java | 20 +- .../feature/types/SQLModerationFeature.java | 243 ++++---- .../punishments/NetworkPunishment.java | 0 .../moderation/punishments/Punishment.java | 64 +- .../punishments/PunishmentFormats.java | 84 ++- .../punishments/PunishmentType.java | 0 .../punishments/types/BanPunishment.java | 0 .../types/ExpirablePunishment.java | 0 .../punishments/types/KickPunishment.java | 0 .../punishments/types/MutePunishment.java | 59 +- .../punishments/types/TempBanPunishment.java | 0 .../types/UsernameBanPunishment.java | 0 .../punishments/types/WarnPunishment.java | 0 .../moderation/services/ModerationQuery.java | 14 +- .../services/SQLModerationService.java | 218 ++++--- .../moderation/tools/ModerationTools.java | 0 .../pgm/community/moderation/tools/Tool.java | 0 .../community/moderation/tools/ToolBase.java | 0 .../moderation/tools/buttons/ToolButton.java | 0 .../tools/buttons/ToolButtonBase.java | 0 .../tools/buttons/TranslatableToolButton.java | 0 .../tools/buttons/types/GamemodeButton.java | 15 +- .../buttons/types/NightVisionButton.java | 7 +- .../types/ObserverVisibilityButton.java | 3 +- .../tools/buttons/types/SpeedButton.java | 0 .../tools/menu/ModerationToolsMenu.java | 41 +- .../tools/menu/TeleportTargetMenu.java | 27 +- .../moderation/tools/types/LookupSign.java | 3 +- .../tools/types/ModerationMenuTool.java | 0 .../moderation/tools/types/TeleportHook.java | 23 +- .../dev/pgm/community/motd/MotdConfig.java | 7 +- .../dev/pgm/community/motd/MotdFeature.java | 0 .../dev/pgm/community/mutations/Mutation.java | 0 .../pgm/community/mutations/MutationBase.java | 0 .../community/mutations/MutationConfig.java | 0 .../pgm/community/mutations/MutationType.java | 31 +- .../mutations/commands/MutationCommands.java | 53 +- .../mutations/feature/MutationFeature.java | 29 +- .../mutations/menu/MutationOptionsMenu.java | 23 +- .../mutations/menu/MutationToggleMenu.java | 25 +- .../options/MutationBooleanOption.java | 0 .../mutations/options/MutationListOption.java | 0 .../mutations/options/MutationOption.java | 0 .../options/MutationRangeOption.java | 0 .../mutations/types/BowMutation.java | 0 .../mutations/types/KitMutationBase.java | 9 +- .../types/ScheduledMutationBase.java | 9 +- .../types/arrows/EnderpearlMutation.java | 5 +- .../types/arrows/FireballBowMutation.java | 5 +- .../types/arrows/TNTBowMutation.java | 5 +- .../types/arrows/WebSlingersMutation.java | 61 +- .../types/gameplay/BlitzMutation.java | 22 +- .../types/gameplay/GhostMutation.java | 5 +- .../types/gameplay/RageMutation.java | 0 .../mutations/types/items/BreadMutation.java | 224 ++++--- .../types/items/CannonSuppliesMutation.java | 36 +- .../types/items/ExplosionMutation.java | 140 +++-- .../types/items/FireworkMutation.java | 33 +- .../types/items/GrapplingHookMutation.java | 35 +- .../types/items/NoSpawnKitMutation.java | 27 +- .../mutations/types/items/PotionMutation.java | 7 +- .../mapdev/ProximityEffectsMutation.java | 62 +- .../types/mechanics/BlindMutation.java | 0 .../types/mechanics/DoubleJumpMutation.java | 5 +- .../types/mechanics/FlyMutation.java | 60 +- .../types/mechanics/FriendlyFireMutation.java | 8 +- .../types/mechanics/HealthMutation.java | 0 .../types/mechanics/KnockbackMutation.java | 2 +- .../types/mechanics/MobMutation.java | 27 +- .../types/world/BlockDecayMutation.java | 17 +- .../mutations/types/world/StormMutation.java | 0 .../types/world/TNTRainMutation.java | 7 +- .../dev/pgm/community/network/Channels.java | 0 .../pgm/community/network/NetworkConfig.java | 3 +- .../network/feature/NetworkFeature.java | 4 +- .../network/feature/NetworkFeatureBase.java | 0 .../network/subs/NetworkSubscriber.java | 0 .../subs/types/AssistanceSubscriber.java | 0 .../network/subs/types/ChatSubscriber.java | 0 .../subs/types/PunishmentSubscriber.java | 0 .../types/RefreshPunishmentSubscriber.java | 5 +- .../network/types/RedisNetworkFeature.java | 53 +- .../network/updates/NetworkUpdate.java | 0 .../network/updates/NetworkUpdateBase.java | 0 .../network/updates/types/AssistUpdate.java | 0 .../network/updates/types/ChatUpdate.java | 0 .../updates/types/PunishmentUpdate.java | 0 .../types/RefreshPunishmentUpdate.java | 0 .../java/dev/pgm/community/nick/Nick.java | 0 .../dev/pgm/community/nick/NickConfig.java | 0 .../java/dev/pgm/community/nick/NickImpl.java | 0 .../community/nick/commands/NickCommands.java | 431 ++++++++++++++ .../community/nick/data/NickSelection.java | 0 .../community/nick/feature/NickFeature.java | 0 .../nick/feature/NickFeatureBase.java | 113 ++-- .../nick/feature/PGMNickIntegration.java | 7 +- .../nick/feature/types/SQLNickFeature.java | 79 +++ .../community/nick/services/NickQuery.java | 0 .../nick/services/SQLNickService.java | 56 +- .../pgm/community/nick/skin/SkinCache.java | 40 +- .../pgm/community/nick/skin/SkinManager.java | 2 +- .../dev/pgm/community/party/MapParty.java | 0 .../dev/pgm/community/party/MapPartyBase.java | 0 .../pgm/community/party/MapPartyCommands.java | 45 +- .../pgm/community/party/MapPartyConfig.java | 0 .../pgm/community/party/MapPartyMessages.java | 36 +- .../community/party/MapPartyStatusType.java | 0 .../dev/pgm/community/party/MapPartyType.java | 2 +- .../broadcasts/MapPartyBroadcastManager.java | 25 +- .../party/events/MapPartyCreateEvent.java | 0 .../party/events/MapPartyEndEvent.java | 0 .../community/party/events/MapPartyEvent.java | 0 .../party/events/MapPartyRestartEvent.java | 0 .../party/events/MapPartyStartEvent.java | 0 .../party/exceptions/MapPartyException.java | 0 .../exceptions/MapPartySetupException.java | 0 .../party/feature/MapPartyFeature.java | 50 +- .../community/party/hosts/MapPartyHosts.java | 9 +- .../party/menu/MapPartyMainMenu.java | 104 ++-- .../community/party/menu/MapPartyMenu.java | 32 +- .../party/menu/MapPartyTypeSelectionMenu.java | 11 +- .../party/menu/hosts/HostAddMenu.java | 0 .../community/party/menu/hosts/HostMenu.java | 39 +- .../community/party/menu/maps/MapAddMenu.java | 136 ++--- .../community/party/menu/maps/MapMenu.java | 43 +- .../menu/modifiers/MapPartyModifierMenu.java | 18 +- .../menu/settings/MapPartySettingsMenu.java | 192 +++--- .../party/presets/MapPartyPreset.java | 0 .../party/settings/MapPartySettings.java | 46 ++ .../party/settings/PartyBooleanSetting.java | 0 .../party/settings/PartySetting.java | 0 .../party/types/CustomPoolParty.java | 31 +- .../party/types/RegularPoolParty.java | 0 .../java/dev/pgm/community/polls/Poll.java | 0 .../dev/pgm/community/polls/PollBuilder.java | 15 +- .../pgm/community/polls/PollComponents.java | 240 ++++---- .../dev/pgm/community/polls/PollConfig.java | 0 .../pgm/community/polls/PollEditAlerter.java | 9 +- .../pgm/community/polls/PollThreshold.java | 0 .../commands/PollManagementCommands.java | 42 +- .../polls/commands/PollVoteCommands.java | 0 .../pgm/community/polls/ending/EndAction.java | 0 .../polls/ending/types/CommandEndAction.java | 0 .../ending/types/KickPlayerEndAction.java | 28 +- .../polls/ending/types/MapEndAction.java | 18 +- .../polls/ending/types/MutationEndAction.java | 0 .../polls/ending/types/NullEndAction.java | 5 +- .../community/polls/events/PollEndEvent.java | 0 .../pgm/community/polls/events/PollEvent.java | 0 .../polls/events/PollStartEvent.java | 0 .../community/polls/events/PollVoteEvent.java | 0 .../community/polls/feature/PollFeature.java | 5 +- .../MultiChoiceResponseConverter.java | 0 .../SingleChoiceResponseConverter.java | 0 .../pgm/community/polls/types/BasicPoll.java | 0 .../polls/types/MultiChoicePoll.java | 0 .../polls/types/SingleChoicePoll.java | 9 +- .../pgm/community/requests/MapCooldown.java | 0 .../pgm/community/requests/RequestConfig.java | 0 .../community/requests/RequestProfile.java | 0 .../community/requests/SponsorRequest.java | 0 .../requests/commands/RequestCommands.java | 124 ++-- .../commands/sponsor/SponsorCommands.java | 0 .../commands/sponsor/TokenCommands.java | 0 .../supervotes/SuperVoteAdminCommands.java | 0 .../commands/supervotes/SuperVoteCommand.java | 0 .../requests/feature/RequestFeature.java | 0 .../requests/feature/RequestFeatureBase.java | 5 +- .../feature/SponsorVotingBookCreator.java | 0 .../feature/types/NoDBRequestFeature.java | 16 +- .../feature/types/SQLRequestFeature.java | 0 .../community/requests/menu/SponsorMenu.java | 24 +- .../requests/services/RequestQuery.java | 0 .../requests/services/SQLRequestService.java | 0 .../supervotes/SuperVoteComponents.java | 0 .../requests/supervotes/SuperVoteManager.java | 0 .../dev/pgm/community/sessions/Session.java | 0 .../pgm/community/sessions/SessionQuery.java | 0 .../sessions/VanishedSessionListener.java | 11 +- .../sessions/feature/SessionFeature.java | 0 .../sessions/feature/SessionFeatureBase.java | 0 .../feature/types/SQLSessionFeature.java | 0 .../sessions/services/SQLSessionService.java | 62 +- .../sessions/services/SessionDataQuery.java | 14 +- .../community/teleports/TeleportCommand.java | 6 +- .../community/teleports/TeleportConfig.java | 0 .../community/teleports/TeleportFeature.java | 22 +- .../teleports/TeleportFeatureBase.java | 32 +- .../dev/pgm/community/users/UserProfile.java | 0 .../pgm/community/users/UserProfileImpl.java | 0 .../users/UserProfileWithSessionCallback.java | 0 .../dev/pgm/community/users/UsersConfig.java | 0 .../users/commands/UserInfoCommands.java | 460 +++++++++++++++ .../community/users/feature/UsersFeature.java | 18 +- .../users/feature/UsersFeatureBase.java | 0 .../users/feature/types/NoDBUsersFeature.java | 9 +- .../users/feature/types/SQLUsersFeature.java | 89 ++- .../listeners/UserProfileLoginListener.java | 32 +- .../users/services/AddressHistoryService.java | 309 ++++++++++ .../users/services/AddressQuery.java | 58 +- .../users/services/SQLUserService.java | 83 ++- .../community/users/services/UserQuery.java | 0 .../pgm/community/utils/BroadcastUtils.java | 89 ++- .../dev/pgm/community/utils/CenterUtils.java | 9 +- .../pgm/community/utils/CommandAudience.java | 0 .../dev/pgm/community/utils/ImportUtils.java | 0 .../dev/pgm/community/utils/MessageUtils.java | 0 .../dev/pgm/community/utils/NameUtils.java | 0 .../dev/pgm/community/utils/NetworkUtils.java | 12 +- .../dev/pgm/community/utils/PGMUtils.java | 0 .../utils/PaginatedComponentResults.java | 0 .../dev/pgm/community/utils/SkullUtils.java | 4 +- .../java/dev/pgm/community/utils/Sounds.java | 4 + .../pgm/community/utils/VisibilityUtils.java | 0 .../dev/pgm/community/utils/WebUtils.java | 148 +++-- .../community/utils/gson/GsonProvider.java | 4 +- .../utils/gson/types/DurationConverter.java | 0 .../utils/platform/CommunityMaterials.java | 34 ++ .../pgm/community/utils/ranks/RankUtils.java | 0 .../community/utils/ranks/RanksConfig.java | 0 {src => core/src}/main/resources/config.yml | 0 {src => core/src}/main/resources/plugin.yml | 0 platform/platform-all/pom.xml | 68 +++ platform/platform-modern/pom.xml | 52 ++ .../platform/modern/ModernEffects.java | 19 + .../platform/modern/ModernEvents.java | 16 + .../platform/modern/ModernPlayers.java | 23 + platform/platform-sportpaper/pom.xml | 27 + .../platform/sportpaper/SpEffects.java | 27 + .../platform/sportpaper/SpEvents.java | 17 + .../platform/sportpaper/SpPlayers.java | 27 + platform/pom.xml | 16 + pom.xml | 108 +--- .../assistance/services/AssistanceQuery.java | 19 - .../friends/commands/FriendshipCommand.java | 551 ------------------ .../feature/types/SQLFriendshipFeature.java | 198 ------- .../friends/services/FriendshipQuery.java | 24 - .../dev/pgm/community/mobs/MobCommand.java | 240 -------- .../dev/pgm/community/mobs/MobConfig.java | 13 - .../dev/pgm/community/mobs/MobFeature.java | 217 ------- .../moderation/commands/MuteCommand.java | 164 ------ .../community/nick/commands/NickCommands.java | 519 ----------------- .../nick/feature/types/SQLNickFeature.java | 91 --- .../party/settings/MapPartySettings.java | 47 -- .../users/commands/UserInfoCommands.java | 524 ----------------- .../users/services/AddressHistoryService.java | 330 ----------- util/pom.xml | 11 + .../community/platform/CommunityEffects.java | 16 + .../community/platform/CommunityEvents.java | 13 + .../community/platform/CommunityPlayers.java | 16 + .../pgm/community/platform/Reflections.java | 11 + 342 files changed, 5171 insertions(+), 5966 deletions(-) create mode 100644 core/pom.xml rename {src => core/src}/main/java/dev/pgm/community/Community.java (95%) rename {src => core/src}/main/java/dev/pgm/community/CommunityCommand.java (85%) rename {src => core/src}/main/java/dev/pgm/community/CommunityConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/CommunityPermissions.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/AssistanceRequest.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/PlayerHelpRequest.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/Report.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/ReportConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/commands/PlayerHelpCommand.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/commands/ReportCommands.java (77%) rename {src => core/src}/main/java/dev/pgm/community/assistance/feature/AssistanceFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/feature/AssistanceFeatureBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/feature/types/NoDBAssistanceFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/feature/types/SQLAssistanceFeature.java (90%) rename {src => core/src}/main/java/dev/pgm/community/assistance/menu/ReportCategory.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/menu/ReportCategoryMenu.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/menu/ReportReason.java (100%) rename {src => core/src}/main/java/dev/pgm/community/assistance/menu/ReportReasonsMenu.java (100%) create mode 100644 core/src/main/java/dev/pgm/community/assistance/services/AssistanceQuery.java rename {src => core/src}/main/java/dev/pgm/community/assistance/services/SQLAssistanceService.java (100%) rename {src => core/src}/main/java/dev/pgm/community/broadcast/BroadcastCommand.java (100%) rename {src => core/src}/main/java/dev/pgm/community/broadcast/BroadcastConfig.java (90%) rename {src => core/src}/main/java/dev/pgm/community/broadcast/BroadcastFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/chat/management/ChatManagementCommand.java (93%) rename {src => core/src}/main/java/dev/pgm/community/chat/management/ChatManagementConfig.java (92%) rename {src => core/src}/main/java/dev/pgm/community/chat/management/ChatManagementFeature.java (88%) rename {src => core/src}/main/java/dev/pgm/community/chat/network/NetworkChatConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/chat/network/NetworkChatFeature.java (93%) rename {src => core/src}/main/java/dev/pgm/community/chat/network/NetworkChatMessage.java (100%) rename {src => core/src}/main/java/dev/pgm/community/commands/CommunityPluginCommand.java (77%) rename {src => core/src}/main/java/dev/pgm/community/commands/ContainerCommand.java (96%) rename {src => core/src}/main/java/dev/pgm/community/commands/FlightCommand.java (68%) rename {src => core/src}/main/java/dev/pgm/community/commands/GamemodeCommand.java (73%) rename {src => core/src}/main/java/dev/pgm/community/commands/ServerInfoCommand.java (78%) rename {src => core/src}/main/java/dev/pgm/community/commands/StaffCommand.java (59%) rename {src => core/src}/main/java/dev/pgm/community/commands/SudoCommand.java (80%) rename {src => core/src}/main/java/dev/pgm/community/commands/VanishedCommand.java (74%) rename {src => core/src}/main/java/dev/pgm/community/commands/graph/CommunityCommandGraph.java (98%) rename {src => core/src}/main/java/dev/pgm/community/commands/injectors/CommandAudienceProvider.java (100%) rename {src => core/src}/main/java/dev/pgm/community/commands/player/TargetPlayer.java (100%) rename {src => core/src}/main/java/dev/pgm/community/commands/providers/GameModeParser.java (100%) rename {src => core/src}/main/java/dev/pgm/community/commands/providers/TargetPlayerParser.java (100%) rename {src => core/src}/main/java/dev/pgm/community/database/DatabaseConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/database/DatabaseConnection.java (51%) rename {src => core/src}/main/java/dev/pgm/community/database/Query.java (100%) rename {src => core/src}/main/java/dev/pgm/community/database/Savable.java (100%) rename {src => core/src}/main/java/dev/pgm/community/events/CommunityEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/events/PlayerHelpRequestEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/events/PlayerPunishmentEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/events/PlayerReportEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/events/UserProfileLoadEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/feature/Feature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/feature/FeatureBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/feature/FeatureManager.java (96%) rename {src => core/src}/main/java/dev/pgm/community/feature/SQLFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/feature/SQLFeatureBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/feature/config/FeatureConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/feature/config/FeatureConfigImpl.java (100%) rename {src => core/src}/main/java/dev/pgm/community/freeze/FreezeCommand.java (84%) rename {src => core/src}/main/java/dev/pgm/community/freeze/FreezeConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/freeze/FreezeFeature.java (94%) rename {src => core/src}/main/java/dev/pgm/community/freeze/FreezeManager.java (88%) rename {src => core/src}/main/java/dev/pgm/community/friends/FriendRequestStatus.java (100%) rename {src => core/src}/main/java/dev/pgm/community/friends/Friendship.java (100%) rename {src => core/src}/main/java/dev/pgm/community/friends/FriendshipConfig.java (100%) create mode 100644 core/src/main/java/dev/pgm/community/friends/commands/FriendshipCommand.java rename {src => core/src}/main/java/dev/pgm/community/friends/feature/FriendshipFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/friends/feature/FriendshipFeatureBase.java (76%) rename {src => core/src}/main/java/dev/pgm/community/friends/feature/PGMFriendIntegration.java (100%) create mode 100644 core/src/main/java/dev/pgm/community/friends/feature/types/SQLFriendshipFeature.java create mode 100644 core/src/main/java/dev/pgm/community/friends/services/FriendshipQuery.java rename {src => core/src}/main/java/dev/pgm/community/friends/services/SQLFriendshipService.java (69%) rename {src => core/src}/main/java/dev/pgm/community/info/InfoCommandConfig.java (75%) rename {src => core/src}/main/java/dev/pgm/community/info/InfoCommandData.java (100%) rename {src => core/src}/main/java/dev/pgm/community/info/InfoCommandsFeature.java (81%) rename {src => core/src}/main/java/dev/pgm/community/menu/CommunityInventoryProvider.java (100%) rename {src => core/src}/main/java/dev/pgm/community/menu/MapSelectionMenu.java (77%) rename {src => core/src}/main/java/dev/pgm/community/menu/MenuItem.java (100%) rename {src => core/src}/main/java/dev/pgm/community/menu/PageableInventory.java (100%) rename {src => core/src}/main/java/dev/pgm/community/menu/PlayerSelectionProvider.java (97%) rename {src => core/src}/main/java/dev/pgm/community/menu/StaticMenuItem.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/ModerationConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/commands/BanCommand.java (58%) rename {src => core/src}/main/java/dev/pgm/community/moderation/commands/KickCommand.java (74%) create mode 100644 core/src/main/java/dev/pgm/community/moderation/commands/MuteCommand.java rename {src => core/src}/main/java/dev/pgm/community/moderation/commands/PunishmentCommand.java (61%) rename {src => core/src}/main/java/dev/pgm/community/moderation/commands/ToolCommand.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/commands/WarnCommand.java (72%) rename {src => core/src}/main/java/dev/pgm/community/moderation/feature/ModerationFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/feature/ModerationFeatureBase.java (76%) rename {src => core/src}/main/java/dev/pgm/community/moderation/feature/PGMPunishmentIntegration.java (83%) rename {src => core/src}/main/java/dev/pgm/community/moderation/feature/types/SQLModerationFeature.java (52%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/NetworkPunishment.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/Punishment.java (86%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/PunishmentFormats.java (57%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/PunishmentType.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/types/BanPunishment.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/types/ExpirablePunishment.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/types/KickPunishment.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/types/MutePunishment.java (58%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/types/TempBanPunishment.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/types/UsernameBanPunishment.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/punishments/types/WarnPunishment.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/services/ModerationQuery.java (67%) rename {src => core/src}/main/java/dev/pgm/community/moderation/services/SQLModerationService.java (55%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/ModerationTools.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/Tool.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/ToolBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/buttons/ToolButton.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/buttons/ToolButtonBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/buttons/TranslatableToolButton.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/buttons/types/GamemodeButton.java (87%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/buttons/types/NightVisionButton.java (89%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/buttons/types/ObserverVisibilityButton.java (96%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/buttons/types/SpeedButton.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/menu/ModerationToolsMenu.java (70%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/menu/TeleportTargetMenu.java (76%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/types/LookupSign.java (92%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/types/ModerationMenuTool.java (100%) rename {src => core/src}/main/java/dev/pgm/community/moderation/tools/types/TeleportHook.java (87%) rename {src => core/src}/main/java/dev/pgm/community/motd/MotdConfig.java (79%) rename {src => core/src}/main/java/dev/pgm/community/motd/MotdFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/Mutation.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/MutationBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/MutationConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/MutationType.java (78%) rename {src => core/src}/main/java/dev/pgm/community/mutations/commands/MutationCommands.java (76%) rename {src => core/src}/main/java/dev/pgm/community/mutations/feature/MutationFeature.java (93%) rename {src => core/src}/main/java/dev/pgm/community/mutations/menu/MutationOptionsMenu.java (92%) rename {src => core/src}/main/java/dev/pgm/community/mutations/menu/MutationToggleMenu.java (73%) rename {src => core/src}/main/java/dev/pgm/community/mutations/options/MutationBooleanOption.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/options/MutationListOption.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/options/MutationOption.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/options/MutationRangeOption.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/BowMutation.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/KitMutationBase.java (93%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/ScheduledMutationBase.java (82%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/arrows/EnderpearlMutation.java (89%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/arrows/FireballBowMutation.java (90%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/arrows/TNTBowMutation.java (89%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/arrows/WebSlingersMutation.java (75%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/gameplay/BlitzMutation.java (76%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/gameplay/GhostMutation.java (90%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/gameplay/RageMutation.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/items/BreadMutation.java (62%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/items/CannonSuppliesMutation.java (69%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/items/ExplosionMutation.java (78%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/items/FireworkMutation.java (89%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/items/GrapplingHookMutation.java (81%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/items/NoSpawnKitMutation.java (77%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/items/PotionMutation.java (94%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/mapdev/ProximityEffectsMutation.java (85%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/mechanics/BlindMutation.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/mechanics/DoubleJumpMutation.java (90%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/mechanics/FlyMutation.java (66%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/mechanics/FriendlyFireMutation.java (83%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/mechanics/HealthMutation.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/mechanics/KnockbackMutation.java (95%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/mechanics/MobMutation.java (87%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/world/BlockDecayMutation.java (89%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/world/StormMutation.java (100%) rename {src => core/src}/main/java/dev/pgm/community/mutations/types/world/TNTRainMutation.java (96%) rename {src => core/src}/main/java/dev/pgm/community/network/Channels.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/NetworkConfig.java (93%) rename {src => core/src}/main/java/dev/pgm/community/network/feature/NetworkFeature.java (93%) rename {src => core/src}/main/java/dev/pgm/community/network/feature/NetworkFeatureBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/subs/NetworkSubscriber.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/subs/types/AssistanceSubscriber.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/subs/types/ChatSubscriber.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/subs/types/PunishmentSubscriber.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/subs/types/RefreshPunishmentSubscriber.java (86%) rename {src => core/src}/main/java/dev/pgm/community/network/types/RedisNetworkFeature.java (66%) rename {src => core/src}/main/java/dev/pgm/community/network/updates/NetworkUpdate.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/updates/NetworkUpdateBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/updates/types/AssistUpdate.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/updates/types/ChatUpdate.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/updates/types/PunishmentUpdate.java (100%) rename {src => core/src}/main/java/dev/pgm/community/network/updates/types/RefreshPunishmentUpdate.java (100%) rename {src => core/src}/main/java/dev/pgm/community/nick/Nick.java (100%) rename {src => core/src}/main/java/dev/pgm/community/nick/NickConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/nick/NickImpl.java (100%) create mode 100644 core/src/main/java/dev/pgm/community/nick/commands/NickCommands.java rename {src => core/src}/main/java/dev/pgm/community/nick/data/NickSelection.java (100%) rename {src => core/src}/main/java/dev/pgm/community/nick/feature/NickFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/nick/feature/NickFeatureBase.java (66%) rename {src => core/src}/main/java/dev/pgm/community/nick/feature/PGMNickIntegration.java (89%) create mode 100644 core/src/main/java/dev/pgm/community/nick/feature/types/SQLNickFeature.java rename {src => core/src}/main/java/dev/pgm/community/nick/services/NickQuery.java (100%) rename {src => core/src}/main/java/dev/pgm/community/nick/services/SQLNickService.java (73%) rename {src => core/src}/main/java/dev/pgm/community/nick/skin/SkinCache.java (79%) rename {src => core/src}/main/java/dev/pgm/community/nick/skin/SkinManager.java (91%) rename {src => core/src}/main/java/dev/pgm/community/party/MapParty.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/MapPartyBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/MapPartyCommands.java (89%) rename {src => core/src}/main/java/dev/pgm/community/party/MapPartyConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/MapPartyMessages.java (87%) rename {src => core/src}/main/java/dev/pgm/community/party/MapPartyStatusType.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/MapPartyType.java (94%) rename {src => core/src}/main/java/dev/pgm/community/party/broadcasts/MapPartyBroadcastManager.java (91%) rename {src => core/src}/main/java/dev/pgm/community/party/events/MapPartyCreateEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/events/MapPartyEndEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/events/MapPartyEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/events/MapPartyRestartEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/events/MapPartyStartEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/exceptions/MapPartyException.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/exceptions/MapPartySetupException.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/feature/MapPartyFeature.java (93%) rename {src => core/src}/main/java/dev/pgm/community/party/hosts/MapPartyHosts.java (97%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/MapPartyMainMenu.java (74%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/MapPartyMenu.java (88%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/MapPartyTypeSelectionMenu.java (85%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/hosts/HostAddMenu.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/hosts/HostMenu.java (81%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/maps/MapAddMenu.java (67%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/maps/MapMenu.java (82%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/modifiers/MapPartyModifierMenu.java (84%) rename {src => core/src}/main/java/dev/pgm/community/party/menu/settings/MapPartySettingsMenu.java (51%) rename {src => core/src}/main/java/dev/pgm/community/party/presets/MapPartyPreset.java (100%) create mode 100644 core/src/main/java/dev/pgm/community/party/settings/MapPartySettings.java rename {src => core/src}/main/java/dev/pgm/community/party/settings/PartyBooleanSetting.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/settings/PartySetting.java (100%) rename {src => core/src}/main/java/dev/pgm/community/party/types/CustomPoolParty.java (85%) rename {src => core/src}/main/java/dev/pgm/community/party/types/RegularPoolParty.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/Poll.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/PollBuilder.java (95%) rename {src => core/src}/main/java/dev/pgm/community/polls/PollComponents.java (71%) rename {src => core/src}/main/java/dev/pgm/community/polls/PollConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/PollEditAlerter.java (93%) rename {src => core/src}/main/java/dev/pgm/community/polls/PollThreshold.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/commands/PollManagementCommands.java (80%) rename {src => core/src}/main/java/dev/pgm/community/polls/commands/PollVoteCommands.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/ending/EndAction.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/ending/types/CommandEndAction.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/ending/types/KickPlayerEndAction.java (80%) rename {src => core/src}/main/java/dev/pgm/community/polls/ending/types/MapEndAction.java (86%) rename {src => core/src}/main/java/dev/pgm/community/polls/ending/types/MutationEndAction.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/ending/types/NullEndAction.java (92%) rename {src => core/src}/main/java/dev/pgm/community/polls/events/PollEndEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/events/PollEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/events/PollStartEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/events/PollVoteEvent.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/feature/PollFeature.java (97%) rename {src => core/src}/main/java/dev/pgm/community/polls/response/MultiChoiceResponseConverter.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/response/SingleChoiceResponseConverter.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/types/BasicPoll.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/types/MultiChoicePoll.java (100%) rename {src => core/src}/main/java/dev/pgm/community/polls/types/SingleChoicePoll.java (93%) rename {src => core/src}/main/java/dev/pgm/community/requests/MapCooldown.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/RequestConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/RequestProfile.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/SponsorRequest.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/commands/RequestCommands.java (68%) rename {src => core/src}/main/java/dev/pgm/community/requests/commands/sponsor/SponsorCommands.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/commands/sponsor/TokenCommands.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/commands/supervotes/SuperVoteAdminCommands.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/commands/supervotes/SuperVoteCommand.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/feature/RequestFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/feature/RequestFeatureBase.java (99%) rename {src => core/src}/main/java/dev/pgm/community/requests/feature/SponsorVotingBookCreator.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/feature/types/NoDBRequestFeature.java (79%) rename {src => core/src}/main/java/dev/pgm/community/requests/feature/types/SQLRequestFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/menu/SponsorMenu.java (79%) rename {src => core/src}/main/java/dev/pgm/community/requests/services/RequestQuery.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/services/SQLRequestService.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/supervotes/SuperVoteComponents.java (100%) rename {src => core/src}/main/java/dev/pgm/community/requests/supervotes/SuperVoteManager.java (100%) rename {src => core/src}/main/java/dev/pgm/community/sessions/Session.java (100%) rename {src => core/src}/main/java/dev/pgm/community/sessions/SessionQuery.java (100%) rename {src => core/src}/main/java/dev/pgm/community/sessions/VanishedSessionListener.java (73%) rename {src => core/src}/main/java/dev/pgm/community/sessions/feature/SessionFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/sessions/feature/SessionFeatureBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/sessions/feature/types/SQLSessionFeature.java (100%) rename {src => core/src}/main/java/dev/pgm/community/sessions/services/SQLSessionService.java (71%) rename {src => core/src}/main/java/dev/pgm/community/sessions/services/SessionDataQuery.java (65%) rename {src => core/src}/main/java/dev/pgm/community/teleports/TeleportCommand.java (95%) rename {src => core/src}/main/java/dev/pgm/community/teleports/TeleportConfig.java (100%) rename {src => core/src}/main/java/dev/pgm/community/teleports/TeleportFeature.java (82%) rename {src => core/src}/main/java/dev/pgm/community/teleports/TeleportFeatureBase.java (70%) rename {src => core/src}/main/java/dev/pgm/community/users/UserProfile.java (100%) rename {src => core/src}/main/java/dev/pgm/community/users/UserProfileImpl.java (100%) rename {src => core/src}/main/java/dev/pgm/community/users/UserProfileWithSessionCallback.java (100%) rename {src => core/src}/main/java/dev/pgm/community/users/UsersConfig.java (100%) create mode 100644 core/src/main/java/dev/pgm/community/users/commands/UserInfoCommands.java rename {src => core/src}/main/java/dev/pgm/community/users/feature/UsersFeature.java (93%) rename {src => core/src}/main/java/dev/pgm/community/users/feature/UsersFeatureBase.java (100%) rename {src => core/src}/main/java/dev/pgm/community/users/feature/types/NoDBUsersFeature.java (91%) rename {src => core/src}/main/java/dev/pgm/community/users/feature/types/SQLUsersFeature.java (63%) rename {src => core/src}/main/java/dev/pgm/community/users/listeners/UserProfileLoginListener.java (59%) create mode 100644 core/src/main/java/dev/pgm/community/users/services/AddressHistoryService.java rename {src => core/src}/main/java/dev/pgm/community/users/services/AddressQuery.java (61%) rename {src => core/src}/main/java/dev/pgm/community/users/services/SQLUserService.java (61%) rename {src => core/src}/main/java/dev/pgm/community/users/services/UserQuery.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/BroadcastUtils.java (70%) rename {src => core/src}/main/java/dev/pgm/community/utils/CenterUtils.java (76%) rename {src => core/src}/main/java/dev/pgm/community/utils/CommandAudience.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/ImportUtils.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/MessageUtils.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/NameUtils.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/NetworkUtils.java (81%) rename {src => core/src}/main/java/dev/pgm/community/utils/PGMUtils.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/PaginatedComponentResults.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/SkullUtils.java (95%) rename {src => core/src}/main/java/dev/pgm/community/utils/Sounds.java (93%) rename {src => core/src}/main/java/dev/pgm/community/utils/VisibilityUtils.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/WebUtils.java (50%) rename {src => core/src}/main/java/dev/pgm/community/utils/gson/GsonProvider.java (68%) rename {src => core/src}/main/java/dev/pgm/community/utils/gson/types/DurationConverter.java (100%) create mode 100644 core/src/main/java/dev/pgm/community/utils/platform/CommunityMaterials.java rename {src => core/src}/main/java/dev/pgm/community/utils/ranks/RankUtils.java (100%) rename {src => core/src}/main/java/dev/pgm/community/utils/ranks/RanksConfig.java (100%) rename {src => core/src}/main/resources/config.yml (100%) rename {src => core/src}/main/resources/plugin.yml (100%) create mode 100644 platform/platform-all/pom.xml create mode 100644 platform/platform-modern/pom.xml create mode 100644 platform/platform-modern/src/main/java/dev/pgm/community/platform/modern/ModernEffects.java create mode 100644 platform/platform-modern/src/main/java/dev/pgm/community/platform/modern/ModernEvents.java create mode 100644 platform/platform-modern/src/main/java/dev/pgm/community/platform/modern/ModernPlayers.java create mode 100644 platform/platform-sportpaper/pom.xml create mode 100644 platform/platform-sportpaper/src/main/java/dev/pgm/community/platform/sportpaper/SpEffects.java create mode 100644 platform/platform-sportpaper/src/main/java/dev/pgm/community/platform/sportpaper/SpEvents.java create mode 100644 platform/platform-sportpaper/src/main/java/dev/pgm/community/platform/sportpaper/SpPlayers.java create mode 100644 platform/pom.xml delete mode 100644 src/main/java/dev/pgm/community/assistance/services/AssistanceQuery.java delete mode 100644 src/main/java/dev/pgm/community/friends/commands/FriendshipCommand.java delete mode 100644 src/main/java/dev/pgm/community/friends/feature/types/SQLFriendshipFeature.java delete mode 100644 src/main/java/dev/pgm/community/friends/services/FriendshipQuery.java delete mode 100644 src/main/java/dev/pgm/community/mobs/MobCommand.java delete mode 100644 src/main/java/dev/pgm/community/mobs/MobConfig.java delete mode 100644 src/main/java/dev/pgm/community/mobs/MobFeature.java delete mode 100644 src/main/java/dev/pgm/community/moderation/commands/MuteCommand.java delete mode 100644 src/main/java/dev/pgm/community/nick/commands/NickCommands.java delete mode 100644 src/main/java/dev/pgm/community/nick/feature/types/SQLNickFeature.java delete mode 100644 src/main/java/dev/pgm/community/party/settings/MapPartySettings.java delete mode 100644 src/main/java/dev/pgm/community/users/commands/UserInfoCommands.java delete mode 100644 src/main/java/dev/pgm/community/users/services/AddressHistoryService.java create mode 100644 util/pom.xml create mode 100644 util/src/main/java/dev/pgm/community/platform/CommunityEffects.java create mode 100644 util/src/main/java/dev/pgm/community/platform/CommunityEvents.java create mode 100644 util/src/main/java/dev/pgm/community/platform/CommunityPlayers.java create mode 100644 util/src/main/java/dev/pgm/community/platform/Reflections.java diff --git a/core/pom.xml b/core/pom.xml new file mode 100644 index 00000000..c990b45e --- /dev/null +++ b/core/pom.xml @@ -0,0 +1,239 @@ + + 4.0.0 + + dev.pgm + Community + 0.2-SNAPSHOT + + core + + + + dev.pgm + platform-all + 0.2-SNAPSHOT + runtime + + + + dev.pgm + util + 0.2-SNAPSHOT + + + + + dev.pgm.paper + paper-api + 1.8_1.21-SNAPSHOT + provided + + + + com.mojang + authlib + 6.0.54 + provided + + + + + co.aikar + idb-core + 1.0.0-SNAPSHOT + + + com.zaxxer + HikariCP + 2.4.1 + + + co.aikar + idb-bukkit + 1.0.0-SNAPSHOT + + + + + redis.clients + jedis + 3.5.1 + jar + compile + + + + + fr.minuskube.inv + smart-invs + 1.2.7 + + + + + tc.oc.occ + Environment + 1.0.0-SNAPSHOT + + + + + commons-lang + commons-lang + 2.6 + provided + + + + + Community + + + + ${basedir}/src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + + org.incendo + cloud-annotations + 2.0.0-rc.2 + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + false + true + + + net.kyori:*:* + co.aikar:* + tc.oc.pgm:util + redis.clients:jedis + org.apache.commons:commons-pool2 + fr.minuskube.inv:smart-invs + com.zaxxer:HikariCP + org.slf4j:* + + + + + *:* + + META-INF/** + + + + dev.pgm:platform-all:* + + ** + + + + dev.pgm:util:* + + ** + + + + + + + package + + shade + + + + + + + + pl.project13.maven + git-commit-id-plugin + 4.0.0 + + + + revision + + + + + false + false + + + + + + com.diffplug.spotless + spotless-maven-plugin + 2.43.0 + + origin/dev + + + + 2.47.0 + + true + + + + + + + check + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.2.0 + + false + true + + + + + maven-antrun-plugin + 3.1.0 + + + jar + package + + + + + + + run + + + + + + + diff --git a/src/main/java/dev/pgm/community/Community.java b/core/src/main/java/dev/pgm/community/Community.java similarity index 95% rename from src/main/java/dev/pgm/community/Community.java rename to core/src/main/java/dev/pgm/community/Community.java index 7c805784..c9ca4ada 100644 --- a/src/main/java/dev/pgm/community/Community.java +++ b/core/src/main/java/dev/pgm/community/Community.java @@ -126,8 +126,7 @@ public void callEvent(CommunityEvent event) { // REMOVE WHEN NOT IN DEV public static void log(String format, Object... objects) { Bukkit.getConsoleSender() - .sendMessage( - ChatColor.translateAlternateColorCodes( - '&', String.format("&7[&4Community&7]&r " + format, objects))); + .sendMessage(ChatColor.translateAlternateColorCodes( + '&', String.format("&7[&4Community&7]&r " + format, objects))); } } diff --git a/src/main/java/dev/pgm/community/CommunityCommand.java b/core/src/main/java/dev/pgm/community/CommunityCommand.java similarity index 85% rename from src/main/java/dev/pgm/community/CommunityCommand.java rename to core/src/main/java/dev/pgm/community/CommunityCommand.java index 180c213a..eeec42ad 100644 --- a/src/main/java/dev/pgm/community/CommunityCommand.java +++ b/core/src/main/java/dev/pgm/community/CommunityCommand.java @@ -69,11 +69,10 @@ public Set getPlayers() { } public Component getText() { - List names = - players.stream() - .map(p -> player(p, NameStyle.FANCY)) - .limit(Math.min(players.size(), 10)) - .collect(Collectors.toList()); + List names = players.stream() + .map(p -> player(p, NameStyle.FANCY)) + .limit(Math.min(players.size(), 10)) + .collect(Collectors.toList()); Component hover = TextFormatter.list(names, NamedTextColor.GRAY); if (getPlayers().size() > names.size()) { @@ -101,10 +100,9 @@ protected PlayerSelection getPlayers(CommandAudience viewer, String input) { input.equalsIgnoreCase("*") && viewer.hasPermission(CommunityPermissions.ALL_SELECTOR); boolean isRandom = input.startsWith("?") && viewer.hasPermission(CommunityPermissions.RANDOM_SELECTOR); - boolean isTeam = - input.startsWith("team=") - && PGMUtils.isPGMEnabled() - && viewer.hasPermission(CommunityPermissions.TEAM_SELECTOR); + boolean isTeam = input.startsWith("team=") + && PGMUtils.isPGMEnabled() + && viewer.hasPermission(CommunityPermissions.TEAM_SELECTOR); String[] parts = input.split("="); @@ -114,25 +112,23 @@ protected PlayerSelection getPlayers(CommandAudience viewer, String input) { Component text; if (isAll) { targets.addAll(allOnline); - text = - text() - .append(text("everyone ")) - .append(text("(")) - .append(text(targets.size(), NamedTextColor.GREEN)) - .append(text(")")) - .color(NamedTextColor.GRAY) - .build(); + text = text() + .append(text("everyone ")) + .append(text("(")) + .append(text(targets.size(), NamedTextColor.GREEN)) + .append(text(")")) + .color(NamedTextColor.GRAY) + .build(); } else if (isRandom) { int randomCount = parts.length == 2 ? parseInputInt(input, 1) : 1; for (int i = 0; i < randomCount; i++) { targets.add(allOnline.get(Community.get().getRandom().nextInt(allOnline.size()))); } String rdTxt = " randomly chosen player" + (targets.size() != 1 ? "s" : ""); - text = - text() - .append(text(targets.size(), NamedTextColor.GREEN)) - .append(text(rdTxt, NamedTextColor.GRAY)) - .build(); + text = text() + .append(text(targets.size(), NamedTextColor.GREEN)) + .append(text(rdTxt, NamedTextColor.GRAY)) + .build(); } else if (isTeam) { Match match = PGMUtils.getMatch(); if (match.getModule(TeamMatchModule.class) != null) { @@ -145,10 +141,9 @@ protected PlayerSelection getPlayers(CommandAudience viewer, String input) { // Allow Observers to be selected if (teamName.toLowerCase().startsWith("obs")) { text = text("Observers", NamedTextColor.AQUA); - targets.addAll( - match.getObservers().stream() - .map(MatchPlayer::getBukkit) - .collect(Collectors.toList())); + targets.addAll(match.getObservers().stream() + .map(MatchPlayer::getBukkit) + .collect(Collectors.toList())); } else { Team team = teams.bestFuzzyMatch(teamName); if (team == null) { @@ -156,10 +151,9 @@ protected PlayerSelection getPlayers(CommandAudience viewer, String input) { } targets.addAll( team.getPlayers().stream().map(MatchPlayer::getBukkit).collect(Collectors.toList())); - text = - text() - .append(text(team.getNameLegacy(), TextFormatter.convert(team.getColor()))) - .build(); + text = text() + .append(text(team.getNameLegacy(), TextFormatter.convert(team.getColor()))) + .build(); } } else { throw TextException.exception("There are no teams in this match to select"); @@ -172,12 +166,11 @@ protected PlayerSelection getPlayers(CommandAudience viewer, String input) { targets.add(player); } } - text = - text() - .append(text(targets.size(), NamedTextColor.GREEN)) - .append(text(" player" + (targets.size() != 1 ? "s" : ""))) - .color(NamedTextColor.GRAY) - .build(); + text = text() + .append(text(targets.size(), NamedTextColor.GREEN)) + .append(text(" player" + (targets.size() != 1 ? "s" : ""))) + .color(NamedTextColor.GRAY) + .build(); if (targets.size() > 1 && !viewer.hasPermission(CommunityPermissions.SELECTOR)) { // If no permission for multiple, get a random single entry @@ -239,9 +232,8 @@ protected UUID getOnlineTarget(String target, UsersFeature service) { if (id == null) { // TODO: Maybe use getStoredID and listen, that way we can account for EVERYONE. But not a // priority now - Optional cachedId = - service.getId( - target); // If user is online or was online recently, we will have their UUID. + Optional cachedId = service.getId( + target); // If user is online or was online recently, we will have their UUID. if (!cachedId.isPresent()) { throw TextException.exception(formatNotFoundMsg(target)); } else { diff --git a/src/main/java/dev/pgm/community/CommunityConfig.java b/core/src/main/java/dev/pgm/community/CommunityConfig.java similarity index 100% rename from src/main/java/dev/pgm/community/CommunityConfig.java rename to core/src/main/java/dev/pgm/community/CommunityConfig.java diff --git a/src/main/java/dev/pgm/community/CommunityPermissions.java b/core/src/main/java/dev/pgm/community/CommunityPermissions.java similarity index 100% rename from src/main/java/dev/pgm/community/CommunityPermissions.java rename to core/src/main/java/dev/pgm/community/CommunityPermissions.java diff --git a/src/main/java/dev/pgm/community/assistance/AssistanceRequest.java b/core/src/main/java/dev/pgm/community/assistance/AssistanceRequest.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/AssistanceRequest.java rename to core/src/main/java/dev/pgm/community/assistance/AssistanceRequest.java diff --git a/src/main/java/dev/pgm/community/assistance/PlayerHelpRequest.java b/core/src/main/java/dev/pgm/community/assistance/PlayerHelpRequest.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/PlayerHelpRequest.java rename to core/src/main/java/dev/pgm/community/assistance/PlayerHelpRequest.java diff --git a/src/main/java/dev/pgm/community/assistance/Report.java b/core/src/main/java/dev/pgm/community/assistance/Report.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/Report.java rename to core/src/main/java/dev/pgm/community/assistance/Report.java diff --git a/src/main/java/dev/pgm/community/assistance/ReportConfig.java b/core/src/main/java/dev/pgm/community/assistance/ReportConfig.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/ReportConfig.java rename to core/src/main/java/dev/pgm/community/assistance/ReportConfig.java diff --git a/src/main/java/dev/pgm/community/assistance/commands/PlayerHelpCommand.java b/core/src/main/java/dev/pgm/community/assistance/commands/PlayerHelpCommand.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/commands/PlayerHelpCommand.java rename to core/src/main/java/dev/pgm/community/assistance/commands/PlayerHelpCommand.java diff --git a/src/main/java/dev/pgm/community/assistance/commands/ReportCommands.java b/core/src/main/java/dev/pgm/community/assistance/commands/ReportCommands.java similarity index 77% rename from src/main/java/dev/pgm/community/assistance/commands/ReportCommands.java rename to core/src/main/java/dev/pgm/community/assistance/commands/ReportCommands.java index 97f0d33b..d5452e68 100644 --- a/src/main/java/dev/pgm/community/assistance/commands/ReportCommands.java +++ b/core/src/main/java/dev/pgm/community/assistance/commands/ReportCommands.java @@ -89,17 +89,14 @@ public void recentReports( checkEnabled(); if (player != null) { - reports - .query(player) - .thenAcceptAsync( - reports -> { - if (reports.isEmpty()) { - audience.sendWarning( - text("No reports found for ").append(text(player, NamedTextColor.AQUA))); - return; - } - sendReportHistory(audience, reports, page); - }); + reports.query(player).thenAcceptAsync(reports -> { + if (reports.isEmpty()) { + audience.sendWarning( + text("No reports found for ").append(text(player, NamedTextColor.AQUA))); + return; + } + sendReportHistory(audience, reports, page); + }); return; } @@ -113,16 +110,15 @@ public void sendReportHistory(CommandAudience audience, Collection repor int pages = (reportData.size() + perPage - 1) / perPage; page = Math.max(1, Math.min(page, pages)); - Component pageNum = - translatable( - "command.simplePageHeader", - NamedTextColor.GRAY, - text(Integer.toString(page), NamedTextColor.RED), - text(Integer.toString(pages), NamedTextColor.RED)); + Component pageNum = translatable( + "command.simplePageHeader", + NamedTextColor.GRAY, + text(Integer.toString(page), NamedTextColor.RED), + text(Integer.toString(pages), NamedTextColor.RED)); - Component header = - translatable("moderation.reports.header", NamedTextColor.GRAY, headerResultCount, pageNum) - .append(text(" (").append(headerResultCount).append(text(") ยป ")).append(pageNum)); + Component header = translatable( + "moderation.reports.header", NamedTextColor.GRAY, headerResultCount, pageNum) + .append(text(" (").append(headerResultCount).append(text(") ยป ")).append(pageNum)); Component formattedHeader = TextFormatter.horizontalLineHeading(audience.getSender(), header, NamedTextColor.DARK_GRAY); @@ -132,23 +128,19 @@ public Component format(Report data, int index) { Component reporterName = getReportFormatName(data.getSenderId()).join(); Component reportedName = getReportFormatName(data.getTargetId()).join(); - Component serverName = - text("Server ", NamedTextColor.GRAY) - .append(text(": ", NamedTextColor.DARK_GRAY)) - .append(text(data.getServer(), NamedTextColor.AQUA)); + Component serverName = text("Server ", NamedTextColor.GRAY) + .append(text(": ", NamedTextColor.DARK_GRAY)) + .append(text(data.getServer(), NamedTextColor.AQUA)); - TextComponent.Builder reporter = - text() - .append( - translatable("moderation.reports.hover", NamedTextColor.GRAY, reporterName)); + TextComponent.Builder reporter = text() + .append(translatable("moderation.reports.hover", NamedTextColor.GRAY, reporterName)); if (!data.getServer().equalsIgnoreCase(Community.get().getServerConfig().getServerId())) { reporter.append(newline()).append(serverName); } - Component timeAgo = - TemporalComponent.relativePastApproximate(data.getTime()) - .color(NamedTextColor.DARK_GREEN); + Component timeAgo = TemporalComponent.relativePastApproximate(data.getTime()) + .color(NamedTextColor.DARK_GREEN); return text() .append(timeAgo.hoverEvent(HoverEvent.showText(reporter.build()))) @@ -168,12 +160,9 @@ public Component formatEmpty() { } private CompletableFuture getReportFormatName(UUID id) { - return usernames - .getStoredUsername(id) - .thenApplyAsync( - name -> { - return PlayerComponent.player(Bukkit.getPlayer(id), name, NameStyle.FANCY); - }); + return usernames.getStoredUsername(id).thenApplyAsync(name -> { + return PlayerComponent.player(Bukkit.getPlayer(id), name, NameStyle.FANCY); + }); } private void checkEnabled() { diff --git a/src/main/java/dev/pgm/community/assistance/feature/AssistanceFeature.java b/core/src/main/java/dev/pgm/community/assistance/feature/AssistanceFeature.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/feature/AssistanceFeature.java rename to core/src/main/java/dev/pgm/community/assistance/feature/AssistanceFeature.java diff --git a/src/main/java/dev/pgm/community/assistance/feature/AssistanceFeatureBase.java b/core/src/main/java/dev/pgm/community/assistance/feature/AssistanceFeatureBase.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/feature/AssistanceFeatureBase.java rename to core/src/main/java/dev/pgm/community/assistance/feature/AssistanceFeatureBase.java diff --git a/src/main/java/dev/pgm/community/assistance/feature/types/NoDBAssistanceFeature.java b/core/src/main/java/dev/pgm/community/assistance/feature/types/NoDBAssistanceFeature.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/feature/types/NoDBAssistanceFeature.java rename to core/src/main/java/dev/pgm/community/assistance/feature/types/NoDBAssistanceFeature.java diff --git a/src/main/java/dev/pgm/community/assistance/feature/types/SQLAssistanceFeature.java b/core/src/main/java/dev/pgm/community/assistance/feature/types/SQLAssistanceFeature.java similarity index 90% rename from src/main/java/dev/pgm/community/assistance/feature/types/SQLAssistanceFeature.java rename to core/src/main/java/dev/pgm/community/assistance/feature/types/SQLAssistanceFeature.java index 5f4ff6db..bb526187 100644 --- a/src/main/java/dev/pgm/community/assistance/feature/types/SQLAssistanceFeature.java +++ b/core/src/main/java/dev/pgm/community/assistance/feature/types/SQLAssistanceFeature.java @@ -51,11 +51,9 @@ public CompletableFuture> query(String target) { // CONVERT TO UUID if username return users .getStoredId(target) - .thenApplyAsync( - uuid -> - uuid.isPresent() - ? service.queryList(uuid.get().toString()).join() - : Lists.newArrayList()); + .thenApplyAsync(uuid -> uuid.isPresent() + ? service.queryList(uuid.get().toString()).join() + : Lists.newArrayList()); } return service.queryList(target); diff --git a/src/main/java/dev/pgm/community/assistance/menu/ReportCategory.java b/core/src/main/java/dev/pgm/community/assistance/menu/ReportCategory.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/menu/ReportCategory.java rename to core/src/main/java/dev/pgm/community/assistance/menu/ReportCategory.java diff --git a/src/main/java/dev/pgm/community/assistance/menu/ReportCategoryMenu.java b/core/src/main/java/dev/pgm/community/assistance/menu/ReportCategoryMenu.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/menu/ReportCategoryMenu.java rename to core/src/main/java/dev/pgm/community/assistance/menu/ReportCategoryMenu.java diff --git a/src/main/java/dev/pgm/community/assistance/menu/ReportReason.java b/core/src/main/java/dev/pgm/community/assistance/menu/ReportReason.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/menu/ReportReason.java rename to core/src/main/java/dev/pgm/community/assistance/menu/ReportReason.java diff --git a/src/main/java/dev/pgm/community/assistance/menu/ReportReasonsMenu.java b/core/src/main/java/dev/pgm/community/assistance/menu/ReportReasonsMenu.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/menu/ReportReasonsMenu.java rename to core/src/main/java/dev/pgm/community/assistance/menu/ReportReasonsMenu.java diff --git a/core/src/main/java/dev/pgm/community/assistance/services/AssistanceQuery.java b/core/src/main/java/dev/pgm/community/assistance/services/AssistanceQuery.java new file mode 100644 index 00000000..93ccc7be --- /dev/null +++ b/core/src/main/java/dev/pgm/community/assistance/services/AssistanceQuery.java @@ -0,0 +1,17 @@ +package dev.pgm.community.assistance.services; + +public interface AssistanceQuery { + + static final String TABLE_NAME = "reports"; + static final String TABLE_FIELDS = "(id VARCHAR(36) PRIMARY KEY, " + + "sender VARCHAR(36), " + + "reported VARCHAR(36), " + + "reason VARCHAR(255), " + + "time LONG, " + + "server VARCHAR(255))"; + static final String INSERT_REPORT_QUERY = "INSERT INTO " + + TABLE_NAME + + "(id, sender, reported, reason, time, server) VALUES (?, ?, ?, ?, ?, ?)"; + static final String SELECT_REPORT_QUERY = + "SELECT id, sender, reason, time FROM " + TABLE_NAME + " WHERE reported = ?"; +} diff --git a/src/main/java/dev/pgm/community/assistance/services/SQLAssistanceService.java b/core/src/main/java/dev/pgm/community/assistance/services/SQLAssistanceService.java similarity index 100% rename from src/main/java/dev/pgm/community/assistance/services/SQLAssistanceService.java rename to core/src/main/java/dev/pgm/community/assistance/services/SQLAssistanceService.java diff --git a/src/main/java/dev/pgm/community/broadcast/BroadcastCommand.java b/core/src/main/java/dev/pgm/community/broadcast/BroadcastCommand.java similarity index 100% rename from src/main/java/dev/pgm/community/broadcast/BroadcastCommand.java rename to core/src/main/java/dev/pgm/community/broadcast/BroadcastCommand.java diff --git a/src/main/java/dev/pgm/community/broadcast/BroadcastConfig.java b/core/src/main/java/dev/pgm/community/broadcast/BroadcastConfig.java similarity index 90% rename from src/main/java/dev/pgm/community/broadcast/BroadcastConfig.java rename to core/src/main/java/dev/pgm/community/broadcast/BroadcastConfig.java index 497eac60..17506c9d 100644 --- a/src/main/java/dev/pgm/community/broadcast/BroadcastConfig.java +++ b/core/src/main/java/dev/pgm/community/broadcast/BroadcastConfig.java @@ -69,9 +69,8 @@ public void reload(Configuration config) { this.announceEnabled = config.getBoolean(getAnnounceKey() + ".enabled"); this.announceDelay = config.getInt(getAnnounceKey() + ".delay-seconds"); this.announcePrefix = parseComponent(config.getString(getAnnounceKey() + ".prefix")); - this.announceMessages = - config.getStringList(getAnnounceKey() + ".messages").stream() - .map(TextParser::parseComponent) - .collect(Collectors.toList()); + this.announceMessages = config.getStringList(getAnnounceKey() + ".messages").stream() + .map(TextParser::parseComponent) + .collect(Collectors.toList()); } } diff --git a/src/main/java/dev/pgm/community/broadcast/BroadcastFeature.java b/core/src/main/java/dev/pgm/community/broadcast/BroadcastFeature.java similarity index 100% rename from src/main/java/dev/pgm/community/broadcast/BroadcastFeature.java rename to core/src/main/java/dev/pgm/community/broadcast/BroadcastFeature.java diff --git a/src/main/java/dev/pgm/community/chat/management/ChatManagementCommand.java b/core/src/main/java/dev/pgm/community/chat/management/ChatManagementCommand.java similarity index 93% rename from src/main/java/dev/pgm/community/chat/management/ChatManagementCommand.java rename to core/src/main/java/dev/pgm/community/chat/management/ChatManagementCommand.java index 0fe5af95..facebc41 100644 --- a/src/main/java/dev/pgm/community/chat/management/ChatManagementCommand.java +++ b/core/src/main/java/dev/pgm/community/chat/management/ChatManagementCommand.java @@ -28,9 +28,8 @@ public ChatManagementCommand() { @CommandDescription("View the current chat mode status") @Permission(CommunityPermissions.CHAT_MANAGEMENT) public void viewStatus(CommandAudience audience) { - audience.sendMessage( - TextFormatter.horizontalLineHeading( - audience.getSender(), text("Chat Status", NamedTextColor.YELLOW), NamedTextColor.GRAY)); + audience.sendMessage(TextFormatter.horizontalLineHeading( + audience.getSender(), text("Chat Status", NamedTextColor.YELLOW), NamedTextColor.GRAY)); audience.sendMessage(formatStatus(text("Chat Lockdown"), chat.isLockdown())); audience.sendMessage(formatStatus(text("Chat Slowmode"), chat.isSlowmode())); } diff --git a/src/main/java/dev/pgm/community/chat/management/ChatManagementConfig.java b/core/src/main/java/dev/pgm/community/chat/management/ChatManagementConfig.java similarity index 92% rename from src/main/java/dev/pgm/community/chat/management/ChatManagementConfig.java rename to core/src/main/java/dev/pgm/community/chat/management/ChatManagementConfig.java index 9c811c7e..fe4e64ff 100644 --- a/src/main/java/dev/pgm/community/chat/management/ChatManagementConfig.java +++ b/core/src/main/java/dev/pgm/community/chat/management/ChatManagementConfig.java @@ -52,8 +52,9 @@ public void reload(Configuration config) { super.reload(config); this.slowmodeSpeed = config.getInt(KEY + ".slowmode-speed"); this.loginAlerts = config.getBoolean(KEY + ".login-alert"); - this.lastSentMessage = - CacheBuilder.newBuilder().expireAfterWrite(slowmodeSpeed, TimeUnit.SECONDS).build(); + this.lastSentMessage = CacheBuilder.newBuilder() + .expireAfterWrite(slowmodeSpeed, TimeUnit.SECONDS) + .build(); this.blockRepeatedMessages = config.getBoolean(KEY + ".block-repeated-messages"); this.expireRepeatedMessages = parseDuration(config.getString(KEY + ".expire-repeated-messages")); diff --git a/src/main/java/dev/pgm/community/chat/management/ChatManagementFeature.java b/core/src/main/java/dev/pgm/community/chat/management/ChatManagementFeature.java similarity index 88% rename from src/main/java/dev/pgm/community/chat/management/ChatManagementFeature.java rename to core/src/main/java/dev/pgm/community/chat/management/ChatManagementFeature.java index 9cd7f1f4..4ebb1b6e 100644 --- a/src/main/java/dev/pgm/community/chat/management/ChatManagementFeature.java +++ b/core/src/main/java/dev/pgm/community/chat/management/ChatManagementFeature.java @@ -38,12 +38,10 @@ public class ChatManagementFeature extends FeatureBase { public ChatManagementFeature(Configuration config, Logger logger) { super(new ChatManagementConfig(config), logger, "Chat Management"); - this.lastMessageCache = - CacheBuilder.newBuilder() - .expireAfterWrite( - getChatConfig().getRepeatedMessagesExpireDuration().toMillis(), - TimeUnit.MILLISECONDS) - .build(); + this.lastMessageCache = CacheBuilder.newBuilder() + .expireAfterWrite( + getChatConfig().getRepeatedMessagesExpireDuration().toMillis(), TimeUnit.MILLISECONDS) + .build(); if (getConfig().isEnabled()) { enable(); } @@ -70,17 +68,14 @@ public void toggleSlowmode(CommandSender sender) { } private void broadcastModeChange(Component modeName, Component hover, boolean enabled) { - Component message = - text() - .append(modeName) - .append(text(" has been ")) - .append( - enabled - ? text("enabled", NamedTextColor.GREEN) - : text("disabled", NamedTextColor.RED)) - .color(NamedTextColor.GRAY) - .hoverEvent(HoverEvent.showText(hover)) - .build(); + Component message = text() + .append(modeName) + .append(text(" has been ")) + .append( + enabled ? text("enabled", NamedTextColor.GREEN) : text("disabled", NamedTextColor.RED)) + .color(NamedTextColor.GRAY) + .hoverEvent(HoverEvent.showText(hover)) + .build(); BroadcastUtils.sendGlobalWarning(message); } @@ -166,12 +161,11 @@ public void onPlayerChat(AsyncPlayerChatEvent event) { if (timeSince.getSeconds() < getChatConfig().getSlowmodeSpeed()) { long seconds = (getChatConfig().getSlowmodeSpeed() - timeSince.getSeconds()); - Component cooldownMsg = - text("Please wait ") - .append(text(seconds, NamedTextColor.RED, TextDecoration.BOLD)) - .append(formatSeconds(seconds)) - .append(text(" before sending another message")) - .color(NamedTextColor.GRAY); + Component cooldownMsg = text("Please wait ") + .append(text(seconds, NamedTextColor.RED, TextDecoration.BOLD)) + .append(formatSeconds(seconds)) + .append(text(" before sending another message")) + .color(NamedTextColor.GRAY); viewer.sendWarning(cooldownMsg); event.setCancelled(true); diff --git a/src/main/java/dev/pgm/community/chat/network/NetworkChatConfig.java b/core/src/main/java/dev/pgm/community/chat/network/NetworkChatConfig.java similarity index 100% rename from src/main/java/dev/pgm/community/chat/network/NetworkChatConfig.java rename to core/src/main/java/dev/pgm/community/chat/network/NetworkChatConfig.java diff --git a/src/main/java/dev/pgm/community/chat/network/NetworkChatFeature.java b/core/src/main/java/dev/pgm/community/chat/network/NetworkChatFeature.java similarity index 93% rename from src/main/java/dev/pgm/community/chat/network/NetworkChatFeature.java rename to core/src/main/java/dev/pgm/community/chat/network/NetworkChatFeature.java index f81c3270..98635dde 100644 --- a/src/main/java/dev/pgm/community/chat/network/NetworkChatFeature.java +++ b/core/src/main/java/dev/pgm/community/chat/network/NetworkChatFeature.java @@ -52,6 +52,10 @@ public void recieveUpdate(NetworkChatMessage message) { } private Component formatMessage(Component sender, Component message) { - return text().append(sender).append(text(": ", NamedTextColor.WHITE)).append(message).build(); + return text() + .append(sender) + .append(text(": ", NamedTextColor.WHITE)) + .append(message) + .build(); } } diff --git a/src/main/java/dev/pgm/community/chat/network/NetworkChatMessage.java b/core/src/main/java/dev/pgm/community/chat/network/NetworkChatMessage.java similarity index 100% rename from src/main/java/dev/pgm/community/chat/network/NetworkChatMessage.java rename to core/src/main/java/dev/pgm/community/chat/network/NetworkChatMessage.java diff --git a/src/main/java/dev/pgm/community/commands/CommunityPluginCommand.java b/core/src/main/java/dev/pgm/community/commands/CommunityPluginCommand.java similarity index 77% rename from src/main/java/dev/pgm/community/commands/CommunityPluginCommand.java rename to core/src/main/java/dev/pgm/community/commands/CommunityPluginCommand.java index 56c87e3c..7782b636 100644 --- a/src/main/java/dev/pgm/community/commands/CommunityPluginCommand.java +++ b/core/src/main/java/dev/pgm/community/commands/CommunityPluginCommand.java @@ -40,11 +40,10 @@ public void reload(CommandAudience audience) { @CommandDescription("View database stats") @Permission(CommunityPermissions.RELOAD) public void stats(CommandAudience audience) { - audience.sendMessage( - TextFormatter.horizontalLineHeading( - audience.getSender(), - text("Community Database Stats", NamedTextColor.YELLOW), - NamedTextColor.DARK_RED)); + audience.sendMessage(TextFormatter.horizontalLineHeading( + audience.getSender(), + text("Community Database Stats", NamedTextColor.YELLOW), + NamedTextColor.DARK_RED)); sendTotalCount(users, "Total Users", audience); sendTotalCount(moderation, "Total Punishments", audience); sendTotalCount(reports, "Total Reports", audience); @@ -53,13 +52,10 @@ public void stats(CommandAudience audience) { private void sendTotalCount(Feature feature, String countName, CommandAudience audience) { feature .count() - .thenAcceptAsync( - total -> - audience.sendMessage( - text() - .append(text(countName, NamedTextColor.GOLD)) - .append(text(": ", NamedTextColor.GRAY)) - .append(text(total, NamedTextColor.GREEN)) - .build())); + .thenAcceptAsync(total -> audience.sendMessage(text() + .append(text(countName, NamedTextColor.GOLD)) + .append(text(": ", NamedTextColor.GRAY)) + .append(text(total, NamedTextColor.GREEN)) + .build())); } } diff --git a/src/main/java/dev/pgm/community/commands/ContainerCommand.java b/core/src/main/java/dev/pgm/community/commands/ContainerCommand.java similarity index 96% rename from src/main/java/dev/pgm/community/commands/ContainerCommand.java rename to core/src/main/java/dev/pgm/community/commands/ContainerCommand.java index c2d7be6e..5c7a43a4 100644 --- a/src/main/java/dev/pgm/community/commands/ContainerCommand.java +++ b/core/src/main/java/dev/pgm/community/commands/ContainerCommand.java @@ -100,10 +100,9 @@ public void onContainerClick(PlayerInteractEvent event) { if (isChoosing(player) && canOpen(block) && event.getAction() == Action.LEFT_CLICK_BLOCK) { event.setCancelled(true); - viewer.sendMessage( - text() - .append(text("Now opening container at ", NamedTextColor.GRAY)) - .append(formatCoords(block, NamedTextColor.GREEN))); + viewer.sendMessage(text() + .append(text("Now opening container at ", NamedTextColor.GRAY)) + .append(formatCoords(block, NamedTextColor.GREEN))); InventoryHolder container = (InventoryHolder) block.getState(); editingPlayers.add(player.getUniqueId()); diff --git a/src/main/java/dev/pgm/community/commands/FlightCommand.java b/core/src/main/java/dev/pgm/community/commands/FlightCommand.java similarity index 68% rename from src/main/java/dev/pgm/community/commands/FlightCommand.java rename to core/src/main/java/dev/pgm/community/commands/FlightCommand.java index e08f8e7d..8e15a3e2 100644 --- a/src/main/java/dev/pgm/community/commands/FlightCommand.java +++ b/core/src/main/java/dev/pgm/community/commands/FlightCommand.java @@ -26,12 +26,11 @@ public void fly(CommandAudience sender, @Argument("target") TargetPlayer target) PlayerSelection selection = getPlayers(sender, target.getIdentifier()); if (!selection.getPlayers().isEmpty()) { selection.getPlayers().forEach(this::toggleFlight); - sender.sendMessage( - text() - .append(text("Flight has been toggled for ")) - .append(selection.getText()) - .color(NamedTextColor.GRAY) - .build()); + sender.sendMessage(text() + .append(text("Flight has been toggled for ")) + .append(selection.getText()) + .color(NamedTextColor.GRAY) + .build()); } else { selection.sendNoPlayerComponent(sender); } @@ -43,15 +42,13 @@ public void fly(CommandAudience sender, @Argument("target") TargetPlayer target) @Permission(CommunityPermissions.FLIGHT_SPEED) public void flySpeed(CommandAudience audience, Player player, @Argument("speed") Float speed) { if (speed == null) { - audience.sendMessage( - text("Your flight speed is ", NamedTextColor.GRAY) - .append(text(player.getFlySpeed() * 100, NamedTextColor.GREEN))); + audience.sendMessage(text("Your flight speed is ", NamedTextColor.GRAY) + .append(text(player.getFlySpeed() * 100, NamedTextColor.GREEN))); return; } player.setFlySpeed(Math.abs(Math.min(speed, 10) / 10)); - audience.sendMessage( - text("Flight speed set to ", NamedTextColor.GRAY) - .append(text(player.getFlySpeed() * 100, NamedTextColor.GREEN))); + audience.sendMessage(text("Flight speed set to ", NamedTextColor.GRAY) + .append(text(player.getFlySpeed() * 100, NamedTextColor.GREEN))); } private void toggleFlight(Player player) { @@ -59,11 +56,9 @@ private void toggleFlight(Player player) { player.setAllowFlight(!fly); player.setFlying(!fly); Audience.get(player) - .sendMessage( - text("Toggled flying mode ", NamedTextColor.GRAY) - .append( - text( - player.isFlying() ? "On" : "Off", - player.isFlying() ? NamedTextColor.GREEN : NamedTextColor.RED))); + .sendMessage(text("Toggled flying mode ", NamedTextColor.GRAY) + .append(text( + player.isFlying() ? "On" : "Off", + player.isFlying() ? NamedTextColor.GREEN : NamedTextColor.RED))); } } diff --git a/src/main/java/dev/pgm/community/commands/GamemodeCommand.java b/core/src/main/java/dev/pgm/community/commands/GamemodeCommand.java similarity index 73% rename from src/main/java/dev/pgm/community/commands/GamemodeCommand.java rename to core/src/main/java/dev/pgm/community/commands/GamemodeCommand.java index bfb2d7ce..e717a296 100644 --- a/src/main/java/dev/pgm/community/commands/GamemodeCommand.java +++ b/core/src/main/java/dev/pgm/community/commands/GamemodeCommand.java @@ -30,33 +30,30 @@ public void gamemode( // /gm if (gamemode == null && target == null) { // Send current gamemode - viewer.sendMessage( - text() - .append(text("Your current gamemode is ", NamedTextColor.GRAY)) - .append(getGamemodeName(player.getGameMode())) - .build()); + viewer.sendMessage(text() + .append(text("Your current gamemode is ", NamedTextColor.GRAY)) + .append(getGamemodeName(player.getGameMode())) + .build()); } else if (gamemode != null && target == null && !everyone) { // /gm player.setGameMode(gamemode); - viewer.sendMessage( - text() - .append(text("Set your gamemode to ", NamedTextColor.GRAY)) - .append(getGamemodeName(player.getGameMode())) - .build()); + viewer.sendMessage(text() + .append(text("Set your gamemode to ", NamedTextColor.GRAY)) + .append(getGamemodeName(player.getGameMode())) + .build()); } else { // /gm PlayerSelection selection = getPlayers(viewer, everyone ? "*" : target.getName()); if (!selection.getPlayers().isEmpty()) { selection.getPlayers().forEach(pl -> pl.setGameMode(gamemode)); - viewer.sendMessage( - text() - .append(text("Gamemode has been set to ")) - .append(getGamemodeName(gamemode)) - .append(text(" for ")) - .append(selection.getText()) - .color(NamedTextColor.GRAY) - .build()); + viewer.sendMessage(text() + .append(text("Gamemode has been set to ")) + .append(getGamemodeName(gamemode)) + .append(text(" for ")) + .append(selection.getText()) + .color(NamedTextColor.GRAY) + .build()); } else { selection.sendNoPlayerComponent(viewer); } diff --git a/src/main/java/dev/pgm/community/commands/ServerInfoCommand.java b/core/src/main/java/dev/pgm/community/commands/ServerInfoCommand.java similarity index 78% rename from src/main/java/dev/pgm/community/commands/ServerInfoCommand.java rename to core/src/main/java/dev/pgm/community/commands/ServerInfoCommand.java index dc952ecd..c5c88eab 100644 --- a/src/main/java/dev/pgm/community/commands/ServerInfoCommand.java +++ b/core/src/main/java/dev/pgm/community/commands/ServerInfoCommand.java @@ -23,11 +23,10 @@ public ServerInfoCommand() { @CommandDescription("View how long the server has been online") public void uptime(CommandAudience sender) { Duration uptime = Duration.between(startTime, Instant.now()); - sender.sendMessage( - text() - .append(text("Server has been online for ")) - .append(TemporalComponent.duration(uptime, NamedTextColor.GREEN)) - .color(NamedTextColor.GRAY) - .build()); + sender.sendMessage(text() + .append(text("Server has been online for ")) + .append(TemporalComponent.duration(uptime, NamedTextColor.GREEN)) + .color(NamedTextColor.GRAY) + .build()); } } diff --git a/src/main/java/dev/pgm/community/commands/StaffCommand.java b/core/src/main/java/dev/pgm/community/commands/StaffCommand.java similarity index 59% rename from src/main/java/dev/pgm/community/commands/StaffCommand.java rename to core/src/main/java/dev/pgm/community/commands/StaffCommand.java index 4bbab7f8..4b2cab67 100644 --- a/src/main/java/dev/pgm/community/commands/StaffCommand.java +++ b/core/src/main/java/dev/pgm/community/commands/StaffCommand.java @@ -22,25 +22,19 @@ public class StaffCommand extends CommunityCommand { @Command("staff|mods|admins|ops") @CommandDescription("View a list of online staff members") public void staff(CommandAudience viewer) { - List onlineStaff = - Bukkit.getOnlinePlayers().stream() - .filter( - player -> - (player.hasPermission(CommunityPermissions.STAFF) - && (!isDisguised(player) - || viewer.hasPermission(CommunityPermissions.STAFF)))) - .map(player -> PlayerComponent.player(player, NameStyle.VERBOSE)) - .collect(Collectors.toList()); + List onlineStaff = Bukkit.getOnlinePlayers().stream() + .filter(player -> (player.hasPermission(CommunityPermissions.STAFF) + && (!isDisguised(player) || viewer.hasPermission(CommunityPermissions.STAFF)))) + .map(player -> PlayerComponent.player(player, NameStyle.VERBOSE)) + .collect(Collectors.toList()); // FORMAT: Online Staff ({count}): {names} - Component staffCount = - text(Integer.toString(onlineStaff.size())) - .color(onlineStaff.isEmpty() ? NamedTextColor.RED : NamedTextColor.AQUA); - - Component content = - onlineStaff.isEmpty() - ? translatable("moderation.staff.empty") - : TextFormatter.list(onlineStaff, NamedTextColor.GRAY); + Component staffCount = text(Integer.toString(onlineStaff.size())) + .color(onlineStaff.isEmpty() ? NamedTextColor.RED : NamedTextColor.AQUA); + + Component content = onlineStaff.isEmpty() + ? translatable("moderation.staff.empty") + : TextFormatter.list(onlineStaff, NamedTextColor.GRAY); Component staff = translatable("moderation.staff.name", NamedTextColor.GRAY, staffCount, content); diff --git a/src/main/java/dev/pgm/community/commands/SudoCommand.java b/core/src/main/java/dev/pgm/community/commands/SudoCommand.java similarity index 80% rename from src/main/java/dev/pgm/community/commands/SudoCommand.java rename to core/src/main/java/dev/pgm/community/commands/SudoCommand.java index 3d08bda2..7dba3623 100644 --- a/src/main/java/dev/pgm/community/commands/SudoCommand.java +++ b/core/src/main/java/dev/pgm/community/commands/SudoCommand.java @@ -30,15 +30,14 @@ public void sudo( if (!selection.getPlayers().isEmpty()) { final String targetCommand = command.startsWith("/") ? command.substring(1) : command; selection.getPlayers().forEach(player -> player.performCommand(targetCommand)); - sender.sendMessage( - text() - .append(text("Forcing ")) - .append(selection.getText()) - .append(text(" to run ")) - .append(text("/", NamedTextColor.AQUA)) - .append(text(targetCommand, NamedTextColor.AQUA)) - .color(NamedTextColor.GRAY) - .build()); + sender.sendMessage(text() + .append(text("Forcing ")) + .append(selection.getText()) + .append(text(" to run ")) + .append(text("/", NamedTextColor.AQUA)) + .append(text(targetCommand, NamedTextColor.AQUA)) + .color(NamedTextColor.GRAY) + .build()); } else { selection.sendNoPlayerComponent(sender); } diff --git a/src/main/java/dev/pgm/community/commands/VanishedCommand.java b/core/src/main/java/dev/pgm/community/commands/VanishedCommand.java similarity index 74% rename from src/main/java/dev/pgm/community/commands/VanishedCommand.java rename to core/src/main/java/dev/pgm/community/commands/VanishedCommand.java index 65cc7e35..c01bf4da 100644 --- a/src/main/java/dev/pgm/community/commands/VanishedCommand.java +++ b/core/src/main/java/dev/pgm/community/commands/VanishedCommand.java @@ -23,23 +23,21 @@ public class VanishedCommand extends CommunityCommand { @CommandDescription("View a list of online vanished players") @Permission(CommunityPermissions.VIEW_VANISHED) public void viewVanished(CommandAudience viewer) { - List vanishedNames = - Bukkit.getOnlinePlayers().stream() - .filter(Integration::isVanished) - .map(player -> PlayerComponent.player(player, NameStyle.VERBOSE)) - .collect(Collectors.toList()); + List vanishedNames = Bukkit.getOnlinePlayers().stream() + .filter(Integration::isVanished) + .map(player -> PlayerComponent.player(player, NameStyle.VERBOSE)) + .collect(Collectors.toList()); if (vanishedNames.isEmpty()) { viewer.sendWarning(text("No online players are vanished!")); return; } - Component count = - text() - .append(text("Vanished", NamedTextColor.DARK_AQUA)) - .append(text(": ")) - .append(text(vanishedNames.size())) - .build(); + Component count = text() + .append(text("Vanished", NamedTextColor.DARK_AQUA)) + .append(text(": ")) + .append(text(vanishedNames.size())) + .build(); Component nameList = TextFormatter.list(vanishedNames, NamedTextColor.GRAY); viewer.sendMessage(count); diff --git a/src/main/java/dev/pgm/community/commands/graph/CommunityCommandGraph.java b/core/src/main/java/dev/pgm/community/commands/graph/CommunityCommandGraph.java similarity index 98% rename from src/main/java/dev/pgm/community/commands/graph/CommunityCommandGraph.java rename to core/src/main/java/dev/pgm/community/commands/graph/CommunityCommandGraph.java index 31efd31e..68a5a484 100644 --- a/src/main/java/dev/pgm/community/commands/graph/CommunityCommandGraph.java +++ b/core/src/main/java/dev/pgm/community/commands/graph/CommunityCommandGraph.java @@ -19,7 +19,6 @@ import dev.pgm.community.commands.providers.TargetPlayerParser; import dev.pgm.community.freeze.FreezeCommand; import dev.pgm.community.friends.commands.FriendshipCommand; -import dev.pgm.community.mobs.MobCommand; import dev.pgm.community.moderation.commands.BanCommand; import dev.pgm.community.moderation.commands.KickCommand; import dev.pgm.community.moderation.commands.MuteCommand; @@ -112,9 +111,6 @@ protected void registerCommands() { // Friends register(new FriendshipCommand()); - // Mobs - register(new MobCommand()); - // Moderation register(new BanCommand()); register(new KickCommand()); diff --git a/src/main/java/dev/pgm/community/commands/injectors/CommandAudienceProvider.java b/core/src/main/java/dev/pgm/community/commands/injectors/CommandAudienceProvider.java similarity index 100% rename from src/main/java/dev/pgm/community/commands/injectors/CommandAudienceProvider.java rename to core/src/main/java/dev/pgm/community/commands/injectors/CommandAudienceProvider.java diff --git a/src/main/java/dev/pgm/community/commands/player/TargetPlayer.java b/core/src/main/java/dev/pgm/community/commands/player/TargetPlayer.java similarity index 100% rename from src/main/java/dev/pgm/community/commands/player/TargetPlayer.java rename to core/src/main/java/dev/pgm/community/commands/player/TargetPlayer.java diff --git a/src/main/java/dev/pgm/community/commands/providers/GameModeParser.java b/core/src/main/java/dev/pgm/community/commands/providers/GameModeParser.java similarity index 100% rename from src/main/java/dev/pgm/community/commands/providers/GameModeParser.java rename to core/src/main/java/dev/pgm/community/commands/providers/GameModeParser.java diff --git a/src/main/java/dev/pgm/community/commands/providers/TargetPlayerParser.java b/core/src/main/java/dev/pgm/community/commands/providers/TargetPlayerParser.java similarity index 100% rename from src/main/java/dev/pgm/community/commands/providers/TargetPlayerParser.java rename to core/src/main/java/dev/pgm/community/commands/providers/TargetPlayerParser.java diff --git a/src/main/java/dev/pgm/community/database/DatabaseConfig.java b/core/src/main/java/dev/pgm/community/database/DatabaseConfig.java similarity index 100% rename from src/main/java/dev/pgm/community/database/DatabaseConfig.java rename to core/src/main/java/dev/pgm/community/database/DatabaseConfig.java diff --git a/src/main/java/dev/pgm/community/database/DatabaseConnection.java b/core/src/main/java/dev/pgm/community/database/DatabaseConnection.java similarity index 51% rename from src/main/java/dev/pgm/community/database/DatabaseConnection.java rename to core/src/main/java/dev/pgm/community/database/DatabaseConnection.java index 0772113e..dbf9f007 100644 --- a/src/main/java/dev/pgm/community/database/DatabaseConnection.java +++ b/core/src/main/java/dev/pgm/community/database/DatabaseConnection.java @@ -17,23 +17,18 @@ public DatabaseConnection(Community plugin) { Map extraOptions = Maps.newHashMap(); extraOptions.put("serverTimezone", config.getTimezone()); - DatabaseOptions options = - DatabaseOptions.builder() - .poolName(plugin.getDescription().getName() + " DB") - .logger(plugin.getLogger()) - .mysql( - config.getUsername(), - config.getPassword(), - config.getDatabaseName(), - config.getHost()) - .build(); - - PooledDatabaseOptions poolOptions = - PooledDatabaseOptions.builder() - .options(options) - .maxConnections(config.getMaxDatabaseConnections()) - .dataSourceProperties(extraOptions) - .build(); + DatabaseOptions options = DatabaseOptions.builder() + .poolName(plugin.getDescription().getName() + " DB") + .logger(plugin.getLogger()) + .mysql( + config.getUsername(), config.getPassword(), config.getDatabaseName(), config.getHost()) + .build(); + + PooledDatabaseOptions poolOptions = PooledDatabaseOptions.builder() + .options(options) + .maxConnections(config.getMaxDatabaseConnections()) + .dataSourceProperties(extraOptions) + .build(); // Setup the main global DB BukkitDB.createHikariDatabase(plugin, poolOptions); diff --git a/src/main/java/dev/pgm/community/database/Query.java b/core/src/main/java/dev/pgm/community/database/Query.java similarity index 100% rename from src/main/java/dev/pgm/community/database/Query.java rename to core/src/main/java/dev/pgm/community/database/Query.java diff --git a/src/main/java/dev/pgm/community/database/Savable.java b/core/src/main/java/dev/pgm/community/database/Savable.java similarity index 100% rename from src/main/java/dev/pgm/community/database/Savable.java rename to core/src/main/java/dev/pgm/community/database/Savable.java diff --git a/src/main/java/dev/pgm/community/events/CommunityEvent.java b/core/src/main/java/dev/pgm/community/events/CommunityEvent.java similarity index 100% rename from src/main/java/dev/pgm/community/events/CommunityEvent.java rename to core/src/main/java/dev/pgm/community/events/CommunityEvent.java diff --git a/src/main/java/dev/pgm/community/events/PlayerHelpRequestEvent.java b/core/src/main/java/dev/pgm/community/events/PlayerHelpRequestEvent.java similarity index 100% rename from src/main/java/dev/pgm/community/events/PlayerHelpRequestEvent.java rename to core/src/main/java/dev/pgm/community/events/PlayerHelpRequestEvent.java diff --git a/src/main/java/dev/pgm/community/events/PlayerPunishmentEvent.java b/core/src/main/java/dev/pgm/community/events/PlayerPunishmentEvent.java similarity index 100% rename from src/main/java/dev/pgm/community/events/PlayerPunishmentEvent.java rename to core/src/main/java/dev/pgm/community/events/PlayerPunishmentEvent.java diff --git a/src/main/java/dev/pgm/community/events/PlayerReportEvent.java b/core/src/main/java/dev/pgm/community/events/PlayerReportEvent.java similarity index 100% rename from src/main/java/dev/pgm/community/events/PlayerReportEvent.java rename to core/src/main/java/dev/pgm/community/events/PlayerReportEvent.java diff --git a/src/main/java/dev/pgm/community/events/UserProfileLoadEvent.java b/core/src/main/java/dev/pgm/community/events/UserProfileLoadEvent.java similarity index 100% rename from src/main/java/dev/pgm/community/events/UserProfileLoadEvent.java rename to core/src/main/java/dev/pgm/community/events/UserProfileLoadEvent.java diff --git a/src/main/java/dev/pgm/community/feature/Feature.java b/core/src/main/java/dev/pgm/community/feature/Feature.java similarity index 100% rename from src/main/java/dev/pgm/community/feature/Feature.java rename to core/src/main/java/dev/pgm/community/feature/Feature.java diff --git a/src/main/java/dev/pgm/community/feature/FeatureBase.java b/core/src/main/java/dev/pgm/community/feature/FeatureBase.java similarity index 100% rename from src/main/java/dev/pgm/community/feature/FeatureBase.java rename to core/src/main/java/dev/pgm/community/feature/FeatureBase.java diff --git a/src/main/java/dev/pgm/community/feature/FeatureManager.java b/core/src/main/java/dev/pgm/community/feature/FeatureManager.java similarity index 96% rename from src/main/java/dev/pgm/community/feature/FeatureManager.java rename to core/src/main/java/dev/pgm/community/feature/FeatureManager.java index d3bd32ac..82465447 100644 --- a/src/main/java/dev/pgm/community/feature/FeatureManager.java +++ b/core/src/main/java/dev/pgm/community/feature/FeatureManager.java @@ -10,7 +10,6 @@ import dev.pgm.community.friends.feature.FriendshipFeature; import dev.pgm.community.friends.feature.types.SQLFriendshipFeature; import dev.pgm.community.info.InfoCommandsFeature; -import dev.pgm.community.mobs.MobFeature; import dev.pgm.community.moderation.feature.ModerationFeature; import dev.pgm.community.moderation.feature.types.SQLModerationFeature; import dev.pgm.community.motd.MotdFeature; @@ -53,7 +52,6 @@ public class FeatureManager { private final FreezeFeature freeze; private final MutationFeature mutation; private final BroadcastFeature broadcast; - private final MobFeature mob; private final MapPartyFeature party; private final PollFeature polls; @@ -88,7 +86,6 @@ public FeatureManager( this.mutation = new MutationFeature(config, logger, inventory); this.broadcast = new BroadcastFeature(config, logger); this.chatNetwork = new NetworkChatFeature(config, logger, network); - this.mob = new MobFeature(config, logger); this.party = new MapPartyFeature(config, logger); this.polls = new PollFeature(config, logger); } @@ -153,10 +150,6 @@ public RequestFeature getRequests() { return requests; } - public MobFeature getMobs() { - return mob; - } - public MapPartyFeature getParty() { return party; } @@ -181,7 +174,6 @@ public void reloadConfig(Configuration config) { getNick().getConfig().reload(config); getNetworkChat().getConfig().reload(config); getRequests().getConfig().reload(config); - getMobs().getConfig().reload(config); getParty().getConfig().reload(config); getPolls().getConfig().reload(config); // TODO: Look into maybe unregister commands for features that have been disabled @@ -204,7 +196,6 @@ public void disable() { if (getNick().isEnabled()) getNick().disable(); if (getNetworkChat().isEnabled()) getNetworkChat().disable(); if (getRequests().isEnabled()) getRequests().disable(); - if (getMobs().isEnabled()) getMobs().disable(); if (getParty().isEnabled()) getParty().disable(); if (getPolls().isEnabled()) getPolls().disable(); } diff --git a/src/main/java/dev/pgm/community/feature/SQLFeature.java b/core/src/main/java/dev/pgm/community/feature/SQLFeature.java similarity index 100% rename from src/main/java/dev/pgm/community/feature/SQLFeature.java rename to core/src/main/java/dev/pgm/community/feature/SQLFeature.java diff --git a/src/main/java/dev/pgm/community/feature/SQLFeatureBase.java b/core/src/main/java/dev/pgm/community/feature/SQLFeatureBase.java similarity index 100% rename from src/main/java/dev/pgm/community/feature/SQLFeatureBase.java rename to core/src/main/java/dev/pgm/community/feature/SQLFeatureBase.java diff --git a/src/main/java/dev/pgm/community/feature/config/FeatureConfig.java b/core/src/main/java/dev/pgm/community/feature/config/FeatureConfig.java similarity index 100% rename from src/main/java/dev/pgm/community/feature/config/FeatureConfig.java rename to core/src/main/java/dev/pgm/community/feature/config/FeatureConfig.java diff --git a/src/main/java/dev/pgm/community/feature/config/FeatureConfigImpl.java b/core/src/main/java/dev/pgm/community/feature/config/FeatureConfigImpl.java similarity index 100% rename from src/main/java/dev/pgm/community/feature/config/FeatureConfigImpl.java rename to core/src/main/java/dev/pgm/community/feature/config/FeatureConfigImpl.java diff --git a/src/main/java/dev/pgm/community/freeze/FreezeCommand.java b/core/src/main/java/dev/pgm/community/freeze/FreezeCommand.java similarity index 84% rename from src/main/java/dev/pgm/community/freeze/FreezeCommand.java rename to core/src/main/java/dev/pgm/community/freeze/FreezeCommand.java index 01e4f8f5..fc279fdb 100644 --- a/src/main/java/dev/pgm/community/freeze/FreezeCommand.java +++ b/core/src/main/java/dev/pgm/community/freeze/FreezeCommand.java @@ -46,12 +46,11 @@ public void sendFrozenList(CommandAudience sender) { // Online Players if (freeze.getOnlineCount() > 0) { - Component names = - join( - text(", ", NamedTextColor.GRAY), - freeze.getFrozenPlayers().stream() - .map(p -> PlayerComponent.player(p, NameStyle.FANCY)) - .collect(Collectors.toList())); + Component names = join( + text(", ", NamedTextColor.GRAY), + freeze.getFrozenPlayers().stream() + .map(p -> PlayerComponent.player(p, NameStyle.FANCY)) + .collect(Collectors.toList())); sender.sendMessage( formatFrozenList("moderation.freeze.frozenList.online", freeze.getOnlineCount(), names)); @@ -60,9 +59,8 @@ public void sendFrozenList(CommandAudience sender) { // Offline Players if (freeze.getOfflineCount() > 0) { Component names = text(freeze.getOfflineFrozenNames()); - sender.sendMessage( - formatFrozenList( - "moderation.freeze.frozenList.offline", freeze.getOfflineCount(), names)); + sender.sendMessage(formatFrozenList( + "moderation.freeze.frozenList.offline", freeze.getOfflineCount(), names)); } } diff --git a/src/main/java/dev/pgm/community/freeze/FreezeConfig.java b/core/src/main/java/dev/pgm/community/freeze/FreezeConfig.java similarity index 100% rename from src/main/java/dev/pgm/community/freeze/FreezeConfig.java rename to core/src/main/java/dev/pgm/community/freeze/FreezeConfig.java diff --git a/src/main/java/dev/pgm/community/freeze/FreezeFeature.java b/core/src/main/java/dev/pgm/community/freeze/FreezeFeature.java similarity index 94% rename from src/main/java/dev/pgm/community/freeze/FreezeFeature.java rename to core/src/main/java/dev/pgm/community/freeze/FreezeFeature.java index 724bad43..80b83759 100644 --- a/src/main/java/dev/pgm/community/freeze/FreezeFeature.java +++ b/core/src/main/java/dev/pgm/community/freeze/FreezeFeature.java @@ -101,15 +101,12 @@ public void setFrozen(CommandAudience sender, Player freezee, boolean frozen, bo public static ItemStack getFreezeTool(CommandSender viewer) { ItemStack stack = new ItemStack(TOOL_MATERIAL); ItemMeta meta = stack.getItemMeta(); - meta.setDisplayName( - ChatColor.WHITE - + ChatColor.BOLD.toString() - + TextTranslations.translate("moderation.freeze.itemName", viewer)); + meta.setDisplayName(ChatColor.WHITE + + ChatColor.BOLD.toString() + + TextTranslations.translate("moderation.freeze.itemName", viewer)); meta.addItemFlags(ItemFlag.values()); - meta.setLore( - Collections.singletonList( - ChatColor.GRAY - + TextTranslations.translate("moderation.freeze.itemDescription", viewer))); + meta.setLore(Collections.singletonList( + ChatColor.GRAY + TextTranslations.translate("moderation.freeze.itemDescription", viewer))); stack.setItemMeta(meta); return stack; } @@ -153,11 +150,10 @@ public void onObserverToolFreeze(final ObserverInteractEvent event) { public void onPlayerCommand(final PlayerCommandPreprocessEvent event) { if (freeze.isFrozen(event.getPlayer()) && !event.getPlayer().hasPermission(CommunityPermissions.FREEZE)) { - boolean allow = - ALLOWED_CMDS.stream() - .filter(cmd -> event.getMessage().startsWith(cmd)) - .findAny() - .isPresent(); + boolean allow = ALLOWED_CMDS.stream() + .filter(cmd -> event.getMessage().startsWith(cmd)) + .findAny() + .isPresent(); if (!allow) { // Don't allow commands except for those related to chat. diff --git a/src/main/java/dev/pgm/community/freeze/FreezeManager.java b/core/src/main/java/dev/pgm/community/freeze/FreezeManager.java similarity index 88% rename from src/main/java/dev/pgm/community/freeze/FreezeManager.java rename to core/src/main/java/dev/pgm/community/freeze/FreezeManager.java index 8e2016fd..aaac5ced 100644 --- a/src/main/java/dev/pgm/community/freeze/FreezeManager.java +++ b/core/src/main/java/dev/pgm/community/freeze/FreezeManager.java @@ -95,11 +95,10 @@ public void setFrozen( // Don't allow freezing if player is exempt if (freezee.hasPermission(CommunityPermissions.FREEZE_EXEMPT) && !freezer.getSender().hasPermission(CommunityPermissions.FREEZE_FORCE)) { - freezer.sendWarning( - text() - .append(PlayerComponent.player(freezee, NameStyle.FANCY)) - .append(text(" can not be frozen")) - .build()); + freezer.sendWarning(text() + .append(PlayerComponent.player(freezee, NameStyle.FANCY)) + .append(text(" can not be frozen")) + .build()); return; } @@ -138,11 +137,10 @@ private void freeze(Player freezee, Component senderName, boolean silent) { Audience.get(freezee).sendWarning(freezeTitle.build()); } else { Audience.get(freezee) - .showTitle( - title( - empty(), - freezeTitle.build(), - Times.of(Ticks.duration(5), Ticks.duration(9999), Ticks.duration(5)))); + .showTitle(title( + empty(), + freezeTitle.build(), + Times.of(Ticks.duration(5), Ticks.duration(9999), Ticks.duration(5)))); } Audience.get(freezee).playSound(FREEZE_SOUND); @@ -172,15 +170,13 @@ private void thaw(Player freezee, Component senderName, boolean silent) { private Component createInteractiveBroadcast( Component senderName, Player freezee, boolean frozen) { return text() - .append( - translatable( - String.format("moderation.freeze.broadcast.%s", frozen ? "frozen" : "thaw"), - NamedTextColor.GRAY, - senderName, - PlayerComponent.player(freezee, NameStyle.FANCY))) - .hoverEvent( - HoverEvent.showText( - translatable("moderation.freeze.broadcast.hover", NamedTextColor.GRAY))) + .append(translatable( + String.format("moderation.freeze.broadcast.%s", frozen ? "frozen" : "thaw"), + NamedTextColor.GRAY, + senderName, + PlayerComponent.player(freezee, NameStyle.FANCY))) + .hoverEvent(HoverEvent.showText( + translatable("moderation.freeze.broadcast.hover", NamedTextColor.GRAY))) .clickEvent(ClickEvent.runCommand("/f " + freezee.getName())) .build(); } diff --git a/src/main/java/dev/pgm/community/friends/FriendRequestStatus.java b/core/src/main/java/dev/pgm/community/friends/FriendRequestStatus.java similarity index 100% rename from src/main/java/dev/pgm/community/friends/FriendRequestStatus.java rename to core/src/main/java/dev/pgm/community/friends/FriendRequestStatus.java diff --git a/src/main/java/dev/pgm/community/friends/Friendship.java b/core/src/main/java/dev/pgm/community/friends/Friendship.java similarity index 100% rename from src/main/java/dev/pgm/community/friends/Friendship.java rename to core/src/main/java/dev/pgm/community/friends/Friendship.java diff --git a/src/main/java/dev/pgm/community/friends/FriendshipConfig.java b/core/src/main/java/dev/pgm/community/friends/FriendshipConfig.java similarity index 100% rename from src/main/java/dev/pgm/community/friends/FriendshipConfig.java rename to core/src/main/java/dev/pgm/community/friends/FriendshipConfig.java diff --git a/core/src/main/java/dev/pgm/community/friends/commands/FriendshipCommand.java b/core/src/main/java/dev/pgm/community/friends/commands/FriendshipCommand.java new file mode 100644 index 00000000..1ecf235a --- /dev/null +++ b/core/src/main/java/dev/pgm/community/friends/commands/FriendshipCommand.java @@ -0,0 +1,481 @@ +package dev.pgm.community.friends.commands; + +import static net.kyori.adventure.text.Component.space; +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.Component.translatable; +import static tc.oc.pgm.util.text.TemporalComponent.duration; +import static tc.oc.pgm.util.text.TemporalComponent.relativePastApproximate; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.Sets; +import dev.pgm.community.Community; +import dev.pgm.community.CommunityCommand; +import dev.pgm.community.CommunityPermissions; +import dev.pgm.community.commands.player.TargetPlayer; +import dev.pgm.community.friends.Friendship; +import dev.pgm.community.friends.feature.FriendshipFeature; +import dev.pgm.community.nick.feature.NickFeature; +import dev.pgm.community.sessions.Session; +import dev.pgm.community.users.UserProfile; +import dev.pgm.community.users.feature.UsersFeature; +import dev.pgm.community.utils.BroadcastUtils; +import dev.pgm.community.utils.CommandAudience; +import dev.pgm.community.utils.PaginatedComponentResults; +import dev.pgm.community.utils.VisibilityUtils; +import java.time.Duration; +import java.time.Instant; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import tc.oc.pgm.lib.org.incendo.cloud.annotations.Argument; +import tc.oc.pgm.lib.org.incendo.cloud.annotations.Command; +import tc.oc.pgm.lib.org.incendo.cloud.annotations.CommandDescription; +import tc.oc.pgm.lib.org.incendo.cloud.annotations.Default; +import tc.oc.pgm.lib.org.incendo.cloud.annotations.Permission; +import tc.oc.pgm.util.Audience; +import tc.oc.pgm.util.named.NameStyle; +import tc.oc.pgm.util.player.PlayerComponent; +import tc.oc.pgm.util.text.TextFormatter; + +@Command("friend|friendship|fs|friends") +public class FriendshipCommand extends CommunityCommand { + + private final FriendshipFeature friends; + private final UsersFeature users; + private final NickFeature nicks; + + public FriendshipCommand() { + this.friends = Community.get().getFeatures().getFriendships(); + this.users = Community.get().getFeatures().getUsers(); + this.nicks = Community.get().getFeatures().getNick(); + } + + @Command("[page]") + @CommandDescription("View a list of your friends") + @Permission(CommunityPermissions.FRIENDSHIP) + public void list( + CommandAudience sender, Player player, @Argument("page") @Default("1") int page) { + friends.getFriends(sender.getPlayer().getUniqueId()).thenAcceptAsync(frs -> { + sendFriendList(sender, frs, page); + }); + } + + @Command("requests [page]") + @CommandDescription("View a list of your pending friend requests") + @Permission(CommunityPermissions.FRIENDSHIP) + public void requests( + CommandAudience sender, Player player, @Argument("page") @Default("1") int page) { + friends.getIncomingRequests(sender.getPlayer().getUniqueId()).thenAcceptAsync(requests -> { + sendRequestsList(sender, requests, page); + }); + } + + @Command("add ") + @CommandDescription("Sends a friend request to another player") + @Permission(CommunityPermissions.FRIENDSHIP) + public void add(CommandAudience sender, Player player, @Argument("player") TargetPlayer target) { + // Handle disguised players with fake requests + Player nicked = nicks.getPlayerFromNick(target.getIdentifier()); + if (nicked != null) { + FakeRequests fake = fakeRequests.getUnchecked(sender.getId().get()); + String fullName = nicks.getOnlineNick(nicked.getUniqueId()); + Component fancyName = PlayerComponent.player(nicked, NameStyle.FANCY); + + if (fake.hasRequest(fullName)) { + sender.sendWarning(text("You have already sent a friend request to ") + .append(fancyName) + .color(NamedTextColor.GRAY)); + return; + } else { + fake.addRequest(fullName); + sender.sendMessage( + text("Friend request sent to ").append(fancyName).color(NamedTextColor.GRAY)); + return; + } + } + + getTarget(target.getIdentifier(), users).thenAcceptAsync(storedId -> { + if (storedId.isPresent()) { + if (sender.getId().equals(storedId)) { + sender.sendWarning(text("You may not friend yourself...")); + return; + } + + friends + .addFriend(sender.getPlayer().getUniqueId(), storedId.get()) + .thenAcceptAsync(status -> { + users + .renderUsername(Optional.of(storedId.get()), NameStyle.FANCY) + .thenAcceptAsync(name -> { + switch (status) { + case ACCEPTED_EXISTING: + sender.sendMessage(text("You accepted ") + .append(name) + .append(text("'s friend request!")) + .color(NamedTextColor.GREEN)); + break; + case EXISTING: + if (friends + .areFriends(sender.getPlayer().getUniqueId(), storedId.get()) + .join()) { + sender.sendWarning( + text("You are already friends with ").append(name)); + } else { + sender.sendWarning(text("You have already sent a friend request to ") + .append(name) + .color(NamedTextColor.GRAY)); + } + break; + case PENDING: + sender.sendMessage(text("Friend request sent to ") + .append(name) + .color(NamedTextColor.GRAY)); + break; + default: + sender.sendWarning(text("Could not send a friend request to ") + .append(name) + .color(NamedTextColor.GRAY)); + break; + } + }); + }); + } else { + sender.sendWarning(formatNotFoundComponent(target.getIdentifier())); + } + }); + } + + @Command("remove ") + @CommandDescription("Unfriend the input user") + @Permission(CommunityPermissions.FRIENDSHIP) + public void remove( + CommandAudience sender, Player player, @Argument("player") TargetPlayer target) { + getTarget(target.getIdentifier(), users).thenAcceptAsync(storedId -> { + if (storedId.isPresent()) { + if (sender.getId().equals(storedId)) { + sender.sendWarning(text("You may not unfriend yourself...")); + return; + } + + UUID targetId = storedId.get(); + friends.getFriends(sender.getPlayer().getUniqueId()).thenAcceptAsync(friendList -> { + Optional existing = + friendList.stream().filter(fr -> fr.isInvolved(targetId)).findAny(); + users.renderUsername(storedId, NameStyle.FANCY).thenAcceptAsync(name -> { + if (existing.isPresent()) { + friends.rejectFriendship(existing.get()); + sender.sendMessage(text("You have removed ") + .append(name) + .append(text(" as a friend")) + .color(NamedTextColor.GRAY)); + } else { + sender.sendWarning(text("You are not friends with ").append(name)); + } + }); + }); + } else { + sender.sendWarning(formatNotFoundComponent(target.getIdentifier())); + } + }); + } + + @Command("accept ") + @CommandDescription("Accept an incoming friend request") + @Permission(CommunityPermissions.FRIENDSHIP) + public void acceptRequest( + CommandAudience sender, Player player, @Argument("username") String target) { + getTarget(target, users).thenAcceptAsync(storedId -> { + if (storedId.isPresent()) { + List requests = + friends.getIncomingRequests(sender.getPlayer().getUniqueId()).join(); + if (requests.isEmpty()) { + sender.sendWarning(text("You have no pending friend requests")); + return; + } + + Optional pending = requests.stream() + .filter(fr -> fr.getRequesterId().equals(storedId.get())) + .findAny(); + + users.renderUsername(storedId, NameStyle.FANCY).thenAcceptAsync(name -> { + if (pending.isPresent()) { + friends.acceptFriendship(pending.get()); + sender.sendMessage(text("You accepted ") + .append(name) + .append(text("'s friend request!")) + .color(NamedTextColor.GREEN)); + + // Notify online requester + Player onlineFriend = Bukkit.getPlayer(storedId.get()); + if (onlineFriend != null && !VisibilityUtils.isDisguised(sender.getPlayer())) { + Audience.get(onlineFriend) + .sendMessage(text() + .append(sender.getStyledName()) + .append(text(" has accepted your friend request!", NamedTextColor.GREEN))); + } + + } else { + sender.sendWarning(text("You don't have a pending friend request from ") + .append(name) + .color(NamedTextColor.GRAY)); + } + }); + + } else { + sender.sendWarning(formatNotFoundComponent(target)); + } + }); + } + + @Command("reject ") + @Permission(CommunityPermissions.FRIENDSHIP) + public void rejectRequest( + CommandAudience sender, Player player, @Argument("player") TargetPlayer target) { + getTarget(target.getIdentifier(), users).thenAcceptAsync(storedId -> { + if (storedId.isPresent()) { + List requests = + friends.getIncomingRequests(sender.getPlayer().getUniqueId()).join(); + if (requests.isEmpty()) { + sender.sendWarning(text("You have no pending friend requests")); + return; + } + + Optional pending = requests.stream() + .filter(fr -> fr.getRequesterId().equals(storedId.get())) + .findAny(); + users.renderUsername(storedId, NameStyle.FANCY).thenAcceptAsync(name -> { + if (pending.isPresent()) { + friends.rejectFriendship(pending.get()); + sender.sendMessage(text("You have rejected ") + .append(name) + .append(text("'s friend request")) + .color(NamedTextColor.GRAY)); + return; + } else { + sender.sendWarning(text("You don't have a pending friend request from ") + .append(name) + .color(NamedTextColor.GRAY)); + } + }); + } else { + sender.sendWarning(formatNotFoundComponent(target.getIdentifier())); + } + }); + } + + private void sendRequestsList(CommandAudience audience, List requests, int page) { + Collections.sort(requests); // Sorted by most recent request + + Component headerResultCount = text(Integer.toString(requests.size()), NamedTextColor.RED); + + int perPage = 9; + int pages = (requests.size() + perPage - 1) / perPage; + page = Math.max(1, Math.min(page, pages)); + + NamedTextColor featureColor = NamedTextColor.YELLOW; + + Component pageNum = translatable( + "command.simplePageHeader", + NamedTextColor.GRAY, + text(Integer.toString(page), featureColor), + text(Integer.toString(pages), featureColor)); + + Component header = text("Friend Requests", featureColor) + .append(text(" (") + .append(headerResultCount) + .append(text(") ยป ")) + .append(pageNum) + .color(NamedTextColor.GRAY)); + + Component formattedHeader = TextFormatter.horizontalLineHeading( + audience.getSender(), header, NamedTextColor.DARK_GREEN); + new PaginatedComponentResults(formattedHeader, perPage) { + + @Override + public Component format(Friendship data, int index) { + // [Name] > [ time since requested ] [buttons to accept/reject] + Component name = users + .renderUsername( + data.getOtherPlayer(audience.getPlayer().getUniqueId()), NameStyle.FANCY) + .join(); + + return text() + .append(name) + .append(space()) + .append(BroadcastUtils.RIGHT_DIV.color(NamedTextColor.GOLD)) + .append(text(" Sent ")) + .append(relativePastApproximate(data.getRequestDate()).color(NamedTextColor.DARK_AQUA)) + .append(space()) + .append(FriendshipFeature.createAcceptButton(data.getRequesterId().toString())) + .append(space()) + .append(FriendshipFeature.createRejectButton(data.getRequesterId().toString())) + .color(NamedTextColor.GRAY) + .build(); + } + + @Override + public Component formatEmpty() { + // TODO: Translate + return text("You have no pending friend requests", NamedTextColor.RED); + } + }.display(audience.getAudience(), requests, page); + } + + private void sendFriendList(CommandAudience audience, List friends, int page) { + Collections.sort(friends, new Comparator() { + @Override + public int compare(Friendship o1, Friendship o2) { + UUID f1 = o1.getOtherPlayer(audience.getPlayer().getUniqueId()); + UUID f2 = o2.getOtherPlayer(audience.getPlayer().getUniqueId()); + + UserProfile friend1 = users.getStoredProfile(f1).join(); + UserProfile friend2 = users.getStoredProfile(f2).join(); + + boolean isStaff = audience.getSender().hasPermission(CommunityPermissions.STAFF); + Session session1 = friend1.getLatestSession(!isStaff).join(); + Session session2 = friend2.getLatestSession(!isStaff).join(); + + Player online1 = Bukkit.getPlayer(f1); + Player online2 = Bukkit.getPlayer(f2); + + boolean canSee1 = canSee(online1, audience); + boolean canSee2 = canSee(online2, audience); + + // Sort online friends before offline friends + if (canSee1 && !canSee2) { + return -1; + } else if (canSee2 && !canSee1) { + return 1; + } + + return -session1.getLatestUpdateDate().compareTo(session2.getLatestUpdateDate()); + } + }); + + Component headerResultCount = + text(Integer.toString(friends.size()), NamedTextColor.LIGHT_PURPLE); + + int perPage = 10; + int pages = (friends.size() + perPage - 1) / perPage; + page = Math.max(1, Math.min(page, pages)); + + NamedTextColor featureColor = NamedTextColor.DARK_PURPLE; + + Component pageNum = translatable( + "command.simplePageHeader", + NamedTextColor.GRAY, + text(Integer.toString(page), featureColor), + text(Integer.toString(pages), featureColor)); + + Component header = text("Friends", featureColor) + .append(text(" (").append(headerResultCount).append(text(") ยป ")).append(pageNum)) + .color(NamedTextColor.GRAY); + + Component formattedHeader = TextFormatter.horizontalLineHeading( + audience.getSender(), header, NamedTextColor.DARK_GREEN); + new PaginatedComponentResults(formattedHeader, perPage) { + + @Override + public Component format(Friendship data, int index) { + Component name = users + .renderUsername( + data.getOtherPlayer(audience.getPlayer().getUniqueId()), NameStyle.FANCY) + .join(); + + TextComponent.Builder builder = text() + .append(name) + .append(space()) + .append(BroadcastUtils.RIGHT_DIV.color(NamedTextColor.GOLD)) + .append(renderOnlineStatus( + data.getOtherPlayer(audience.getPlayer().getUniqueId()), audience) + .join()); + + if (data.getLastUpdated() != null) { + Component hover = text("Friends for ", NamedTextColor.GRAY) + .append(duration(Duration.between(data.getLastUpdated(), Instant.now())) + .color(NamedTextColor.AQUA)); + builder.hoverEvent(HoverEvent.showText(hover)); + } + + return builder.build(); + } + + @Override + public Component formatEmpty() { + // TODO: Translate + return text("You have no friends yet... :(", NamedTextColor.RED); + } + }.display(audience.getAudience(), friends, page); + } + + private CompletableFuture renderOnlineStatus(UUID playerId, CommandAudience viewer) { + boolean staff = viewer.getSender().hasPermission(CommunityPermissions.STAFF); + CompletableFuture future = new CompletableFuture(); + users.findUserWithSession(playerId, !staff, (profile, session) -> { + boolean online = !session.hasEnded(); + boolean vanished = session.isDisguised(); + boolean visible = online && (!vanished || staff); + + Component status = (visible + ? duration(Duration.between(session.getLatestUpdateDate(), Instant.now())) + : relativePastApproximate(session.getLatestUpdateDate())) + .color(visible ? NamedTextColor.GREEN : NamedTextColor.DARK_GREEN); + future.complete(text(visible ? " Online for " : " Last seen ") + .append(status) + .append(text(session.isOnThisServer() ? "" : " on ")) + .append(text(session.isOnThisServer() ? "" : session.getServerName()) + .color(online ? NamedTextColor.GREEN : NamedTextColor.DARK_GREEN)) + .color(NamedTextColor.GRAY)); + }); + + return future; + } + + private boolean canSee(Player player, CommandAudience viewer) { + if (player == null) return false; + if (!viewer.isPlayer()) return true; + if (isDisguised(player)) { + if (Community.get().getFeatures().getNick().isNicked(player.getUniqueId()) + && player.hasPermission(CommunityPermissions.OVERRIDE)) { + return viewer.hasPermission(CommunityPermissions.OVERRIDE); + } + return viewer.hasPermission(CommunityPermissions.STAFF); + } + return true; + } + + private LoadingCache fakeRequests = CacheBuilder.newBuilder() + .expireAfterAccess(3, TimeUnit.HOURS) + .build(new CacheLoader() { + @Override + public FakeRequests load(UUID key) throws Exception { + return new FakeRequests(); + } + }); + + private class FakeRequests { + + private Set nicknames = Sets.newHashSet(); + + public boolean hasRequest(String nickname) { + return nicknames.contains(nickname); + } + + public void addRequest(String nickname) { + nicknames.add(nickname); + } + } +} diff --git a/src/main/java/dev/pgm/community/friends/feature/FriendshipFeature.java b/core/src/main/java/dev/pgm/community/friends/feature/FriendshipFeature.java similarity index 100% rename from src/main/java/dev/pgm/community/friends/feature/FriendshipFeature.java rename to core/src/main/java/dev/pgm/community/friends/feature/FriendshipFeature.java diff --git a/src/main/java/dev/pgm/community/friends/feature/FriendshipFeatureBase.java b/core/src/main/java/dev/pgm/community/friends/feature/FriendshipFeatureBase.java similarity index 76% rename from src/main/java/dev/pgm/community/friends/feature/FriendshipFeatureBase.java rename to core/src/main/java/dev/pgm/community/friends/feature/FriendshipFeatureBase.java index 4dcfaddd..dcff1737 100644 --- a/src/main/java/dev/pgm/community/friends/feature/FriendshipFeatureBase.java +++ b/core/src/main/java/dev/pgm/community/friends/feature/FriendshipFeatureBase.java @@ -25,7 +25,8 @@ public abstract class FriendshipFeatureBase extends FeatureBase implements FriendshipFeature { - @Nullable protected PGMFriendIntegration integration; + @Nullable + protected PGMFriendIntegration integration; public FriendshipFeatureBase(Configuration config, Logger logger, String featureName) { super(new FriendshipConfig(config), logger, featureName); @@ -48,19 +49,17 @@ public void enable() { } public void sendFriendRequestLoginMessage(Player player, int requestCount) { - Component requestsMessage = - text() - .append(BroadcastUtils.RIGHT_DIV.color(NamedTextColor.GOLD)) - .append(text(" You have ")) - .append(text(requestCount, NamedTextColor.DARK_AQUA, TextDecoration.BOLD)) - .append(text(" pending friend request" + (requestCount != 1 ? "s " : " "))) - .append(BroadcastUtils.LEFT_DIV.color(NamedTextColor.GOLD)) - .color(NamedTextColor.DARK_GREEN) - .hoverEvent( - HoverEvent.showText( - text("Click to view pending friend requests", NamedTextColor.GRAY))) - .clickEvent(ClickEvent.runCommand("/friend requests")) - .build(); + Component requestsMessage = text() + .append(BroadcastUtils.RIGHT_DIV.color(NamedTextColor.GOLD)) + .append(text(" You have ")) + .append(text(requestCount, NamedTextColor.DARK_AQUA, TextDecoration.BOLD)) + .append(text(" pending friend request" + (requestCount != 1 ? "s " : " "))) + .append(BroadcastUtils.LEFT_DIV.color(NamedTextColor.GOLD)) + .color(NamedTextColor.DARK_GREEN) + .hoverEvent( + HoverEvent.showText(text("Click to view pending friend requests", NamedTextColor.GRAY))) + .clickEvent(ClickEvent.runCommand("/friend requests")) + .build(); Audience.get(player).sendMessage(requestsMessage); Audience.get(player).playSound(Sounds.FRIEND_REQUEST_LOGIN); diff --git a/src/main/java/dev/pgm/community/friends/feature/PGMFriendIntegration.java b/core/src/main/java/dev/pgm/community/friends/feature/PGMFriendIntegration.java similarity index 100% rename from src/main/java/dev/pgm/community/friends/feature/PGMFriendIntegration.java rename to core/src/main/java/dev/pgm/community/friends/feature/PGMFriendIntegration.java diff --git a/core/src/main/java/dev/pgm/community/friends/feature/types/SQLFriendshipFeature.java b/core/src/main/java/dev/pgm/community/friends/feature/types/SQLFriendshipFeature.java new file mode 100644 index 00000000..bb4e4f1c --- /dev/null +++ b/core/src/main/java/dev/pgm/community/friends/feature/types/SQLFriendshipFeature.java @@ -0,0 +1,168 @@ +package dev.pgm.community.friends.feature.types; + +import static net.kyori.adventure.text.Component.space; +import static net.kyori.adventure.text.Component.text; + +import dev.pgm.community.friends.FriendRequestStatus; +import dev.pgm.community.friends.Friendship; +import dev.pgm.community.friends.Friendship.FriendshipStatus; +import dev.pgm.community.friends.feature.FriendshipFeature; +import dev.pgm.community.friends.feature.FriendshipFeatureBase; +import dev.pgm.community.friends.services.SQLFriendshipService; +import dev.pgm.community.users.feature.UsersFeature; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.configuration.Configuration; +import org.bukkit.entity.Player; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import tc.oc.pgm.util.Audience; +import tc.oc.pgm.util.named.NameStyle; + +public class SQLFriendshipFeature extends FriendshipFeatureBase { + + private final SQLFriendshipService service; + private final UsersFeature users; + + public SQLFriendshipFeature(Configuration config, Logger logger, UsersFeature users) { + super(config, logger, "Friends (SQL)"); + this.service = new SQLFriendshipService(); + this.users = users; + } + + @Override + public CompletableFuture> getFriends(UUID playerId) { + return service.queryList(playerId.toString()).thenApplyAsync(q -> q.stream() + .filter(fr -> fr.getStatus() == FriendshipStatus.ACCEPTED) + .collect(Collectors.toList())); + } + + @Override + public CompletableFuture> getIncomingRequests(UUID playerId) { + return service.queryList(playerId.toString()).thenApplyAsync(q -> q.stream() + .filter(fr -> + fr.getRequestedId().equals(playerId) && fr.getStatus() == FriendshipStatus.PENDING) + .collect(Collectors.toList())); + } + + @Override + public CompletableFuture addFriend(UUID sender, UUID target) { + return hasRequested(sender, target).thenApplyAsync(requested -> { + if (requested.isPresent()) { + Friendship pending = requested.get(); + // If target has already requested you, just accept the friendship + if (pending.getRequesterId().equals(target)) { + acceptFriendship(pending); + return FriendRequestStatus.ACCEPTED_EXISTING; + } + + return FriendRequestStatus.EXISTING; // Already requested + } + + // Can't add an existing friend ;) + if (areFriends(sender, target).join()) { + return FriendRequestStatus.EXISTING; + } + + Friendship request = new Friendship(sender, target); + service.save(request); + + if (Bukkit.getPlayer(target) != null) { + Player targetPlayer = Bukkit.getPlayer(target); + + Component senderName = + users.renderUsername(Optional.of(sender), NameStyle.FANCY).join(); + Component accept = FriendshipFeature.createAcceptButton(sender.toString()); + Component reject = FriendshipFeature.createRejectButton(sender.toString()); + + Component requestMsg = text() + .append(senderName) + .append(text(" has requested to be your friend. ")) + .append(accept) + .append(space()) + .append(reject) + .color(NamedTextColor.GOLD) + .build(); + + Audience.get(targetPlayer).sendMessage(requestMsg); + // TODO: play sound too? + } + + return FriendRequestStatus.PENDING; + }); + } + + @Override + public CompletableFuture areFriends(UUID sender, UUID target) { + return service.queryList(sender.toString()).thenApplyAsync(frs -> frs.stream() + .anyMatch( + fr -> fr.areInvolved(sender, target) && fr.getStatus() == FriendshipStatus.ACCEPTED)); + } + + @Override + public CompletableFuture> hasRequested(UUID sender, UUID target) { + return service.queryList(target.toString()).thenApplyAsync(frs -> frs.stream() + .filter(fr -> fr.areInvolved(sender, target) && fr.getStatus() == FriendshipStatus.PENDING) + .findAny()); + } + + @Override + public void onPreLogin(AsyncPlayerPreLoginEvent event) { + updateFriendships(event.getUniqueId()); + } + + @Override + public void onDelayedLogin(PlayerJoinEvent event) { + getIncomingRequests(event.getPlayer().getUniqueId()).thenAcceptAsync(requests -> { + if (!requests.isEmpty()) { + sendFriendRequestLoginMessage(event.getPlayer(), requests.size()); + } + }); + } + + @Override + public void acceptFriendship(Friendship friendship) { + service.updateFriendshipStatus(friendship, true); + update(friendship); + } + + @Override + public void rejectFriendship(Friendship friendship) { + service.updateFriendshipStatus(friendship, false); + update(friendship); + } + + public boolean isFriend(UUID sender, UUID target) { + return integration.isFriend(sender, target); + } + + public void update(Friendship friendship) { + updateFriendships(friendship.getRequestedId()); + updateFriendships(friendship.getRequesterId()); + } + + @Override + public void updateFriendships(UUID playerId) { + getFriends(playerId).thenAcceptAsync(friends -> { + Set friendIds = + friends.stream().map(f -> f.getOtherPlayer(playerId)).collect(Collectors.toSet()); + // Sends updated friendship status to PGM for hook-in + if (integration != null) { + integration.setFriends(playerId, friendIds); + integration.callUpdateEvents(playerId, friendIds); + } + }); + } + + public CompletableFuture count() { + return service.count(); + } +} diff --git a/core/src/main/java/dev/pgm/community/friends/services/FriendshipQuery.java b/core/src/main/java/dev/pgm/community/friends/services/FriendshipQuery.java new file mode 100644 index 00000000..0d3a8453 --- /dev/null +++ b/core/src/main/java/dev/pgm/community/friends/services/FriendshipQuery.java @@ -0,0 +1,22 @@ +package dev.pgm.community.friends.services; + +public interface FriendshipQuery { + + static final String TABLE_NAME = "friendships"; + static final String TABLE_FIELDS = "(id VARCHAR(36) PRIMARY KEY, " + + "requester VARCHAR(36), " + + "requested VARCHAR(36), " + + "status VARCHAR(8), " + + "requestDate LONG, " + + "updateDate LONG)"; + + static final String INSERT_FRIENDSHIP_QUERY = "INSERT INTO " + + TABLE_NAME + + "(id, requester, requested, status, requestDate, updateDate) VALUES (?, ?, ?, ?, ?, ?)"; + + static final String SELECT_FRIENDSHIPS_QUERY = + "SELECT * from " + TABLE_NAME + " where (requester = ? OR requested = ?)"; + + static final String UPDATE_FRIENDSHIP_QUERY = + "UPDATE " + TABLE_NAME + " SET status = ?, updateDate = ? WHERE id = ? "; +} diff --git a/src/main/java/dev/pgm/community/friends/services/SQLFriendshipService.java b/core/src/main/java/dev/pgm/community/friends/services/SQLFriendshipService.java similarity index 69% rename from src/main/java/dev/pgm/community/friends/services/SQLFriendshipService.java rename to core/src/main/java/dev/pgm/community/friends/services/SQLFriendshipService.java index 6b14882c..ec87992b 100644 --- a/src/main/java/dev/pgm/community/friends/services/SQLFriendshipService.java +++ b/core/src/main/java/dev/pgm/community/friends/services/SQLFriendshipService.java @@ -23,15 +23,13 @@ public class SQLFriendshipService extends SQLFeatureBase public SQLFriendshipService() { super(TABLE_NAME, TABLE_FIELDS); - this.friendshipCache = - CacheBuilder.newBuilder() - .build( - new CacheLoader() { - @Override - public PlayerFriendships load(UUID key) throws Exception { - return new PlayerFriendships(key); - } - }); + this.friendshipCache = CacheBuilder.newBuilder() + .build(new CacheLoader() { + @Override + public PlayerFriendships load(UUID key) throws Exception { + return new PlayerFriendships(key); + } + }); } @Override @@ -97,35 +95,33 @@ public CompletableFuture> queryList(String target) { return CompletableFuture.completedFuture(new ArrayList<>(playerFriendships.getFriendships())); } else { return DB.getResultsAsync(SELECT_FRIENDSHIPS_QUERY, playerId.toString(), playerId.toString()) - .thenApplyAsync( - results -> { - if (results != null) { - for (DbRow row : results) { - String id = row.getString("id"); - String requester = row.getString("requester"); - String requested = row.getString("requested"); - String status = row.getString("status"); - long requestDate = Long.parseLong(row.getString("requestDate")); - long updateDate = Long.parseLong(row.getString("updateDate")); - - Instant requestInstant = Instant.ofEpochMilli(requestDate); - Instant updateInstant = Instant.ofEpochMilli(updateDate); - - playerFriendships - .getFriendships() - .add( - new Friendship( - UUID.fromString(id), - UUID.fromString(requester), - UUID.fromString(requested), - FriendshipStatus.valueOf(status.toUpperCase()), - requestInstant, - updateInstant)); - } - } - playerFriendships.setLoaded(true); - return new ArrayList<>(playerFriendships.getFriendships()); - }); + .thenApplyAsync(results -> { + if (results != null) { + for (DbRow row : results) { + String id = row.getString("id"); + String requester = row.getString("requester"); + String requested = row.getString("requested"); + String status = row.getString("status"); + long requestDate = Long.parseLong(row.getString("requestDate")); + long updateDate = Long.parseLong(row.getString("updateDate")); + + Instant requestInstant = Instant.ofEpochMilli(requestDate); + Instant updateInstant = Instant.ofEpochMilli(updateDate); + + playerFriendships + .getFriendships() + .add(new Friendship( + UUID.fromString(id), + UUID.fromString(requester), + UUID.fromString(requested), + FriendshipStatus.valueOf(status.toUpperCase()), + requestInstant, + updateInstant)); + } + } + playerFriendships.setLoaded(true); + return new ArrayList<>(playerFriendships.getFriendships()); + }); } } diff --git a/src/main/java/dev/pgm/community/info/InfoCommandConfig.java b/core/src/main/java/dev/pgm/community/info/InfoCommandConfig.java similarity index 75% rename from src/main/java/dev/pgm/community/info/InfoCommandConfig.java rename to core/src/main/java/dev/pgm/community/info/InfoCommandConfig.java index 2b30dde9..30184e3b 100644 --- a/src/main/java/dev/pgm/community/info/InfoCommandConfig.java +++ b/core/src/main/java/dev/pgm/community/info/InfoCommandConfig.java @@ -23,9 +23,8 @@ public Set getInfoCommands() { @Override public void reload(Configuration config) { super.reload(config); - this.commands = - config.getConfigurationSection(KEY).getKeys(false).stream() - .map(key -> InfoCommandData.of(config.getConfigurationSection(KEY + "." + key))) - .collect(Collectors.toSet()); + this.commands = config.getConfigurationSection(KEY).getKeys(false).stream() + .map(key -> InfoCommandData.of(config.getConfigurationSection(KEY + "." + key))) + .collect(Collectors.toSet()); } } diff --git a/src/main/java/dev/pgm/community/info/InfoCommandData.java b/core/src/main/java/dev/pgm/community/info/InfoCommandData.java similarity index 100% rename from src/main/java/dev/pgm/community/info/InfoCommandData.java rename to core/src/main/java/dev/pgm/community/info/InfoCommandData.java diff --git a/src/main/java/dev/pgm/community/info/InfoCommandsFeature.java b/core/src/main/java/dev/pgm/community/info/InfoCommandsFeature.java similarity index 81% rename from src/main/java/dev/pgm/community/info/InfoCommandsFeature.java rename to core/src/main/java/dev/pgm/community/info/InfoCommandsFeature.java index 577ce45d..0f573bff 100644 --- a/src/main/java/dev/pgm/community/info/InfoCommandsFeature.java +++ b/core/src/main/java/dev/pgm/community/info/InfoCommandsFeature.java @@ -23,13 +23,13 @@ public InfoCommandConfig getInfoConfig() { public void onPlayerCommandProcess(PlayerCommandPreprocessEvent event) { // We dynamically check for defined commands, and send the related feedback getInfoConfig().getInfoCommands().stream() - .filter(c -> event.getMessage().toLowerCase().startsWith("/" + c.getName().toLowerCase())) + .filter( + c -> event.getMessage().toLowerCase().startsWith("/" + c.getName().toLowerCase())) .findAny() - .ifPresent( - command -> { - command.sendCommand(event.getPlayer()); - event.setCancelled(true); - }); + .ifPresent(command -> { + command.sendCommand(event.getPlayer()); + event.setCancelled(true); + }); } @Override diff --git a/src/main/java/dev/pgm/community/menu/CommunityInventoryProvider.java b/core/src/main/java/dev/pgm/community/menu/CommunityInventoryProvider.java similarity index 100% rename from src/main/java/dev/pgm/community/menu/CommunityInventoryProvider.java rename to core/src/main/java/dev/pgm/community/menu/CommunityInventoryProvider.java diff --git a/src/main/java/dev/pgm/community/menu/MapSelectionMenu.java b/core/src/main/java/dev/pgm/community/menu/MapSelectionMenu.java similarity index 77% rename from src/main/java/dev/pgm/community/menu/MapSelectionMenu.java rename to core/src/main/java/dev/pgm/community/menu/MapSelectionMenu.java index 8fd7ed19..de3cdaf2 100644 --- a/src/main/java/dev/pgm/community/menu/MapSelectionMenu.java +++ b/core/src/main/java/dev/pgm/community/menu/MapSelectionMenu.java @@ -6,6 +6,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import dev.pgm.community.Community; +import dev.pgm.community.utils.platform.CommunityMaterials; import fr.minuskube.inv.ClickableItem; import fr.minuskube.inv.SmartInventory; import fr.minuskube.inv.content.InventoryContents; @@ -20,13 +21,14 @@ import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.DyeColor; import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import tc.oc.pgm.api.map.MapInfo; import tc.oc.pgm.api.map.MapTag; +import tc.oc.pgm.util.bukkit.Enchantments; import tc.oc.pgm.util.inventory.ItemBuilder; +import tc.oc.pgm.util.material.Materials; import tc.oc.pgm.util.text.TextFormatter; import tc.oc.pgm.util.text.TextTranslations; @@ -57,12 +59,11 @@ public MapSelectionMenu(String title, List maps, Player viewer) { } public SmartInventory getInventory(SmartInventory parent) { - SmartInventory.Builder builder = - SmartInventory.builder() - .title(colorize(title)) - .provider(this) - .manager(Community.get().getInventory()) - .size(ROWS, 9); + SmartInventory.Builder builder = SmartInventory.builder() + .title(colorize(title)) + .provider(this) + .manager(Community.get().getInventory()) + .size(ROWS, 9); if (parent != null) { builder.parent(parent); @@ -136,7 +137,8 @@ public Material getMapMaterial(MapInfo map) { return map.getTags().isEmpty() || !map.getTags().stream().filter(tag -> tag.isGamemode()).findAny().isPresent() ? Material.MAP - : getMapTagMaterial(map.getTags().stream().filter(tag -> tag.isGamemode()).findAny().get()); + : getMapTagMaterial( + map.getTags().stream().filter(tag -> tag.isGamemode()).findAny().get()); } private List getMapItems(List maps) { @@ -144,47 +146,41 @@ private List getMapItems(List maps) { } private List getFilteredMapItems() { - return getMapItems( - maps.stream() - .filter( - map -> { - if (viewAll) return true; - - Collection tags = map.getTags(); - return tags != null && tags.contains(getFilterTag()); - }) - .collect(Collectors.toList())); + return getMapItems(maps.stream() + .filter(map -> { + if (viewAll) return true; + + Collection tags = map.getTags(); + return tags != null && tags.contains(getFilterTag()); + }) + .collect(Collectors.toList())); } private ClickableItem getNoMapsIcon() { - return ClickableItem.empty( - new ItemBuilder() - .material(Material.STAINED_GLASS_PANE) - .color(DyeColor.RED) - .name(colorize("&cNo Maps found")) - .lore(colorize("&7Check &b/maps &7for details")) - .flags(ItemFlag.values()) - .build()); + return ClickableItem.empty(new ItemBuilder() + .material(Materials.STAINED_GLASS_PANE) + .color(DyeColor.RED) + .name(colorize("&cNo Maps found")) + .lore(colorize("&7Check &b/maps &7for details")) + .flags(ItemFlag.values()) + .build()); } private ClickableItem getAllIcon() { - ItemBuilder allItemBuilder = - new ItemBuilder() - .material(Material.BOOKSHELF) - .name(colorize((viewAll ? "&a" : "&c") + "View All")) - .lore(colorize(viewAll ? "&7Click to filter by map tags" : "&7Click to view all maps")) - .flags(ItemFlag.values()); + ItemBuilder allItemBuilder = new ItemBuilder() + .material(Material.BOOKSHELF) + .name(colorize((viewAll ? "&a" : "&c") + "View All")) + .lore(colorize(viewAll ? "&7Click to filter by map tags" : "&7Click to view all maps")) + .flags(ItemFlag.values()); if (viewAll) { - allItemBuilder.enchant(Enchantment.LUCK, 1); + allItemBuilder.enchant(Enchantments.LUCK_OF_THE_SEA, 1); } - return ClickableItem.of( - allItemBuilder.build(), - c -> { - this.viewAll = !viewAll; - getInventory().open(getViewer(), 0); - }); + return ClickableItem.of(allItemBuilder.build(), c -> { + this.viewAll = !viewAll; + getInventory().open(getViewer(), 0); + }); } private ClickableItem getFilterIcon() { @@ -200,7 +196,7 @@ private ClickableItem getFilterIcon() { colorize("&7Filter: &b" + (filterIndex + 1) + " &7/&3 " + tags.size()), colorize( "&7Total Maps: &a" + getFilteredMapItems().size() + " &7/&2 " + maps.size())) - .enchant(Enchantment.LUCK, 1) + .enchant(Enchantments.LUCK_OF_THE_SEA, 1) .flags(ItemFlag.values()) .build(), c -> { @@ -240,13 +236,13 @@ private Material getMapTagMaterial(MapTag mapTag) { case "ffa": return Material.DIAMOND_SWORD; case "border": - return Material.IRON_BARDING; + return CommunityMaterials.IRON_BARDING; case "wool": - return Material.WOOL; + return Materials.WOOL; case "controlpoint": return Material.BEACON; case "flag": - return Material.BANNER; + return CommunityMaterials.BANNER; case "classes": return Material.FISHING_ROD; case "deathmatch": @@ -254,9 +250,9 @@ private Material getMapTagMaterial(MapTag mapTag) { case "monument": return Material.DIAMOND_PICKAXE; case "4teams": - return Material.TRAP_DOOR; + return CommunityMaterials.TRAP_DOOR; case "timelimit": - return Material.WATCH; + return Materials.WATCH; case "autotnt": return Material.TNT; case "core": @@ -264,17 +260,17 @@ private Material getMapTagMaterial(MapTag mapTag) { case "blitz": return Material.EGG; case "scorebox": - return Material.WEB; + return Materials.WEB; case "6teams": - return Material.BED; + return CommunityMaterials.BED; case "rage": return Material.BOW; case "3teams": - return Material.WORKBENCH; + return Materials.WORKBENCH; case "terrain": - return Material.GRASS; + return Materials.SHORT_GRASS; case "8teams": - return Material.INK_SACK; + return Materials.DYE; default: return Material.MAP; } diff --git a/src/main/java/dev/pgm/community/menu/MenuItem.java b/core/src/main/java/dev/pgm/community/menu/MenuItem.java similarity index 100% rename from src/main/java/dev/pgm/community/menu/MenuItem.java rename to core/src/main/java/dev/pgm/community/menu/MenuItem.java diff --git a/src/main/java/dev/pgm/community/menu/PageableInventory.java b/core/src/main/java/dev/pgm/community/menu/PageableInventory.java similarity index 100% rename from src/main/java/dev/pgm/community/menu/PageableInventory.java rename to core/src/main/java/dev/pgm/community/menu/PageableInventory.java diff --git a/src/main/java/dev/pgm/community/menu/PlayerSelectionProvider.java b/core/src/main/java/dev/pgm/community/menu/PlayerSelectionProvider.java similarity index 97% rename from src/main/java/dev/pgm/community/menu/PlayerSelectionProvider.java rename to core/src/main/java/dev/pgm/community/menu/PlayerSelectionProvider.java index a7d8efe3..fbb2e8c7 100644 --- a/src/main/java/dev/pgm/community/menu/PlayerSelectionProvider.java +++ b/core/src/main/java/dev/pgm/community/menu/PlayerSelectionProvider.java @@ -23,6 +23,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; +import tc.oc.pgm.util.material.Materials; public abstract class PlayerSelectionProvider implements InventoryProvider { @@ -111,7 +112,7 @@ private ClickableItem getPlayerItem( } private ItemStack getPlayerHead(Player viewer, Player player) { - ItemStack head = new ItemStack(Material.SKULL_ITEM, 1, (byte) 3); + ItemStack head = new ItemStack(Materials.SKULL, 1, (byte) 3); SkullMeta meta = (SkullMeta) head.getItemMeta(); meta.setDisplayName(player.getDisplayName()); meta.setLore(getPlayerLore(viewer, player)); diff --git a/src/main/java/dev/pgm/community/menu/StaticMenuItem.java b/core/src/main/java/dev/pgm/community/menu/StaticMenuItem.java similarity index 100% rename from src/main/java/dev/pgm/community/menu/StaticMenuItem.java rename to core/src/main/java/dev/pgm/community/menu/StaticMenuItem.java diff --git a/src/main/java/dev/pgm/community/moderation/ModerationConfig.java b/core/src/main/java/dev/pgm/community/moderation/ModerationConfig.java similarity index 100% rename from src/main/java/dev/pgm/community/moderation/ModerationConfig.java rename to core/src/main/java/dev/pgm/community/moderation/ModerationConfig.java diff --git a/src/main/java/dev/pgm/community/moderation/commands/BanCommand.java b/core/src/main/java/dev/pgm/community/moderation/commands/BanCommand.java similarity index 58% rename from src/main/java/dev/pgm/community/moderation/commands/BanCommand.java rename to core/src/main/java/dev/pgm/community/moderation/commands/BanCommand.java index 26f30f88..ec98243d 100644 --- a/src/main/java/dev/pgm/community/moderation/commands/BanCommand.java +++ b/core/src/main/java/dev/pgm/community/moderation/commands/BanCommand.java @@ -51,22 +51,20 @@ public void permBan( @Argument("target") TargetPlayer target, @Argument("reason") @FlagYielding String reason, @Flag(value = "silent", aliases = "s") boolean silent) { - getTarget(target.getIdentifier(), usernames) - .thenAccept( - id -> { - if (id.isPresent()) { - moderation.punish( - PunishmentType.BAN, - id.get(), - audience, - reason, - null, - true, - isDisguised(audience) || silent); - } else { - audience.sendWarning(formatNotFoundComponent(target.getIdentifier())); - } - }); + getTarget(target.getIdentifier(), usernames).thenAccept(id -> { + if (id.isPresent()) { + moderation.punish( + PunishmentType.BAN, + id.get(), + audience, + reason, + null, + true, + isDisguised(audience) || silent); + } else { + audience.sendWarning(formatNotFoundComponent(target.getIdentifier())); + } + }); } @Command("tempban|tb