feat: chat channel system (/join /leave /channel)

- config-driven channels in config/channels.yml (global, local, staff, trade) with
  emoji, colors, prefix, radius, cooldowns, permissions and aliases
- Channel record + ChannelConfig loader wired into ConfigManager (reload supported)
- ChannelService (api) + ConcurrentHashMap-backed ChannelServiceImpl, joined in
  ServiceRegistry; default channel join treated as 'not in channel'
- JoinChannelCommand / LeaveChannelCommand / ChannelCommand (+ tab completion),
  registered in CommandManager; plugin.yml commands + permissions
- ChatEventListener routes AsyncChatEvent to the active channel: per-channel
  cooldown, local-radius viewer filtering, channel-aware renderer
- EnhancedChatRenderer supports Channel overload (emojiFor/prefixText/channelColor)
- ChannelServiceImplTest covering join/leave/permissions/aliases
This commit is contained in:
loki5512344 2026-08-09 21:31:11 +02:00
parent 689ab1a9ae
commit a822c91637
Signed by: boba
GPG key ID: 253067914055423B
17 changed files with 821 additions and 12 deletions

View file

@ -8,7 +8,10 @@ import com.loki.lochat.commands.admin.chat.ClearChatCommand;
import com.loki.lochat.commands.admin.chat.ClearChatConfigCommand;
import com.loki.lochat.commands.admin.system.LoChatCommand;
import com.loki.lochat.commands.admin.system.ReloadConfigCommand;
import com.loki.lochat.commands.chat.ChannelCommand;
import com.loki.lochat.commands.chat.GlobalChatCommand;
import com.loki.lochat.commands.chat.JoinChannelCommand;
import com.loki.lochat.commands.chat.LeaveChannelCommand;
import com.loki.lochat.commands.chat.LocalChatCommand;
import com.loki.lochat.commands.messaging.IgnoreCommand;
import com.loki.lochat.commands.messaging.IgnoreListCommand;
@ -54,6 +57,11 @@ public class CommandManager {
reg("g", new GlobalChatCommand(plugin));
reg("l", new LocalChatCommand(plugin));
// ── Каналы ─────────────────────────────────────────────────────────────
regTab("join", new JoinChannelCommand(plugin));
reg("leave", new LeaveChannelCommand(plugin));
regTab("channel", new ChannelCommand(plugin));
// ── Личные сообщения / игнор ──────────────────────────────────────────
reg("msg", new MsgCommand(plugin));
reg("reply", new ReplyCommand(plugin));