# 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](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value).
### `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.
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. |
cmdna : Not allowed to change own nickname.
nameinuse : Someone else is using the username.
nick : Username has changed.
|
/msg [username] [message]
/whisper [username] [message]
|
Sends a private message to another user. |
cmderr : Missing username and/or message arguments.
usernf : User not found.
|
/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. |
nochan : The given channel does not exist.
whoerr : The user does not have access to the channel.
whochan : Listing of users in a channel.
who : Listing of users.
|
/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. |
nochan : The given channel does not exist.
ipchan : The user does not have access to the channel.
ipwchan : The provided password was invalid.
nopwchan : A password is required to enter the given channel.
|
/create [hierarchy?] [name]
|
Creates a new channel. |
cmdna : Not allowed to create channels.
cmderr : Command isn't formatted correctly.
rankerr : Tried to set channel hierarchy higher than own.
inchan : Given name contained invalid characters.
nischan : A channel with the given name already exists.
crchan : Successfully created channel.
|
/delchan [name]
|
Deletes an existing channel. |
cmderr : Command isn't formatted correctly.
nochan : No channel with the given name exists.
ndchan : Not allowed to delete this channel.
delchan : Deleted channel.
|
/password [password?]
/pwd [password?]
|
Changes the password for a channel. Specify no argument to remove the password. |
cmdna : Not allowed to change the password.
cpwdchan : Success.
|
/privilege [hierarchy]
/rank [hierarchy]
/priv [hierarchy]
|
Changes what user hierarchy is required to enter a channel. |
cmdna : Not allowed to change hierarchy.
rankerr : Missing rank argument or trying to set hierarchy to one higher than their own.
cprivchan : Success.
|
/say [message]
|
Broadcasts a message as the server to all users in all channels. |
cmdna : Not allowed to broadcast.
say : Broadcast message.
|
/delmsg [message id]
|
Deletes a message. |
cmdna : Not allowed to delete messages.
cmderr : Invalid arguments.
delerr : The message does not exist, or the user's hierarchy is lower than the sender.
|
/kick [user] [time?]
|
Kicks a user from the server. If no time is specified the kick expires immediately. |
cmdna : Not allowed to kick users.
usernf : User not found.
kickna : Sender is trying to kick themselves, someone with a higher hierarchy or someone that's already banned.
cmderr : Provided time is invalid.
|
/ban [user] [time?]
|
Kicks a user and IP address from the server. If no time is specified the kick will never expire. |
cmdna : Not allowed to kick users.
usernf : User not found.
kickna : Sender is trying to kick themselves, someone with a higher hierarchy or someone that's already banned.
cmderr : Provided time is invalid.
|
/unban [user]
/pardon [user]
|
Revokes the ban of a user. |
cmdna : Not allowed to revoke user bans.
notban : User is not banned.
unban : Success.
|
/unbanip [user]
/pardonip [user]
|
Revokes the ban of an ip address. |
cmdna : Not allowed to revoke ip bans.
notban : IP address is not banned.
unban : Success.
|
/bans
/banned
|
Retrieves the list of banned users and ip addresses. |
cmdna : Not allowed to revoke ip bans.
banlist : List of bans.
|
/silence [username] [time?]
|
Silences a user. If the time argument is not specified the silence is indefinite. |
cmdna : Not allowed to silence users.
usernf : User not found.
silself : Tried to silence self.
silperr : Tried to silence user of higher hierarchy.
silerr : User is already silenced.
cmderr : Time isn't formatted correctly.
silence : Informs the user they have been silenced.
silok : Tells the sender that the user has been silenced.
|
/unsilence [username]
|
Revokes a silence. |
cmdna : Not allowed to revoke silences.
usernf : User not found.
usilperr : Tried to revoke silence of user of higher hierarchy.
usilerr : User isn't silenced.
unsil : Informs the user that their silence has been revoked.
usilok : Tells the sender that the user's silence has been revoked.
|
/ip [username]
/whois [username]
|
Gets a user's IP address. |
cmdna : Not allowed to view IP addresses.
usernf : User not found.
ipaddr : IP address of user.
|