The lichat-protocol Reference Manual

Table of Contents

Next: , Previous: , Up: (dir)   [Contents][Index]

The lichat-protocol Reference Manual

This is the lichat-protocol Reference Manual, version 1.5, generated automatically by Declt version 3.0 "Montgomery Scott" on Mon Apr 19 16:37:07 2021 GMT+0.


Next: , Previous: , Up: Top   [Contents][Index]

1 Introduction

About Lichat-Protocol

This system specifies and implements the protocol of the Lichat chat system. It offers both verbal and programmatical descriptions of the protocol. If you are working with a Common Lisp system, you can use this system straight-away to process Lichat messages.

Protocol Specification

1. Wire Format & Data Types

The Lichat protocol defines the following basic data type hierarchy:

The wire format is based on UTF-8 character streams on which objects are serialised in a secure, simplified s-expression format. The format is as follows:

UPDATE   ::= OBJECT NULL
OBJECT   ::= '(' WHITE* SYMBOL (WHITE+ KEYWORD WHITE+ EXPR)* WHITE* ')'
EXPR     ::= STRING | LIST | SYMBOL | NUMBER
STRING   ::= '"' ('\' ANY | !('"' | NULL))* '"'
LIST     ::= '(' WHITE* (EXPR (WHITE+ EXPR)*)? WHITE* ')'
SYMBOL   ::= KEYWORD | NAME | NAME ':' NAME
KEYWORD  ::= ':' NAME
NUMBER   ::= '0..9'+ ( '.' '0..9'*)? | '.' '0..9'*
NAME     ::= (('\' ANY) | !(TERMINAL | NULL))+
TERMINAL ::= (':' | ' ' | '"' | '.' | '(' | ')')
WHITE    ::= U+0009 | U+000A | U+000B | U+000C | U+000D | U+0020
NULL     ::= U+0000
ANY      ::= !NULL

See to-wire, from-wire.

1.1 Symbols

A symbol is an object with a "name" that is home to a "package". A "package" is a simple collection of symbols. Symbols are uniquely identified by their name and package, and no two symbols with the same name may exist in the same package. The package and symbol names are case-insensitive, and two names are considered the same if they match after both have been transformed to lower case.

This protocol specifies two core packages: lichat and keyword. Symbols that come from the lichat package must be printed without the package name prefix. Symbols from the keyword package must be printed by their name only prefixed by a :. Every other symbol must be prefixed by the symbol's package's name followed by a :.

When a symbol is read, it is checked whether it exists in the corresponding package laid out by the previous rules. If it does not exist, it may be substituted for a placeholder symbol. Servers must take special care not to keep symbol objects they don't know around, to avoid letting clients overload the server's memory with inexistent symbols.

1.2 Objects

Special care must be taken when objects are read from the wire. An error must be generated if the object is malformed by either a non-symbol in the first place of its list, imbalanced key/value pairs in the tail, or non-keywords in the key position. An error must also be generated if the symbol at the first position does not name a class that is a subclass of update.

1.3 Null Characters

Null characters (U+0000) must not appear anywhere within a wireable. If a string were to contain null characters, they must be filtered out. If a symbol were to contain null characters, the message may not be put to the wire.

2. Server Objects

The server must keep track of a number of objects that are related to the current state of the chat system. The client may also keep track of some of these objects for its own convenience.

2.1 Connection

Each client is connected to the server through a connection object. Each connection in turn is tied to a user object. A user may have up to an implementation-dependant number of connections at the same time.

2.2 User

users represent participants on the chat network. A user has a globally unique name and a number of connections that can act as the user. Each user can be active in a number of channels, the maximal number of which is implementation-dependant. A user must always inhabit the primary channel. A user may have a profile object associated with it. When such a profile exists, the user is considered to be "registered." The server itself must also have an associated user object, the name of which is up to the specific server instance.

2.2.1 User Name Constraints

A user's name must be between 1 and 32 characters long, where each character must be from the Unicode general categories Letter, Mark, Number, Punctuation, and Symbol, or be a Space (U+0020). The name must not begin or end with with Spaces (U+0020), nor may two Spaces be consecutive. Two user names are considered the same if they are the same length and each code point matches case-insensitively.

2.3 Profile

The profile primarily exists to allow end-users to log in to a user through a password and thus secure the username from being taken by others. A profile has a maximal lifetime. If the user associated with the profile has not been used for longer than the profile's lifetime, the profile is deleted.

2.3.1 Password Constraints

A profile's password must be at least 6 characters long. It may contain any kind of character that is not Null (U+0000).

2.4 Channel

channels represent communication channels for users over which they can send messages to each other. A channel has a set of permission rules that constrain what kind of updates may be performed on the channel by whom. There are three types of channels that only differ in their naming scheme and their permissions.

2.4.1 Primary Channels

Exactly one of these must exist on any server, and it must be named the same as the server's user. All users that are currently connected to the server must inhabit this channel. The channel may not be used for sending messages by anyone except for system administrators or the server itself. The primary channel is also used for updates that are "channel-less," to check them for permissions.

2.4.2 Anonymous Channels

Anonymous channels must have a random name that is prefixed with an @. Their permissions must prevent users that are not already part of the channel from sending join, channels, users, or any other kind of update to it, thus essentially making it invisible safe for specially invited users.

2.4.3 Regular Channels

Any other channel is considered a "regular channel".

2.4.4 Channel Name Constraints

The names of channels are constrained in the same way as user names. See §2.2.1.

2.5 Permission Rules

A permission rule specifies the restrictions of an update type on who is allowed to perform the update on the channel. The structure is as follows:

RULE     ::= (type EXPR)
EXPR     ::= t | nil | EXCLUDE | INCLUDE
EXCLUDE  ::= (- username*)
INCLUDE  ::= (+ username*)

Where type is the name of an update class, and username is the name of a user object. t is the symbol T and indicates "anyone". nil is the symbol NIL and indicates "no one". The INCLUDE expression only allows users whose names are listed to perform the action. The EXCLUDE expression allows anyone except users whose names are listed to perform the action. The expression t is thus equivalent to (-) and the expression nil is equivalent to (+).

3. General Interaction

The client and the server communicate through update objects over a connection. Each such object that is issued from the client must contain a unique id. This is important as the ID is reused by the server in order to communicate replies. The client can then compare the ID of the incoming updates to find the response to an earlier request, as responses may be reordered or delayed. The server does not check the ID in any way-- uniqueness and avoidance of clashing is the responsibility of the client. Each update should also contain a clock slot that specifies the time of sending. This is used to calculate latency and potential connection problems. If no clock is specified, the server must substitute the current time. Finally, each update may contain a from slot to identify the sending user. If the from slot is not given, the server automatically substitutes the known username for the connection the update is coming from.

When an update is sent to a channel, it is distributed to all the users currently in the channel. When an update is sent to a user, it is distributed to all the connections of the user. When an update is sent to a connection, it is serialised to the wire according to the above wire format specification. The actual underlying mechanism that transfers the characters of the wire format to the remote host is implementation-dependant.

3.1 Null Termination of Updates

At the end of each update there has to be a single null character (U+0000). This character can be used to distinguish individual updates on the wire and may serve as a marker to attempt and stabilise the stream in case of malformed updates or other problems that might occur on the lower level.

4. Connection

4.1 Connection Establishment

After the connection between a client and a server has been established through some implementation-dependant means, the client must send a connect update. The update will attempt to register the user on the server, as follows:

  1. If the server cannot sustain more connections, a too-many-connections update is returned and the connection is closed.
  2. If the update's version denotes a version that is not compatible to the version of the protocol on the server, an incompatible-version update is returned and the connection is closed.
  3. If the update's from field is missing or NIL, the server substitutes a random name that is not currently used by any other user or registered profile.
  4. If the update's from field contains an invalid name, a bad-name update is returned and the connection is closed.
  5. If the update does not contain a password, and the from field denotes a username that is already taken by an active user or a registered user, an username-taken update is returned and the connection is closed.
  6. If the update does contain a password, and the from field denotes a username that is not registered, a no-such-profile update is returned and the connection is closed.
  7. If the update does contain a password, and the from field denotes a username that is registered, but whose password does not match the given one, an invalid-password update is returned and the connection is closed.
  8. If the server cannot sustain more connections for the requested user, a too-many-connections update is returned and the connection is closed.
  9. A user corresponding in name to the from field is created if it does not yet exist.
  10. The connection is tied to its corresponding user object.
  11. The server responds with a connect update of the same id as the one the client sent. The from field must correspond to the user's actual name.
  12. If the user already existed, the server responds with join updates for each of the channels the user is currently inhabiting, with the primary channel always being the first.
  13. If the user did not already exist, it is joined to the primary channel.

Should the user send a connect update after already having completed the connection handshake above, the server must drop the update and respond with an already-connected update.

4.2 Connection Maintenance

If the clock of an update diverges too much, the server may respond with a clock-skewed update and correct the timestamp. If the skew varies a lot, the server may drop the connection after replying with a connection-unstable update.

The server must receive an update on a connection within at least a certain implementation-dependant interval that must be larger than 100 seconds. If this does not happen, the server may assume a disconnection and drop the client after replying with a connection-unstable update. If the server does not receive an update from the client within an interval of up to 60 seconds, the server must send a ping update to the client, to which the client must respond with a pong update. This is to ensure the stability of the connection.

If the client sends too many updates in too short a time interval, the server may start dropping updates, as long as it responds with a too-many-updates update when it starts doing so. This throttling may be sustained for an implementation-dependant length of time. The client might send occasional ping requests to figure out if the throttling has been lifted. The server may also close the connection if it deems the flooding too severe.

4.3 Connection Closure

A connection may be closed either due to a disconnect update request from the client, or due to problems on the server side. When the connection is closed, the server must act as follows:

  1. The server responds with a disconnect update, if it still can.
  2. The underlying connection between the client and the server is closed.
  3. The connection object is removed from the associated user object.
  4. If the user does not have any remaining connections, the user leaves all channels it inhabited.

The exceptional situation being during connection establishment. If the server decides to close the connection then, it may do so without responding with a disconnect update and may immediately close the underlying connection.

5. Client Interaction

5.1 General Update Checks

An update is always checked as follows:

  1. If the update is not at all recognisable and cannot be parsed, a malformed-update update is sent back and the request is dropped.
  2. If the update is too long (contains too many characters), a update-too-long update is sent back and the request is dropped.
  3. If the class of the update is not known or not a subclass of wire-object, an invalid-update update is sent back and the request is dropped.
  4. If the from, channel, or target fields contain an invalid name, a bad-name update is sent back and the request is dropped.
  5. If the from field does not match the name known to the server by the user associated to the connection, a username-mismatch update is sent back and the request is dropped.
  6. If the channel field denotes a channel that does not exist, but must, a no-such-channel update is sent back and the request is dropped.
  7. If the target field denotes a user that does not exist, a no-such-user update is sent back and the request is dropped.
  8. If the update is an operation that is not permitted on its target channel, or the primary channel if no target channel is applicable, an insufficient-permissions update is sent back and the request is dropped.

5.2 Profile Registration

When a user sends a register update, the server must act as follows:

  1. If the server disagrees with the attempted registration, a registration-rejected update is sent back and the request is dropped.
  2. If the profile does not yet exist, it is created.
  3. The password of the profile associated to the user is changed to match the one from the update.
  4. The profile must stay live until at least 30 days after the user associated with the profile has existed on the server.
  5. The server responds by sending back the original register update.

Note that the server does not need to store the password verbatim, and is instead advised to only store and compare a hash of it.

5.3 Channel Creation & Management

Since a channel has only two bits of information associated with it, the management of channels is rather simple.

5.3.1 Creating a Channel

Creating a new channel happens with the create update:

  1. The update is checked for permissions by the primary channel.
  2. If a channel of the channel name in the update already exists, the server responds with a channelname-taken update and drops the request.
  3. If the channel field is NIL, an anonymous channel is created, otherwise a regular channel is created.
  4. The user is automatically joined to the channel.
  5. The server responds with a join update to the user with the id being the same as the id of the create update.
5.3.2 Updating a Channel

The channel's permissions can be viewed or changed with the permissions update, if the channel allows you to do so.

  1. The permissions for the channel are updated with the ones specified in the update's permissions field as follows:
    1. For each rule in the specified permissions set in the update:
    2. If the rule should be malformed or unacceptable, the server responds with a invalid-permissions update and disregards the rule.
    3. Otherwise, set the rule with the same type in the channel's rule set to the given rule.
  2. The server responds with a permissions update with the permissions field set to the full permissions set of the channel, and the id being the same as the id of the update the user sent.

See §2.5 for an explanation of the proper syntax of the permissions. Note that the server may reduce the set of rules to a simpler set that is semantically equivalent.

As a shortcut, permissions can also be managed with the grant and deny updates, which change an individual rule. When a server receives a grant update, it must update the corresponding rule as follows:

  1. If the rule is T, nothing is done.
  2. If the rule is NIL, it is changed to (+ user).
  3. If the rule is an exclusion mask, user is removed from the mask.
  4. If the rule is an inclusion mask, user is added to the mask if they are not already on it.

When the server receives a deny update, it must update the corresponding rule as follows:

  1. If the rule is T, it is changed to (- user).
  2. If the rule is NIL, nothing is done.
  3. If the rule is an exclusion mask, user is added to the mask if they are not already on it.
  4. If the rule is an inclusion mask, user is removed from the mask.

After processing either a grant or deny update successfully, the update is sent back to the user.

5.4 Channel Interaction

A user can interact with a channel in several ways.

5.4.1 Joining a Channel

Joining a channel happens with the join update, after which the server acts as follows:

  1. If the user is already in the named channel, an already-in-channel update is sent back and the request is dropped.
  2. The user is added to the channel's list of users.
  3. The user's join update is distributed to all users in the channel.
5.4.2 Leaving a Channel

Leaving a channel again happens with the leave update, after which the server acts as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. The user's leave update is distributed to all users in the channel.
  3. The user is removed from the channel's list of users.
5.4.3 Pulling a User

Another user can be pulled into the channel by the pull update, after which the server acts as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. If the target user is already in the named channel, an already-in-channel update is sent back and the request is dropped.
  3. The target user is added to the channel's list of users.
  4. A join update for the target user with the same id as the pull update is distributed to all users in the channel.
5.4.4 Kicking a User

Another user can be kicked from a channel by the kick update, after which the server acts as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. If the target user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  3. The user's kick update is distributed to all users in the channel.
  4. A leave update for the target user is distributed to all users in the channel.
  5. The target user is removed from the channel's list of users.
5.4.5 Sending a Message

Finally, a user can send a message to all other users in a channel with the message update, after which the server acts as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. The user's message update is distributed to all users in the channel.

5.5 Server Information Retrieval

The server can provide a client with several pieces of information about its current state.

5.5.1 Listing Public Channels

Retrieving a list of channels can be done with the channels update, after which the server acts as follows:

  1. For each channel known to the server, the server checks the update against the channel's permissions.
  2. If the permissions allow the update, the channel's name is recorded.
  3. A channels update with the same id as the request is sent back with the channels field set to the list of names of channels that were recorded.
5.5.2 Listing All Users of a Channel

The list of users currently in a channel can be retrieved by the users update, after which the server acts as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. A list of the users in the channel is recorded.
  3. A users update with the same id as the request is sent back with the users field set to the list of names of users that were recorded.
5.5.3 Requesting Information About a User

Information about a particular user can be retrieved by the user-info update, after which the server acts as follows:

  1. If the user is not connected and no profile for the user exists, a no-such-user update is sent back and the request is dropped.
  2. A user-info update with the same id as the request is sent back with the connections field set to the number of connections the user object has associated with it and with the registered field set to T if the user has a profile associated with it.
5.5.4 Requesting Capabilities

A user can request a list of updates they are allowed to send to a particular channel using the capabilities update. The server must act as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. For every update type known to the server, the server checks whether the user is permitted according to the channel's permission rule for the update. If permitted, the update type is added to a list.
  3. A capabilities update with the same id as the request is sent back with the permitted field set to the list of updates gathered in step 2.
5.5.5 Requesting Private Information

Servers may store additional information about a user, such as statistics, IP addresses, and so forth. Such information can be requested through the server-info update. After receiving such an update, the server must act as follows:

  1. If the user is not connected and no profile for the user exists, a no-such-user update is sent back and the request is dropped.
  2. A server-info update with the same id as the request is sent back with the attributes field set to an "association list", and the connections field set to a list of "association lists", one such "association list" per connection the user has. An association list is a list where each element has the following structure:

The attributes being returned are dependent on the server and the supported protocol extensions. The set of returned attributes may also differ depending on the user being requested, especially if the user is the server's user.

The following attributes are specified:

The following connection attributes are specified:

While these attributes are specified in their purpose, a server does not have to return them.

6. Protocol Extension

A server or client may provide extensions to the protocol in the following manners:

Each extension to the protocol should receive a unique name of the form producer-name where producer is an identifier for who wrote up the extension's protocol, and name should be a name for the extension itself. For each extension that a server and client support, they must include the unique name of it as a string in the connect update's extensions list. Each producer also owns a symbol package with the producer's name, in which they may freely specify new symbols.

7. Protocol Extensions

The extensions outlined in this section are not mandatory and a server or client may choose not to implement them.

7.1 Backfill (shirakumo-backfill)

Purpose: allow users to catch up with the contents of a channel should they initiate a new connection which does not currently have access to all the past updates of the channel.

In order to facilitate this, the server is forced to keep copies of the updates. The server is allowed to only keep updates for a certain duration, or only a certain number of total updates. In order to avoid spying, the server must not distribute updates that the user did not already receive previously through another connection. The server does not have to make any guarantee about the order in which the updates are sent back to the connection. The client on the other side is responsible for ordering them as appropriate according to the clock.

A new update type called backfill is introduced, which is a channel-update. If the server receives such an update from a connection, it reacts as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. Following this, updates are sent back to the connection the update came from. These updates should include all updates that were distributed to users in the channel, spanning from now to an arbitrary point in time that is at most when the user of this connection last joined the channel. The fields of the updates must be the equal to the first time the update was sent out. The initial event of the user that requested the backfill joining the channel cannot be sent back.

7.2 Data (shirakumo-data)

Purpose: allows distributing images and other binary payloads.

A new update type called data is introduced, which is a channel-update. Additionally, a new failure type called bad-content-type is introduced, which is an update-failure. If the server receives a data update from a connection, it reacts as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. If the update's content-type is not accepted by the server, a bad-content-type update is sent back and the request is dropped.
  3. The user's data update is distributed to all users in the channel.

The data update contains three slots, with the following intentions:

7.3 Emotes (shirakumo-emotes)

Purpose: introduces server-side emoticons that are distributed to all users for use on the client-side.

Two new update types called emotes and emote are introduced. If the server receives an emotes update from a connection, it reacts as follows:

  1. The server computes a set difference between the known emote names, and the names listed in the event's names slot. Emote names are case-insensitive.
  2. For each emote in the calculated set, the server sends back an emote update, where the name is set to the emote's name, and the payload is set to the base-64 encoded image representing the emote. The content-type must be set accordingly.

When the client receives an emote update from the server, it reacts as follows:

  1. The payload and content-type are associated with the name and persisted on the client. When the client sends an emotes event it to the server it should include the name of this emote in the names list.

The emotes update contains one slot, with the following intentions:

The emote update contains three slots, with the following intentions:

When the client sees a message update, every match of the regex :([^:]+): in the text where the group matched by the regex is the name of an emote from the known list of emotes, then the match of the regex should be displayed to the user by an image of the emote's image.

7.4 Edit (shirakumo-edit)

Purpose: allows users to make retroactive edits to their messages.

A new update type called edit is introduced, which is a message. If the server receives an edit update it acts in the same way as a regular message event. No additional support from the server is required outside of recognising and accepting the type.

When the client sees an edit update, it should change the text of the message update with the same from and id fields to the one from the edit update. Ideally a user interface for Lichat should also include an indication that the previous message event has been changed, including perhaps even a history of all the potential edits of a message.

If the client receives an edit update whose id and from fields do not refer to any previous message update, the client should simply ignore the update.

7.5 Channel Trees (shirakumo-channel-trees)

Purpose: enforces a structure on channels and allows creating channel hierarchies for easier grouping.

A new convention for channel names is introduced. §2.4.4 is restricted further in the following manner: forward slash characters (U+002F) may only occur between two other characters that are not a forward slash character.

Generally for a channel-update, the following terminology is introduced: the parent channel is a channel with the name of the current channel up to and excluding the last forward slash character in the name. If no forward slash occurs in the name, the primary channel is considered the parent channel.

A new error no-such-parent-channel is introduced. It is an update-failure.

§5.3.1 is modified as follows: instead of point 1: If the parent channel does not exist, the server responds with a no-such-parent-channel update and drops the request. If the parent channel exists, the update is checked for permissions by the parent channel.

§5.5.1 is modified as follows: the channels update is upgraded to a channel-update and as such contains a channel field. When processing the channels update, the server should only process channels whose names begin with the name mentioned in the channel field followed by a forward slash and do not contain any further forward slashes.

Specifically, an update requesting foo should list foo/bar, but not foo/bar/baz.

Clients that support this extension are required to implement the following special semantic: if a user uses a command that requires a channel name, and the user begins the channel name with a forward slash, the client should automatically prepend the current channel name to the specified channel name, if there is a channel that is considered "current". If no channel is explicitly current, the primary channel is considered current.

7.6 Channel Info (shirakumo-channel-info)

Purpose: allows associating metadata with channels such as the set of rules, a topic, and so forth.

Channels receive extra metadata fields that can be set set by users. To this end, channels must keep a table of metadata to track. The server must restrict the valid keys in that table, and may restrict the content of values associated with each key. The following keys must always be available, with the specified intended purposes:

A new update called channel-info is introduced. It is a channel-update and holds a keys field that can either be T or a list of keys as symbols describing the info to fetch.

A new update called set-channel-info is introduced. It is a channel-update and a text-update, and holds a key field that must be a symbol describing the info to set.

A new error no-such-channel-info is introduced. It is an update-failure and contains the additional field key, which must hold a symbol.

A new error malformed-channel-info is introduced. It is an update-failure.

When the server receives a channel-info update, it must react as follows:

  1. For each of the requested keys, the server reacts as follows:
  2. If the key does not exist, the server replies with a no-such-channel-info failure with the according key set, and the id set to the id of the original update.
  3. Otherwise, the server replies with a set-channel-info update with the same id as the request, key set to the current key being requested, and text being set to the key's value.

When the server receives a set-channel-info update, it must react as follows:

  1. If the specified key is not accepted by the server, it replies with a no-such-channel-info error and drops the update.
  2. If the specified text is not of the correct format for the given key, it replies with a malformed-channel-info error and drops the update.
  3. The internal channel metadata is updated to associate the given key with the given text.
  4. The user's set-channel-info update is distributed to all users in the channel.

7.7 Server Management (shirakumo-server-management)

Purpose: adds capabilities for administrative actions like deleting users and channels.

The server now holds an additional property, a blacklist, which is a set of usernames.

§4.1 is modified to include the following step after §4.1.4 (Checking for name validity):

  1. If the name is part of the blacklist set, a too-many-connections update is returned and the connection is closed.

A new update called kill is introduced. It is a target-update. When the server receives a kill update, it must react as follows:

  1. If there is no user with a name corresponding to the target, the server replies with a no-such-user error and drops the update.
  2. The user is removed from all channels it is in.
  3. All connections the user is associated with are disconnected.
  4. The update is sent back to the user.

A new update called destroy is introduced. It is a channel-update. When the server receives a destroy update, it must react as follows:

  1. Unlike standard updates, the permission for the update must be checked against the primary channel, rather than the channel the update is targeting.
  2. If there is no channel with a name corresponding to the channel, the server replies with a no-such-channel error and drops the update.
  3. A leave update for the channel is sent to every user in the channel.
  4. The channel is removed.
  5. The update is sent back to the user.

A new update called ban is introduced. It is a target-update. When the server receives a ban update, it must react as follows:

  1. The target is added to the blacklist set.
  2. If a user with the target name is present, the user is removed from all channels it is in.
  3. All connections the user is associated with are disconnected.
  4. The update is sent back to the user.

A new update called unban is introduced. It is a target-update. When the server receives an unban update, it must react as follows:

  1. The target is removed from the blacklist set.
  2. The update is sent back to the user.

7.8 Pause (shirakumo-pause)

Purpose: allows throttling high traffic channels to prevent frequent spam by users.

Channels have a new property, a "pause", as well as a "last update list". Delivery of any channel-update is modified as follows:

  1. If the from field of the update denotes a user whose entry in the "last update list" is a timestamp that's closer to the current timestamp than the channel's "pause", the server responds with a too-many-updates error and drops the update.
  2. The current timestamp is placed into the user's entry in the "last update list".

The "pause" is noted in seconds and has a default value of 0. The "last update list" has a default timestamp of 0 for users without an entry.

§5.4.1 (joining of a channel) is modified by adding the following extra step at the end:

  1. If the channel's "pause" property is greater than zero, a pause update is sent to the user with the by field set to the "pause" time.

A new update called pause is introduced. It is a channel-update and has an additional field called by, which must contain an integer in the range [0,infinity[. When the server receives a pause update, it must react as follows:

  1. The channel's "pause" is set to "by".
  2. The update is distributed to all users in the channel.

7.9 Quiet (shirakumo-quiet)

Purpose: allows placing users onto a quiet list that prevents them from reaching any other users.

Channels have a new property, a "quiet list". Delivery of any channel-update is modified as follows:

  1. If the from field of the update denotes a user that is on the "quiet list", the update is sent back to that user, but not delivered to the rest of the channel.
  2. Otherwise delivery proceeds as normal.

A new update called quiet is introduced. It is a target-update and a channel-update. When the server receives a quiet update, it must react as follows:

  1. The target user is placed onto the "quiet list" of the channel.
  2. The update is sent back to the user.

A new update called unquiet is introduced. It is a target-update and a channel-update. When the server receives an unquiet update, it must react as follows:

  1. The target user is removed from the "quiet list" of the channel.
  2. The update is sent back to the user.

7.10 IP (shirakumo-ip)

Purpose: exposes IP address information and allows management of IPs.

Connections now have an additional property, the ip, which must be an IPv6 address. If the connection is established over IPv4, the ip should nevertheless be the IPv6 representation of this address.

The server has an additional property, an ip-blacklist, which is a set of IP addresses and masks as described below.

§4.1 is modified to include the following step before all others:

  1. If the IP address the connection is coming from matches one from the ip-blacklist, the connection is immediately dropped.

An IP address a is considered the "same" as an IP address b under the mask m, if the bitwise AND of a and b with the bitwise inversion of m equals the same (a & !m == b & !m). The purpose of the mask is to allow addressing entire subnets.

A new update called ip-ban is introduced. It holds the required field ip and the optional field mask. If mask is not given, it should be assumed to be an IP address that is all 1s. Both the ip and mask field must be strings in either IPv4 or IPv6 format. When the server receives an ip-ban update, it must react as follows:

  1. If either ip or mask do not designate IPv4 or IPv6 addresses, a bad-ip-format failure is sent and the update is dropped.
  2. Scan through the existing ip-blacklist and for each:
    1. if the IP matches ip under mask:
      1. if the mask is greater (thus more general) than mask, the update is dropped
      2. otherwise the entry is removed.
  3. The entry of ip and mask is added to the blacklist.
  4. Any connection matching the new entry is dropped.
  5. The update is sent back to the user.

A new update called ip-unban is introduced. It holds the same fields as ip-ban. When the server receives an ip-unban update, it must react as follows:

  1. Scan through the existing ip-blacklist and for each:
    1. if the IP matches ip under mask:
      1. if the mask is greater than or equal to mask, the entry is removed.
  2. The update is sent back to the user.

A new connection attribute called shirakumo:ip is introduced, which is a string showing the IP address from which the connection originates.

7.11 Bridge (shirakumo-bridge)

Purpose: allows bridging chat channels from external services by sending messages on behalf of other users.

A new, optional field :bridge is added to all channel-updates. Handling of channel-updates is modified as follows, after the check of §5.1.6 (channel existence check):

  1. If the bridge field is set:
    1. If the user is not in the channel, a not-in-channel failure is sent back and the update is dropped.
    2. If the user does not have the permission to send a bridge update in the channel, an insufficient-permissions failure is sent back and the update is dropped.
    3. The values of the bridge and from fields are swapped.
    4. If the update would be delivered to all members of the channel ignoring all validity checks (it is not an update made for side-effects), then the update is sent to all members of the channel.
    5. The update is dropped.

The server may choose to discard the bridge field for any number of update types, but must in the very least support message.

A new update called bridge is introduced. It is a channel-update. When the server receives a bridge update, it must react as follows:

  1. The update is sent back to the user.

7.12 Link (shirakumo-link)

Purpose: allows storing data server-side to deliver it in a more efficient out-of-band fashion.

Clients and servers implementing this extension must also implement the shirakumo-data extension.

A new update called link is introduced. It is a data update. Unlike the data update however, its payload field contains a URL in string form.

When the server receives a data update, it must instead of §7.2.3 (distributing the update) act as follows:

  1. The data payload is saved somewhere, such that it is publicly accessible through an HTTP or HTTPS URL.
  2. The data update is converted into a link update, with the payload field set to the public URL.
  3. The new link update is distributed to the users of the channel.

The server may opt to make saved data payloads inaccessible after a time. The server should take care to generate URLs for the data payloads that are not guessable, which is to say a user cannot reliably generate URLs to access a payload. The server must serve the payload with the requested content-type set, and the content-disposition header set to include the requested filename in the update.

When the client receives a link update, it must, as far as possible, embed the linked payload to display it directly. If it cannot display the payload directly, it may instead display the URL to which the link points.

7.13 Markup (shirakumo-markup)

Purpose: allows using different markup languages to stylise the text in text-updates.

text-updates all receive the following additional fields:

When a client receives a text-update it should check the markup field and determine whether it supports rendering the given format. If it is supported, the client should render the text according to the rich contents instead of the text contents. The client may ignore parts of the rich text if it considers the markup unsuitable. If the markup contains errors, the client must fall back to displaying the unformatted text instead.

The following markup formats are officially recognised, though others may be used:

7.14 User Info (shirakumo-user-info)

Purpose: allows associating additional information with registered user accounts.

Profiles receive extra metadata fields that can be set set by users. To this end, profiles must keep a table of metadata to track. The server must restrict the valid keys in that table, and may restrict the content of values associated with each key. The following keys must always be available, with the specified intended purposes:

The user-info update is changed to now hold an optional info field that is an association list.

A new update called set-user-info is introduced. It is a text-update. It holds a key field that must be a symbol describing the info to set.

A new error no-such-user-info is introduced. It is an update-failure and contains the additional field key, which must hold a symbol.

A new error malformed-user-info is introduced. It is an update-failure.

When the server receives a user-info update, it must react as follows, in addition to the standard behaviour described in §5.5.3:

  1. If the target user is not registered, this section is ignored.
  2. For each user info key on the user's profile:
    1. A list composed of the key and the value of the field are added to the info field of the user-info reply.

When the server receives a set-user-info update, it must react as follows:

  1. If the target user is not registered, the server replies with a no-such-profile failure and drops the update.
  2. If the specified key is not accepted by the server, it replies with a no-such-user-info error and drops the update.
  3. If the specified text is not of the correct format for the given key, it replies with a malformed-user-info error and drops the update.
  4. The internal user metadata is updated to associate the given key with the given text.
  5. The set-user-info update is sent back.

7.15 Shared Identity (shirakumo-shared-identity)

Purpose: allows creating tokens that let other users post updates on behalf of another (registered) user account.

User profiles now have an additional field, a "lending map", which is a map associating keys (strings of at least 16 characters in length) to other usernames, and an "identities list", which is a list of usernames they can send updates on behalf of.

§5.1.5 (from field check) is modified as follows:

  1. If the from field is in the connection's associated profile's "identities list" the from field check is elided.

A new update called share-identity is introduced. When the server receives a share-identity update, it must react as follows:

  1. If the user is not registered, a no-such-profile failure is sent back and the update is dropped.
  2. If the profile already has too many identity shares, an identity-already-used failure is sent back and the update is dropped.
  3. A new random key is generated and associated with nil in the profile's lending map.
  4. The update is sent back with the key field set to the newly generated key.

A new update called unshare-identity is introduced. When the server receives an unshare-identity update, it must react as follows:

  1. If the user is not registered, a no-such-profile failure is sent back and the update is dropped.
  2. If the key is not set, the profile's lending map is emptied and the user's name is removed from all identities lists.
  3. Otherwise, the entry corresponding to the key is removed from the profile's lending map, and the user's name is removed from the identities list of the user who redeemed the key.
  4. The update is sent back.

A new update called list-shared-identities is introduced. When the server receives a list-shared-identities update, it must react as follows:

  1. If the user is not registered, a no-such-profile failure is sent back and the update is dropped.
  2. For every entry in the profile's lending map, the server gather's the key, as well as the username the associated connection is from (or nil if the key is not associated yet) into a list as for example:
    (("aoeubcoeusasoet425" "test") ("aoestuhau245757Saoeus" NIL))
    
  3. The update is sent back, with the shares field set to the gathered list, and the identities field set to the user's identities list.

A new update called assume-identity is introduced. It is a target-update. When the server receives an assume-identity update, it must react as follows:

  1. If the user is not registered, a no-such-profile failure is sent back and the update is dropped.
  2. If the target is already on the identities list of the profile, or the user is the target, an identity-already-used failure is sent back and the update is dropped.
  3. If the key in the update is either not in the target profile's lending map, or the key is not associated with nil, an identity-already-used failure is sent back and the update is dropped.
  4. The originating user is associated with the key in the target profile's map of shares, and the target is added to the originating profile's identities list.
  5. The update is sent back to the originating connection.

7.16 Icons (shirakumo-icons)

Purpose: allows associating icons with channels and users.

This extension requires the shirakumo-channel-info or shirakumo-user-info extensions.

For channels and users, a new key type is introduced:

The server may reject images that are too large in dimension, or have a bad content-type. The server must in the very least support image/png and image/gif as content-types.

7.17 Signing (shirakumo-sign)

Purpose: allows users to sign their messages with a PGP signature to ensure authenticity of the message.

updates now have an additional field, signature. The signature is computed based on the following utf-8 representation of updates:

UPDATE   ::= OBJECT NULL
OBJECT   ::= '(' SYMBOL (SPACE KEYWORD SPACE EXPR)* ')'
EXPR     ::= STRING | LIST | SYMBOL | NUMBER
STRING   ::= '"' ('\' '"' | '\' '\' | !('"' | NULL))* '"'
LIST     ::= '(' (EXPR (SPACE EXPR)*)? ')'
SYMBOL   ::= KEYWORD | NAME | NAME ':' NAME
KEYWORD  ::= ':' NAME
NUMBER   ::= '0..9'+ ( '.' '0..9'*)?
NAME     ::= ('\' '\' | '\' TERMINAL | !(TERMINAL | NULL))+
TERMINAL ::= (':' | ' ' | '"' | '.' | '(' | ')')
SPACE    ::= U+0020
NULL     ::= U+0000

This is equivalent to the standard wire format structure and the recommended way of printing, but enforces single space between tokens, no use of backslash escapes unless necessary, and forces a leading digit on numbers, essentially eliminating all ambiguities in the syntax. Additional constraints on printing the update's fields apply:

As an example, printing a standard message update would look as follows:

(message :channel "test" :clock 424742 :id 0 :from "tester" :text "something")

When the server receives a message with the signature field set, the following constraints apply to §5.1:

After the signature has been computed from the printed representation, the client should attach it to the signature field of the update and send it to the server. Clients may then verify the signature using the PGP public key of the user, if known. It is recommended for clients that support this extension to give a visual indicator for signed updates, especially if the signature verification should fail.

A user's pgp key may be retrieved out of band, or using the shirakumo-user-info :public-key field if available.

7.18 History (shirakumo-history)

Purpose: allows users to search through the history of a channel to find relevant messages.

In order to facilitate this, the server must now keep updates in storage, potentially indefinitely. The server is only required to keep updates of type message, but may keep other updates of type channel-update as well. Of each update stored, the server must store at least the fields id, from, clock, and channel. It may store additional fields, and it may also drop them. This means that the server is not required to fully keep update identity.

A new update type called search is introduced. It is a channel-update, and holds three additional fields, results, offset, and query. The query field must hold a list of initargs, meaning alternating symbols and values to describe the keys to match. When the server receives a search update, it must proceed as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. It gathers a list of all recorded updates that were posted to the channel specified in the search update.
  3. For each update in the list:
    1. The query field is compared against the update by comparing each initarg in the query to the corresponding field in the update, based on the field's type:
      • time: The query value must be a list of two elements, being either T or a time value, with T being "any time". The first element designates the lowest possible time to match, and the second the highest possible time to match. This thus designates a range of time values, with the bounds being inclusive.
      • number: The query value must be a number, and is compared to the candidate value by a standard number equality test.
      • symbol: The query value must be a symbol, and matches if the candidate is the same symbol.
      • list: The query value must be another list, and matches the candidate if all of the elements of the query appear in the candidate list, regardless of order. Elements are compared recursively.
      • string: The query value must be a list of strings, each of them designating a matching spec:
        MATCH        ::= CHAR*
        CHAR         ::= ESCAPED | ANY | NONE-OR-MORE | character
        ESCAPED      ::= '\' character
        ANY          ::= '_'
        NONE-OR-MORE ::= '*'
        
        Where ANY stands for any particular character, and NONE-OR-MORE stands for an arbitrary number of arbitrary characters. When matching a single "character" with ANY, the Unicode Collation Algorithm rules must be followed. The query value matches if at least one of its strings matches.
    2. Should any of the fields not match, the update is removed from the list.
  4. The list of updates is sorted in order of their clock with the lowest being first.
  5. The first N updates are dropped off the list, where N corresponds to number in the offset field. If offset is not specified, 0 is assumed.
  6. The first N updates are kept and the rest dropped off the list, where N is an internal server limit, which must be at least 50.
  7. The list of updates is split into multiple lists such that each list can be reliably sent back to the user.
  8. For each list of updates, the list is put into the search update's results field and the update is sent back.

The server should provide a means to delete updates from its history to ensure confidential and private information can be removed and is not preserved indefinitely. If the search update has a permission of NIL (being denied to everyone) in a channel, the history does not need to be recorded. If a channel expires, its history must be deleted.

The client should provide a convenient means to perform a search query. To this end we also specify a suggested means of formatting queries for end-user input. The query should be specified as freeform text, with the following queryspec format:

QUERY    ::= (FIELD | TOKEN)+
FIELD    ::= WORD ':' TOKEN
TOKEN    ::= STRING | WORD
STRING   ::= '"' ('\' char | !'"') '"'
WORD     ::= (!TERMINAL)+
TERMINAL ::= ':' | ' ' | '"'

Where a FIELD specifies a specific field to match in an update, with the WORD designating the initarg and the TOKEN the value. Special 'virtual fields' should be added:

The TOKEN should be parsed according to the standard wire format, unless more specific and convenient ways of specifying a fitting value are available. Each TOKEN than is not part of a FIELD, should designate a matching spec to be part of the list of matching specs for the text field.

In other words, the following queryspec:

from:tester after:2020-01-01 this "that is" in:test

Should be translated into a search update like this:

(search
 :id 0
 :channel "test"
 :query (:from "tester"
         :clock (3786825600 T)
         :text ("this" "that is")))

The client should also offer an easy way to page through the results using the offset field. The end of the paging may be detected should the server ever return less than 50 results.

If the server also supports the shirakumo-backfill extension, it may deliver backfill using the history, even if users were not previously in the channel. This poses a privacy risk, but as search is not otherwise restricted anyway, it makes no difference.

7.19 Block (shirakumo-block)

Purpose: allows users to block other users, preventing seeing their updates. Having this property server-side instead of client-side means it is automatically persisted and synchronised.

Profiles now have a new field: a block list. This is a list of usernames.

Whenever an update is distributed over a channel, the following behaviour must be followed:

  1. For each (target) user in the channel:
  2. If the user noted in the from field of the update is not the block list of the target user's profile:
  3. The update is sent to all connections associated with the target user.

A new update type called block is introduced. It is a target-update. When the server receives a block update, it must react as follows:

  1. If the user is not registered, the server replies with a no-such-profile failure and drops the update.
  2. The username from the target field is added to the profile's block list if it isn't present already.
  3. The update is sent back to the user.

A new update type called unblock is introduced. It is a target-update. When the server receives an unblock update, it must react as follows:

  1. If the user is not registered, the server replies with a no-such-profile failure and drops the update.
  2. The username from the target field is removed to the profile's block list.
  3. The update is sent back to the user.

7.20 Reactions (shirakumo-reactions)

Purpose: allows users to react to messages without sending a new message.

This requires clients to implement unique IDs when sending an update. They do not need to be globally unique, but should be unique to that user, regardless of connection used.

A new update type called react is introduced. It is a channel-update and carries the additional fields update-id, target, and emote. update-id must be an id used in a message previously sent by the target user in the channel. emote must either be unicode characters from the emoji block, or if the shirakumo-emote extension is supported, the name of an emote.

When the server receives a react update, it must act as follows:

  1. If the user is not in the named channel, a not-in-channel update is sent back and the request is dropped.
  2. If the emote does not contain valid text as noted above, a malformed-update failure is sent back and the update is dropped.
  3. The user's react update is distributed to all users in the channel.

For each visible update the client should now keep track of a table of reactions from emotes to lists of users that used the emote on the referenced update. When the client receives a react update, it should update the table as follows:

  1. If the emote is not in the table yet, a new entry is added, associated to an empty list.
  2. If the from user is not in the list of users, the user is added to it. Otherwise the user is removed from it.
  3. The table of emotes is displayed in the vicinity of the referenced update as a list of emotes and counts of users having used said emote. If applicable, the list of users having used the emote should also be displayed via a hover action.

If a react update references an update that is not known to the client, it is ignored.

7.21 Replies (shirakumo-replies)

Purpose: allows specifying another message that a message is in reply to.

This requires clients to implement unique IDs when sending an update. They do not need to be globally unique, but should be unique to that user, regardless of connection used.

A new field is added to the message update: reply-to. The field should hold a list of two values, a username and an id, identifying the message this message is in reply to.

The server does not have to do anything special aside from transmitting the field.

When the client receives a message update with the reply-to field set, it should display the message in relation to the original message, by quoting it or linking back to it in some manner.

8 General Conventions

The following are general conventions for server and client implementors. However, they are not mandatory to follow, as they may only make sense for certain types of implementations.

The default port when served over TCP should be 1111, with 1112 being the default for SSL connections.

When specified in URLs, Lichat takes the lichat protocol and follows this general scheme: lichat://host:port/channel#id Meaning the URL path (if given) is used as the name for a channel to join. The URL fragment can be used to specify a specific message id. Note that it is the client's responsibility to ensure that the ID is sufficiently unique so that the URL will link to the correct message. The query part of the URL may be used for client-specific purposes.

See Also


Next: , Previous: , Up: Top   [Contents][Index]

2 Systems

The main system appears first, followed by any subsystem dependency.


Previous: , Up: Systems   [Contents][Index]

2.1 lichat-protocol

Maintainer

Nicolas Hafner <shinmera@tymoon.eu>

Author

Nicolas Hafner <shinmera@tymoon.eu>

Home Page

https://Shirakumo.github.io/lichat-protocol/

Source Control

(:git "https://github.com/shirakumo/lichat-protocol.git")

Bug Tracker

https://github.com/Shirakumo/lichat-protocol/issues

License

zlib

Description

The independent protocol part of Lichat.

Version

1.5

Dependencies
Source

lichat-protocol.asd (file)

Components

Next: , Previous: , Up: Top   [Contents][Index]

3 Files

Files are sorted by type and then listed depth-first from the systems components trees.


Previous: , Up: Files   [Contents][Index]

3.1 Lisp


Next: , Previous: , Up: Lisp files   [Contents][Index]

3.1.1 lichat-protocol.asd

Location

lichat-protocol.asd

Systems

lichat-protocol (system)


Next: , Previous: , Up: Lisp files   [Contents][Index]

3.1.2 lichat-protocol/package.lisp

Parent

lichat-protocol (system)

Location

package.lisp

Packages

lichat-protocol


Next: , Previous: , Up: Lisp files   [Contents][Index]

3.1.3 lichat-protocol/conditions.lisp

Dependency

package.lisp (file)

Parent

lichat-protocol (system)

Location

conditions.lisp

Exported Definitions
Internal Definitions

Next: , Previous: , Up: Lisp files   [Contents][Index]

3.1.4 lichat-protocol/printer.lisp

Dependency

conditions.lisp (file)

Parent

lichat-protocol (system)

Location

printer.lisp

Exported Definitions

print-sexpr (function)

Internal Definitions

Next: , Previous: , Up: Lisp files   [Contents][Index]

3.1.5 lichat-protocol/reader.lisp

Dependency

printer.lisp (file)

Parent

lichat-protocol (system)

Location

reader.lisp

Exported Definitions
Internal Definitions

Next: , Previous: , Up: Lisp files   [Contents][Index]

3.1.6 lichat-protocol/typed-slot-class.lisp

Dependency

reader.lisp (file)

Parent

lichat-protocol (system)

Location

typed-slot-class.lisp

Internal Definitions

Next: , Previous: , Up: Lisp files   [Contents][Index]

3.1.7 lichat-protocol/protocol.lisp

Dependency

typed-slot-class.lisp (file)

Parent

lichat-protocol (system)

Location

protocol.lisp

Exported Definitions
Internal Definitions

Next: , Previous: , Up: Lisp files   [Contents][Index]

3.1.8 lichat-protocol/wire.lisp

Dependency

protocol.lisp (file)

Parent

lichat-protocol (system)

Location

wire.lisp

Exported Definitions

Previous: , Up: Lisp files   [Contents][Index]

3.1.9 lichat-protocol/documentation.lisp

Dependency

wire.lisp (file)

Parent

lichat-protocol (system)

Location

documentation.lisp


Next: , Previous: , Up: Top   [Contents][Index]

4 Packages

Packages are listed by definition order.


Previous: , Up: Packages   [Contents][Index]

4.1 lichat-protocol

Source

package.lisp (file)

Nickname

org.shirakumo.lichat.protocol

Use List

common-lisp

Exported Definitions
Internal Definitions

Next: , Previous: , Up: Top   [Contents][Index]

5 Definitions

Definitions are sorted by export status, category, package, and then by lexicographic order.


Next: , Previous: , Up: Definitions   [Contents][Index]

5.1 Exported definitions


Next: , Previous: , Up: Exported definitions   [Contents][Index]

5.1.1 Special variables

Special Variable: *default-anonymous-channel-permissions*

Default permissions for anonymous channels.

Package

lichat-protocol

Source

protocol.lisp (file)

Special Variable: *default-channel-lifetime*

The default lifetime for a new channel in seconds.

Should equal to one standard month (30 days).

Package

lichat-protocol

Source

protocol.lisp (file)

Special Variable: *default-primary-channel-permissions*

Default permissions for primary/server channels.

Package

lichat-protocol

Source

protocol.lisp (file)

Special Variable: *default-profile-lifetime*

The default lifetime for a registered profile in seconds.

Should equal to one non-leap year.

Package

lichat-protocol

Source

protocol.lisp (file)

Special Variable: *default-regular-channel-permissions*

Default permissions for non-primary, non-anonymous channels.

Package

lichat-protocol

Source

protocol.lisp (file)

Special Variable: *id-counter*

Counter variables for update IDs.

Starts at a random integer between 0 and the current universal-time. This is done to make the clashing of IDs less likely to occur between users of the protocol library.

See NEXT-ID

Package

lichat-protocol

Source

protocol.lisp (file)


Next: , Previous: , Up: Exported definitions   [Contents][Index]

5.1.2 Macros

Macro: define-protocol-class NAME DIRECT-SUPERCLASSES DIRECT-SLOTS &rest OPTIONS

Defines a new protocol class.

See DEFINE-TYPED-CLASS

Package

lichat-protocol

Source

protocol.lisp (file)


Next: , Previous: , Up: Exported definitions   [Contents][Index]

5.1.3 Functions

Function: channelname-p NAME

Returns true if the given name is a valid name for channels.

See USERNAME-P

Package

lichat-protocol

Source

protocol.lisp (file)

Function: check-update-options SEXPR

Checks the given sexpr for conformity to use as initargs for an update.

The items after the first symbol in the list are checked
as follows: they must be balanced pairs of KEYWORD to
atom. If this is not the case, an error of type MALFORMED-WIRE-OBJECT is signalled. If no key :ID is
found, an error of type MISSING-ID is signalled. If no
key :CLOCK is found, an error of type MISSING-CLOCK is
signalled.

See FROM-WIRE
See MISSING-ID
See MISSING-CLOCK
See MALFORMED-WIRE-OBJECT

Package

lichat-protocol

Source

wire.lisp (file)

Function: from-wire STREAM &optional LIMIT

Read a wire object from the stream.

First an object is read from stream by READ-SEXPR. If the returned object is not a cons, it is returned immediately. Otherwise, the procedure is as follows: The first element must be a symbol. If it isn’t, an error of type MALFORMED-WIRE-OBJECT is signalled. If the symbol does not designate a class, or designates a class that is not a subclass of WIRE-OBJECT, an error of type UNKNOWN-WIRE-OBJECT is signalled. If the class is a subclass of UPDATE, the rest of the items in the list are checked by CHECK-UPDATE-OPTIONS. Finally MAKE-INSTANCE is called with the full expression as arguments. If the class is a subclass of wire-object, MAKE-INSTANCE is called with the full expression as arguments immediately.

See READ-SEXPR
See MALFORMED-WIRE-OBJECT
See UNKNOWN-WIRE-OBJECT
See CHECK-UPDATE-OPTIONS

Package

lichat-protocol

Source

wire.lisp (file)

Function: id-p ID

Returns true if the given object is a valid ID.

Package

lichat-protocol

Source

protocol.lisp (file)

Function: next-id ()

Returns a fresh ID.

See *ID-COUNTER*

Package

lichat-protocol

Source

protocol.lisp (file)

Function: password-p PASS

Returns true if the given object is a string of at least six characters.

Package

lichat-protocol

Source

protocol.lisp (file)

Function: print-sexpr SEXPR STREAM

Print an s-expression to the stream.

Only the following types are allowed:
LIST STRING REAL SYMBOL
Any other type will signal an error of type UNPRINTABLE-OBJECT.

See PRINT-SEXPR-LIST
See PRINT-SEXPR-STRING
See PRINT-SEXPR-NUMBER
See PRINT-SEXPR-SYMBOL
See UNPRINTABLE-OBJECT

Package

lichat-protocol

Source

printer.lisp (file)

Function: protocol-version ()

Returns the version string for the protocol.

Package

lichat-protocol

Source

protocol.lisp (file)

Function: read-sexpr STREAM

Reads an s-expression from the stream.

Skips all the whitespace at the beginning. Depending on the character following, the reading is dispatched as follows:
( => READ-SEXPR-LIST
) => Signals an INCOMPLETE-TOKEN error " => READ-SEXPR-STIRNG
012345689. => READ-SEXPR-NUMBER
: => READ-SEXPR-KEYWORD
otherwise => READ-SEXPR-SYMBOL

See READ-SEXPR-LIST
See READ-SEXPR-STRING
See READ-SEXPR-NUMBER
See READ-SEXPR-KEYWORD
See READ-SEXPR-SYMBOL

Package

lichat-protocol

Source

reader.lisp (file)

Function: to-wire WIREABLE STREAM

Print the wireable object to the stream.

Only handles objects of type WIRE-OBJECT and WIREABLE.

WIRE-OBJECTS are printed as a list in the following format: a list of the object’s type symbol followed by pairs of keyword to value of the object’s slots that have an initarg. Slots without an initarg are not printed.

The output is forced once written fully.

See PRINT-SEXPR
See FORCE-OUTPUT

Package

lichat-protocol

Source

wire.lisp (file)

Function: username-p NAME

Returns true if the given name is a valid name for users.

That is to say, the name must be a string in [1,32] of length and each character must be in the allowed unicode regions. The name must also not begin or end with a space.

See VALID-NAME-CHAR-P

Package

lichat-protocol

Source

protocol.lisp (file)

Function: whitespace-p CHAR

Returns T if the character is considered to be whitespace.

See *WHITESPACE*

Package

lichat-protocol

Source

reader.lisp (file)


Next: , Previous: , Up: Exported definitions   [Contents][Index]

5.1.4 Generic functions

Generic Function: allowed-content-types OBJECT

Returns a list of allowed content-type identifiers that the server supports.

See BAD-CONTENT-TYPE

Package

lichat-protocol

Writer

(setf allowed-content-types) (generic function)

Methods
Method: allowed-content-types (BAD-CONTENT-TYPE bad-content-type)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf allowed-content-types) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

allowed-content-types (generic function)

Methods
Method: (setf allowed-content-types) NEW-VALUE (BAD-CONTENT-TYPE bad-content-type)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: attributes OBJECT
Generic Function: (setf attributes) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: attributes (SERVER-INFO server-info)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf attributes) NEW-VALUE (SERVER-INFO server-info)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: by OBJECT
Generic Function: (setf by) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: by (PAUSE pause)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf by) NEW-VALUE (PAUSE pause)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: channel OBJECT

Accessor to the name of the channel the update relates to.

See CHANNEL-UPDATE

Package

lichat-protocol

Writer

(setf channel) (generic function)

Methods
Method: channel (CREATE create)

automatically generated reader method

Source

protocol.lisp (file)

Method: channel (CHANNEL-UPDATE channel-update)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf channel) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

channel (generic function)

Methods
Method: (setf channel) NEW-VALUE (CREATE create)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf channel) NEW-VALUE (CHANNEL-UPDATE channel-update)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: channels OBJECT

Accessor to the list of channels of the object.

See USER
See CHANNELS

Package

lichat-protocol

Writer

(setf channels) (generic function)

Methods
Method: channels (CHANNELS channels)

automatically generated reader method

Source

protocol.lisp (file)

Method: channels (USER user)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf channels) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

channels (generic function)

Methods
Method: (setf channels) NEW-VALUE (CHANNELS channels)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf channels) NEW-VALUE (USER user)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: clock OBJECT

Accessor to the clock of the update.

Must be a universal-time timestamp set at the time the update was constructed.

See UPDATE

Package

lichat-protocol

Writer

(setf clock) (generic function)

Methods
Method: clock (UPDATE update)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf clock) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

