42 KiB
Sock Chat Protocol Information
The protocol operates on a websocket in text mode. Messages sent between the client and server are a series of concatenated strings delimited by the vertical tab character, represented in most languages by the escape sequence \t
and defined in ASCII as 0x09
.
The first string in this concatenation must be the packet identifier, sent as an int
.
Newer versions of the protocol are implemented as extensions, a client for Version 1 should have no trouble using a server built for Version 2 as long as authentication is understood.
The current stable version of the protocol is Version 1.
Types
bool
A value that indicates a true or a false state. 0
represents false and anything non-0
represents true, please stick to 1
for representing true though.
int
Any number ranging from -9007199254740991
to 9007199254740991
, Number.MAX_SAFE_INTEGER
and Number.MIN_SAFE_INTEGER
in JavaScript.
string
Any printable unicode character, except \t
which is used to separate packets.
timestamp
Extends int
, contains a second based UNIX timestamp.
channel name
A string
containing only alphanumeric characters (any case), -
or _
.
session id
A string
containing only alphanumeric characters (any case), -
or _
.
color
Any valid value for the CSS color
property.
Further documentation can be found on MDN.
message flags
Message flags alter how a message should be displayed to the client, these are all bool
values.
The parts are as follows:
- Username should appear using a bold font.
- Username should appear using a cursive font.
- Username should appear underlined.
- A colon
:
should be displayed between the username and the message. - The message was sent privately, directly to the current user.
As an example, the most common message flagset is 10010
. This indicates a bold username with a colon separator.
user permissions
User permissions are a set of flags separated by either the form feed character (\f
/ 0x0C
) or a space (
/ 0x20
).
The reason there are two options is due to a past mixup that we now have to live with.
Which of the methods is used remains consistent per server however, so the result of a test can be cached.
int |
Rank of the user. Used to determine what channels a user can access or what other users the user can moderate. | |
bool |
Indicates whether the user the ability kick/ban/unban others. | |
bool |
Indicates whether the user can access the logs. This should always be 0 , unless the client has a dedicated log view that can be accessed without connecting to the chat server. |
|
bool |
Indicates whether the user can set an alternate display name. | |
int |
Indicates whether the user can create channel. If 0 the user cannot create channels, if 1 the user can create channels but they are to disappear when all users have left it and if 2 the user can create channels that permanently stay in the channel assortment. |
Client Packets
These are the packets sent from the client to the server.
Packet 0
: Ping
Used to prevent the client from closing the session due to inactivity.
int |
User ID | |
timestamp |
Time the packet was sent to the server | Added in version 2 |
Packet 1
: Authentication
Takes a variable number of parameters that are fed into the authentication script associated with the chat.
...string |
Any amount of data required to complete authentication |
Packet 2
: Message
Informs the server that the user has sent a message.
Commands are described lower in the document.
int |
User ID | |
string |
Message text, may not contain \t |
Packet 3
: Focus Channel
Selects which channel messages should be sent to.
Added in Version 2.
channel name |
Channel to change focus to |
Packet 4
: Typing
Informs the currently focussed channel that this client is writing a message.
Added in Version 2.
Server Packets
These are the packets sent from the server to the client.
Packet 0
: Pong
Response to client packet 0
: Ping.
timestamp |
Time the packet was sent to the client | Originally this field contained the string pong , but this value was completely unused and can be safely replaced. |
Packet 1
: Join/Auth
While authenticated this packet indicates that a new user has joined the server/channel. Before authentication this packet serves as a response to client packet 1
: Authentication.
Successful authentication response
Informs the client that authentication has succeeded.
string |
y |
|
int |
User ID | |
string |
Username | |
color |
Username color | |
user permissions |
User permissions | |
channel name |
Default channel the user will join following this packet | |
int |
Extensions version number. If this field is missing, version 1 is implied. | Added in Version 2 |
session id |
ID of the currently active session | Added in Version 2 |
Failed authentication response
Informs the client that authentication has failed.
string |
n |
|
string |
Reason for failure.
|
|
timestamp |
If joinfail this contains expiration time of the ban, otherwise it is empty. |
User joining
Informs the client that a user has joined.
timestamp |
Time the user joined | |
int |
User ID | |
string |
Username | |
colour |
Username color | |
user permissions |
User permissions | |
int |
Sequence ID |
Packet 2
: Chat message
Informs the client that a chat message has been received.
timestamp |
Time when the message was received by the server | |||||||
int |
User ID.
If -1 this message is an informational message from the server and the next field takes on a special form.
|
|||||||
string |
Message, sanitised by the server
If this is an informational message this field is formatted as follows and concatenated by the form feed character
|
|||||||
int |
Sequence ID | |||||||
message flags |
Message flags | |||||||
channel name |
Channel this message was sent in | Added in Version 2 |
Packet 3
: User disconnect
Informs the client that a user has disconnected.
int |
User ID | |
string |
Username | |
string |
One of four disconnect reasons.
|
|
timestamp |
Time when the user disconnected | |
int |
Sequence ID |
Packet 4
: Channel event
This packet informs the user about channel related updates. The only consistent parameter across sub-packets is the first one described as follows.
int |
Channel information update event ID.
|
Sub-packet 0
: Channel creation
Informs the client that a channel has been created.
channel name |
The name of the new channel | |
bool |
Indicates whether the channel is password protected | |
bool |
Indicates whether the channel is temporary, meaning the channel will be deleted after the last person departs |
Sub-packet 1
: Channel update
Informs the client that details of a channel has changed.
channel name |
Old/current name of the channel | |
channel name |
New name of the channel | |
bool |
Indicates whether the channel is password protected | |
bool |
Indicates whether the channel is temporary, meaning the channel will be deleted after the last person departs |
Sub-packet 2
: Channel deletion
Informs the client that a channel has been deleted
channel name |
Name of the channel that has been deleted |
Packet 5
: Channel switching
This packet informs the client about channel switching.
int |
Channel information update event ID.
|
Sub-packet 0
: Channel join
Informs the client that a user has joined the channel.
int |
User ID | |
string |
Username | |
color |
Username color | |
int |
Sequence ID |
Sub-packet 1
: Channel departure
Informs the client that a user has left the channel.
int |
User ID | |
int |
Sequence ID |
Sub-packet 2
: Forced channel switch
Informs the client that it has been forcibly switched to a different channel.
channel name |
The name of the channel that the user has been switched to |
Packet 6
: Message deletion
Informs the client that a message has been deleted.
int |
Sequence ID of the deleted message |
Packet 7
: Context information
Informs the client about the context of a channel before the client was present.
int |
Context event ID.
|
Sub-packet 0
: Existing users
Informs the client about users already present in the channel.
int |
Amount of users present in the channel | |
Context User |
An amount of repetitions of this object based on the number in the previous param, the object is described below |
Context User object
int |
User ID | |
string |
Username | |
color |
Username color | |
user permissions |
User permissions | |
bool |
Whether the user should be visible in the users list |
Sub-packet 1
: Existing message
Informs the client about an existing message in a channel.
timestamp |
Time when the message was received by the server | |
int |
User ID | |
string |
Username | |
color |
Username color | |
user permissions |
User permissions | |
string |
Message text, functions the same as described in Packet 2 : Chat message |
|
int |
Sequence ID | |
bool |
Whether the client should notify the user about this message | |
message flags |
Message flags |
Sub-packet 2
: Channels
Informs the client about the channels on the server.
int |
Amount of channels on the channel | |
Context Channel |
An amount of repetitions of this object based on the number in the previous param, the object is described below |
Context Channel object
channel name |
Name of the channel | |
bool |
Indicates whether the channel is password protected | |
bool |
Indicates whether the channel is temporary, meaning the channel will be deleted after the last person departs |
Packet 8
: Context clearing
Informs the client that the context has been cleared.
int |
Number indicating what has been cleared.
|
|
channel name |
Channel this clear is targeted towards. Ignore packet if this is set and channels are supposedly to be cleared. If this field is empty this packet is intended for the entire context. | Added in Version 2 |
Packet 9
: Forced disconnect
Informs the client that they have either been banned or kicked from the server.
bool |
|
|
timestamp |
Ban expiration time |
Packet 10
: User update
Informs that another user's details have been updated.
int |
User ID of the affected user | |
string |
New username | |
color |
New username color | |
user permissions |
User permissions |
Packet 11
: Typing
Informs the client that a user is typing.
Added in version 2.
channel name |
Name of the channel in which the user is typing. If this field is empty, assume it has been sent to the user directly for private messaging. | |
int |
User ID of the typing user | |
timestamp |
Time when the user started typing. |
Bot Messages
Formatting IDs sent by user -1.
Informational | ||
---|---|---|
String | Description | Arguments |
say |
Just echoes the arguments in a message. | The message. |
silence |
Informs the client that they have been silenced. | |
unsil |
Informs the client that they are no longer silenced. | |
silok |
Informs the client that they have successfully silenced another user. | The username of the silenced user. |
usilok |
Informs the client that they have successfully removed the silencing from another user. | The username of the unsilenced user. |
flwarn |
Informs the client that they are risking being kicking for flood protection (spam). | |
unban |
Informs the client that they have successfully removed the ban from a user or ip address. | |
banlist |
Provides a list with banned users and IP addresses. |
Sets of "<a href="javascript:void(0);" onclick="Chat.SendMessageWrapper('/unban '+ this.innerHTML);">{0}</a> " where {0} is the username of the banned user or the banned IP address. The set is separated by ", "
|
who |
Provides a list of users currently online. |
Sets of "<a href="javascript:void(0);" onclick="UI.InsertChatText(this.innerHTML);">{0}</a> " where {0} is the username of a user. The current online user is highlighted with " style="font-weight: bold;" " before the closing > of the opening <a> tag. The set is separated by ", "
|
whochan |
Provides a list of users currently online in a specific channel. |
Sets of "<a href="javascript:void(0);" onclick="UI.InsertChatText(this.innerHTML);">{0}</a> " where {0} is the username of a user. The current online user is highlighted with " style="font-weight: bold;" " before the closing > of the opening <a> tag. The set is separated by ", "
|
join |
Informs the client that a user connected with the server. | The username of said user. |
jchan |
Informs the client that a user moved into the channel. | The username of said user. |
leave |
Informs the client that a user disconnected from the server. | The username of said user. |
lchan |
Informs the client that a user moved out of the channel. | The username of said user. |
kick |
Informs the client that a user has disconnect because they got kicked. | The username of said user. |
flood |
Informs the client that a user has disconnect because they got kicked for flood protection. | The username of said user. |
nick |
Informs the client that a user has changed their nickname. | The first argument is the previous username of said user, the second argument is their new username. |
crchan |
Informs the client that they have successfully created a channel. | The name of the channel. |
delchan |
Informs the client that they have successfully deleted a channel. | The name of the channel. |
cpwdchan |
Informs the client that they have successfully changed the password of the channel. | |
cprivchan |
Informs the client that they have successfully changed the hierarchy level required for the channel. | |
ipaddr |
Shows the IP address of another user. | First argument is the username, second argument is the IP address. |
Error | ||
String | Description | Arguments |
generr |
Generic fallback error. | |
silerr |
Informs the client that the user they tried to silence had already been silenced. | |
usilerr |
Informs the client that the user whose silence they tried to revoke hasn't been silenced. | |
silperr |
Informs the client that they are not allowed to silence that user. | |
usilperr |
Informs the client that they are not allowed to remove the silence from that user. | |
silself |
Informs the client that they cannot silence themselves. | |
delerr |
Informs the client that they are not allowed to delete a message. | |
notban |
Informs the client that a username or IP address is not banned. | The provided username or IP address. |
whoerr |
Informs the client that they do not have access to the channel they specified for the /who command. | The provided channel name. |
cmdna |
Tells the client they're not allowed to use a command. | First argument is the name of the command. |
nocmd |
Tells the client the command they tried to run does not exist. | First argument is the name of the command. |
cmderr |
Tells the client that they formatted the last command incorrectly. | |
usernf |
Tells the client that the user they requested was not found on the server. | The requested username. |
kickna |
Tells the client that they are not allowed to kick a given user. | Username of the user they tried to kick. |
samechan |
Tells the client that they are already in the channel they are trying to switch to. | The name of the channel. |
ipchan |
Tells the client that they aren't allowed to switch to the provided channel. | The name of the channel. |
nochan |
Tells the client that the channel they tried to switch to does not exist. | The name of the channel. |
nopwchan |
Tells the client that the channel they tried to switch to requires a password. | The name of the channel. |
ipwchan |
Tells the client that the password to tried to switch to the channel to was invalid. | The name of the channel. |
inchan |
Informs the client that the channel name contained invalid characters. | |
nischan |
Tells the client that a channel with that name already exists. | The name of the channel. |
ndchan |
Tells the client that they're not allowed to delete that channel. | The name of the channel. |
namchan |
Tells the client that they're not allowed to edit that channel. | The name of the channel. |
nameinuse |
Tells the client that the nickname they tried to use is already being used by someone else. | The name. |
rankerr |
Tells the client that they're not allowed to do something to a user because they have a higher hierarchy than them. |
Commands
Actions sent through messages prefixed with /
. Arguments are described as [name]
, optional arguments as [name?]
.
Name | Action | Expected bot messages |
---|---|---|
/afk [reason?] |
Marks the current user as afk, the first 5 characters from the user string are prefixed uppercase to the current username prefixed by < and suffixed by >_ resulting in a username that looks like <AWAY>_flash if /afk away is ran by the user flash . If no reason is specified "AFK " is used. |
|
/nick [name?] |
Temporarily changes the user's nickname prefixed with ~ . If the user's original name or no argument at all is specified the command returns the user's name to its original state without the prefix. |
|
/msg [username] [message] /whisper [username] [message]
|
Sends a private message to another user. |
|
/me [message] /action [message]
|
Sends a message but with flags 11000 instead of the regular 10010 , used to describe an action. |
|
/who [channel?]
|
If no argument is specified it'll return all users on the server, if a channel is specified it'll return all users in that channel. |
|
/delete [channel name or message id]
|
If the argument is entirely numeric this function acts as an alias for /delmsg , otherwise /delchan . |
|
/join [channel]
|
Switches the current user to a different channel. |
|
/create [hierarchy?] [name]
|
Creates a new channel. |
|
/delchan [name]
|
Deletes an existing channel. |
|
/password [password?] /pwd [password?]
|
Changes the password for a channel. Specify no argument to remove the password. |
|
/privilege [hierarchy] /rank [hierarchy] /priv [hierarchy]
|
Changes what user hierarchy is required to enter a channel. |
|
/say [message]
|
Broadcasts a message as the server to all users in all channels. |
|
/delmsg [message id]
|
Deletes a message. |
|
/kick [user] [time?]
|
Kicks a user from the server. If no time is specified the kick expires immediately. |
|
/ban [user] [time?]
|
Kicks a user and IP address from the server. If no time is specified the kick will never expire. |
|
/unban [user] /pardon [user]
|
Revokes the ban of a user. |
|
/unbanip [user] /pardonip [user]
|
Revokes the ban of an ip address. |
|
/bans /banned
|
Retrieves the list of banned users and ip addresses. |
|
/silence [username] [time?]
|
Silences a user. If the time argument is not specified the silence is indefinite. |
|
/unsilence [username]
|
Revokes a silence. |
|
/ip [username] /whois [username]
|
Gets a user's IP address. |
|