Channel Troubleshooting
Vocabulary — User phrasing → ChatControl primitives
When a user describes what they want using non-plugin terms, translate FIRST, then search. Most "this feature doesn't exist" mistakes come from taking the user's words literally instead of mapping them to what ChatControl actually ships.
- "send one message without joining" / "broadcast to a channel I'm not in"
→
/channel send <channel> <message> — see command/channel/SendChannelSubCommand.java.
- "send as another player" / "post on someone's behalf"
→
/channel send-as <player> <channel> <message> — see command/channel/SendAsChannelSubCommand.java.
- "monitor channel without joining" / "listen in" / "moderator view"
→
/spy toggle chat <channel> — see command/CommandSpy.java and the Spy class. Requires chatcontrol.command.spy plus chatcontrol.spy.type.chat.
- "auto-switch channel by region/area/world"
→ No native region listener. Per-world: write a rule with
#require world <name>. Per-region: external region plugin (WorldGuard region-events, Residence flags, Lands enter handler) running /channel join <name> from console.
- "auto-join on connect" / "auto-join when joining server"
→
Channels.List.<name>.Auto_Join permission-based group config in settings.yml. Once a player manually /channel leaves, that channel is remembered as left (see Common Mistakes below) and will not auto-rejoin.
- "private chat" / "team chat" / "guild chat"
→ A channel with
Range: party or Party: <provider> (Towny, Factions, Lands, mcMMO, SimpleClans, Parties). For 2-player private DMs use the /tell system, not channels.
- "filter / block / replace words in chat"
→ Rules engine (
chatcontrol-bukkit/src/main/resources/rules/chat.rs), not channels.
- "alias /h to /helpop" / "rename a command" / "create a command"
→ Default rules in
command.rs already map /helpop, /nick, /help, /ping etc. as a pattern. Add a new #match ^[/]<alias> block and #then command <real command> $1.
If a translation isn't listed here and you're tempted to refuse, follow the prove-the-gap rule: cite the rule files and command directory you searched, and which terms you grep'd, BEFORE saying it doesn't exist.
Diagnostic Flow — "Messages not showing in channel"
- Check
Channels.Enabled: true
- Verify player has
chatcontrol.channel.join.{channel}.write permission
- Run
/channel list to check membership
- Enable
Rules.Verbose: true to see if rules deny the message
Common Mistakes
Min_Players_For_Range silently disables range — if fewer players are within range than this threshold, range is effectively ignored. Users report "range not working" when few players are online
Range_Worlds only applies when Range: "*" — the world filter is only relevant for world-wide range, not block-based range
Join_Read_Old: true auto-converts old write channel to READ — when joining a new write channel, the previous write channel becomes READ. Users report "lost write access to old channel"
- Console format
"none" cancels the event — this breaks DynMap and other plugins that listen to chat events. Use "default" instead if other plugins need the event
- Manually
/channel leave-d channels are remembered — they won't auto-rejoin on reconnect. Users report "channel doesn't auto-join anymore" after manually leaving once
- Proxy chat toggle — players can
/toggle proxy_chat to stop receiving cross-server messages while still sending to proxy channels. Requires proxy_chat in Toggle.Apply_On in settings.yml. This is the correct solution when users want to "toggle global chat" — they stay in their write channel (messages still proxy out) but incoming proxy messages are filtered
- Discord format split — old
Format_Discord was replaced with Format_To_Discord (MC→Discord) and Format_From_Discord (Discord→MC)
1---2name: channels3description: Troubleshooting channel system: messaging, range, modes, proxy, and Discord linking issues4---56# Channel Troubleshooting78## Vocabulary — User phrasing → ChatControl primitives910When a user describes what they want using non-plugin terms, translate FIRST, then search. Most "this feature doesn't exist" mistakes come from taking the user's words literally instead of mapping them to what ChatControl actually ships.1112- "send one message without joining" / "broadcast to a channel I'm not in"13 → `/channel send <channel> <message>` — see `command/channel/SendChannelSubCommand.java`.14- "send as another player" / "post on someone's behalf"15 → `/channel send-as <player> <channel> <message>` — see `command/channel/SendAsChannelSubCommand.java`.16- "monitor channel without joining" / "listen in" / "moderator view"17 → `/spy toggle chat <channel>` — see `command/CommandSpy.java` and the `Spy` class. Requires `chatcontrol.command.spy` plus `chatcontrol.spy.type.chat`.18- "auto-switch channel by region/area/world"19 → No native region listener. Per-world: write a rule with `#require world <name>`. Per-region: external region plugin (WorldGuard region-events, Residence flags, Lands enter handler) running `/channel join <name>` from console.20- "auto-join on connect" / "auto-join when joining server"21 → `Channels.List.<name>.Auto_Join` permission-based group config in `settings.yml`. Once a player manually `/channel leave`s, that channel is remembered as left (see Common Mistakes below) and will not auto-rejoin.22- "private chat" / "team chat" / "guild chat"23 → A channel with `Range: party` or `Party: <provider>` (Towny, Factions, Lands, mcMMO, SimpleClans, Parties). For 2-player private DMs use the `/tell` system, not channels.24- "filter / block / replace words in chat"25 → Rules engine (`chatcontrol-bukkit/src/main/resources/rules/chat.rs`), not channels.26- "alias /h to /helpop" / "rename a command" / "create a command"27 → Default rules in `command.rs` already map `/helpop`, `/nick`, `/help`, `/ping` etc. as a pattern. Add a new `#match ^[/]<alias>` block and `#then command <real command> $1`.2829If a translation isn't listed here and you're tempted to refuse, follow the prove-the-gap rule: cite the rule files and command directory you searched, and which terms you grep'd, BEFORE saying it doesn't exist.3031## Diagnostic Flow — "Messages not showing in channel"32331. Check `Channels.Enabled: true`342. Verify player has `chatcontrol.channel.join.{channel}.write` permission353. Run `/channel list` to check membership364. Enable `Rules.Verbose: true` to see if rules deny the message3738## Common Mistakes3940- **`Min_Players_For_Range` silently disables range** — if fewer players are within range than this threshold, range is effectively ignored. Users report "range not working" when few players are online41- **`Range_Worlds` only applies when `Range: "*"`** — the world filter is only relevant for world-wide range, not block-based range42- **`Join_Read_Old: true` auto-converts old write channel to READ** — when joining a new write channel, the previous write channel becomes READ. Users report "lost write access to old channel"43- **Console format `"none"` cancels the event** — this breaks DynMap and other plugins that listen to chat events. Use `"default"` instead if other plugins need the event44- **Manually `/channel leave`-d channels are remembered** — they won't auto-rejoin on reconnect. Users report "channel doesn't auto-join anymore" after manually leaving once45- **Proxy chat toggle** — players can `/toggle proxy_chat` to stop receiving cross-server messages while still sending to proxy channels. Requires `proxy_chat` in `Toggle.Apply_On` in settings.yml. This is the correct solution when users want to "toggle global chat" — they stay in their write channel (messages still proxy out) but incoming proxy messages are filtered46- **Discord format split** — old `Format_Discord` was replaced with `Format_To_Discord` (MC→Discord) and `Format_From_Discord` (Discord→MC)