clock (generic function)

Methods
Method: (setf clock) NEW-VALUE (UPDATE update)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: connections OBJECT

Accessor to the list of connections of the user or count of connections of the user-info.

See USER
See USER-INFO

Package

lichat-protocol

Writer

(setf connections) (generic function)

Methods
Method: connections (SERVER-INFO server-info)

automatically generated reader method

Source

protocol.lisp (file)

Method: connections (USER-INFO user-info)

automatically generated reader method

Source

protocol.lisp (file)

Method: connections (USER user)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf connections) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

connections (generic function)

Methods
Method: (setf connections) NEW-VALUE (SERVER-INFO server-info)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf connections) NEW-VALUE (USER-INFO user-info)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf connections) NEW-VALUE (USER user)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: content-type OBJECT

Returns the content-type of the encoded data payload.

See DATA

Package

lichat-protocol

Writer

(setf content-type) (generic function)

Methods
Method: content-type (EMOTE emote)

automatically generated reader method

Source

protocol.lisp (file)

Method: content-type (DATA data)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf content-type) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

content-type (generic function)

Methods
Method: (setf content-type) NEW-VALUE (EMOTE emote)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf content-type) NEW-VALUE (DATA data)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: extensions OBJECT
Generic Function: (setf extensions) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: extensions (CONNECT connect)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf extensions) NEW-VALUE (CONNECT connect)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: filename OBJECT

