From 90c3cac5cf2a500ced5f92d42d083bb289ad416e Mon Sep 17 00:00:00 2001 From: loki5512344 Date: Sun, 5 Jul 2026 13:22:48 +0200 Subject: [PATCH] refactor: split god classes, fix OCP/ISP/SRP, migrate commands to BaseCommand hierarchy --- bin/main/com/loki/lochat/LoChat.class | Bin 5427 -> 3692 bytes .../loki/lochat/api/service/ChatService.class | Bin 316 -> 0 bytes .../lochat/api/service/MentionService.class | Bin 709 -> 0 bytes .../lochat/api/service/MessageService.class | Bin 212 -> 0 bytes .../lochat/api/service/MessagingService.class | Bin 1041 -> 0 bytes .../loki/lochat/api/service/MuteService.class | Bin 1503 -> 0 bytes .../loki/lochat/api/service/NickService.class | Bin 542 -> 0 bytes .../lochat/api/service/PlayerService.class | Bin 504 -> 0 bytes .../api/service/PunishmentService.class | Bin 813 -> 0 bytes .../loki/lochat/commands/CommandManager.class | Bin 6122 -> 6126 bytes .../admin/broadcast/AnnounceCommand.class | Bin 4437 -> 1145 bytes .../admin/broadcast/DiscordCommand.class | Bin 6166 -> 2634 bytes .../commands/admin/chat/ChatSpyCommand.class | Bin 2598 -> 1837 bytes .../admin/chat/ClearChatCommand.class | Bin 2490 -> 1057 bytes .../admin/chat/ClearChatConfigCommand.class | Bin 5257 -> 3040 bytes .../commands/admin/system/HubCommand.class | Bin 2526 -> 1037 bytes .../commands/admin/system/LoChatCommand.class | Bin 6055 -> 3203 bytes .../admin/system/ReloadConfigCommand.class | Bin 2720 -> 1066 bytes .../lochat/commands/base/BaseCommand.class | Bin 4322 -> 4085 bytes .../commands/chat/GlobalChatCommand.class | Bin 3468 -> 2311 bytes .../commands/chat/LocalChatCommand.class | Bin 2920 -> 1852 bytes .../commands/messaging/IgnoreCommand.class | Bin 3060 -> 2670 bytes .../messaging/IgnoreListCommand.class | Bin 3817 -> 2216 bytes .../commands/messaging/MsgCommand.class | Bin 4980 -> 3506 bytes .../commands/messaging/ReplyCommand.class | Bin 4945 -> 3041 bytes .../commands/messaging/UnignoreCommand.class | Bin 2970 -> 2490 bytes .../commands/moderation/ban/BanCommand.class | Bin 6911 -> 3325 bytes .../moderation/ban/UnbanCommand.class | Bin 4335 -> 2513 bytes .../moderation/mute/MuteBlameCommand.class | Bin 6257 -> 2329 bytes .../moderation/mute/MuteCommand.class | Bin 9009 -> 3511 bytes .../moderation/mute/MuteHistoryCommand.class | Bin 6621 -> 2689 bytes .../moderation/mute/MuteListCommand.class | Bin 4921 -> 1730 bytes .../moderation/mute/UnmuteCommand.class | Bin 5985 -> 2785 bytes .../moderation/warn/SilentWarnCommand.class | Bin 4945 -> 2434 bytes .../moderation/warn/WarnCommand.class | Bin 5503 -> 2696 bytes .../lochat/commands/nick/NickCommand.class | Bin 5666 -> 5483 bytes .../commands/nick/PlayerInfoCommand.class | Bin 9126 -> 3609 bytes .../loki/lochat/commands/rp/DoCommand.class | Bin 4415 -> 1713 bytes .../loki/lochat/commands/rp/MeCommand.class | Bin 4320 -> 1713 bytes .../loki/lochat/commands/rp/RollCommand.class | Bin 4996 -> 5000 bytes .../com/loki/lochat/commands/rp/RpUtil.class | Bin 2474 -> 2474 bytes .../loki/lochat/commands/rp/TryCommand.class | Bin 5093 -> 1754 bytes .../loki/lochat/config/AppearanceConfig.class | Bin 6948 -> 0 bytes .../loki/lochat/config/ConfigManager.class | Bin 7948 -> 8466 bytes .../loki/lochat/config/FiltersConfig.class | Bin 4966 -> 0 bytes .../loki/lochat/config/MessageConfig.class | Bin 4127 -> 0 bytes .../loki/lochat/config/MessagesConfig.class | Bin 9775 -> 0 bytes .../com/loki/lochat/config/MuteConfig.class | Bin 1976 -> 0 bytes .../com/loki/lochat/config/SoundsConfig.class | Bin 2176 -> 0 bytes .../loki/lochat/core/PluginInitializer.class | Bin 5668 -> 5378 bytes .../com/loki/lochat/core/PluginShutdown.class | Bin 2673 -> 2777 bytes .../lochat/core/factory/ServiceFactory.class | Bin 2259 -> 1064 bytes .../core/filter/AdvancedMessageFilter.class | Bin 5380 -> 4395 bytes .../lochat/core/filter/CooldownFilter.class | Bin 3057 -> 1566 bytes .../loki/lochat/core/filter/MuteFilter.class | Bin 2657 -> 1951 bytes .../core/filter/filters/SpamFilter.class | Bin 4688 -> 4708 bytes .../core/filter/filters/UrlFilter.class | Bin 4978 -> 4978 bytes .../core/registry/ServiceRegistry.class | Bin 4674 -> 4027 bytes .../lochat/core/service/ChatServiceImpl.class | Bin 7203 -> 0 bytes .../core/service/MentionServiceImpl.class | Bin 6080 -> 0 bytes .../core/service/MessageServiceImpl.class | Bin 2325 -> 0 bytes .../core/service/MessagingServiceImpl.class | Bin 3709 -> 0 bytes .../lochat/core/service/MuteServiceImpl.class | Bin 9132 -> 0 bytes .../lochat/core/service/NickServiceImpl.class | Bin 7166 -> 0 bytes .../core/service/PlayerServiceImpl.class | Bin 7285 -> 0 bytes .../service/PunishmentServiceImpl$1.class | Bin 893 -> 0 bytes ...shmentServiceImpl$PunishmentSnapshot.class | Bin 840 -> 0 bytes .../core/service/PunishmentServiceImpl.class | Bin 11224 -> 0 bytes .../service/messaging/IgnoreService.class | Bin 6503 -> 0 bytes .../messaging/PrivateMessageService.class | Bin 1534 -> 0 bytes .../core/service/messaging/SpyService.class | Bin 3724 -> 0 bytes .../mute/strategies/VoiceMuteStrategy.class | Bin 3936 -> 3940 bytes .../loki/lochat/data/model/BanRecord.class | Bin 1070 -> 1074 bytes .../loki/lochat/gradient/GradientModule.class | Bin 6805 -> 6829 bytes .../commands/GradientAdminCommand.class | Bin 11105 -> 11109 bytes .../handlers/PrefixCommandHandler.class | Bin 6739 -> 6743 bytes .../handlers/prefix/PrefixSetHandler.class | Bin 6508 -> 6512 bytes .../gradient/data/GradientDataManager.class | Bin 10376 -> 10384 bytes .../gui/GradientConfirmGUI$ConfirmType.class | Bin 1322 -> 1322 bytes .../gradient/gui/GradientConfirmGUI.class | Bin 10287 -> 10299 bytes .../listeners/GradientGUIListener.class | Bin 7148 -> 7162 bytes .../gradient/service/GradientService.class | Bin 1949 -> 1953 bytes .../gradient/service/PrefixService.class | Bin 4696 -> 4712 bytes .../gradient/util/DisplayNameUtil.class | Bin 5375 -> 5383 bytes .../lochat/gradient/util/GradientUtil.class | Bin 6998 -> 7018 bytes .../integrations/DiscordIntegration.class | Bin 3033 -> 3053 bytes .../lochat/integrations/DiscordWebhook.class | Bin 8739 -> 8791 bytes .../lochat/integrations/LibertyBansHook.class | Bin 1779 -> 1256 bytes .../integrations/PlaceholderAPIHook.class | Bin 4507 -> 2536 bytes .../integrations/SkinsRestorerHook.class | Bin 3266 -> 3270 bytes .../discord/DiscordMessageService.class | Bin 7780 -> 6024 bytes .../listener/ChatEventListener$ChatMode.class | Bin 1562 -> 349 bytes .../lochat/listener/ChatEventListener.class | Bin 9244 -> 3895 bytes .../listener/DiscordEventListener.class | Bin 3062 -> 3078 bytes .../lochat/listener/ModerationListener.class | Bin 1935 -> 1516 bytes .../lochat/listener/PlayerEventListener.class | Bin 8247 -> 3411 bytes .../lochat/managers/AutoMessageManager.class | Bin 8444 -> 8448 bytes ...stomCommandManager$CustomCommandData.class | Bin 2544 -> 2544 bytes .../managers/CustomCommandManager.class | Bin 8714 -> 7463 bytes .../loki/lochat/managers/EmojiManager.class | Bin 4748 -> 4760 bytes .../managers/commands/MessageSender.class | Bin 4382 -> 4386 bytes .../commands/PlaceholderProcessor.class | Bin 2639 -> 2643 bytes .../renderer/EnhancedChatRenderer.class | Bin 10998 -> 6171 bytes .../renderer/components/EmojiComponent.class | Bin 2058 -> 2062 bytes .../renderer/components/GradientBuilder.class | Bin 3856 -> 3860 bytes .../renderer/components/UrlProcessor.class | Bin 3470 -> 3474 bytes .../lochat/utils/color/ColorConverter.class | Bin 5064 -> 5076 bytes .../lochat/utils/format/ChatFormatter.class | Bin 7796 -> 7820 bytes .../lochat/utils/format/TextFormatter.class | Bin 5958 -> 5962 bytes .../utils/platform/AdventureManager.class | Bin 2896 -> 2900 bytes .../lochat/utils/platform/FoliaUtil.class | Bin 4044 -> 4048 bytes .../lochat/utils/player/DistanceUtil.class | Bin 847 -> 851 bytes bin/main/config.yml | 287 +++++++---------- bin/main/config/appearance.yml | 166 ++++------ bin/main/config/discord.yml | 117 +++---- bin/main/config/filters.yml | 76 ++--- bin/main/config/messages.yml | 198 ++++++------ bin/main/config/mute.yml | 279 ++++++----------- bin/main/config/sounds.yml | 253 +++------------ bin/main/custom-commands.yml | 163 ++++------ bin/main/messages.yml | 289 +++++++----------- build.gradle.kts | 2 +- config/checkstyle/checkstyle.xml | 165 +++------- src/main/java/com/loki/lochat/LoChat.java | 13 +- .../loki/lochat/api/filter/MessageFilter.java | 1 + .../lochat/api/service/MessagingService.java | 1 + .../loki/lochat/api/service/MuteService.java | 1 + .../lochat/api/service/PunishmentService.java | 1 + .../loki/lochat/commands/CommandManager.java | 7 +- .../loki/lochat/commands/CustomCommand.java | 1 + .../commands/CustomCommandsCommand.java | 2 + .../admin/broadcast/AnnounceCommand.java | 5 +- .../admin/broadcast/DiscordCommand.java | 33 +- .../commands/admin/chat/ChatSpyCommand.java | 1 + .../commands/admin/chat/ClearChatCommand.java | 5 +- .../admin/chat/ClearChatConfigCommand.java | 22 +- .../commands/admin/system/HubCommand.java | 1 + .../commands/admin/system/LoChatCommand.java | 13 +- .../admin/system/ReloadConfigCommand.java | 1 + .../lochat/commands/base/AdminCommand.java | 1 + .../lochat/commands/base/BaseCommand.java | 1 + .../lochat/commands/base/PlayerCommand.java | 1 + .../commands/chat/GlobalChatCommand.java | 2 + .../commands/chat/LocalChatCommand.java | 2 + .../commands/messaging/IgnoreCommand.java | 26 +- .../commands/messaging/IgnoreListCommand.java | 15 +- .../lochat/commands/messaging/MsgCommand.java | 32 +- .../commands/messaging/ReplyCommand.java | 27 +- .../commands/messaging/UnignoreCommand.java | 21 +- .../commands/moderation/ban/BanCommand.java | 16 +- .../commands/moderation/ban/UnbanCommand.java | 9 +- .../moderation/mute/MuteBlameCommand.java | 29 +- .../commands/moderation/mute/MuteCommand.java | 37 ++- .../moderation/mute/MuteHistoryCommand.java | 40 ++- .../moderation/mute/MuteListCommand.java | 11 +- .../moderation/mute/UnmuteCommand.java | 44 ++- .../moderation/warn/SilentWarnCommand.java | 9 +- .../commands/moderation/warn/WarnCommand.java | 13 +- .../lochat/commands/nick/NickCommand.java | 10 +- .../commands/nick/PlayerInfoCommand.java | 9 +- .../loki/lochat/commands/rp/DoCommand.java | 10 +- .../loki/lochat/commands/rp/MeCommand.java | 10 +- .../loki/lochat/commands/rp/RollCommand.java | 6 +- .../com/loki/lochat/commands/rp/RpUtil.java | 5 +- .../loki/lochat/commands/rp/TryCommand.java | 10 +- .../loki/lochat/config/AppearanceConfig.java | 122 ++++++-- .../com/loki/lochat/config/ConfigManager.java | 3 +- .../com/loki/lochat/config/MessageConfig.java | 2 + .../lochat/config/core/ConfigAccessor.java | 1 + .../loki/lochat/core/PluginInitializer.java | 1 + .../com/loki/lochat/core/PluginShutdown.java | 7 +- .../lochat/core/factory/ServiceFactory.java | 4 + .../core/filter/AdvancedMessageFilter.java | 25 +- .../lochat/core/filter/CooldownFilter.java | 1 + .../loki/lochat/core/filter/MuteFilter.java | 1 + .../core/filter/filters/FloodFilter.java | 1 + .../core/filter/filters/SpamFilter.java | 17 +- .../core/filter/filters/SwearFilter.java | 1 + .../lochat/core/filter/filters/UrlFilter.java | 2 +- .../lochat/core/registry/ServiceRegistry.java | 1 + .../lochat/core/service/ChatServiceImpl.java | 17 +- .../core/service/MentionServiceImpl.java | 9 +- .../core/service/MessageServiceImpl.java | 3 +- .../core/service/MessagingServiceImpl.java | 2 + .../lochat/core/service/MuteServiceImpl.java | 21 +- .../lochat/core/service/NickServiceImpl.java | 2 + .../core/service/PlayerServiceImpl.java | 15 +- .../core/service/PunishmentServiceImpl.java | 34 ++- .../core/service/messaging/IgnoreService.java | 17 +- .../core/service/messaging/SpyService.java | 6 +- .../core/service/mute/MuteDataStorage.java | 3 +- .../service/mute/MutePermissionChecker.java | 1 + .../mute/strategies/VoiceMuteStrategy.java | 4 +- .../com/loki/lochat/data/model/BanRecord.java | 4 +- .../loki/lochat/gradient/GradientModule.java | 25 +- .../commands/GradientAdminCommand.java | 5 +- .../commands/GradientColorCommand.java | 1 + .../commands/GradientPrefixCommand.java | 1 + .../handlers/ColorCommandHandler.java | 1 + .../handlers/PrefixCommandHandler.java | 5 +- .../handlers/color/ColorCopyHandler.java | 1 + .../handlers/color/ColorOffHandler.java | 1 + .../handlers/color/ColorOnHandler.java | 1 + .../handlers/color/ColorResetHandler.java | 1 + .../handlers/color/ColorSetHandler.java | 1 + .../handlers/prefix/PrefixOffHandler.java | 1 + .../handlers/prefix/PrefixOnHandler.java | 1 + .../handlers/prefix/PrefixResetHandler.java | 1 + .../handlers/prefix/PrefixSetHandler.java | 5 +- .../gradient/config/GradientMessages.java | 2 + .../gradient/data/GradientDataManager.java | 9 +- .../gradient/gui/GradientConfirmGUI.java | 16 +- .../listeners/GradientGUIListener.java | 14 +- .../listeners/GradientPlayerListener.java | 1 + .../gradient/service/GradientService.java | 4 + .../gradient/service/PrefixService.java | 18 +- .../lochat/gradient/util/DisplayNameUtil.java | 10 +- .../lochat/gradient/util/GradientUtil.java | 20 +- .../integrations/DiscordIntegration.java | 21 +- .../lochat/integrations/DiscordWebhook.java | 56 +++- .../lochat/integrations/LibertyBansHook.java | 1 + .../integrations/PlaceholderAPIHook.java | 36 ++- .../integrations/SkinsRestorerHook.java | 5 +- .../discord/DiscordMessageService.java | 5 +- .../lochat/listener/ChatEventListener.java | 9 +- .../lochat/listener/DiscordEventListener.java | 21 +- .../lochat/listener/ModerationListener.java | 3 +- .../lochat/listener/PlayerEventListener.java | 2 + .../lochat/managers/AutoMessageManager.java | 11 +- .../lochat/managers/CustomCommandManager.java | 9 +- .../loki/lochat/managers/EmojiManager.java | 13 +- .../managers/commands/MessageSender.java | 5 + .../commands/PlaceholderProcessor.java | 3 + .../lochat/renderer/EnhancedChatRenderer.java | 15 +- .../renderer/components/EmojiComponent.java | 4 + .../renderer/components/GradientBuilder.java | 3 + .../renderer/components/UrlProcessor.java | 3 + .../lochat/utils/color/ColorConverter.java | 11 +- .../lochat/utils/format/ChatFormatter.java | 26 +- .../lochat/utils/format/TextFormatter.java | 3 + .../utils/platform/AdventureManager.java | 3 + .../loki/lochat/utils/platform/FoliaUtil.java | 3 + .../lochat/utils/player/DistanceUtil.java | 3 + .../lochat/utils/player/MentionHandler.java | 2 + 244 files changed, 1677 insertions(+), 1570 deletions(-) delete mode 100644 bin/main/com/loki/lochat/api/service/ChatService.class delete mode 100644 bin/main/com/loki/lochat/api/service/MentionService.class delete mode 100644 bin/main/com/loki/lochat/api/service/MessageService.class delete mode 100644 bin/main/com/loki/lochat/api/service/MessagingService.class delete mode 100644 bin/main/com/loki/lochat/api/service/MuteService.class delete mode 100644 bin/main/com/loki/lochat/api/service/NickService.class delete mode 100644 bin/main/com/loki/lochat/api/service/PlayerService.class delete mode 100644 bin/main/com/loki/lochat/api/service/PunishmentService.class delete mode 100644 bin/main/com/loki/lochat/config/AppearanceConfig.class delete mode 100644 bin/main/com/loki/lochat/config/FiltersConfig.class delete mode 100644 bin/main/com/loki/lochat/config/MessageConfig.class delete mode 100644 bin/main/com/loki/lochat/config/MessagesConfig.class delete mode 100644 bin/main/com/loki/lochat/config/MuteConfig.class delete mode 100644 bin/main/com/loki/lochat/config/SoundsConfig.class delete mode 100644 bin/main/com/loki/lochat/core/service/ChatServiceImpl.class delete mode 100644 bin/main/com/loki/lochat/core/service/MentionServiceImpl.class delete mode 100644 bin/main/com/loki/lochat/core/service/MessageServiceImpl.class delete mode 100644 bin/main/com/loki/lochat/core/service/MessagingServiceImpl.class delete mode 100644 bin/main/com/loki/lochat/core/service/MuteServiceImpl.class delete mode 100644 bin/main/com/loki/lochat/core/service/NickServiceImpl.class delete mode 100644 bin/main/com/loki/lochat/core/service/PlayerServiceImpl.class delete mode 100644 bin/main/com/loki/lochat/core/service/PunishmentServiceImpl$1.class delete mode 100644 bin/main/com/loki/lochat/core/service/PunishmentServiceImpl$PunishmentSnapshot.class delete mode 100644 bin/main/com/loki/lochat/core/service/PunishmentServiceImpl.class delete mode 100644 bin/main/com/loki/lochat/core/service/messaging/IgnoreService.class delete mode 100644 bin/main/com/loki/lochat/core/service/messaging/PrivateMessageService.class delete mode 100644 bin/main/com/loki/lochat/core/service/messaging/SpyService.class diff --git a/bin/main/com/loki/lochat/LoChat.class b/bin/main/com/loki/lochat/LoChat.class index b8b59b0f49e0b040b6b527d0c37b32cfaba1e33b..631806c200098537586df584d3826c6d09d92ee0 100644 GIT binary patch literal 3692 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 diff --git a/bin/main/com/loki/lochat/api/service/ChatService.class b/bin/main/com/loki/lochat/api/service/ChatService.class deleted file mode 100644 index e3de413b4ec2295b8849632e3e5a8617ea524a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmZ9I!AiqG5QhJ$wb7~&sqbKWaULKiu_!`Bq11!7&31^}tXau!3Vk&XK7bD;Zj8|4 zW&W9A=Hs9F`u_L?aE-GB1Hz?tZ){yZ{AATunk@g1$Y#$G+);9;_aJF- zWoe~HcSZ=4X}{eDV|lr}pJ%fd!iDj>p}Fy@u(BeI7p`rz+!`AlrF)lLbq+=Z!a@84 bFpP&CViXfX@~1~Q{;kKI#>tZy2RQu!|5sK? diff --git a/bin/main/com/loki/lochat/api/service/MentionService.class b/bin/main/com/loki/lochat/api/service/MentionService.class deleted file mode 100644 index 63edd11a41ed4374018c7d32b6cbb7ee6dde33fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 709 zcmb7?%}xR_6opSwK=20!jL#r0=*ra?qZ<v57Nm*IlkD`&3Qi-b7}qS&HS@Sy1ulD(IQr_a@eD-MMPpZo5Z%#H}3AK zBoohVkV6K(8}^C3)W)gNe2vk_87t==8QMRZe_KHxyo}o!t&uxBZMWU*7V)crNo^?a zR7`F*bCEnZ?L`(!3=De|JfKK1DxySnnW_Q~sIH)jMZ6Aiw7idT^8H?;ejOgoGBlPy FnqN_s+FSqt diff --git a/bin/main/com/loki/lochat/api/service/MessageService.class b/bin/main/com/loki/lochat/api/service/MessageService.class deleted file mode 100644 index 33e3a3a110ed7bbeec35f5a58b984ef9d6b67cd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmY+8F$%&!6h!AoP1HgJFQFFx16bKuDGKTAHp?e&60@>d1+Qk|0X&qrK|ySW8F<6Y z^L2j!SYePLBFwctab-&rL?4xBbvE3HyBaOLm8Ma-q@S3eOBfgGs<={h&bzD-?Fpl^ zvpSGpn!wYIbvb93vNWEh_Qv0MU#Xk8<>uEd^zSLlQJX{|#WSJj(z8 diff --git a/bin/main/com/loki/lochat/api/service/MessagingService.class b/bin/main/com/loki/lochat/api/service/MessagingService.class deleted file mode 100644 index cf948f8fbe1abf8e93d614a1a4fe8d7961d9f8c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1041 zcma)5O>Yx15FMA$G)W;%L-~eM3MiEjK5#)=gakoIky5qNQVzX2yO!%_W3O!Qiu^SW z`~ZFwV(eXLXbSCRXJ>Zi`OSOlA3wi+2Y~nRya_7=UM6}*Gd-2~NKTleESJ=BQ_6(X zeQqriQi-@KG@(IYD+i5p+^ar_xcboOE+~n6WuG z(O7Xur*my2Woe1ua7pU;S4W3>mTQHT=-5lxnHbH|1PwUcCouXScRyaYjfo$v86=FC^5ktVHV9240Ish9VPa$GR{H|0FZ~vUUE3yz(-x62Kw6 zWB@(9FxO!f{KaX)8rEA_U4b^{9asv*q@ f_u;`G{D+AD2p)&N?RxGB?1cQOkJz~zm^}LhcMusr_GxPJ;_a6Xu;p8yGu;m7Q#|wIr9`0AJ9X^mwDAZ88 z!f8cXwBz?2G7QBtKID$a{jPI#dL~@Wkm(bKp;2ktZ;_Usb9{VQuf=PNZEGd{Zmp3{ zr8Ct}4B5z!yKYX=wR*yklcAy7VOUO8nD4V)p$(wUHD`F0#xyUh&>^JL4?4oLBACJ& z%};$kh(4D-&GS+AY48afHW&(D0@dd_hOAT?)%2hY`2km<_=8C!s?=z~Fz4Uuk>Xkg zKErCI8K|yv8ufZoJHppekDT`&9|=`61tpjJX4L&aT@iP#L1NfJJZNqHtZ7?Z+)#swb!&!Dfxrp-sor`NQ^)+l#?CD zO_nHaeVCB^JO%7OsLc~K;y=6VYB>~U;E-XdGS0ol2Q>D<<=jqe zld)qqjdP8H^RXpcA`E$#X!;XWNqg|$G865d3Hgxry;dBGxv5ow1-N(E2 diff --git a/bin/main/com/loki/lochat/api/service/NickService.class b/bin/main/com/loki/lochat/api/service/NickService.class deleted file mode 100644 index 73f02c5eed30dd084e3edfc5b0baba0e74015824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 542 zcma)(!A`oT+V*f_BmYoR;_bss}5Y-XsT!M{Xz8_<`8O-ugHO;!q%Zd`6gv6a7^(QoD}i))^^~u@Xx>{hQWD3 Gc7FihsFSq- diff --git a/bin/main/com/loki/lochat/api/service/PlayerService.class b/bin/main/com/loki/lochat/api/service/PlayerService.class deleted file mode 100644 index fe4f9870481a53404921123acc1100e96973c653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 504 zcmb7B%T7Wu6r7@RkvE8+pn;A309Hg|g3(|kxNuj?$+cK+OD0AD?gU046w&P+=HJv*Fr2sW9ZD@LW7A?#QM}62H;nmF%Km5%w9nYmo}B zMH2J*!mulySCr zFklRqed+7Yn|ags`Stz*03A3gLWaPJt3n#6iNKFLVurG*pb^)Ja5;U5rHDo$mu4_$ zijX5v8?%JbfJvX;569d!1d7b_UYM2y`c21P$3_J7>8W?so}caS1EYoXS7KgU&jd<7 zH>qqy;CM;5^{bI1BGV>N9tdAD6Knq0Ad3a(&Z2jZ8Ae0p@qngnucgtm_5})8e+KEQ zSfbtf@-RID*&$nT0sU2Wk}e=0ODp$we$d z)oe30SoC9o70hBD3Xo>92qomp$Yw0R235<{9 diff --git a/bin/main/com/loki/lochat/commands/CommandManager.class b/bin/main/com/loki/lochat/commands/CommandManager.class index ec9feae187d4e89fd46a76aba006be2e6441d973..16fe5838c77b68676d92db4ab14c673c18a1d484 100644 GIT binary patch delta 87 zcmaE*|4x5{hZy6|$(~}q%1R6z3=9l$44e${47>~p45AE)3`z`13>pk64B8B-4AuV-RP^XHaG+U{GTyWH4hWo?I?o3;->e5nTWP delta 83 zcmaE-|4M&@hZy75$(~}q@^TF93=9l$44e${47>~p45AE)3>pkc4B8CI4Au;(lXr?O lmCXdoW&vfh8H5;e7{nQJ8I&3F7}OZ@8O#_8Cs&IX0|4;_5WWBa diff --git a/bin/main/com/loki/lochat/commands/admin/broadcast/AnnounceCommand.class b/bin/main/com/loki/lochat/commands/admin/broadcast/AnnounceCommand.class index 31446b08734768d00fdb1637744e29a75412a671..da3260fb379f98726d0a751fcb4232df8baae4c2 100644 GIT binary patch delta 367 zcmcbr^pk_@)W2Q(7#J8F8I(72i89r*Ge|Kq@Mk5KCF($;eMpNKY;CO)V}? zOiy*r&r8cp*U(f*E6UGRC;=)dsVqoU@X2@1NGwq(N=-{GDpn}T2g}swW)>G`=A}cF zpcp^})A1P2#URNb$HTzJ$so_jAUgR2lL%wjF1sp~SVDK{8TE wdOL&cejtyDK@do?F)#v2X$B!6$pdC{F$gn=0C@_N83k2285tCTY$gUJ0Qz!h8UO$Q literal 4437 zcma)9X;>U*9sj+sFuTj-C{1XVqzOrB!a~Z#n%2n1D4}483&B9B2CELsunf%3(3x2p zJRVy$+N!NuuabHjtw%g!8w%0Jdeoy{#Jit-9zXiIpN+qFW`SK;2=MG2@B4rM=kI^a z%m2H24M00yQBWapB;({X%b75F$&Bf~#`m0Vk9e9sk~3{>*md-gjPChbyKOspJ7aW& z1PUSoTgUY&U9)sMtDPDiH!{A0YJq)@o7IN%6BFhVJFRf4^PG{%`;IG6J!$2$rY*1| zy;6m=(?LyAq&aHZrhiOeXVY3l$w7fghcjZtQHf0|V%RKD*_0fNf$FJH5Ea;xHf^If zpBpyZ0e#pq1ZvYxMz;oa*Oc#t#fU#80qTjGb3^%n7 zMJm1Q-G1LS?QCjj^-}VzK;!AW?VCBH+nzE#lLqzauAVb|!<9kvb>DPs8g@q@Y~1jN zUEQ=9;pI)O*YSJvmX(U59=jCm6sRj778SQ+H(i@G{2s&e^eh2kkD6J5rlw>W&&fTl zgfbOHgTU@UyaZIk(d&;aT;u=c>yIs5S$JV#ZsE$YIQF4Y!5uVir5>3;UMWu%cVa&S zO|9qz-7-hcNYw=PHZLfE(5xUS(7aMy-Zw2z8+F_qvqJ*2D|n=HRkYxsK-Hw~ zdK7h}tSH;?wTWrRHJMOThVAEFL-UPuWaZ>09h)nu8noh&0!^UdW_VHY8r&^V;}Jat zrwSZsN^d|)axjX+%qiEfn9_0Fiz5nNSCYda%2d1_ZCp1V%H)nbt(I{couHrB@N6{g0%Zh^r_1lL| z6Cj>-;RQsfgw;;{5A9rN^=qy%>@p1d9xIraKvZZ7rSq=d8=v8qFeId3( zQ1|FIQN(Js4z^1unLnp7prC(k+?LR*I0II&?X*y)s`OoskO(10uQH`p6#nKdliUbs;&=z%so(*Is0fO}f5MigXdSzy+ReH8{q1)?UCOAoq4T?wb|!aDhkVO)Vp2Q2eh z+*L6Fi}0|SWh-46cBzyC*?5X9qR&l#S_>_xK@NvxARkoWg7)k-yjU^yP~YVbHdso)8LJIj_LX{Ht!(KtXgJr$qAr&&6s zD%8y=AhuMq5VJR5TLZ}}WfC=?!RHiwR$$LflvMF~d?8SedJ8rJGYsCC^HAViR-H9eT^5l_4$AcTl8P@&Kq{=uz04F@k-w_qYxp`D5(a4} z8&tksB^hXOm4k>D?ox|ZTvYK*30Z}QdO3B-^7M>~Z_COZ^EkIm4(M60mXQ6fitphP zk(kpbk*Fwuxt}-?82l$bKA2O?#3qq-~DlX&4EDNSR>a5Yq zXhpTmTv_q=tuvYRhqD`P=CB~AWoFJgJdjG~ieSi=C7Jc4SiO>BN98v4`+8=gM`xf|&J_HD^hLF?VB_Klui&bJ zm*}9fIaHzn6K&;WIxszH$XdEIl*ap=yqht)Oqpog7RxM$Bk9*x8BDgA*2e zk^VNWB_e#?!H3mXimXWUNQ|3X6On5dP~X!09Jb6NQM+drd*^Uq9(PqBaw!q1yu0?b zv$$sl2U}`W^LRrAX0SITe$&#SWF(`d#;e!yJDK|G7QXk05^g2u!; zgje{L@ozr=hkO6!nOFJYuo?FR0X;22A+|0Cluys%IYv&dU7=nKH=mxzoCE`(=5dvP z7~3SF5;(nfx4dOw08|ZV{~5(Y^b{Z@D1!oOo33)s^I4e?p5&1;QA|4jR7~P zboqS+xdKJ!8WbT1{F<^F5UJyhkgKEO@O*9!a=zvDeh`~J+|0{+6c UTCV>Uf5$)R^~X6<{Hr?le+yF&82|tP diff --git a/bin/main/com/loki/lochat/commands/admin/broadcast/DiscordCommand.class b/bin/main/com/loki/lochat/commands/admin/broadcast/DiscordCommand.class index bd741aebaaf9ac3a687a4407e8471aa86c12fa07..0eee7524df41f2dfa31889a08105a9ecb488d087 100644 GIT binary patch delta 775 zcmY*W%Tg0T6g@qeB$HtRI6xGtkQR^xg9IT8qM}G54-*x6D7qR+CyY)qshNfSS|!DvDoqhuKX3t&Olk^qHo`GAE(c~{eI-Iz4h?Vw|xN9cpQa7FfIrYvl}z6ATu(zU!Hboe$9&h>VkNrnR_nH7aoerYy5~M|Sap)> zvE>a$tBh~BC0b#;$b8?buo<^jwkxSYTK3#3<+6l7uQOV3XErQOJyvF(Pq`aps!7}T z?ONriHS0)fhz&zn%dohXU~&B5k2x$R^Mw$BaR#XSPWEfdV81U35Q zF-6X3i$;7_D=|-O#fHL`V_UxX6w5Zpm$gf-0$)cbx+EG9Z#t585-AyNkvJziltxwB9Na~E z4;K`CmiUNA4{|v)As=uhj%ts&8r9Q~(( tVlmJFP~68-ppar2E0U`bTW!SysCX!W3MJkuS8$j}#-}7ESd&)4qrWuGmTCY1 literal 6166 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 diff --git a/bin/main/com/loki/lochat/commands/admin/chat/ChatSpyCommand.class b/bin/main/com/loki/lochat/commands/admin/chat/ChatSpyCommand.class index cc53d9d7c196983e27fff8166c2be9627778e9fe..b64736a1bdd5d31681549886476cccbf24efc4cc 100644 GIT binary patch literal 1837 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 diff --git a/bin/main/com/loki/lochat/commands/admin/chat/ClearChatConfigCommand.class b/bin/main/com/loki/lochat/commands/admin/chat/ClearChatConfigCommand.class index e33eee17f7a385a3d3302720ef4f7b0c40e2c719..54c70d5daa277f47aa347af882f9a0e853c1a730 100644 GIT binary patch delta 900 zcmY*XO-~a+7=EU--FCaSP5CGvf{OxesR}|xMCGd>qM#@sUw$pHZ5P_zx-*b?k&`i= zG?~P+ob`Y)QNaW}8h?c0>dm7EW1KD~;$_}>-g)0=p7)t~me`NVUw`lH0vN#BTe;V@ zA>k-NXhmDs+VYy2Z5y_2%l4sx;PJF+>(t7x>&xnrRVW&HjTx4y7Hw-WuNQh$**}%j z)q>7)*0P$_*|<)rmetdinK82QgqpFfg33e*dsNibF)N+Zm}=`8-KHwDoRdP6L8)P8 z4@&+ckY&_CRS-ZU-;%1|z3@LJvp%#Ecy&_~3Vb+8AT1m80Gt+}aG=14c2Px{#@1*6 z9Y{&&BnUb~t}!FuHfB(!;4HcbTvmo)o;P~R`9xsU*MV*Y=h4GA1BnXYqJm54C2%vH zGJ?+d0{qR=RcJp?-Fzg%lvsTR+d4QZwL3uB5&|iw}fHHAjm7Yg~^Z?tKkxfGHRN- zoz82N>Qur*{yEg@rUVVVFI3M1;mvNOPzI0qC-NuM%|+@z;Mkr(E|iPaD;R-V2!o(F zdl{9e66iSp9*IRyph@&L3+zG*Vj`A0;yhN~vhfmbhc{W{-gUo1b0iT-MovZAKH|(a z&JonOcW?pNMxRS8!vtGoOAwSf7gss0y^zp{DEbi>F@ZrxNa}$0uMi-KQCxMzC238CetLrxMx`nU3!KMsWDl2<%fQ8hXB9`kQR!Qrv{4~-qbJwZnV d;eDs-0W=XymgGck1qGO}M5govMc81d`2!~By50Z) literal 5257 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 F{szDbs literal 6055 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 bdw1j|{E@Te-TEl+|9_&Z|BS!l@2LAPR>Lj> diff --git a/bin/main/com/loki/lochat/commands/admin/system/ReloadConfigCommand.class b/bin/main/com/loki/lochat/commands/admin/system/ReloadConfigCommand.class index 4f6c9c480c68ff26c7dbed6a7d564295f711a611..26f4813068bd14ee5ed46a8da923db340cd9796f 100644 GIT binary patch delta 280 zcmY+9Jxc>Y6h-f>B<>CYF=mnYIVyswVj&22A~r$^dr4no{`33(3E&tzZ+tm=oW}~o!o3{Jej#<3nAXKg2n@*k~caCPP|ZG&=0Mo;1(u@A&!f0CQ-B qclZaoH|^C4*1tlFuo&0`3rx`tY)v!A5;~!Y`ke133|k>b*!}~_M@e7+ literal 2720 zcmb7F%U2Uu82?=o7zm>%DvJ0BMlk`)^rZx1Z83#v8_){HR{Oe{T*8paOgeMJk)0lU zdU}q#u6nxYwi_3ES`a-)yYFi9$8_7%?`ERB0=0{|ulerx_;-^vR5i3P zjGAuQu-%eHgSo(^LHjay3ckS$Wy>-AWnYT2aYNWHFJxV3-YRB82@O$(eT#gF8#Z@} z#q&jRPz?o5OfhgTZiS2b-HO=y(fnQ>~KGX?G)R2g&5NLWtpAT+ncy zVQ{PVsxI*RzNMmV_g#o-m}i zL#o_z#dYW;qe@{+M+O%eI(@3+MkEYpldp3>HK&q(Nyq!DTie3=YR5Rkt%1a7dL*44 z4SuTK3s&O6v*1PWy!L&t7W`hjU%MMTs{KIgwfI0{Bz-TqH^? z8sXneH&NJ?7(T^}h8skbb*)VVbS*w1icICG-!!Iqqu$(2gB#bbB zVd^KjNl(|ZstJqX=Z%?fNQVlq5NfvYPv=~>RIM~&@eLtwx~M{GBEAv3@R`kQWQ2x_ zEVu0$ONvZa8$>%OAtM8c?BslkOnG{6T6F2@rG!kpPC{UpO&ZJ~7sVl;Nr zZj$ybG{**?Kpz}hLD%ED%zhg8(p@!1(M31*kp`eAl*R!Zq#fO>Yo+SMA^I1=VLI!L z()I`~wvWo>-=w0AW^<^!_bK{X@C*8e2LC|UD*9J(b`@`|;hm=#Z9(*5c>LZ__XjV} ze#5!3)}h|kRa}0CkARowq2woxAJ>3YT#r5^7ZNy+G|^cEDy9L71mt@s`P)w(C(w&Q z93`1Pj1f~$;W#+G$ST%Lp_{K_H8F>qq>)_5=lG(Igo#_YUB}79m-vdX8pBz9jc*9^ zZ%MKpk;JTqY?8DBaYTD)B5Zm{jhYC1HAR$G1z7}n8e7Ohf#$umS|p35`dEfbXDV|Q Ic#!D*7b9RUzyJUM diff --git a/bin/main/com/loki/lochat/commands/base/BaseCommand.class b/bin/main/com/loki/lochat/commands/base/BaseCommand.class index e4e1de1b31a9c12e2ac1127f4b86bd2ffe862229..5b067f8b3c7b5d001b4f7a45740709c7f99cc5e7 100644 GIT binary patch delta 540 zcmZ{g&1(}u7{;H;hTZIRtLc{zlsbZyN`%tdgA^hZDT+{vMX7pn+e|hacX!g+Z8ZIg z{Sg0vIeAe03xwjK(1IUVp=Yn+|KL@8lX?;K^33x-Jo9^p`ElvzMgH~I(MJHYczM9v zPUmdHZ}}6Ep9B+gS}R>ZmEqNcM9Wk~Em;*SDsG06pM@$BO|6zA8P5pr-mgm$%dD=d zB9Pg_S#>@a8vmNX)jFKJw@UZXD>P*8zj(&+B!+$im zatQf}rW}SyZ7|Z?7$)_4o?`^(Xv!nNV@mqTcL^4q|0gW|lTb$pR_Y<{5vu!$V)+Xi zuffZo(J-ZA#AJW1|yDPTrwaq$I$19+PLq{xlYOUY)1qP*=+7q*{>EV{-R5zJa5+u<(8z-p*+kn zj|CMj!~Xx#8(2hzp+6#INrWNM!nPqpt~;|+N>C3=Dtv|mU7(!@29}Xy=ppD-#jcBB zvglRn6eAGJD{dgBL{N3Z(DgkIhMIv3n28ye4P1#2O*%a7%TevTe5Xz5Hw_%ZErx^g zt&);``s9xLc%Wic3f*E4WkY|Hyr7 z#vUvG5&cb+n{b+_e!`Iil#S#DDHIG)-H9aC<4|z|dvOv&m_Uj)yW1|gb4 zp9E=2a256K1k=>x&z2c8soAf-1w8*RX@_5{;Pw|{~@$Y(pb-cvj7M$IwYXATM diff --git a/bin/main/com/loki/lochat/commands/chat/GlobalChatCommand.class b/bin/main/com/loki/lochat/commands/chat/GlobalChatCommand.class index 7326ae46b300c64172c2e08de9bce685ad7f7fd7..1e98fbe0bab97a2dfc35bf67586f379ae6673795 100644 GIT binary patch literal 2311 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 Kf6KQJzWWb)Sj;Q{ diff --git a/bin/main/com/loki/lochat/commands/chat/LocalChatCommand.class b/bin/main/com/loki/lochat/commands/chat/LocalChatCommand.class index c82070106a41fdf9382eaae7e04d15d2fb10e6f5..c784e17b242abae0698d9206dd52a74e72b48d78 100644 GIT binary patch literal 1852 zcmds2-A@xi5T7lDLIJ@l2%@rlsO?M77!wmqNJxW;NsES767^|&-5yKtcAMS32L3V= zP4wMA$~b#h1X>{AqYs_g`PiA?%+6eY{r>g?0CwPc4l)GFzKXn1bp;atkXaAqh{?9` z5~-$q7FJPTP1QNb5|}??eddKs2HyMD5%+BlCJ3x69eAy{+ZBIR-4{M5Fk5r#f#@P^VL-c0V5N9fh|&RpY*n>+4(<||JF9b7Yo#aQ9?87^C^a`K z?DIB7AUzQ>E0m-?ty&?E%p01YY94YbqMp*$xs+XdkvMQ=))QruBBVZ(Qd!#K^fY3A z>Kx=t?9?jCs6FZN+ju%S5x0k`O#^O=)sPvp)!Z&oA*n^1i$@22+UJ2VR-aH|r~}7( zy-@fJOQRj76L+SAIKoFWbP(zs=IzqI0~@@xsVdnKL9s+TT1967Q+1t5oDGc~>u_yc zKU@WoFhj{y^fk`PA6TzQl8(|1qNn$7QEVROVPOVlVUfT>v353E4XY7)#f{!v zO-Q~MM=h?KuH^&@$pRiQEu1`1X6>Oc1YV3xF%H``yNfF@rDQerAq z*LYM$OZYOXDt#ufxgSf5Tm4SFY zPuaaV3@ejB37Na$29CV>e>zzNR);&>#Erht+)rjuX@={V-B9;7xdgN z6PT%|d*#9zSOWrM_!~$15OOeyeZlcwT`=c=Iuym$N87NtDC%G{HDp(*&!RBv`p5!5ZG6 fkX=NEL2(}whCrP(=3u#88CXx~20TOVaBThoN?R`@ literal 2920 zcmb7GZC4a!7``4@7~CBd5lHY25pWlhQ8O}^EZelK1oS7xDS3mX> z>JRj#FIEtAP9FQ(C;S!tiB6~M*%@G8V9${~%rnpZ+|T`fU-$g|-ycr_T*hM!O#-8N zw`kbzg2hMvz8M(Y7fol@H_E%Ln>XzY>6wtMAtum1Z!VdJZ8`T(k^7JT}yoh?O_n#`8AS z1(yVxlc_0zSjL@|2^_#d4IKh!Uesb8o#>)P%Av>!f%D1Ki@UxD0x#*%&?c}yYdLbV zRGg9CEpx`ElO5#@O_`ph_7SmlJo4pmvMvTuuu@ZTG~=j_UhGpEj_cTicpN8iQbWH$ z_s&7qF@Qm8Ey&H_-IN8(54>f8v-Ga^R^DZ1y@KiwsoFccWGRjmMl=iy zoUXmmP>YV2ahhqR$pVAP>~`^HY}5DCsR~M1&S@18Lq`HS3n92~`7D4PTx--Qtf@V& zlL@;6y*+Z$nU!9;0Y|#R#$4c8P9c4_o|L*HFmSWv1Z<&e&XVO@EQuSYXBK53 zy~~c{24-Nn4&6CfRyHq#8PBvF-!QiijY&6{EZH`*^BTLY!fZCG6)YP!Y;#$9s#IRr zaS`;iow3ch&YV@4Fdeoo8$G#WF(?*-LIr0!jyLe81~%S6eOl}Jb-abk0tcuuYAZjK z$9~^kWi=~xW^hHrJFJIYbXH%`aTV_h?4{Ds`Rk6&g72il?P`khlE5{5py7RizKYOM zjY8E;KnydkBMZV|!e{=sFrurnLL-@~Sx?})jvM$ejCRDn>3V}`S8=A>kRzHHcHj8( z#~V-id-DAIjg^f*H`X>*F2!*hA88=^?UsrvVLCp>C&VO1h1F)-*6eMC+X6#7xlkXe zIPT(}hED~CYqL-aEZaBcT(8K9q>%b*`IS|y<1#&Z~ z35>y1378=QC3i>V?Hj47Hp~i$zBuM^Uqhj45Qdr3VPT$_G4HBLb*0icdg0~dgOYUe zvZ{Hj4t6Z41F&@zL5Yc3$@yh5){knPkD#l;fZ28>fgvpFcmOtPyQ;qO5ZNk0qYA95 zy1o*KHZ`(dT9pvh_Wcb&EG&A$g~oKNZV))qfSrsjwmBnhHRS5rj6pWN0+H>86Xs$xH;>nX=dI;MS%sVNoLlnp@~Wj~Z&&Tt(Wo+$oyuv$ z{}w)b)!gRiR)?Cd<&{H)Ycr{Pv5#E)xjV&G{b_4x{}tU&_}YX+e72Sk_M@jv0e8JP z99_CYAx)(B4*!lL!y_v=HaxP5zK)?)B%fhu1*6+?IuIl0K|VWaNEhXGmt}T`5^x4* zc}`hnGg;&~hgT^7JZU{KZeQg~{ZrZg5B+TAIz93i#(sc4@(g1aTYkc!k>THPY!w$) zF}{ko*YRExVn6r9p8kl#JuTtcWXH`_+*-q(b$qT)NgeHJ`32n_`JUJs07=v H;k*9%FAU{;f50mX>*BGB1At4JUBm)hbB$v5=_?%On^2&^a_c=gWVp*VHp^;d0u z;(o^}O(4|{JLr|bTxBqHMU|033EiK@u5#TKJ|~c??40oFk0CC#E~Ky<1Qzp`IVxK?eRbutB@BvB|Y@>2Z6BgfVy?<2{}C6MvzzMD%Ab2@)T)Yj}^> z|I5w?zu#|8-}&S8m$P_>xMX1x9!$VEJR~raubjz3)oMIqB_|tG6(RXXIi*^e=uoV!Vq{dq(CSXS1KtASVqZmj3Us?S1#AjDwhqeOIILD!<+axJXH8V zU~R7>t%&%x>JfpZ!Ahv%ZF#N;vQ^d5K7TEG<$vxWRCJ<| zhE;s73?`Vs#7=xyIfn+8fxrm(=3xO>F5>_BBz7P71_$j)fKj)!7vRYS0TwO@ ju!JipBwb{5I*YMggG603;;6V-3B)+N3~Sgr9xJ~9|HNFn literal 3060 zcma)8NpllN6#m*;#+HYGg>jJCY_mxgcz|qx2nh%rOk_h4HUYA=rM4J*G$Uq44h|t? z-`69l+;hn#si0s|P~?=VoT$nv|AlhpwPtKdmh9x9nd$D=?|c2d@4ePv3wQ4WIEL>O zv@z_Tz(>huek7FZQ7li9$pA!Y$aqT&V{qaN-bdH$RY~Ms%wk4&YmtoIxq}5Iu z!Deh#u!Ujo@@=a^sn~`-IxWS`urr>iB{Xet$4MpXX1o-qBr5|dIuK!4o6$`%RxVBo z`#hgCC_&MTmE*<)w{1JnHP3y6^m5e zVY04GnoeDAo=RL|*m16Gx_VKJn6tX0(?QO1n-_&E>|>^Bx!lz)lMb}K3N|g=Nt^4Y zqw(6JHfFhFWy7Fc?je!ag)PXlJExsB_?)n%u!dA<*hg}wB&02KN-vCZlNSV4NxY?W zqzP42onhf1WasCl6G!p9g6A0e>Zl_a*_0N$iI;Jen%HrMPKWaE12Sx= zm$L6OF(KJLq2eTlJ+^)G#iOsnc7tWA9jC~FrdJzc-;sy+9^QF)_hRV-O1&7?Y!#Drx20>kcj=6~#v z>|exX1yo*LbvZp=y(m){7m$X5xzGZB6I~xj#)OZ@Nt9V07OzPT`7**l0RW|do zwNI+ZAx~F=xLW20m2ZPc{O*>x)Q%}qlb72eM;KGm^A*`B$K~sjb#v2{XKpV+^_}D&+YYw zdFj|yQI?K7cs^hCEZXrVgSxmQpBH%rR9$sfv{wf0xX#diy;N;KH{^+KsCY-RrqGGT zsLRRozAMlB9>bv)NodtGo8?J7%Zij;Y+#k1?00QK_luih^D5?aA%qM*DJTKaR+vF< z7bvsqTf|uX&mns*LvKAoqm0PPB_HxST$6QqZf2C1{9A0>@=M|TTuC(C2a&8*wsT@w zuik`SUZ`ed&l-{~4*hg@2Iv<;8=~@$1^oq!%Bz&#Z8YBrm7Z&8bcyWR=-oT`8y*`> z-bUA8vV!%|SOuFNAa)!5KUeo`r)LyF|GA!gb(1_cUG7w7QV|1Ib%ZlMj$Q9QqL(lY_satAf21?62UNc|6;O;7_sO z{qM0U7V_58(HANhxq~zF8245K2kzkI!{J!?PsEn2DtN8VCL9Y@z;D%i5fv0_7Ua7> z7Mh375DQmd^C$+;u;c1~?r;LQuoOXbHgpfyE(W4+WiJM$)3+J272K?W5(5E9s&^5= zL>f`ri!}Y`%3uo$*ox1nTz;qY{*3`VB1=jCDUZ1&`WNs%J|LcnO?-%ts>xZv$M}SN z%eha#WD_=?t}2(NpDZUxCL1VFF;{rH;Z`w;A*7p1U=T+0{9 RM!o_P$;<3F^woxM{{_t`TG#*p diff --git a/bin/main/com/loki/lochat/commands/messaging/IgnoreListCommand.class b/bin/main/com/loki/lochat/commands/messaging/IgnoreListCommand.class index 6502363d843bdfa949ac2476571eeccd3dc1dc7c..f87c613e02d1e390d3a71d73bf2d11a39837b172 100644 GIT binary patch literal 2216 zcmeHI-%k@k5S}fir3C@2Ac)BF!=!!by$~NPAt4PWBn1tvBEIzKXn1oe30vhglEz z5tA+BMcfz`2pM<>fmE8;gt67+V;0f`=1*CVc_Blf!Z5A>FHk1y$X7}t&T$=I* zr}p1*ziX8ykcq=CS|+em8+Bh(Rb){?^OyeXT=#^}2^4CF7n}w<#ASAb6n2-uO7SLR zr4s__s%r5p%n_Iy^4`~4=_$BNCi1VO=0=4*-l9k;79q1jNg8X_40&Xp(R{Aa;Z#Ji z($+!BE@>!S(#k9rWs}gPK9f>e+T`@YVm>#@`x+3niZW`?WB$uh&X5ZNXr#d#raAh N#>sWq!qxHE_znoixqAQr literal 3817 zcma)8X?GLX8Gf#jJ+eFma6lj+1hYl9fJvG(fJJE&1C3MJP>h|1q{~>omIsYyl$nu> zlcsyNF6owqq9E0$9+Mk|i%$&%#Ky7Z0BfoY{fQ8S7Z?TJ|`wn8+_Gs;nVzM-&#k}G1DXD19Equ!dtK&niA!6?7DFTwpz&M#-OXY#x!#bhu2txGsG-fsbkUsKD+7babPd zQ?sK)71!C!9u(;FS^wCfz?LMPW1E9heJJ3hj#D^Id4@6RSWh(M=nSdb45ATOwlO(5 zda~Gu93Ij!iiabhqBb}ah0fv+#4eUK;yl8I2^r8r3F8{Zm~)t5b3?}&oE6Y4|5U9W z5CS%w3yKNnbWGrU#DqANW?9x?LW^WE4YssRR@k!-+iXLJq;itMr*J{TqpK67#f<6= zj|m*;1Y>)(GWaw;tKl;OLo1n}a`uf`*Q;^3sNQ}$eC0{f@i~|R-F4IR**uPRbmhpv zs4lpkWtcPbJUI=v&OlzGDYsU49j*}N0?LX6EaP4I(*L0`IF-gMYn}vYPMYiwTMW_+2UfO)9i#C&J=<_J)M#qCzRg`7F6taE4x?R3^0=F7;1R!VSyj<4g8=gy z8qB3Ll=ZN0#O-5}=<4`9E+voEI6D=~yc#{jksTk2eqIHh)bW(6_12nMm84tQ3?8w9 zIllRU=>)#Y@@XAk3@JNj`r}L}jW4gjZ`O4QOB!D#ub(QrY@bgnFu$(j89YlEeCtUD zMWT;p@I1bu;f0nfL==yXZ{k}tFmKuod4?t0k{|8R9F&C@b$kckrK~53h`Jt}OcIDp z^Clz@w^NqMw%@Ye!89)os*kANyJw9_63-gCk6V(!&Nak2#=32DTG|Ay{qztW)2pzf z+}>dtg|{U&DFn7BJ+w>_+Sej7^9*c=JT#jP_fn09#f^=Ljj+Qhc7|NZwhr!vdUJRW zBvjbZjwe1t3nyrO{X}4vt7B$89QYdEV5F<}Yz>zM?p!%u&(megWX(*t4X-RuTk2ks zjaqNw26|W>8fNq$S?33ySs#4Ck+jvhHWa_rx)KD+zCtPs#g9Y=cMMNRq|-r*2#%eYex8Wsh1tu0E< zMG0eo_q}!eb)yUY>N3oJ(XXz5{O{s=A9Oy~^XmfTy7<3+=v~}4RJevsLxn}$-k)2< zjvL5b!@%32&R#zIk>Ya;pIO@4$~n6Y`?!*gEMPwl@Qb!WkAfcVLZ0>qxt2@ubBHhP zPlh4>LZd3Un}xrj@EY{O4HSmEuV7nY=pAfY#Gyspvxp;0_(&I0SGhKj>t4c$z!E;* zh2frD&k{Z%@EUgHx+9HG_D?S2k?VMT3DZhvd0i&fm0m?)IDG{NbLk~i1#aMpVJ)X! zhd-{@6=el#f?_mLG8dHK_5P1EAe=ZyS5{>qMMVb4Wpx|?h_;yn~b(M*wpb#7i zliW$9cHsy|^`oqmi#>RbyDt*UH~9W0QT!K?Q^-C}oC(S;WN+eo_&y<2Yd^qCA?`Qv zGF~CdYVB2ArlL0;R@I(9vJ@jw~e#|e8ezN!}HG1(g>L?yWQa`8EFSv3y zx;MU$%^C{t<6aG=4;W*w2BG1EhF@xUUc;}r$sHQA!3zJHTDy_T@{bkHGCcK1R;j;r jDq6lU!Yh1s;Wzj#|I_sQNB-WzpZJyG+n;d_?;`hK5nn{H diff --git a/bin/main/com/loki/lochat/commands/messaging/MsgCommand.class b/bin/main/com/loki/lochat/commands/messaging/MsgCommand.class index a73d17a10270fbab5ae73d91f89a0ead5c45e2a2..ab40ab44a1df29c94bca8a13a8e74e242c97f8d8 100644 GIT binary patch literal 3506 zcmeHKQBPAb6h0kegMolk5Co+H>h>V_#V1BEWWj`FAOR#%pSrv5Qnm=`jfc~d>$zRg00z?{;7S8X01iZdHtd)3-U?l-N{ z1Tu}Vi6#k5R+6|CRYv#{nm+^H;rdAUoIt*^aZ08wL%qzhkixDIm@Zsqthh%YT~;-o zg;4^d9o}nND?I>rN&nJYsku?%5wB6C)DR)FLP^@tsv7dhEYaNH?mnj?YA9`;%A$)F zHZEF=tRWUnOq2RdN@Z!4(^HGN!6ff4O4KUKs6B4*YpXkA5x4uQMgwjO<&YV(yt`7Q zLQ;!!&M0k1Y?}wdSba=|p^heNG(zDsbduJUZmBaJG$Sspp>0!1_AA9dq!=6IrmSRL z1cf54YZY~<#^MboS->?$vCg$|;c>o1!WcY^u}|mi#5>dpM0@rUkocfo!Fs&@HXBdw z-!D$z`Q!ALqj;0J^wiOw8oy=~d#av;5x6%DLvWwKc%jm%t~*v^rj}gw9jyq-H=9wF z>s?oCTrF2V3-_27Zrm28?Y=MsybFaK>+R*Y5ncj=N|s|40`)@W@;hjU%Np0EpJ+PMS(%vWQdI_Eo)Gc7Iddys1=l=qJyj==+fhyJ^Vh=F@6pcJz@ponEIh|I zdy)Zx;f?sg=1zoxCqSSNfBlexJY-=2KSA;^2s!MXdH;v+1z;9e xP)IvuG&+IUu0x`(>vL2bRtj~TtEV_=l*Kr6U2tA?!AZeF%g$3MVDCJ6_5+Lea`gZJ literal 4980 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 literal 4945 zcmbtX33nS;75<(rdt_y@*l`wRtFzX!2Dy1!}n&!_Q+Cvat=pFGxOfN@80{~ z{qFbfd;Y%{E&|wx7Zp?qB-2(tnX^U>KGH`uSGMz-nQ@YN-Ep+6VP=#4dLcL7;rAO(3F1nU2P+Q0qsZ?Nf_k7FU zRtFtOQT?px0o@)m(z?KoGHI<~BprV^*)!v6AWt2&dkoWX_X@0SE}I${N(>1^I;@Ny zLp7GFScGK))y;{aItVnVP!Nrw5i1p}5Lj8+TNSIYn$lU_4Q%)8S;KMdae2Ad;LnC8c1E!1no;7FuZx>##w=dV#k2(-t(P;yN^Owe(wHYjgKpKs$1pxhtDg)FCFYwA(QC-eP`Ow-0Hbq+e&M>AS@tW z8Qt;q2_&v=vQ(5dccWdwD~Ow`*eso(B85Eyi)qwf{6RCv>}aIHIn)JlS%kfKwSrd( zG=;W~W+Wxekcl60l@zvLV3EW42L=UJgpnNRObp3gx=FkkzjK!#nm#}M^z`KP`MojpqEErW zs|Tw@p^974&s5{S5szBV$PAK?nQGfAEwX$sV>pB%1%m=D^W#)>jhvGlvFtnvUy^R8 z_eq?qxDBrps3~Z+LsPpenlg1aIXZ6HMpDa+5!Xd>nyVkDDl1>GO!lM}p%sT^h>i$c z-`sr-GZI5`&h0Ahz#ADRu6ock?kehC3{%4lR;1&}!NIPZXdn(v#W2zW%PHKgIWmjJ zbldULbZ(pG<^+KAIt~_OGHW@)Sw~jE2(5Tm^VFs(K( z&N8Gq$)){LjVZsZ`OpsNQ^8#VOXf_-Rm9++sDKn)AA9)OD^u=6DrD?%6!&r# zbsBP-o{8dq0nrr019-cF6D5U#pM5Icfp_wlJ!Z)>|3DZ{#GO5$Gs0$CFCpZTfeIuc zH~k?M4@*{&+0mEx;Y(g{CFtL+;yrjT$9#bI<>f%H&dt0hY(Jof@WD~KgA0t55m(|` zATAw$zlxL6af#U($NTlPZj9*}>HG&(d`LRKe8%~iK`ub@*hf@+R6=r@;D!z=fG&^itS|&}7=<5;aDpB))1l_aoxQeghYmAsviG{8qt-SN;>ngq>%rI+w+1<$Ywnj^hZM^$`B9^nzg93gAg z%9C7HKbykwta$dbK2(AMfprUrQ?Mqd4eL2spq8zJrZqduWiPK#4|-P>S*r=G30o+I zi$Ik1vO8EbcuX~h7<2Y~p&pl3WSy<#y?YAJ)fz`;u2(hB-I;vo@~Tlz>65>Y+QI5s25R>J-k@z;n^lKZP$w{N_B5zfvu`{arqH3Y+}K6LLk9)I@3d zieA7s!L#FAk+TeA1QHQ<5DmZvEMuv<8BIjMChX!@J8{v+RzKsPVf;_<&_0RncpPnb zffv;mc~z~(PO%<0h!$Qr+p$aB%FE=PxKZ4V-Qol^{!_Tj8BtnZg`eT) z#Pct>5}6gg{4Xj0EB0(e-LflaRM5I){T1v~pkG0Pt({j;Q1HNic&++1#hMUV$rk~> slAg&I-IA|rHa*-|<2U@O!f)|AzN0ks0{?%(-`I-r>+kp{{*Czm00v{JO8@`> diff --git a/bin/main/com/loki/lochat/commands/messaging/UnignoreCommand.class b/bin/main/com/loki/lochat/commands/messaging/UnignoreCommand.class index 3b86919afc4f5b94fdc8c9404bb55e9adfb0cf66..1dbe2483d890f04bfddc16e500f5e82f705e2bcf 100644 GIT binary patch literal 2490 zcmeHJUr!T35T7ljr3D2mAb(VrKPK%LP8o$ObQxWNW`b@b$ea7+iiBYjeHTm ziisxr?uRnY_6iLx2u4hJ@S(Ha+1cOxW^QKge*FCM4FGoFMH&(WUivEXLUk%o_$_8V z+(%3{j2CfZSRiEJ9ZC^MrFl6%N<)&s%n9o>?_I5xo`6SW?9-vt+^De28x$$EMaZmBlD4&~hdeT`Xf{)8aVny= z($<+2UCL0nloeT96irN%`bIz<#WM#=`x!gnfiPB|QDLZ~$=dBu_zZ)jO{IJ0Ob4BaOKWH!YMA|Y;V&u1 zfZUXoY>FUXpiQl!0o7Q&$0Q55#w<3uHZDCbmPi1gGBUCuW=F=+AYxI z`~MhxIK?*<$mJ(~$AR7>E?Ia8kEdV~W(myYD}&ChT8&jua-BV05t8qBqB_?#SI2Hn zD4&H#ObfT~E0eY*41vv&A%VSo!??pKlTor9+YxByE7uRXDwhqeOTV!wjfU}IR8=@8 zuyN3lRz&=b>rx@JNeuQz|2Ck0B+ApMI90dRX literal 2970 zcma)8S#uLd5dOwG*2v3YVH{*GV=l=8Zy+QAL`Xp3U?LlWunCZBB#p(|t6j0Xa&QQ_ z@4V!d{DHjWg{mMhRZ!$9Re9n$#ZRG9>CvvO(@Gw8XJ@9Tzn<=|yZ5hu9zF(e5-5TB=dMQc5;qHuRuYcGi@I6VrcJ$QTDC}gTMB{<8|L@|*9=bE=W}x+ z?=LN%9 zn=~)$n&WM2lgrln@}whtTsL+11jCki+fg4VF~bl{TLlq80P9usVFN=To|st!hNub! zy%7vxP{AgK!OqsIcmbP9x+q*9`=Ti7j%zP69E>O0p!4KO&GtpKmLn+zLk#;{k-FV9 zg00xDU>n1M)?;0vRP4Yo-InZT*b~px1DZCt)*!;LKBJprs#3}c z`x4I?6rgCv%5!6e+q#_li$V9g?l2tg;D-O=8HI3-Wu`sSG0es@tFtRB%!05}T_jQs z*U7pz@j7*_eJOF3VfV#~>FOmhVJ_&7PFK0WZC(%;p0s zQaH}AmO#DBpEnIkkO2a$6VH!JA5P#61+OyqWMNvaCtk!=DrBb^`W%YC56G~o zk<7l%#EkUzX%%NM?s?l6U%q-5Z#PM%dU2Mxu2uY^IDGu+qo)s^K0Fb@Ib;;PwR#kq z^r)D`6r~Y4gowrsy)aGXmeOc%C+pjt6u|{tRPZ*#Xlno}u5LKmtYw#|p38zdUi%~h ztH|OKL#WJchoFvhgffMz%`aNEuJOVG5w=40$`v^*A!5K^*2QIRIOR4co*+cy05T<%6&)M8csH)67lgIK2Y(YB$;HkM>5L8ajRk$ zq`f&6c@&5%v`ZcBMnz1}EV@iU=`?M6dg3%)E{0hZMOZTslt-#Ra=y-1yO?#y|}@!&OhpH6ckXUY3Q{c zn|o1V=)G00Rgv5Bav!Ovo6oi zPx7+gj&`)x_DhRp(NxwWS*v2_#kek8+Ca;%&zLk9JE;u@=n0_*QTdNR|5H)f6>03D z^**TdUQ4s9B-caZ(CB@v8%^Fr|7fy`jnP;YTb>|x4?FMH&g`Oh6hZ&Jk#r3ZOEzIQ ztqgh^um^i-M!IT9=uy>#@=DkdJ_{1T?U-N2y-c;{F+7XA~l6{#xT zuglQMow3joI72L48`lIF0BiL60Q8#-fD3vZSWUE-LtDyS@ zARReU3rLI{HiR_&9A&VLl6gDsU>J8Pcz=_GbnIErCo7J9hEH&tJV<`Rr}(Vq_GkDU zUyxq8_9ece5beQze2s4?_!<0+Z|N(H?`Xdtp$*S5pdh*JId;)-5Z}}CFoJ_LP;3TC UvmA&IatKHuFJwQ^R}X&t7hY~dRsaA1 diff --git a/bin/main/com/loki/lochat/commands/moderation/ban/BanCommand.class b/bin/main/com/loki/lochat/commands/moderation/ban/BanCommand.class index 1d60b773629c2c1bef3bc5772706a37a8cc59e0c..0ff691df5946864f6c54ef43afcaa6697fb9c441 100644 GIT binary patch literal 3325 zcmeHJPj4GV6o2D7aqK#{b=%Mqpp!Nf8>kmbx!@>Lv0AB;6RO%&qMXK?@p_Wonbpj! z)k<7A@`;c@f-`(5#GBouw&QJFAJSg9%@& z0vCV8tcP^OVLP>AHr1u?@o$OZ$iUcklvN7{QCIj#L!6El;304W*QabPk z$vgR`a#STWK1Xl>u zCeA<9TIn^oMvCJfq~=D2V}3x<HQui+hX3 zqGd8KsL!NSmJT>Qk$7HLeI6!>VO8^Haa0QW~aZ~q(V}Q|D1k$ob0DO5XS14R2b?)%HlW_KEs62q0%Wk(?Q}& z$k1a^bN1{uE9JSv1x~%W`{(V>lqJrQDRPkui;7}8-LqcI)>ETNhgwCGJUBKzz0+7c|lTeK9@8rV(SwI$sun@sV-5Hu^XiX3C-}OdpHq zkYw#(7t+VR_XFGv)C8ypn1d_MX1X*7sR)k&`N1bcLo(LqfiN-$v^Ynl{&YBnLMlC#XrDh44#jGdM`_CeUkSd#x8Br*E5X6LngG;zxM(Tcg1EBH;)PJmB z{S7w$!qWoWz;zXQ9RCNnR@3haY{G{~5%>r`#+x_s`-T%p)5Fv2iGmgUnC~l-1Y@i(|d!vwT7m#!`nz;?1K%OIaa`gP1qlZ8Pni#OpQfZ&V7q~mO@8Z6+ jb9qXC$x-T@y8|m{J9iaQBMQ(;P4h5Q&a?u23HSa3v$Okn literal 6911 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 literal 4335 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 diff --git a/bin/main/com/loki/lochat/commands/moderation/mute/MuteBlameCommand.class b/bin/main/com/loki/lochat/commands/moderation/mute/MuteBlameCommand.class index bce1baffef64dd1da3c2cf999948374e0fdf962c..5c67b050b6318c626d58ab539746675c743db782 100644 GIT binary patch literal 2329 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 literal 9009 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 iX diff --git a/bin/main/com/loki/lochat/commands/moderation/mute/MuteListCommand.class b/bin/main/com/loki/lochat/commands/moderation/mute/MuteListCommand.class index a03d8f0128f9bccf6d0583805a53a87d14bbf0e2..b0af18a3a05d8c38e14437bbdde1f32a32b51c50 100644 GIT binary patch literal 1730 zcmd5+-A@xi5TAuYp@3io1Vvds)b^$K;)9`tgj7gO3L08T)Tixrdo0}TUUv5y_{&T* z(RW|{b4-l0cSXu)z$YJW_U2}G<~MV{nIFHud;@?@c#($z0r;l3tWp?(Lwc3u9}ULmqMjrVd$`c_EX5_qKJ&eVd120?SGVUMo2|5`V*a zy<1zy+)u311cu`<34|mtSHB3Mu4;&+N?^<-ZgAZdJ|{3ycMy6iS_eCkC9qIWF<5?V zy@rV5kiTY@Zz~<8A%@q56n2BaWMxpFNvSMtae5lDFxpqw z6?SSBWz?R;{4SmjPQ>kjYSVz*QY~c0tT#8xR7h&k=Hk&_GxvCaKUSYmVWC~O+Ac?rNhW0}BVcsbJJFp#Y3=4Qo$&Lt0W!ljyI>VPS0Xx;<+PFSAJ8QW6EH>^e&RY#x6x{!P~iCSDYUE2s0>&j>0 zKGVYKy^lG2APj-EOH4$<+-m5M^`lDGGH(K%QvLc-YjBAJT)n}gdbyZSmp_$15?I|! zq!kf=BfG)~Ea)B64B5r?rekwD3|QDon(UCwgNfc6QvhjJ3Nm*_cwXW=VMeJB<`!}Rym=OM~r^a04h z9Ln+Zy#Vv@2sPZ8uz)w8;QM?I)u-vli}EzV5L&YYi&rFAyduF8-k^}1#RG%laHR(V Vb=shV<#G+caw=EgIi3#3>K};n1)=}| literal 4921 zcmbVQd3+RC9sj-%GMmi+Wg&qe!a_pWB#^agAqS!%BodkcWg!*nHQ7v(A-gl{>}({6 zN@;6VJZi1AMcZOMq7{`=5=bbB7q#`;cvbPJ;(g!8AAH2`o85%n?1FscL*C51_q*@6 z&-`cnEP!VGTS0+9eb|ZyBi4YyCETw$L4HRyvnL*mT0Oe0Ifi8hqX|b3c5>-3;!aBn zKtZ9v4STdfEf~?vzTnpGJ$l$tP$aP2vipMFiGcxQid-;_)w)*?CmhQbD2hcAeTFHp zuw%Li9aak^X%Z-rj6=FTXoPiv>Ks5VW(4D@V^_R1C^2XBMje609j<(izSjwcjA$&P zZ`2&U&9b8|`J#1(X*lZzo)^d=otB}xOQ5iYmhfT*=Bk(lABhL5yA;e9Safyr9+c5M zJw0`uopnR}=ijucF&gz^9u`U}6BxG|7xx3FdFK|2i+oQBe*V1>ZS>71@&YcE!! zT0uZy^>mDDa#2x(TAGp~3#`aAMN34B$D67%jFSqjCTWn>DvIG1nA2gH`j$krTeo*; z-4RBIufqy!kuJ?PtsSj7#SsK03F>Z;QwC=saS`X2+Zo&;@fmPYQ*C#30Dc< z-7-{Ps^Vp6X7tmyoq9a3_315^*=zI(1o8%>JPT$)Qs@?e`MPaecD&BCR>!6|d(n!Q zD`=yQasw`xl8Q}e7f>k+y%@7h-DJSkX9nD4?sb^D6C4<_Y$K@k3=%HEEOBec6lRmO z+s!IE(8=l)r^C}?GhqVPgJ0cMf=X;vu?@Ef%%)V$VaFKMWpSlH=h8lIO-VRLB-p9N z$S{PR3U<%|SqCb*aI1h~#9N~=hk4GTwA+JS0yR|?4fSj5TN;uNB}XO>`jf|!;}Zvy zr;^8$XC@9!+~rR`IdKO!&L)pbZElm=luI_RQt@iMhV?FP>|;WaV7rf8EtT^eZ5OxLtMB}rXHFX(pRB;-gVL7z}@V$zN-XtU$RF^tM_<0KP+ z2I!LW$C!$7oMwcj%)>gG85xpVR`X5ArVoWUBh@~ezj|Jm)-qAgsrZ~*x!6y(xH(xQ z>!{9=aCv4xGQnhro*W$0&6NR{K9JL0Mr=+4XWyO~(Yp1B91L=NNNZ?zAG2&;p7u-3 zXsQ~|NnuXaVgX_BkL^S-L`$oPi@xeIRV1=~jb6+3GpnWsfjJvB@!} zEt}Q4j88X{uZ!Dy^6SXJoT_sFKe<^UM+*;-kUMTE_&!JCtNTR353*C)op}{JEwFU@ zxU+-GXH7cZkd?5*dYd6^!LppVV{5Ta-RZY_;$B?D&lUWPF@7Zm z40F&L(1WSCPW7`kEzJHhB*Xg`0uN*sf;4oB;3fuSM2}Z?Sk^!ymS>tvnb$2BS%^}d zJm8tpmmYF6Yekwwix!E5*aVyA6yc{H{8~V-s#sfpQ+;d0#ruzD{`Xf^Y*^b+-&~)( zC$r}#N76li;t(NH!$CkyzEyKCFEtN-%i=V7C_MN*b8Zq#)cLD=#S}x;0aOW7_PIRw4d-sFz`0gF1%_xoBxbGAm(8uu53^M)@&{$GiT2$^WFB!*2(qhy~ zu;DcA;bF}5JvNS`nTMYuu|=nGY?p*Qei9?2I5mzZ(;#;i2`Tkw1rA?sDI_8tA>Fdx z_39E{W&FIQF5`Cv=k-d?vnvoo7538^M-aeyRO4Af{GB)11z05(@#0)b3etTsUg2r^ zN%!&X^Y{Y&B=^3EFUfe}+j%@iSIW09<7slQ!6iI{uP`h^_!hp3uc3&P9>dr14f=9F z9!3%qjKw3^hi?+sOA0#(`4qW*n_SCCH$~$+q>;k>E-|0w*#x{xFJXy-&}HgTtUxGe zQ1Cqk7Zm)E+w86E&$vwOym?L)@Yfwn;iQ3Eh;s?Ex$<|A3zumg^;!rnhYK#h%QV6D zz!tc&k#z7HlHx~H%a6h`K9~jk!Nq;hwDM~PKi%Y*fgkg&0MFqkeEMmaUs8%+x$AG- f^>^<22Y3Aw{z51@<^7e8{U^$K2MFO`MaBOGAFGZR diff --git a/bin/main/com/loki/lochat/commands/moderation/mute/UnmuteCommand.class b/bin/main/com/loki/lochat/commands/moderation/mute/UnmuteCommand.class index 32e180da9bfcd68abf097bcfc0e95a36ab5ef7bd..0ba99c50663078595d3cfb6caadf5c089b137a5d 100644 GIT binary patch literal 2785 zcmd5;OK%e~5FV##(}tFo@P50rl!Qn2f)FBAB@}^#lomuvCE(<2ovqtldu4ko_zCG2RU%X_C?+UKe}q8P9w(o^QOLzP|ea0QbQwK#ss2UqxQ1b_5Ro7PB6% zBPKVE7pYCInH5TUQDV9GOuDI_i3^Y?Ft^QinHMq{c#m7#+_wdoAaF(Lz-uKtJK~2i zuXF0bEAA&&=>kj=xI9E}owZOk4!Px;z(gD-fsh2wG!RuE%7&^V*cyQ&4pfutUEy;A zGmX{m5~UN%LJGS=;Cy+MiOL3nd>vygz%c@|-H;w=t@I=uC%G@rq~=D2yL^)(kXVFi zT4=0QE98;6M~hSITbzn0R@yq1s>>)2E~8Zzi>k>GQlCkwENyZ6-C}X72l5a(wTd!o zU&s6~nhs9H?Uvf40k`FP$c$NDU#U}bI$^&7neocj;4jhZ)Q1}c(qiv;A zb*6(P;?f%0G1Y^4rSj{*R=F`Oz@n0E5tJ*mtyR>;mt8Vus?D`=d2q-hVT_PL7D3=L?BcZ6ny^=x~UNd%w|;G|<`gqIOc4jn>IVt-N${a5^lf-S-voScRkI7Q%OxzS}u z(`vkhnq$vwLrA`sL@ln7zai4F)KESPH<%V~-Pz3BEnx`U9Uvm|CHAh`J{q;bP+kshRbCKSe40orBK}D33L`L_CrmReGOq7CDyN+Q!&*q4 zZFAewOi1IUJkNyQnzCz27}h3%67u@DucE~J)g zGf1xrf%*OEg-Q^^b{F^>DBDnarbIq9tey<4#olh zp`Zj)P{d!V5*&ePoX1c)14nV3#ntUp6QKAW=AM^IZ{fs8+|9vh94Al*AP;A7oKC-s za2C$t3KIes@Z?4OKAXqorF3)e_}#%cN;3zShd7`^9L(bh3i(qwp;7Ga>6FW+F$XL2 ybp;kM%tc)1;3_QP>_A_``OwhHL!fPpfVKqV`$IbcDTo|gPodp_D$XuZH@^XSUQt^B literal 5985 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 literal 4945 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 diff --git a/bin/main/com/loki/lochat/commands/nick/NickCommand.class b/bin/main/com/loki/lochat/commands/nick/NickCommand.class index 607f5c4b7506f3397ecbc36f49d2867e28fbb139..7382e76717c7906de287c2295c9fc989e9b3a67f 100644 GIT binary patch literal 5483 zcmeHL(Qex|6uora*m094_13lP)|TzM&EA0MWlwVuU@)?mI&D#>1-d@bGOe(YNP(n+ zu)X(x`daMLQfsAFI?Ywu2FME~l9xy4US3K^_xZ~|{|11c;JXIY2y}fF zd7;`D*!X+Qdf1Pc92-vxf8V=@O+OuJK%Kz)Gj_ndkjcQiKYGS}+khnkx0MdOQL?`; zUa$AERolOEKe0+Tph@6nf!!_}p=lg)%QbSCyT_@BVx_G!*>FL`#szVM#bU#x45`ngRF;l7eTCRs&QUIy zr&du$?P1LSkENp%al5C+G~l+=51BEWyIWlO(3Fb>vtahr(y* z8l5OTHD@|VA}+0=8B~t*R(Ek?JKPu+aMM?EB7#nrPPB?<1k>RiCecP?#3o!D7Z2w_ zB#aR8o0JRRf6 zG0{rTM2Rq^>)!EX?u6s!|;u@t} zhzhJdP(BMEGc8;{8?4(sVF-Lbr@>Gv73)jXZp%vc(`f>e&Y(aoX46BC-%#Cqi$!mq z{nPoO?k`QaK^ni8RC_0{FLI}9mSmM{rP2v8)wr40XDVh+d={&!ir-L$DN&U~S|}4{ znR!NI`m=SKcKk%s=|sWH=W2P&9N{w+^X9+!JN{i(dn&NfqhzjFL?C%D3LzB@i4~zY zz?z9uDMJxRW)qFt=eG~RVRK%{Z1tLOhrr#p3mI3nDt$Hxw1z6tKL1%bmACE|X7X#p zDZ>VIuojntBe1fQR%mvy)MVfm5I6@lI1gB9gf=Wg3k#2JxBx47J%_Waa1q-z?ENsc z1Ze#Q>rdM4Kj71UaI^+juw6nMfI3{oc4d0sg3sX^_OQqYU*-_b<5-Gty#V1xA;L|d j_?%m~vIe(bbD1H1Ref3(-x_dtX literal 5666 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 QscRnQ$GKL358%T;0cCSww*UYD literal 9126 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 TlRU%u<>wfXo|ESpU<3aHIzJ}_ diff --git a/bin/main/com/loki/lochat/commands/rp/DoCommand.class b/bin/main/com/loki/lochat/commands/rp/DoCommand.class index 371a781145e5f65e4389680a185dd89bca3603c5..4b0aff29e2317682d52452292bcfeccd694d7965 100644 GIT binary patch literal 1713 zcmd^9-%k@k5S}fC!dXBOP()?%M{Hx#d-2JVCZuX&QV4-cq9!KW>-M^Ew|m*$YwTZU zqKUryM;T}D4zUyydGN`X*&j3W%{O!3-uEA$zXHH6Y*(N};Bla0KT@XxO)zBE$8*eN z-}pN5U#NC|sz8~*(?5pxnBo3G#Kv3~2?Q3C?0m%aNCcd~awiWcE}8`9c7znRMPRem zxd`1+Z6wpI9}_6IRi9Vj8bX|~5%VJ^L;t1LO3%Y0Deb(Gnj003c%LFlA|hsmk~Gn( z7xCCUr`|$$$f<}ErL7BTxOUOFb{i}a4U==E0h3Z$+T-*L(OZ}xeMtnhiZW`)3BOvb zqZD&HRDBw9TWd$mn4NB`PKBfveGZWpvpVFVFjkMLFw_xbNfL>GVS99-bQaEZn8sXM zLkp-0-mUu8$W0{wv!?gBF)ZY!t>i$2wK^SW6`wbsU+*!AF&e+ffNSHX?WPk8V}uOz zDNW*BsZ$R;Sgt|^t`k_Rb*Sxk9&F@cR_uh^o@PQCKYJUw)8AKiKaHa1 zJlr9q`WFxIzY!FHt&8LB;!B>GtaqeR9q?DeX=&-#Kepl2SAi}3bxw?nKy@#dyF)Ut z4FqQJ4~{y7S(w9J3HKG4N4tQhXXq{A>U{z4?Mn3%EPcyjZlImR7=SWn0#viT2RC6g zyIX^G%)EvBjWW7!<7V2P6_`bDUSQ*r0uL@Ju!$KI%Imlw^g8lz3leq9jHBf$mf&t? L?_sPXO5pxawg3m> literal 4415 zcmbVP`+F2u8GcW)$!s=Lpj#3MU>jNr*#wxA3D1+JT%t zV>khWz#WCke#CI5&9p)8p;~smU}~=aI$#cnlLF0sre%8l0&BY#@eSDnR5Y0w6Nn7h z86$>9w5m`Ljo}U~SFlW=z4kJnNyQ4>DG<*ZUU1j2ku_bKZzsPwQGvx3bzmPIuj8B6PBU z{DhJAk}aU;R5YPkVEK?~8T*R)al<*NkLMVQ_>i5}b7Q(=%6)Jc@g_}IU{f6*)B%JH zQ6X2%nwG%oMJz#t1XdcSjdam7YOryvYshx8+IVql%JekD@=R|gfIu?*hHjEr)CT-D z88URlb4)9nJhJ#Gaadr(aFIguM#`EtU6V#0&>cN*c!smnvTRTHOxvQd_f;-CVR++? zZd$IUFTB+D+1|clE|-jAlYr_c$5yAXHDkx<+=Pm5^a$MP7$=LSV;nG?yy?0WE3l)= zx*8is3@c+ebu397mOU!&Vi1op2By2; z8VC##*cj-sz_%C*sl;I^;c*pDAVoCt=3yhxP!l@;tE5y64`YvtA?#(?DQU0ax{QbG zyPS|%Ix5wq$r$$ILkbSmt-h5AR5Pd;#)x0F=Clq7Xw#hkDg_~kM--#<^BHH(*0V7j z!bcQ*m~dLC9zL;(!#E0nrCBMk7W^SYvSq!o+{bk_n>2G`XlY$wmoB&+`J$|LhwMFv!$sh~S9*GIyN1S%(n zEW^{LW^BjQ^vpENOp(>xGfq>KoiErHPm&V1SrwBo=`okdIq%s`UAM!Z7>i;`V7->H zJNwGl%WsuuZ=5S%DqkzlmM?eSICtZG`EvQ%jpzDh)yS)`U<_hocv>Uh@CXZnxy zX$zaa%2D|x-{A74KCN;PB0m}?@9aA@X?jNgnT+A49kU=S^4UJkKkN)~b)E4CiL;3? zyG+J2Dn5?0^d^(h4|#nYEUpW6%#Gm_IH%xgfqQE~$o>38G+Y=ZBvpJ8pAuNciw8|t z>bH;GMPT=m!%DcTRrk9(x}oDITfGB7Z@=K zt%LS(<%Phms$Num^XoXlE53{GDR_}>XrZfA%U1Dyyu@TNtqG=LTR2(f3I``kPB(I#6ElLDj$XC(my=XPce0#D?h2=8pbBx2p7*z44{Mn(>YNDkZk90#Wf1lD zb5$OPk*VbUZpEg5J7K3BA6i7-h^MEg_UeVooT#8gmxMZejj0M=QE-Jx^xsRbz&*87 z+QFHEQ8l2&M(m=KHg=nGY+W}0IkHtck-cn}ZF{cg=!Lz8H)&@W{kQO21#i>J1vi`4 zv^`~LzC(S;?AFts?aW9l{Z8P8Fa!c>U*HoQK68e**PX9o}fS${Zur?-_H{*H~e`L^)4DLVLDSA5v6Fg;E{LGS*zu_u)hiSOT)_U42 zcvs-=Taz;EzNuKxZq>+qBVy%O1fLrC%ug)-ws1Ghw+&p|yL;Y5th=WKH6AZv<=co~ z#+uhE^y~P$tRkhIGFI{HXEojs{d`#b%j+9@ zNZiV|H@kb{8%yZAfTqaB?l-Wxgst%h8%uca_NKO`7jckhYkIDrmv(%ht?3GOMer^3 z*PiZ72qSWibwTWl7e zlS;1)t9J!oY=lq!JPrAVKu7ac+JF+i6S+tiG(!6M82t-+SEWza(x2Pu(LMBMh90%) z(UaJOQ|Q7|NZ@H~#~s1nti_%VJ`iTO?Z6t6H$Yw>sd46hOad$5sryh=1>DCy^< zQ>e!@e!-_^YB7OdR?c3=leomEC^dN;ui;ljoYd!a^2YE6@7s)s`cGuUvYRl_sz4~< z$M|IhhZMZY4Hy4!R%&;Z|DA}mb0MPIc_bI2S1yf`LISN3zvgcPeuHaVCC-1(|3BbQ P+{xMP&-e@eijMyPhy)o1 diff --git a/bin/main/com/loki/lochat/commands/rp/MeCommand.class b/bin/main/com/loki/lochat/commands/rp/MeCommand.class index 72276c67f868c6d81bde5120f161615bf364bb6d..4d65d30ccb289c11cf70c7d68215579a894d305a 100644 GIT binary patch literal 1713 zcmd^9-%k@k5S}fC!dXBOP()?%M{Hx#d-2H<64Gd5(h>rd1Win~*X?!TZuhdg*VwnqbJRkLQ@l zzVUV9cX%s5RiI4Z`5!}j%y9o8Vq>n01Okgmc0S^IBmz!gxt#|T7fk|lJ3k|YuV!}jPv=`5V-Fpasi zh89p0ym#x@BR7%!&zkOVV_3*dOUZ!;!B>GtaqeR9q`w}X=&-#Kepl2SAi}3bxw?nK(&+0-60v+ z1_Cqq2S**kEX?7qg!>B2qg}w$3-p$7^}c|2vQqs7OW(4XTWIGn2B3_Y0M%^o!EIR0 z?$%%(Gwz@sY)Y+?q5@;WXEy^cKGf<)ai<7l~xCAgp2 L2N>&!5_tF%t3(Ii literal 4320 zcmbVP`+pQy760C3li6&hK({0iz&33uWD{UYYoX1?C~1!Qem=?Gxp&Sv_nhxn42@{jp&=T>Em*5zjX-@kEDB?p-+RTlcuBGPTV#J@aJb~?Xa!`j5 z3Zg=;n6+$yjVn|_gap>hb244@Weqn@bqzUg)|eN?D&U^xm+@e?E-pmICi;(U3v12sO#uPkHD?2JX5q>c~rW2%kyYfU~g4) zH8G4zJ0smXkt9wi(01zR#GQ)AhK_r&TVNewA8_nRD?4o3W>&faU3HnNM3|`xN&0?2 z@u$;i$H`@!v$j`u{{igPu!mV%NyC*!bUcWMh&J6w*(6|lB>_VeQi)V6l6aSfKGI<| zXm#}C-2$z&G-g|8iZYcU7a2>L&_&zwHCb&1sKy}{>lX*#3PC^=J~w480&=?j^hIw z-cLF$SC2qg#|fMi&}PhBQ68BTXzNNDJ59d;5w|Cu)equa|X`TurFFX4d zE-zeJn1B1Jx1U~kbzyGdO1~-9;JFFVsSnx8BV5PH7(RlhG(0JAS1n&SUus@P3S(rC zj;HZafi>LtfaNKN5Az}r7+kflsJwuxuckV_MDa0!=wc$G_=K8;@kjA2BW5yPGh-D! z<@Tp_dlaxTvCLy$89~Kg?ig-VC==uA z%K4IxFXJl#N<&VzeAjGQtS@Et99LO8jo@wh@O(|j^Qt;&%&*nkY5A zq+y;%=fBrRfjes3sAIDQS=B+sMxCOYmV=h+E7vT2FYHqJ<7KnoaeU8r&BCzsr<@Fd z{|$bt;SEN)oMFqJai*ma1lYACvZiq^}N^cmcZ>d7A5RKsJN3iOCygO$*S6XJ~i-}-$49r;cSF&8#uOi_q>i+ zcTWj=JYK^3HxR#qO|O*YxA1pO*-ATYY~bg~M!ZAm1e&-VcW|cW>`7@ig1c}x<+pOJ zBf^Dy_^|Sq+c)%3xRr0OclX4%mC$t&O_598m$9RSUGe)GOL*s=rnaURaExo4dgjr~ zINsCNG>`oed>#F@tAi2jX%5v(cy9@ZX=P+KvqrF;Bhc<@~&SSCxkxLzsYZsw& z+tVfFBA4QYj>sI`-bL;BO#EC4AL`YVwVpXV(Hrg1;?HzMX(|5kj%E(D)!Pzo7XReB zjB+;C)6vovo5QD+)9WkUo5$xG5lBDBK)x!_(R`ILpoDKmE-?j-P|#OQNn`ioMcju=xF4@!H|D7QCiY?h z58)r^#lP6YDBPZ54QI-iaJ!E0QBRcDzKgn zHtz8<*_5HBpHfbvA2awFpPK2#Bz|6Adl8S~7krA+lZWvNUM1s{Kd(_YhRfV<2O|1E zkr8XIL!woK(7>tx8kK}1S|fhR-v;~& ZzvifT{(Jua0e|95^;v($U+`CS{0F{h?MeUu diff --git a/bin/main/com/loki/lochat/commands/rp/RollCommand.class b/bin/main/com/loki/lochat/commands/rp/RollCommand.class index 1e0861f7858f2bfb9fb1a6480cb91c09bff6a712..d591d3f114bc432048615d6ed5480e58aa4845c1 100644 GIT binary patch delta 194 zcmWNJy9+@99EHC-$<5%h+>w&&nO9zeM_##N(bXL#Rw<*D#bA|z$zZjpn^6{jg3-TV zwEIop`8ubwHFn0$?Nv-i_3Fyzi~$5t3F0AyMi`xlSX7#rq&OK8;Y T2F^n>6t{(o5q|8$*LVB_sRkiy delta 190 zcmWNJI}1T^9EP7Wi3|?Q84O7NF1h74h+K2q4l+utQbs9@!KyQm(P~jLOZf;!U&3Jb z>m8n+df#`aw(4qkY0aC%WoVldA;5=|06IYoaX(5DmPAMsB_qs>m5EUyPMZWBl9;3z z2uI>$X-=d$CCiK)b6G5eOYs#2))d)MVlOY2@F-7bYF;kXxzpf5l@~4Ea{r;rkKXO6 PE6r|VqmPH7^>rWqSY{yW diff --git a/bin/main/com/loki/lochat/commands/rp/RpUtil.class b/bin/main/com/loki/lochat/commands/rp/RpUtil.class index a507f05754049af183d0a3c98703e30b33972f1a..3e058b7819b5de7e7f5d806b12ad774ad1b86a29 100644 GIT binary patch delta 29 jcmZ1_yh?b3C#Rq$gA#)lgANc{GUzfmFc?ja;tT))TbBiS delta 29 jcmZ1_yh?b3C#RqWgA#)#gARi>gC&r3U@)8<#TftqTUG^h diff --git a/bin/main/com/loki/lochat/commands/rp/TryCommand.class b/bin/main/com/loki/lochat/commands/rp/TryCommand.class index be6a3762cf9260599f5e44feeddab27af3e2e4c4..4730f509598a7a17d8d4dfc06f0fdab7bc2c3001 100644 GIT binary patch literal 1754 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 diff --git a/bin/main/com/loki/lochat/config/AppearanceConfig.class b/bin/main/com/loki/lochat/config/AppearanceConfig.class deleted file mode 100644 index 1ef321a4c245ff19afb3fe812c0a52b626d3ff9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6948 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 CJMt6& diff --git a/bin/main/com/loki/lochat/config/ConfigManager.class b/bin/main/com/loki/lochat/config/ConfigManager.class index de4a9cd1211c595e4e250bd35b4dcfcce0cd1cd5..3c9f12dc48bf605d3d0f10b6a252c61ce7ce85c1 100644 GIT binary patch literal 8466 zcmeI0J#-XR6vyw2G5bMCLLd+V;-ZKNA`uk@0%$(?2y7sb5G5-5cK7Y(!R*XBAAuk$ z$HKz?D+>!N3yU1@o88RL?B31JI|n+7>}1~D`+NU; z-<|g{_g8=T5dg;FP69d@?8#f@QNy|}@h88;-O;>d7G-I4(!b1blb3{@fKCQ|*Z49Y zHMm(Cy^y;m@-Bm}is6-{$zU+sh{;-$NE<^N!{P;DGuYQ;Q|l^k*`n58*0)8kB+uuC z<5=joKZf6U%^E%Xc%>q^&CR^1#=xLIJKoTSc0Fa}V{p!zRbO@{(tZgtFdNDmHL!AWc*lG-h zhUr5ch(|T~aNp(F#j8_iI<^{xreXT1CWAFVBWsUL<7XfZgYZN*48Sf11H;++fy2U=Y&1aaSc}+7%R_>1#U}qUu*1im!!jBZ`0nPwymn}Yic_<+-__x z3AeGp8EhFIY2FLi^Z7d1<7~GB_H|n>3?^?Sc z+zu+K!LozfOC>Y7M~Md*xN#%~KJDbiG{hY-N{h^`m{?R7X+nW7GPo5(V8pGBMh#mm zdz2Y|kx)3Q47Z@jR~X!kAu{aMMq_+a+_Bq2on{z3HaxPBgrf{rV~EkKdab%k)k~~R zm>NTo(n(25jha7qF*r<2Xv7rP+>``71?^rxm3WT9$&Tn@q?v~!g|eniJfdzTJf=sc z@oa|{6P9HNj^|g(YH?(-`dU}R%Ss1vdk9=jfagkMR9WF%o0^j)le?aclQ)%>MwesF zF`Ph5uXIiuR*oAdO*QdX3lCMPd9nIn5+f*BH!uV&NsOvTI{sP_IP{>Y-*Sl;q~|2z z0)yGMnbtfpR_7SMo4TM4(wQySb*Q_nRSFvVRD)k>L6g#2Yn#V|XmxRFS|Txg>C6aI zopPPPcOYnsGS#YAGxi@;!J*bOvb1F29}ey|w4D=1v1T87vRyipSShyprcql&f}V#Q z;kJC(IlQQrbk$#@4Ym@VxGj**xaV4HYgN#XQWt)JYuEqFbM zqygB9zuWNcWu$iCHGK~Tuk;Vyg`Gd)T?aggzg=hp=#|0WZvX!@>Uaw87(5MoLIh=3 zB|JkA4w8gtVVES05QIY{;W^k(5}qdrM@Ygbyg(8T5`^O<;U&yqJ(DcR!y$q&P7rp( zt8kbk93cqj2m*sKI2IzPDyfdeae}bWg78|1P_GAyut*YK$8Xd1Jgl$bDoL1t$=HM( zNtl9@Sh=S#{th@zR5uk(ktCgg>5vw-Zbl7~a2C$RCR9j5RzrhJ5@uRxI8W5Y3Q3r4 zL7*~untWT-Au;E=hP7cE#3k zk0iXOk%ym20@rxEe<2Au4Gs56LS7@2zmkN4hKAorg3!?LJ4q;NX!wI9lr+ZTPm-{t zq2Vu*ATzjEim!onk%WqdhBQfd jUxUy?5^N1ZKSAgK$KTDl@G)My@#N#d4OoE>;KTm`vsLAU literal 7948 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 diff --git a/bin/main/com/loki/lochat/config/FiltersConfig.class b/bin/main/com/loki/lochat/config/FiltersConfig.class deleted file mode 100644 index 6142cbda3d0cedb43d10f24df027db38c287ab3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4966 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 diff --git a/bin/main/com/loki/lochat/config/MuteConfig.class b/bin/main/com/loki/lochat/config/MuteConfig.class deleted file mode 100644 index 1565152fdcf392153a83a9502f495515f30f3497..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1976 zcma)+OH2O?8FlZfd?CkklK@q2M>jXQ=lt_Kk9%%@{`&eIz&#X`Xkq9tiK^*{HBL+ExfPft z;jZ$EIadqp$?!FaM044M<;OCH12?(LgWC*)*`n|&=1OgCjR)qsQ>$>-d||z`%!jlr zg!@A78AD=Hlx+>|3|f`qM#{b^UmDl@cZbIa{u zII80qdI%M@nPIpQ6&Y)u6>#C2tK6~88Cs%qh|L8JeGExEBByWyr;<3yU^b-mKO7yW zafTsPv4aUA9NTg!yR534%hWqkP1&nf%?YOBJQ%vNx&3kt=NLN6k=7{3Vhw`~Eu&?b zZdOMQL)0E(MkmHFrU<;Btq4c4_ELLdTfT5L7z~GYGVo%X$J#6MS6FeN7ZnDUIct~^RX-M zrG{H%b3;pBxQ4tt)QCONQ&*Za+$HOttQK1T5KeEbbB~0Re+cc+%5a4Hi!^?2AcMxE ztYL;6erOH@=i^Ca=xLM}MP*6Q;QBOL8mRof#%~-^F#=)GoJv1U;i9N{C0h0ai(&M0#Mu~eJx1su zVjy#V3m4x1#prHe=(~)IO&FIlc?F|a$+(PRWga7)BU`xocP%HCjIk!|7+1AppaGHI zEv3)|aZ`oJDG|4uAnvFTh7xhF31UKp7*-;tnjofCh*2fteiOt46{4U-JPhaO(QjRr Bs|x@C diff --git a/bin/main/com/loki/lochat/config/SoundsConfig.class b/bin/main/com/loki/lochat/config/SoundsConfig.class deleted file mode 100644 index 72a50eaaf9eb46ef4f37e2fca58187bd890fb6be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2176 zcma)+>rN9v6vzJq6_$1Zt>7JRsI;K0HxL9xT8dWIwn8Dwmu4wzS=kHe#l*MpL5$JF zVB!ZKz^Cv@jAwVI?W(g0{V?6xIrBUJ^PjWx^Y`~30G6@Uj~<5cs^@67w{Ou<-7}h6 z)pOriHEqLdxx0;QFzH8(;Yvhc#%P#4jG=GQa;@fLh8ro}tJk!h*8aZL)DG-c&2qK3 z#ydlMPD3e}FQm5^Vp(t3R4~90Zv+{q-#d03y-27y29;s{C?q{V+lEWJn{~^rEo}Sn zVcl}gLd)4P>t$odHW`w-S2gS{qi*?g@iNxjvl5XS{v?8g{`7CMTf@KjvFWjc_W+01yJZ5l4AOvyanrnD3lu8(0PmHt0g!8L}# zw#4A572F_hMlWX9DurS>SK*H(Jzse0i%+RYW0GNjGVoJnn3Kr(Kba&y!||@rEzfQ_ z)D3h5s|uzWhT6j31uK5`+bZthF3-N=wSw-EnXr;x`OAco)vWF*mJwH(Eq^XR8on3L;MR(dN4?1JXlCTfr=rTpW=ZS z#&Md_7MwtmFbpR#B5*U5gwa}J@+(G@XJdyr|BHB2JB%sZ>@Z>hpEGU^A42=^=^w^fDdS!Ql z=#(-aVaLPdqQs7g5Tk3y`?RXkt$Ft;f zi5>GHM%NC#Q_39myx)mKL5IB%_t?7BkmV4gtE3!s;^rS+ CJ-FZi diff --git a/bin/main/com/loki/lochat/core/PluginInitializer.class b/bin/main/com/loki/lochat/core/PluginInitializer.class index 3fd93d8ef0b70a68078fd58885291a7dc2144926..3b8871209b1eb79b7fc605a63cbb499c81d6cd4a 100644 GIT binary patch delta 1673 zcmb7DTT@e47+pIFoRgD70wGi#3PiUwE@gb?UOU@TYo^`I@5=C#_3~cI&Jq!0v%e%nZBI8&wT4!Ykh0) zJ?%YTp8frwx4!|f1Gfd37(BGvmN)TN&TQ>rHl9;j*3zm*qe@WSsYL>z;8p<-GdPYa zV~Q`VM1sC1UDtFGg$ySTMszi*g~!wZcfU3?911J3kQQ+d>snt}9g1#oOV(vv?tUc_ z(PHjC)xFdh)7*+Xc4AmfVr%{pelS=!x{WX`p-4cZUh!v3UrNCzNl-9gWUbO! zYlMa9p4Gcz5Cakh5tcDzNb$=@%BGLR+oahA|n(@ig_?8s#WX8Vsixx=Lxt zRz*MBN;u-Qj58P~S@sm1GXgrlJfQumKBnpdo~3r#CttuNgX1}d%cZ=3EnSxb;to77 z;|gA&{H!+i63;uA?%1t#DJzf8$PznE6Z}N(WCbj*7{_zNzKR;`E^z{{8dR^*VSC*Q z1#ifB)0n~gKV@xqShTns66|2{flWcgL}(%Yeku>f9g4 zL2A$4w7CaQBpp4|6v>7{l08IPzZ~N}8>ozRmUc0|=%e8t*dk-qi^VrXfdL zD&jac3CE&n#1LKSsu>^VQYC6~iMABk zGYdG&kidmxxuS9o7mdOKE}O9&@!}HV8Q1_xMPQ`)kH{p1jbJDSW^O;r3yqYeFurVj3Uvgp72PBToy6a?D4`>t$S~P9t@` o7B9(u%#t>ppD*D0;!v&5uMClUdEQ(TzUFWf;#lCTg*VUr4d9K9`2YX_ delta 1650 zcmZWoZC6xP6n@Ukz`fkLGccEzMht|+VSvE_OoK>Fg%SfKQ4vyWgv&690}ca5A()jJ znMzwL%zVq<%ajZTCuvn{^`TGrrB!RSRv&9EUHyRGR_ENAv8XTSoPGAQpS_>G&pA|l z$)kMx*Y!C7Yw^WZWt>qyTkL4m2L^n8eSKfBE8wq|a5puwY;D1pN(tFcBx4Q~$lEQ{!Oa|T!SAl6dUe38}BE=w7!rQ??UmW>P^x?szp!X!sQ zJ)8;}u}MM`gQG9x_wF9tvnLStt}`|j&3Ke{Bvog(@Gdv^`a1OPzTQqfw6?k4imhms zu#K)J6_~f9jlNG>V|k3hYmiqaXXLjF@^sdxL&d%WS9drnoxGP~mQf zz1E!U9-LQkK~$X*7^n;ScK7O?65bLc6KO|nS@K1^E#lsxGqx)B9(`wXu@C4^+eR9; zZ(rLIg?&z!Q(LJpZFboz zn8EmuRHInjR(uV%8RT5ywh5_xO*VXP`Z6tZEEh|-mBMekd5necPJu7+M3C1cPSbE{ zo@p#E{U_eek>F2XK^d}8jx=r+$711t#x2f*d$H2U5?pkLCGUyvPv6QNvwQI)h^ZFpCK@V(AiyQ+E)rB@pfZft+qDnZcQa z7kuF7CgE8~bFs}cgG+ZXF{ev=mrF{V-xu0AFxXA-APrs-QA`UHO{(@&BUz$!4jVUIQ1-Sb_}ck}-H{`Fe`i+G};gW;O(*DcrI zmh`Y|Tv@gs2y4xa9O4~RNeMmt~Zw)nBNp39i1 zbB{YB2(86P`KuxfX|)@!U?#Nz86}{G9+8o#|L{^0RmU0@Raqi^|I<$BUj9o zHgybPSi@z8Q9p33t!R5&DogCd;78o6x+16$1p_1al%Y5BQc5CNbX|t4#mXV6G^4Hj zC%Q-RnTD$jlkF)!fv$ni;~eHgm`KA#wvNE;YvH6ZRRsSNZ>qhqB^y8Xtq=x@nxZO zHs{h2MHO>CxU{fhP%%gXJj{)*?@awK&P=gGk1oq{`0d3&&$yzi^gAkd!e@+ zy=&;EXMt8L=%6p4PrRbv$0phAk(*OVf delta 1035 zcmaiz-A)rx6otP7(@tnh_!DC<4H|4{9dAsqjRp$xqfDtS)q?ml)M+WSrRfwBulfwe zCuvMf>V@$N6W_qc@SYI&45TzQ)J(FIv$EIPYp*%y_w=6|fnVp}z5|Pt+JSTJVWej#Vnx zN|#=On5083Ubr%vE2EQD%nsBzZrWXXhP2L0S!EC-eOxO$`&GNv?DBFhZ~Jmm>$==h z<-%c?k|(Vgt@lQ$nA;dQxVJf>7_av2uedJ)t?U0>e_$dKtX>76hzvAfUbPByqTU~b z!VrG(`uYDv=NhP8#qvJ`JqaehER1ZcmRev4U2d*3_YH<|p(@(+?`^pufkhi4M% zr0HR1DkfO0!={U6JS-E}!rCc;u-0MAg>xR9i~GVp7xr~{<-&On&d2>>zYF_2>?qpM zVwf?RzQTmmC-~$Ajmce}Vu>)T%*a!iWu2JZ%z08gW|L(yQnPHy_nJIKwmD>n2D^-l z%G$*~qBtoh*^EcTQKI`n`gdjD8PdGrt;|l%li(fi(M0kN7JFi$$S4JA_KO*~jo)|1 YlupvC<{3A2GG5JjH80w>G!9Yx3%8gaf&c&j diff --git a/bin/main/com/loki/lochat/core/factory/ServiceFactory.class b/bin/main/com/loki/lochat/core/factory/ServiceFactory.class index a904342ed02f940f0c729ea542fb659ff87aaea3..d9c47223b136a0d10c207fd60b1d6a0d3d372f6f 100644 GIT binary patch literal 1064 zcmb7DO>fgc5Ph4bb?l}zO=+Qg6c;$8MPLayVT6P#DuEn8N~y$g<8IS!9B;JVL@K`u zPL)7{J3k6B8(aB6sD#Uo-)i2QH?!lPzrKD4@DleOlo%ewsuv`xE9r<&xd~#WMR3An zqx5;u5_%|Oagaj?Wro@rAMzmKX(xEsJ`=HFSb8o~Xtk!dh8{)XJYAK`E}n&N~G*2w9kxmQ{%UBNoTrw^$XnM#J@*e7d!nQ$Xj z>i4xG^S$hu@3~V-e$3NU8NV(3G0iBS`{ukaW-?#*`pMT#qLx`Fqp4eCEi6p@SPjtcxZZLeFX9j;bxV$xYrtn<36I1`5 z9D~F76__X2q)uft(y9~=yPs~tl$}FRdLweH;JD}aC zp9*xA?9LN*2tA?5C@$_@pz?)2O7Q6PC<50}#uk?8tC}ZKTp{G*3RVk&JrcA6-Z#`f z*6SCz`h!reVv7LVBL%DH;u>k@g)PtC<-D!G@Scu&CEOfo-oibK6=L4T9qjxDi8dnT literal 2259 zcmb_eT~pge6g>+DfiVfet<$uGgd|OEKD>ocN+aTakkF9IBrP4!_)!?4EXWok%bDTV z^e?n8ai^Z?TVML4Iz20iU<^}~nZE3oukJnf-m_=@_dkF93E*4&WMD{Oq2V{B=N~B! zjn{T48-C!(1G^FW!HL{;f;Xz+Y{gpx8G)%o`;9FI-&BUrP^T*Gq^1<@zFaEEX^H(<*QTDDLl19dzZYj zUD9I~1wGu$;lAcb#`Eoc1D^`yA{fe-Tgs!|XDAsc3d~*E&>ZHmATa4Vp^miWd;3m6 z!WI+IiA!?~OJt31*b)h+d0swj`>iY3^wt?MTkV; z9JL4fXQuq*eB!Jc)gr!*EOLrFDv&+9RP5y-asfkkkX03UloC@P4JjWJ2?sRWctPR- zr+w!^@^jKU-jkG31~L~YoY%aQ<5S(M4kWdaBEnfwVxdY@#;h=-LL!JxyKPhV+;^&Y zl8PG_nb$f{uB=AxoK0WvuF}qd&{T;RSE)qo{|s(S>}^<@*i`}Re*{k!PB#1Vp_E=y z^h@$4A9wvuz$Y=HOFpS>@<5igbYTvB3Hii=qagTEjs|yojb#as^$>ho{$ zaC)(e@=g!S^`$NzJjb}vr^w(LZFNeq{T5f__#V%b olq$3sqD8icZ9?nf2aT)0C@WFyLTr`9ragA>l0F1pMfN}b3lff!K>z>% diff --git a/bin/main/com/loki/lochat/core/filter/AdvancedMessageFilter.class b/bin/main/com/loki/lochat/core/filter/AdvancedMessageFilter.class index 61797f85d8399586ca01c7b14f06afdac6c36df0..dc2730efae2c44ee438f53d4c998cd9ac11656a9 100644 GIT binary patch delta 1726 zcmY+EYj6`)6vzKJuT8c$X(^V{LfdVjm^2SSP)kuB@(?JA2n8*OxJ|ZcXp#*{ETCeG zf*|q`t}jp?^??YetztoN)Gv;sADr>Ke&id&=vQPM&)o$(OeUMN|NFcDd-j~O+0%BR zrRvvzuYM0;F}_jYV3;j*Hgz=ek7H0lBSYm@eL$a?)${3@%Zf#_=!M4c%ldrLD4E#- zBc&zHTp^Ry%NaAT6^dq0*2tAQG}T9XENk{>=#uQy%dw=H@6DuR%QM-sQ7kR7?zE(y z&zohf$I$-wE1R0Gm3J15LDkpQXJ|R2+-Ih=v{AliYcQns7R{ViCPdPj?HJeddfF(G zT`!%Yk(mT?nNlf}Put)hY&tCvLhuj?e~?@viXP&k;mOT=p*W zg%MQ{VVEqo`6jzLVwfpfd~IyDi2Hi{>&kkvKdu+LbSi|n=sHhKaU~reV8+uVC>!&%Uqg5WVk;4aixEo=QwoqFerL9Yi>7E49;L^qg+XG80Zy8D#EN!T&rlb(%#BZi7FLY zm-*Xx{aeK#S2>C*^!hN zuTp6&Nfu-;M+LZweRy5Le!C#k#V$_;Rdgi|h@-rd9Tb1^y86Qmu2MnI$z5-9_z_TX zOqNlI)1Eor1m5O&hkD@m$JqyBlYgFnAI@-`#3{+05ySp&&pDh|@Y%6I$Qi^15eb}f zed@&*;p>KDEOM8k-|o?pz^Gaxp2}4P_Ln(ySnKzntz}>2kPkRpg;nCx$qnjn+$QYI-qCdk|-FXG^k!ajP*4apF zTey1t7@j(TDI|AGcvB)ehAk)Hj*d`}9JKkg&But!NUHx{N1G_g6|i7v#k0c)`lTd)ZkdjAU8Oz*%J8gd=G(S!X+65oe+X>}M| zaSr`BPp$hB+wdKcKVblW5Pcmxa05GWlg8eSK~{+&Hi^c4GWLqUCf45VBx@ii*~wZO zjQ1#VVkrWY!*Pl-Xr}(lXqYrRx=w!#Rz!|>BFHHSq2e~06}*27>^4FQ61U*GjV3Fo zy&Je{f+3ocljt~Q4+}l7gFe87JLNoWRcj2xqa@nX8=wS$gYe=Is&H8RcwcSwLwrOA ePJC=ppWrP0dP%uR-_NNS^d3+&g0FB1b^ig)wvl}R literal 5380 zcmb7Hd3Y3O8UKB`X0uE=whaU*5bh+KWSat^B`p+!ky};XAwH|mM|M%fhf8Tt2l5L*k*=J|o`R2X9_x*kE zyz<|3=K-w6e>4;cG=`m_P}CW;cnJ>}ZYb=;%}}2ebA2wnMrC*@BeJrP1GMto~lsI4-@w8y$n1VFUpc0|(tccXm7j>M-#5A;KMWpYE zm@$-AaKrdq$VgDWJQ*x)t|!-UESl`M?2uP!8(D5$-gC1wHKpCM&CcXduNmKL z^hQmAK)Vw*qFar)C7)A^CGLQg5Lh;5LJAgnvmeEnE900aP+VQJwVZLy*HMZx4GRUP zUtOW?4ioD7u>gy8EWuK?NWbZ-GVd^Kc2AszU0qYa717*DX43m0Xh)*E&Mf zpoTR9OGalUi&|NL@MAUB%1vA+pjEfE_4KHXT(3ie&xcll%07h(4Pm;`Fk~F8kEuZX z*no{1+5|!qgfkttqn+)<+_cGrOs{UwqGh)mx9tArwwg8{I@v1u<}JHE>gC9XE`iy3 zFAe6XKAKLFbZ?W6Zfqt1(b77{iJFF8*ji6bj}L5{K%T;0mCo&qaIAEuWO8BCk8PMC zJ7TAfa`-ju9;c2R;Phh`_R77vPAW2VOoFZ!w?~3JQ}WoP(PwdPfW)&1XuwI!2}kL1J(qtNo6|SyGz~-D_T{_ zDn1F^Q4f4r%%da}ERkn2OItQZrcDJayL>3!lcZ&Rc|9l~did;>hZLb_-L4TH>@Z>; zu4=fOSeVlkg@IZgO@_VhP|QeVPWDjVi9oop+(V(RsBy@QH;->1RI4CnVLuqU;^7G zmcUWrNbA`Ub>(EBl7XdD$=JV?Z*jxPQzz;o{iO)xdG|;JWdkz zy(%^%0;>z{;Y9NDMb<$&Ki<^YkV=pbj|h}{OLF>oRL5c5BO&rJnYE+R`LF0WB@Z&q zh)M)!PEX)#I=+t6>=LCkGi7rdI3^TG*poRYf)Uwo#$7AHvn1_?gt4b|4C82~un2Jp zxqL>)S-Ct_nc84QBBm{0`fx7iRIp;Xx}MeXO(|5agxb2u{Vkp^=^Vt(m}$6Ki71|z z@!sddcXBf2P1k8AA6{Ulyd??$FG>EF1zN`_ra}W#_NZ_5kT6riujG`l9LlqHzt8bh zuE^8kF`4}z>9{Bhq{tcMwhXBc908w-P8Lk<_=|&x8Q1W0Civ=YPLg95!zN(NDmb||NEax~ zfxu0;aU<4Yx&uyxb?^uLNy8sG;ANe(?ETK58B#-u!q!%POE~dE5_B&MJe1otDQ=~3 zgJDOaW@1sh;|wNa1<*UEg!2R?+7)2mnZvI>DVuYi+Mb02*|GjQUN(sdUwu5 z-kl?jcjsK<-8o%&cTNYqmr?`AA6_f?w1(P>c-Lx!;tZxgL9z%ldG&kCl{7IEv-mt+ zv0*l@=aY0mnr8`8S*21YUgv5#-(9FZgE_UqVN{9Ey63Ur7y@f+b~)lMRPFlmZ_~HcxzK> zFwo(XL|HI!2ld_Aqy+<8iX~AQSiZ7&6EZ5$KI5%Jt z&LaVrK2_3-B=*yvAgv#u?o!&HheM>wsBeUAfrm`0bcXmOOL1Vu2LE@AW_*7^8ODGQth&dKqqP1siLWa5Clq@Fnf6JhZ;WR0)!wSB?D>#A|vpPH*7ZhU^8NcT-PUo^Iz5GFzv+gW@csi5$xYx5A zSYB=1+KtTi?cCiCEX18yg-uw`QtiNIQroc?J7A%Q<+hXMvYWfThtp{<9z+-?5y9gy zIY3w}+u6jQKYRIypOCWX+fO~}B-a#mnVLL``csrw88w)61@krh>CQ2%* zYgjov>QwzO*dqRbX{j9l%1hx0ex1cXRjr5FIQI}fk9hGY44jsZho4)o;Wt!SjNejO c5q^i)dG~SU&;0)df8&#!&Hj#mGCwo_560B^^Z)<= diff --git a/bin/main/com/loki/lochat/core/filter/CooldownFilter.class b/bin/main/com/loki/lochat/core/filter/CooldownFilter.class index 97bbc3dff8b79e18c9fda845b76a0f4e672aece7..f71c9c2be284485227d08b17e04590d5d6ca3a5f 100644 GIT binary patch literal 1566 zcmdT^U2oGc6g}>`bqgIE9pn4M+jwXZYJ>zY6d|E%JfIFHZA=<(ZtAAqk~nhQqW&@@ zkl-Eu6XH7Aw00C}JRreCuH&2I6W?=>{q4u6F92TRK?Nm-hk=g$NFOT-!9Z9)&_?=w z6^%Rg~|ar$%=p8E4P9x3oWyT*aw2)^EU~l$-Q%IOCoam0e%BkkZ*s2h{8pC?MbJp%XYly$)?6A^NiF`ARyVC3n>M%pCqXQ8g z2&3HmBw4ltl`%Z(oIf|eKYe7@d6A~km|?p9-6@2Rn)n)>FclQ8eYLBU13v-FjRL6hwYOSGi-oi zj-GjnHB_)jw`~ne@bd8zsx+49`!X(5T%p+$LeA0Xea7lxt@aUDzvh_h6c-2slyQS% jHGlVT6Sru_a2t1KGTfcPusMUFg!{x(0>@VV4~C7O%xK~~ literal 3057 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 MZxZ^1$Btn8KdEKDOaK4? diff --git a/bin/main/com/loki/lochat/core/filter/filters/SpamFilter.class b/bin/main/com/loki/lochat/core/filter/filters/SpamFilter.class index 765cec66438f0497a3710322f152099f25af5ed4..49831542cb24530714dbac3d791db5a620dae318 100644 GIT binary patch delta 179 zcmcbh@Vp~F86p@w7;=E@Tn0~uLZDnNP;DoJ@8m9lXRLuhyMiW{3cd#b DhASWr diff --git a/bin/main/com/loki/lochat/core/filter/filters/UrlFilter.class b/bin/main/com/loki/lochat/core/filter/filters/UrlFilter.class index 92add1d6cdee290c7cb5d8f37d2e3d7db998506a..67547a21de5e81ead0943dc29849707863a202b8 100644 GIT binary patch delta 267 zcmWNM%}PR17)6)lM5K%Nij|3#VN#k}VcH)$Fzi+sL>OI2!9m$9nl!T}4MLiIv!0+~ zPZW)MfcpZrIdB%|eCMpq4hv!7`_V}|%rHv~k2tQ@97$57nYVW*aI-{N(sY?cRw$9P z(D@DWdb>t~br#qlLs6$qwkdN!g^uV`rOOsqy6uU#?D9aJCmM{!SN3>gpNW2ah$hb` zEh{B{%5B+?Wj~SKSMsUcXY6oJO+1wMhzm`-+Apo{e&u>VRT9v*M2TJSH cWN1_OId-QW_wtVH#T!K`_UE-D4J#)7e_J0a+W-In delta 267 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 Jf5v+_@IO7X9K`?t diff --git a/bin/main/com/loki/lochat/core/service/ChatServiceImpl.class b/bin/main/com/loki/lochat/core/service/ChatServiceImpl.class deleted file mode 100644 index 43026249ed53b75cad07799796b1913aafb7fdf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7203 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 KofottgwlWM36~E5 diff --git a/bin/main/com/loki/lochat/core/service/MessagingServiceImpl.class b/bin/main/com/loki/lochat/core/service/MessagingServiceImpl.class deleted file mode 100644 index ad532ef4f4ff9053519887e9751e2c7337d4f37f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3709 zcmbuB>r>QL7{;FiTUJ7>3a#~qXhmfKjkj9cMZDk*U4?cL3-)4m_qYVI$u`NZQtgNS zKYnOu3e2=K{R8?(b^4qng(WOzXZnF`a&pe^eb4hg=M8`V^T%HRZsF%Fx&$tk-I`&$ zD;6*1B{ML}t|tv&dQGb=jmOgW&8p>8i_ySzt!`(L5!k$R9GFj+{h-Ihr0zeJ2#&uW^1j53q)`n-VV*H<@bmpi2uHy07H*Qz?) z{U+sVrUe- z994N86UdEpx+xX*xQ|fz$B2?M zqsk_*uV6XyNuySh-ke#or9gkdEt~ed=~?PI9?S$wmM@UvwRT5HStK%pz^M)#LTg5f z$7bL*JJVNSz?VV6^aHx6DLvl|EZ1SskwWOgMqt^-)2GvS^2z7iymG}A9T#ya%+_3$ z9?yMp9^VC~SCy1)fY+U&Sdc`hT+6^rT_t4NRHV1a<7Wm9k9uG0XwgIqDBQ$kUL}29 z$2EMxqIt6BHkD*8J0I9d4tIJ>$0TmB_DiOpx?)j zbdTk8gq>3jKGHF*2K!2$YgWoE$LwQ)>1|e(PGAMA#;mP`&bOK(@g`I=?7YRmV*qvr z6=Oz60i^c$(y6FY9oe11^gLOX7IhKG#@13U-@#_iiZ|yL>z1V1Z@({RM+U~qs_R*X zS!ptBmeL61>%f?DYjxM*NPaO&_8T2f!G<d@^ZPOB~asKbHFEtG9(dQq;vdJ*XGlw28` zR#XG8bTq=|=bKG_T!!$Ij@N2HE4mG@Ebm#W10HVI$IdIi;3Ru#H~&81wO@Te`0qu( z>geGwTWt8t9)=G&YagF}L56byV{`-iNB_jY!UjHG!$IC2S{UEJku?nRerREA11Hxo zJo-C^*Ky`IF6ly!*CXf&uNfRA@EEUyIE&*r&-6$6=0t?Y7{>X;Ksd*DBD^zjffRn> za4Alwz}YGtjd2c+jj!YKRwRvcfz#a1nHI9PN!IWgu7+d{pYu+U*?su?CD(N!A8zGupXUQNB8RSuFkRlf1Ad7e&24QcD zgS1v&>HA$W#0)Dxn<5OmU5tCs;`(9bdNV2Ve8`H<()%6HZn+z^lB7QGn95eW8?~CG zzUY|BMoNjJ)48(abPiKkJ9#=~im2?gaiXoqNulb=JeN~Y?9DN%wcHBjC(G@!-1QV3 wJ9~^%O-dPgPt;7CNm`Sg`&CHOqj~Wm5b9&lp0S!_ydmRlTgDqk?!w!D0h?C|fB*mh diff --git a/bin/main/com/loki/lochat/core/service/MuteServiceImpl.class b/bin/main/com/loki/lochat/core/service/MuteServiceImpl.class deleted file mode 100644 index 55ae702e0b97a9878510d450e26053b5f477ce5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9132 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 diff --git a/bin/main/com/loki/lochat/core/service/PlayerServiceImpl.class b/bin/main/com/loki/lochat/core/service/PlayerServiceImpl.class deleted file mode 100644 index 038363735983fddef242b98c73a0313f6e8479bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7285 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 F{RP}p0Eqwq diff --git a/bin/main/com/loki/lochat/core/service/PunishmentServiceImpl$PunishmentSnapshot.class b/bin/main/com/loki/lochat/core/service/PunishmentServiceImpl$PunishmentSnapshot.class deleted file mode 100644 index 8828fc96f28adcf6bfbb57d16a9c3dc92ab44a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 840 zcmbVK%Wl&^6g`uqabpZg!@Gs@5DVynk=Q1x1XZDtLU{zWLaZjvD4t@EqnU9LpTz=I zg0>&PMYge>3J*yr4P?tJ_H@~ diff --git a/bin/main/com/loki/lochat/core/service/PunishmentServiceImpl.class b/bin/main/com/loki/lochat/core/service/PunishmentServiceImpl.class deleted file mode 100644 index 8765ecfc4039b6f32b190f7863bccd27d69e0e24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11224 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 diff --git a/bin/main/com/loki/lochat/core/service/messaging/IgnoreService.class b/bin/main/com/loki/lochat/core/service/messaging/IgnoreService.class deleted file mode 100644 index 56d37709ac0a14721c59c1dd3b5ed2a25f8fe43f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6503 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 D4jpH9 diff --git a/bin/main/com/loki/lochat/core/service/messaging/PrivateMessageService.class b/bin/main/com/loki/lochat/core/service/messaging/PrivateMessageService.class deleted file mode 100644 index 152fa2b3272c7edf25f4d9731a0233d5919099d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1534 zcmbtUT~8B16g|^cD%)+Lt)QT26~(q7>$fPiMnR*ofC++;w_zRI#qDmhA5HjAK4_vr zG%-H=ql|ZFm$tM`eDGyv@0~m6o^$V={r%_rPXLcmO(Mon(e0*Y+8+#B^al4d-FAfL z3a4%8LTd`w<#ofVYp)!m%{{Ru9bz*)Pa?rEzQ@~KGdTrq?CuHOBbUitZ^gFS!g0B0 z*cQWBO@{fNVQOoV{UD|SY7V7t8{;)VpxV(Wr!C`+YE^n z`<+k_M_R=wlqAL&=DIm`+tPi<5tgSBvFP(TcN;`TK?dnjFyvI6z(_#Wu*ACG+!fAi zzH1V}T+PCTup?)}YZxv=we~+XBqe!Qc(s9w%@+Gr_uHlI6sB=5iL(spu2fQ_ zVg~1_GA*CFu@nLIv?wZQucs8E_qwRYEtBsHhdSDyo6bD$)CJ+^X&t0LH$XqiAV*-M z6^sQpN&OK$>6hIe7C0~x)#X6^oQkU`l2Xa!C}*#TA-a+%Gi1623z8~Wz+w{DsMXzr zBbF*OTxU@1_v^lCh7(a7Qq^I^Nny?rO}j0QKZyKbePlattGE*=8VN7aFgCdR&#OB@ zG488)0Lqu5VfVOUxi7^&!^AM6JEUgQ_8nb3GlKb^9{Ro)gHqrky^J{hGDt}9JZMjn z6~jrg=ov$yHAS8$6vb#CFCRcH|3K#L0mi=~`&mZkY0XF+6$$zpgNjq+Q^Px$z$94= zr*S62+o0$mZ@T;i+4+S-OvUl03#JeSAWHx_2~-G!BOtnl3n)nNG)X8>G{Ys#(jL;k zEJ;5lTjIzhhqw~MFOsugJ1);lVNZtNj6GCzcAd4c&|o~Y6N*JHb{Gl ql27*_svShNgLoJBBE&}#Vk$yhis54)y_p`cR0k~80jtRPhkpUHFk-U+ diff --git a/bin/main/com/loki/lochat/core/service/messaging/SpyService.class b/bin/main/com/loki/lochat/core/service/messaging/SpyService.class deleted file mode 100644 index 723e9d184a8cf3e66107da876f306ac90509a6d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3724 zcmb_f>vI#=9X(f;w0bN76ap-5nm`GDVl@QVDNmVxzU;U%?@4#oD$9ILdY)Oa>`J~=pDTrf8sY-m zZke-YzG`yj(!?!U_60IteeR5HPE_Tjz}BH)!HjQJ^CjsQ1=1y}Vw?VqD+TthojuXg zy>ex6p!hu3ZwY9 zZP=;xNvU}9#{o$4|OWrP~A+TFV0!h`{qa%%s0@bqR@Jww&x}yqbf!vT&HmhT%YpH%T z826_vPvFox*?$VPiYDKwRH~A63q0P@5_&*P=Xe(TuwTRHNl+6LW~$>E91ut`L*KM) z`hOzY-6E1=xW7Y3r&^qJWzCtD%4D~W9yQcvPEtL|dexkhE@k$~0O+>lo8@VO9c7!c zJO)dN3S=i-$DAyioNsWj(lvdD zc>-49?>P4TA#P zTVU)9(A04OL(~d03IP@9c~~nOgPg@MMl@Wa$Xjf$p-9JNd|Bo0U9zi`eQ+Yj)d?Nd zaV1cXe0j#KdMUifW%Hi2C#AcfEML_zj%xxM!y7hh+`2aD2;vNG;3W-TT~o}$IUQev zNdvB=5X&?$(8^l>lY@u$=cy#JpIZdHV8O^)0EUj6_ngT7S=c78ekU<5O zhADxrPpV3lQ7<2gFHblA*+7S+U&k#>3nc2M>(Sb=);JsLvZbG&o^xC)Z%)n?@?!e6X}ereD>iRI$jI% zvAi?2x<8k~HyOgYsxx6$Q}{M<59)6guj363-xWB!p>5u%mRYr4m2RGzvTRj}EPIq7 zHAvw78ZFWBCf=epf|Y8GzzaOL{~zPz`gMFy$M^9Ax@g1|h-X6&jUbEb3i};iPNbn% zy&w*T6s7QER)vq2k6tT{T)px1N6T{FpR3CSwvMiz)&e^>TMoc;_^B$EKNC2@|2IX`oqX*q=q50i(u!km}VRlW&?G4B6IEY?4%m=&09yY(wh~QKdLADuz z@)8TYC@g>jEmpG)tJ%mZIl&jhbi^Tokm8O-8Z&Z-?%_xwuI#RWkE%j)87~>h6`T_I z7tRzCM&drs6*NQp80QRa1$?gD!AV2wzK7CX95%F`pwVq;Mm#r0biN{R57%=OJ&oq% zK@Qx<%@tH*P`2v=cOSf`$O&=kB_%)?zdgj~Aiur1NF**3g6oXD!q{u<&v52790@W# zA82B+k?A5l_yH1&T&E~whM2`|`p9zR6}IBEK7u(~PtejJUgbJ1K>R7h9#9dQ2BBd% z_`9L;*421b;6J!V!}Iuh1mGK#pAz9xh}wceB>usZcaX|0E+diqRv~^L-(mi5$52QF zDE~1258SxgmitlZ9)40tHsMY!qhzESa1&<*ciKpQjG~c_;C|Lfhj4coX(O5Yxe-?g zw}3rqBw8V+y#V6BG$HPz;(=q7Vu3O&5{MH7_9PDT_c%_W#6-vWua=8Gg4T}(46w4F z!8`1~%lY5)jiqFJo#%s@H(+0Cz`n$N?*_0h;g>|Djeg$5-3ayt{EDpveOUn&NqQUz zsL<&5WI#naprR9rEveH4{{eYQuM+ZW@}d}NA>|V3_ziv=l0su)4bT;~l%YD8&Eua5 k0=qyZ47HpSy^)3NmD delta 85 zcmaDN_dssL9$v=M$$NQsJ3BE5FfcIKFmN!~Gw?DvFi0^tGAJ@QF=#P3Gng{CFjz3S nGWamKG2}A1GgJfVdInF1W(F^YsSMr>^MLe12H(m1`IZ6z7U>b? diff --git a/bin/main/com/loki/lochat/data/model/BanRecord.class b/bin/main/com/loki/lochat/data/model/BanRecord.class index 161ffa46fb75780f02eadfc96124c93d50ff30a1..1aa125a31767284ca1645d495d06266ed3cd3a17 100644 GIT binary patch delta 33 pcmZ3-v58~DWoE{Z$yb;)`S}=_85kIp7}yz<88{hKCv&i<0RWF!20j1) delta 29 lcmdnQv5sTIWoE{J$yb;)xw#ma7#J9o7&sY}C-bnV0RVV;1_=NF diff --git a/bin/main/com/loki/lochat/gradient/GradientModule.class b/bin/main/com/loki/lochat/gradient/GradientModule.class index 93344ea4d0df91f980156767811ca0d9e2713282..d37dd65258c90a50ddd14c5d62ce4e59a73dd945 100644 GIT binary patch delta 286 zcmbPgy4G~VOi{+l$+BWPa)&lBFfcGP$O1_r1{NS$!obc@%D~4^!63s>Ir)L84OpSM zFhsTiDBB2>Z2`)*0%eW3&oOLfU}O*l>a3o;K+F=Vt_P^D7pQImP~F7IFT`vZODC&} z8$)Gh0A*(~a52nbkYJcQIb9qgt1XS<)#U@_?(wl&^prrcb_dwcDQl0VmW;6;fi8 ZPXI;E14Wz|FHbg>a%H>@mhF>b2LNP8L(l*K delta 274 zcmZ2$I@NT;Oi{+t$%p1hPyPawDV%I5ZVZ)~#K6Tcg+YR0 z>f~ApBko&pb3tk}Cf^a~hN_zbR5uT(ZazreWE}}Euqhgo<0W7!mH}0)0IFCCR1wLz zesZ9s=;SvN>WrJgEKNyu#_d3s&E#tmVv`q3s!tY{6r212NCyCESt(t{4odSu8dNVo^xm%@>eG`2_ExEXpJnHiaBs+ zR(Yo1bx-%*e%iZBOg{T-EFtw0L7;(~CSKYE=#ZjIR?Vq-9Ln^l=&sVI#z1Sxh7kw# zsGb;eX2OjrPiDMyznSx6Aug8UVI@9oKWoDJmc#`TB0|)(;tz35!Ai^2Y^{te&DSda E0mGjyH2?qr delta 164 zcmWNKF$)0!7>1v3xgWqlCWS7y`2(^jzu*>Sv0ci-rU<7voH|a~?N>HsHrmLd47adY zE%Hsz^SsL&+fO^Xn({f^%#!pSGQfZ&L$whV#?+M!WfPY+6FS;mru3NU;<0DWQF&6H zS#V*=9iNyLFYPyLer&`blmuHzsi)bI)2A{9NR~VWEdsCj5I1nFs`x=<)g%nQR_hPV CZY+2J diff --git a/bin/main/com/loki/lochat/gradient/commands/handlers/PrefixCommandHandler.class b/bin/main/com/loki/lochat/gradient/commands/handlers/PrefixCommandHandler.class index df6401b2a27e98b872096dac2a59219aa890b369..00a6152cf6c2a689f9cb4dc04645fae5ad4754a7 100644 GIT binary patch delta 255 zcmWNLJxhXN7=^EgpoXZBH_I2bEhv*vQ}cs_#KJNtj2ik7t?&b*Abkncmj1#sIO$$f z;o{WP*i?fMP4)|-en2<(aJV_=T%3>KAow&i)Q|o){zi(J`g3|Qp2ou-UXEDcf@P}s zxWi9}09`^n6Q<89FGP4H#v5_oSz}0|7qcgnKgB2;xY)$a7V~TqCBr&9B-!Oa;KyV+ zXP=6E_Z;>fX0j@DBDGT{$uUKNSK02L`#W!WWpuH>$@&(XHuFh-4W k>KIr!Md!HHUk+=cAx=}64Q#Y@&dexFKbmRP)W2r_A9yh~>;M1& delta 251 zcmWNKJ4-@g0EVBBAP32alXVVVHbE=W>evNC$inQRnALI=vQrjaDMiqrrN8hEP4*8I z!^Nq|vB?IZDRgcNT>GYXc;4rIJLZ>J?`q;#_O!nN8(n^n`c{(6VBzJQIc}Ke89x;Q zys^YPCQX8TuuO|pK3Stph%W1musbXkA`G(0BwI|ejfa>j?6AQu5#k(^AWf1p4!Giw z7mga$v6Ki}N=xG+!!Rd|lVz4u7O~Z5jwl!Gb4f}`7T1d2a?hPK^;h=;4jyrmN29=m g%4v%7M=uVQ6e+9C5+giG+t?EYSuK8 delta 93 zcmexh^u}m|kT_$_WMOerZY~BU1_p*;2404c$>HKlB_kL(7$O@7w zV!8y{jZ=^v^fF8zZu(ir#XbXEF(}|60gv#8pEgx3Awl=lI-S_vNk4Jo)cz--QK)0J%Ezh#(&u1*B6%CdHZ( zYH-p{DFe8eql`7mIiZ3Z+&ogrv-aPp^8ZA=m>TOLy4$#F38Id0>WQWSyEKtTQfVTK zWD4U1?~~Jmp}SU2>pIf?6HZoqU;XiEFn~0Jp?mI7(>J` zEc6IT(iBF?7Oa$UfhOd4k|~XkX||c+oLR1v;0v$N^VVuyfQeWnkR>_v;gBY?ER0|A zSFG#!Mw7FyRyNeiCTVP`n{DOZQKVfN-xGVERSsnOkb91J)!sX&eCXv<|NU}dRVQSa Ee{bYi#{d8T diff --git a/bin/main/com/loki/lochat/gradient/gui/GradientConfirmGUI$ConfirmType.class b/bin/main/com/loki/lochat/gradient/gui/GradientConfirmGUI$ConfirmType.class index b2271b06977570deef1e14852eaad9d7508899b2..999819e146f0699ed75f169c314c99e87031215b 100644 GIT binary patch delta 23 fcmZ3*wTf$l1qPsty@W^fK_Z~jba9cSnP-mTi>O77b_{kNwJQL$fgt@d)UTaO4!GK4iKV@dJb}) z0Bszim&4pp9HgAP1bIRQuQ|fB@=t{MOeOPFu|PGyILdEo_{%X#rdCopF6$JtI3XK3 zDfvE5NilWe=d@H%FEuns0}*NAjI=3saaQ^{Cs7(@h^AOhR_T)NX7${no-gP*t>kct z-CWk~S9EJTO>}7Oq(`0hag`|77@?o%Tqn+e`n$uC{LFqT)n?G`cBZgYr=u)mOe20~-nsJ=N}5^Was5|g zs=iV+uBvUyJmIzD`pbm+pVZ8!H1kO|@P=I8nz-kp-Ec= fDYw(jg4dQW36^Q+%Dl3j@-5Mi*tYyIGj`-3Z@hLQ delta 490 zcmX|-OGwmF6vlr?diV%RjUc4~ah$&fO=gyXBb7+eq&ezPKBG*hqBMGeC1g*8tgJ5K zSQbKzI(X8d)`GxBBOOai@B(;FguGC zKrzW|V-?$3E6<_?A3Mfg`o3FFDXD~5O_|Cea@j?Y-MUyVtza*EsFSv_j}F3gv7hTy z(kFjF6>$#mf@&s-Fr)n}walsGD^Y%MkY60)5A`h3V97LE22GYN&!O2i(qctH4%<$S zSeT<$L#s7%%-U(QGqhWm{0cGa<+$~8!iG3GwkfAPspqtqJH*_n@0_K8^P;{Wf{S|b z5~sLKx7IbTa+4eMOP_O#*YuL$w)py(=Z^U9@>A(w?%PTp+8W}P&Y&0{TP9Cz14HKV z)VA=K{F}fe&-Hb)IIY1(^5%Nby(wl<$`&hTkxkTS^S@jC>d4Kz5b0l--Gm~y6?_A0h%Xm)))2=K~x%`7pAKkq`*k;|gK*&D1bzX(dxh5}UpIux! I@4k4kfA$e?ivR!s diff --git a/bin/main/com/loki/lochat/gradient/listeners/GradientGUIListener.class b/bin/main/com/loki/lochat/gradient/listeners/GradientGUIListener.class index bedcce6b2f255b45226050d2dae600f540ae61cb..37059d423b54b8b9fc662dae0a135b82ccc1de9c 100644 GIT binary patch delta 471 zcmXw$%}bPF6vcnncSai&MX>o23Nrj+{Hn&09MKU$MH3yZPz!vWNlkF0rILcH7OtOV zwRT|(-MDfkxN>O=5&RFLZ4d;WSDD4R_uTV5T+Vr(-AkehGgQ+<9WNE8R|c|l(&HJ!5^mhOP>Eso5ze*^4cEp#+rC*ZOmGZIU85cvtV=hR#0DJ(bn=5?32ir;slvT zWLS1fnZ<&5cBkD(uC`V4ETs3Wvm!q%tnjjF%7To{#%$TCyOg!CVPmDN ztSoJ0X=Nc>rIhoh>GqxToqO&*=Y02mhd;tM$uf674swCC*(n>%bSU#EiWJofJIlxfyn zD}}UCs?Dki(L|@Nu&xNhbP=bU6g?c!%L!4==;xjR9vS3`A)blx$tYip@x!<{m=F(f zsbETKnU+RoB+9Iesh?zC=2(yw^=mB3_B09ERkF|0pWc}LCX&kPRc1?*zrBCGg|aCQ zaq1hEip9CORQND`lB>+6!@ZjKa!X3gh(F|BQE`@j%c?o{zsQ2I0x?OLt3do04oyf; diff --git a/bin/main/com/loki/lochat/gradient/service/GradientService.class b/bin/main/com/loki/lochat/gradient/service/GradientService.class index 571d257ca785e8ea2e9dba308535a36e410d62fc..1df1e81c15b8cc24aa35ec2283ff71637092ecb6 100644 GIT binary patch delta 97 zcmbQszmR`JF)J?<11kd?10w@F0|SHc<{9 delta 93 zcmZ3;KbL<)F)J@411kd?10w@F0|SHpa1IwCDwi5K#2C86S zVCZ9DXXt0(XPCes&M=ulm0=2l0mF0#ONJQ?J`6K~I%ffO&H?JonXDqD&bVN*kB|%i D&=wkW diff --git a/bin/main/com/loki/lochat/gradient/util/DisplayNameUtil.class b/bin/main/com/loki/lochat/gradient/util/DisplayNameUtil.class index 653af57e07ea95e22efbd966c1c9397a61c3f500..5948528d2fdcb70db79b15a83ede7c4448e92055 100644 GIT binary patch delta 177 zcmWNKyAAu;gImqz)ce`E&Ozd(3O6VHbZqXKiRRQ6WO;2FeA!bURNYp%i>13tu$?6b`01v JVyPCs=O1y?9rpkL delta 169 zcmWNK%L)N;9EHExup%>q1!cp+Ovo*1lu#717@={$WNRl2FJQq!{U2doz{<|EjbEqE zS)9}P9(G`Tp1O8aFa6zehyoU23PdPkQX);63>ETJsfota@gz?)xJY-U$sI?n4PX1J z!0^&3Lh{lkMu!AFvh-y$5Fe?V`K!1>nacN!By(~suvrOlErbnSwzAwYWY2^HE=zTe F`+vg29TWfn diff --git a/bin/main/com/loki/lochat/gradient/util/GradientUtil.class b/bin/main/com/loki/lochat/gradient/util/GradientUtil.class index adb1cd93ac04c3ccf643d682de3a70c2c021c4c1..e88ce88a27f481cfa9fbed354382b6d16aa031fe 100644 GIT binary patch delta 486 zcmW-d%S%*Y7>A#;8E8mIn=>PtWO->yN^^8{x+rAoC{8707sn>?HUwHsh}0CisU$Cm ze%er87Oo00CPpesFgLDTw2~+g#9eTW3GEq*>y z!51o7Bfz%mE*JPmnFUqYN{e$CEC<7Q&F_p=Yu6->cKb^Ice#Rt8l2Q}ggRUV#niwF znv@$-<~3#95K%K%xoPrTe{$|<=3TM2QcYO@wsBpQVIo8cn{0c|?&J_%q|vP{d$e6t ztX*c)Zb|D^W}lKCY5SNt=N`A8suP!wXPWq&a@8sZ%}@7j%W1rxz0MBJfR{R7iR`s} zjmXd_g^bD0#DR&6OwlMCx0n{$4EK4%0}>4A{zQfbc_&}9I_Fqqo^{m?7Wk!aJ1nM# xGUHa@y?{R`W{FcQYx$%W|HLI$q~zPOpkP9#KNE~%xaW9 z9@qzk2?e5J4fQZQ=_ow3poqdV|A6SQ>*&6?pZmGK4g>pv%_~J#Fc&UzS(6iZ04Hu- zLLN>~!by(fql`Mrxj-dd+T5UuVZ7X=nkoFGI75cB+~*t%!iHL2P|pSp>=58Hjr`I) zpozcKTF_$lioaUl%&TK@Zx#7cy~q)QIJiUwm&My5o{%`gQti~{nyGXAD7}s?bss&n z5uu%4y6Izxe#VIyzx~=C5?ho)`ExTOuQ7RwnxA%G;TQ$PIjTz+3DfG#+Edz0D{oSa zDS1uOO4|H(4p@1n$@MQbqDz<&(;c;OSAE=51GAjw0X58Vo`+mzUh0n+zVpk;3dy_r&e|~zp%)6z5QV+XWSX9`HjrJmBg|NT~YA&3jKi=R#m~8!mTUD W2BU1s>PK$#N#a`~*v^GKr>y@!Xk2Ij diff --git a/bin/main/com/loki/lochat/integrations/DiscordIntegration.class b/bin/main/com/loki/lochat/integrations/DiscordIntegration.class index d4ff258e50c5b98139c1aa7af18352ff2f531ba8..89a0389f4d96170111bef5038b9d84bb926b055e 100644 GIT binary patch delta 203 zcmca9{#JZL4+rDq$-Nx5(ozg;3=9m~41x?g3_=Y03>#-(In-mumDw=GYB(SFo-Z%F~~4jPrkvaIe7vn7f{7)xC%R<3VWamN1zHPpbBHgqRBj5 z`cVC@Kv_4StOtWEgXd%~E?dUb$sJtEP+1=ab_QPt4hDaqTLLEU;!5QV2HG0JAixkh bS%ce+GXf|d$-u`DJ-M9Ql`(GeUTzrx`I;i0 delta 183 zcmaDWep7ry4+mraQw|Tt^U3?d9>3^EMnlk+)^fijEXGFCttYoLq`P)2hyFBcbM-ed_beW*TrpsWLfEQ90Z zC@x#Z#K|+bl%X;%3>*xu41x@9lh1Lba(XhbFnBQtFnCY4;dbNnV_;|SXW(N9oZQXr L$`~^FBDV|xbXgyC diff --git a/bin/main/com/loki/lochat/integrations/DiscordWebhook.class b/bin/main/com/loki/lochat/integrations/DiscordWebhook.class index 704f51e4e35fc04cf18baa360de90ee68c1e867a..1b2c10547580437fe0d9d5ead5d0d0ced95fb3a8 100644 GIT binary patch delta 363 zcmWNN>np=?6vjV4B`uezQQF2=BhK?ay$2p?|zcvxYCAfp^J#uei#WPH_mNnx2(yvk)N)AVs=GH9M* z!NV#UtdYYyMm8v5lM=QlB|w#6>QFSZO&2>-cR6H_2xmmu7x*DDj!1}pBg8u=d`SOA zm~T$`k^YZ}%E}LGpXxE+U1lXs9HZ#D6vu1wxS@z!tlUw~JvBT~%M*6u^5Qd1yeOOb yB1ubCzvk7-3dsc~NoI;nrX`^n!T2aOVOYk4`F;r0i delta 311 zcmWNM-7AA}6vsc0NTb9Bsb|~cDN5tU+l5j~)<~_)J6YJn&BU|f@vnPq^>fi3L8*Q_A*60k!R zyVS9VUF3~KY2|=64(aBIUXJl`!W5?@IpbdJpSa>hFiV`A@VwwB=X?n-a=|y3{0RT$ zS~VGuT3!{5MZ+m4fRdynPHt%CmQL<)lVXsx3N$>I@TW@6c#De)SzV%xW%+zXBw<{v U(at(OMDWVY&jt%@s)CvL2SXr7&j0`b diff --git a/bin/main/com/loki/lochat/integrations/LibertyBansHook.class b/bin/main/com/loki/lochat/integrations/LibertyBansHook.class index 39c670f744fd50eaeee6f4ba047a2a5c22999b26..7318f2f039cb5906692b3eda096e7708438829fa 100644 GIT binary patch literal 1256 zcmb7DO>Yx15FLlmZMG>XrF^!f4!tB2%3e6psuDy+NNk~^p%UDjjoD1IYp-mlQhpf{ zNO0#zA;xJ?qOvOVGWM)z-+MED{`u?ccK~<+y8%=fJWX^SWqO1ZlA&-BDkoDT9BO5w z82i$=$xET^Ypq8CR2i(DiE|NULZ#8W{+Uc1gOz;jr{Fja3!FsF{k(~;IKA(N8 zx*=Kyoxdz_mEp)e0a`D2z+k%-Ym-L(@o0oDqCudWM8}z!NVC`evBVvo%I3eW`ig-142oY)NQ_38$Np=03jr-Pip4-?J?M7jaWTj$yp%F6*}2 z5_B~0n1L>wfLop!2-orTx>({~usUTr{#Dm)DabRF@0#~a-8LOdzrJ*rHv@*^ay#G+ z?%fkj&QPm&W11^M_Y<`~_r}y<=sznQ5u9T++)~Fxw@XEFST1O5yXjc&nV(3jw?9Eu%}0<;sidTRujm)-L`}?XF8@Ov5sxW zT8Xv#HX~yfsx%Xs*(qWS;|fkP9L|J#o3Dyfm`KH1Yr5Tb_=?s+IN!UnubF9hRTvx_olgI z(@IwAZqu|EO;5;sD$ECWgirPDS-f{W0di-P#u3dP&va!Ob~ggE*_ty~(pZY{<>KFF zI8@E{jyr(}R%w3BRT|0Kts*Yrih|1op6T#5D-~BUOY=pux!{N&+I*H!E8DueurNDA z^F4@fRZOAIFql>DVHpnWOo@g__?H}6HVQ+}4*8XYpA6@`$9>|)P-wVq zugNb9S?rE+_IBY*z x0wb9)<=0`#n8P*FGhD}fiZ~wM$vfYTp~V;~=_PhTmEpVp;d%V6o;PBg#!K>B=Ue~) diff --git a/bin/main/com/loki/lochat/integrations/PlaceholderAPIHook.class b/bin/main/com/loki/lochat/integrations/PlaceholderAPIHook.class index 70e11bf43aff768bdf1303b1f34595c8ba5a15af..a2d2df4516976f0dc855aa07044316e76b51cdd1 100644 GIT binary patch literal 2536 zcmcIlT~8ZF6g^|8zkrasg<7cf8N|*f^lA+dqF}6myIq&VikcGD2KA6(q;xm;f zx5{w4{(q(#dknMdx+_aqWLSJ94n+`&q!&ClMw>D|Wivngk{D@qbSS%=98Oh~>%vo` zJCTg-Q(mp?_9a(ws*UrIrk9c$?_854Y1-o;cqo!YJKm9e$oNrP#|4?d&zW-qkrB!9~{fJ>?!Na5m%ObEkv3|Diow7 z-`6IG3)9PDnK;V_RO9ZfHma5JwR0l6co8XgOha%b&M)~<*an|*fWq5Qdm(QtIR0$U7 zUT$>hPN{t*4Z~8saoQEC6WbX8lJx#~09(Qcssi*# zoQPINgW=uTa^wYcx=VF=Su>pK zziC#$wE+^C#dR8cJfUy{H>qd%9Jgra?E&fw>W6GOE@%640^6MlYFqD#*jUV0nnz1kn&6hK3LbLnt_fX|>UM zi@@}h;W#?E5AomqXN@3L@-^TqOQKT3Ieqnrl7JKvoJ@+Y=JrDT9=8-#LnT9G< z3ry=Y(?(Y|)o<84_5LI)qPEkD>&af-HYJ@~47o$5!}v`~+^3W@(_X^^bqpA3*Bmqr zTVNJ*FmbjX*Je4AZNZK#SyDzvdc<^0T5e6JEjQ>DfyJGcorvu>+6|+!BHZD z>9qUKNsQWPI=<6oP3)E?o|Yz_k&1VhRUE|^G<*@yQUl%YWT4ut^a%UL2NOcyWY>fC z@XxX>Bd=#Y$r5=UUsmxY)}mh`MY|e~;Q^k~bT*|j?x^JbiUjcErTCUhwThRRf(bpc zpsVpUysY8`tGS>xHu&wU;UvD!;^YB}8ku)d8Se|ki?|6m?RZ7QH+|@!t}Ygs%L{D=bzJWFS&YN!v(o2-wmDF_;5FI-RbtXW$XDT7MNccjpA5KE(wEd z_S(sC%ihdpO?L70f?D%ojakS?OJMTzB)?Y@Nusci0W4RRT!GH<`sGz7K_Z_?%}P() z2PFq74kf`cp0Aa3 z11akFy%Dt9h$h-x&Nb=D3Xal`<(%^-L`7}vJcq!5WB>s}DwGb(V+9IVaUO=41z&-{ z>Q7O+rc~*Y|3N7q6J+BFdpOe1@y~;arDr+*Ejp$4(J|~fjZZxBcM^S) z5F0)5R}#8UJn4x)kcj(4+7mZO7{1J5Ph269@QJIQI7`Cx*(yBoDv4o#=cFfICXw=q zm7aKxgyj=6Juyn+316nw6G;YP(elf16kNgqPwXYVl=PDdPC>2k5DHzwQ=ZtA!``iJQ0yxl{xWK(#%sH{=pP{TllJO zU_J?7NDC$&{zMsk5Di^NBpMpStEbEGye)aoMMKj5>mJVBTH~{l`{_cB9E_$%uI?l(QGp2WRy68F@A`=^Yfkc|<7M2n+rWMB=^Xf3AV9^%G*VkUnz zEN1_-@VVcP`^8SI7dkJ$LueJpSgt3~F3w?#c#m)25BQ}03m>B&p@)UOOQ}JxG6#<+ z3$aJ3!(+;7Jg#g+pVEbXr5AB!9}LCDpmG>P$`SrPksy*G^06cGsKnV@c$+;V*WSTJ zcFa^IgE73zzMrckn6}G2Lp!~`g7;8K-=g>#B~*I01wY4Cu6=}c!Hixk%guW8GyH;9 z30*lI*NAz)r#{htU;yD5Jx|0<-- z2>lCHc_Qr3XK+IcmdB@`(8LrKg3?qTSdr9rNZgzTWe$%_kc}#M{G;YRylc#gXDl0K?FfcIKFt9V&GH^0DGAJ=PF{m*(Gng>A0C{dep66s? Mo-D?Y$#py~0E8h6od5s; delta 55 zcmX>mc}Q}@G;YRSlc#gX%F8jZGcYjNFmN*1Gbk}QFsLy&GMF$p0ZA7i={{MUCyOy? IaubgW0AMl;MgRZ+ diff --git a/bin/main/com/loki/lochat/integrations/discord/DiscordMessageService.class b/bin/main/com/loki/lochat/integrations/discord/DiscordMessageService.class index deb75012d30a754f3a05fc05fef79e6c57374424..a558231d42cfe44fb628bb268f6d68e50186b1bd 100644 GIT binary patch delta 2405 zcmbtVXLJ-*6#iazvokx4Nti^*9t^IBAW1eR5$lPDV?@Acf+au{5uEH!k|Db@>&yg1 zBx`SAeJaK-7VHwl6=Uzc_lgyJ?~3KV**!6GJRZ;S&)o9vyYJrbe(%luyPZ_8Jofw0 zT>zR{U{EWV|+lr)*i!To~ zWjb(>gaa8${%WS(b10>XIcQ`EB@L_F>rqgPxhf73u2QPH&9vGK*QJtLhu7z;ICOYj zKYWw*4s@!BBf$`M`#N3!3N{{YMvz?Ug$w)HDOVUYwvEeKo1q*2jHbXfd43|e#9459%v}J~#G8A;cRpFtJ zKP$Cww}>iPlFBu)R2;Eb#SvIS@uu7CF1F$ffvV~`8W@(U=tqX{E1wcN8pldFhOd{m z4IGE#d2zTkbfSura5C4!eWhCKrZDcxUkKM^sP1-8kN39e>6tq5K*re&&;2`9T)`Eh zP+ijQHR%(luIu7HN9s16bTqD8mhDA54I)UMeZ&ym=Y*N5(M}xrUY4&mYL% zwrMd`RJHPYwL&|OA-I4%3ITe)iVJWdpQpyzCHy|Mja|-5HXFm&6-{PW^B;@q8Z-pZrJx$CRSaSc-=G{lok0;t8jhGTL!oDSNs^-yh8uUx zw77lbjoV4vp^1AveW^}MHi}ct`2nLW1bm(Q5imv@fjs%b#-+L zzQ9)!zT^$sHbH!iZ}=Q-eFUGEpjeFP2Nmz&Lx=wZI#WlYQ#lOJIXE|;qL~tiLc%pMZ3W9>fUhX89iJs5?AFjtR%1` zI7gQ;%+zfo!AM~wl*LW_m9b43F#*A>D%|Xs6u<r79{k`Y1CpC<)q(AT8O}+A7B39wG=JDn-O~$A#L62HK>SXF{G`_;;z;l zFYX^e$r?m__d~)R(;m?t%Oc}wPiRjG9zCNyC&UZdOC(w;@Rik+GT>9Z4x>mvok}@_ zI^-zBIT%MXiD3ZS<9sv{j?IMRUSzl6Vjrh1awX+)qT+nAF`rH}YiT?c|2nFdkV5JJ literal 7780 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 d#8s_XY!10GXW(UI(3&Wq#m&gT z;hd3J;+vn6I@ygy-<*Mgg@F^OlZk1s!2{z^84yLj!5HCMh%i6#s({ zG9%**5B>mul;hnr*hrCacu02l=AL`*y?al7{yP2v;2Bml#2Dr)vToXP-=bHg#(mSa zJYP7%HCO5M@<2F#DYQ%|%et%z4c!cxJ$}GVn>)Madr^^Yl_6<)uWec8HUryX(CWhT z_^x2cmfFsnzH2$V1%|F%o}9W@DPRv6bRBUd7}6!n5gW~VS-4xgYzJsr;r2FnEp-l! z1G#)>P!*?NhlV62Oa$d_(*Udszb32ixXbIp7cS+T+LTSVB3@bQ+J-s?XjV-D0iR3hd%nvXtq5KU z24*x&GmN+A#BDmhRTpNf^w3ksUCc7{lusfs97g+OIR|oIm@V%$?o@5zO_ZeEZ#D{@ zRYfczaO+b;ybxZ+wHm&3qmWgbdtTHKcIHE8kSP0KqZ8g@I)Qu=_oxvkdMSiTNi+1) zlOZ(}9nxSxDm)Dj8I1oQT$;_cR39@;w!3;xgEWvR$If@9Icas1C^m%WuSw4*Tk8ja zIg(!&4QPzSMp~v_R%wye1bvA^$umW#Nm?1LapN0$ztARzOQ93+8GV5T$ECN&34lpX3x~JflegnC*Zngjb diff --git a/bin/main/com/loki/lochat/listener/ChatEventListener.class b/bin/main/com/loki/lochat/listener/ChatEventListener.class index 18cce177aafe5073e30582c2e72d882e72ab4913..70154e51e4dd0834f3016b8f32e52dd177b3a8ed 100644 GIT binary patch literal 3895 zcmeHKZ*Lnl7=PSlO`7%J0vnWn_2__Pj2vTZz)}@eRiQ=csFqM^MM82ePU7|Me6pQL z;S=xy_%28w!FxUq9{}fp?!srhmlc@z_QP^W?kOkY9L&WGu97ME!Kv$ z2P|-T`wQV2t_a+%PcOrjiaVXC+u2U66P$Pu!pv`qK$tB8Ka|hmTJ{u*caa`7bP|6b zCG}di`Am;0M+9;^vd!~wmB7lF>0PCyD!@x5_xPJYaV@<8Z&O@yC_H9_3}~oi%j3R& zK#L2_9;d<&r83r}YBv{Oc5|yN6jdD)OI;QO($E&CBgEoDn&}J^Y9wXU3`2fFW9yX9 zO;5IImz(mA$F$yTZdIrVsKGu9NvAlZLR0G^3qw!13>Qc{Qbp!Wb^AWXnWhO;+Vic- z1>H*zf5yVoYuOG%&Xf(u9T{{)w_KqeCH?WL;^qSuU{ot4yTg^XJlbXZLTeFp>N^CO`J zI+}H%JONfd#ZFz??pg-*r%cZ#^5$p?baWZBf{VE`PI$<~cNb(f z#Rc+fhE5z+8BQKojtfvBWMeiVQHJ`jt1X_SUKD)M>9IRTz_ z)gMV^9zH{{Op6jua}eLnns_tCaJll3YjePD?$dAs2wcMFGQLZYhXVdlm0$siQF#Rx zv7E>LC0NGy3f4YG%N&-)Utsldsq_=P{2SKh;FZJ@u=iE`UPODef;D&zO9HRM8))?= zelKC|EqvBFP;_7fI%mxz(6=){*E2xp;3m9-KqG`pGZ8+|M0gk8n?Shy6rr5q!?&3T zx8VH=gfTU@GZ4PdM5uz3iSS_t!jBmUIrs?uo`bu%IhJw)_we}yiGP6g9DaWawdCvG EUtinFTL1t6 literal 9244 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 baZ2%Af{8{XfmL!=TuGCc6C4k4=Op#T5? diff --git a/bin/main/com/loki/lochat/listener/ModerationListener.class b/bin/main/com/loki/lochat/listener/ModerationListener.class index 6b1248d3dcca815340ffe56336450c51c23d2359..40517d62a69e982be8851b8084e8f09bc56a482b 100644 GIT binary patch literal 1516 zcmcIk+invv5FLk*%aW2drO!0^ErF~V!WiPlnsbT@Zj-`eSCC0p7FOIpS}P<8y=ORK;Utx5^zlp)Es+z?RaHKNz2#3G4F-m)1W&L|`o) zOJPO{u6DVeh>#Ol4?6RUy97#mLJGT2;Au0M*A*(wea$1(qNo0h=wue}?(_*14^VL# zRtVHDG#+ZLbOq{!e19V~H!7a+Aw}|3#M$L&s?{LoiFrZ2YH!4;NK&P(gS1>;(73#` zSSniPmwXyBDV3!IPR|*=YVJM@P}C~QsGX*KdAyUBa63{%8gbh^h?y~az5N|3B(=Eb zSm|6^s4&zCWoa6Vkl{7yd!;it)6v+yh@ms8oc{ft{2E{-Iy6qCF)$ng=Qp zlECw3kZY4PW>ajowwcPXllkZPL)S)`#I2LDv?AesVFW5_yW-1g7X@wSDYJvGm>kAj zql8MTh0?-K3DDnwJ2Ql9!QlAqVYgR-Z2}+uqGOhPk^kK$nDMR}>yW<`?kR8NKe3jp zf-*e7e<`P(K?k1EDq11fXmvinp_de%2&z}AB&9A=!s9@bfilO8NZSDmv zMK^a(Xzr;^JLVVDWRCa=e>meO4A zOJDQDB!*lk_EogkChxWk_mwLdxO4nm(NR3=E%VLe31xYG^B8q|Dk8YG}a+_kX8 zaCg`W=eA@Nd)mf5+^0g zYh6Z>Xp*X(!EgJ-(u$5RHE(sP>s&O9jAEJqT7IW_HE4GN-w4Ze_>qmrs1W@P6$#G^ zzGZkZyhaZTc$-trv^kTEKpIs;Q$_kr*G<=Nyj_nO#<#T~21O^C0T!Mz%pD(TCviw$ z?sgD|u6&}*JeeLG_qWWDB01JbwqY`+Bz=w}J!#-7ji)qSXXwhCDMde(6uplkOZPFd zHfTLX&;0x^u;)wpi38+*$HdQ=ewD<|(ES|6Py{lVLJsHg4p|p_S$G%kk!4oj$7R}+ zMgeAN?JD`k$@+kh89Vk&f}TC0Spu>NB{r; diff --git a/bin/main/com/loki/lochat/listener/PlayerEventListener.class b/bin/main/com/loki/lochat/listener/PlayerEventListener.class index 3cde2577b192bbfff09c9d5555d95434c970d369..96fbbf51a7fd34da633705a45e0fce40ec07782f 100644 GIT binary patch literal 3411 zcmd5;OLHSN5N;V`J5I96df6r6wX-}H8xjw&%WECHl?tI)Y8+q_LUEMGimmmGG^LSU ze)-1$)yt?@YVLlsY|NU?_*jWnM=eXVYF>+gSl{}TXq;b9SS1h#w` zx`FI-eEB`9-GIlM38vhy0(#2S{*VdnrDH|N6Ig#jhtv(I=(=CFpD*m9qQ=Qh?SRSBWnSCBFYvZ zFC)V2aL9B|cAPHL)xChm@y=1R=5XO?{AZ*(GXdf7*fIM}qbT4$MQ=GLQYCPzx`PnU zX6&R?Q(Bs}^3v460z)pjLsxCftQ=#`?AQW}vODprjhRql?3n2OXC`FlyuzTkoP)}6 z3tn7-8}Jf=n^o^TZyjodb)jMM+M34&I~as*rjAVT6R3F7r@=8*-1O7IyzcRsKz%NI zUR3`~{+8kkX=>S4)tf7MQBuRw%4uLp^-N@KJ{}0oLw3w#jw*IdN=z~;inu+`luZ1b zicY{(qXc&e3^OF;>@LlWOf3F-z;y`YX;3vO>hw?O7SV9x<_E!;#|y| zT%V@SO>pP7)(PCX*jB8Ucx%8U{w<@C6bCfK$h<$b3>W6!B(cOl(kwjG)bBTH^FdCa zj5ICTwsE8)JwC+qu%9Tlb6nSoiWrMJYvF@OBfv|H?MT@K+&G&&TH*-H5Xw4~1Ld1L z5_UF5eoeM$d=spj16zcT@h&%e?u&qDYk49ni|`5V*Hmy2SZVP%M#Ic{G28(H&*1Yc z6rch{DB-oX0!vU%+GSWt+Euugv}>@QwAT>>h$Watp2PP|?A=G6JhtUO;MRAQjo;vf zzp$5sm+@Ud4B+2a@V%0Jm*F-z*h8PgtB86HzYXejY{zUl{2sBrVPV_0vb_n_g={qo zThq$+Hf$|q+qSSBSlDvl!aHc;ymdB)@2w2)!h4w+ezY>&LqBEJ@ROC{{Yxnpb+GdC*uRCO+*PvfRsssNeBTAc$3^DLnbqEW)g}n z81Pw(iqsczRkYR7vUWj9AXe~EWp~}$PV8>G>-OP3y4zLz*tL(XtEK;Q?j$pl36Jn2 z=YHpW=R4oy|9#)NH}CxEl~Vx9#l0F*1d7}IJua`m+rwXNU1rGT^#ntf&kDFUc+H(w zpsL^Uh1}6O4QT>d+s%H{+bf1T$bG98rvk0-s|n_ z^!Nm3yCbM3g(C=xp1d5Va&0dcyXfH=~i!yU}R*w}7nmnU(T)@(E z3aFXDPZ^m$Ph0o+_JVV6uZ^*C=QOju-}JRv?Q1;VkQETPDrs|@KVZ2!)UvBQ%5Cdl z*_)&b+Wfu_PiKwkGdrb}#gj;p46cfJK5k6E#^dvZt`*popR^_F;G}t_P{8VBWCJ^0 zQM2o#blK$W=hVNTNg%Dl-)?0f6|)RDFpkN{d&KlPYT#ES` z<_VNc+;dLt4dh_~&+fEB0*mt9F}zlI&0w&sAa2G+aGBI`p@AvL(6D%tq=?sXB6Q^5 zd;^&Gw%gxkdYjCEN7B*Bv{08PNF9?< zajsfHTUF_gaCn46H__h6+aU0*^FMg*5_G7!bQ&3e06B;&)S< z(9Wo;Wtk|zIs?`Cl7O?Xx7`d`_P$C_P#Pt0Nus$4y9=5!;6|;68p3rVLMDs0fjVpu znBfUZCq)ZRl~2aDU1jGMDX`u^0~*OjE8_Up_yavAQ)mVaisev4D8MpXrh~rLZ?yxl zD-+GwqG2;j{Mk%5aDzNU;~BMP5358AwrSX!&`)gH25y2$&VWVfvKLe)n{xjJ5v zs3Qv8J}czv-sul`TGb31~#ahMWq=csGQLV#`p`GGO-AI4csnwWCyGsf4{}z+HVDds&2^T zI}O|=m#5gv4ZS-va1VHc`ij666XA5;UT@&5Qdnl3b}|j`GjM-2TczoV*(w?K8+dRm zPvbajv`V*r&A>wnVmHV3pC2&eerDB8>+AE-uUR$_VqVg4koO#gj`2xC!|$uK%up9Q zbYj&~s3h=Xl~3`-AmGLm2A-7G&h!M;+C*~?Nsv6v#ui^t&Lvl(M3zi}WeHx6DID89Y2kC@n1LaQ zoY@qpylv-%bdil79mi!k?^ZtBrDH@=JJivtxPRNgt2oL0pa8cS3{{#vyrfo`eX=Z; zBwD5Flq(wjDg^?Y-41^SUc(z2UMDc)ym{_T2HwPX>^5r)JX@Q!SIacKEpTbPcpHmu zPd}TN%_JTDHwOL|e6;LwP@9Q@Vh?lK?}<4;kgr+as?=hDHaZ z0smy+pA!tIv^vZ_Z?qrk_!pMcTb1hDqD^6!wCX3)Dt5NQ_;gALXtV@Nqiqnd>DXA~ zgAFr*`SIH)12^Mj^V)IBnUv>G8KtIAF54%4Ro)0^JT#knMlrg*ce# zR682k`89kz=}pMiN5ijJ3Cd2HT>ble#+t$Vo5HO5z#Dbhr`CLDCg`MC|DNd=}+f#`Kv0zrzH zVu%cxSDEehHCoQoSYa4qsswbJPfZ9h-4I#gA{OUR!1M*Zbj+CbQsw09&m?I>X&#!N ziMPZIL(G)NX0-JML;fD64X63``-$M&@BG9tL=k6$KnAKTLtHEjP0V36i?cq7kCjSX zVu(wn;?8l!V{&+x7V`~}C-~N@(>Y!8HC$cqt97xEa~1V<4GpX7Hc7_ChFBus; z{i?FMyr!p<{lU+)^6|35K4TaZM zHLk0wuWqc`rl$D4V|r{Vs^cnxKe9jaZPv6Sk>in*qhF1T%vS~OZe6UFi;qNxxIC1! zSV>Pr9*vyh;;GTS9Ao?Vf;THNNP#Srk&_dIt`nFOc}P}JF1|GSKoSGr^e%}!p-z-c zCzSA)5)^YY9FfOms_CMZ0FUe^<53<+MMwAQf}qceJfluHPOhVzy-OGM^5luOD(SD$ zgaKU;_;Zr%jc4FnMc!Fdi)U*V5ZiRIg~NOap&Jd+BC{$pRMf}?xr_vAV%tS!5ffXRm;bka;|i6WlLSn>S_XmS4h2KeU-b4fYZfx zR-x7I@-1BO@^MpjW5qgMu-9o7^;K0Hq^Mp-pYsI7w%9(lf%J8C_PHTKO~vz7`s;)) z`iZc}(=28x{L-s@12H0lG9;1LWc+k-3$=(m6**!@f^QpHkrx@yV=B5T_`29FT#--*acUECpOo+YNnXYP`okJF}vxY)ygw~yYV z5JDwK_wgjV7T8riqru-7Xp`Ry>FwEeOI6);>`UuXc|S)U?=`9X??5`Tv|#F6~^&=M-GWxpY#iI7;15a?QbU6}2d@ zDLjUv)0irU;t{M(0iTu+WBoxau%E84Ey>=?C^zi{T8GgkwNH)HzL-)= z=)vi#OU)lNt zeD*LI?cish$W2!m2;*J~dPU$grrQt0I2GofKuR6CjyLeuL0p~dcpYz*rc1JU5Cw&D z=jl?-mj6zI{9G+6bU9Ugw^Ym3P9rl{JAu(K9NGU^s@t1>6u;^HTs;AeKaK@vH|Eju zI%f3-hNywL&`4A@^W(=B;_C+HR15LAl^-;>p@tvS8c8?7#Abd5YehS8*hbuS@GC|q z_M?lz@G#%E;{`q+MmN4i%pPO7-X`aF8KNJN`=@;VfUx{;^s7MMuWHDLz;LVJ2(AzwxYe{`ceG@gJNU;Ofuu zpPbuI`~Hh78g(niFQ^IM^f>n+=X3>}7U-Fuqeda8dB!RYADtm=(>3t!c*vgRo{xYt zEO`8j#Dr-LzvSP>G_;(-TsY#FIY)=5$QN^(C`-&fQnD1Sl%<71{q-<@cM$2>pB^Fc z*+I{PnQN92V1#P=H-ua%d^AlRmwLU*~tRHtxn1*rPn1 zV;?l`>6Idz-V(}U2U4e{%p(KeWTTpOL^aDR8WB#3->LS4efEgRVU-iP!(wji^l8)r zxRd#G7dyZ`ai`{upPHwlV4up$>*U`Ld6~A)Oi7~viV&?un`?%}yu*|xYWd4}aoI2L z<+%OSPe$4}?s#M1%o2`weDuU_*>WEIP1A8XKKZ*J=gIZMpEm7yj^hbldcVo>?c5#D zhd91BxAgaa;P|s;`uDEq_;FL_2Ll}cSnL#+4U0vCcrA?gNfanzFpPIe6e;5FFkUB7 zqKGHMc$tJt5oQ?Ak+?z;_l9wh#8rx@31c6L<%-xE#%(0Npopq40wlhuh#SMONR%mJ zV;IdORw`m)80($lx-jaUqC5<@Q&fbp#woacl~b$@qtq#?!&v4N>%&;;6g)8BDeA&l z;1t(~G1n;?!pLz73e75VicL@3lYJ$6dMuZ%_t&@;}9{MCuZz>;k^ouTMiVx^K*`!5C5R=0LRdi z7j0k6aZh;fFKRg6pZfOTGaMgJ``91m_`n{xTH zVH_i2Dq9d9@Apve1@A6 SVj2r*QapvYhgzhFulyOZYEpRs diff --git a/bin/main/com/loki/lochat/managers/AutoMessageManager.class b/bin/main/com/loki/lochat/managers/AutoMessageManager.class index 9dc8630f6950943e7c3dc75fff70b91a9df147a3..d555acd2bc0e9339fc99f9ee4e27b7b36c767cb8 100644 GIT binary patch delta 106 zcmV-w0G0pzL4ZQAC>;Tbvnd@O0RvtD7n4dJB{zHki2!{7i~xTCjR2Maj{vIxlK{E^ zlmN;Al>p2DmH^KHmjKoPngH(rn*jI#ngId;jR6b*p0lDJMgb9_00aP{00;o101yDA M02BbFv-uwb0fF=$7ytkO delta 102 zcmV-s0Ga=QLi|CnC>;TXvnd@O0Rvh97L!UIB{O{hiU5BAivX4YjR30vkpQ{?k^ss8 zlK{*BlmO2Fl>pWNm;mnpnE?0zm;nL+ivbJ(oU^7LMgb9@00aP_00;n~01yD802BbD Iv;7|f0SW#b>Hq)$ diff --git a/bin/main/com/loki/lochat/managers/CustomCommandManager$CustomCommandData.class b/bin/main/com/loki/lochat/managers/CustomCommandManager$CustomCommandData.class index fc26f379e2bfaf81d2ec77d995b635b5338954a8..d78bd0b25fbeda5dfd18bff81407c80e90290840 100644 GIT binary patch delta 50 ucmew${6TmF8$09j$?WV#K++0K=CWG>*(<>8+dy)~WIhfcx!I9pJtF|5D-aq0 delta 50 ucmew${6TmF8$09T$?WV#K++0K=CWG>*(<>8+dy*3WIhfcx!I9pJtF|2ix2() diff --git a/bin/main/com/loki/lochat/managers/CustomCommandManager.class b/bin/main/com/loki/lochat/managers/CustomCommandManager.class index 5ee3509ef4fd9a1c88eb2d10377de9da5d6b0d26..2356f561059d10c62a2ee9a722ac8337cd1fc718 100644 GIT binary patch delta 1445 zcmY*ZYitx%6#mY3y1N~=Y`a^!-9p=G?R&djDsAb57W=eFTMEKr4UlZhbi2~sS!QQT z2#GbpN8$_3O?*_8nh*#+60o?nG>ZN)kw5y!A0`^b7b?E>kBaEop%6$W=iZrf?svZP zoiq2*-ji)P7p|Ur2S68Xw!uR1i}zgqGaZfDGd6rlaNZZ14h5z{v2dVI*EQXauL<|> zi0NuVo0?YlD&tx-9+?Um5iO>~b!}`)jkYOr*7iwNiK@n=wpR(O#*mswgu-f%7MqBK zt80`AU5hFPhZqOrsxqkcOoj|aS0_|Gp%|L!iIztaiAXGbE#wveS;j?t>%a=ki8pem zE3gYcI1t8yj39n=;3qT^Y>`A?G;SP}@e6*l;a5@Yte5aR{tzS1e$l?NN*r^x*a`nQ za0UO06R!O>{O2GLiDGxZ=yX*M$O%=SR`uafRCTd5RtKJkY9~IFF_|2b(T9C5WZ**? zN6F!!Y|L@m10g-evU66U;O1RZYy9c)+?rt8);9WgI1^U?FaOTq3+n;Z>J)H+?|YtRn}GCE0dE-9HdaG z*qZ0H-sYfksu1zKEmS@KZr)C^Hd3>VnnY2)&$^!QT=k$BDJT|G`G=%+c4`xs^IK_y zsPJrXc5)V~zgD}Q?htX$Fm;Rbo-wJPP?0_*mk(;%zGU1+1M@=#6-1wig!fX$9(cs= z!qWC2)?yUvup5oogC_1wGjy!SA++FOwBl*B;RW{3p#!g@6Z7!nZFJ#dbkDz8*i1G3 zkT8H;Y{F`6W`IF<4zb@5_Q5%lffTJ^_h}Qg5>>cx3%AEu^T&~oC)o2Ob31~KcuKS=zL}Lc&XLuu z>!R715~stYCLqdG39iSb0JbXB&W z>bdfCItvBF;nFho_)Rl&ed;7yYeqEC?Yt_;q!yN^)wJ!V?J(^|({@o0NAc~#cNkGG Sywpc`(k5Q-;_nidyX$|3Cn@~^ delta 2391 zcmZuyX;53&75Loe1L~%Y zX1MR%d)Du4%!kkHa$f)B>bC*3(N``xW5wPg?8MJi`~tru6vT9cQ12ISE9-NT@oN<~ z@Ed}CMoUcVSwfXR(0xps(L&QkJQ36yMvI?C~He9Os5AR2Xa&5vo$jCqpYT(%tDonSNKMuH{R6ACr6z@u75`rDx50SO{NLB`ua z2r-I=|DagT?EyW-I8cJQZu@ZjL6$6ygd;XopHW zv4v9^&+bl68poymc9lA4mpJE|Qm9jnmUPlVI;5hAhJ;eOCVZG}anq)F4kYJ@N}reZ9kZFZp%3(TI%t&OY&UDy zkOg`JnL zRkl!I7p&++DegfH?q$V2Xv1D~GaW$>4xtxQ=)*Mji+bOSxdE1rz{iVApY63z*)lF&9`&XhOOWgpEZv^&%tIjsSn;neWQH(U=e?_U=CG{ z?4~r25A*os3Kc9;p#`QW6*o3rAy?SO(o~+O%E7QbPt`9o0{$8NSMcgP;rIDlXaDND z`}w=6=*QPr^LMAu?xEGWJl!^jyXUc6Ue}p7?>x52TiwbnAdPcCwkzbHNByl^^E|2= zWT3Qh9woQlw_0D3o>9f;et7vDgo{(}#Sm9?mgLuJVF#xZCEX3ctaE!AYXUR)hKj~8SOd8+TEyI?V?Ftu_ZE~>_h zc!_Jh8RfK{DI429k64aXY>?^dLdi|u_KE^h5K-`Vg+8ZntP1V}YHy+tw*O_pUfA$4 zSc=6X#qwA9A)GwiykC}Dhn*C#Qy|osr{X-_JqLGCk}E~r-oUrEo~Ae9ZZg@04M8S$ zUt*o5{8huw^a-|m5|zkdH6DT=r_qc@#D(h0W(id`ZpZ{^VSX9i%cu%WRE4lqeuN5+ zkHeB{=_l1q`}Y7I>dsToYx|bk>U=Pd*BkTr-c{-a^3=!d*G#MRoRaIGisUgKt;bP; zCzx}FBYBc%@2nW83DN;^x@L7d@4IE}HyF8%Ba6I2{eue>>3M?=4mK^&pqv~J4d-dZ zXJz;!K^cXIGzK1Bq?mZO#=CcdXI4IMqURi0o8L+fT!SqKpDQqo$xej z@eD7AXL;`Dc;cVK0KOr1tg76zlBS5691H6NC`D<8R)*VXlBPJ=t*rf1{A@XO3M__# z>$SYnGnD0alFlq-h>NS%=@&m^Wmsw2l$fDe{?@`qUtrx+=J}9$K5U*}G|xxrahBqL Y1>9pqPryfK=q#P%?|FW=GT7mN106gE7ytkO diff --git a/bin/main/com/loki/lochat/managers/EmojiManager.class b/bin/main/com/loki/lochat/managers/EmojiManager.class index 24efb6ed1e80bcbbc2dca08664086b1507295c51..b491cc35d7df4c30458d31624fbf2345f5a04e1e 100644 GIT binary patch delta 183 zcmeBCouRs65ijH4$%}bEF$Xb-OrF7~s-4N8$B@Hd$WY8+#8AOt%rK3?gkd3rDZ?@b zGlnfd{yqjBh7$}n3=bG=CqLnP#OlDn!r(ahG`~C}@8s9~73yjXoD2*M?hNb<9zd24 zgFJ&TgCau!gEB)PgA+p#Lo|?1WeAn(QUy1OTV+C&d5& delta 175 zcmbQC+M~K*5ijG<$%}bEG5awHPoBZ2s-DB3&rr-@z)-xm Xo8TnI1fa>Hll6qu8B->Q2{{1(tPm%= diff --git a/bin/main/com/loki/lochat/managers/commands/MessageSender.class b/bin/main/com/loki/lochat/managers/commands/MessageSender.class index 88dd6797caf6a6a176f6e54b4934210928cbdf63..c0f1118462c27ea726493089423e6218b1869af3 100644 GIT binary patch delta 236 zcmWNLJxhXN7=^D#)I`f($&VBid^5GzkHItz0x|ImA&7>Sh8%U%Nu1oA#Nip*99&#e zhyH+*i(Am@FX>*+Io#Zb>nzQc`Q7s5Z8&hEI0Np*mAJ$D!L^ZK!!7C-hYRd@_0V&S z`=oNkJAQfu=o4hZHB-VYi10;h*E|1Eoj5K`LfnwzmOM#H+)>8jkt|hmH00VP!wYHN zD6p0VTZ-&?;2@uWR5?dtjER0Z{?kva#>`9Er%Wx11kd?10w@F0|SFGkY)tZtXkU{I5q+qOblE=k_$*P02Qz>aBNQJ z&}8)F1`6;o@B^U=g8+jWgCK(^gAhXugD^urg9t+tgDAr!1~G<34B`x%7^E0>Fi10; e0MeHjP-J+{pv3TjL3Q#?&N2W@aTEst delta 133 zcmcaCa$aPEEr%8(11kd?10w@F0|SFTkY)tZtXkU{I5q+qOblE=5+n^2+?>s!$>_-e z6y#>$XW(H_Vc=yjW8h=(1oC1S1Q_xe1R0tbgcv3<2s12V5MkKFAkMIZL4x4~kiNtq a!*HEJmf;D59K&-4d4>-RN|Wz$mH_}JI}^G9 diff --git a/bin/main/com/loki/lochat/renderer/EnhancedChatRenderer.class b/bin/main/com/loki/lochat/renderer/EnhancedChatRenderer.class index d583e1291de02b1003440d8380eb46a5515ce5f4..b902ff8894f67051b2f53fa756e3b38c366366cc 100644 GIT binary patch delta 2408 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 X?br_U&-fSo0lqJJFMZ6va^(COTKYsz diff --git a/bin/main/com/loki/lochat/renderer/components/EmojiComponent.class b/bin/main/com/loki/lochat/renderer/components/EmojiComponent.class index 4ac2be6db4d75f2198156be10222616fbb2cc428..d333323b4b0a1ffe767b7a187606c83649296e73 100644 GIT binary patch delta 130 zcmeAY=o8ow#iqx^z{iW+O`Y-q5h$(|M`S>L3;(|LdWvC2ep>N2FqlD-YhPQ~_Yj(>lk6l?$h delta 153 zcmWlSy$%6E7)8%W*5B?yrPfGPq9>zNYcxdRWjun1@M-S3 zH>bE4b25*;ZxtSC6d529DxqiJWS>$}%$LG&=eN{ diff --git a/bin/main/com/loki/lochat/renderer/components/UrlProcessor.class b/bin/main/com/loki/lochat/renderer/components/UrlProcessor.class index 96260fd5430cdeb2497e05897bf73716284f2725..bd8a720f3fef3027b7a7b637abdf261a7d698e4f 100644 GIT binary patch delta 170 zcmW-a%?bel6otPLh4D8s{)Qrd8GoUs?BpdR*?9pk;1MKKY^>N?u(I+-9>Kz4aqsy~ z=iKhjIXL&FIkgCoB1{?^#J|bP8$`rosUZ!yPjZicn9+{@i*bS^{FC`v*d%piQ6Nu| x3ME>UX^Z+)8B)We&V&Xtn#`4~a9Pt~LzgW*_VPytoYlKB;-=RxJpUcLd;yU46zl*1 delta 166 zcmW-a%L)Nu7>1u;5zQcnF__4q9Hz-3rIeMMkYwiu+<;4vOxdtvYr)FOJ-Gl2Z?pN{ zL(kiH@($i}ZOt>pNRuRs1M*-fDH~GqL#dI*{WtC_0*bncsI)%;#HElttLASn7yV-O&-Z1lfZ{GZN!h7NM6K}#tCVq_oxm>2094fSn zl1DrF^bq7J1;i+1gb?Et@r5faaFr#|NlIAd8e3fF2c_&%#xKJB;RZ*Pb4tY0sWcxq zEl8D>Qf)QVSSz)5k2-stpx*juupy!rr_rWqvU!@#am$uzu@zcvliT*4JNA<{+o#7=GLmYR-^)>vt3mXW9^g7|NwpcWMf{-l_q4n~3qp_>aW zgINZFKL{>^RuR-H!DZko3^zjP&e!2`?>U_NoR@Rn-=XiJ&Hw%-9~Vi*)5#`-d;*kl znJO}QOct%G_HczEau_9-8Lsk3W++$ln!7f|J&RIlt5liezI~$FK2u{m)Y?}b*bnM# zkB9b$M|McP9pl-l#@qxFbd4>oV)&Iu6iqQPyvz1h9N5sC6fdU4TYTraJ4ws50q6Hh zv$IGP(L^#W_-G@Yb~(`Dy1e;dk6h}NM}6|AU;96$M0tc~a%#Z+^Sx9M%9yq;*AOVbloDThP4lk1XrTWL{Ps`I diff --git a/bin/main/com/loki/lochat/utils/format/ChatFormatter.class b/bin/main/com/loki/lochat/utils/format/ChatFormatter.class index a59d73861f1547b836ad55aa708ff7d4cca152fb..338731bce0cc1d6e0789fca87bfe49cd31365f27 100644 GIT binary patch delta 382 zcmXYs&nv@m9LAqdjFI2--S@j6-;K?}jBIEU4rG&UiCHaDj%sU$!+t~(p{&&27bPb* zE-wB6M`z{cUr@@)$#Zb|JWoBZ&(r()nXSz|=QOn=d2PtngGK;4UjtS+(GHh9Xc6@! zA6nAuK{Hb?(>^*MIX{Bb5e#4)0hzO>)Qeo(<9;811H&YPbRo226rC7@n>t7~gs^(DppVa56~A$OaK4? delta 355 zcmXYs%`O9B7=_P=p!HK))0t^!`V*l|+XW?>P!^ghsiu-r)v_m@Ha0@&!p^3N@W#po zbjuC60aw6I#05xfCCIj+uFRG14k0--i94vq|rk z*k)0c<;3hnD{Q-qQB=8NpId5}#sNFjd9i^Es`45rNGWh6U*@rRgQdwPTyQXj7PqzO zY|3fy(LQ67b7;8W+DnovZtGx?n!&ZiEl1tRgH=>r`LOoXon-7fH{9DBswHoH+Y$*m Ef1ZCtqyPW_ diff --git a/bin/main/com/loki/lochat/utils/format/TextFormatter.class b/bin/main/com/loki/lochat/utils/format/TextFormatter.class index 1230a434db416616eea49f3faae084d28a44c1b3..7db77fd06b4339a2c5bb5a97670e5676c72571eb 100644 GIT binary patch delta 333 zcmW-c-7W)B6ouCjlTbO#Z~Y`FP0-2=ZO6E138|Yg<);1;DdkFn2atG**)QRSj6~uM zT)6Wn-oSD$&faT%d*$qNzM}7_xU+j2W0-`EDa^1|;9w0tA^;=iY(PUX0kqf^yH)?h z=DQh&tR)jHVH6Wm*!N3|B+Hma6|-2y0+buI+1D{^-Gmf zbyeT^CpS_9d2ut{;L;|>x!yyPdzo$%bO?3`4stJ$M=#MS;UQs0cq|2DeUcNBQ<97S z*u0xx^v@N<=7h1 L-O#N_UjFz4mFzYO delta 324 zcmW;H&q_i;6bA5bq6sr6?$vuuCHg~UAvl@|{-ZDg)9%KyTBy~gMNo@gpr<&m(IP?U z4O+Bp6|Q^~KZaor=ljiYnEACo_Upy##u39BJS32T!4B4O1RoZ_61PH$s;FS6xBy-F zMtR~c6j@gs#$@Wf?rtKEZESE%7W>%30rrsRz(W*SD=0|YA1NzyKa`1YRh`|1>bTrU zTGe;m2fLwsCL?1xyM$Ggk-~{Ary^6QG$>8Vxr`|t$|a>siDXLYQ?4mDlsicTkr`4( zlriN=o`aq~=C>>Ip3cjEaBo^nr^w-qFKtUJeA7M3l{^0nYkI(R>rypc(+^CKOtS@y C4K|PdJPxR z-c8Tp=WM=n?!7zBw7{|?bKuHXVz7IrSsxd;n!2@6}ta03&W zWWF!ISi_@% diff --git a/bin/main/config.yml b/bin/main/config.yml index f6eb1e2..7c61714 100644 --- a/bin/main/config.yml +++ b/bin/main/config.yml @@ -1,143 +1,114 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ LoChat Configuration ║ -# ║ Единый конфиг плагина ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ +# LoChat main configuration +# All settings for chat, gradients, moderation, RP commands, sounds, and filters. -config-version: 5 -prefix: "�D4FF[LoChat]" +config-version: 6 + +# ── General ──────────────────────────────────────────────────────────────────── + +prefix: "&8[&3LoChat&8]" + +# ── Chat System ──────────────────────────────────────────────────────────────── -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Режимы чата │ -# └─────────────────────────────────────────────────────────────────────────────┘ chat: - # Глобальный чат (все видят, активируется через "!") global: enabled: true cooldown: 3 - - # Локальный чат (только в радиусе) + local: enabled: true cooldown: 1 radius: 100 - - # Личные сообщения + pm: enabled: true cooldown: 2 - - # Лимиты сообщений - min_message_length: 1 - max_message_length: 2000 - clear_lines: 100 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Внешний вид чата (префиксы, форматы, цвета) │ -# └─────────────────────────────────────────────────────────────────────────────┘ + min-message-length: 1 + max-message-length: 2000 + clear-lines: 100 + +# ── Chat Appearance ──────────────────────────────────────────────────────────── + appearance: - # Префиксы чата (GLOBAL / LOCAL) prefixes: global: - emoji: "✦" + emoji: "&b\u2726" text: "GLOBAL" - colors: ["#B798A8", "#7858E9"] - separator: - text: " ▶ " - color: "#9878C9" - message-color: "#E8E0F0" - + separator: " &8\u25B6 " + message-color: "&7" + local: - emoji: "◆" + emoji: "&d\u25C6" text: "LOCAL" - colors: ["#9878C9", "#7858E9"] - separator: - text: " ▶ " - color: "#8B6BD6" - message-color: "#E8E0F0" - - # Формат сообщений - # {emoji} {prefix} {separator} {player_prefix} {player} {player_suffix} {message} + separator: " &8\u25B6 " + message-color: "&7" + chat-format: - global: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix}: {message}" - local: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix}: {message}" - - # Hover при наведении на ник + global: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}" + local: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}" + hover: enabled: true format: - - "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬" - - "&#B798A8✦ &f{player}" + - "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550" + - " &b\u2726 &f{player}" - "" - - "⚖C9⏱ &fПинг: ẲE9{ping}ms" - - "⚖C9❤ &fЗдоровье: ẲE9{health}/20" - - "⚖C9🍖 &fГолод: ẲE9{food}/20" + - " &7Ping: &b{ping}ms" + - " &7Health: &a{health}&7/20" + - " &7Food: &6{food}&7/20" - "" - - "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬" - - "&#B798A8✦ &fНажми чтобы написать" - - # Эмодзи (текстовые замены) + - "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550" + - " &7Click to message" + emojis: - ":heart:": "❤" - ":star:": "★" - ":diamond:": "♦" - ":check:": "✓" - ":cross:": "✗" - ":arrow:": "→" + ":heart:": "\u2764" + ":star:": "\u2605" + ":diamond:": "\u2666" + ":check:": "\u2713" + ":cross:": "\u2717" + ":arrow:": "\u2192" ":smile:": ":)" ":sad:": ":(" - ":shrug:": "¯\\_(ツ)_/¯" - - # Цвета системных сообщений - colors: - nobody_heard: "#9878C9" - error: "#CF6679" - success: "#9878C9" - warning: "#B798A8" - info: "#A485BC" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Градиентные ники и префиксы │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Gradient Nicknames & Prefixes ────────────────────────────────────────────── + gradient: enabled: true use-gradient-name: true use-custom-prefix: true - - # Настройки отображения + display: update-display-name: true update-tab-list: true - - # Лимиты - min-colors: 1 - max-colors: 7 - max-prefix-length: 16 - - # Цены (PlayerPoints) - price-per-color: 50 - prefix-price: 500 - prefix-one-time-purchase: true - use-permission-instead-of-cost: false - - # Кулдауны (секунды) - color-cooldown: 60 - prefix-cooldown: 120 - - # Форматирование - prefix-format: "[{prefix}] " - gradient-on-prefix: true - gradient-on-luckperms-prefix: true - gradient-on-luckperms-suffix: true - continuous-gradient: true - use-legacy-rgb-format: true - - # Хранилище (file / sqlite) - storage-type: "file" - sqlite-file: "gradient-data.db" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ RP команды (/me, /do, /try, /roll) │ -# └─────────────────────────────────────────────────────────────────────────────┘ + limits: + min-colors: 1 + max-colors: 7 + max-prefix-length: 16 + + pricing: + price-per-color: 50 + prefix-price: 500 + prefix-one-time-purchase: true + use-permission-instead-of-cost: false + + cooldowns: + color: 60 + prefix: 120 + + formatting: + prefix-format: "[{prefix}] " + gradient-on-prefix: true + gradient-on-luckperms-prefix: true + gradient-on-luckperms-suffix: true + continuous-gradient: true + + storage: + type: file + sqlite-file: "gradient-data.db" + +# ── RP Commands ──────────────────────────────────────────────────────────────── + rp: radius: 100 cooldowns: @@ -146,126 +117,92 @@ rp: do: 3 roll: 2 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Фильтры чата │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Chat Filters ─────────────────────────────────────────────────────────────── + filters: - # Мат-фильтр swear: enabled: true replace: false replacement: "***" - words: - - "хуй" - - "пизда" - - "ебать" - - # URL фильтр + url: enabled: true - replacement: "[ссылка скрыта]" - - # IP фильтр + replacement: "&7[URL hidden]" + ip: enabled: true - replacement: "[IP скрыт]" - - # Скрытые URL (discord.gg и т.д.) + replacement: "&7[IP hidden]" + hidden-urls: enabled: true patterns: - "discord\\.gg" - "dsc\\.gg" - - # Анти-спам + - "bit\\.ly" + - "tinyurl\\.com" + spam: enabled: true max-repeating-chars: 5 - - # Анти-флуд + flood: enabled: true max-same-messages: 3 - - # Капс + caps: enabled: true max-caps-percent: 70 min-length: 5 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Модерация (муты, баны, варны) │ -# └─────────────────────────────────────────────────────────────────────────────┘ -moderation: - # Дефолтные значения - default-mute-duration: "7d" - default-mute-reason: "Без причины" - default-ban-reason: "Без причины" - - # Команда после мута (для голосового чата) - voice-mute-console-command: "" - - # Сообщение при кике забаненного - ban-kick-message: "&#CF6679Вы забанены! &#B798A8Причина: ẲE9{reason}" +# ── Moderation ───────────────────────────────────────────────────────────────── + +moderation: + default-mute-duration: "7d" + default-mute-reason: "No reason specified" + default-ban-reason: "No reason specified" + voice-mute-console-command: "" + ban-kick-message: "&cYou have been banned!\n&7Reason: &f{reason}" + +# ── Sounds ───────────────────────────────────────────────────────────────────── -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Звуки │ -# └─────────────────────────────────────────────────────────────────────────────┘ sounds: - # Упоминание в чате mention: enabled: true - sound: "BLOCK_NOTE_BLOCK_PLING" + sound: BLOCK_NOTE_BLOCK_PLING volume: 1.0 pitch: 1.5 - - # Личное сообщение + pm: enabled: true - sound: "ENTITY_EXPERIENCE_ORB_PICKUP" + sound: ENTITY_EXPERIENCE_ORB_PICKUP volume: 0.8 pitch: 1.2 - - # Команды + command: enabled: false - sound: "UI_BUTTON_CLICK" + sound: UI_BUTTON_CLICK volume: 0.5 pitch: 1.0 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Сообщения входа/выхода/смерти │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Join / Quit / Death Messages ────────────────────────────────────────────── + messages: - # Сообщение при входе - # {player} - ник игрока join: enabled: true - format: "⚖C9✦ &#B798A8{player} ẲE9зашел на сервер" - - # Сообщение при выходе + format: "&7\u2726 &b{player} &7joined the server" + quit: enabled: true - format: "⚖C9✦ &#B798A8{player} ẲE9вышел с сервера" - - # Сообщение при смерти - # {player} - ник игрока - # {killer} - ник убийцы (если есть) - # {weapon} - название оружия (если есть) - # {death_message} - стандартное сообщение смерти + format: "&7\u2726 &b{player} &7left the server" + death: enabled: true - # Убийство игроком - player_kill: "&#CF6679☠ &#B798A8{player} ẲE9был убит игроком &#B798A8{killer} ⚖C9({weapon})" - # Смерть от моба - mob_kill: "&#CF6679☠ &#B798A8{player} ẲE9был убит мобом &#B798A8{killer}" - # Обычная смерть - default: "&#CF6679☠ &#B798A8{player} ẲE9{death_message}" + player-kill: "&c\u2620 &7{player} was killed by &f{killer} &7(&f{weapon}&7)" + mob-kill: "&c\u2620 &7{player} was slain by &f{killer}" + default: "&c\u2620 &7{player} {death_message}" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Прочее │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# Hub команда -hub_command: +# ── Hub Command ──────────────────────────────────────────────────────────────── + +hub-command: enabled: true server: "hub" diff --git a/bin/main/config/appearance.yml b/bin/main/config/appearance.yml index a76805e..cf1b11a 100644 --- a/bin/main/config/appearance.yml +++ b/bin/main/config/appearance.yml @@ -1,136 +1,98 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ LoChat — config/appearance.yml ║ -# ║ In-game chat look: prefixes, format, hover, emoji shortcuts, Discord UI ║ -# ║ Palette (Spacelegacy): #B798A8 (dusty rose) → #7858E9 (violet) ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ +# LoChat chat appearance +# Controls how messages look in-game: prefixes, format, hover, emojis. -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Chat prefixes (gradient label + separator + default message color) │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# -# Gradient: use 2+ hex colors; letters are blended smoothly along the label. -# message-color: used when the player does NOT have lochat.chat.colors (see plugin.yml). +# ── Chat Prefixes ────────────────────────────────────────────────────────────── prefixes: global: - emoji: "✦" + emoji: "\u2726" text: "GLOBAL" - colors: - - "#B798A8" - - "#7858E9" - separator: - text: " ▶ " - color: "#9878C9" - message-color: "#E8E0F0" + separator: " \u25B6 " + message-color: "&7" local: - emoji: "◆" + emoji: "\u25C6" text: "LOCAL" - colors: - - "#9878C9" - - "#7858E9" - separator: - text: " ▶ " - color: "#8B6BD6" - message-color: "#E8E0F0" + separator: " \u25B6 " + message-color: "&7" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Rendered chat line layout │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# +# ── Chat Format ──────────────────────────────────────────────────────────────── # Placeholders: -# {emoji} — prefix emoji (✦ / ◆) -# {prefix} — gradient prefix text (GLOBAL / LOCAL) -# {separator} — separator (e.g. ▶) -# {player_prefix} — LuckPerms / gradient prefix from LoPreff -# {player} — display name + hover (click to /msg) -# {player_suffix} — LuckPerms / gradient suffix from LoPreff -# {message} — message body -# -# Examples: -# Default: {emoji} {prefix} {separator} {player} : {message} -# Minimal: {player_prefix} {player} ▶ {message} -# Custom: ✦ {player_prefix} {player} {player_suffix} ▶ {message} +# {emoji}, {prefix}, {separator} +# {player_prefix}, {player}, {player_suffix} +# {message} chat-format: - global: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix} : {message}" - local: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix} : {message}" + global: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}" + local: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Hover shown when pointing at the player name in chat │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Hover on Player Name ─────────────────────────────────────────────────────── hover: enabled: true format: - - "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬" - - "&#B798A8✦ &f{player}" + - "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550" + - " \u2726 &f{player}" - "" - - "⚖C9⏱ &fПинг: ẲE9{ping}ms" - - "⚖C9❤ &fЗдоровье: ẲE9{health}/20" - - "⚖C9🍖 &fГолод: ẲE9{food}/20" + - " &7Ping: &b{ping}ms" + - " &7Health: &a{health}&7/20" + - " &7Food: &6{food}&7/20" - "" - - "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬" - - "&#B798A8✦ &fНажми чтобы написать" + - "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550" + - " &7Click to message" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Text shortcuts → unicode (applied to outgoing chat before URLs / mentions) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Emoji Shortcuts ──────────────────────────────────────────────────────────── +# Text shortcuts replaced in outgoing messages before processing. emojis: - ":heart:": "❤" - ":hearts:": "♥" - ":star:": "★" - ":stars:": "✦" - ":diamond:": "♦" - ":check:": "✓" - ":cross:": "✗" - ":arrow:": "→" - ":up:": "↑" - ":down:": "↓" - ":left:": "←" - ":right:": "→" - ":music:": "♪" - ":note:": "♫" + ":heart:": "\u2764" + ":hearts:": "\u2665" + ":star:": "\u2605" + ":stars:": "\u2726" + ":diamond:": "\u2666" + ":check:": "\u2713" + ":cross:": "\u2717" + ":arrow:": "\u2192" + ":up:": "\u2191" + ":down:": "\u2193" + ":left:": "\u2190" + ":right:": "\u2192" + ":music:": "\u266A" + ":note:": "\u266B" ":smile:": ":)" ":sad:": ":(" - ":wink:": ";)" - ":shrug:": "¯\\_(ツ)_/¯" + ":shrug:": "\u00AF\\_(\u30C4)_/\u00AF" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Radius, length limits, and misc chat UI colors (plugin internals) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Chat Settings ────────────────────────────────────────────────────────────── chat: - local_radius: 100 - clear_lines: 100 - min_message_length: 1 - max_message_length: 2000 + local-radius: 100 + clear-lines: 100 + min-message-length: 1 + max-message-length: 2000 colors: - nobody_heard: "#9878C9" - error: "#CF6679" - success: "#9878C9" - warning: "#B798A8" - info: "#A485BC" + nobody-heard: "&7" + error: "&c" + success: "&a" + warning: "&6" + info: "&7" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Discord webhook embeds (see also config/discord.yml for webhooks) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Discord Embeds ───────────────────────────────────────────────────────────── discord: emojis: - global_chat: "✦" - local_chat: "◆" - player_join: "♦" - player_quit: "◈" - player_death: "✗" - avatar_urls: + global-chat: "\u2726" + local-chat: "\u25C6" + player-join: "\u25C6" + player-quit: "\u25C7" + player-death: "\u2717" + avatar-urls: default: "https://mc-heads.net/avatar/minecraft/64" player: "https://mc-heads.net/avatar/{player}/64" - default_embed_color: "7858E9" - event_titles: - join: "♦ Игрок зашел на сервер" - quit: "◈ Игрок покинул сервер" - death: "✗ Смерть игрока" - global_chat: "✦ Глобальный чат" - local_chat: "◆ Локальный чат" + default-embed-color: "3498DB" + event-titles: + join: "Player joined" + quit: "Player left" + death: "Player died" + global-chat: "Global Chat" + local-chat: "Local Chat" diff --git a/bin/main/config/discord.yml b/bin/main/config/discord.yml index 1070b6a..d8c849c 100644 --- a/bin/main/config/discord.yml +++ b/bin/main/config/discord.yml @@ -1,110 +1,73 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ Discord Integration ║ -# ║ Интеграция с Discord ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ +# LoChat Discord integration +# Relays chat messages and server events to a Discord channel via webhook. + +# ── General ──────────────────────────────────────────────────────────────────── -# Включить интеграцию с Discord enabled: true -# Настройки вебхука +# ── Webhook ──────────────────────────────────────────────────────────────────── + webhook: - # URL вебхука Discord (получить в настройках канала) url: "https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN" - - # Имя бота в Discord - username: "Minecraft Server" - - # Аватар бота (URL изображения) - avatar_url: "https://mc-heads.net/avatar/minecraft/64" + username: "Minecraft" + avatar-url: "https://mc-heads.net/avatar/minecraft/64" + +# ── Chat Relay ───────────────────────────────────────────────────────────────── -# Настройки чата chat: - # Отправлять сообщения чата в Discord enabled: true - - # Отправлять только глобальный чат (true) или весь чат (false) - global_only: true - - # Формат сообщения чата + global-only: true format: "**{player}**: {message}" - - # Цвет embed для сообщений чата (hex без #) - embed_color: "5865F2" - - # Использовать embed или обычное сообщение - use_embed: true + embed-color: "5865F2" + use-embed: true + +# ── Events ───────────────────────────────────────────────────────────────────── -# Настройки событий игроков events: - # Отправлять события входа/выхода enabled: true - - # Настройки входа на сервер - # {player} - ник игрока + join: enabled: true - title: "🟢 Игрок зашел на сервер" - description: "**{player}** присоединился к серверу" + title: "Player joined" + description: "**{player}** joined the server" color: "00FF00" thumbnail: "https://mc-heads.net/avatar/{player}/64" - - # Настройки выхода с сервера - # {player} - ник игрока + quit: enabled: true - title: "🔴 Игрок покинул сервер" - description: "**{player}** покинул сервер" + title: "Player left" + description: "**{player}** left the server" color: "FF0000" thumbnail: "https://mc-heads.net/avatar/{player}/64" - - # Настройки смерти игрока - # {player} - ник игрока - # {killer} - ник убийцы (если есть) - # {weapon} - название оружия (если есть) - # {death_message} - стандартное сообщение смерти + death: enabled: true - # Убийство игроком - player_kill: - title: "⚔️ PvP убийство" - description: "**{player}** был убит игроком **{killer}** с помощью **{weapon}**" + player-kill: + title: "PvP kill" + description: "**{player}** was killed by **{killer}** using **{weapon}**" color: "FF0000" - # Смерть от моба - mob_kill: - title: "💀 Смерть от моба" - description: "**{player}** был убит мобом **{killer}**" + mob-kill: + title: "Mob kill" + description: "**{player}** was slain by **{killer}**" color: "800080" - # Обычная смерть default: - title: "💀 Смерть игрока" + title: "Player died" description: "**{player}** {death_message}" color: "800080" thumbnail: "https://mc-heads.net/avatar/{player}/64" -# Настройки фильтрации -filter: - # Игнорировать сообщения от ботов - ignore_bots: true - - # Минимальная длина сообщения для отправки - min_message_length: 1 - - # Максимальная длина сообщения (обрезать если больше) - max_message_length: 2000 - - # Заменять @everyone и @here на безопасные варианты - sanitize_mentions: true +# ── Filtering ────────────────────────────────────────────────────────────────── + +filter: + ignore-bots: true + min-message-length: 1 + max-message-length: 2000 + sanitize-mentions: true + +# ── Performance ──────────────────────────────────────────────────────────────── -# Настройки производительности performance: - # Асинхронная отправка (рекомендуется) async: true - - # Таймаут подключения (секунды) timeout: 10 - - # Повторные попытки при ошибке - retry_attempts: 3 - - # Задержка между попытками (миллисекунды) - retry_delay: 1000 \ No newline at end of file + retry-attempts: 3 + retry-delay: 1000 diff --git a/bin/main/config/filters.yml b/bin/main/config/filters.yml index 029c0f0..5638e7f 100644 --- a/bin/main/config/filters.yml +++ b/bin/main/config/filters.yml @@ -1,44 +1,34 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ LoChat — Фильтры чата ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ +# LoChat chat filters +# Control spam, swearing, URLs, and other unwanted content. -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Мат-фильтр │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# Использует badwords.txt для списка слов -# Автоматически ловит замены букв: х->x, о->o, е->e и т.д. -# Обход: lochat.bypass.swear +# ── Swear Filter ─────────────────────────────────────────────────────────────── +# Uses badwords.txt for the word list. +# Bypass permission: lochat.bypass.swear swear: enabled: true - replace: false # true = заменять на ***, false = блокировать сообщение + replace: false replacement: "***" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ URL фильтр │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# Блокирует ссылки в чате -# Обход: lochat.bypass.urlfilter +# ── URL Filter ───────────────────────────────────────────────────────────────── +# Blocks URLs in messages. +# Bypass permission: lochat.bypass.urlfilter url: enabled: true - replacement: "[ссылка скрыта]" + replacement: "&7[URL hidden]" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ IP фильтр │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# Блокирует IP адреса в чате -# Обход: lochat.bypass.ipfilter +# ── IP Filter ────────────────────────────────────────────────────────────────── +# Blocks IP addresses in messages. +# Bypass permission: lochat.bypass.ipfilter ip: enabled: true - replacement: "[IP скрыт]" + replacement: "&7[IP hidden]" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Скрытые URL (discord.gg и т.д.) │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# Блокирует популярные сокращенные ссылки -# Обход: lochat.bypass.hiddenurls +# ── Hidden URL Filter ────────────────────────────────────────────────────────── +# Blocks known link shorteners and invite links. +# Bypass permission: lochat.bypass.hiddenurls hidden-urls: enabled: true @@ -49,33 +39,27 @@ hidden-urls: - "tinyurl\\.com" - "goo\\.gl" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Анти-спам │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# Блокирует повторяющиеся символы (ааааааа, хххххх) -# Обход: lochat.bypass.spam +# ── Spam Filter ──────────────────────────────────────────────────────────────── +# Blocks messages with excessive repeated characters. +# Bypass permission: lochat.bypass.spam spam: enabled: true - max-repeating-chars: 5 # Максимум повторений одного символа + max-repeating-chars: 5 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Анти-флуд │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# Блокирует одинаковые сообщения подряд -# Обход: lochat.bypass.flood +# ── Flood Filter ─────────────────────────────────────────────────────────────── +# Blocks identical messages sent in quick succession. +# Bypass permission: lochat.bypass.flood flood: enabled: true - max-same-messages: 3 # Сколько раз можно отправить одно и то же + max-same-messages: 3 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Капс-фильтр │ -# └─────────────────────────────────────────────────────────────────────────────┘ -# Блокирует сообщения с большим количеством заглавных букв -# Обход: lochat.bypass.caps +# ── CAPS Filter ──────────────────────────────────────────────────────────────── +# Blocks messages with too many capital letters. +# Bypass permission: lochat.bypass.caps caps: enabled: true - max-caps-percent: 70 # Максимум % заглавных букв - min-length: 5 # Минимальная длина для проверки + max-caps-percent: 70 + min-length: 5 diff --git a/bin/main/config/messages.yml b/bin/main/config/messages.yml index 8da71fb..f7ff89a 100644 --- a/bin/main/config/messages.yml +++ b/bin/main/config/messages.yml @@ -1,137 +1,123 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ LoChat Hardcoded Messages ║ -# ║ Цветовая гамма: Spacelegacy ║ -# ║ #B798A8 → #7858E9 ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ +# LoChat system messages +# Internal messages for commands, filters, moderation, and general feedback. + +# ── Commands ─────────────────────────────────────────────────────────────────── commands: mute: - usage: "&#B798A8Использование: ẲE9/mute <ник> [время] [-s] [причина]" - time_help: "⚖C9Время: ẲE91d⚖C9, ẲE92h⚖C9, ẲE930m⚖C9, ẲE960s⚖C9, ẲE9perm" - silent_help: "&#B798A8-s ⚖C9— тихий мут (право ẲE9lochat.mute.silent⚖C9)" - no_silent_permission: "&#CF6679Нет права на тихий мут" - default_reason: "Без причины" - default_duration: "7d" + usage: "&cUsage: &f/mute [time] [-s] [reason]" + time-help: "&7Time format: &f1d&7, &f2h&7, &f30m&7, &f60s&7, &fperm" + silent-help: "&7-s &7= silent mute (requires &flochat.mute.silent&7)" + no-silent-permission: "&cNo permission for silent mute" + default-reason: "No reason specified" + default-duration: "7d" cooldown: - message: "&#B798A8Подождите ẲE9{remaining} &#B798A8сек" + message: "&cPlease wait &f{remaining} &cseconds" - clear_chat: - lines_cleared: "⚖C9Чат очищен ẲE9({lines} строк⚖C9)" - no_permission: "&#CF6679Нет прав для очистки чата" + clear-chat: + lines-cleared: "&aChat cleared &7({lines} lines)" + no-permission: "&cNo permission to clear chat" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЛОКАЛЬНЫЙ ЧАТ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Local Chat ───────────────────────────────────────────────────────────────── -local_chat: - nobody_heard: "⚖C9Вас никто не услышал &#B798A8— рядом нет игроков" - no_players_nearby: "&#B798A8Рядом нет игроков" +local-chat: + nobody-heard: "&7Nobody heard you — no players nearby" + no-players-nearby: "&7No players nearby" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ФИЛЬТРЫ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Filters ──────────────────────────────────────────────────────────────────── filters: caps: - min_length: 3 - blocked_message: "&#CF6679Не кричите в чате" - auto_lowercase_notice: "&#B798A8Сообщение автоматически исправлено" + min-length: 3 + blocked-message: "&cPlease don't shout" + auto-lowercase-notice: "&7Message auto-corrected" spam: - blocked_message: "&#CF6679Не спамьте" - similar_message: "&#CF6679Вы уже отправляли похожее сообщение" + blocked-message: "&cDo not spam" + similar-message: "&cYou already sent a similar message" swear: - blocked_message: "&#CF6679Запрещённые слова" - replaced_notice: "&#B798A8Некоторые слова заменены" + blocked-message: "&cInappropriate language" + replaced-notice: "&7Some words were replaced" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ МУТИРОВАНИЕ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Mute Messages ────────────────────────────────────────────────────────────── mute: - muted_message: "&#CF6679Вы замучены! &#B798A8Причина: ẲE9{reason}&#B798A8. Осталось: ẲE9{time}" - muted_permanent: "&#CF6679Вы замучены навсегда! &#B798A8Причина: ẲE9{reason}" - player_muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}⚖C9. Причина: &#B798A8{reason}" - player_muted_permanent: "⚖C9Игрок ẲE9{player} ⚖C9замучен навсегда. Причина: &#B798A8{reason}" - player_muted_silent: "&#B798A8[⚖C9ТИХИЙ МУТ&#B798A8] ẲE9{player} &#B798A8замучен на ẲE9{time}" - player_unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен" - not_muted: "&#B798A8Игрок ẲE9{player} &#B798A8не замучен" - player_not_found: "&#CF6679Игрок не найден!" - invalid_time: "&#CF6679Неверный формат времени!" - already_muted: "&#CF6679Игрок уже замучен!" - no_silent_unmute_permission: "&#CF6679Нет права на тихий размут!" - player_not_muted_simple: "&#CF6679Игрок не замучен!" + muted-message: "&cYou are muted! &7Reason: &f{reason}&7. Remaining: &f{time}" + muted-permanent: "&cYou are permanently muted! &7Reason: &f{reason}" + player-muted: "&aPlayer &f{player} &amuted for &f{time}&a. Reason: &7{reason}" + player-muted-permanent: "&aPlayer &f{player} &amuted permanently. Reason: &7{reason}" + player-muted-silent: "&8[&7SILENT&8] &f{player} &7muted for &f{time}" + player-unmuted: "&aPlayer &f{player} &aunmuted" + not-muted: "&7Player &f{player} &7is not muted" + player-not-found: "&cPlayer not found!" + invalid-time: "&cInvalid time format!" + already-muted: "&cPlayer is already muted!" + no-silent-unmute-permission: "&cNo permission for silent unmute" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ИГРОВЫЕ РЕЖИМЫ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Gamemodes ────────────────────────────────────────────────────────────────── gamemodes: - survival: "Выживание" - creative: "Творчество" - adventure: "Приключение" - spectator: "Наблюдатель" + survival: "Survival" + creative: "Creative" + adventure: "Adventure" + spectator: "Spectator" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЛИЧНЫЕ СООБЩЕНИЯ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Private Messages ─────────────────────────────────────────────────────────── -private_messages: - no_reply_target: "&#CF6679Нет цели для ответа" - message_sent: "&#B798A8Сообщение отправлено ẲE9{player}" - player_offline: "&#CF6679Игрок ẲE9{player} &#CF6679не в сети" - cannot_message_self: "&#CF6679Нельзя писать самому себе" +private-messages: + no-reply-target: "&cNobody to reply to" + message-sent: "&aMessage sent to &f{player}" + player-offline: "&cPlayer &f{player} &cis not online" + cannot-message-self: "&cYou cannot message yourself" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ИГНОРИРОВАНИЕ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Ignore ───────────────────────────────────────────────────────────────────── ignore: - player_ignored: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор" - player_unignored: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора" - already_ignored: "&#B798A8Игрок ẲE9{player} &#B798A8уже в игноре" - not_ignored: "&#B798A8Игрок ẲE9{player} &#B798A8не в игноре" - cannot_ignore_self: "&#CF6679Нельзя игнорировать самого себя" - ignore_list_empty: "&#B798A8Список игнора пуст" - ignore_list_header: "&#B798A8Игнорируемые игроки⚖C9:" + player-ignored: "&aPlayer &f{player} &ais now ignored" + player-unignored: "&aPlayer &f{player} &ais no longer ignored" + already-ignored: "&7Player &f{player} &7is already ignored" + not-ignored: "&7Player &f{player} &7is not ignored" + cannot-ignore-self: "&cYou cannot ignore yourself" + ignore-list-empty: "&7Your ignore list is empty" + ignore-list-header: "&7Ignored players:" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ОБЩИЕ СООБЩЕНИЯ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── General ──────────────────────────────────────────────────────────────────── general: - no_permission: "&#CF6679Нет прав!" - player_only: "&#CF6679Только для игроков!" - invalid_arguments: "&#CF6679Неверные аргументы!" - command_disabled: "&#CF6679Команда отключена!" - feature_disabled: "&#CF6679Функция отключена!" - player_not_found: "&#CF6679Игрок не найден!" - time_formats: - seconds: "сек" - minutes: "мин" - hours: "ч" - days: "д" - permanent: "навсегда" - enabled: "ẲE9Включено" - disabled: "&#B798A8Отключено" - online: "⚖C9В сети" - offline: "&#B798A8Не в сети" + no-permission: "&cNo permission!" + player-only: "&cPlayers only!" + invalid-arguments: "&cInvalid arguments!" + command-disabled: "&cCommand disabled!" + feature-disabled: "&cFeature disabled!" + player-not-found: "&cPlayer not found!" + time-formats: + seconds: "s" + minutes: "m" + hours: "h" + days: "d" + permanent: "permanent" + enabled: "&aEnabled" + disabled: "&7Disabled" + online: "&aOnline" + offline: "&7Offline" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ВАРНЫ / БАНЫ (LoChat) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Moderation ───────────────────────────────────────────────────────────────── moderation: - default_reason: "Без причины" - duration_permanent: "навсегда" - warn_received: "&#CF6679⚠ Вам выдано предупреждение! &#B798A8Причина: ẲE9{reason}" - warn_staff_confirm: "⚖C9Игроку ẲE9{player} ⚖C9выдан варн. &#B798A8Причина: ẲE9{reason}" - silent_warn_staff: "&#B798A8[⚖C9ТИХИЙ ВАРН&#B798A8] ẲE9{player}⚖C9: &#B798A8{reason}" - ban_usage: "&#B798A8Использование: ẲE9/lban <ник> [время|perm] [причина]" - ban_confirm: "⚖C9Игрок ẲE9{player} ⚖C9забанен. &#B798A8Срок: ẲE9{duration}" - unban_confirm: "⚖C9Бан снят с ẲE9{player}" - not_banned: "&#CF6679Игрок не забанен!" - already_banned: "&#CF6679Игрок уже забанен!" - warn_usage: "&#B798A8Использование: ẲE9/warn <ник> [причина]" - silent_warn_usage: "&#B798A8Использование: ẲE9/silentwarn <ник> [причина]" - ban_kick_message: "═══════ ДОСТУП ЗАПРЕЩЁН ═══════\nВы заблокированы на этом сервере.\nПричина: {reason}\nМодератор: {moderator}\nСрок: <#7858E9>{duration}\n════════════════════════" + default-reason: "No reason specified" + duration-permanent: "permanent" + warn-received: "&6\u26A0 &cYou received a warning! &7Reason: &f{reason}" + warn-staff-confirm: "&aPlayer &f{player} &awarned. &7Reason: &f{reason}" + silent-warn-staff: "&8[&7SILENT&8] &f{player}&7: &7{reason}" + ban-usage: "&cUsage: &f/lban [time|perm] [reason]" + ban-confirm: "&aPlayer &f{player} &abanned. &7Duration: &f{duration}" + unban-confirm: "&aBan lifted for &f{player}" + not-banned: "&cPlayer is not banned!" + already-banned: "&cPlayer is already banned!" + warn-usage: "&cUsage: &f/warn [reason]" + silent-warn-usage: "&cUsage: &f/silentwarn [reason]" + ban-kick-message: | + You are banned from this server. + Reason: {reason} + Moderator: {moderator} + Duration: {duration} diff --git a/bin/main/config/mute.yml b/bin/main/config/mute.yml index 675c031..848fbc6 100644 --- a/bin/main/config/mute.yml +++ b/bin/main/config/mute.yml @@ -1,290 +1,212 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ LoChat Mute Configuration ║ -# ║ Конфигурация мутов ║ -# ║ Версия: 1.5.5-1.20.1 ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ +# LoChat mute system configuration +# Controls mute durations, automatic mutes, escalation, and notifications. -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ОСНОВНЫЕ НАСТРОЙКИ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── General Settings ─────────────────────────────────────────────────────────── settings: - # Причина мута по умолчанию - default-reason: "Нарушение правил чата" - - # Длительность мута по умолчанию + default-reason: "Chat rule violation" default-duration: "1h" - - # Максимальная длина причины мута max-reason-length: 100 - - # Показывать причину мута игроку show-reason: true - - # Показывать оставшееся время мута show-remaining-time: true - - # Автоматически размучивать при истечении времени auto-unmute: true - - # Сохранять историю мутов save-history: true - - # Максимальное количество записей в истории на игрока max-history-entries: 50 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ДОСТУПНЫЕ ДЛИТЕЛЬНОСТИ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Available Durations ──────────────────────────────────────────────────────── +# Each duration requires a permission. Empty permission = no restriction. durations: - # Формат: "время": "право для использования" "5m": permission: "lochat.mute.dur.5m" - display: "5 минут" - + display: "5 minutes" + "10m": permission: "lochat.mute.dur.10m" - display: "10 минут" - + display: "10 minutes" + "30m": permission: "lochat.mute.dur.30m" - display: "30 минут" - + display: "30 minutes" + "1h": permission: "lochat.mute.dur.1h" - display: "1 час" - + display: "1 hour" + "3h": permission: "lochat.mute.dur.3h" - display: "3 часа" - + display: "3 hours" + "6h": permission: "lochat.mute.dur.6h" - display: "6 часов" - + display: "6 hours" + "12h": permission: "lochat.mute.dur.12h" - display: "12 часов" - + display: "12 hours" + "1d": permission: "lochat.mute.dur.1d" - display: "1 день" - + display: "1 day" + "3d": permission: "lochat.mute.dur.3d" - display: "3 дня" - + display: "3 days" + "7d": permission: "lochat.mute.dur.7d" - display: "7 дней" - + display: "7 days" + "14d": permission: "lochat.mute.dur.14d" - display: "14 дней" - + display: "14 days" + "30d": permission: "lochat.mute.dur.30d" - display: "30 дней" - + display: "30 days" + "perm": permission: "lochat.mute.dur.perm" - display: "Навсегда" + display: "Permanent" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ГОТОВЫЕ ПРИЧИНЫ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Preset Reasons ───────────────────────────────────────────────────────────── reasons: spam: - text: "Спам в чате" + text: "Spam" duration: "30m" permission: "lochat.mute.reason.spam" - + caps: - text: "Злоупотребление заглавными буквами" + text: "Excessive caps" duration: "15m" permission: "lochat.mute.reason.caps" - + swear: - text: "Использование нецензурной лексики" + text: "Inappropriate language" duration: "1h" permission: "lochat.mute.reason.swear" - + flood: - text: "Флуд в чате" + text: "Flood" duration: "20m" permission: "lochat.mute.reason.flood" - + advertising: - text: "Реклама" + text: "Advertising" duration: "3h" permission: "lochat.mute.reason.advertising" - + insult: - text: "Оскорбления игроков" + text: "Insulting players" duration: "2h" permission: "lochat.mute.reason.insult" - - toxicity: - text: "Токсичное поведение" - duration: "6h" - permission: "lochat.mute.reason.toxicity" - - politics: - text: "Обсуждение политики" - duration: "1h" - permission: "lochat.mute.reason.politics" - - religion: - text: "Религиозные споры" - duration: "1h" - permission: "lochat.mute.reason.religion" - - begging: - text: "Попрошайничество" - duration: "30m" - permission: "lochat.mute.reason.begging" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ АВТОМАТИЧЕСКИЕ МУТЫ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Auto-Mute ────────────────────────────────────────────────────────────────── auto-mute: - # Включить автоматические муты enabled: true - - # Мут за спам + spam: enabled: true - threshold: 5 # Количество сообщений - time-window: 10 # За какое время (секунды) + threshold: 5 + time-window: 10 duration: "10m" - reason: "Автомут: спам в чате" - - # Мут за мат + reason: "Auto-mute: spam" + swear: enabled: true - threshold: 3 # Количество нарушений + threshold: 3 duration: "30m" - reason: "Автомут: использование мата" - - # Мут за заглавные буквы + reason: "Auto-mute: inappropriate language" + caps: enabled: true - threshold: 5 # Количество нарушений + threshold: 5 duration: "5m" - reason: "Автомут: злоупотребление CAPS" - - # Мут за рекламу + reason: "Auto-mute: excessive caps" + advertising: enabled: true - threshold: 1 # Одно нарушение + threshold: 1 duration: "1h" - reason: "Автомут: реклама" + reason: "Auto-mute: advertising" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЭСКАЛАЦИЯ НАКАЗАНИЙ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Punishment Escalation ────────────────────────────────────────────────────── escalation: - # Включить эскалацию наказаний enabled: true - - # Период для подсчета нарушений (дни) period: 30 - - # Уровни наказаний + levels: 1: duration: "30m" - reason: "Первое нарушение" - + reason: "First offense" + 2: duration: "2h" - reason: "Повторное нарушение" - + reason: "Second offense" + 3: duration: "12h" - reason: "Третье нарушение" - + reason: "Third offense" + 4: duration: "3d" - reason: "Четвертое нарушение" - + reason: "Fourth offense" + 5: duration: "7d" - reason: "Пятое нарушение" - + reason: "Fifth offense" + 6: duration: "perm" - reason: "Систематические нарушения" + reason: "Systematic violations" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ УВЕДОМЛЕНИЯ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Notifications ────────────────────────────────────────────────────────────── notifications: - # Уведомлять администраторов о мутах notify-staff: true - - # Право для получения уведомлений staff-permission: "lochat.mute.notify" - - # Публичные уведомления о мутах public-mute: false - - # Публичные уведомления о размутах public-unmute: false - - # Скрытые муты (с флагом -s) + silent-mute: enabled: true permission: "lochat.mute.silent" notify-permission: "lochat.mute.see-silent" - - # Формат уведомлений - formats: - mute: "&#FF6B6B{moderator} замутил {player} на {duration}. Причина: {reason}" - unmute: "BCB77{moderator} размутил {player}" - silent-mute: "&#FFA726[ТИХО] {moderator} замутил {player} на {duration}. Причина: {reason}" - auto-mute: "&#FF6B6B[АВТО] {player} замучен на {duration}. Причина: {reason}" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ИНТЕГРАЦИИ │ -# └─────────────────────────────────────────────────────────────────────────────┘ + formats: + mute: "&c{moderator} &7muted &f{player} &7for &f{duration}&7. Reason: &f{reason}" + unmute: "&a{moderator} &7unmuted &f{player}" + silent-mute: "&6[SILENT] &f{moderator} &7muted &f{player} &7for &f{duration}" + auto-mute: "&c[AUTO] &f{player} &7muted for &f{duration}&7. Reason: &f{reason}" + +# ── Integrations ─────────────────────────────────────────────────────────────── integrations: - # LibertyBans libertybans: enabled: false sync-mutes: true - - # AdvancedBan + advancedban: enabled: false sync-mutes: true - - # LiteBans + litebans: enabled: false sync-mutes: true - - # Discord уведомления + discord: enabled: false webhook-url: "" - format: "**{moderator}** замутил **{player}** на **{duration}**\nПричина: {reason}" + format: "**{moderator}** muted **{player}** for **{duration}**\nReason: {reason}" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ХРАНЕНИЕ ДАННЫХ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Storage ──────────────────────────────────────────────────────────────────── storage: - # Тип хранения: file, mysql, sqlite - type: "file" - - # Настройки MySQL + type: file + mysql: host: "localhost" port: 3306 @@ -292,45 +214,36 @@ storage: username: "root" password: "password" table-prefix: "lochat_" - - # Настройки SQLite + sqlite: file: "plugins/LoChat/mutes.db" - - # Автоматическая очистка старых записей + cleanup: enabled: true - days: 90 # Удалять записи старше N дней + days: 90 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Extra Features ───────────────────────────────────────────────────────────── features: - # Временные муты (автоматически снимаются) temporary-mutes: true - - # IP муты (мутить по IP адресу) + ip-mutes: enabled: false permission: "lochat.mute.ip" - - # Мут команд (блокировать определенные команды) + command-mute: enabled: false blocked-commands: - "me" - "say" - "tell" - - # Предупреждения перед мутом + warnings: enabled: true max-warnings: 3 - reset-time: 3600 # Сброс предупреждений (секунды) - - # Апелляции на муты + reset-time: 3600 + appeals: enabled: false command: "/appeal" - permission: "lochat.appeal" \ No newline at end of file + permission: "lochat.appeal" diff --git a/bin/main/config/sounds.yml b/bin/main/config/sounds.yml index 2f72b96..1ca37e1 100644 --- a/bin/main/config/sounds.yml +++ b/bin/main/config/sounds.yml @@ -1,313 +1,158 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ LoChat Sounds Configuration ║ -# ║ Конфигурация звуков ║ -# ║ Версия: 1.5.5-1.20.1 ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ +# LoChat sound configuration +# Controls sound effects for chat events, moderation, and system actions. -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ОСНОВНЫЕ НАСТРОЙКИ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── General ──────────────────────────────────────────────────────────────────── settings: - # Включить звуки enabled: true - - # Глобальная громкость (0.0 - 1.0) global-volume: 0.5 - - # Глобальная высота тона (0.5 - 2.0) global-pitch: 1.0 - - # Разрешить игрокам отключать звуки allow-disable: true - - # Команда для управления звуками toggle-command: "/sounds" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЗВУКИ СООБЩЕНИЙ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Message Sounds ───────────────────────────────────────────────────────────── messages: - # Личные сообщения private-message: enabled: true - sound: "BLOCK_NOTE_BLOCK_PLING" + sound: BLOCK_NOTE_BLOCK_PLING volume: 0.8 pitch: 1.2 - # Играть только получателю receiver-only: true - - # Упоминания в чате + mention: enabled: true - sound: "BLOCK_NOTE_BLOCK_BELL" + sound: BLOCK_NOTE_BLOCK_BELL volume: 0.7 pitch: 1.5 - # Дополнительный звук для @everyone - everyone-sound: "BLOCK_NOTE_BLOCK_CHIME" - - # Глобальный чат + everyone-sound: BLOCK_NOTE_BLOCK_CHIME + global-chat: enabled: false - sound: "UI_BUTTON_CLICK" + sound: UI_BUTTON_CLICK volume: 0.3 pitch: 1.0 - - # Локальный чат + local-chat: enabled: false - sound: "UI_BUTTON_CLICK" + sound: UI_BUTTON_CLICK volume: 0.2 pitch: 0.8 - - # Объявления + announcement: enabled: true - sound: "BLOCK_NOTE_BLOCK_CHIME" + sound: BLOCK_NOTE_BLOCK_CHIME volume: 1.0 pitch: 1.0 - # Дополнительные звуки для важных объявлений - important-sound: "ENTITY_ENDER_DRAGON_GROWL" + important-sound: ENTITY_ENDER_DRAGON_GROWL -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЗВУКИ СИСТЕМЫ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── System Sounds ────────────────────────────────────────────────────────────── system: - # Подключение к серверу join: enabled: false - sound: "ENTITY_PLAYER_LEVELUP" + sound: ENTITY_PLAYER_LEVELUP volume: 0.5 pitch: 1.0 - # Играть только подключившемуся игроку self-only: true - - # Отключение от сервера + quit: enabled: false - sound: "BLOCK_NOTE_BLOCK_BASS" + sound: BLOCK_NOTE_BLOCK_BASS volume: 0.3 pitch: 0.8 - - # Мут игрока + mute: enabled: true - sound: "BLOCK_ANVIL_LAND" + sound: BLOCK_ANVIL_LAND volume: 0.6 pitch: 0.5 - # Играть замученному игроку - target-sound: "ENTITY_VILLAGER_NO" - - # Размут игрока + target-sound: ENTITY_VILLAGER_NO + unmute: enabled: true - sound: "ENTITY_PLAYER_LEVELUP" + sound: ENTITY_PLAYER_LEVELUP volume: 0.7 pitch: 1.2 - # Играть размученному игроку - target-sound: "ENTITY_VILLAGER_YES" - - # Очистка чата + target-sound: ENTITY_VILLAGER_YES + clear-chat: enabled: true - sound: "ITEM_BUCKET_EMPTY" + sound: ITEM_BUCKET_EMPTY volume: 0.5 pitch: 1.5 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЗВУКИ ГРАДИЕНТОВ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Gradient Sounds ──────────────────────────────────────────────────────────── gradient: - # Установка градиента color-set: enabled: true - sound: "BLOCK_NOTE_BLOCK_HARP" + sound: BLOCK_NOTE_BLOCK_HARP volume: 0.6 pitch: 1.3 - - # Сброс градиента + color-reset: enabled: true - sound: "BLOCK_NOTE_BLOCK_BASS" + sound: BLOCK_NOTE_BLOCK_BASS volume: 0.4 pitch: 0.7 - - # Установка префикса + prefix-set: enabled: true - sound: "BLOCK_NOTE_BLOCK_CHIME" + sound: BLOCK_NOTE_BLOCK_CHIME volume: 0.7 pitch: 1.4 - - # Ошибка (недостаточно средств, кулдаун и т.д.) + error: enabled: true - sound: "ENTITY_VILLAGER_NO" + sound: ENTITY_VILLAGER_NO volume: 0.5 pitch: 0.8 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЗВУКИ КОМАНД │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Command Sounds ───────────────────────────────────────────────────────────── commands: - # Успешное выполнение команды success: enabled: false - sound: "ENTITY_EXPERIENCE_ORB_PICKUP" + sound: ENTITY_EXPERIENCE_ORB_PICKUP volume: 0.4 pitch: 1.2 - - # Ошибка выполнения команды + error: enabled: true - sound: "ENTITY_VILLAGER_NO" + sound: ENTITY_VILLAGER_NO volume: 0.5 pitch: 0.8 - - # Недостаточно прав + no-permission: enabled: true - sound: "BLOCK_NOTE_BLOCK_BASS" + sound: BLOCK_NOTE_BLOCK_BASS volume: 0.6 pitch: 0.5 - - # Игрок не найден + player-not-found: enabled: true - sound: "ENTITY_ITEM_BREAK" + sound: ENTITY_ITEM_BREAK volume: 0.4 pitch: 0.6 -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЗВУКИ ФИЛЬТРОВ │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Filter Sounds ────────────────────────────────────────────────────────────── filters: - # Сообщение заблокировано фильтром blocked: enabled: true - sound: "ENTITY_VILLAGER_NO" + sound: ENTITY_VILLAGER_NO volume: 0.6 pitch: 0.7 - - # Предупреждение от фильтра + warning: enabled: true - sound: "BLOCK_NOTE_BLOCK_PLING" + sound: BLOCK_NOTE_BLOCK_PLING volume: 0.5 pitch: 0.9 - - # Автоматическое исправление (например, caps) + auto-fix: enabled: false - sound: "UI_BUTTON_CLICK" + sound: UI_BUTTON_CLICK volume: 0.3 pitch: 1.1 - -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ КАСТОМНЫЕ ЗВУКИ │ -# └─────────────────────────────────────────────────────────────────────────────┘ - -custom: - # Звуки для VIP игроков - vip: - enabled: false - join-sound: "ENTITY_PLAYER_LEVELUP" - message-sound: "BLOCK_NOTE_BLOCK_HARP" - volume: 0.8 - pitch: 1.3 - - # Звуки для администраторов - admin: - enabled: false - join-sound: "ENTITY_ENDER_DRAGON_GROWL" - command-sound: "BLOCK_ANVIL_USE" - volume: 0.7 - pitch: 1.0 - - # Праздничные звуки - holiday: - enabled: false - christmas: - sound: "BLOCK_NOTE_BLOCK_CHIME" - volume: 0.6 - pitch: 1.5 - new-year: - sound: "ENTITY_FIREWORK_ROCKET_BLAST" - volume: 0.8 - pitch: 1.2 - -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ЗВУКОВЫЕ СХЕМЫ │ -# └─────────────────────────────────────────────────────────────────────────────┘ - -schemes: - # Классическая схема - classic: - name: "Классическая" - description: "Стандартные звуки Minecraft" - sounds: - private-message: "BLOCK_NOTE_BLOCK_PLING" - mention: "BLOCK_NOTE_BLOCK_BELL" - announcement: "BLOCK_NOTE_BLOCK_CHIME" - - # Минималистичная схема - minimal: - name: "Минимальная" - description: "Только важные звуки" - sounds: - private-message: "UI_BUTTON_CLICK" - mention: "BLOCK_NOTE_BLOCK_PLING" - announcement: "ENTITY_EXPERIENCE_ORB_PICKUP" - - # Отключенная схема - silent: - name: "Тишина" - description: "Все звуки отключены" - sounds: {} - -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ НАСТРОЙКИ ПО МИРАМ │ -# └─────────────────────────────────────────────────────────────────────────────┘ - -worlds: - # Настройки для конкретных миров - world_nether: - volume-modifier: 0.7 # Уменьшить громкость на 30% - pitch-modifier: 0.8 # Понизить тон - - world_the_end: - volume-modifier: 0.5 - pitch-modifier: 1.2 - # Отключить определенные звуки - disabled-sounds: - - "global-chat" - - "local-chat" - - creative_world: - volume-modifier: 1.2 - # Включить дополнительные звуки - extra-sounds: - build: "BLOCK_STONE_PLACE" - fly: "ENTITY_BAT_TAKEOFF" - -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ ПЕРСОНАЛЬНЫЕ НАСТРОЙКИ │ -# └─────────────────────────────────────────────────────────────────────────────┘ - -personal: - # Разрешить игрокам настраивать громкость - allow-volume-control: true - - # Разрешить игрокам выбирать звуковые схемы - allow-scheme-selection: true - - # Сохранять настройки игроков - save-preferences: true - - # Файл для сохранения настроек - preferences-file: "plugins/LoChat/sound-preferences.yml" \ No newline at end of file diff --git a/bin/main/custom-commands.yml b/bin/main/custom-commands.yml index 75b7de7..5742840 100644 --- a/bin/main/custom-commands.yml +++ b/bin/main/custom-commands.yml @@ -1,140 +1,83 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ Custom Commands Configuration ║ -# ║ Конфигурация кастомных команд ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ +# LoChat custom commands +# Define your own commands with custom messages and actions. +# +# Fields: +# enabled - whether the command is active +# permission - required permission (optional) +# message - message content (supports MiniMessage format) +# aliases - alternative command names +# type - chat | broadcast | title | actionbar | bungee +# target - sender | all | permission: +# server - (bungee only) target server name -# Информационные команды help: enabled: true message: | - ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ - 📚 Помощь по серверу - - <#FFEB3B>🏠 Основные команды: - <#9E9E9E>• <#FFFFFF>/spawn - телепорт на спавн - <#9E9E9E>• <#FFFFFF>/home - телепорт домой - <#9E9E9E>• <#FFFFFF>/sethome - установить дом - - <#FFEB3B>💬 Чат команды: - <#9E9E9E>• <#FFFFFF>!сообщение - глобальный чат - <#9E9E9E>• <#FFFFFF>/msg игрок - личное сообщение - <#9E9E9E>• <#FFFFFF>/reply - ответить на ЛС - - <#FFEB3B>🎨 Кастомизация: - <#9E9E9E>• <#FFFFFF>/color - градиентный ник - <#9E9E9E>• <#FFFFFF>/prefix - кастомный префикс - - ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ - aliases: ["помощь", "хелп"] - type: "chat" - target: "sender" + Available commands: + \u2022 /spawn - teleport to spawn + \u2022 /msg - private message + \u2022 /color - gradient nickname + \u2022 /prefix - custom prefix + aliases: [] + type: chat + target: sender rules: enabled: true message: | - ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ - 📋 Правила сервера - - <#F44336>🚫 Запрещено: - <#9E9E9E>• Читерство и использование модов - <#9E9E9E>• Гриферство и воровство - <#9E9E9E>• Мат и оскорбления - <#9E9E9E>• Спам в чате - <#9E9E9E>• Реклама других серверов - - <#4CAF50>✅ Разрешено: - <#9E9E9E>• Строительство в любом стиле - <#9E9E9E>• Торговля между игроками - <#9E9E9E>• Создание команд и кланов - <#9E9E9E>• Использование /home и /spawn - - <#FFA726>⚠️ За нарушения: - <#9E9E9E>• Предупреждение → Мут → Бан - - ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ - aliases: ["правила", "rule"] - type: "chat" - target: "sender" + Server Rules + 1. No cheating or hacking + 2. No griefing or stealing + 3. No swearing or insults + 4. No spam + 5. No advertising + aliases: [] + type: chat + target: sender discord: enabled: true message: | - ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ - 💬 Discord сервер - - <#5865F2>Присоединяйся к нашему Discord! - - <#FFEB3B>🔗 Ссылка: <#00BFFF>discord.gg/yourserver - - <#FFEB3B>📢 В Discord ты найдешь: - <#9E9E9E>• Общение с игроками - <#9E9E9E>• Новости и обновления - <#9E9E9E>• Поддержку администрации - <#9E9E9E>• Конкурсы и ивенты - - ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ - aliases: ["дискорд", "ds"] - type: "chat" - target: "sender" + Join our Discord! + discord.gg/yourserver + aliases: ["ds"] + type: chat + target: sender coords: enabled: true - message: "<#FFEB3B>📍 Ваши координаты: <#9E9E9E>X: <#FFFFFF>{x} Y: <#FFFFFF>{y} Z: <#FFFFFF>{z} <#9E9E9E>Мир: <#4CAF50>{world}" - aliases: ["координаты", "pos", "position"] - type: "chat" - target: "sender" + message: "\u25B6 X: {x} Y: {y} Z: {z} World: {world}" + aliases: ["pos", "position"] + type: chat + target: sender ping: enabled: true - message: "<#FFEB3B>📶 Ваш пинг: <#4CAF50>{ping}ms" - aliases: ["пинг"] - type: "chat" - target: "sender" - type: "chat" - target: "sender" + message: "\u25B6 Your ping: {ping}ms" + aliases: [] + type: chat + target: sender hub: enabled: true - message: "<#4CAF50>🏠 Подключение к хабу..." - aliases: ["lobby", "хаб"] - type: "bungee" - target: "sender" - server: "hub" + message: "Connecting to hub..." + aliases: ["lobby"] + type: bungee + target: sender + server: hub -discord: - enabled: true - message: | - ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ - 💬 Discord сервер - - <#5865F2>Присоединяйся к нашему Discord! - - <#FFEB3B>🔗 Ссылка: <#00BFFF>discord.gg/yourserver - - <#FFEB3B>📢 В Discord ты найдешь: - <#9E9E9E>• Общение с игроками - <#9E9E9E>• Новости и обновления - <#9E9E9E>• Поддержку администрации - <#9E9E9E>• Конкурсы и ивенты - - ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ - aliases: ["дискорд", "ds"] - type: "chat" - target: "sender" - -# Команды для администрации broadcast: enabled: true permission: "lochat.broadcast" message: "{message}" - aliases: ["bc", "объявить"] - type: "broadcast" - target: "all" + aliases: ["bc"] + type: broadcast + target: all maintenance: enabled: false permission: "lochat.maintenance" - message: "<#FFA726>🔧 Сервер переведен в режим технических работ" - aliases: ["тех-работы", "техработы"] - type: "title" - target: "all" \ No newline at end of file + message: "Server is now in maintenance mode" + aliases: [] + type: title + target: all diff --git a/bin/main/messages.yml b/bin/main/messages.yml index 4cd0418..2a1c53f 100644 --- a/bin/main/messages.yml +++ b/bin/main/messages.yml @@ -1,225 +1,166 @@ -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ LoChat — messages.yml ║ -# ║ Default palette (Spacelegacy): #7858E9 (dusty rose) → #7858E9 (violet) ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ -# -# Color roles (reference when editing strings below): -# ẲE9 — primary labels / body (dusty rose) -# ⚖C9 — accents / separators (mid violet) -# ẲE9 — emphasis / values (deep violet) -# &f / #E8E0F0 — message body white -# &#CF6679 — errors (muted red, fits the palette) +# LoChat player messages +# All messages sent to players. Supports & color codes and placeholders. -prefix: "ẲE9[⚖C9LB6BD6oẲE9CⅵDChB6BD6a⚖C9tẲE9]" +prefix: "&8[&3LoChat&8]" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Global chat (toggle messages, server-disabled notice) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Global Chat ──────────────────────────────────────────────────────────────── global: - toggled-on: "⚖C9Глобальный чат ẲE9включён" - toggled-off: "⚖C9Глобальный чат ẲE9отключён" - disabled: "&#CF6679Глобальный чат отключён на этом сервере" + toggled-on: "&aGlobal chat enabled" + toggled-off: "&cGlobal chat disabled" + disabled: "&cGlobal chat is disabled on this server" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Local chat (no recipients nearby) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Local Chat ───────────────────────────────────────────────────────────────── local: - no-players: "ẲE9Рядом нет игроков" - nobody-heard: "⚖C9Вас никто не услышал ẲE9— рядом нет игроков" + no-players: "&cNo players nearby" + nobody-heard: "&7Nobody heard you — no players nearby" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Private messages (/msg, /reply) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Private Messages ─────────────────────────────────────────────────────────── pm: - format-sent: "ẲE9[⚖C9→ẲE9] ⚖C9Вы ẲE9→ {receiver_display}ẲE9: &f{message}" - format-received: "ẲE9[⚖C9←ẲE9] {sender_display} ẲE9→ ⚖C9ВыẲE9: &f{message}" - use-gradient-names: true - sent: "ẲE9[⚖C9→ẲE9] ⚖C9Вы ẲE9→ &f{player}ẲE9: &f{message}" - received: "ẲE9[⚖C9←ẲE9] &f{player} ẲE9→ ⚖C9ВыẲE9: &f{message}" - no-reply: "&#CF6679Некому ответить" - ignored: "&#CF6679Этот игрок вас игнорирует" - player-offline: "&#CF6679Игрок не в сети" - self: "&#CF6679Нельзя писать самому себе" + format-sent: "&8[&a\u2192&8] &7You &a\u2192 &f{receiver_display}&8: &f{message}" + format-received: "&8[&e\u2190&8] &f{sender_display} &e\u2192 &7You&8: &f{message}" + no-reply: "&cNobody to reply to" + ignored: "&cThis player is ignoring you" + player-offline: "&cPlayer is not online" + self: "&cYou cannot message yourself" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Ignore list │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Ignore List ──────────────────────────────────────────────────────────────── ignore: - added: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор" - removed: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора" - already-ignored: "ẲE9Игрок ẲE9{player} ẲE9уже в игноре" - not-ignored: "ẲE9Игрок ẲE9{player} ẲE9не в игноре" - self: "&#CF6679Нельзя игнорировать самого себя" - list-empty: "ẲE9Ваш список игнора пуст" - list-header: "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬" - list-footer: "ẲE9Всего: ẲE9{count} ẲE9игроков" + added: "&aPlayer &f{player} &ais now ignored" + removed: "&aPlayer &f{player} &ais no longer ignored" + already-ignored: "&7Player &f{player} &7is already ignored" + not-ignored: "&7Player &f{player} &7is not ignored" + self: "&cYou cannot ignore yourself" + list-empty: "&7Your ignore list is empty" + list-header: "&8\u2500\u2500\u2500\u2500\u2500 Ignored Players \u2500\u2500\u2500\u2500\u2500" + list-footer: "&7Total: &f{count} &7players" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Announcements │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Announcements ────────────────────────────────────────────────────────────── announce: - reloaded: "⚖C9Конфигурация ẲE9перезагружена" + reloaded: "&aConfiguration reloaded" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Chat spy (moderation) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Chat Spy ─────────────────────────────────────────────────────────────────── spy: - enabled: "⚖C9Режим шпиона ẲE9включён" - disabled: "⚖C9Режим шпиона ẲE9отключён" - format: "ẲE9[⚖C9SPYẲE9] ẲE9{sender} ẲE9→ ⚖C9{receiver}ẲE9: &f{message}" - chat-format: "ẲE9[⚖C9SPYẲE9] ẲE9{type} ẲE9{sender}ẲE9: &f{message}" + enabled: "&aSpy mode enabled" + disabled: "&cSpy mode disabled" + format: "&8[&4SPY&8] &f{sender} &8\u2192 &7{receiver}&8: &f{message}" + chat-format: "&8[&4SPY&8] &f{sender}&8: &f{message}" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Message filters │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Filters ──────────────────────────────────────────────────────────────────── filter: - blocked: "&#CF6679Сообщение заблокировано" - warning: "ẲE9Предупреждение" + blocked: "&cMessage blocked" + warning: "&6Warning" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Cooldowns │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Cooldowns ────────────────────────────────────────────────────────────────── cooldown: - wait: "ẲE9Подождите ẲE9{time} ẲE9сек" + wait: "&cPlease wait &f{time} &cseconds" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Anti-spam (caps, repeat, similar messages) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Anti-Spam ────────────────────────────────────────────────────────────────── antispam: - caps: "&#CF6679Не кричите в чате" - repeat: "&#CF6679Не повторяйте символы" - similar: "&#CF6679Не отправляйте одинаковые сообщения" + caps: "&cPlease don't shout" + repeat: "&cPlease don't repeat characters" + similar: "&cPlease don't send the same message" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Clear chat │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Clear Chat ───────────────────────────────────────────────────────────────── clearchat: - cleared: "⚖C9Чат очищен ẲE9администратором ẲE9{player}" + cleared: "&aChat cleared by &f{player}" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Command / usage errors │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Errors ───────────────────────────────────────────────────────────────────── errors: - no-permission: "&#CF6679Нет прав" - player-not-found: "&#CF6679Игрок не найден" - invalid-usage: "ẲE9Использование: ẲE9{usage}" + no-permission: "&cNo permission" + player-not-found: "&cPlayer not found" + invalid-usage: "&cUsage: &f{usage}" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ General (permissions, reload, hub, etc.) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── General ──────────────────────────────────────────────────────────────────── general: - no-permission: "&#CF6679У вас нет прав!" - players-only: "&#CF6679Только для игроков!" - config-reloaded: "⚖C9Конфиг ẲE9перезагружен!" - invalid-player: "&#CF6679Игрок ẲE9{player} &#CF6679не найден!" - cooldown-active: "ẲE9Подождите ẲE9{time}с" - command-disabled: "&#CF6679Команда отключена!" + no-permission: "&cYou don't have permission!" + players-only: "&cThis command is for players only!" + config-reloaded: "&aConfiguration reloaded!" + invalid-player: "&cPlayer &f{player} &cnot found!" + cooldown-active: "&cPlease wait &f{time}&cs" + command-disabled: "&cCommand disabled!" + +# ── Hub ──────────────────────────────────────────────────────────────────────── hub: - connecting: "⚖C9Подключение к ẲE9{server}⚖C9..." + connecting: "&aConnecting to &f{server}&a..." -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Mutes │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Mute ─────────────────────────────────────────────────────────────────────── mute: - muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}" - unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен" - already-muted: "ẲE9Игрок ẲE9{player} ẲE9уже замучен" - not-muted: "ẲE9Игрок ẲE9{player} ẲE9не замучен" - you-muted: "&#CF6679Вы замучены! ẲE9Осталось: ẲE9{time}" - permanent: "&#CF6679Вы замучены навсегда!" + muted: "&aPlayer &f{player} &amuted for &f{time}" + unmuted: "&aPlayer &f{player} &aunmuted" + already-muted: "&7Player &f{player} &7is already muted" + not-muted: "&7Player &f{player} &7is not muted" + you-muted: "&cYou are muted! &7Remaining: &f{time}" + permanent: "&cYou are permanently muted!" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Gradient nick module (LoPreff) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Gradients ────────────────────────────────────────────────────────────────── gradient: - color-set: "⚖C9Градиент ẲE9установлен!" - color-enabled: "⚖C9Градиентный ник ẲE9включён" - color-disabled: "ẲE9Градиентный ник ⚖C9отключён" - color-reset: "ẲE9Градиент сброшен" - prefix-set: "⚖C9Префикс ẲE9установлен!" - prefix-reset: "ẲE9Префикс сброшен" - prefix-reset-success: "⚖C9Префикс успешно ẲE9сброшен!" - prefix-enabled: "⚖C9Префикс ẲE9включён" - prefix-disabled: "ẲE9Префикс ⚖C9отключён" - invalid-hex: "&#CF6679Неверный HEX цвет: ẲE9{color}" - invalid-color: "&#CF6679Неверный цвет: ẲE9{color}" - too-many-colors: "&#CF6679Слишком много цветов! Максимум: ẲE9{max}" - too-few-colors: "&#CF6679Слишком мало цветов! Минимум: ẲE9{min}" - not-enough-colors: "&#CF6679Слишком мало цветов! Минимум: ẲE9{min}" - cooldown: "ẲE9Подождите ẲE9{time} ẲE9сек" - not-enough-points: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}" - not-enough-points-color: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}" - not-enough-points-prefix: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}" - player-not-found: "&#CF6679Игрок не найден" - color-help: "ẲE9Использование: ẲE9/color " - color-success: "⚖C9Градиент успешно ẲE9установлен!" - color-no-colors: "ẲE9У вас нет установленных цветов" - color-copy-usage: "ẲE9Использование: ẲE9/color copy <игрок>" - color-copy-no-colors: "ẲE9У игрока ẲE9{player} ẲE9нет цветов" - prefix-help: "ẲE9Использование: ẲE9/prefix <текст> ẲE9или ẲE9/prefix reset" - prefix-success: "⚖C9Префикс установлен! ẲE9Стоимость: ẲE9{price} ẲE9поинтов" - prefix-success-free: "⚖C9Префикс ẲE9установлен!" - prefix-no-prefix: "ẲE9У вас нет префикса" - prefix-too-long: "&#CF6679Префикс слишком длинный! Максимум: ẲE9{max}" - prefix-no-colors: "&#CF6679Префикс не может содержать цветовые коды!" - prefix-invalid-chars: "&#CF6679Недопустимые символы в префиксе!" - prefix-blacklisted: "&#CF6679Этот префикс запрещён!" - only-player: "&#CF6679Только для игроков!" - no-permission: "&#CF6679Нет прав!" - reload-success: "⚖C9Конфигурация ẲE9перезагружена!" - info-header: "ẲE9▬▬▬▬▬▬▬▬ ẲE9{player} ẲE9▬▬▬▬▬▬▬▬" - info-prefix: "ẲE9Префикс: &f{prefix}" - info-prefix-enabled: "ẲE9Префикс активен: &f{enabled}" - info-colors: "ẲE9Цвета: &f{colors}" - info-color-enabled: "ẲE9Цвет активен: &f{enabled}" - info-prefix-purchased: "ẲE9Куплен: &f{purchased}" + color-set: "&aGradient set!" + color-enabled: "&aGradient nickname enabled" + color-disabled: "&7Gradient nickname disabled" + color-reset: "&7Gradient reset" + prefix-set: "&aPrefix set!" + prefix-reset: "&7Prefix reset" + prefix-enabled: "&aPrefix enabled" + prefix-disabled: "&7Prefix disabled" + invalid-hex: "&cInvalid hex color: &f{color}" + invalid-color: "&cInvalid color: &f{color}" + too-many-colors: "&cToo many colors! Maximum: &f{max}" + too-few-colors: "&cToo few colors! Minimum: &f{min}" + cooldown: "&cPlease wait &f{time} &cseconds" + not-enough-points: "&cNot enough points! Need: &f{price}" + player-not-found: "&cPlayer not found" + color-help: "&cUsage: &f/color ..." + color-success: "&aGradient applied!" + color-no-colors: "&7You have no colors set" + prefix-help: "&cUsage: &f/prefix " + prefix-success: "&aPrefix set!" + prefix-success-free: "&aPrefix set!" + prefix-no-prefix: "&7You have no prefix" + prefix-too-long: "&cPrefix too long! Max: &f{max}" + prefix-no-colors: "&cPrefix cannot contain color codes" + only-player: "&cPlayers only!" + no-permission: "&cNo permission!" + reload-success: "&aConfiguration reloaded!" + info-header: "&8\u2500\u2500\u2500\u2500\u2500 &f{player} &8\u2500\u2500\u2500\u2500\u2500" + info-prefix: "&7Prefix: &f{prefix}" + info-colors: "&7Colors: &f{colors}" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Custom nicknames (/nick) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── Custom Nicknames ─────────────────────────────────────────────────────────── nick: - current: "ẲE9Ваш ник: ẲE9{nick}" - usage: "ẲE9Использование: ẲE9/nick <ник> ẲE9или ẲE9/nick reset" - reset-usage: "ẲE9Используйте ẲE9/nick reset ẲE9для сброса" - set-usage: "ẲE9Используйте ẲE9/nick <ник> ẲE9для установки" - no-nick: "ẲE9У вас нет кастомного ника" - reset-success: "⚖C9Ник ẲE9сброшен!" - set-success: "⚖C9Ник изменён на: &f{nick}" - invalid: "&#CF6679Невалидный ник!" - requirements-header: "ẲE9Требования:" - requirements-length: "⚖C9◆ &fДлина: 3-16 символов" - requirements-chars: "⚖C9◆ &fБуквы, цифры, _, русские буквы" - requirements-colors: "⚖C9◆ &fЦвета: ẲE9&#RRGGBBẲE9текст" - taken: "&#CF6679Этот ник уже занят!" - error: "&#CF6679Не удалось установить ник!" + current: "&7Your nickname: &f{nick}" + usage: "&cUsage: &f/nick &7or &f/nick reset" + no-nick: "&7You have no custom nickname" + reset-success: "&aNickname reset!" + set-success: "&aNickname changed to: &f{nick}" + invalid: "&cInvalid nickname!" + taken: "&cThis nickname is already taken!" + error: "&cFailed to set nickname!" -# ┌─────────────────────────────────────────────────────────────────────────────┐ -# │ Roleplay commands (/me, /try, /do, /roll) │ -# └─────────────────────────────────────────────────────────────────────────────┘ +# ── RP Commands ──────────────────────────────────────────────────────────────── rp: - me: "* {player} {action}" - try-format: "* {player} пытается {action}... {result}" - try-success: "[Успех!]" - try-fail: "[Провал!]" - do-format: "[Сцена] {description} ({player})" - roll-format: "* {player} бросает кубик и получает {result} из {max}" - roll-min-error: "Минимальное значение кубика: 2" - roll-max-error: "Максимальное значение: 1000000" - roll-invalid-number: "Укажите число: /roll [максимум]" + me: "&7* {player} {action}" + try-format: "&7* {player} tries {action}... &f{result}" + try-success: "&a[Success!]" + try-fail: "&c[Fail!]" + do-format: "&8[Scene] &f{description} &7({player})" + roll-format: "&7* {player} rolls &f{result} &7out of &f{max}" + roll-min-error: "&cMinimum dice value: 2" + roll-max-error: "&cMaximum dice value: 1000000" + roll-invalid-number: "&cPlease specify a number: /roll [max]" diff --git a/build.gradle.kts b/build.gradle.kts index 17db837..f4e3f96 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,7 @@ checkstyle { configFile = file("config/checkstyle/checkstyle.xml") isIgnoreFailures = false maxErrors = 0 - maxWarnings = 100 + maxWarnings = 200 } java { diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 651930a..6595e25 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -3,81 +3,59 @@ "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" "https://checkstyle.org/dtds/configuration_1_3.dtd"> - - - - + - - - - - - - - - - - - + + - - - - - - - - - - + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - @@ -87,38 +65,19 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - - - @@ -136,52 +95,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/main/java/com/loki/lochat/LoChat.java b/src/main/java/com/loki/lochat/LoChat.java index f5b5757..b1687e5 100644 --- a/src/main/java/com/loki/lochat/LoChat.java +++ b/src/main/java/com/loki/lochat/LoChat.java @@ -11,6 +11,7 @@ import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.integrations.DiscordIntegration; import com.loki.lochat.managers.AutoMessageManager; import com.loki.lochat.managers.CustomCommandManager; + import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -82,9 +83,15 @@ public final class LoChat extends JavaPlugin { configManager.reload(); messageConfig.reload(); autoMessageManager.reload(); - if (gradientModule != null) gradientModule.reload(); - if (customCommandManager != null) customCommandManager.reload(); - if (discordIntegration != null) discordIntegration.reload(); + if (gradientModule != null) { + gradientModule.reload(); + } + if (customCommandManager != null) { + customCommandManager.reload(); + } + if (discordIntegration != null) { + discordIntegration.reload(); + } if (serviceRegistry != null) { try { serviceRegistry.get(PunishmentService.class).save(); diff --git a/src/main/java/com/loki/lochat/api/filter/MessageFilter.java b/src/main/java/com/loki/lochat/api/filter/MessageFilter.java index 93f0ddb..8262db8 100644 --- a/src/main/java/com/loki/lochat/api/filter/MessageFilter.java +++ b/src/main/java/com/loki/lochat/api/filter/MessageFilter.java @@ -1,6 +1,7 @@ package com.loki.lochat.api.filter; import com.loki.lochat.data.model.ChatMessage; + import org.bukkit.entity.Player; /** diff --git a/src/main/java/com/loki/lochat/api/service/MessagingService.java b/src/main/java/com/loki/lochat/api/service/MessagingService.java index 2344c44..9d8bc3b 100644 --- a/src/main/java/com/loki/lochat/api/service/MessagingService.java +++ b/src/main/java/com/loki/lochat/api/service/MessagingService.java @@ -1,6 +1,7 @@ package com.loki.lochat.api.service; import net.kyori.adventure.text.Component; + import org.bukkit.entity.Player; import java.util.Optional; diff --git a/src/main/java/com/loki/lochat/api/service/MuteService.java b/src/main/java/com/loki/lochat/api/service/MuteService.java index 02f09b4..b42a90f 100644 --- a/src/main/java/com/loki/lochat/api/service/MuteService.java +++ b/src/main/java/com/loki/lochat/api/service/MuteService.java @@ -1,6 +1,7 @@ package com.loki.lochat.api.service; import com.loki.lochat.data.model.MuteData; + import org.bukkit.entity.Player; import java.util.List; diff --git a/src/main/java/com/loki/lochat/api/service/PunishmentService.java b/src/main/java/com/loki/lochat/api/service/PunishmentService.java index ced09b1..6035c28 100644 --- a/src/main/java/com/loki/lochat/api/service/PunishmentService.java +++ b/src/main/java/com/loki/lochat/api/service/PunishmentService.java @@ -2,6 +2,7 @@ package com.loki.lochat.api.service; import com.loki.lochat.data.model.BanRecord; import com.loki.lochat.data.model.WarnEntry; + import net.kyori.adventure.text.Component; import java.util.List; diff --git a/src/main/java/com/loki/lochat/commands/CommandManager.java b/src/main/java/com/loki/lochat/commands/CommandManager.java index 0625aee..b322e51 100644 --- a/src/main/java/com/loki/lochat/commands/CommandManager.java +++ b/src/main/java/com/loki/lochat/commands/CommandManager.java @@ -1,9 +1,9 @@ package com.loki.lochat.commands; import com.loki.lochat.LoChat; +import com.loki.lochat.commands.admin.broadcast.*; import com.loki.lochat.commands.admin.chat.*; import com.loki.lochat.commands.admin.system.*; -import com.loki.lochat.commands.admin.broadcast.*; import com.loki.lochat.commands.chat.*; import com.loki.lochat.commands.messaging.*; import com.loki.lochat.commands.moderation.ban.*; @@ -11,6 +11,7 @@ import com.loki.lochat.commands.moderation.mute.*; import com.loki.lochat.commands.moderation.warn.*; import com.loki.lochat.commands.nick.*; import com.loki.lochat.commands.rp.*; + import org.bukkit.command.PluginCommand; import java.util.HashMap; @@ -94,7 +95,9 @@ public class CommandManager { PluginCommand cmd = plugin.getCommand(name); if (cmd != null) { cmd.setExecutor((org.bukkit.command.CommandExecutor) executor); - if (executor instanceof org.bukkit.command.TabCompleter tc) cmd.setTabCompleter(tc); + if (executor instanceof org.bukkit.command.TabCompleter tc) { + cmd.setTabCompleter(tc); + } } else { plugin.getLogger().warning("[LoChat] Команда '" + name + "' не найдена в plugin.yml!"); } diff --git a/src/main/java/com/loki/lochat/commands/CustomCommand.java b/src/main/java/com/loki/lochat/commands/CustomCommand.java index 0ca00b1..b1c2074 100644 --- a/src/main/java/com/loki/lochat/commands/CustomCommand.java +++ b/src/main/java/com/loki/lochat/commands/CustomCommand.java @@ -1,6 +1,7 @@ package com.loki.lochat.commands; import com.loki.lochat.managers.CustomCommandManager; + import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/com/loki/lochat/commands/CustomCommandsCommand.java b/src/main/java/com/loki/lochat/commands/CustomCommandsCommand.java index 6414b68..63ca74e 100644 --- a/src/main/java/com/loki/lochat/commands/CustomCommandsCommand.java +++ b/src/main/java/com/loki/lochat/commands/CustomCommandsCommand.java @@ -3,7 +3,9 @@ package com.loki.lochat.commands; import com.loki.lochat.LoChat; import com.loki.lochat.managers.CustomCommandManager; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/commands/admin/broadcast/AnnounceCommand.java b/src/main/java/com/loki/lochat/commands/admin/broadcast/AnnounceCommand.java index ddfea18..1d29c4c 100644 --- a/src/main/java/com/loki/lochat/commands/admin/broadcast/AnnounceCommand.java +++ b/src/main/java/com/loki/lochat/commands/admin/broadcast/AnnounceCommand.java @@ -2,8 +2,10 @@ package com.loki.lochat.commands.admin.broadcast; import com.loki.lochat.LoChat; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; import net.kyori.adventure.title.Title; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -38,8 +40,9 @@ public class AnnounceCommand implements CommandExecutor { for (Player player : Bukkit.getOnlinePlayers()) { player.sendMessage(formatted); - if (plugin.getConfigManager().isAnnouncementActionBarEnabled()) + if (plugin.getConfigManager().isAnnouncementActionBarEnabled()) { player.sendActionBar(formatted); + } if (plugin.getConfigManager().isAnnouncementTitleEnabled()) { player.showTitle(Title.title( ChatFormatter.parse(plugin.getConfigManager().getAnnouncementTitleHeader()), diff --git a/src/main/java/com/loki/lochat/commands/admin/broadcast/DiscordCommand.java b/src/main/java/com/loki/lochat/commands/admin/broadcast/DiscordCommand.java index 752f8ff..dcb5f23 100644 --- a/src/main/java/com/loki/lochat/commands/admin/broadcast/DiscordCommand.java +++ b/src/main/java/com/loki/lochat/commands/admin/broadcast/DiscordCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.commands.admin.broadcast; import com.loki.lochat.LoChat; import com.loki.lochat.integrations.DiscordIntegration; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -29,22 +30,34 @@ public class DiscordCommand implements CommandExecutor, TabCompleter { sender.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("errors.no-permission"))); return true; } - if (args.length == 0) { sendHelp(sender); return true; } + if (args.length == 0) { + sendHelp(sender); + return true; + } switch (args[0].toLowerCase()) { case "status" -> sender.sendMessage(ChatFormatter.parse(discord.isEnabled() ? "⚖C9Discord ẲE9включён" : "⚖C9Discord &#CF6679отключён")); case "reload" -> { - try { discord.reload(); sender.sendMessage(ChatFormatter.parse("⚖C9Discord ẲE9перезагружен")); } - catch (Exception e) { sender.sendMessage(ChatFormatter.parse("&#CF6679Ошибка: " + e.getMessage())); } + try { + discord.reload(); + sender.sendMessage(ChatFormatter.parse("⚖C9Discord ẲE9перезагружен")); + } catch (Exception e) { + sender.sendMessage(ChatFormatter.parse("&#CF6679Ошибка: " + e.getMessage())); + } } case "test" -> { - if (!discord.isEnabled()) { sender.sendMessage(ChatFormatter.parse("&#CF6679Discord отключён")); return true; } + if (!discord.isEnabled()) { + sender.sendMessage(ChatFormatter.parse("&#CF6679Discord отключён")); + return true; + } String msg = args.length > 1 ? String.join(" ", Arrays.copyOfRange(args, 1, args.length)) : "Тест от " + sender.getName(); sender.sendMessage(ChatFormatter.parse("&#B798A8Отправка...")); java.util.concurrent.CompletableFuture.runAsync(() -> { discord.sendTestMessage(msg, sender.getName()); - if (sender instanceof org.bukkit.entity.Player p) + if (sender instanceof org.bukkit.entity.Player p) { p.getScheduler().run(plugin, t -> sender.sendMessage(ChatFormatter.parse("⚖C9Отправлено ẲE9✓")), null); - else sender.sendMessage(ChatFormatter.parse("⚖C9Отправлено ẲE9✓")); + } else { + sender.sendMessage(ChatFormatter.parse("⚖C9Отправлено ẲE9✓")); + } }); } default -> sendHelp(sender); @@ -58,8 +71,12 @@ public class DiscordCommand implements CommandExecutor, TabCompleter { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (!sender.hasPermission("lochat.discord.admin")) return null; - if (args.length == 1) return List.of("status", "reload", "test"); + if (!sender.hasPermission("lochat.discord.admin")) { + return null; + } + if (args.length == 1) { + return List.of("status", "reload", "test"); + } return null; } } diff --git a/src/main/java/com/loki/lochat/commands/admin/chat/ChatSpyCommand.java b/src/main/java/com/loki/lochat/commands/admin/chat/ChatSpyCommand.java index 7f12b66..4416656 100644 --- a/src/main/java/com/loki/lochat/commands/admin/chat/ChatSpyCommand.java +++ b/src/main/java/com/loki/lochat/commands/admin/chat/ChatSpyCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.commands.admin.chat; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MessagingService; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/commands/admin/chat/ClearChatCommand.java b/src/main/java/com/loki/lochat/commands/admin/chat/ClearChatCommand.java index 0763832..062c9e6 100644 --- a/src/main/java/com/loki/lochat/commands/admin/chat/ClearChatCommand.java +++ b/src/main/java/com/loki/lochat/commands/admin/chat/ClearChatCommand.java @@ -2,6 +2,7 @@ package com.loki.lochat.commands.admin.chat; import com.loki.lochat.LoChat; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -21,7 +22,9 @@ public class ClearChatCommand implements CommandExecutor { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { int lines = plugin.getConfigManager().getAppearanceConfig().getClearLines(); for (Player player : Bukkit.getOnlinePlayers()) { - for (int i = 0; i < lines; i++) player.sendMessage(""); + for (int i = 0; i < lines; i++) { + player.sendMessage(""); + } if (plugin.getConfigManager().isClearChatMessageEnabled()) { player.sendMessage(ChatFormatter.parse( plugin.getConfigManager().getClearChatMessage().replace("{player}", sender.getName()))); diff --git a/src/main/java/com/loki/lochat/commands/admin/chat/ClearChatConfigCommand.java b/src/main/java/com/loki/lochat/commands/admin/chat/ClearChatConfigCommand.java index 351f599..ff83fb2 100644 --- a/src/main/java/com/loki/lochat/commands/admin/chat/ClearChatConfigCommand.java +++ b/src/main/java/com/loki/lochat/commands/admin/chat/ClearChatConfigCommand.java @@ -2,6 +2,7 @@ package com.loki.lochat.commands.admin.chat; import com.loki.lochat.LoChat; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -31,10 +32,19 @@ public class ClearChatConfigCommand implements CommandExecutor, TabCompleter { return true; } switch (args[0].toLowerCase()) { - case "enable" -> { plugin.getConfigManager().setClearChatMessageEnabled(true); sender.sendMessage(ChatFormatter.parse("⚖C9Сообщение очистки ẲE9включено")); } - case "disable" -> { plugin.getConfigManager().setClearChatMessageEnabled(false); sender.sendMessage(ChatFormatter.parse("⚖C9Сообщение очистки &#B798A8отключено")); } + case "enable" -> { + plugin.getConfigManager().setClearChatMessageEnabled(true); + sender.sendMessage(ChatFormatter.parse("⚖C9Сообщение очистки ẲE9включено")); + } + case "disable" -> { + plugin.getConfigManager().setClearChatMessageEnabled(false); + sender.sendMessage(ChatFormatter.parse("⚖C9Сообщение очистки &#B798A8отключено")); + } case "message" -> { - if (args.length < 2) { sender.sendMessage(ChatFormatter.parse("&#CF6679Укажите текст!")); return true; } + if (args.length < 2) { + sender.sendMessage(ChatFormatter.parse("&#CF6679Укажите текст!")); + return true; + } String msg = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); plugin.getConfigManager().setClearChatMessage(msg); sender.sendMessage(ChatFormatter.parse("⚖C9Сообщение установлено: &f" + msg)); @@ -50,8 +60,10 @@ public class ClearChatConfigCommand implements CommandExecutor, TabCompleter { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (args.length == 1) return List.of("enable", "disable", "message", "status").stream() - .filter(s -> s.startsWith(args[0].toLowerCase())).toList(); + if (args.length == 1) { + return List.of("enable", "disable", "message", "status").stream() + .filter(s -> s.startsWith(args[0].toLowerCase())).toList(); + } return null; } } diff --git a/src/main/java/com/loki/lochat/commands/admin/system/HubCommand.java b/src/main/java/com/loki/lochat/commands/admin/system/HubCommand.java index 9774994..382a3fb 100644 --- a/src/main/java/com/loki/lochat/commands/admin/system/HubCommand.java +++ b/src/main/java/com/loki/lochat/commands/admin/system/HubCommand.java @@ -4,6 +4,7 @@ import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import com.loki.lochat.LoChat; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/commands/admin/system/LoChatCommand.java b/src/main/java/com/loki/lochat/commands/admin/system/LoChatCommand.java index ca5002f..e697fb6 100644 --- a/src/main/java/com/loki/lochat/commands/admin/system/LoChatCommand.java +++ b/src/main/java/com/loki/lochat/commands/admin/system/LoChatCommand.java @@ -2,6 +2,7 @@ package com.loki.lochat.commands.admin.system; import com.loki.lochat.LoChat; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -54,9 +55,15 @@ public class LoChatCommand implements CommandExecutor, TabCompleter { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (!sender.hasPermission("lochat.admin")) return new ArrayList<>(); - if (args.length == 1) return List.of("reload", "commands").stream().filter(s -> s.startsWith(args[0].toLowerCase())).toList(); - if (args.length == 2 && args[0].equalsIgnoreCase("commands")) return List.of("reload"); + if (!sender.hasPermission("lochat.admin")) { + return new ArrayList<>(); + } + if (args.length == 1) { + return List.of("reload", "commands").stream().filter(s -> s.startsWith(args[0].toLowerCase())).toList(); + } + if (args.length == 2 && args[0].equalsIgnoreCase("commands")) { + return List.of("reload"); + } return new ArrayList<>(); } } diff --git a/src/main/java/com/loki/lochat/commands/admin/system/ReloadConfigCommand.java b/src/main/java/com/loki/lochat/commands/admin/system/ReloadConfigCommand.java index c935a18..2ed603f 100644 --- a/src/main/java/com/loki/lochat/commands/admin/system/ReloadConfigCommand.java +++ b/src/main/java/com/loki/lochat/commands/admin/system/ReloadConfigCommand.java @@ -2,6 +2,7 @@ package com.loki.lochat.commands.admin.system; import com.loki.lochat.LoChat; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/commands/base/AdminCommand.java b/src/main/java/com/loki/lochat/commands/base/AdminCommand.java index 079606f..5bce7fa 100644 --- a/src/main/java/com/loki/lochat/commands/base/AdminCommand.java +++ b/src/main/java/com/loki/lochat/commands/base/AdminCommand.java @@ -1,6 +1,7 @@ package com.loki.lochat.commands.base; import com.loki.lochat.LoChat; + import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/loki/lochat/commands/base/BaseCommand.java b/src/main/java/com/loki/lochat/commands/base/BaseCommand.java index c3be604..53081e4 100644 --- a/src/main/java/com/loki/lochat/commands/base/BaseCommand.java +++ b/src/main/java/com/loki/lochat/commands/base/BaseCommand.java @@ -1,6 +1,7 @@ package com.loki.lochat.commands.base; import com.loki.lochat.LoChat; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/commands/base/PlayerCommand.java b/src/main/java/com/loki/lochat/commands/base/PlayerCommand.java index 9ed74da..690cf97 100644 --- a/src/main/java/com/loki/lochat/commands/base/PlayerCommand.java +++ b/src/main/java/com/loki/lochat/commands/base/PlayerCommand.java @@ -1,6 +1,7 @@ package com.loki.lochat.commands.base; import com.loki.lochat.LoChat; + import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/com/loki/lochat/commands/chat/GlobalChatCommand.java b/src/main/java/com/loki/lochat/commands/chat/GlobalChatCommand.java index 471c5ed..b4be2e2 100644 --- a/src/main/java/com/loki/lochat/commands/chat/GlobalChatCommand.java +++ b/src/main/java/com/loki/lochat/commands/chat/GlobalChatCommand.java @@ -3,7 +3,9 @@ package com.loki.lochat.commands.chat; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.ChatService; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.minimessage.MiniMessage; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/commands/chat/LocalChatCommand.java b/src/main/java/com/loki/lochat/commands/chat/LocalChatCommand.java index 5fa8691..fc8cf4e 100644 --- a/src/main/java/com/loki/lochat/commands/chat/LocalChatCommand.java +++ b/src/main/java/com/loki/lochat/commands/chat/LocalChatCommand.java @@ -3,7 +3,9 @@ package com.loki.lochat.commands.chat; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.ChatService; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.minimessage.MiniMessage; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/commands/messaging/IgnoreCommand.java b/src/main/java/com/loki/lochat/commands/messaging/IgnoreCommand.java index aefc3f3..383ec9c 100644 --- a/src/main/java/com/loki/lochat/commands/messaging/IgnoreCommand.java +++ b/src/main/java/com/loki/lochat/commands/messaging/IgnoreCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.commands.messaging; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MessagingService; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -22,13 +23,28 @@ public class IgnoreCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!(sender instanceof Player player)) { sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); return true; } - if (args.length == 0) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/ignore <ник>"))); return true; } + if (!(sender instanceof Player player)) { + sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); + return true; + } + if (args.length == 0) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/ignore <ник>"))); + return true; + } Player target = Bukkit.getPlayer(args[0]); - if (target == null) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getPlayerNotFound())); return true; } - if (target.equals(player)) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.self"))); return true; } - if (messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.already-ignored"))); return true; } + if (target == null) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getPlayerNotFound())); + return true; + } + if (target.equals(player)) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.self"))); + return true; + } + if (messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.already-ignored"))); + return true; + } messagingService.addIgnore(player.getUniqueId(), target.getUniqueId()); player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.added", "{player}", target.getName()))); diff --git a/src/main/java/com/loki/lochat/commands/messaging/IgnoreListCommand.java b/src/main/java/com/loki/lochat/commands/messaging/IgnoreListCommand.java index 12263eb..51bf317 100644 --- a/src/main/java/com/loki/lochat/commands/messaging/IgnoreListCommand.java +++ b/src/main/java/com/loki/lochat/commands/messaging/IgnoreListCommand.java @@ -4,6 +4,7 @@ import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MessagingService; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -25,15 +26,23 @@ public class IgnoreListCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!(sender instanceof Player player)) { sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); return true; } + if (!(sender instanceof Player player)) { + sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); + return true; + } Set ignored = messagingService.getIgnoredPlayers(player.getUniqueId()); - if (ignored.isEmpty()) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-empty"))); return true; } + if (ignored.isEmpty()) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-empty"))); + return true; + } player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-header"))); for (UUID uuid : ignored) { String name = PlayerUtil.getPlayerName(uuid); - if (name != null) player.sendMessage(ChatFormatter.parse("⚖C9◆ &f" + name)); + if (name != null) { + player.sendMessage(ChatFormatter.parse("⚖C9◆ &f" + name)); + } } player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-footer").replace("{count}", String.valueOf(ignored.size())))); return true; diff --git a/src/main/java/com/loki/lochat/commands/messaging/MsgCommand.java b/src/main/java/com/loki/lochat/commands/messaging/MsgCommand.java index a1222aa..842b7a8 100644 --- a/src/main/java/com/loki/lochat/commands/messaging/MsgCommand.java +++ b/src/main/java/com/loki/lochat/commands/messaging/MsgCommand.java @@ -4,6 +4,7 @@ import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MessagingService; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.command.Command; @@ -28,17 +29,31 @@ public class MsgCommand implements CommandExecutor { sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); return true; } - if (!plugin.getConfigManager().isPmEnabled()) return true; + if (!plugin.getConfigManager().isPmEnabled()) { + return true; + } if (args.length < 2) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/msg <ник> <сообщение>"))); return true; } Player target = Bukkit.getPlayer(args[0]); - if (target == null) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.player-offline"))); return true; } - if (target.equals(player)) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.self"))); return true; } - if (messagingService.isIgnoring(target.getUniqueId(), player.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); return true; } - if (messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); return true; } + if (target == null) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.player-offline"))); + return true; + } + if (target.equals(player)) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.self"))); + return true; + } + if (messagingService.isIgnoring(target.getUniqueId(), player.getUniqueId())) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); + return true; + } + if (messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); + return true; + } String message = String.join(" ", java.util.Arrays.copyOfRange(args, 1, args.length)); sendPm(player, target, message); @@ -50,12 +65,15 @@ public class MsgCommand implements CommandExecutor { target.sendMessage(ChatFormatter.formatPmReceivedNew(plugin.getMessageConfig().getPmFormatReceived(), sender, target, message)); if (plugin.getConfigManager().isPmSoundEnabled()) { Sound sound = PlayerUtil.parseSound(plugin.getConfigManager().getPmSoundType(), null); - if (sound != null) target.playSound(target.getLocation(), sound, 1.0f, 1.0f); + if (sound != null) { + target.playSound(target.getLocation(), sound, 1.0f, 1.0f); + } } messagingService.broadcastPM(sender, target, message); messagingService.setLastConversation(sender.getUniqueId(), target.getUniqueId()); messagingService.setLastConversation(target.getUniqueId(), sender.getUniqueId()); - if (plugin.getConfigManager().isPmLogEnabled()) + if (plugin.getConfigManager().isPmLogEnabled()) { plugin.getLogger().info("[PM] " + sender.getName() + " -> " + target.getName() + ": " + message); + } } } diff --git a/src/main/java/com/loki/lochat/commands/messaging/ReplyCommand.java b/src/main/java/com/loki/lochat/commands/messaging/ReplyCommand.java index 1664652..6155ecd 100644 --- a/src/main/java/com/loki/lochat/commands/messaging/ReplyCommand.java +++ b/src/main/java/com/loki/lochat/commands/messaging/ReplyCommand.java @@ -4,6 +4,7 @@ import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MessagingService; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.command.Command; @@ -31,30 +32,44 @@ public class ReplyCommand implements CommandExecutor { sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); return true; } - if (!plugin.getConfigManager().isPmEnabled()) return true; + if (!plugin.getConfigManager().isPmEnabled()) { + return true; + } if (args.length == 0) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/reply <сообщение>"))); return true; } Optional lastUuid = messagingService.getLastConversation(player.getUniqueId()); - if (lastUuid.isEmpty()) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.no-reply"))); return true; } + if (lastUuid.isEmpty()) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.no-reply"))); + return true; + } Player target = Bukkit.getPlayer(lastUuid.get()); - if (target == null) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.player-offline"))); return true; } - if (messagingService.isIgnoring(target.getUniqueId(), player.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); return true; } + if (target == null) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.player-offline"))); + return true; + } + if (messagingService.isIgnoring(target.getUniqueId(), player.getUniqueId())) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); + return true; + } String message = String.join(" ", args); player.sendMessage(ChatFormatter.formatPmSentNew(plugin.getMessageConfig().getPmFormatSent(), player, target, message)); target.sendMessage(ChatFormatter.formatPmReceivedNew(plugin.getMessageConfig().getPmFormatReceived(), player, target, message)); if (plugin.getConfigManager().isPmSoundEnabled()) { Sound sound = PlayerUtil.parseSound(plugin.getConfigManager().getPmSoundType(), null); - if (sound != null) target.playSound(target.getLocation(), sound, 1.0f, 1.0f); + if (sound != null) { + target.playSound(target.getLocation(), sound, 1.0f, 1.0f); + } } messagingService.broadcastPM(player, target, message); messagingService.setLastConversation(target.getUniqueId(), player.getUniqueId()); - if (plugin.getConfigManager().isPmLogEnabled()) + if (plugin.getConfigManager().isPmLogEnabled()) { plugin.getLogger().info("[PM] " + player.getName() + " -> " + target.getName() + ": " + message); + } return true; } } diff --git a/src/main/java/com/loki/lochat/commands/messaging/UnignoreCommand.java b/src/main/java/com/loki/lochat/commands/messaging/UnignoreCommand.java index 6ee5b96..0c2a20d 100644 --- a/src/main/java/com/loki/lochat/commands/messaging/UnignoreCommand.java +++ b/src/main/java/com/loki/lochat/commands/messaging/UnignoreCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.commands.messaging; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MessagingService; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -22,12 +23,24 @@ public class UnignoreCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!(sender instanceof Player player)) { sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); return true; } - if (args.length == 0) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/unignore <ник>"))); return true; } + if (!(sender instanceof Player player)) { + sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); + return true; + } + if (args.length == 0) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/unignore <ник>"))); + return true; + } Player target = Bukkit.getPlayer(args[0]); - if (target == null) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getPlayerNotFound())); return true; } - if (!messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.not-ignored"))); return true; } + if (target == null) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getPlayerNotFound())); + return true; + } + if (!messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { + player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.not-ignored"))); + return true; + } messagingService.removeIgnore(player.getUniqueId(), target.getUniqueId()); player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.removed", "{player}", target.getName()))); diff --git a/src/main/java/com/loki/lochat/commands/moderation/ban/BanCommand.java b/src/main/java/com/loki/lochat/commands/moderation/ban/BanCommand.java index 86b4338..249766d 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/ban/BanCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/ban/BanCommand.java @@ -7,6 +7,7 @@ import com.loki.lochat.config.MessagesConfig; import com.loki.lochat.data.model.BanRecord; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -78,7 +79,9 @@ public class BanCommand implements CommandExecutor, TabCompleter { if (timeStr == null && isTimeFormat(args[i])) { timeStr = args[i]; } else { - if (reasonBuilder.length() > 0) reasonBuilder.append(" "); + if (reasonBuilder.length() > 0) { + reasonBuilder.append(" "); + } reasonBuilder.append(args[i]); } } @@ -98,7 +101,9 @@ public class BanCommand implements CommandExecutor, TabCompleter { String reason = reasonBuilder.length() > 0 ? reasonBuilder.toString() : msg.getModerationDefaultReason(); String finalName = PlayerUtil.getPlayerName(targetUuid); - if (finalName == null) finalName = targetName; + if (finalName == null) { + finalName = targetName; + } punishmentService.ban(targetUuid, finalName, durationMs, reason, sender.getName()); @@ -126,8 +131,11 @@ public class BanCommand implements CommandExecutor, TabCompleter { @NotNull String alias, @NotNull String[] args) { List c = new ArrayList<>(); if (args.length == 1) { - for (Player p : Bukkit.getOnlinePlayers()) - if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName()); + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) { + c.add(p.getName()); + } + } } else if (args.length == 2) { c.addAll(List.of("1h", "1d", "7d", "30d", "perm")); } diff --git a/src/main/java/com/loki/lochat/commands/moderation/ban/UnbanCommand.java b/src/main/java/com/loki/lochat/commands/moderation/ban/UnbanCommand.java index 4d4d672..3c75a6e 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/ban/UnbanCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/ban/UnbanCommand.java @@ -5,6 +5,7 @@ import com.loki.lochat.api.service.PunishmentService; import com.loki.lochat.config.MessagesConfig; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -56,7 +57,9 @@ public class UnbanCommand implements CommandExecutor, TabCompleter { } String name = PlayerUtil.getPlayerName(uuid); - if (name == null) name = args[0]; + if (name == null) { + name = args[0]; + } punishmentService.unban(uuid); sender.sendMessage(ChatFormatter.parse(msg.getUnbanConfirm().replace("{player}", name))); @@ -70,7 +73,9 @@ public class UnbanCommand implements CommandExecutor, TabCompleter { if (args.length == 1) { String p = args[0].toLowerCase(); for (Player pl : Bukkit.getOnlinePlayers()) { - if (pl.getName().toLowerCase().startsWith(p)) out.add(pl.getName()); + if (pl.getName().toLowerCase().startsWith(p)) { + out.add(pl.getName()); + } } } return out; diff --git a/src/main/java/com/loki/lochat/commands/moderation/mute/MuteBlameCommand.java b/src/main/java/com/loki/lochat/commands/moderation/mute/MuteBlameCommand.java index 7951555..90c9ef2 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/mute/MuteBlameCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/mute/MuteBlameCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.commands.moderation.mute; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MuteService; import com.loki.lochat.data.model.MuteData; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -30,16 +31,28 @@ public class MuteBlameCommand implements CommandExecutor, TabCompleter { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!sender.hasPermission("lochat.muteblame")) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); return true; } - if (args.length < 1) { sender.sendMessage("&#CF6679Использование: /lmuteblame <модератор>"); return true; } + if (!sender.hasPermission("lochat.muteblame")) { + sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); + return true; + } + if (args.length < 1) { + sender.sendMessage("&#CF6679Использование: /lmuteblame <модератор>"); + return true; + } List mutes = muteService.getMutesByOperator(args[0]); - if (mutes.isEmpty()) { sender.sendMessage("⚖C9Модератор ẲE9" + args[0] + " ⚖C9не выдавал мутов"); return true; } + if (mutes.isEmpty()) { + sender.sendMessage("⚖C9Модератор ẲE9" + args[0] + " ⚖C9не выдавал мутов"); + return true; + } sender.sendMessage("ẲE9▬▬▬▬▬ &#B798A8Муты от ⚖C9" + args[0] + " ⚖C9(" + mutes.size() + "⚖C9) ẲE9▬▬▬▬▬"); int idx = 1; for (MuteData.MuteHistoryEntry e : mutes) { - if (idx > 15) { sender.sendMessage("&#B798A8...и ещё " + (mutes.size() - 15) + " записей"); break; } + if (idx > 15) { + sender.sendMessage("&#B798A8...и ещё " + (mutes.size() - 15) + " записей"); + break; + } String status = e.unmuted ? "⚖C9Размучен" : (e.duration == 0 ? "&#CF6679Активен (навсегда)" : System.currentTimeMillis() > e.mutedAt + e.duration ? "&#B798A8Истёк" : "&#CF6679Активен"); sender.sendMessage("⚖C9" + idx + ". &f" + (e.playerName != null ? e.playerName : "???") + " &#B798A8— " + status); @@ -53,7 +66,13 @@ public class MuteBlameCommand implements CommandExecutor, TabCompleter { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { List c = new ArrayList<>(); - if (args.length == 1) for (Player p : Bukkit.getOnlinePlayers()) if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName()); + if (args.length == 1) { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) { + c.add(p.getName()); + } + } + } return c; } } diff --git a/src/main/java/com/loki/lochat/commands/moderation/mute/MuteCommand.java b/src/main/java/com/loki/lochat/commands/moderation/mute/MuteCommand.java index 1dbeac6..cdc1145 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/mute/MuteCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/mute/MuteCommand.java @@ -4,6 +4,7 @@ import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MuteService; import com.loki.lochat.config.MessagesConfig; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -62,7 +63,9 @@ public class MuteCommand implements CommandExecutor, TabCompleter { } else if (timeStr == null && isTimeFormat(arg)) { timeStr = arg; } else { - if (reasonBuilder.length() > 0) reasonBuilder.append(" "); + if (reasonBuilder.length() > 0) { + reasonBuilder.append(" "); + } reasonBuilder.append(arg); } } @@ -78,12 +81,17 @@ public class MuteCommand implements CommandExecutor, TabCompleter { long duration; if (timeStr == null || timeStr.isEmpty()) { duration = sender instanceof Player p ? muteService.getMaxDuration(p) : 0; - if (duration == -1) duration = muteService.parseTime(hm.getDefaultMuteDuration()); + if (duration == -1) { + duration = muteService.parseTime(hm.getDefaultMuteDuration()); + } } else if (timeStr.equalsIgnoreCase("perm") || timeStr.equals("0")) { duration = 0; } else { duration = muteService.parseTime(timeStr); - if (duration < 0) { sender.sendMessage(ChatFormatter.parse(hm.getMuteTimeHelp())); return true; } + if (duration < 0) { + sender.sendMessage(ChatFormatter.parse(hm.getMuteTimeHelp())); + return true; + } } if (sender instanceof Player p && !muteService.canMuteForDuration(p, duration)) { @@ -94,8 +102,14 @@ public class MuteCommand implements CommandExecutor, TabCompleter { } UUID targetUUID = com.loki.lochat.utils.player.PlayerUtil.findPlayerUUID(targetName); - if (targetUUID == null) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); return true; } - if (muteService.isMuted(targetUUID)) { sender.sendMessage(ChatFormatter.parse("&#CF6679Игрок уже замучен!")); return true; } + if (targetUUID == null) { + sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); + return true; + } + if (muteService.isMuted(targetUUID)) { + sender.sendMessage(ChatFormatter.parse("&#CF6679Игрок уже замучен!")); + return true; + } Player target = Bukkit.getPlayer(targetUUID); String finalName = com.loki.lochat.utils.player.PlayerUtil.getPlayerName(targetUUID); @@ -116,7 +130,11 @@ public class MuteCommand implements CommandExecutor, TabCompleter { if (silent) { String msgText = hm.getPlayerMutedSilent().replace("{player}", finalName).replace("{time}", timeDisplay); - for (Player p : Bukkit.getOnlinePlayers()) if (p.hasPermission("lochat.mute.see-silent")) p.sendMessage(ChatFormatter.parse(msgText)); + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.hasPermission("lochat.mute.see-silent")) { + p.sendMessage(ChatFormatter.parse(msgText)); + } + } } else { String broadcastMsg = (duration == 0 ? hm.getPlayerMutedPermanent() : hm.getPlayerMuted()) .replace("{player}", finalName).replace("{time}", timeDisplay).replace("{reason}", reason); @@ -141,8 +159,11 @@ public class MuteCommand implements CommandExecutor, TabCompleter { @NotNull String alias, @NotNull String[] args) { List c = new ArrayList<>(); if (args.length == 1) { - for (Player p : Bukkit.getOnlinePlayers()) - if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName()); + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) { + c.add(p.getName()); + } + } } else if (args.length == 2) { c.addAll(List.of("10m", "30m", "1h", "6h", "12h", "1d", "7d", "30d", "perm", "-s")); } else if (args.length == 3) { diff --git a/src/main/java/com/loki/lochat/commands/moderation/mute/MuteHistoryCommand.java b/src/main/java/com/loki/lochat/commands/moderation/mute/MuteHistoryCommand.java index 8cf30ef..967090e 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/mute/MuteHistoryCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/mute/MuteHistoryCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.commands.moderation.mute; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MuteService; import com.loki.lochat.data.model.MuteData; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -31,15 +32,29 @@ public class MuteHistoryCommand implements CommandExecutor, TabCompleter { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!sender.hasPermission("lochat.mutehistory")) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); return true; } - if (args.length < 1) { sender.sendMessage("&#CF6679Использование: /lmutehistory <ник>"); return true; } + if (!sender.hasPermission("lochat.mutehistory")) { + sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); + return true; + } + if (args.length < 1) { + sender.sendMessage("&#CF6679Использование: /lmutehistory <ник>"); + return true; + } UUID uuid = com.loki.lochat.utils.player.PlayerUtil.findPlayerUUID(args[0]); - if (uuid == null) uuid = muteService.getUUIDByName(args[0]); - if (uuid == null) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); return true; } + if (uuid == null) { + uuid = muteService.getUUIDByName(args[0]); + } + if (uuid == null) { + sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); + return true; + } List history = muteService.getPlayerHistory(uuid); - if (history.isEmpty()) { sender.sendMessage("⚖C9У ẲE9" + args[0] + " ⚖C9нет истории мутов"); return true; } + if (history.isEmpty()) { + sender.sendMessage("⚖C9У ẲE9" + args[0] + " ⚖C9нет истории мутов"); + return true; + } sender.sendMessage("ẲE9▬▬▬▬▬ &#B798A8История мутов ⚖C9" + args[0] + " ⚖C9(" + history.size() + "⚖C9) ẲE9▬▬▬▬▬"); int idx = 1; @@ -50,17 +65,26 @@ public class MuteHistoryCommand implements CommandExecutor, TabCompleter { sender.sendMessage("⚖C9" + idx + ". &f" + fmt.format(new Date(e.mutedAt)) + " &#B798A8— " + status); sender.sendMessage(" &#B798A8Длительность: &f" + (e.duration == 0 ? "навсегда" : muteService.formatTime(e.duration))); sender.sendMessage(" &#B798A8Причина: &f" + (e.reason != null ? e.reason : "—") + " &#B798A8Выдал: ẲE9" + e.mutedBy); - if (e.unmuted && e.unmutedBy != null) + if (e.unmuted && e.unmutedBy != null) { sender.sendMessage(" &#B798A8Размутил: ẲE9" + e.unmutedBy + " &f(" + fmt.format(new Date(e.unmutedAt)) + ")"); + } + } + if (history.size() > 10) { + sender.sendMessage("&#B798A8...и ещё " + (history.size() - 10) + " записей"); } - if (history.size() > 10) sender.sendMessage("&#B798A8...и ещё " + (history.size() - 10) + " записей"); return true; } @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { List c = new ArrayList<>(); - if (args.length == 1) for (Player p : Bukkit.getOnlinePlayers()) if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName()); + if (args.length == 1) { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) { + c.add(p.getName()); + } + } + } return c; } } diff --git a/src/main/java/com/loki/lochat/commands/moderation/mute/MuteListCommand.java b/src/main/java/com/loki/lochat/commands/moderation/mute/MuteListCommand.java index f93c0e0..341f62e 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/mute/MuteListCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/mute/MuteListCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.commands.moderation.mute; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MuteService; import com.loki.lochat.data.model.MuteData; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -27,10 +28,16 @@ public class MuteListCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!sender.hasPermission("lochat.mutelist")) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); return true; } + if (!sender.hasPermission("lochat.mutelist")) { + sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); + return true; + } Map mutes = muteService.getActiveMutes(); - if (mutes.isEmpty()) { sender.sendMessage("⚖C9Нет активных мутов"); return true; } + if (mutes.isEmpty()) { + sender.sendMessage("⚖C9Нет активных мутов"); + return true; + } sender.sendMessage("ẲE9▬▬▬▬▬ &#B798A8Активные муты ⚖C9(" + mutes.size() + "⚖C9) ẲE9▬▬▬▬▬"); int i = 1; diff --git a/src/main/java/com/loki/lochat/commands/moderation/mute/UnmuteCommand.java b/src/main/java/com/loki/lochat/commands/moderation/mute/UnmuteCommand.java index 9970859..361dbb4 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/mute/UnmuteCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/mute/UnmuteCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.commands.moderation.mute; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MuteService; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -28,14 +29,23 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!sender.hasPermission("lochat.unmute")) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); return true; } - if (args.length < 1) { sender.sendMessage(ChatFormatter.parse("&#CF6679Использование: /unmute <ник> [-s]")); return true; } + if (!sender.hasPermission("lochat.unmute")) { + sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); + return true; + } + if (args.length < 1) { + sender.sendMessage(ChatFormatter.parse("&#CF6679Использование: /unmute <ник> [-s]")); + return true; + } String targetName = null; boolean silent = false; for (String a : args) { - if (a.equalsIgnoreCase("-s")) silent = true; - else if (targetName == null) targetName = a; + if (a.equalsIgnoreCase("-s")) { + silent = true; + } else if (targetName == null) { + targetName = a; + } } if (silent && !sender.hasPermission("lochat.mute.silent")) { sender.sendMessage(ChatFormatter.parse(plugin.getConfigManager().getMessagesConfig().getNoSilentUnmutePermission())); @@ -43,7 +53,10 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter { } UUID uuid = com.loki.lochat.utils.player.PlayerUtil.findPlayerUUID(targetName); - if (uuid == null) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); return true; } + if (uuid == null) { + sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); + return true; + } String name = com.loki.lochat.utils.player.PlayerUtil.getPlayerName(uuid); Player target = Bukkit.getPlayer(uuid); @@ -51,10 +64,16 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter { if (muteService.unmute(uuid, op)) { sender.sendMessage(ChatFormatter.parse("⚖C9Игрок ẲE9" + name + " ⚖C9размучен")); - if (target != null) target.sendMessage(ChatFormatter.parse("⚖C9Вы были ẲE9размучены!")); + if (target != null) { + target.sendMessage(ChatFormatter.parse("⚖C9Вы были ẲE9размучены!")); + } if (silent) { String msg = "&#B798A8[⚖C9ТИХО&#B798A8] ẲE9" + name + " &#B798A8размучен ⚖C9(" + op + ")"; - for (Player p : Bukkit.getOnlinePlayers()) if (p.hasPermission("lochat.mute.see-silent")) p.sendMessage(ChatFormatter.parse(msg)); + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.hasPermission("lochat.mute.see-silent")) { + p.sendMessage(ChatFormatter.parse(msg)); + } + } } else { Bukkit.broadcast(ChatFormatter.parse("⚖C9Игрок ẲE9" + name + " ⚖C9размучен модератором ẲE9" + op)); } @@ -67,8 +86,15 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { List c = new ArrayList<>(); - if (args.length == 1) for (Player p : Bukkit.getOnlinePlayers()) if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName()); - else if (args.length == 2) c.add("-s"); + if (args.length == 1) { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) { + c.add(p.getName()); + } + } + } else if (args.length == 2) { + c.add("-s"); + } return c; } } diff --git a/src/main/java/com/loki/lochat/commands/moderation/warn/SilentWarnCommand.java b/src/main/java/com/loki/lochat/commands/moderation/warn/SilentWarnCommand.java index 594d8c9..617dbad 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/warn/SilentWarnCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/warn/SilentWarnCommand.java @@ -5,6 +5,7 @@ import com.loki.lochat.api.service.PunishmentService; import com.loki.lochat.config.MessagesConfig; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -55,7 +56,9 @@ public class SilentWarnCommand implements CommandExecutor, TabCompleter { ? String.join(" ", java.util.Arrays.copyOfRange(args, 1, args.length)) : msg.getModerationDefaultReason(); String name = PlayerUtil.getPlayerName(targetUuid); - if (name == null) name = args[0]; + if (name == null) { + name = args[0]; + } punishmentService.addWarn(targetUuid, name, mod, reason, true); @@ -77,7 +80,9 @@ public class SilentWarnCommand implements CommandExecutor, TabCompleter { if (args.length == 1) { String p = args[0].toLowerCase(); for (Player pl : Bukkit.getOnlinePlayers()) { - if (pl.getName().toLowerCase().startsWith(p)) out.add(pl.getName()); + if (pl.getName().toLowerCase().startsWith(p)) { + out.add(pl.getName()); + } } } return out; diff --git a/src/main/java/com/loki/lochat/commands/moderation/warn/WarnCommand.java b/src/main/java/com/loki/lochat/commands/moderation/warn/WarnCommand.java index ed267d5..a414758 100644 --- a/src/main/java/com/loki/lochat/commands/moderation/warn/WarnCommand.java +++ b/src/main/java/com/loki/lochat/commands/moderation/warn/WarnCommand.java @@ -5,6 +5,7 @@ import com.loki.lochat.api.service.PunishmentService; import com.loki.lochat.config.MessagesConfig; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -58,7 +59,9 @@ public class WarnCommand implements CommandExecutor, TabCompleter { String mod = sender.getName(); String reason = buildReason(msg, args, 1); String name = PlayerUtil.getPlayerName(targetUuid); - if (name == null) name = args[0]; + if (name == null) { + name = args[0]; + } Player targetOnline = Bukkit.getPlayer(targetUuid); if (targetOnline != null && targetOnline.hasPermission("lochat.bypass.warn")) { @@ -82,7 +85,9 @@ public class WarnCommand implements CommandExecutor, TabCompleter { } StringBuilder sb = new StringBuilder(); for (int i = from; i < args.length; i++) { - if (sb.length() > 0) sb.append(" "); + if (sb.length() > 0) { + sb.append(" "); + } sb.append(args[i]); } return sb.toString(); @@ -95,7 +100,9 @@ public class WarnCommand implements CommandExecutor, TabCompleter { if (args.length == 1) { String p = args[0].toLowerCase(); for (Player pl : Bukkit.getOnlinePlayers()) { - if (pl.getName().toLowerCase().startsWith(p)) out.add(pl.getName()); + if (pl.getName().toLowerCase().startsWith(p)) { + out.add(pl.getName()); + } } } return out; diff --git a/src/main/java/com/loki/lochat/commands/nick/NickCommand.java b/src/main/java/com/loki/lochat/commands/nick/NickCommand.java index 55dd417..f4e97f5 100644 --- a/src/main/java/com/loki/lochat/commands/nick/NickCommand.java +++ b/src/main/java/com/loki/lochat/commands/nick/NickCommand.java @@ -3,8 +3,10 @@ package com.loki.lochat.commands.nick; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.NickService; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -84,8 +86,12 @@ public class NickCommand implements CommandExecutor, TabCompleter { public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { List c = new ArrayList<>(); if (args.length == 1) { - if ("reset".startsWith(args[0].toLowerCase())) c.add("reset"); - if (sender instanceof Player p) nickService.getNickname(p.getUniqueId()).ifPresent(c::add); + if ("reset".startsWith(args[0].toLowerCase())) { + c.add("reset"); + } + if (sender instanceof Player p) { + nickService.getNickname(p.getUniqueId()).ifPresent(c::add); + } } return c; } diff --git a/src/main/java/com/loki/lochat/commands/nick/PlayerInfoCommand.java b/src/main/java/com/loki/lochat/commands/nick/PlayerInfoCommand.java index d1ee197..86ddbab 100644 --- a/src/main/java/com/loki/lochat/commands/nick/PlayerInfoCommand.java +++ b/src/main/java/com/loki/lochat/commands/nick/PlayerInfoCommand.java @@ -8,6 +8,7 @@ import com.loki.lochat.data.model.MuteData; import com.loki.lochat.data.model.WarnEntry; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -55,7 +56,9 @@ public class PlayerInfoCommand implements CommandExecutor, TabCompleter { } String name = PlayerUtil.getPlayerName(uuid); - if (name == null) name = args[0]; + if (name == null) { + name = args[0]; + } Player target = Bukkit.getPlayer(uuid); @@ -129,7 +132,9 @@ public class PlayerInfoCommand implements CommandExecutor, TabCompleter { if (args.length == 1) { String p = args[0].toLowerCase(); for (Player pl : Bukkit.getOnlinePlayers()) { - if (pl.getName().toLowerCase().startsWith(p)) out.add(pl.getName()); + if (pl.getName().toLowerCase().startsWith(p)) { + out.add(pl.getName()); + } } } return out; diff --git a/src/main/java/com/loki/lochat/commands/rp/DoCommand.java b/src/main/java/com/loki/lochat/commands/rp/DoCommand.java index e9dee62..522a417 100644 --- a/src/main/java/com/loki/lochat/commands/rp/DoCommand.java +++ b/src/main/java/com/loki/lochat/commands/rp/DoCommand.java @@ -4,7 +4,9 @@ import com.loki.lochat.LoChat; import com.loki.lochat.api.service.PlayerService; import com.loki.lochat.commands.base.PlayerCommand; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; + import org.bukkit.command.Command; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -26,7 +28,9 @@ public class DoCommand extends PlayerCommand { @Override protected boolean executePlayerCommand(@NotNull Player player, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!requirePermission(player, "lochat.rp.do")) return true; + if (!requirePermission(player, "lochat.rp.do")) { + return true; + } int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.do", 0); if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_do", cooldown)) { @@ -54,7 +58,9 @@ public class DoCommand extends PlayerCommand { int radius = plugin.getConfigManager().getInt("rp.radius", 100); RpUtil.sendToRadius(player, message, radius); - if (cooldown > 0) playerService.setCooldown(player.getUniqueId(), "rp_do"); + if (cooldown > 0) { + playerService.setCooldown(player.getUniqueId(), "rp_do"); + } plugin.getLogger().info("[DO] " + player.getName() + ": " + description); return true; } diff --git a/src/main/java/com/loki/lochat/commands/rp/MeCommand.java b/src/main/java/com/loki/lochat/commands/rp/MeCommand.java index 32044c0..cf8fbe2 100644 --- a/src/main/java/com/loki/lochat/commands/rp/MeCommand.java +++ b/src/main/java/com/loki/lochat/commands/rp/MeCommand.java @@ -4,7 +4,9 @@ import com.loki.lochat.LoChat; import com.loki.lochat.api.service.PlayerService; import com.loki.lochat.commands.base.PlayerCommand; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; + import org.bukkit.command.Command; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -26,7 +28,9 @@ public class MeCommand extends PlayerCommand { @Override protected boolean executePlayerCommand(@NotNull Player player, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!requirePermission(player, "lochat.rp.me")) return true; + if (!requirePermission(player, "lochat.rp.me")) { + return true; + } int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.me", 0); if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_me", cooldown)) { @@ -54,7 +58,9 @@ public class MeCommand extends PlayerCommand { int radius = plugin.getConfigManager().getInt("rp.radius", 100); RpUtil.sendToRadius(player, message, radius); - if (cooldown > 0) playerService.setCooldown(player.getUniqueId(), "rp_me"); + if (cooldown > 0) { + playerService.setCooldown(player.getUniqueId(), "rp_me"); + } plugin.getLogger().info("[ME] " + player.getName() + ": " + action); return true; } diff --git a/src/main/java/com/loki/lochat/commands/rp/RollCommand.java b/src/main/java/com/loki/lochat/commands/rp/RollCommand.java index fae0701..d24157b 100644 --- a/src/main/java/com/loki/lochat/commands/rp/RollCommand.java +++ b/src/main/java/com/loki/lochat/commands/rp/RollCommand.java @@ -4,7 +4,9 @@ import com.loki.lochat.LoChat; import com.loki.lochat.commands.base.PlayerCommand; import com.loki.lochat.config.RatConfig; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; + import org.bukkit.command.Command; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -29,7 +31,9 @@ public class RollCommand extends PlayerCommand { @Override protected boolean executePlayerCommand(@NotNull Player player, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!requirePermission(player, "lochat.rp.roll")) return true; + if (!requirePermission(player, "lochat.rp.roll")) { + return true; + } int max = RatConfig.ROLL_DEFAULT_MAX; diff --git a/src/main/java/com/loki/lochat/commands/rp/RpUtil.java b/src/main/java/com/loki/lochat/commands/rp/RpUtil.java index a3036e3..7dfa5a3 100644 --- a/src/main/java/com/loki/lochat/commands/rp/RpUtil.java +++ b/src/main/java/com/loki/lochat/commands/rp/RpUtil.java @@ -2,8 +2,10 @@ package com.loki.lochat.commands.rp; import com.loki.lochat.LoChat; import com.loki.lochat.utils.player.DistanceUtil; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -34,7 +36,8 @@ public final class RpUtil { if (plugin.getGradientModule() != null && plugin.getGradientModule().isEnabled()) { return plugin.getGradientModule().getFormattedName(player); } - } catch (Exception ignored) {} + } catch (Exception ignored) { + } // Пробуем взять displayName (может содержать градиент от NickService) Component displayName = player.displayName(); diff --git a/src/main/java/com/loki/lochat/commands/rp/TryCommand.java b/src/main/java/com/loki/lochat/commands/rp/TryCommand.java index 95d5d1b..661dc1d 100644 --- a/src/main/java/com/loki/lochat/commands/rp/TryCommand.java +++ b/src/main/java/com/loki/lochat/commands/rp/TryCommand.java @@ -4,7 +4,9 @@ import com.loki.lochat.LoChat; import com.loki.lochat.api.service.PlayerService; import com.loki.lochat.commands.base.PlayerCommand; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; + import org.bukkit.command.Command; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -29,7 +31,9 @@ public class TryCommand extends PlayerCommand { @Override protected boolean executePlayerCommand(@NotNull Player player, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!requirePermission(player, "lochat.rp.try")) return true; + if (!requirePermission(player, "lochat.rp.try")) { + return true; + } int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.try", 0); if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_try", cooldown)) { @@ -64,7 +68,9 @@ public class TryCommand extends PlayerCommand { int radius = plugin.getConfigManager().getInt("rp.radius", 100); RpUtil.sendToRadius(player, message, radius); - if (cooldown > 0) playerService.setCooldown(player.getUniqueId(), "rp_try"); + if (cooldown > 0) { + playerService.setCooldown(player.getUniqueId(), "rp_try"); + } plugin.getLogger().info("[TRY] " + player.getName() + ": " + action + " -> " + (success ? "SUCCESS" : "FAIL")); return true; } diff --git a/src/main/java/com/loki/lochat/config/AppearanceConfig.java b/src/main/java/com/loki/lochat/config/AppearanceConfig.java index 02dc56c..017cb32 100644 --- a/src/main/java/com/loki/lochat/config/AppearanceConfig.java +++ b/src/main/java/com/loki/lochat/config/AppearanceConfig.java @@ -2,9 +2,9 @@ package com.loki.lochat.config; import org.bukkit.plugin.Plugin; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.HashMap; /** * Конфигурация внешнего вида чата (config/appearance.yml) @@ -48,19 +48,43 @@ public class AppearanceConfig extends BaseConfig { return config.getString("prefixes." + chatType + "." + key, defaultValue); } - public String getGlobalEmoji() { return getPrefixValue("global", "emoji", "🌍"); } - public String getGlobalText() { return getPrefixValue("global", "text", "GLOBAL"); } - public List getGlobalColors() { return config.getStringList("prefixes.global.colors"); } - public String getGlobalSeparatorText() { return getPrefixValue("global", "separator.text", " ▶ "); } - public String getGlobalSeparatorColor() { return getPrefixValue("global", "separator.color", "#FFD700"); } - public String getGlobalMessageColor() { return getPrefixValue("global", "message-color", "#FFFFFF"); } + public String getGlobalEmoji() { + return getPrefixValue("global", "emoji", "🌍"); + } + public String getGlobalText() { + return getPrefixValue("global", "text", "GLOBAL"); + } + public List getGlobalColors() { + return config.getStringList("prefixes.global.colors"); + } + public String getGlobalSeparatorText() { + return getPrefixValue("global", "separator.text", " ▶ "); + } + public String getGlobalSeparatorColor() { + return getPrefixValue("global", "separator.color", "#FFD700"); + } + public String getGlobalMessageColor() { + return getPrefixValue("global", "message-color", "#FFFFFF"); + } - public String getLocalEmoji() { return getPrefixValue("local", "emoji", ""); } - public String getLocalText() { return getPrefixValue("local", "text", "LOCAL"); } - public List getLocalColors() { return config.getStringList("prefixes.local.colors"); } - public String getLocalSeparatorText() { return getPrefixValue("local", "separator.text", " ▶ "); } - public String getLocalSeparatorColor() { return getPrefixValue("local", "separator.color", "#FFFFFF"); } - public String getLocalMessageColor() { return getPrefixValue("local", "message-color", "#FFFFFF"); } + public String getLocalEmoji() { + return getPrefixValue("local", "emoji", ""); + } + public String getLocalText() { + return getPrefixValue("local", "text", "LOCAL"); + } + public List getLocalColors() { + return config.getStringList("prefixes.local.colors"); + } + public String getLocalSeparatorText() { + return getPrefixValue("local", "separator.text", " ▶ "); + } + public String getLocalSeparatorColor() { + return getPrefixValue("local", "separator.color", "#FFFFFF"); + } + public String getLocalMessageColor() { + return getPrefixValue("local", "message-color", "#FFFFFF"); + } // ========== ФОРМАТ СООБЩЕНИЙ ========== @@ -74,36 +98,72 @@ public class AppearanceConfig extends BaseConfig { // ========== HOVER ЭФФЕКТЫ ========== - public boolean isHoverEnabled() { return config.getBoolean("hover.enabled", true); } - public List getHoverFormat() { return config.getStringList("hover.format"); } + public boolean isHoverEnabled() { + return config.getBoolean("hover.enabled", true); + } + public List getHoverFormat() { + return config.getStringList("hover.format"); + } // ========== ЭМОДЗИ ========== - public Map getEmojis() { return new HashMap<>(emojiCache); } - public String getEmoji(String key) { return emojiCache.get(key); } + public Map getEmojis() { + return new HashMap<>(emojiCache); + } + public String getEmoji(String key) { + return emojiCache.get(key); + } // ========== НАСТРОЙКИ ЧАТА ========== - public int getLocalRadius() { return config.getInt("chat.local_radius", 100); } - public int getClearLines() { return config.getInt("chat.clear_lines", 100); } - public int getMinMessageLength() { return config.getInt("chat.min_message_length", 1); } - public int getMaxMessageLength() { return config.getInt("chat.max_message_length", 2000); } + public int getLocalRadius() { + return config.getInt("chat.local_radius", 100); + } + public int getClearLines() { + return config.getInt("chat.clear_lines", 100); + } + public int getMinMessageLength() { + return config.getInt("chat.min_message_length", 1); + } + public int getMaxMessageLength() { + return config.getInt("chat.max_message_length", 2000); + } private String getChatColor(String type, String defaultColor) { return config.getString("chat.colors." + type, defaultColor); } - public String getNobodyHeardColor() { return getChatColor("nobody_heard", "#FFA726"); } - public String getErrorColor() { return getChatColor("error", "#FF6B6B"); } - public String getSuccessColor() { return getChatColor("success", "#6BCB77"); } - public String getWarningColor() { return getChatColor("warning", "#FFA726"); } - public String getInfoColor() { return getChatColor("info", "#87CEEB"); } + public String getNobodyHeardColor() { + return getChatColor("nobody_heard", "#FFA726"); + } + public String getErrorColor() { + return getChatColor("error", "#FF6B6B"); + } + public String getSuccessColor() { + return getChatColor("success", "#6BCB77"); + } + public String getWarningColor() { + return getChatColor("warning", "#FFA726"); + } + public String getInfoColor() { + return getChatColor("info", "#87CEEB"); + } // ========== DISCORD ========== - public String getDiscordEmoji(String event) { return config.getString("discord.emojis." + event, ""); } - public String getDiscordEventTitle(String event) { return config.getString("discord.event_titles." + event, ""); } - public String getDefaultAvatarUrl() { return config.getString("discord.avatar_urls.default", "https://mc-heads.net/avatar/minecraft/64"); } - public String getPlayerAvatarUrl() { return config.getString("discord.avatar_urls.player", "https://mc-heads.net/avatar/{player}/64"); } - public String getDefaultEmbedColor() { return config.getString("discord.default_embed_color", "5865F2"); } + public String getDiscordEmoji(String event) { + return config.getString("discord.emojis." + event, ""); + } + public String getDiscordEventTitle(String event) { + return config.getString("discord.event_titles." + event, ""); + } + public String getDefaultAvatarUrl() { + return config.getString("discord.avatar_urls.default", "https://mc-heads.net/avatar/minecraft/64"); + } + public String getPlayerAvatarUrl() { + return config.getString("discord.avatar_urls.player", "https://mc-heads.net/avatar/{player}/64"); + } + public String getDefaultEmbedColor() { + return config.getString("discord.default_embed_color", "5865F2"); + } } diff --git a/src/main/java/com/loki/lochat/config/ConfigManager.java b/src/main/java/com/loki/lochat/config/ConfigManager.java index 5780a87..b4a456d 100644 --- a/src/main/java/com/loki/lochat/config/ConfigManager.java +++ b/src/main/java/com/loki/lochat/config/ConfigManager.java @@ -1,9 +1,8 @@ package com.loki.lochat.config; import com.loki.lochat.LoChat; -import com.loki.lochat.config.core.ConfigLoader; import com.loki.lochat.config.core.ConfigAccessor; -import org.bukkit.configuration.file.FileConfiguration; +import com.loki.lochat.config.core.ConfigLoader; import java.util.List; diff --git a/src/main/java/com/loki/lochat/config/MessageConfig.java b/src/main/java/com/loki/lochat/config/MessageConfig.java index e21a8d7..1b3f7bd 100644 --- a/src/main/java/com/loki/lochat/config/MessageConfig.java +++ b/src/main/java/com/loki/lochat/config/MessageConfig.java @@ -2,7 +2,9 @@ package com.loki.lochat.config; import com.loki.lochat.LoChat; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; + import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/com/loki/lochat/config/core/ConfigAccessor.java b/src/main/java/com/loki/lochat/config/core/ConfigAccessor.java index 6b5fee6..b499d4b 100644 --- a/src/main/java/com/loki/lochat/config/core/ConfigAccessor.java +++ b/src/main/java/com/loki/lochat/config/core/ConfigAccessor.java @@ -1,6 +1,7 @@ package com.loki.lochat.config.core; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.configuration.file.FileConfiguration; import java.util.List; diff --git a/src/main/java/com/loki/lochat/core/PluginInitializer.java b/src/main/java/com/loki/lochat/core/PluginInitializer.java index aa2bee2..7e77964 100644 --- a/src/main/java/com/loki/lochat/core/PluginInitializer.java +++ b/src/main/java/com/loki/lochat/core/PluginInitializer.java @@ -15,6 +15,7 @@ import com.loki.lochat.listener.ModerationListener; import com.loki.lochat.listener.PlayerEventListener; import com.loki.lochat.managers.AutoMessageManager; import com.loki.lochat.managers.CustomCommandManager; + import org.bukkit.Bukkit; /** diff --git a/src/main/java/com/loki/lochat/core/PluginShutdown.java b/src/main/java/com/loki/lochat/core/PluginShutdown.java index ca0f72c..ed76d09 100644 --- a/src/main/java/com/loki/lochat/core/PluginShutdown.java +++ b/src/main/java/com/loki/lochat/core/PluginShutdown.java @@ -3,13 +3,14 @@ package com.loki.lochat.core; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MessagingService; import com.loki.lochat.api.service.MuteService; -import com.loki.lochat.api.service.PunishmentService; import com.loki.lochat.api.service.NickService; import com.loki.lochat.api.service.PlayerService; +import com.loki.lochat.api.service.PunishmentService; import com.loki.lochat.core.registry.ServiceRegistry; import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.integrations.DiscordIntegration; import com.loki.lochat.managers.AutoMessageManager; + import org.bukkit.event.HandlerList; /** @@ -59,7 +60,9 @@ public class PluginShutdown { * Сохранить все данные через сервисы */ private void saveAllData(ServiceRegistry serviceRegistry) { - if (serviceRegistry == null) return; + if (serviceRegistry == null) { + return; + } // Статистика игроков PlayerService playerService = serviceRegistry.get(PlayerService.class); diff --git a/src/main/java/com/loki/lochat/core/factory/ServiceFactory.java b/src/main/java/com/loki/lochat/core/factory/ServiceFactory.java index 08c1b6e..6260991 100644 --- a/src/main/java/com/loki/lochat/core/factory/ServiceFactory.java +++ b/src/main/java/com/loki/lochat/core/factory/ServiceFactory.java @@ -10,6 +10,7 @@ import com.loki.lochat.core.service.mute.MuteHistoryManager; import com.loki.lochat.core.service.mute.strategies.ChatMuteStrategy; import com.loki.lochat.core.service.mute.strategies.MuteStrategy; import com.loki.lochat.core.service.mute.strategies.VoiceMuteStrategy; + import org.bukkit.plugin.java.JavaPlugin; import java.io.File; @@ -21,6 +22,9 @@ import java.util.List; */ public class ServiceFactory { + private ServiceFactory() { + } + /** * Создать MuteService со всеми зависимостями */ diff --git a/src/main/java/com/loki/lochat/core/filter/AdvancedMessageFilter.java b/src/main/java/com/loki/lochat/core/filter/AdvancedMessageFilter.java index 5410401..3f2355a 100644 --- a/src/main/java/com/loki/lochat/core/filter/AdvancedMessageFilter.java +++ b/src/main/java/com/loki/lochat/core/filter/AdvancedMessageFilter.java @@ -1,6 +1,7 @@ package com.loki.lochat.core.filter; import com.loki.lochat.core.filter.filters.*; + import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -80,24 +81,32 @@ public class AdvancedMessageFilter { // 2. Мат if (config.getBoolean("filters.swear.enabled", true) && !canBypassFilter(player, "swear")) { FilterResult swear = swearFilter.filter(player, message); - if (!swear.allowed()) return swear; + if (!swear.allowed()) { + return swear; + } message = swear.filteredMessage(); } // 3. URL фильтры if (config.getBoolean("filters.advertising.enabled", true)) { FilterResult r = urlFilter.filterUrls(player, message); - if (!r.allowed()) return r; + if (!r.allowed()) { + return r; + } message = r.filteredMessage(); r = urlFilter.filterHiddenUrls(player, message); - if (!r.allowed()) return r; + if (!r.allowed()) { + return r; + } } // 4. IP if (config.getBoolean("filters.ip.enabled", true)) { FilterResult r = urlFilter.filterIPs(player, message); - if (!r.allowed()) return r; + if (!r.allowed()) { + return r; + } message = r.filteredMessage(); } @@ -109,13 +118,17 @@ public class AdvancedMessageFilter { // 6. Anti-flood if (config.getBoolean("filters.flood.enabled", true) && !canBypassFilter(player, "flood")) { FilterResult r = floodFilter.filter(player); - if (!r.allowed()) return r; + if (!r.allowed()) { + return r; + } } // 7. Anti-spam if (config.getBoolean("filters.spam.enabled", true) && !canBypassFilter(player, "spam")) { FilterResult r = spamFilter.filter(player, message); - if (!r.allowed()) return r; + if (!r.allowed()) { + return r; + } } return FilterResult.ok(message); diff --git a/src/main/java/com/loki/lochat/core/filter/CooldownFilter.java b/src/main/java/com/loki/lochat/core/filter/CooldownFilter.java index c44a557..c2368b9 100644 --- a/src/main/java/com/loki/lochat/core/filter/CooldownFilter.java +++ b/src/main/java/com/loki/lochat/core/filter/CooldownFilter.java @@ -3,6 +3,7 @@ package com.loki.lochat.core.filter; import com.loki.lochat.api.filter.MessageFilter; import com.loki.lochat.api.service.PlayerService; import com.loki.lochat.data.model.ChatMessage; + import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; diff --git a/src/main/java/com/loki/lochat/core/filter/MuteFilter.java b/src/main/java/com/loki/lochat/core/filter/MuteFilter.java index 8c5201c..5e7662e 100644 --- a/src/main/java/com/loki/lochat/core/filter/MuteFilter.java +++ b/src/main/java/com/loki/lochat/core/filter/MuteFilter.java @@ -5,6 +5,7 @@ import com.loki.lochat.api.service.MuteService; import com.loki.lochat.config.MessagesConfig; import com.loki.lochat.data.model.ChatMessage; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; diff --git a/src/main/java/com/loki/lochat/core/filter/filters/FloodFilter.java b/src/main/java/com/loki/lochat/core/filter/filters/FloodFilter.java index fccf0dc..7d5f3b7 100644 --- a/src/main/java/com/loki/lochat/core/filter/filters/FloodFilter.java +++ b/src/main/java/com/loki/lochat/core/filter/filters/FloodFilter.java @@ -1,6 +1,7 @@ package com.loki.lochat.core.filter.filters; import com.loki.lochat.core.filter.FilterResult; + import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; diff --git a/src/main/java/com/loki/lochat/core/filter/filters/SpamFilter.java b/src/main/java/com/loki/lochat/core/filter/filters/SpamFilter.java index e3e3df0..00c6f18 100644 --- a/src/main/java/com/loki/lochat/core/filter/filters/SpamFilter.java +++ b/src/main/java/com/loki/lochat/core/filter/filters/SpamFilter.java @@ -1,6 +1,7 @@ package com.loki.lochat.core.filter.filters; import com.loki.lochat.core.filter.FilterResult; + import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; @@ -41,15 +42,21 @@ public class SpamFilter { // Добавляем в историю (храним последние 10) history.addLast(message); - if (history.size() > 10) history.pollFirst(); + if (history.size() > 10) { + history.pollFirst(); + } return FilterResult.ok(null); } private int similarity(String a, String b) { - if (a.equals(b)) return 100; + if (a.equals(b)) { + return 100; + } int maxLen = Math.max(a.length(), b.length()); - if (maxLen == 0) return 100; + if (maxLen == 0) { + return 100; + } int dist = levenshtein( a.toLowerCase().substring(0, Math.min(a.length(), 50)), @@ -60,7 +67,9 @@ public class SpamFilter { private int levenshtein(String a, String b) { int[] dp = new int[b.length() + 1]; - for (int j = 0; j <= b.length(); j++) dp[j] = j; + for (int j = 0; j <= b.length(); j++) { + dp[j] = j; + } for (int i = 1; i <= a.length(); i++) { int prev = dp[0]; diff --git a/src/main/java/com/loki/lochat/core/filter/filters/SwearFilter.java b/src/main/java/com/loki/lochat/core/filter/filters/SwearFilter.java index b6c0d06..79caea5 100644 --- a/src/main/java/com/loki/lochat/core/filter/filters/SwearFilter.java +++ b/src/main/java/com/loki/lochat/core/filter/filters/SwearFilter.java @@ -1,6 +1,7 @@ package com.loki.lochat.core.filter.filters; import com.loki.lochat.core.filter.FilterResult; + import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; diff --git a/src/main/java/com/loki/lochat/core/filter/filters/UrlFilter.java b/src/main/java/com/loki/lochat/core/filter/filters/UrlFilter.java index 6515475..aad1642 100644 --- a/src/main/java/com/loki/lochat/core/filter/filters/UrlFilter.java +++ b/src/main/java/com/loki/lochat/core/filter/filters/UrlFilter.java @@ -1,11 +1,11 @@ package com.loki.lochat.core.filter.filters; import com.loki.lochat.core.filter.FilterResult; + import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import java.util.HashSet; -import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/com/loki/lochat/core/registry/ServiceRegistry.java b/src/main/java/com/loki/lochat/core/registry/ServiceRegistry.java index 15c69f9..0ad02c4 100644 --- a/src/main/java/com/loki/lochat/core/registry/ServiceRegistry.java +++ b/src/main/java/com/loki/lochat/core/registry/ServiceRegistry.java @@ -5,6 +5,7 @@ import com.loki.lochat.config.ConfigManager; import com.loki.lochat.config.MessageConfig; import com.loki.lochat.core.factory.ServiceFactory; import com.loki.lochat.core.service.*; + import org.bukkit.plugin.java.JavaPlugin; import java.util.HashMap; diff --git a/src/main/java/com/loki/lochat/core/service/ChatServiceImpl.java b/src/main/java/com/loki/lochat/core/service/ChatServiceImpl.java index 58b6f38..0380a89 100644 --- a/src/main/java/com/loki/lochat/core/service/ChatServiceImpl.java +++ b/src/main/java/com/loki/lochat/core/service/ChatServiceImpl.java @@ -3,10 +3,12 @@ package com.loki.lochat.core.service; import com.loki.lochat.api.service.ChatService; import com.loki.lochat.core.registry.ServiceRegistry; import com.loki.lochat.renderer.EnhancedChatRenderer; -import com.loki.lochat.utils.player.DistanceUtil; -import com.loki.lochat.utils.platform.FoliaUtil; import com.loki.lochat.utils.format.ChatFormatter; +import com.loki.lochat.utils.platform.FoliaUtil; +import com.loki.lochat.utils.player.DistanceUtil; + import net.kyori.adventure.text.Component; + import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -97,12 +99,15 @@ public class ChatServiceImpl implements ChatService { // ────────────────────────────────────────────────────────────────────────── private void loadDisabled() { - if (!playersFile.exists()) return; + if (!playersFile.exists()) { + return; + } YamlConfiguration cfg = YamlConfiguration.loadConfiguration(playersFile); for (String uuidStr : cfg.getStringList("global-chat-disabled")) { try { globalChatDisabled.add(UUID.fromString(uuidStr)); - } catch (IllegalArgumentException ignored) {} + } catch (IllegalArgumentException ignored) { + } } } @@ -123,7 +128,9 @@ public class ChatServiceImpl implements ChatService { private void ensureDir() { File dir = playersFile.getParentFile(); - if (!dir.exists()) dir.mkdirs(); + if (!dir.exists()) { + dir.mkdirs(); + } } private Component toComponent(Object message) { diff --git a/src/main/java/com/loki/lochat/core/service/MentionServiceImpl.java b/src/main/java/com/loki/lochat/core/service/MentionServiceImpl.java index 29ea9c7..31afddb 100644 --- a/src/main/java/com/loki/lochat/core/service/MentionServiceImpl.java +++ b/src/main/java/com/loki/lochat/core/service/MentionServiceImpl.java @@ -3,6 +3,7 @@ package com.loki.lochat.core.service; import com.loki.lochat.api.service.MentionService; import com.loki.lochat.config.ConfigManager; import com.loki.lochat.utils.player.PlayerUtil; + import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.entity.Player; @@ -113,8 +114,12 @@ public class MentionServiceImpl implements MentionService { @Override public void notifyIfMentioned(String message, Player viewer, Player sender) { - if (viewer.equals(sender)) return; - if (!configManager.isMentionSoundEnabled()) return; + if (viewer.equals(sender)) { + return; + } + if (!configManager.isMentionSoundEnabled()) { + return; + } if (isPlayerMentioned(message, viewer)) { String soundName = configManager.getMentionSoundType(); diff --git a/src/main/java/com/loki/lochat/core/service/MessageServiceImpl.java b/src/main/java/com/loki/lochat/core/service/MessageServiceImpl.java index 71b6ea5..98b06d6 100644 --- a/src/main/java/com/loki/lochat/core/service/MessageServiceImpl.java +++ b/src/main/java/com/loki/lochat/core/service/MessageServiceImpl.java @@ -1,13 +1,14 @@ package com.loki.lochat.core.service; import com.loki.lochat.api.filter.MessageFilter; -import com.loki.lochat.api.service.PlayerService; import com.loki.lochat.api.service.MessageService; import com.loki.lochat.api.service.MuteService; +import com.loki.lochat.api.service.PlayerService; import com.loki.lochat.core.filter.CooldownFilter; import com.loki.lochat.core.filter.MuteFilter; import com.loki.lochat.core.registry.ServiceRegistry; import com.loki.lochat.data.model.ChatMessage; + import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; diff --git a/src/main/java/com/loki/lochat/core/service/MessagingServiceImpl.java b/src/main/java/com/loki/lochat/core/service/MessagingServiceImpl.java index abbfd03..ddd58cd 100644 --- a/src/main/java/com/loki/lochat/core/service/MessagingServiceImpl.java +++ b/src/main/java/com/loki/lochat/core/service/MessagingServiceImpl.java @@ -5,7 +5,9 @@ import com.loki.lochat.config.MessageConfig; import com.loki.lochat.core.service.messaging.IgnoreService; import com.loki.lochat.core.service.messaging.PrivateMessageService; import com.loki.lochat.core.service.messaging.SpyService; + import net.kyori.adventure.text.Component; + import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; diff --git a/src/main/java/com/loki/lochat/core/service/MuteServiceImpl.java b/src/main/java/com/loki/lochat/core/service/MuteServiceImpl.java index 8443a2f..9bcd096 100644 --- a/src/main/java/com/loki/lochat/core/service/MuteServiceImpl.java +++ b/src/main/java/com/loki/lochat/core/service/MuteServiceImpl.java @@ -7,6 +7,7 @@ import com.loki.lochat.core.service.mute.MutePermissionChecker; import com.loki.lochat.core.service.mute.strategies.MuteStrategy; import com.loki.lochat.data.model.MuteData; import com.loki.lochat.utils.format.TimeFormatter; + import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -82,12 +83,18 @@ public class MuteServiceImpl implements MuteService { @Override public boolean isMuted(UUID uuid) { - if (uuid == null) return false; + if (uuid == null) { + return false; + } MuteData data = storage.get(uuid); - if (data == null) return false; + if (data == null) { + return false; + } - if (!isExpired(data)) return true; + if (!isExpired(data)) { + return true; + } // Мут истек - удаляем storage.remove(uuid); @@ -104,8 +111,12 @@ public class MuteServiceImpl implements MuteService { @Override public long getRemainingTime(UUID uuid) { MuteData data = storage.get(uuid); - if (data == null) return 0; - if (data.getEndTime() == 0) return -1; + if (data == null) { + return 0; + } + if (data.getEndTime() == 0) { + return -1; + } return Math.max(0, data.getEndTime() - System.currentTimeMillis()); } diff --git a/src/main/java/com/loki/lochat/core/service/NickServiceImpl.java b/src/main/java/com/loki/lochat/core/service/NickServiceImpl.java index 8b8f947..76f294f 100644 --- a/src/main/java/com/loki/lochat/core/service/NickServiceImpl.java +++ b/src/main/java/com/loki/lochat/core/service/NickServiceImpl.java @@ -3,8 +3,10 @@ package com.loki.lochat.core.service; import com.loki.lochat.api.service.NickService; import com.loki.lochat.config.RatConfig; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; + import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/com/loki/lochat/core/service/PlayerServiceImpl.java b/src/main/java/com/loki/lochat/core/service/PlayerServiceImpl.java index f52a180..bbe0991 100644 --- a/src/main/java/com/loki/lochat/core/service/PlayerServiceImpl.java +++ b/src/main/java/com/loki/lochat/core/service/PlayerServiceImpl.java @@ -2,6 +2,7 @@ package com.loki.lochat.core.service; import com.loki.lochat.api.service.PlayerService; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.java.JavaPlugin; @@ -47,7 +48,9 @@ public class PlayerServiceImpl implements PlayerService { Map cooldowns = getCooldownMap(type); Long lastTime = cooldowns.get(player); - if (lastTime == null) return false; + if (lastTime == null) { + return false; + } long elapsed = (System.currentTimeMillis() - lastTime) / 1000; return elapsed < cooldownSeconds; @@ -58,7 +61,9 @@ public class PlayerServiceImpl implements PlayerService { Map cooldowns = getCooldownMap(type); Long lastTime = cooldowns.get(player); - if (lastTime == null) return 0; + if (lastTime == null) { + return 0; + } long elapsed = (System.currentTimeMillis() - lastTime) / 1000; return Math.max(0, cooldownSeconds - (int) elapsed); @@ -89,6 +94,8 @@ public class PlayerServiceImpl implements PlayerService { case "global" -> globalChatCount.incrementAndGet(); case "local" -> localChatCount.incrementAndGet(); case "pm" -> pmCount.incrementAndGet(); + default -> { + } } } @@ -152,6 +159,8 @@ public class PlayerServiceImpl implements PlayerService { private void ensureDir() { File dir = statsFile.getParentFile(); - if (!dir.exists()) dir.mkdirs(); + if (!dir.exists()) { + dir.mkdirs(); + } } } diff --git a/src/main/java/com/loki/lochat/core/service/PunishmentServiceImpl.java b/src/main/java/com/loki/lochat/core/service/PunishmentServiceImpl.java index 8bb6d3f..0931bb2 100644 --- a/src/main/java/com/loki/lochat/core/service/PunishmentServiceImpl.java +++ b/src/main/java/com/loki/lochat/core/service/PunishmentServiceImpl.java @@ -7,10 +7,12 @@ import com.loki.lochat.api.service.PunishmentService; import com.loki.lochat.config.MessagesConfig; import com.loki.lochat.data.model.BanRecord; import com.loki.lochat.data.model.WarnEntry; -import com.loki.lochat.utils.platform.FoliaUtil; import com.loki.lochat.utils.format.ChatFormatter; import com.loki.lochat.utils.format.TimeFormatter; +import com.loki.lochat.utils.platform.FoliaUtil; + import net.kyori.adventure.text.Component; + import org.bukkit.plugin.java.JavaPlugin; import java.io.*; @@ -48,7 +50,9 @@ public class PunishmentServiceImpl implements PunishmentService { @Override public List getWarns(UUID uuid) { List list = warns.get(uuid); - if (list == null) return List.of(); + if (list == null) { + return List.of(); + } synchronized (list) { return List.copyOf(list); } @@ -81,8 +85,12 @@ public class PunishmentServiceImpl implements PunishmentService { @Override public boolean isBanned(UUID uuid) { BanRecord b = bans.get(uuid); - if (b == null) return false; - if (b.isPermanent()) return true; + if (b == null) { + return false; + } + if (b.isPermanent()) { + return true; + } if (b.isExpired()) { bans.remove(uuid, b); saveAsync(); @@ -93,7 +101,9 @@ public class PunishmentServiceImpl implements PunishmentService { @Override public BanRecord getActiveBan(UUID uuid) { - if (!isBanned(uuid)) return null; + if (!isBanned(uuid)) { + return null; + } return bans.get(uuid); } @@ -153,11 +163,15 @@ public class PunishmentServiceImpl implements PunishmentService { } private void load() { - if (!dataFile.exists()) return; + if (!dataFile.exists()) { + return; + } try (Reader r = new InputStreamReader(new FileInputStream(dataFile), java.nio.charset.StandardCharsets.UTF_8)) { - Type type = new TypeToken() {}.getType(); + Type type = new TypeToken() { }.getType(); PunishmentSnapshot snap = gson.fromJson(r, type); - if (snap == null) return; + if (snap == null) { + return; + } if (snap.warns != null) { for (Map.Entry> e : snap.warns.entrySet()) { try { @@ -173,7 +187,9 @@ public class PunishmentServiceImpl implements PunishmentService { BanRecord br = e.getValue(); if (br != null) { br.uuid = id; - if (!br.isPermanent() && br.isExpired()) continue; + if (!br.isPermanent() && br.isExpired()) { + continue; + } bans.put(id, br); } } catch (IllegalArgumentException ignored) { diff --git a/src/main/java/com/loki/lochat/core/service/messaging/IgnoreService.java b/src/main/java/com/loki/lochat/core/service/messaging/IgnoreService.java index 13ddb35..7182438 100644 --- a/src/main/java/com/loki/lochat/core/service/messaging/IgnoreService.java +++ b/src/main/java/com/loki/lochat/core/service/messaging/IgnoreService.java @@ -1,6 +1,7 @@ package com.loki.lochat.core.service.messaging; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.java.JavaPlugin; @@ -36,15 +37,21 @@ public class IgnoreService { public boolean addIgnore(UUID player, UUID target) { Set ignored = ignoreMap.computeIfAbsent(player, k -> ConcurrentHashMap.newKeySet()); boolean added = ignored.add(target); - if (added) saveAsync(); + if (added) { + saveAsync(); + } return added; } public boolean removeIgnore(UUID player, UUID target) { Set ignored = ignoreMap.get(player); - if (ignored == null) return false; + if (ignored == null) { + return false; + } boolean removed = ignored.remove(target); - if (removed) saveAsync(); + if (removed) { + saveAsync(); + } return removed; } @@ -63,7 +70,9 @@ public class IgnoreService { } public void load() { - if (!ignoreFile.exists()) return; + if (!ignoreFile.exists()) { + return; + } YamlConfiguration config = YamlConfiguration.loadConfiguration(ignoreFile); for (String key : config.getKeys(false)) { diff --git a/src/main/java/com/loki/lochat/core/service/messaging/SpyService.java b/src/main/java/com/loki/lochat/core/service/messaging/SpyService.java index b38a8c3..0ccd3b8 100644 --- a/src/main/java/com/loki/lochat/core/service/messaging/SpyService.java +++ b/src/main/java/com/loki/lochat/core/service/messaging/SpyService.java @@ -2,8 +2,10 @@ package com.loki.lochat.core.service.messaging; import com.loki.lochat.config.MessageConfig; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -53,7 +55,9 @@ public class SpyService { } public void sendToSpies(Player sender, Component message, boolean isGlobal) { - if (spyEnabled.isEmpty()) return; + if (spyEnabled.isEmpty()) { + return; + } String chatType = isGlobal ? "Global" : "Local"; String plainMessage = PlainTextComponentSerializer.plainText().serialize(message); diff --git a/src/main/java/com/loki/lochat/core/service/mute/MuteDataStorage.java b/src/main/java/com/loki/lochat/core/service/mute/MuteDataStorage.java index 53eb99a..f5b7b7e 100644 --- a/src/main/java/com/loki/lochat/core/service/mute/MuteDataStorage.java +++ b/src/main/java/com/loki/lochat/core/service/mute/MuteDataStorage.java @@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.loki.lochat.data.model.MuteData; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.plugin.java.JavaPlugin; import java.io.*; @@ -59,7 +60,7 @@ public class MuteDataStorage { } try (Reader reader = new FileReader(dataFile)) { - Type type = new TypeToken>() {}.getType(); + Type type = new TypeToken>() { }.getType(); Map loaded = gson.fromJson(reader, type); if (loaded != null) { loaded.forEach((key, value) -> { diff --git a/src/main/java/com/loki/lochat/core/service/mute/MutePermissionChecker.java b/src/main/java/com/loki/lochat/core/service/mute/MutePermissionChecker.java index 8eae26d..f3c4730 100644 --- a/src/main/java/com/loki/lochat/core/service/mute/MutePermissionChecker.java +++ b/src/main/java/com/loki/lochat/core/service/mute/MutePermissionChecker.java @@ -1,6 +1,7 @@ package com.loki.lochat.core.service.mute; import com.loki.lochat.utils.format.TimeFormatter; + import org.bukkit.entity.Player; /** diff --git a/src/main/java/com/loki/lochat/core/service/mute/strategies/VoiceMuteStrategy.java b/src/main/java/com/loki/lochat/core/service/mute/strategies/VoiceMuteStrategy.java index 689635f..70fee75 100644 --- a/src/main/java/com/loki/lochat/core/service/mute/strategies/VoiceMuteStrategy.java +++ b/src/main/java/com/loki/lochat/core/service/mute/strategies/VoiceMuteStrategy.java @@ -57,7 +57,9 @@ public class VoiceMuteStrategy implements MuteStrategy { } private void muteVoiceChat(UUID uuid, boolean mute) { - if (voicechatService == null) return; + if (voicechatService == null) { + return; + } try { Player player = Bukkit.getPlayer(uuid); diff --git a/src/main/java/com/loki/lochat/data/model/BanRecord.java b/src/main/java/com/loki/lochat/data/model/BanRecord.java index fd7fe7d..f5471b6 100644 --- a/src/main/java/com/loki/lochat/data/model/BanRecord.java +++ b/src/main/java/com/loki/lochat/data/model/BanRecord.java @@ -31,7 +31,9 @@ public class BanRecord { } public boolean isExpired() { - if (isPermanent()) return false; + if (isPermanent()) { + return false; + } return System.currentTimeMillis() >= until; } } diff --git a/src/main/java/com/loki/lochat/gradient/GradientModule.java b/src/main/java/com/loki/lochat/gradient/GradientModule.java index 5af1f70..102890d 100644 --- a/src/main/java/com/loki/lochat/gradient/GradientModule.java +++ b/src/main/java/com/loki/lochat/gradient/GradientModule.java @@ -11,6 +11,7 @@ import com.loki.lochat.gradient.listeners.GradientGUIListener; import com.loki.lochat.gradient.listeners.GradientPlayerListener; import com.loki.lochat.gradient.service.GradientService; import com.loki.lochat.gradient.service.PrefixService; + import org.black_ixx.playerpoints.PlayerPoints; import org.black_ixx.playerpoints.PlayerPointsAPI; import org.bukkit.Bukkit; @@ -113,7 +114,9 @@ public class GradientModule { * Получает отформатированное имя игрока (префикс + ник с градиентом) */ public String getFormattedName(Player player) { - if (!enabled) return player.getName(); + if (!enabled) { + return player.getName(); + } GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId()); return prefixService.getFullName(player, data); @@ -123,7 +126,9 @@ public class GradientModule { * Получает отформатированное имя для TAB плагина */ public String getFormattedNameForTab(Player player) { - if (!enabled) return player.getName(); + if (!enabled) { + return player.getName(); + } GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId()); return prefixService.getFullNameForTab(player, data); @@ -133,7 +138,9 @@ public class GradientModule { * Получает только градиентный ник (без префикса) */ public String getGradientNick(Player player) { - if (!enabled) return player.getName(); + if (!enabled) { + return player.getName(); + } GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId()); return GradientService.applyGradient(player, player.getName(), data); @@ -143,7 +150,9 @@ public class GradientModule { * Получает префикс игрока (кастомный или LuckPerms) с градиентом */ public String getPrefix(Player player) { - if (!enabled) return ""; + if (!enabled) { + return ""; + } GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId()); return prefixService.getPrefix(player, data); @@ -153,7 +162,9 @@ public class GradientModule { * Получает суффикс игрока из LuckPerms с градиентом */ public String getSuffix(Player player) { - if (!enabled) return ""; + if (!enabled) { + return ""; + } GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId()); return prefixService.getLuckPermsSuffix(player, data); @@ -163,7 +174,9 @@ public class GradientModule { * Получает только LuckPerms префикс */ public String getLuckPermsPrefix(Player player) { - if (!enabled) return ""; + if (!enabled) { + return ""; + } GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId()); return prefixService.getLuckPermsPrefix(player, data); diff --git a/src/main/java/com/loki/lochat/gradient/commands/GradientAdminCommand.java b/src/main/java/com/loki/lochat/gradient/commands/GradientAdminCommand.java index 63613df..81e15a8 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/GradientAdminCommand.java +++ b/src/main/java/com/loki/lochat/gradient/commands/GradientAdminCommand.java @@ -8,6 +8,7 @@ import com.loki.lochat.gradient.config.GradientMessages; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; @@ -125,7 +126,9 @@ public class GradientAdminCommand implements CommandExecutor, TabCompleter { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (!sender.hasPermission("gradient.admin")) return new ArrayList<>(); + if (!sender.hasPermission("gradient.admin")) { + return new ArrayList<>(); + } if (args.length == 1) { return Arrays.asList("reload", "info", "setcolor", "setprefix", "coloron", "coloroff", diff --git a/src/main/java/com/loki/lochat/gradient/commands/GradientColorCommand.java b/src/main/java/com/loki/lochat/gradient/commands/GradientColorCommand.java index 0ce1d11..6ac74b4 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/GradientColorCommand.java +++ b/src/main/java/com/loki/lochat/gradient/commands/GradientColorCommand.java @@ -3,6 +3,7 @@ package com.loki.lochat.gradient.commands; import com.loki.lochat.config.RatConfig; import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.commands.handlers.color.*; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/src/main/java/com/loki/lochat/gradient/commands/GradientPrefixCommand.java b/src/main/java/com/loki/lochat/gradient/commands/GradientPrefixCommand.java index 541138e..c216971 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/GradientPrefixCommand.java +++ b/src/main/java/com/loki/lochat/gradient/commands/GradientPrefixCommand.java @@ -2,6 +2,7 @@ package com.loki.lochat.gradient.commands; import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.commands.handlers.prefix.*; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/ColorCommandHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/ColorCommandHandler.java index 8f4314e..d51c316 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/ColorCommandHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/ColorCommandHandler.java @@ -6,6 +6,7 @@ import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.gradient.util.GradientUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/PrefixCommandHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/PrefixCommandHandler.java index dab72b8..32ecbbc 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/PrefixCommandHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/PrefixCommandHandler.java @@ -5,6 +5,7 @@ import com.loki.lochat.gradient.config.GradientMessages; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; @@ -38,7 +39,9 @@ public class PrefixCommandHandler { StringBuilder prefixBuilder = new StringBuilder(); for (int i = 2; i < args.length; i++) { - if (i > 2) prefixBuilder.append(" "); + if (i > 2) { + prefixBuilder.append(" "); + } prefixBuilder.append(args[i]); } String prefix = prefixBuilder.toString(); diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorCopyHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorCopyHandler.java index c2f7eb3..c685c88 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorCopyHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorCopyHandler.java @@ -6,6 +6,7 @@ import com.loki.lochat.gradient.config.GradientConfig; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.gui.GradientConfirmGUI; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorOffHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorOffHandler.java index e75cea3..88a65a8 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorOffHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorOffHandler.java @@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; /** diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorOnHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorOnHandler.java index 5edc901..9a3abf9 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorOnHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorOnHandler.java @@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; /** diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorResetHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorResetHandler.java index e9e4d6d..08044f1 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorResetHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorResetHandler.java @@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; import java.util.ArrayList; diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorSetHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorSetHandler.java index bc5aab5..c44821b 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorSetHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/color/ColorSetHandler.java @@ -8,6 +8,7 @@ import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.gui.GradientConfirmGUI; import com.loki.lochat.gradient.util.GradientUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; import java.util.ArrayList; diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixOffHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixOffHandler.java index efff579..8351b8c 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixOffHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixOffHandler.java @@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; /** diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixOnHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixOnHandler.java index c262d11..449ae42 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixOnHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixOnHandler.java @@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; /** diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixResetHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixResetHandler.java index ed60267..7bfc5a8 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixResetHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixResetHandler.java @@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; /** diff --git a/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixSetHandler.java b/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixSetHandler.java index ba9ef38..ada2d3b 100644 --- a/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixSetHandler.java +++ b/src/main/java/com/loki/lochat/gradient/commands/handlers/prefix/PrefixSetHandler.java @@ -7,6 +7,7 @@ import com.loki.lochat.gradient.config.GradientMessages; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.gui.GradientConfirmGUI; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; import java.util.regex.Pattern; @@ -80,7 +81,9 @@ public class PrefixSetHandler implements PrefixSubCommandHandler { } private int calculatePrice(Player player, GradientConfig cfg, GradientPlayerData data) { - if (player.hasPermission("gradient.bypass.cost")) return 0; + if (player.hasPermission("gradient.bypass.cost")) { + return 0; + } return (cfg.isPrefixOneTimePurchase() && data.isPrefixPurchased()) ? 0 : cfg.getPrefixPrice(); } diff --git a/src/main/java/com/loki/lochat/gradient/config/GradientMessages.java b/src/main/java/com/loki/lochat/gradient/config/GradientMessages.java index 2541deb..9e0916e 100644 --- a/src/main/java/com/loki/lochat/gradient/config/GradientMessages.java +++ b/src/main/java/com/loki/lochat/gradient/config/GradientMessages.java @@ -1,7 +1,9 @@ package com.loki.lochat.gradient.config; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; + import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/com/loki/lochat/gradient/data/GradientDataManager.java b/src/main/java/com/loki/lochat/gradient/data/GradientDataManager.java index b3a5d69..bea0b8a 100644 --- a/src/main/java/com/loki/lochat/gradient/data/GradientDataManager.java +++ b/src/main/java/com/loki/lochat/gradient/data/GradientDataManager.java @@ -1,6 +1,7 @@ package com.loki.lochat.gradient.data; import com.loki.lochat.gradient.config.GradientConfig; + import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.java.JavaPlugin; @@ -64,7 +65,9 @@ public class GradientDataManager { private void loadYamlData() { File dataFile = new File(plugin.getDataFolder(), "gradient-data.yml"); - if (!dataFile.exists()) return; + if (!dataFile.exists()) { + return; + } FileConfiguration data = YamlConfiguration.loadConfiguration(dataFile); for (String uuidStr : data.getKeys(false)) { @@ -118,7 +121,9 @@ public class GradientDataManager { public void savePlayerData(UUID uuid) { GradientPlayerData data = cache.get(uuid); - if (data == null) return; + if (data == null) { + return; + } if (useSqlite && sqliteConnection != null) { try (PreparedStatement stmt = sqliteConnection.prepareStatement( diff --git a/src/main/java/com/loki/lochat/gradient/gui/GradientConfirmGUI.java b/src/main/java/com/loki/lochat/gradient/gui/GradientConfirmGUI.java index b50c213..40a95af 100644 --- a/src/main/java/com/loki/lochat/gradient/gui/GradientConfirmGUI.java +++ b/src/main/java/com/loki/lochat/gradient/gui/GradientConfirmGUI.java @@ -3,10 +3,12 @@ package com.loki.lochat.gradient.gui; import com.loki.lochat.config.RatConfig; import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.util.GradientUtil; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -49,7 +51,9 @@ public final class GradientConfirmGUI implements InventoryHolder { } private void initInventory() { - if (inventory != null) return; + if (inventory != null) { + return; + } this.inventory = Bukkit.createInventory(this, 27, Component.text("Подтверждение", NamedTextColor.DARK_GRAY)); setupItems(); @@ -128,7 +132,7 @@ public final class GradientConfirmGUI implements InventoryHolder { boolean useLegacyForPreview = true; // Если нет кастомного префикса - используем LuckPerms префикс - if ((prefixToUse == null || prefixToUse.isEmpty())) { + if (prefixToUse == null || prefixToUse.isEmpty()) { String lpPrefix = module.getPrefixService().getLuckPermsPrefix(player, data); if (lpPrefix != null && !lpPrefix.isEmpty()) { // Конвертируем LP префикс в legacy формат @@ -163,7 +167,9 @@ public final class GradientConfirmGUI implements InventoryHolder { * Конвертирует MiniMessage теги в legacy формат */ private String convertToLegacy(String text) { - if (text == null) return ""; + if (text == null) { + return ""; + } // Конвертируем <#RRGGBB> в &#RRGGBB return text.replaceAll("<#([A-Fa-f0-9]{6})>", "&#$1"); } @@ -172,7 +178,9 @@ public final class GradientConfirmGUI implements InventoryHolder { * Убирает цветовые коды из строки */ private String stripColors(String text) { - if (text == null) return ""; + if (text == null) { + return ""; + } return text.replaceAll("(?i)(§x(§[0-9a-f]){6}|§[0-9a-fk-or]|&[0-9a-fk-or]|&#[0-9a-f]{6}|<[^>]+>)", ""); } diff --git a/src/main/java/com/loki/lochat/gradient/listeners/GradientGUIListener.java b/src/main/java/com/loki/lochat/gradient/listeners/GradientGUIListener.java index 19742bd..7bef851 100644 --- a/src/main/java/com/loki/lochat/gradient/listeners/GradientGUIListener.java +++ b/src/main/java/com/loki/lochat/gradient/listeners/GradientGUIListener.java @@ -7,6 +7,7 @@ import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.gui.GradientConfirmGUI; import com.loki.lochat.gradient.util.DisplayNameUtil; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -31,15 +32,21 @@ public class GradientGUIListener implements Listener { @EventHandler public void onInventoryClick(InventoryClickEvent event) { - if (!(event.getInventory().getHolder() instanceof GradientConfirmGUI gui)) return; + if (!(event.getInventory().getHolder() instanceof GradientConfirmGUI gui)) { + return; + } event.setCancelled(true); - if (!(event.getWhoClicked() instanceof Player player) || !player.equals(gui.getPlayer())) return; + if (!(event.getWhoClicked() instanceof Player player) || !player.equals(gui.getPlayer())) { + return; + } switch (event.getRawSlot()) { case RatConfig.GUI_CONFIRM_SLOT -> handleConfirm(player, gui); case RatConfig.GUI_CANCEL_SLOT -> handleCancel(player); + default -> { + } } } @@ -76,7 +83,6 @@ public class GradientGUIListener implements Listener { data.setPrefixEnabled(true); data.setPrefixPurchased(true); data.setLastPrefixChange(System.currentTimeMillis()); - // Сохраняем существующие цвета если они есть if (gui.getColors() != null && !gui.getColors().isEmpty()) { data.setColors(gui.getColors()); data.setColorEnabled(true); @@ -84,6 +90,8 @@ public class GradientGUIListener implements Listener { msg.send(player, price > 0 ? "prefix-success" : "prefix-success-free", "price", String.valueOf(price)); } + default -> { + } } FoliaUtil.runEntityTask(module.getPlugin(), player, diff --git a/src/main/java/com/loki/lochat/gradient/listeners/GradientPlayerListener.java b/src/main/java/com/loki/lochat/gradient/listeners/GradientPlayerListener.java index 485a42f..90ceff3 100644 --- a/src/main/java/com/loki/lochat/gradient/listeners/GradientPlayerListener.java +++ b/src/main/java/com/loki/lochat/gradient/listeners/GradientPlayerListener.java @@ -2,6 +2,7 @@ package com.loki.lochat.gradient.listeners; import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/src/main/java/com/loki/lochat/gradient/service/GradientService.java b/src/main/java/com/loki/lochat/gradient/service/GradientService.java index 46bb02b..5d23b63 100644 --- a/src/main/java/com/loki/lochat/gradient/service/GradientService.java +++ b/src/main/java/com/loki/lochat/gradient/service/GradientService.java @@ -2,6 +2,7 @@ package com.loki.lochat.gradient.service; import com.loki.lochat.gradient.data.GradientPlayerData; import com.loki.lochat.gradient.util.GradientUtil; + import org.bukkit.entity.Player; import java.util.List; @@ -11,6 +12,9 @@ import java.util.List; */ public class GradientService { + private GradientService() { + } + /** * Применяет градиент к тексту если у игрока есть цвета */ diff --git a/src/main/java/com/loki/lochat/gradient/service/PrefixService.java b/src/main/java/com/loki/lochat/gradient/service/PrefixService.java index 80425b8..b2b16d1 100644 --- a/src/main/java/com/loki/lochat/gradient/service/PrefixService.java +++ b/src/main/java/com/loki/lochat/gradient/service/PrefixService.java @@ -2,10 +2,12 @@ package com.loki.lochat.gradient.service; import com.loki.lochat.gradient.config.GradientConfig; import com.loki.lochat.gradient.data.GradientPlayerData; + import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.cacheddata.CachedMetaData; import net.luckperms.api.model.user.User; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -128,9 +130,13 @@ public class PrefixService { } StringBuilder result = new StringBuilder(); - if (!prefix.isEmpty()) result.append(prefix).append(" "); + if (!prefix.isEmpty()) { + result.append(prefix).append(" "); + } result.append(nick); - if (!suffix.isEmpty()) result.append(" ").append(suffix); + if (!suffix.isEmpty()) { + result.append(" ").append(suffix); + } return result.toString(); } @@ -149,9 +155,13 @@ public class PrefixService { } StringBuilder result = new StringBuilder(); - if (!prefix.isEmpty()) result.append(prefix).append(" "); + if (!prefix.isEmpty()) { + result.append(prefix).append(" "); + } result.append(nick); - if (!suffix.isEmpty()) result.append(" ").append(suffix); + if (!suffix.isEmpty()) { + result.append(" ").append(suffix); + } return result.toString(); } diff --git a/src/main/java/com/loki/lochat/gradient/util/DisplayNameUtil.java b/src/main/java/com/loki/lochat/gradient/util/DisplayNameUtil.java index 2bad26c..c1ac15b 100644 --- a/src/main/java/com/loki/lochat/gradient/util/DisplayNameUtil.java +++ b/src/main/java/com/loki/lochat/gradient/util/DisplayNameUtil.java @@ -3,7 +3,9 @@ package com.loki.lochat.gradient.util; import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.config.GradientConfig; import com.loki.lochat.gradient.data.GradientPlayerData; + import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + import org.bukkit.entity.Player; import java.util.regex.Matcher; @@ -38,7 +40,9 @@ public final class DisplayNameUtil { * Конвертирует MiniMessage <#RRGGBB> формат в §x§R§R§G§G§B§B для display name */ private static String convertMiniMessageToLegacy(String text) { - if (text == null) return ""; + if (text == null) { + return ""; + } // Конвертируем <#RRGGBB> в §x§R§R§G§G§B§B Pattern pattern = Pattern.compile("<#([0-9a-fA-F]{6})>"); @@ -59,7 +63,9 @@ public final class DisplayNameUtil { } public static String buildColoredPrefix(GradientModule module, GradientPlayerData data) { - if (!data.hasPrefix() || !data.isPrefixEnabled()) return null; + if (!data.hasPrefix() || !data.isPrefixEnabled()) { + return null; + } GradientConfig cfg = module.getConfig(); // ✅ FIX: Убрал stripTrailing() чтобы сохранить пробел из prefix-format diff --git a/src/main/java/com/loki/lochat/gradient/util/GradientUtil.java b/src/main/java/com/loki/lochat/gradient/util/GradientUtil.java index cdd52cb..47b44cf 100644 --- a/src/main/java/com/loki/lochat/gradient/util/GradientUtil.java +++ b/src/main/java/com/loki/lochat/gradient/util/GradientUtil.java @@ -25,7 +25,9 @@ public final class GradientUtil { char[] chars = text.toCharArray(); int length = chars.length; - if (length == 0) return text; + if (length == 0) { + return text; + } StringBuilder result = new StringBuilder(); @@ -61,9 +63,15 @@ public final class GradientUtil { } private static Color interpolateMultiColor(Color[] colors, double ratio) { - if (colors.length == 1) return colors[0]; - if (ratio <= 0) return colors[0]; - if (ratio >= 1) return colors[colors.length - 1]; + if (colors.length == 1) { + return colors[0]; + } + if (ratio <= 0) { + return colors[0]; + } + if (ratio >= 1) { + return colors[colors.length - 1]; + } double scaledRatio = ratio * (colors.length - 1); int index = (int) scaledRatio; @@ -128,7 +136,9 @@ public final class GradientUtil { char[] chars = text.toCharArray(); int length = chars.length; - if (length == 0) return text; + if (length == 0) { + return text; + } StringBuilder result = new StringBuilder(); diff --git a/src/main/java/com/loki/lochat/integrations/DiscordIntegration.java b/src/main/java/com/loki/lochat/integrations/DiscordIntegration.java index a0e5cb8..61a3355 100644 --- a/src/main/java/com/loki/lochat/integrations/DiscordIntegration.java +++ b/src/main/java/com/loki/lochat/integrations/DiscordIntegration.java @@ -2,6 +2,7 @@ package com.loki.lochat.integrations; import com.loki.lochat.integrations.discord.DiscordConfig; import com.loki.lochat.integrations.discord.DiscordMessageService; + import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -40,7 +41,9 @@ public class DiscordIntegration { } public void sendChatMessage(Player player, String message, boolean isGlobal) { - if (!enabled || !config.isChatEnabled()) return; + if (!enabled || !config.isChatEnabled()) { + return; + } if (config.isGlobalOnly() && !isGlobal) { return; @@ -50,22 +53,30 @@ public class DiscordIntegration { } public void sendPlayerJoin(Player player) { - if (!enabled || !config.isEventEnabled("join")) return; + if (!enabled || !config.isEventEnabled("join")) { + return; + } messageService.sendPlayerJoin(player); } public void sendPlayerQuit(Player player) { - if (!enabled || !config.isEventEnabled("quit")) return; + if (!enabled || !config.isEventEnabled("quit")) { + return; + } messageService.sendPlayerQuit(player); } public void sendPlayerDeath(Player player, String deathMessage) { - if (!enabled || !config.isEventEnabled("death")) return; + if (!enabled || !config.isEventEnabled("death")) { + return; + } messageService.sendPlayerDeath(player, deathMessage); } public void sendTestMessage(String message, String senderName) { - if (!enabled) return; + if (!enabled) { + return; + } messageService.sendTestMessage(message, senderName); } diff --git a/src/main/java/com/loki/lochat/integrations/DiscordWebhook.java b/src/main/java/com/loki/lochat/integrations/DiscordWebhook.java index bd4919d..3e160fd 100644 --- a/src/main/java/com/loki/lochat/integrations/DiscordWebhook.java +++ b/src/main/java/com/loki/lochat/integrations/DiscordWebhook.java @@ -2,6 +2,7 @@ package com.loki.lochat.integrations; import com.google.gson.JsonArray; import com.google.gson.JsonObject; + import org.bukkit.plugin.java.JavaPlugin; import java.io.IOException; @@ -78,10 +79,18 @@ public class DiscordWebhook { private JsonObject buildEmbed(String title, String description, String color, String thumbnailUrl, JsonArray fields) { JsonObject embed = new JsonObject(); - if (title != null) embed.addProperty("title", title); - if (description != null) embed.addProperty("description", description); - if (color != null) embed.addProperty("color", Integer.parseInt(color, 16)); - if (fields != null) embed.add("fields", fields); + if (title != null) { + embed.addProperty("title", title); + } + if (description != null) { + embed.addProperty("description", description); + } + if (color != null) { + embed.addProperty("color", Integer.parseInt(color, 16)); + } + if (fields != null) { + embed.add("fields", fields); + } if (thumbnailUrl != null) { JsonObject thumb = new JsonObject(); thumb.addProperty("url", thumbnailUrl); @@ -106,13 +115,19 @@ public class DiscordWebhook { return CompletableFuture.supplyAsync(() -> { for (int attempt = 1; attempt <= retryAttempts; attempt++) { try { - if (sendWebhookSync(json.toString())) return true; + if (sendWebhookSync(json.toString())) { + return true; + } } catch (Exception e) { plugin.getLogger().warning("Discord webhook attempt " + attempt + " failed: " + e.getMessage()); } if (attempt < retryAttempts) { - try { Thread.sleep(retryDelay); } - catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } + try { + Thread.sleep(retryDelay); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } } } plugin.getLogger().severe("Failed to send Discord webhook after " + retryAttempts + " attempts"); @@ -134,8 +149,13 @@ public class DiscordWebhook { os.write(jsonPayload.getBytes(StandardCharsets.UTF_8)); } int code = conn.getResponseCode(); - if (code == 204) return true; - if (code == 429) { plugin.getLogger().warning("Discord webhook rate limited (429)"); return false; } + if (code == 204) { + return true; + } + if (code == 429) { + plugin.getLogger().warning("Discord webhook rate limited (429)"); + return false; + } plugin.getLogger().warning("Discord webhook returned code: " + code); return false; } finally { @@ -144,12 +164,22 @@ public class DiscordWebhook { } public boolean isValid() { - if (webhookUrl == null || webhookUrl.trim().isEmpty()) return false; + if (webhookUrl == null || webhookUrl.trim().isEmpty()) { + return false; + } String url = webhookUrl.trim(); if (!url.startsWith("https://discord.com/api/webhooks/") && - !url.startsWith("https://discordapp.com/api/webhooks/")) return false; - if (url.length() < 50) return false; - try { URI.create(url); } catch (IllegalArgumentException e) { return false; } + !url.startsWith("https://discordapp.com/api/webhooks/")) { + return false; + } + if (url.length() < 50) { + return false; + } + try { + URI.create(url); + } catch (IllegalArgumentException e) { + return false; + } return true; } } diff --git a/src/main/java/com/loki/lochat/integrations/LibertyBansHook.java b/src/main/java/com/loki/lochat/integrations/LibertyBansHook.java index 4b55607..6dc52ee 100644 --- a/src/main/java/com/loki/lochat/integrations/LibertyBansHook.java +++ b/src/main/java/com/loki/lochat/integrations/LibertyBansHook.java @@ -2,6 +2,7 @@ package com.loki.lochat.integrations; import com.loki.lochat.LoChat; import com.loki.lochat.api.service.MuteService; + import org.bukkit.entity.Player; /** diff --git a/src/main/java/com/loki/lochat/integrations/PlaceholderAPIHook.java b/src/main/java/com/loki/lochat/integrations/PlaceholderAPIHook.java index ec66a15..930a241 100644 --- a/src/main/java/com/loki/lochat/integrations/PlaceholderAPIHook.java +++ b/src/main/java/com/loki/lochat/integrations/PlaceholderAPIHook.java @@ -4,7 +4,7 @@ import com.loki.lochat.LoChat; import com.loki.lochat.api.service.ChatService; import com.loki.lochat.api.service.MessagingService; import com.loki.lochat.gradient.GradientModule; -import me.clip.placeholderapi.expansion.PlaceholderExpansion; + import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -14,6 +14,8 @@ import org.jetbrains.annotations.Nullable; import java.util.Optional; import java.util.UUID; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; + public class PlaceholderAPIHook extends PlaceholderExpansion { private final LoChat plugin; @@ -48,7 +50,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { @Override public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { - if (player == null) return ""; + if (player == null) { + return ""; + } UUID uuid = player.getUniqueId(); GradientModule gradient = plugin.getGradientModule(); @@ -58,7 +62,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { case "global_enabled" -> String.valueOf(!chatService.isGlobalChatDisabled(uuid)); case "last_pm" -> { Optional lastOpt = messagingService.getLastConversation(uuid); - if (lastOpt.isEmpty()) yield ""; + if (lastOpt.isEmpty()) { + yield ""; + } var lastPlayer = Bukkit.getOfflinePlayer(lastOpt.get()); yield lastPlayer.getName() != null ? lastPlayer.getName() : ""; } @@ -68,7 +74,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { // Используем TAB формат §x§R§R§G§G§B§B для совместимости с TAB плагином case "gradient_full", "full" -> { Player onlinePlayer = player.getPlayer(); - if (onlinePlayer == null) yield player.getName() != null ? player.getName() : ""; + if (onlinePlayer == null) { + yield player.getName() != null ? player.getName() : ""; + } // Если gradient модуль выключен — берём только LuckPerms префикс + ник if (gradient == null || !gradient.isEnabled()) { @@ -80,7 +88,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { } case "gradient_name", "name" -> { Player onlinePlayer = player.getPlayer(); - if (onlinePlayer == null) yield player.getName() != null ? player.getName() : ""; + if (onlinePlayer == null) { + yield player.getName() != null ? player.getName() : ""; + } if (gradient == null || !gradient.isEnabled()) { yield player.getName(); @@ -89,16 +99,24 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { } case "gradient_prefix", "prefix" -> { Player onlinePlayer = player.getPlayer(); - if (onlinePlayer == null) yield ""; + if (onlinePlayer == null) { + yield ""; + } - if (gradient == null || !gradient.isEnabled()) yield ""; + if (gradient == null || !gradient.isEnabled()) { + yield ""; + } yield gradient.getPrefix(onlinePlayer); } case "lp_prefix" -> { Player onlinePlayer = player.getPlayer(); - if (onlinePlayer == null) yield ""; + if (onlinePlayer == null) { + yield ""; + } - if (gradient == null || !gradient.isEnabled()) yield ""; + if (gradient == null || !gradient.isEnabled()) { + yield ""; + } yield gradient.getLuckPermsPrefix(onlinePlayer); } default -> null; diff --git a/src/main/java/com/loki/lochat/integrations/SkinsRestorerHook.java b/src/main/java/com/loki/lochat/integrations/SkinsRestorerHook.java index 2f2bca5..3901f4a 100644 --- a/src/main/java/com/loki/lochat/integrations/SkinsRestorerHook.java +++ b/src/main/java/com/loki/lochat/integrations/SkinsRestorerHook.java @@ -1,6 +1,7 @@ package com.loki.lochat.integrations; import com.loki.lochat.LoChat; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -57,7 +58,9 @@ public class SkinsRestorerHook { * @return URL текстуры или null */ public String getPlayerSkinTexture(Player player) { - if (!enabled) return null; + if (!enabled) { + return null; + } try { Object property = getSkinDataMethod.invoke(skinsAPI, player.getName()); diff --git a/src/main/java/com/loki/lochat/integrations/discord/DiscordMessageService.java b/src/main/java/com/loki/lochat/integrations/discord/DiscordMessageService.java index 8732614..270ceb6 100644 --- a/src/main/java/com/loki/lochat/integrations/discord/DiscordMessageService.java +++ b/src/main/java/com/loki/lochat/integrations/discord/DiscordMessageService.java @@ -2,6 +2,7 @@ package com.loki.lochat.integrations.discord; import com.loki.lochat.integrations.DiscordWebhook; import com.loki.lochat.utils.platform.FoliaUtil; + import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -140,7 +141,9 @@ public class DiscordMessageService { } private String sanitizeMessage(String message) { - if (message == null) return ""; + if (message == null) { + return ""; + } message = COLOR_CODE_PATTERN.matcher(message).replaceAll(""); diff --git a/src/main/java/com/loki/lochat/listener/ChatEventListener.java b/src/main/java/com/loki/lochat/listener/ChatEventListener.java index 1170b34..5167893 100644 --- a/src/main/java/com/loki/lochat/listener/ChatEventListener.java +++ b/src/main/java/com/loki/lochat/listener/ChatEventListener.java @@ -7,15 +7,18 @@ import com.loki.lochat.core.filter.FilterResult; import com.loki.lochat.core.registry.ServiceRegistry; import com.loki.lochat.renderer.EnhancedChatRenderer; import com.loki.lochat.utils.format.ChatFormatter; -import io.papermc.paper.event.player.AsyncChatEvent; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; + import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; +import io.papermc.paper.event.player.AsyncChatEvent; + public class ChatEventListener implements Listener { private final JavaPlugin plugin; private final MessageService messageService; @@ -122,7 +125,9 @@ public class ChatEventListener implements Listener { int radius = loChat.getConfigManager().getAppearanceConfig().getLocalRadius(); event.viewers().removeIf(v -> { - if (!(v instanceof Player p)) return false; + if (!(v instanceof Player p)) { + return false; + } try { return !com.loki.lochat.utils.player.DistanceUtil.isInRange(sender, p, radius); } catch (Exception e) { diff --git a/src/main/java/com/loki/lochat/listener/DiscordEventListener.java b/src/main/java/com/loki/lochat/listener/DiscordEventListener.java index 12408d1..8446bb8 100644 --- a/src/main/java/com/loki/lochat/listener/DiscordEventListener.java +++ b/src/main/java/com/loki/lochat/listener/DiscordEventListener.java @@ -1,8 +1,9 @@ package com.loki.lochat.listener; import com.loki.lochat.integrations.DiscordIntegration; -import io.papermc.paper.event.player.AsyncChatEvent; + import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; + import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -11,6 +12,8 @@ import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import io.papermc.paper.event.player.AsyncChatEvent; + /** * Слушатель событий для Discord интеграции */ @@ -26,7 +29,9 @@ public class DiscordEventListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onChat(AsyncChatEvent event) { - if (!discord.isEnabled()) return; + if (!discord.isEnabled()) { + return; + } Player player = event.getPlayer(); String message = PlainTextComponentSerializer.plainText().serialize(event.message()); @@ -47,7 +52,9 @@ public class DiscordEventListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent event) { - if (!discord.isEnabled()) return; + if (!discord.isEnabled()) { + return; + } Player player = event.getPlayer(); discord.sendPlayerJoin(player); @@ -58,7 +65,9 @@ public class DiscordEventListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR) public void onPlayerQuit(PlayerQuitEvent event) { - if (!discord.isEnabled()) return; + if (!discord.isEnabled()) { + return; + } Player player = event.getPlayer(); discord.sendPlayerQuit(player); @@ -69,7 +78,9 @@ public class DiscordEventListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR) public void onPlayerDeath(PlayerDeathEvent event) { - if (!discord.isEnabled()) return; + if (!discord.isEnabled()) { + return; + } Player player = event.getEntity(); String deathMessage = event.deathMessage() != null ? diff --git a/src/main/java/com/loki/lochat/listener/ModerationListener.java b/src/main/java/com/loki/lochat/listener/ModerationListener.java index 31a08ca..639385d 100644 --- a/src/main/java/com/loki/lochat/listener/ModerationListener.java +++ b/src/main/java/com/loki/lochat/listener/ModerationListener.java @@ -1,8 +1,9 @@ package com.loki.lochat.listener; import com.loki.lochat.api.service.PunishmentService; -import com.loki.lochat.data.model.BanRecord; import com.loki.lochat.core.registry.ServiceRegistry; +import com.loki.lochat.data.model.BanRecord; + import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; diff --git a/src/main/java/com/loki/lochat/listener/PlayerEventListener.java b/src/main/java/com/loki/lochat/listener/PlayerEventListener.java index 4503e81..9fb6d24 100644 --- a/src/main/java/com/loki/lochat/listener/PlayerEventListener.java +++ b/src/main/java/com/loki/lochat/listener/PlayerEventListener.java @@ -8,7 +8,9 @@ import com.loki.lochat.config.ConfigManager; import com.loki.lochat.core.filter.AdvancedMessageFilter; import com.loki.lochat.core.registry.ServiceRegistry; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; + import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; diff --git a/src/main/java/com/loki/lochat/managers/AutoMessageManager.java b/src/main/java/com/loki/lochat/managers/AutoMessageManager.java index 110adab..53a1a94 100644 --- a/src/main/java/com/loki/lochat/managers/AutoMessageManager.java +++ b/src/main/java/com/loki/lochat/managers/AutoMessageManager.java @@ -1,10 +1,11 @@ package com.loki.lochat.managers; import com.loki.lochat.LoChat; -import com.loki.lochat.utils.platform.FoliaUtil; import com.loki.lochat.utils.format.ChatFormatter; -import io.papermc.paper.threadedregions.scheduler.ScheduledTask; +import com.loki.lochat.utils.platform.FoliaUtil; + import net.kyori.adventure.text.Component; + import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; @@ -13,6 +14,8 @@ import org.bukkit.scheduler.BukkitTask; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import io.papermc.paper.threadedregions.scheduler.ScheduledTask; + public class AutoMessageManager { private final LoChat plugin; @@ -133,7 +136,9 @@ public class AutoMessageManager { } List lines = messages.get(messageKey); - if (lines == null || lines.isEmpty()) return; + if (lines == null || lines.isEmpty()) { + return; + } boolean isFirstLine = true; for (String line : lines) { diff --git a/src/main/java/com/loki/lochat/managers/CustomCommandManager.java b/src/main/java/com/loki/lochat/managers/CustomCommandManager.java index 6afec15..4eed14f 100644 --- a/src/main/java/com/loki/lochat/managers/CustomCommandManager.java +++ b/src/main/java/com/loki/lochat/managers/CustomCommandManager.java @@ -5,6 +5,7 @@ import com.loki.lochat.commands.CustomCommand; import com.loki.lochat.managers.commands.MessageSender; import com.loki.lochat.managers.commands.PlaceholderProcessor; import com.loki.lochat.utils.format.ChatFormatter; + import org.bukkit.Bukkit; import org.bukkit.command.CommandMap; import org.bukkit.configuration.ConfigurationSection; @@ -44,7 +45,9 @@ public class CustomCommandManager { for (String commandName : commandsConfig.getKeys(false)) { ConfigurationSection section = commandsConfig.getConfigurationSection(commandName); - if (section == null) continue; + if (section == null) { + continue; + } CustomCommandData data = new CustomCommandData( commandName, @@ -96,7 +99,9 @@ public class CustomCommandManager { } } - if (data == null) return false; + if (data == null) { + return false; + } if (!data.enabled()) { return true; diff --git a/src/main/java/com/loki/lochat/managers/EmojiManager.java b/src/main/java/com/loki/lochat/managers/EmojiManager.java index f2b28a5..a0a70d2 100644 --- a/src/main/java/com/loki/lochat/managers/EmojiManager.java +++ b/src/main/java/com/loki/lochat/managers/EmojiManager.java @@ -1,6 +1,7 @@ package com.loki.lochat.managers; import com.loki.lochat.LoChat; + import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -42,7 +43,9 @@ public class EmojiManager { // Загружаем все категории for (String category : config.getKeys(false)) { - if (category.equals("settings")) continue; + if (category.equals("settings")) { + continue; + } ConfigurationSection section = config.getConfigurationSection(category); if (section != null) { @@ -66,7 +69,9 @@ public class EmojiManager { * Заменяет смайлики в сообщении */ public String process(String message, Player player) { - if (!enabled) return message; + if (!enabled) { + return message; + } // Проверка права if (requirePermission && player != null && !player.hasPermission("chat.emoji.use")) { @@ -82,7 +87,9 @@ public class EmojiManager { } public String process(String message) { - if (!enabled) return message; + if (!enabled) { + return message; + } String result = message; for (Map.Entry entry : emojis.entrySet()) { diff --git a/src/main/java/com/loki/lochat/managers/commands/MessageSender.java b/src/main/java/com/loki/lochat/managers/commands/MessageSender.java index c17335f..e1643ce 100644 --- a/src/main/java/com/loki/lochat/managers/commands/MessageSender.java +++ b/src/main/java/com/loki/lochat/managers/commands/MessageSender.java @@ -1,8 +1,10 @@ package com.loki.lochat.managers.commands; import com.loki.lochat.utils.format.ChatFormatter; + import net.kyori.adventure.text.Component; import net.kyori.adventure.title.Title; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -10,6 +12,9 @@ import java.time.Duration; public class MessageSender { + private MessageSender() { + } + public static void sendChat(String target, Player sender, String message) { Component formatted = ChatFormatter.parse(message); diff --git a/src/main/java/com/loki/lochat/managers/commands/PlaceholderProcessor.java b/src/main/java/com/loki/lochat/managers/commands/PlaceholderProcessor.java index a50e245..3b0e7ff 100644 --- a/src/main/java/com/loki/lochat/managers/commands/PlaceholderProcessor.java +++ b/src/main/java/com/loki/lochat/managers/commands/PlaceholderProcessor.java @@ -4,6 +4,9 @@ import org.bukkit.entity.Player; public class PlaceholderProcessor { + private PlaceholderProcessor() { + } + public static String process(String message, Player player, String[] args) { String result = message; diff --git a/src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java b/src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java index 6313d1f..437d5d4 100644 --- a/src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java +++ b/src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java @@ -1,20 +1,23 @@ package com.loki.lochat.renderer; import com.loki.lochat.renderer.components.*; -import com.loki.lochat.utils.player.MentionHandler; import com.loki.lochat.utils.format.TextFormatter; -import io.papermc.paper.chat.ChatRenderer; +import com.loki.lochat.utils.player.MentionHandler; + import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; + import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import java.util.List; +import io.papermc.paper.chat.ChatRenderer; + /** * Рендерер чата — глобальный и локальный режимы */ @@ -185,7 +188,9 @@ public class EnhancedChatRenderer implements ChatRenderer { .replace("{food}", String.valueOf(player.getFoodLevel())); hoverBuilder.append(com.loki.lochat.utils.format.ChatFormatter.parse(line)); - if (i < hoverLines.size() - 1) hoverBuilder.append(Component.newline()); + if (i < hoverLines.size() - 1) { + hoverBuilder.append(Component.newline()); + } } return displayName @@ -194,7 +199,9 @@ public class EnhancedChatRenderer implements ChatRenderer { } private TextColor parseColor(String hex) { - if (hex == null || hex.isBlank()) return FALLBACK_COLOR; + if (hex == null || hex.isBlank()) { + return FALLBACK_COLOR; + } String n = hex.startsWith("#") ? hex : "#" + hex; TextColor c = TextColor.fromHexString(n); return c != null ? c : FALLBACK_COLOR; diff --git a/src/main/java/com/loki/lochat/renderer/components/EmojiComponent.java b/src/main/java/com/loki/lochat/renderer/components/EmojiComponent.java index 9ae30a5..08ac0d1 100644 --- a/src/main/java/com/loki/lochat/renderer/components/EmojiComponent.java +++ b/src/main/java/com/loki/lochat/renderer/components/EmojiComponent.java @@ -3,10 +3,14 @@ package com.loki.lochat.renderer.components; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.TextColor; + import org.bukkit.configuration.ConfigurationSection; public class EmojiComponent { + private EmojiComponent() { + } + public static Component build(ConfigurationSection emojiSection) { if (emojiSection == null || !emojiSection.getBoolean("enabled", false)) { return Component.empty(); diff --git a/src/main/java/com/loki/lochat/renderer/components/GradientBuilder.java b/src/main/java/com/loki/lochat/renderer/components/GradientBuilder.java index 8e7e79a..0d184b5 100644 --- a/src/main/java/com/loki/lochat/renderer/components/GradientBuilder.java +++ b/src/main/java/com/loki/lochat/renderer/components/GradientBuilder.java @@ -8,6 +8,9 @@ import java.util.List; public class GradientBuilder { + private GradientBuilder() { + } + public static Component build(String text, List colors) { if (colors == null || colors.size() < 2) { return Component.text(text); diff --git a/src/main/java/com/loki/lochat/renderer/components/UrlProcessor.java b/src/main/java/com/loki/lochat/renderer/components/UrlProcessor.java index f84b311..ed9673f 100644 --- a/src/main/java/com/loki/lochat/renderer/components/UrlProcessor.java +++ b/src/main/java/com/loki/lochat/renderer/components/UrlProcessor.java @@ -10,6 +10,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class UrlProcessor { + private UrlProcessor() { + } + private static final Pattern URL_PATTERN = Pattern.compile( "https?://[\\w\\-._~:/?#\\[\\]@!$&'()*+,;=%]+" ); diff --git a/src/main/java/com/loki/lochat/utils/color/ColorConverter.java b/src/main/java/com/loki/lochat/utils/color/ColorConverter.java index fb5de3c..2e5972c 100644 --- a/src/main/java/com/loki/lochat/utils/color/ColorConverter.java +++ b/src/main/java/com/loki/lochat/utils/color/ColorConverter.java @@ -9,6 +9,9 @@ import java.util.regex.Pattern; */ public class ColorConverter { + private ColorConverter() { + } + private static final Pattern HEX_PATTERN_1 = Pattern.compile("&#([0-9a-fA-F]{6})"); private static final Pattern HEX_PATTERN_2 = Pattern.compile("(?)"); @@ -66,7 +69,9 @@ public class ColorConverter { * Конвертирует legacy форматы цветов в MiniMessage формат */ public static String convertLegacyFormats(String message) { - if (message == null) return ""; + if (message == null) { + return ""; + } // Конвертируем &#RRGGBB в message = convertHexFormat1(message); @@ -138,7 +143,9 @@ public class ColorConverter { * Экранирует текст для безопасного использования внутри MiniMessage тегов */ public static String escapeForMiniMessage(String text) { - if (text == null) return ""; + if (text == null) { + return ""; + } return text.replace("\\", "\\\\").replace("<", "\\<"); } } diff --git a/src/main/java/com/loki/lochat/utils/format/ChatFormatter.java b/src/main/java/com/loki/lochat/utils/format/ChatFormatter.java index dc8c5fa..db76dfb 100644 --- a/src/main/java/com/loki/lochat/utils/format/ChatFormatter.java +++ b/src/main/java/com/loki/lochat/utils/format/ChatFormatter.java @@ -1,9 +1,11 @@ package com.loki.lochat.utils.format; import com.loki.lochat.utils.color.ColorConverter; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; + import org.bukkit.entity.Player; /** @@ -20,13 +22,17 @@ public final class ChatFormatter { // ========== Базовые методы ========== public static Component parse(String message) { - if (message == null) return Component.empty(); + if (message == null) { + return Component.empty(); + } String converted = ColorConverter.convertLegacyFormats(message); return MM.deserialize(converted); } public static Component parseWithDefaultMessageColor(String message, String hexCode) { - if (message == null) message = ""; + if (message == null) { + message = ""; + } String hex = (hexCode == null || hexCode.isBlank()) ? "#FFFFFF" : (hexCode.startsWith("#") ? hexCode : "#" + hexCode); String escaped = ColorConverter.escapeForMiniMessage(message); @@ -34,7 +40,9 @@ public final class ChatFormatter { } public static Component parse(String message, String... replacements) { - if (message == null) return Component.empty(); + if (message == null) { + return Component.empty(); + } String result = message; for (int i = 0; i + 1 < replacements.length; i += 2) { result = result.replace(replacements[i], replacements[i + 1]); @@ -46,7 +54,9 @@ public final class ChatFormatter { // ========== Утилиты ========== public static String stripTags(String message) { - if (message == null) return ""; + if (message == null) { + return ""; + } return PLAIN.serialize(MM.deserialize(message)); } @@ -55,7 +65,9 @@ public final class ChatFormatter { } public static String toPlain(Object obj) { - if (obj == null) return ""; + if (obj == null) { + return ""; + } if (obj instanceof Component component) { return PLAIN.serialize(component); } @@ -69,7 +81,9 @@ public final class ChatFormatter { } public static String convertAllColors(String message) { - if (message == null) return ""; + if (message == null) { + return ""; + } return ColorConverter.convertLegacyFormats(message); } diff --git a/src/main/java/com/loki/lochat/utils/format/TextFormatter.java b/src/main/java/com/loki/lochat/utils/format/TextFormatter.java index 1329ef0..f6bbaf4 100644 --- a/src/main/java/com/loki/lochat/utils/format/TextFormatter.java +++ b/src/main/java/com/loki/lochat/utils/format/TextFormatter.java @@ -7,6 +7,9 @@ import java.util.regex.Pattern; public class TextFormatter { + private TextFormatter() { + } + private static final Pattern BOLD_PATTERN = Pattern.compile("\\*\\*(.+?)\\*\\*"); private static final Pattern ITALIC_PATTERN = Pattern.compile("\\*(.+?)\\*"); private static final Pattern UNDERLINE_PATTERN = Pattern.compile("__(.+?)__"); diff --git a/src/main/java/com/loki/lochat/utils/platform/AdventureManager.java b/src/main/java/com/loki/lochat/utils/platform/AdventureManager.java index 631ecca..1910f23 100644 --- a/src/main/java/com/loki/lochat/utils/platform/AdventureManager.java +++ b/src/main/java/com/loki/lochat/utils/platform/AdventureManager.java @@ -9,6 +9,9 @@ import org.bukkit.plugin.Plugin; */ public class AdventureManager { + private AdventureManager() { + } + private static boolean adventureAvailable = false; private static Object audiences; diff --git a/src/main/java/com/loki/lochat/utils/platform/FoliaUtil.java b/src/main/java/com/loki/lochat/utils/platform/FoliaUtil.java index f9f8aae..08027fb 100644 --- a/src/main/java/com/loki/lochat/utils/platform/FoliaUtil.java +++ b/src/main/java/com/loki/lochat/utils/platform/FoliaUtil.java @@ -8,6 +8,9 @@ import org.bukkit.plugin.java.JavaPlugin; * Утилита для совместимости с Folia */ public class FoliaUtil { + private FoliaUtil() { + } + private static boolean isFolia; static { diff --git a/src/main/java/com/loki/lochat/utils/player/DistanceUtil.java b/src/main/java/com/loki/lochat/utils/player/DistanceUtil.java index 6557328..45ba0fa 100644 --- a/src/main/java/com/loki/lochat/utils/player/DistanceUtil.java +++ b/src/main/java/com/loki/lochat/utils/player/DistanceUtil.java @@ -7,6 +7,9 @@ import org.bukkit.entity.Player; */ public class DistanceUtil { + private DistanceUtil() { + } + public static boolean isInRange(Player player1, Player player2, int radius) { if (!player1.getWorld().equals(player2.getWorld())) { return false; diff --git a/src/main/java/com/loki/lochat/utils/player/MentionHandler.java b/src/main/java/com/loki/lochat/utils/player/MentionHandler.java index f4b19d5..d96a165 100644 --- a/src/main/java/com/loki/lochat/utils/player/MentionHandler.java +++ b/src/main/java/com/loki/lochat/utils/player/MentionHandler.java @@ -1,10 +1,12 @@ package com.loki.lochat.utils.player; import com.loki.lochat.utils.platform.FoliaUtil; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; + import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.entity.Player;