Chat channels
Languages, staff, trade or a local channel: who a line of chat reaches, with a Discord room per channel. New in 0.2.1, off by default.
On this page 6 parts
Keystone can split chat into channels of any kind — one per language, a staff channel, a trade channel, a local channel heard only nearby. Each player writes in one channel and hears a set of them. A line reaches only the players who hear its channel and hold its read permission. Works with a plain client: it decides who receives a line, it is not a window.
Off by default (chat.channels.enabled = false): nothing below runs and chat is what it always was. New in 0.2.1.
Setting it up
#In the panel, Chat channels (under Community) draws the list as a table with ready-made rows (English & Czech, Staff, Local, Trade) and a preview of a line in each channel. The same thing is one setting in keystone.toml, chat.channels.list, one channel per line:
en: name=English; tag=&8[&9EN&8]; language=en; discord=main
cs: name=Čeština; tag=&8[&cCZ&8]; language=cs; discord=123456789012345678
staff: name=Staff; tag=&8[&4Staff&8]; read=keystone.chat.staff; prefix=#
local: name=Local; tag=&8[&aL&8]; radius=100; prefix=!
| Key | What it does |
|---|---|
name |
What players see (no colour codes). |
tag |
In front of every line in the channel, with colour codes. |
read |
Permission to hear it. Empty: everybody. |
write |
Permission to write in it. Empty: the same as read. |
language |
Two letters. Players who read Keystone in that language write here by default. |
radius |
Blocks, in the same dimension. 0: the whole server. |
prefix |
Symbols that send one line here: !hi goes to the channel with prefix !. |
discord |
A Discord channel id, or main for the Discord module's chat-channel. Without it the channel never leaves the game. |
listen |
yes/no: heard until muted (for channels without a language). |
Then chat.channels.enabled = true. Other settings: chat.channels.default (where a player writes when no channel has their language), chat.channels.mode-default (all or own — what a player hears of the language channels before answering), chat.channels.ask-on-join (the question below). A list that does not read is refused when saved, with the reason.
For players
#/channel # every channel you may read, which you hear, and buttons to switch
/channel <id> # write there from now on (/ch works too)
/channel mute <id> # stop hearing it
/channel listen <id>
/channel mode own|all
Languages. Right after a player picks their language on their first join (see a player's language), a second line asks Chat: only Čeština / all languages. Only hears just the channel of their language; all hears every language channel. /channel mode asks again. The texts are language keys (keystone.chat.*), so a server's translation covers them.
Discord
#Each channel can have its own Discord room. A line goes to its channel's room only; a message from that room comes into that channel only, to the players who may read it, with the channel's tag in front. A channel with no discord never leaves the game — a staff channel stays private unless you bridge it to a private room on purpose. With channels off the bridge works as before, with the one chat-channel.
What stays as it was
#Announcements, join and leave lines, restart warnings, /say, /me, team messages and /msg reach everybody as before. A line refused for another reason (an account that has not proved itself yet) is refused before any channel is chosen. The game's own spam kick still counts every line, and the console log gets every line with its tag.
How a line is written
#With channels on, Keystone writes every chat line in the format from the Chat screen (chat.format.*) as a server message — the same way chat.format.enabled does — also where another mod formats chat, because a line has to reach only its channel. The format may place the tag with {channel} and the name with {channel-name}; when it does not, the tag goes in front. What a player types is never read as colour or as a name in braces.
Privacy, in one place
#- Nobody hears a channel without its
readpermission — not through/channel listen, not by a prefix, not from Discord, not while vanished. An operator hears every channel because an operator holds every permission. - If the chat hook cannot attach on a game version, every line is refused with a message rather than sent to everybody.
- A hand-edited list that does not read keeps the last one that did, and the log says why.
Did this page help?
Opens the feedback panel with this page attached. It lands in the same queue as everything else.