Returns the file name of the file sent by the data payload.

See DATA

Package

lichat-protocol

Writer

(setf filename) (generic function)

Methods
Method: filename (DATA data)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf filename) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

filename (generic function)

Methods
Method: (setf filename) NEW-VALUE (DATA data)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: from OBJECT

Accessor to the sender of the update.

Must be a username string identifying the user that sent it.

See UPDATE

Package

lichat-protocol

Writer

(setf from) (generic function)

Methods
Method: from (UPDATE update)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf from) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

from (generic function)

Methods
Method: (setf from) NEW-VALUE (UPDATE update)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: id OBJECT

Accessor to the ID of the update.

IDs should be connection-unique, meaning the same ID should not appear on different connections at the same time.

See UPDATE

Package

lichat-protocol

Writer

(setf id) (generic function)

Methods
Method: id (UPDATE update)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf id) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

id (generic function)

Methods
Method: (setf id) NEW-VALUE (UPDATE update)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: key OBJECT
Generic Function: (setf key) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: key (NO-SUCH-CHANNEL-INFO no-such-channel-info)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf key) NEW-VALUE (NO-SUCH-CHANNEL-INFO no-such-channel-info)

automatically generated writer method

Source

protocol.lisp (file)

Method: key (SET-CHANNEL-INFO set-channel-info)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf key) NEW-VALUE (SET-CHANNEL-INFO set-channel-info)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: keys OBJECT
Generic Function: (setf keys) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: keys (CHANNEL-INFO channel-info)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf keys) NEW-VALUE (CHANNEL-INFO channel-info)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: lifetime OBJECT

Accessor to the lifetime of the object.

The object should stay alive for at least this many seconds after it has ceased to be used.

See PROFILE
See CHANNEL

Package

lichat-protocol

Writer

(setf lifetime) (generic function)

Methods
Method: lifetime (CHANNEL channel)

automatically generated reader method

Source

protocol.lisp (file)

Method: lifetime (PROFILE profile)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf lifetime) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

lifetime (generic function)

Methods
Method: (setf lifetime) NEW-VALUE (CHANNEL channel)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf lifetime) NEW-VALUE (PROFILE profile)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: name OBJECT

Accessor to the object’s name string.

See NAMED-OBJECT

Package

lichat-protocol

Writer

(setf name) (generic function)

Methods
Method: name (EMOTE emote)

automatically generated reader method

Source

protocol.lisp (file)

Method: name (NAMED-OBJECT named-object)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf name) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

name (generic function)

Methods
Method: (setf name) NEW-VALUE (EMOTE emote)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf name) NEW-VALUE (NAMED-OBJECT named-object)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: names OBJECT
Generic Function: (setf names) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: names (EMOTES emotes)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf names) NEW-VALUE (EMOTES emotes)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: object CONDITION

The object related to the condition.

See UNPRINTABLE-OBJECT
See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT

Package

lichat-protocol

Methods
Method: object (CONDITION incompatible-value-type-for-slot)
Source

conditions.lisp (file)

Method: object (CONDITION unprintable-object)
Source

conditions.lisp (file)

Generic Function: password OBJECT

Accessor to the password of the object.

See PROFILE
See REGISTER
See CONNECT

Package

lichat-protocol

Writer

(setf password) (generic function)

Methods
Method: password (REGISTER register)

automatically generated reader method

Source

protocol.lisp (file)

Method: password (CONNECT connect)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf password) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

password (generic function)

Methods
Method: (setf password) NEW-VALUE (REGISTER register)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf password) NEW-VALUE (CONNECT connect)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: payload OBJECT

Returns a base64 encoded data payload.

See DATA
See EMOTE

Package

lichat-protocol

Writer

(setf payload) (generic function)

Methods
Method: payload (EMOTE emote)

automatically generated reader method

Source

protocol.lisp (file)

Method: payload (DATA data)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf payload) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

payload (generic function)

Methods
Method: (setf payload) NEW-VALUE (EMOTE emote)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf payload) NEW-VALUE (DATA data)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: permissions OBJECT

Accessor to the permissions list of the object.

See CHANNEL
See PERMISSIONS

Package

lichat-protocol

Writer

(setf permissions) (generic function)

Methods
Method: permissions (PERMISSIONS permissions)

automatically generated reader method

Source

protocol.lisp (file)

Method: permissions (CHANNEL channel)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf permissions) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

permissions (generic function)

Methods
Method: (setf permissions) NEW-VALUE (PERMISSIONS permissions)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf permissions) NEW-VALUE (CHANNEL channel)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: permitted OBJECT
Generic Function: (setf permitted) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: permitted (CAPABILITIES capabilities)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf permitted) NEW-VALUE (CAPABILITIES capabilities)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: registered OBJECT

Accessor to whether the user is registered or not.

See USER-INFO

Package

lichat-protocol

Writer

(setf registered) (generic function)

Methods
Method: registered (USER-INFO user-info)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf registered) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

registered (generic function)

Methods
Method: (setf registered) NEW-VALUE (USER-INFO user-info)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: symbol-designator CONDITION

A symbol designator.

Returns a CONS of two strings for the package- and symbol-name respectively.

See NULL-IN-SYMBOL-DESIGNATOR
See UNKNOWN-SYMBOL

Package

lichat-protocol

Methods
Method: symbol-designator (CONDITION unknown-symbol)
Source

conditions.lisp (file)

Method: symbol-designator (CONDITION null-in-symbol-designator)
Source

conditions.lisp (file)

Generic Function: target OBJECT

Accessor to the name of the user being targeted.

See TARGET-UPDATE

Package

lichat-protocol

Writer

(setf target) (generic function)

Methods
Method: target (TARGET-UPDATE target-update)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf target) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

target (generic function)

Methods
Method: (setf target) NEW-VALUE (TARGET-UPDATE target-update)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: text OBJECT

Accessor to the text string carried by the update.

See TEXT-UPDATE

Package

lichat-protocol

Writer

(setf text) (generic function)

Methods
Method: text (SET-CHANNEL-INFO set-channel-info)

automatically generated reader method

Source

protocol.lisp (file)

Method: text (TEXT-UPDATE text-update)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf text) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

text (generic function)

Methods
Method: (setf text) NEW-VALUE (SET-CHANNEL-INFO set-channel-info)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf text) NEW-VALUE (TEXT-UPDATE text-update)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: update CONDITION

The update object that relates to the condition.

See MISSING-UPDATE-ARGUMENT
See UNKNOWN-WIRE-OBJECT

Package

lichat-protocol

Writer

(setf update) (generic function)

Methods
Method: update (DENY deny)

automatically generated reader method

Source

protocol.lisp (file)

Method: update (GRANT grant)

automatically generated reader method

Source

protocol.lisp (file)

Method: update (CONDITION malformed-wire-object)
Source

conditions.lisp (file)

Method: update (CONDITION unknown-wire-object)
Source

conditions.lisp (file)

Method: update (CONDITION missing-update-argument)
Source

conditions.lisp (file)

Generic Function: (setf update) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

update (generic function)

Methods
Method: (setf update) NEW-VALUE (DENY deny)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf update) NEW-VALUE (GRANT grant)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: update-id OBJECT

Accessor to the ID of the update that failed to be completed.

See UPDATE-FAILURE

Package

lichat-protocol

Writer

(setf update-id) (generic function)

Methods
Method: update-id (UPDATE-FAILURE update-failure)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf update-id) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

update-id (generic function)

Methods
Method: (setf update-id) NEW-VALUE (UPDATE-FAILURE update-failure)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: user OBJECT

Accessor to the user tied to the connection.

See CONNECTION
See USER

Package

lichat-protocol

Writer

(setf user) (generic function)

Methods
Method: user (CONNECTION connection)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf user) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

user (generic function)

Methods
Method: (setf user) NEW-VALUE (CONNECTION connection)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: users OBJECT

Accessor to the list of users of the object.

See CHANNEL
See USERS

Package

lichat-protocol

Writer

(setf users) (generic function)

Methods
Method: users (USERS users)

automatically generated reader method

Source

protocol.lisp (file)

Method: users (CHANNEL channel)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf users) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

users (generic function)

Methods
Method: (setf users) NEW-VALUE (USERS users)

automatically generated writer method

Source

protocol.lisp (file)

Method: (setf users) NEW-VALUE (CHANNEL channel)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: version OBJECT

Accessor to the version of the connection update.

See CONNECT

Package

lichat-protocol

Writer

(setf version) (generic function)

Methods
Method: version (CONNECT connect)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf version) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

version (generic function)

Methods
Method: (setf version) NEW-VALUE (CONNECT connect)

automatically generated writer method

Source

protocol.lisp (file)


Next: , Previous: , Up: Exported definitions   [Contents][Index]

5.1.5 Conditions

Condition: incompatible-value-type-for-slot ()

Condition signalled when an incompatible type is attempted to be set on a slot.

See OBJECT
See SLOT
See VALUE
See REQTYPE

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: object
Initargs

:object

Readers

object (generic function)

Slot: slot
Initargs

:slot

Readers

slot (generic function)

Slot: value
Initargs

:value

Readers

value (generic function)

Slot: type
Initargs

:type

Readers

reqtype (generic function)

Condition: incomplete-token ()

Condition signalled when a token is not complete on the wire and thus can’t be read fully.

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Condition: malformed-wire-object ()

Condition signalled when an object is found on the wire but is malformed and can’t be parsed.

See UPDATE

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Direct methods

update (method)

Direct slots
Slot: update
Initargs

:update

Readers

update (generic function)

Condition: missing-clock ()

Condition signalled when the CLOCK field is missing from an update.

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Condition: missing-id ()

Condition signalled when the ID field is missing from an update.

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Condition: missing-update-argument ()

Superclass for all conditions relating to missing required arguments in updates.

See MISSING-ID
See MISSING-CLOCK
See UPDATE

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses

wire-condition (condition)

Direct subclasses
Direct methods

update (method)

Direct slots
Slot: update
Initargs

:update

Readers

update (generic function)

Condition: null-in-symbol-designator ()

Condition signalled when a symbol is attempted to be put to the wire whose designator contains NULL characters.

See SYMBOL-DESIGNATOR

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Direct methods

symbol-designator (method)

Direct slots
Slot: symbol-designator
Initargs

:symbol-designator

Readers

symbol-designator (generic function)

Condition: printer-condition ()

Superclass for all conditions relating to printing to the wire.

See UNPRINTABLE-OBJECT

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses

wire-condition (condition)

Direct subclasses
Condition: protocol-condition ()

Superclass for all conditions relating to the protocol.

See WIRE-CONDITION
See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses

condition (condition)

Direct subclasses
Condition: read-limit-hit ()
Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Condition: reader-condition ()

Superclass for all conditions relating to reading from the wire.

See INCOMPLETE-TOKEN
See UNKNOWN-SYMBOL

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses

wire-condition (condition)

Direct subclasses
Condition: stray-null-found ()

Condition signalled when a null character was found in the middle of an update.

See READER-CONDITION

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Condition: unknown-symbol ()

Condition signalled when an unknown symbol is found on the wire.

See SYMBOL-DESIGNATOR

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Direct methods

symbol-designator (method)

Direct slots
Slot: symbol-designator
Initargs

:symbol-designator

Readers

symbol-designator (generic function)

Condition: unknown-wire-object ()

Condition signalled when an object is found on the wire that has an unknown type.

See UPDATE

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Direct methods

update (method)

Direct slots
Slot: update
Initargs

:update

Readers

update (generic function)

Condition: unprintable-object ()

Condition signalled when an unprintable object is attempted to be put onto the wire.

See OBJECT

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses
Direct methods

object (method)

Direct slots
Slot: object
Initargs

:object

Readers

object (generic function)

Condition: wire-condition ()

Superclass for all conditions relating to the wire format.

See PRINTER-CONDITION
See READER-CONDITION
See MISSING-UPDATE-ARGUMENT
See UNKNOWN-WIRE-OBJECT
See MALFORMED-WIRE-OBJECT

Package

lichat-protocol

Source

conditions.lisp (file)

Direct superclasses

protocol-condition (condition)

Direct subclasses

Next: , Previous: , Up: Exported definitions   [Contents][Index]

5.1.6 Classes

Class: already-connected ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"you have already connected to an account."
Class: already-in-channel ()

Update in response to a JOIN/PULL request for a user that is already in the specified channel.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the user is already in the channel."
Class: backfill ()

Update to represent a backfill request.

Possible responses:
See NOT-IN-CHANNEL

See CHANNEL-UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: bad-content-type ()

Update in response to a DATA update with a content-type the server does not support.

See UPDATE-FAILURE
See ALLOWED-CONTENT-TYPES

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: allowed-content-types
Initargs

:allowed-content-types

Readers

allowed-content-types (generic function)

Writers

(setf allowed-content-types) (generic function)

Direct Default Initargs
InitargValue
:text"the supplied content type for the data update is not accepted by this server."
:allowed-content-typesnil
Class: bad-ip-format ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the ip address was not in the correct format."
Class: bad-name ()

Update in response to any named request with a name that is not valid.

Relevant are the FROM, TARGET, and CHANNEL fields.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the specified name is not a valid name."
Class: ban ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: capabilities ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: permitted
Initargs

:permitted

Readers

permitted (generic function)

Writers

(setf permitted) (generic function)

Direct Default Initargs
InitargValue
:permittednil
Class: channel ()

Class to represent a channel.

See NAMED-OBJECT
See SERVER-OBJECT
See PERMISSIONS
See LIFETIME
See USERS
See *DEFAULT-CHANNEL-LIFETIME*

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: name
Slot: permissions
Initargs

:permissions

Readers

permissions (generic function)

Writers

(setf permissions) (generic function)

Slot: lifetime
Initargs

:lifetime

Readers

lifetime (generic function)

Writers

(setf lifetime) (generic function)

Slot: users
Initargs

:users

Readers

users (generic function)

Writers

(setf users) (generic function)

Direct Default Initargs
InitargValue
:permissionsnil
:lifetimelichat-protocol:*default-channel-lifetime*
:usersnil
Class: channel-info ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • keys (method)
  • keys (method)
Direct slots
Slot: keys
Initargs

:keys

Readers

keys (generic function)

Writers

(setf keys) (generic function)

Direct Default Initargs
InitargValue
:keyst
Class: channel-update ()

Superclass for all updates relating to a channel.

See CHANNEL
See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct subclasses
Direct methods
  • print-object (method)
  • channel (method)
  • channel (method)
Direct slots
Slot: channel
Initargs

:channel

Readers

channel (generic function)

Writers

(setf channel) (generic function)

Class: channelname-taken ()

Update in response to a CREATE request for a channel that already exists.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the requested channelname is already taken."
Class: channels ()

Update to represent a channels listing request.

Possible responses:
See CHANNELS
See BAD-NAME
See USERNAME-MISMATCH

See CHANNELS
See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: channels
Initargs

:channels

Readers

channels (generic function)

Writers

(setf channels) (generic function)

Direct Default Initargs
InitargValue
:channelsnil
Class: clock-skewed ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"your clock is out of sync. you should synchronise with a time server."
Class: connect ()

Update to represent a connection request.

This update must be the first thing sent by the client upon connection establishment.

Possible responses:
See CONNECT
See BAD-NAME
See INVALID-PASSWORD
See USERNAME-TAKEN
See NO-SUCH-PROFILE
See INCOMPATIBLE-VERSION

See PASSWORD
See VERSION
See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: password
Initargs

:password

Readers

password (generic function)

Writers

(setf password) (generic function)

Slot: version
Initargs

:version

Readers

version (generic function)

Writers

(setf version) (generic function)

Slot: extensions
Initargs

:extensions

Readers

extensions (generic function)

Writers

(setf extensions) (generic function)

Direct Default Initargs
InitargValue
:passwordnil
:version(lichat-protocol:protocol-version)
:extensionsnil
Class: connection ()

Class to represent a connection of a user.

See SERVER-OBJECT
See USER

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • print-object (method)
  • user (method)
  • user (method)
Direct slots
Slot: user
Initargs

:user

Readers

user (generic function)

Writers

(setf user) (generic function)

Direct Default Initargs
InitargValue
:usernil
Class: connection-unstable ()

Update in response to an unstable or slow connection.

See FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the connection is unstable. you may be disconnected soon."
Class: create ()

Update to represent a channel creation request.

The channel may be NIL, in which case an anonymous channel is constructed. You can obtain the name of the anonymous channel by reading it out of the JOIN response.

Possible responses:
See JOIN
See BAD-NAME
See USERNAME-MISMATCH
See CHANNELNAME-TAKEN
See BAD-NAME
See INSUFFICIENT-PERMISSIONS

See CHANNEL-UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • channel (method)
  • channel (method)
Direct slots
Slot: channel
Initargs

:channel

Readers

channel (generic function)

Writers

(setf channel) (generic function)

Direct Default Initargs
InitargValue
:channelnil
Class: data ()

Update to represent a raw data message.

Possible responses:
See NOT-IN-CHANNEL
See BAD-CONTENT-TYPE
See DATA

See CONTENT-TYPE
See FILENAME
See PAYLOAD
See CHANNEL-UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: content-type
Initargs

:content-type

Readers

content-type (generic function)

Writers

(setf content-type) (generic function)

Slot: filename
Initargs

:filename

Readers

filename (generic function)

Writers

(setf filename) (generic function)

Slot: payload
Initargs

:payload

Readers

payload (generic function)

Writers

(setf payload) (generic function)

Direct Default Initargs
InitargValue
:file-namenil
Class: deny ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: update
Initargs

:update

Readers

update (generic function)

Writers

(setf update) (generic function)

Class: destroy ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: disconnect ()

Update to represent a disconnection request.

Possible responses:
See DISCONNECT
See USERNAME-MISMATCH

See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: edit ()

Update to represent a change to an existing message.

See MESSAGE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: emote ()

Update to represent an emote entity.

This should only be sent by the server.

See CONTENT-TYPE
See NAME
See PAYLOAD
See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: content-type
Initargs

:content-type

Readers

content-type (generic function)

Writers

(setf content-type) (generic function)

Slot: name
Initargs

:name

Readers

name (generic function)

Writers

(setf name) (generic function)

Slot: payload
Initargs

:payload

Readers

payload (generic function)

Writers

(setf payload) (generic function)

Class: emotes ()

Update to represent an emote listing request.

Possible responses:
See EMOTE

See UPDATE
See NAMES

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • names (method)
  • names (method)
Direct slots
Slot: names
Initargs

:names

Readers

names (generic function)

Writers

(setf names) (generic function)

Direct Default Initargs
InitargValue
:namesnil
Class: failure ()

Superclass for all failure response updates.

See TEXT-UDPATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct subclasses
Class: grant ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: update
Initargs

:update

Readers

update (generic function)

Writers

(setf update) (generic function)

Class: incompatible-version ()

Update in response to a connection attempt with an incompatible protocol version.

See COMPATIBLE-VERSIONS
See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: compatible-versions
Initargs

:compatible-versions

Readers

compatible-versions (generic function)

Writers

(setf compatible-versions) (generic function)

Direct Default Initargs
InitargValue
:text"the server and client versions are not compatible."
Class: insufficient-permissions ()

Update in response to a request that is not permitted on the current or primary channel.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"you do not have sufficient permissions to perform the requested action."
Class: invalid-password ()

Update in response to a connection attempt with an invalid password for the profile.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"invalid username or password."
Class: invalid-permissions ()

Update in response to a PERMISSIONS request that attempted to set malformed permissions.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • rule (method)
  • rule (method)
Direct slots
Slot: rule
Initargs

:rule

Readers

rule (generic function)

Writers

(setf rule) (generic function)

Direct Default Initargs
InitargValue
:text"the permissions are malformed."
Class: invalid-update ()

Update in response to an update of invalid type.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the update class is invalid."
Class: ip-ban ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses

typed-object (class)

Direct methods
  • mask (method)
  • mask (method)
  • ip (method)
  • ip (method)
Direct slots
Slot: ip
Initargs

:ip

Readers

ip (generic function)

Writers

(setf ip) (generic function)

Slot: mask
Initargs

:mask

Readers

mask (generic function)

Writers

(setf mask) (generic function)

Class: ip-unban ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses

typed-object (class)

Direct methods
  • mask (method)
  • mask (method)
  • ip (method)
  • ip (method)
Direct slots
Slot: ip
Initargs

:ip

Readers

ip (generic function)

Writers

(setf ip) (generic function)

Slot: mask
Initargs

:mask

Readers

mask (generic function)

Writers

(setf mask) (generic function)

Class: join ()

Update to represent a channel join request.

Possible responses:
See JOIN
See BAD-NAME
See USERNAME-MISMATCH
See ALREADY-IN-CHANNEL
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS

See CHANNEL-UDPATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: kick ()

Update to represent a user kick request.

Possible responses:
See KICK
See BAD-NAME
See USERNAME-MISMATCH
See NOT-IN-CHANNEL
See NO-SUCH-USER
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS

See TARGET-UPDATE
See CHANNEL-UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: kill ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: leave ()

Update to represent a channel leave request.

Possible responses:
See LEAVE
See BAD-NAME
See USERNAME-MISMATCH
See NOT-IN-CHANNEL
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS

See CHANNEL-UDPATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: malformed-channel-info ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the specified info was not of the correct format for the key."
Class: malformed-update ()

Update in response to a malformed update.

See FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"update was malformed and could not be parsed."
Class: message ()

Update to represent a channel message request.

Possible responses:
See MESSAGE
See BAD-NAME
See USERNAME-MISMATCH
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS

See CHANNEL-UPDATE
See TEXT-UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct subclasses

edit (class)

Class: named-object ()

Superclass for all objects that are named.

See NAME

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses

typed-object (class)

Direct subclasses
Direct methods
  • print-object (method)
  • name (method)
  • name (method)
Direct slots
Slot: name
Initargs

:name

Readers

name (generic function)

Writers

(setf name) (generic function)

Class: no-such-channel ()

Update in response to a CHANNEL-UPDATE for a channel that does not exist.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"no such channel exists on the server."
Class: no-such-channel-info ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • key (method)
  • key (method)
Direct slots
Slot: key
Initargs

:key

Readers

key (generic function)

Writers

(setf key) (generic function)

Direct Default Initargs
InitargValue
:text"the requested channel info key does not exist."
Class: no-such-parent-channel ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the channel you are trying to create a child channel under does not exist."
Class: no-such-profile ()

Update in response to a connection attempt with a password for an inexistent profile.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"no such profile could be found."
Class: no-such-user ()

Update in response to a TARGET-UPDATE request that refers to user that does not exist.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the requested user does not exist."
Class: not-in-channel ()

Update in response to a LEAVE/KICK request for a user that is not in the specified channel.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the user is not part of the channel."
Class: pause ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • by (method)
  • by (method)
Direct slots
Slot: by
Initargs

:by

Readers

by (generic function)

Writers

(setf by) (generic function)

Class: permissions ()

Update to represent a channel permissions view or change request.

If PERMISSIONS is NIL, the permissions are not changed.

Possible responses:
See PERMISSIONS
See BAD-NAME
See USERNAME-MISMATCH
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS

See PERMISSIONS
See CHANNEL-UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: permissions
Initargs

:permissions

Readers

permissions (generic function)

Writers

(setf permissions) (generic function)

Direct Default Initargs
InitargValue
:permissionsnil
Class: ping ()

Update to represent a ping request.

The recipient must reply with a PONG update.

Possible responses:
PONG

See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: pong ()

Update to represent a pong response.

See PING
See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: profile ()

Class to represent user profiles. Only registered users have a profile.

See NAMED-OBJECT
See SERVER-OBJECT
See NAME
See PASSWORD
See LIFETIME
See *DEFAULT-PROFILE-LIFETIME*

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: name
Slot: lifetime
Initargs

:lifetime

Readers

lifetime (generic function)

Writers

(setf lifetime) (generic function)

Direct Default Initargs
InitargValue
:lifetimelichat-protocol:*default-profile-lifetime*
Class: pull ()

Update to represent a user pull request.

The user will be automatically joined to the channel.

Possible responses:
See JOIN
See BAD-NAME
See USERNAME-MISMATCH
See ALREADY-IN-CHANNEL
See NO-SUCH-USER
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS

See TARGET-UPDATE
See CHANNEL-UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: quiet ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: register ()

Update to represent a registration request.

Possible responses:
See REGISTRATION-REJECTED
See REGISTER
See BAD-NAME
See USERNAME-MISMATCH
See INSUFFICIENT-PERMISSIONS

See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: password
Initargs

:password

Readers

password (generic function)

Writers

(setf password) (generic function)

Class: registration-rejected ()

Update in response to a REGISTER request that the server rejected.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"your profile registration was rejected."
Class: server-info ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: attributes
Initargs

:attributes

Readers

attributes (generic function)

Writers

(setf attributes) (generic function)

Slot: connections
Initargs

:connections

Readers

connections (generic function)

Writers

(setf connections) (generic function)

Direct Default Initargs
InitargValue
:attributesnil
:connectionsnil
Class: server-object ()

Superclass for all objects that exist on the server-side.

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses

typed-object (class)

Direct subclasses
Class: set-channel-info ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • text (method)
  • text (method)
  • key (method)
  • key (method)
Direct slots
Slot: key
Initargs

:key

Readers

key (generic function)

Writers

(setf key) (generic function)

Slot: text
Initargs

:text

Readers

text (generic function)

Writers

(setf text) (generic function)

Class: target-update ()

Superclass for all updates that target a user.

See TARGET
See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct subclasses
Direct methods
  • print-object (method)
  • target (method)
  • target (method)
Direct slots
Slot: target
Initargs

:target

Readers

target (generic function)

Writers

(setf target) (generic function)

Class: text-update ()

Superclass for all updates that carry a text string.

See TEXT
See UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct subclasses
Direct methods
  • print-object (method)
  • text (method)
  • text (method)
Direct slots
Slot: text
Initargs

:text

Readers

text (generic function)

Writers

(setf text) (generic function)

Class: too-many-connections ()

Update in response to too many connections being requested on the server globally, or for a single user.

See FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"there are too many connections for this user or on this server."
Class: too-many-updates ()

Update in response to a flooding of the server.

When this update is sent, any number of future updates that are received may be dropped instead.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"you have been sending too many updates and have been throttled."
Class: unban ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: unquiet ()
Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Class: update ()

Base class for all updates.

See WIRE-OBJECT
See ID
See CLOCK
See FROM
See NEXT-ID

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct subclasses
Direct methods
  • print-object (method)
  • from (method)
  • from (method)
  • clock (method)
  • clock (method)
  • id (method)
  • id (method)
Direct slots
Slot: id
Initargs

:id

Readers

id (generic function)

Writers

(setf id) (generic function)

Slot: clock
Initargs

:clock

Readers

clock (generic function)

Writers

(setf clock) (generic function)

Slot: from
Initargs

:from

Readers

from (generic function)

Writers

(setf from) (generic function)

Direct Default Initargs
InitargValue
:id(lichat-protocol:next-id)
:clock(get-universal-time)
:fromnil
Class: update-failure ()

Update in response to an update request that failed.

See UPDATE-ID
See FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct subclasses
Direct methods
  • print-object (method)
  • update-id (method)
  • update-id (method)
Direct slots
Slot: update-id
Initargs

:update-id

Readers

update-id (generic function)

Writers

(setf update-id) (generic function)

Class: update-too-long ()

Update in response to an update that contained too many characters.

See FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the update was too long and has been dropped."
Class: user ()

Class to represent a user. Anything that can communicate with the server must have a user obuject.

See NAMED-OBJECT
See SERVER-OBJECT
See CONNECTIONS
See CHANNELS

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: name
Slot: connections
Initargs

:connections

Readers

connections (generic function)

Writers

(setf connections) (generic function)

Slot: channels
Initargs

:channels

Readers

channels (generic function)

Writers

(setf channels) (generic function)

Direct Default Initargs
InitargValue
:connectionsnil
:channelsnil
Class: user-info ()

Update to represent a user information request.

Possible responses:
See USER-INFO
See BAD-NAME
See USERNAME-MISMATCH
See NO-SUCH-USER

See REGISTERED
See CONNECTIONS
See TARGET-UPDATE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
Direct slots
Slot: registered
Initargs

:registered

Readers

registered (generic function)

Writers

(setf registered) (generic function)

Slot: connections
Initargs

:connections

Readers

connections (generic function)

Writers

(setf connections) (generic function)

Direct Default Initargs
InitargValue
:registerednil
:connections1
Class: username-mismatch ()

Update in response to a mismatch between the known username and the one in the FROM field.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the from field did not match the known username of the connection."
Class: username-taken ()

Update in response to a connection attempt with a username that is already taken.

See UPDATE-FAILURE

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct Default Initargs
InitargValue
:text"the requested username is already taken."
Class: users ()

Update to represent a channel users listing request.

Possible responses:
USERS
BAD-NAME
USERNAME-MISMATCH
NO-SUCH-CHANNEL
INSUFFICIENT-PERMISSIONS

See CHANNEL-UPDATE
See USERS

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses
Direct methods
  • users (method)
  • users (method)
Direct slots
Slot: users
Initargs

:users

Readers

users (generic function)

Writers

(setf users) (generic function)

Direct Default Initargs
InitargValue
:usersnil
Class: wire-object ()

Superclass for all classes that can be put onto the wire.

Package

lichat-protocol

Source

protocol.lisp (file)

Direct superclasses

typed-object (class)

Direct subclasses

update (class)


Previous: , Up: Exported definitions   [Contents][Index]

5.1.7 Types

Type: channelname ()

Type that is satisfied for all channelname strings.

See CHANNELNAME-P

Package

lichat-protocol

Source

protocol.lisp (file)

Type: id ()

Type that is satisfied for all ID objects.

See ID-P

Package

lichat-protocol

Source

protocol.lisp (file)

Type: password ()

Type that is satisfied for all password strings.

See PASSWORD-P

Package

lichat-protocol

Source

protocol.lisp (file)

Type: username ()

Type that is satisfied for all username strings.

See USERNAME-P

Package

lichat-protocol

Source

protocol.lisp (file)

Type: wireable ()

Type for all objects that are permitted to appear on the wire.

Should be the union of REAL STRING CONS SYMBOL WIRE-OBJECT

Package

lichat-protocol

Source

protocol.lisp (file)


Previous: , Up: Definitions   [Contents][Index]

5.2 Internal definitions


Next: , Previous: , Up: Internal definitions   [Contents][Index]

5.2.1 Special variables

Special Variable: *errors*

A list of errors that occurred during reading.

Package

lichat-protocol

Source

reader.lisp (file)

Special Variable: *invalid-symbol*

Placeholder symbol for symbols that could not be properly read.

Package

lichat-protocol

Source

reader.lisp (file)

Special Variable: *read-counter*
Package

lichat-protocol

Source

reader.lisp (file)

Special Variable: *read-limit*
Package

lichat-protocol

Source

reader.lisp (file)

Special Variable: *unbound-value*

Placeholder value for unbound values.

Package

lichat-protocol

Source

typed-slot-class.lisp (file)

Special Variable: *whitespace*

A vector of whitespace characters.

Package

lichat-protocol

Source

reader.lisp (file)


Next: , Previous: , Up: Internal definitions   [Contents][Index]

5.2.2 Macros

Macro: define-typed-class NAME DIRECT-SUPERCLASSES DIRECT-SLOTS &body OPTIONS

Shorthand wrapper around defclass to set it up for a typed-class.

See TYPED-OBJECT
See TYPED-SLOT-CLASS

Package

lichat-protocol

Source

typed-slot-class.lisp (file)


Next: , Previous: , Up: Internal definitions   [Contents][Index]

5.2.3 Functions

Function: check-compatible-slot-value VALUE OBJECT SLOT

Checks whether the given value is suitable for the given object’s slot.

If it is not, an error of type INCOMPATIBLE-VALUE-TYPE-FOR-SLOT
is signalled.

Package

lichat-protocol

Source

typed-slot-class.lisp (file)

Function: lpeek STREAM
Package

lichat-protocol

Source

reader.lisp (file)

Function: lread STREAM &optional EOF
Package

lichat-protocol

Source

reader.lisp (file)

Function: lunread CHAR STREAM
Package

lichat-protocol

Source

reader.lisp (file)

Function: maybe-sval OBJECT SLOT

Returns the slot’s value if it is bound, or *UNBOUND-VALUE* if it is not.

Package

lichat-protocol

Source

protocol.lisp (file)

Function: print-sexpr-list LIST STREAM

Print an s-expression list to the stream.

This only handles proper lists. List items are printed recursively.

See PRINT-SEXPR

Package

lichat-protocol

Source

printer.lisp (file)

Function: print-sexpr-number NUMBER STREAM

Print an s-expression number to the stream.

Only integers and floats can be printed, which are printed according to the CLHS rules on printing numbers.

Package

lichat-protocol

Source

printer.lisp (file)

Function: print-sexpr-string STRING STREAM

Print an s-expression string to the stream.

Prints all characters verbatim, with the exception of ", which is escaped with a backslash.

Package

lichat-protocol

Source

printer.lisp (file)

Function: print-sexpr-symbol SEXPR STREAM

Print an s-expression symbol to the stream.

Symbols are printed as follows: KEYWORD:FOO => :FOO LICHAT-PROTOCOL:FOO => FOO
#:FOO => #:FOO SOMEWHERE:FOO => SOMEWHERE:FOO

See PRINT-SEXPR-TOKEN

Package

lichat-protocol

Source

printer.lisp (file)

Function: print-sexpr-token TOKEN STREAM SYMBOL

Print an s-expression token to the stream.

All characters in the token string are printed verbatim, with the exception of "():0123456789. #
which are escaped by a backslash.

Package

lichat-protocol

Source

printer.lisp (file)

Function: read-sexpr-keyword STREAM

Read a keyword from the stream. It is assumed that the colon has already been read.

See SAFE-FIND-SYMBOL
See READ-SEXPR-TOKEN

Package

lichat-protocol

Source

reader.lisp (file)

Function: read-sexpr-list STREAM

Read a list from the stream. It is assumed that the opening paren has already been read.

Package

lichat-protocol

Source

reader.lisp (file)

Function: read-sexpr-number STREAM

Reads a number from the stream. The number can be either an integer or a float.

Package

lichat-protocol

Source

reader.lisp (file)

Function: read-sexpr-string STREAM

Read a string from the stream. It is assumed that the opening double-quote has already been read.

Package

lichat-protocol

Source

reader.lisp (file)

Function: read-sexpr-symbol STREAM

Reads a symbol from the stream.

See READ-SEXPR-TOKEN
See SAFE-FIND-SYMBOL

Package

lichat-protocol

Source

reader.lisp (file)

Function: read-sexpr-token STREAM

Reads a token from the stream.

Tokens are sequences of characters that are terminated by one of the following:
"():0123456789.
These characters may still appear in a token, but must be escaped by a backslash.

Package

lichat-protocol

Source

reader.lisp (file)

Function: safe-find-symbol NAME PACKAGE

Similar to FIND-SYMBOL, but recording an error for unknown symbols.

If the symbol cannot be found, a condition of type UNKNOWN-SYMBOL is pushed onto the *ERRORS* list and *INVALID-SYMBOL* is returned.

See FIND-SYMBOL
See UNKNOWN-SYMBOL
See *INVALID-SYMBOL*
See *ERRORS*

Package

lichat-protocol

Source

reader.lisp (file)

Function: skip-whitespace STREAM

Consumes all characters from the stream until a non-whitespace character is found.

See WHITESPACE-P

Package

lichat-protocol

Source

reader.lisp (file)

Function: valid-name-char-p C

Returns true if the given character is an allowed character in names.

This is according to §2.2.1 and §2.4.4.

Package

lichat-protocol

Source

protocol.lisp (file)


Next: , Previous: , Up: Internal definitions   [Contents][Index]

5.2.4 Generic functions

Generic Function: compatible-versions OBJECT

Accessor to the list of version strings that this server is compatible with.

See INCOMPATIBLE-VERSION

Package

lichat-protocol

Writer

(setf compatible-versions) (generic function)

Methods
Method: compatible-versions (INCOMPATIBLE-VERSION incompatible-version)

automatically generated reader method

Source

protocol.lisp (file)

Generic Function: (setf compatible-versions) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

compatible-versions (generic function)

Methods
Method: (setf compatible-versions) NEW-VALUE (INCOMPATIBLE-VERSION incompatible-version)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: ip OBJECT
Generic Function: (setf ip) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: ip (IP-UNBAN ip-unban)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf ip) NEW-VALUE (IP-UNBAN ip-unban)

automatically generated writer method

Source

protocol.lisp (file)

Method: ip (IP-BAN ip-ban)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf ip) NEW-VALUE (IP-BAN ip-ban)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: mask OBJECT
Generic Function: (setf mask) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: mask (IP-UNBAN ip-unban)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf mask) NEW-VALUE (IP-UNBAN ip-unban)

automatically generated writer method

Source

protocol.lisp (file)

Method: mask (IP-BAN ip-ban)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf mask) NEW-VALUE (IP-BAN ip-ban)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: reqtype CONDITION

The required type for the slot that was attempted to be set.

See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT

Package

lichat-protocol

Methods
Method: reqtype (CONDITION incompatible-value-type-for-slot)
Source

conditions.lisp (file)

Generic Function: rule OBJECT
Generic Function: (setf rule) NEW-VALUE OBJECT
Package

lichat-protocol

Methods
Method: rule (INVALID-PERMISSIONS invalid-permissions)

automatically generated reader method

Source

protocol.lisp (file)

Method: (setf rule) NEW-VALUE (INVALID-PERMISSIONS invalid-permissions)

automatically generated writer method

Source

protocol.lisp (file)

Generic Function: slot CONDITION

The slot that was attempted to be set.

See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT

Package

lichat-protocol

Methods
Method: slot (CONDITION incompatible-value-type-for-slot)
Source

conditions.lisp (file)

Generic Function: slot-type OBJECT

Accessor to the type constraint of the typed-slot.

See TYPED-SLOT

Package

lichat-protocol

Writer

(setf slot-type) (generic function)

Methods
Method: slot-type (TYPED-SLOT typed-slot)

automatically generated reader method

Source

typed-slot-class.lisp (file)

Generic Function: (setf slot-type) NEW-VALUE OBJECT
Package

lichat-protocol

Reader

slot-type (generic function)

Methods
Method: (setf slot-type) NEW-VALUE (TYPED-SLOT typed-slot)

automatically generated writer method

Source

typed-slot-class.lisp (file)

Generic Function: value CONDITION

The value that was attempted to be set.

See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT

Package

lichat-protocol

Methods
Method: value (CONDITION incompatible-value-type-for-slot)
Source

conditions.lisp (file)


Previous: , Up: Internal definitions   [Contents][Index]

5.2.5 Classes

Class: typed-direct-slot-definition ()

Direct-slot class for typed slots.

See TYPED-SLOT

Package

lichat-protocol

Source

typed-slot-class.lisp (file)

Direct superclasses
  • standard-direct-slot-definition (class)
  • typed-slot (class)
Class: typed-effective-slot-definition ()

Effective-slot class for typed slots.

See TYPED-SLOT

Package

lichat-protocol

Source

typed-slot-class.lisp (file)

Direct superclasses
  • standard-effective-slot-definition (class)
  • typed-slot (class)
Class: typed-object ()

Superclass for objects with strictly typed slots.

See TYPED-SLOT-CLASS
See DEFINE-TYPED-CLASS

Package

lichat-protocol

Source

typed-slot-class.lisp (file)

Direct superclasses

standard-object (class)

Direct subclasses
Direct methods

shared-initialize (method)

Class: typed-slot ()

Slot class for slots with a strict type check.

See SLOT-TYPE
See TYPED-DIRECT-SLOT-DEFINITION
See TYPED-EFFECTIVE-SLOT-DEFINITION
See TYPED-SLOT-CLASS

Package

lichat-protocol

Source

typed-slot-class.lisp (file)

Direct superclasses

standard-slot-definition (class)

Direct subclasses
Direct methods
  • slot-makunbound-using-class (method)
  • slot-value-using-class (method)
  • print-object (method)
  • slot-type (method)
  • slot-type (method)
Direct slots
Slot: slot-type
Initargs

:slot-type

Readers

slot-type (generic function)

Writers

(setf slot-type) (generic function)

Class: typed-slot-class ()

Metaclass for classes with strictly typed slots.

See TYPED-SLOT
See TYPED-OBJECT

Package

lichat-protocol

Source

typed-slot-class.lisp (file)

Direct superclasses

standard-class (class)

Direct methods
  • slot-makunbound-using-class (method)
  • slot-value-using-class (method)
  • compute-effective-slot-definition (method)
  • effective-slot-definition-class (method)
  • direct-slot-definition-class (method)
  • validate-superclass (method)
  • validate-superclass (method)
Class: udpate-failure ()
Package

lichat-protocol

Direct subclasses

no-such-parent-channel (class)


Previous: , Up: Top   [Contents][Index]

Appendix A Indexes


Next: , Previous: , Up: Indexes   [Contents][Index]

A.1 Concepts

Jump to:   F   L  
Index Entry  Section

F
File, Lisp, lichat-protocol.asd: The lichat-protocol․asd file
File, Lisp, lichat-protocol/conditions.lisp: The lichat-protocol/conditions․lisp file
File, Lisp, lichat-protocol/documentation.lisp: The lichat-protocol/documentation․lisp file
File, Lisp, lichat-protocol/package.lisp: The lichat-protocol/package․lisp file
File, Lisp, lichat-protocol/printer.lisp: The lichat-protocol/printer․lisp file
File, Lisp, lichat-protocol/protocol.lisp: The lichat-protocol/protocol․lisp file
File, Lisp, lichat-protocol/reader.lisp: The lichat-protocol/reader․lisp file
File, Lisp, lichat-protocol/typed-slot-class.lisp: The lichat-protocol/typed-slot-class․lisp file
File, Lisp, lichat-protocol/wire.lisp: The lichat-protocol/wire․lisp file

L
lichat-protocol.asd: The lichat-protocol․asd file
lichat-protocol/conditions.lisp: The lichat-protocol/conditions․lisp file
lichat-protocol/documentation.lisp: The lichat-protocol/documentation․lisp file
lichat-protocol/package.lisp: The lichat-protocol/package․lisp file
lichat-protocol/printer.lisp: The lichat-protocol/printer․lisp file
lichat-protocol/protocol.lisp: The lichat-protocol/protocol․lisp file
lichat-protocol/reader.lisp: The lichat-protocol/reader․lisp file
lichat-protocol/typed-slot-class.lisp: The lichat-protocol/typed-slot-class․lisp file
lichat-protocol/wire.lisp: The lichat-protocol/wire․lisp file
Lisp File, lichat-protocol.asd: The lichat-protocol․asd file
Lisp File, lichat-protocol/conditions.lisp: The lichat-protocol/conditions․lisp file
Lisp File, lichat-protocol/documentation.lisp: The lichat-protocol/documentation․lisp file
Lisp File, lichat-protocol/package.lisp: The lichat-protocol/package․lisp file
Lisp File, lichat-protocol/printer.lisp: The lichat-protocol/printer․lisp file
Lisp File, lichat-protocol/protocol.lisp: The lichat-protocol/protocol․lisp file
Lisp File, lichat-protocol/reader.lisp: The lichat-protocol/reader․lisp file
Lisp File, lichat-protocol/typed-slot-class.lisp: The lichat-protocol/typed-slot-class․lisp file
Lisp File, lichat-protocol/wire.lisp: The lichat-protocol/wire․lisp file

Jump to:   F   L  

Next: , Previous: , Up: Indexes   [Contents][Index]

A.2 Functions

Jump to:   (  
A   B   C   D   E   F   G   I   K   L   M   N   O   P   R   S   T   U   V   W  
Index Entry  Section

(
(setf allowed-content-types): Exported generic functions
(setf allowed-content-types): Exported generic functions
(setf attributes): Exported generic functions
(setf attributes): Exported generic functions
(setf by): Exported generic functions
(setf by): Exported generic functions
(setf channel): Exported generic functions
(setf channel): Exported generic functions
(setf channel): Exported generic functions
(setf channels): Exported generic functions
(setf channels): Exported generic functions
(setf channels): Exported generic functions
(setf clock): Exported generic functions
(setf clock): Exported generic functions
(setf compatible-versions): Internal generic functions
(setf compatible-versions): Internal generic functions
(setf connections): Exported generic functions
(setf connections): Exported generic functions
(setf connections): Exported generic functions
(setf connections): Exported generic functions
(setf content-type): Exported generic functions
(setf content-type): Exported generic functions
(setf content-type): Exported generic functions
(setf extensions): Exported generic functions
(setf extensions): Exported generic functions
(setf filename): Exported generic functions
(setf filename): Exported generic functions
(setf from): Exported generic functions
(setf from): Exported generic functions
(setf id): Exported generic functions
(setf id): Exported generic functions
(setf ip): Internal generic functions
(setf ip): Internal generic functions
(setf ip): Internal generic functions
(setf key): Exported generic functions
(setf key): Exported generic functions
(setf key): Exported generic functions
(setf keys): Exported generic functions
(setf keys): Exported generic functions
(setf lifetime): Exported generic functions
(setf lifetime): Exported generic functions
(setf lifetime): Exported generic functions
(setf mask): Internal generic functions
(setf mask): Internal generic functions
(setf mask): Internal generic functions
(setf name): Exported generic functions
(setf name): Exported generic functions
(setf name): Exported generic functions
(setf names): Exported generic functions
(setf names): Exported generic functions
(setf password): Exported generic functions
(setf password): Exported generic functions
(setf password): Exported generic functions
(setf payload): Exported generic functions
(setf payload): Exported generic functions
(setf payload): Exported generic functions
(setf permissions): Exported generic functions
(setf permissions): Exported generic functions
(setf permissions): Exported generic functions
(setf permitted): Exported generic functions
(setf permitted): Exported generic functions
(setf registered): Exported generic functions
(setf registered): Exported generic functions
(setf rule): Internal generic functions
(setf rule): Internal generic functions
(setf slot-type): Internal generic functions
(setf slot-type): Internal generic functions
(setf target): Exported generic functions
(setf target): Exported generic functions
(setf text): Exported generic functions
(setf text): Exported generic functions
(setf text): Exported generic functions
(setf update): Exported generic functions
(setf update): Exported generic functions
(setf update): Exported generic functions
(setf update-id): Exported generic functions
(setf update-id): Exported generic functions
(setf user): Exported generic functions
(setf user): Exported generic functions
(setf users): Exported generic functions
(setf users): Exported generic functions
(setf users): Exported generic functions
(setf version): Exported generic functions
(setf version): Exported generic functions

A
allowed-content-types: Exported generic functions
allowed-content-types: Exported generic functions
attributes: Exported generic functions
attributes: Exported generic functions

B
by: Exported generic functions
by: Exported generic functions

C
channel: Exported generic functions
channel: Exported generic functions
channel: Exported generic functions
channelname-p: Exported functions
channels: Exported generic functions
channels: Exported generic functions
channels: Exported generic functions
check-compatible-slot-value: Internal functions
check-update-options: Exported functions
clock: Exported generic functions
clock: Exported generic functions
compatible-versions: Internal generic functions
compatible-versions: Internal generic functions
connections: Exported generic functions
connections: Exported generic functions
connections: Exported generic functions
connections: Exported generic functions
content-type: Exported generic functions
content-type: Exported generic functions
content-type: Exported generic functions

D
define-protocol-class: Exported macros
define-typed-class: Internal macros

E
extensions: Exported generic functions
extensions: Exported generic functions

F
filename: Exported generic functions
filename: Exported generic functions
from: Exported generic functions
from: Exported generic functions
from-wire: Exported functions
Function, channelname-p: Exported functions
Function, check-compatible-slot-value: Internal functions
Function, check-update-options: Exported functions
Function, from-wire: Exported functions
Function, id-p: Exported functions
Function, lpeek: Internal functions
Function, lread: Internal functions
Function, lunread: Internal functions
Function, maybe-sval: Internal functions
Function, next-id: Exported functions
Function, password-p: Exported functions
Function, print-sexpr: Exported functions
Function, print-sexpr-list: Internal functions
Function, print-sexpr-number: Internal functions
Function, print-sexpr-string: Internal functions
Function, print-sexpr-symbol: Internal functions
Function, print-sexpr-token: Internal functions
Function, protocol-version: Exported functions
Function, read-sexpr: Exported functions
Function, read-sexpr-keyword: Internal functions
Function, read-sexpr-list: Internal functions
Function, read-sexpr-number: Internal functions
Function, read-sexpr-string: Internal functions
Function, read-sexpr-symbol: Internal functions
Function, read-sexpr-token: Internal functions
Function, safe-find-symbol: Internal functions
Function, skip-whitespace: Internal functions
Function, to-wire: Exported functions
Function, username-p: Exported functions
Function, valid-name-char-p: Internal functions
Function, whitespace-p: Exported functions

G
Generic Function, (setf allowed-content-types): Exported generic functions
Generic Function, (setf attributes): Exported generic functions
Generic Function, (setf by): Exported generic functions
Generic Function, (setf channel): Exported generic functions
Generic Function, (setf channels): Exported generic functions
Generic Function, (setf clock): Exported generic functions
Generic Function, (setf compatible-versions): Internal generic functions
Generic Function, (setf connections): Exported generic functions
Generic Function, (setf content-type): Exported generic functions
Generic Function, (setf extensions): Exported generic functions
Generic Function, (setf filename): Exported generic functions
Generic Function, (setf from): Exported generic functions
Generic Function, (setf id): Exported generic functions
Generic Function, (setf ip): Internal generic functions
Generic Function, (setf key): Exported generic functions
Generic Function, (setf keys): Exported generic functions
Generic Function, (setf lifetime): Exported generic functions
Generic Function, (setf mask): Internal generic functions
Generic Function, (setf name): Exported generic functions
Generic Function, (setf names): Exported generic functions
Generic Function, (setf password): Exported generic functions
Generic Function, (setf payload): Exported generic functions
Generic Function, (setf permissions): Exported generic functions
Generic Function, (setf permitted): Exported generic functions
Generic Function, (setf registered): Exported generic functions
Generic Function, (setf rule): Internal generic functions
Generic Function, (setf slot-type): Internal generic functions
Generic Function, (setf target): Exported generic functions
Generic Function, (setf text): Exported generic functions
Generic Function, (setf update): Exported generic functions
Generic Function, (setf update-id): Exported generic functions
Generic Function, (setf user): Exported generic functions
Generic Function, (setf users): Exported generic functions
Generic Function, (setf version): Exported generic functions
Generic Function, allowed-content-types: Exported generic functions
Generic Function, attributes: Exported generic functions
Generic Function, by: Exported generic functions
Generic Function, channel: Exported generic functions
Generic Function, channels: Exported generic functions
Generic Function, clock: Exported generic functions
Generic Function, compatible-versions: Internal generic functions
Generic Function, connections: Exported generic functions
Generic Function, content-type: Exported generic functions
Generic Function, extensions: Exported generic functions
Generic Function, filename: Exported generic functions
Generic Function, from: Exported generic functions
Generic Function, id: Exported generic functions
Generic Function, ip: Internal generic functions
Generic Function, key: Exported generic functions
Generic Function, keys: Exported generic functions
Generic Function, lifetime: Exported generic functions
Generic Function, mask: Internal generic functions
Generic Function, name: Exported generic functions
Generic Function, names: Exported generic functions
Generic Function, object: Exported generic functions
Generic Function, password: Exported generic functions
Generic Function, payload: Exported generic functions
Generic Function, permissions: Exported generic functions
Generic Function, permitted: Exported generic functions
Generic Function, registered: Exported generic functions
Generic Function, reqtype: Internal generic functions
Generic Function, rule: Internal generic functions
Generic Function, slot: Internal generic functions
Generic Function, slot-type: Internal generic functions
Generic Function, symbol-designator: Exported generic functions
Generic Function, target: Exported generic functions
Generic Function, text: Exported generic functions
Generic Function, update: Exported generic functions
Generic Function, update-id: Exported generic functions
Generic Function, user: Exported generic functions
Generic Function, users: Exported generic functions
Generic Function, value: Internal generic functions
Generic Function, version: Exported generic functions

I
id: Exported generic functions
id: Exported generic functions
id-p: Exported functions
ip: Internal generic functions
ip: Internal generic functions
ip: Internal generic functions

K
key: Exported generic functions
key: Exported generic functions
key: Exported generic functions
keys: Exported generic functions
keys: Exported generic functions

L
lifetime: Exported generic functions
lifetime: Exported generic functions
lifetime: Exported generic functions
lpeek: Internal functions
lread: Internal functions
lunread: Internal functions

M
Macro, define-protocol-class: Exported macros
Macro, define-typed-class: Internal macros
mask: Internal generic functions
mask: Internal generic functions
mask: Internal generic functions
maybe-sval: Internal functions
Method, (setf allowed-content-types): Exported generic functions
Method, (setf attributes): Exported generic functions
Method, (setf by): Exported generic functions
Method, (setf channel): Exported generic functions
Method, (setf channel): Exported generic functions
Method, (setf channels): Exported generic functions
Method, (setf channels): Exported generic functions
Method, (setf clock): Exported generic functions
Method, (setf compatible-versions): Internal generic functions
Method, (setf connections): Exported generic functions
Method, (setf connections): Exported generic functions
Method, (setf connections): Exported generic functions
Method, (setf content-type): Exported generic functions
Method, (setf content-type): Exported generic functions
Method, (setf extensions): Exported generic functions
Method, (setf filename): Exported generic functions
Method, (setf from): Exported generic functions
Method, (setf id): Exported generic functions
Method, (setf ip): Internal generic functions
Method, (setf ip): Internal generic functions
Method, (setf key): Exported generic functions
Method, (setf key): Exported generic functions
Method, (setf keys): Exported generic functions
Method, (setf lifetime): Exported generic functions
Method, (setf lifetime): Exported generic functions
Method, (setf mask): Internal generic functions
Method, (setf mask): Internal generic functions
Method, (setf name): Exported generic functions
Method, (setf name): Exported generic functions
Method, (setf names): Exported generic functions
Method, (setf password): Exported generic functions
Method, (setf password): Exported generic functions
Method, (setf payload): Exported generic functions
Method, (setf payload): Exported generic functions
Method, (setf permissions): Exported generic functions
Method, (setf permissions): Exported generic functions
Method, (setf permitted): Exported generic functions
Method, (setf registered): Exported generic functions
Method, (setf rule): Internal generic functions
Method, (setf slot-type): Internal generic functions
Method, (setf target): Exported generic functions
Method, (setf text): Exported generic functions
Method, (setf text): Exported generic functions
Method, (setf update): Exported generic functions
Method, (setf update): Exported generic functions
Method, (setf update-id): Exported generic functions
Method, (setf user): Exported generic functions
Method, (setf users): Exported generic functions
Method, (setf users): Exported generic functions
Method, (setf version): Exported generic functions
Method, allowed-content-types: Exported generic functions
Method, attributes: Exported generic functions
Method, by: Exported generic functions
Method, channel: Exported generic functions
Method, channel: Exported generic functions
Method, channels: Exported generic functions
Method, channels: Exported generic functions
Method, clock: Exported generic functions
Method, compatible-versions: Internal generic functions
Method, connections: Exported generic functions
Method, connections: Exported generic functions
Method, connections: Exported generic functions
Method, content-type: Exported generic functions
Method, content-type: Exported generic functions
Method, extensions: Exported generic functions
Method, filename: Exported generic functions
Method, from: Exported generic functions
Method, id: Exported generic functions
Method, ip: Internal generic functions
Method, ip: Internal generic functions
Method, key: Exported generic functions
Method, key: Exported generic functions
Method, keys: Exported generic functions
Method, lifetime: Exported generic functions
Method, lifetime: Exported generic functions
Method, mask: Internal generic functions
Method, mask: Internal generic functions
Method, name: Exported generic functions
Method, name: Exported generic functions
Method, names: Exported generic functions
Method, object: Exported generic functions
Method, object: Exported generic functions
Method, password: Exported generic functions
Method, password: Exported generic functions
Method, payload: Exported generic functions
Method, payload: Exported generic functions
Method, permissions: Exported generic functions
Method, permissions: Exported generic functions
Method, permitted: Exported generic functions
Method, registered: Exported generic functions
Method, reqtype: Internal generic functions
Method, rule: Internal generic functions
Method, slot: Internal generic functions
Method, slot-type: Internal generic functions
Method, symbol-designator: Exported generic functions
Method, symbol-designator: Exported generic functions
Method, target: Exported generic functions
Method, text: Exported generic functions
Method, text: Exported generic functions
Method, update: Exported generic functions
Method, update: Exported generic functions
Method, update: Exported generic functions
Method, update: Exported generic functions
Method, update: Exported generic functions
Method, update-id: Exported generic functions
Method, user: Exported generic functions
Method, users: Exported generic functions
Method, users: Exported generic functions
Method, value: Internal generic functions
Method, version: Exported generic functions

N
name: Exported generic functions
name: Exported generic functions
name: Exported generic functions
names: Exported generic functions
names: Exported generic functions
next-id: Exported functions

O
object: Exported generic functions
object: Exported generic functions
object: Exported generic functions

P
password: Exported generic functions
password: Exported generic functions
password: Exported generic functions
password-p: Exported functions
payload: Exported generic functions
payload: Exported generic functions
payload: Exported generic functions
permissions: Exported generic functions
permissions: Exported generic functions
permissions: Exported generic functions
permitted: Exported generic functions
permitted: Exported generic functions
print-sexpr: Exported functions
print-sexpr-list: Internal functions
print-sexpr-number: Internal functions
print-sexpr-string: Internal functions
print-sexpr-symbol: Internal functions
print-sexpr-token: Internal functions
protocol-version: Exported functions

R
read-sexpr: Exported functions
read-sexpr-keyword: Internal functions
read-sexpr-list: Internal functions
read-sexpr-number: Internal functions
read-sexpr-string: Internal functions
read-sexpr-symbol: Internal functions
read-sexpr-token: Internal functions
registered: Exported generic functions
registered: Exported generic functions
reqtype: Internal generic functions
reqtype: Internal generic functions
rule: Internal generic functions
rule: Internal generic functions

S
safe-find-symbol: Internal functions
skip-whitespace: Internal functions
slot: Internal generic functions
slot: Internal generic functions
slot-type: Internal generic functions
slot-type: Internal generic functions
symbol-designator: Exported generic functions
symbol-designator: Exported generic functions
symbol-designator: Exported generic functions

T
target: Exported generic functions
target: Exported generic functions
text: Exported generic functions
text: Exported generic functions
text: Exported generic functions
to-wire: Exported functions

U
update: Exported generic functions
update: Exported generic functions
update: Exported generic functions
update: Exported generic functions
update: Exported generic functions
update: Exported generic functions
update-id: Exported generic functions
update-id: Exported generic functions
user: Exported generic functions
user: Exported generic functions
username-p: Exported functions
users: Exported generic functions
users: Exported generic functions
users: Exported generic functions

V
valid-name-char-p: Internal functions
value: Internal generic functions
value: Internal generic functions
version: Exported generic functions
version: Exported generic functions

W
whitespace-p: Exported functions

Jump to:   (  
A   B   C   D   E   F   G   I   K   L   M   N   O   P   R   S   T   U   V   W  

Next: , Previous: , Up: Indexes   [Contents][Index]

A.3 Variables

Jump to:   *  
A   B   C   E   F   I   K   L   M   N   O   P   R   S   T   U   V  
Index Entry  Section

*
*default-anonymous-channel-permissions*: Exported special variables
*default-channel-lifetime*: Exported special variables
*default-primary-channel-permissions*: Exported special variables
*default-profile-lifetime*: Exported special variables
*default-regular-channel-permissions*: Exported special variables
*errors*: Internal special variables
*id-counter*: Exported special variables
*invalid-symbol*: Internal special variables
*read-counter*: Internal special variables
*read-limit*: Internal special variables
*unbound-value*: Internal special variables
*whitespace*: Internal special variables

A
allowed-content-types: Exported classes
attributes: Exported classes

B
by: Exported classes

C
channel: Exported classes
channel: Exported classes
channels: Exported classes
channels: Exported classes
clock: Exported classes
compatible-versions: Exported classes
connections: Exported classes
connections: Exported classes
connections: Exported classes
content-type: Exported classes
content-type: Exported classes

E
extensions: Exported classes

F
filename: Exported classes
from: Exported classes

I
id: Exported classes
ip: Exported classes
ip: Exported classes

K
key: Exported classes
key: Exported classes
keys: Exported classes

L
lifetime: Exported classes
lifetime: Exported classes

M
mask: Exported classes
mask: Exported classes

N
name: Exported classes
name: Exported classes
name: Exported classes
name: Exported classes
name: Exported classes
names: Exported classes

O
object: Exported conditions
object: Exported conditions

P
password: Exported classes
password: Exported classes
payload: Exported classes
payload: Exported classes
permissions: Exported classes
permissions: Exported classes
permitted: Exported classes

R
registered: Exported classes
rule: Exported classes

S
slot: Exported conditions
Slot, allowed-content-types: Exported classes
Slot, attributes: Exported classes
Slot, by: Exported classes
Slot, channel: Exported classes
Slot, channel: Exported classes
Slot, channels: Exported classes
Slot, channels: Exported classes
Slot, clock: Exported classes
Slot, compatible-versions: Exported classes
Slot, connections: Exported classes
Slot, connections: Exported classes
Slot, connections: Exported classes
Slot, content-type: Exported classes
Slot, content-type: Exported classes
Slot, extensions: Exported classes
Slot, filename: Exported classes
Slot, from: Exported classes
Slot, id: Exported classes
Slot, ip: Exported classes
Slot, ip: Exported classes
Slot, key: Exported classes
Slot, key: Exported classes
Slot, keys: Exported classes
Slot, lifetime: Exported classes
Slot, lifetime: Exported classes
Slot, mask: Exported classes
Slot, mask: Exported classes
Slot, name: Exported classes
Slot, name: Exported classes
Slot, name: Exported classes
Slot, name: Exported classes
Slot, name: Exported classes
Slot, names: Exported classes
Slot, object: Exported conditions
Slot, object: Exported conditions
Slot, password: Exported classes
Slot, password: Exported classes
Slot, payload: Exported classes
Slot, payload: Exported classes
Slot, permissions: Exported classes
Slot, permissions: Exported classes
Slot, permitted: Exported classes
Slot, registered: Exported classes
Slot, rule: Exported classes
Slot, slot: Exported conditions
Slot, slot-type: Internal classes
Slot, symbol-designator: Exported conditions
Slot, symbol-designator: Exported conditions
Slot, target: Exported classes
Slot, text: Exported classes
Slot, text: Exported classes
Slot, type: Exported conditions
Slot, update: Exported conditions
Slot, update: Exported conditions
Slot, update: Exported conditions
Slot, update: Exported classes
Slot, update: Exported classes
Slot, update-id: Exported classes
Slot, user: Exported classes
Slot, users: Exported classes
Slot, users: Exported classes
Slot, value: Exported conditions
Slot, version: Exported classes
slot-type: Internal classes
Special Variable, *default-anonymous-channel-permissions*: Exported special variables
Special Variable, *default-channel-lifetime*: Exported special variables
Special Variable, *default-primary-channel-permissions*: Exported special variables
Special Variable, *default-profile-lifetime*: Exported special variables
Special Variable, *default-regular-channel-permissions*: Exported special variables
Special Variable, *errors*: Internal special variables
Special Variable, *id-counter*: Exported special variables
Special Variable, *invalid-symbol*: Internal special variables
Special Variable, *read-counter*: Internal special variables
Special Variable, *read-limit*: Internal special variables
Special Variable, *unbound-value*: Internal special variables
Special Variable, *whitespace*: Internal special variables
symbol-designator: Exported conditions
symbol-designator: Exported conditions

T
target: Exported classes
text: Exported classes
text: Exported classes
type: Exported conditions

U
update: Exported conditions
update: Exported conditions
update: Exported conditions
update: Exported classes
update: Exported classes
update-id: Exported classes
user: Exported classes
users: Exported classes
users: Exported classes

V
value: Exported conditions
version: Exported classes

Jump to:   *  
A   B   C   E   F   I   K   L   M   N   O   P   R   S   T   U   V  

Previous: , Up: Indexes   [Contents][Index]

A.4 Data types

Jump to:   A   B   C   D   E   F   G   I   J   K   L   M   N   P   Q   R   S   T   U   W  
Index Entry  Section

A
already-connected: Exported classes
already-in-channel: Exported classes

B
backfill: Exported classes
bad-content-type: Exported classes
bad-ip-format: Exported classes
bad-name: Exported classes
ban: Exported classes

C
capabilities: Exported classes
channel: Exported classes
channel-info: Exported classes
channel-update: Exported classes
channelname: Exported types
channelname-taken: Exported classes
channels: Exported classes
Class, already-connected: Exported classes
Class, already-in-channel: Exported classes
Class, backfill: Exported classes
Class, bad-content-type: Exported classes
Class, bad-ip-format: Exported classes
Class, bad-name: Exported classes
Class, ban: Exported classes
Class, capabilities: Exported classes
Class, channel: Exported classes
Class, channel-info: Exported classes
Class, channel-update: Exported classes
Class, channelname-taken: Exported classes
Class, channels: Exported classes
Class, clock-skewed: Exported classes
Class, connect: Exported classes
Class, connection: Exported classes
Class, connection-unstable: Exported classes
Class, create: Exported classes
Class, data: Exported classes
Class, deny: Exported classes
Class, destroy: Exported classes
Class, disconnect: Exported classes
Class, edit: Exported classes
Class, emote: Exported classes
Class, emotes: Exported classes
Class, failure: Exported classes
Class, grant: Exported classes
Class, incompatible-version: Exported classes
Class, insufficient-permissions: Exported classes
Class, invalid-password: Exported classes
Class, invalid-permissions: Exported classes
Class, invalid-update: Exported classes
Class, ip-ban: Exported classes
Class, ip-unban: Exported classes
Class, join: Exported classes
Class, kick: Exported classes
Class, kill: Exported classes
Class, leave: Exported classes
Class, malformed-channel-info: Exported classes
Class, malformed-update: Exported classes
Class, message: Exported classes
Class, named-object: Exported classes
Class, no-such-channel: Exported classes
Class, no-such-channel-info: Exported classes
Class, no-such-parent-channel: Exported classes
Class, no-such-profile: Exported classes
Class, no-such-user: Exported classes
Class, not-in-channel: Exported classes
Class, pause: Exported classes
Class, permissions: Exported classes
Class, ping: Exported classes
Class, pong: Exported classes
Class, profile: Exported classes
Class, pull: Exported classes
Class, quiet: Exported classes
Class, register: Exported classes
Class, registration-rejected: Exported classes
Class, server-info: Exported classes
Class, server-object: Exported classes
Class, set-channel-info: Exported classes
Class, target-update: Exported classes
Class, text-update: Exported classes
Class, too-many-connections: Exported classes
Class, too-many-updates: Exported classes
Class, typed-direct-slot-definition: Internal classes
Class, typed-effective-slot-definition: Internal classes
Class, typed-object: Internal classes
Class, typed-slot: Internal classes
Class, typed-slot-class: Internal classes
Class, udpate-failure: Internal classes
Class, unban: Exported classes
Class, unquiet: Exported classes
Class, update: Exported classes
Class, update-failure: Exported classes
Class, update-too-long: Exported classes
Class, user: Exported classes
Class, user-info: Exported classes
Class, username-mismatch: Exported classes
Class, username-taken: Exported classes
Class, users: Exported classes
Class, wire-object: Exported classes
clock-skewed: Exported classes
Condition, incompatible-value-type-for-slot: Exported conditions
Condition, incomplete-token: Exported conditions
Condition, malformed-wire-object: Exported conditions
Condition, missing-clock: Exported conditions
Condition, missing-id: Exported conditions
Condition, missing-update-argument: Exported conditions
Condition, null-in-symbol-designator: Exported conditions
Condition, printer-condition: Exported conditions
Condition, protocol-condition: Exported conditions
Condition, read-limit-hit: Exported conditions
Condition, reader-condition: Exported conditions
Condition, stray-null-found: Exported conditions
Condition, unknown-symbol: Exported conditions
Condition, unknown-wire-object: Exported conditions
Condition, unprintable-object: Exported conditions
Condition, wire-condition: Exported conditions
connect: Exported classes
connection: Exported classes
connection-unstable: Exported classes
create: Exported classes

D
data: Exported classes
deny: Exported classes
destroy: Exported classes
disconnect: Exported classes

E
edit: Exported classes
emote: Exported classes
emotes: Exported classes

F
failure: Exported classes

G
grant: Exported classes

I
id: Exported types
incompatible-value-type-for-slot: Exported conditions
incompatible-version: Exported classes
incomplete-token: Exported conditions
insufficient-permissions: Exported classes
invalid-password: Exported classes
invalid-permissions: Exported classes
invalid-update: Exported classes
ip-ban: Exported classes
ip-unban: Exported classes

J
join: Exported classes

K
kick: Exported classes
kill: Exported classes

L
leave: Exported classes
lichat-protocol: The lichat-protocol system
lichat-protocol: The lichat-protocol package

M
malformed-channel-info: Exported classes
malformed-update: Exported classes
malformed-wire-object: Exported conditions
message: Exported classes
missing-clock: Exported conditions
missing-id: Exported conditions
missing-update-argument: Exported conditions

N
named-object: Exported classes
no-such-channel: Exported classes
no-such-channel-info: Exported classes
no-such-parent-channel: Exported classes
no-such-profile: Exported classes
no-such-user: Exported classes
not-in-channel: Exported classes
null-in-symbol-designator: Exported conditions

P
Package, lichat-protocol: The lichat-protocol package
password: Exported types
pause: Exported classes
permissions: Exported classes
ping: Exported classes
pong: Exported classes
printer-condition: Exported conditions
profile: Exported classes
protocol-condition: Exported conditions
pull: Exported classes

Q
quiet: Exported classes

R
read-limit-hit: Exported conditions
reader-condition: Exported conditions
register: Exported classes
registration-rejected: Exported classes

S
server-info: Exported classes
server-object: Exported classes
set-channel-info: Exported classes
stray-null-found: Exported conditions
System, lichat-protocol: The lichat-protocol system

T
target-update: Exported classes
text-update: Exported classes
too-many-connections: Exported classes
too-many-updates: Exported classes
Type, channelname: Exported types
Type, id: Exported types
Type, password: Exported types
Type, username: Exported types
Type, wireable: Exported types
typed-direct-slot-definition: Internal classes
typed-effective-slot-definition: Internal classes
typed-object: Internal classes
typed-slot: Internal classes
typed-slot-class: Internal classes

U
udpate-failure: Internal classes
unban: Exported classes
unknown-symbol: Exported conditions
unknown-wire-object: Exported conditions
unprintable-object: Exported conditions
unquiet: Exported classes
update: Exported classes
update-failure: Exported classes
update-too-long: Exported classes
user: Exported classes
user-info: Exported classes
username: Exported types
username-mismatch: Exported classes
username-taken: Exported classes
users: Exported classes

W
wire-condition: Exported conditions
wire-object: Exported classes
wireable: Exported types

Jump to:   A   B   C   D   E   F   G   I   J   K   L   M   N   P   Q   R   S   T   U   W