Protocol

The protocol module subpackage implements LysKOM types as well as a parser and writer for encoding/decoding.

Base

class pyskom.protocol.base.AsyncMessage(*args, **kwargs)
exception pyskom.protocol.base.KomError(ref_id: int, status: int | None = None)
class pyskom.protocol.base.KomType(*args, **kwargs)
exception pyskom.protocol.base.MessageError
exception pyskom.protocol.base.MiscInfoOutOfOrderError

Raised when Misc-Info is parsed out of order (https://www.lysator.liu.se/lyskom/protocol/11.1/The-Misc-Info-List.html#The%20Misc-Info%20List).

exception pyskom.protocol.base.ParseError
class pyskom.protocol.base.SimpleType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)

Message Writer & Parser

class pyskom.protocol.MessageParser(message: bytes, encoding='iso-8859-1', cursor: int = 0)
property cursor: int
read_array(child_type: SimpleType)
read_array_end() bool

Return true if a array with items is found otherwise return False, if no array is found raise

read_array_start() bool

Return true if a array with items is found otherwise return False, if no array is found raise

read_array_type(type_constructor: Callable[[MessageParser], Any])
read_bool()
read_bytes() bytes
read_element()
read_float()
read_int() int
read_int16()
read_int32()
read_int8()
read_reply() int | None
read_str() str
class pyskom.protocol.MessageWriter(encoding='iso-8859-1')
write_array(child_type: SimpleType, items: list[Any])
write_array_end()
write_array_start()
write_array_type(items: list[KomType])
write_bin(b: bytearray | bytes)
write_bool(b: bool)
write_float(x: float)
write_int(n: int)
write_str(text: str)
write_token(text: str)

LysKOM types

class pyskom.protocol.kom_types.AuxItem(aux_no: AuxNo, tag: KomInt32, creator: PersNo, created_at: Time, flags: AuxItemFlags, inherit_limit: KomInt32, data: KomStr)

Aux-Item

aux_no: AuxNo
tag: KomInt32
creator: PersNo
created_at: Time
flags: AuxItemFlags
inherit_limit: KomInt32
data: KomStr
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.AuxItemFlags(deleted: KomBool, inherit: KomBool, secret: KomBool, hide_creator: KomBool, dont_garb: KomBool, reserved2: KomBool, reserved3: KomBool, reserved4: KomBool)
deleted: KomBool
inherit: KomBool
secret: KomBool
hide_creator: KomBool
dont_garb: KomBool
reserved2: KomBool
reserved3: KomBool
reserved4: KomBool
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.AuxItemInput(tag: KomInt32, flags: AuxItemFlags, inherit_limit: KomInt32, data: KomStr)

Aux-Item-Input

tag: KomInt32
flags: AuxItemFlags
inherit_limit: KomInt32
data: KomStr
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.ConfType(rd_prot: KomBool, original: KomBool, secret: KomBool, letterbox: KomBool)
rd_prot: KomBool
original: KomBool
secret: KomBool
letterbox: KomBool
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.ConfZInfo(name: KomStr, type: ConfType, conf_no: ConfNo)

Conf-Z-Info

name: KomStr
type: ConfType
conf_no: ConfNo
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Conference(name: KomStr, type: ExtendedConfType, creation_time: Time, last_written: Time, creator: PersNo, presentation: TextNo, supervisor: ConfNo, permitted_submitters: ConfNo, super_conf: ConfNo, msg_of_day: TextNo, nice: GarbNice, keep_commented: GarbNice, no_of_members: KomInt16, first_local_no: LocalTextNo, no_of_texts: KomInt32, expire: GarbNice, aux_items: list[AuxItem])
name: KomStr
type: ExtendedConfType
creation_time: Time
last_written: Time
creator: PersNo
presentation: TextNo
supervisor: ConfNo
permitted_submitters: ConfNo
super_conf: ConfNo
msg_of_day: TextNo
nice: GarbNice
keep_commented: GarbNice
no_of_members: KomInt16
first_local_no: LocalTextNo
no_of_texts: KomInt32
expire: GarbNice
aux_items: list[AuxItem]
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.DynamicSessionInfo(session: SessionNo, person: PersNo, working_conference: ConfNo, idle_time: KomInt32, flags: SessionFlags, what_am_i_doing: KomStr)

Dynamic-Session-Info

session: SessionNo
person: PersNo
working_conference: ConfNo
idle_time: KomInt32
flags: SessionFlags
what_am_i_doing: KomStr
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.ExtendedConfType(rd_prot: KomBool, original: KomBool, secret: KomBool, letterbox: KomBool, allow_anonymous: KomBool, forbid_secret: KomBool, reserved2: KomBool, reserved3: KomBool)
rd_prot: KomBool
original: KomBool
secret: KomBool
letterbox: KomBool
allow_anonymous: KomBool
forbid_secret: KomBool
reserved2: KomBool
reserved3: KomBool
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Info(version: KomInt32, conf_pres_conf: ConfNo, pers_pres_conf: ConfNo, motd_conf: ConfNo, kom_news_conf: ConfNo, motd_of_lyskom: TextNo, aux_item_list: list[AuxItem])
version: KomInt32
conf_pres_conf: ConfNo
pers_pres_conf: ConfNo
motd_conf: ConfNo
kom_news_conf: ConfNo
motd_of_lyskom: TextNo
aux_item_list: list[AuxItem]
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.InfoOld(version: KomInt32, conf_pres_conf: ConfNo, pers_pres_conf: ConfNo, motd_conf: ConfNo, kom_news_conf: ConfNo, motd_of_lyskom: TextNo)

Info-Old

version: KomInt32
conf_pres_conf: ConfNo
pers_pres_conf: ConfNo
motd_conf: ConfNo
kom_news_conf: ConfNo
motd_of_lyskom: TextNo
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.InfoType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)
recipient = '0'
cc_recipient = '1'
comment_to = '2'
commented_in = '3'
footnote_to = '4'
footnoted_in = '5'
local_no = '6'
received_at = '7'
sender = '8'
sent_at = '9'
bcc_recipient = '15'
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.LocalToGlobalBlock(selection: int, value: Any)
SPARSE_BLOCK: ClassVar[int] = 0
DENSE_BLOCK: ClassVar[int] = 1
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Mark(text_no: TextNo, type: KomInt8)
text_no: TextNo
type: KomInt8
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Member(member: PersNo, added_by: PersNo, added_at: Time, type: MembershipType)
member: PersNo
added_by: PersNo
added_at: Time
type: MembershipType
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Membership(position: KomInt32, last_time_read: Time, conference: ConfNo, priority: KomInt8, read_ranges: list[ReadRange], added_by: PersNo, added_at: Time, type: MembershipType)
position: KomInt32
last_time_read: Time
conference: ConfNo
priority: KomInt8
read_ranges: list[ReadRange]
added_by: PersNo
added_at: Time
type: MembershipType
property read_range_list: list[tuple[int, int]]
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.MembershipType(invitation: KomBool, passive: KomBool, secret: KomBool, passive_message_invert: KomBool, reserved2: KomBool, reserved3: KomBool, reserved4: KomBool, reserved5: KomBool)
invitation: KomBool
passive: KomBool
secret: KomBool
passive_message_invert: KomBool
reserved2: KomBool
reserved3: KomBool
reserved4: KomBool
reserved5: KomBool
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.MiscInfo(selection: int, value: Any)
RECIPIENT: ClassVar[int] = 0
CC_RECIPIENT: ClassVar[int] = 1
COMMENT_TO: ClassVar[int] = 2
COMMENTED_IN: ClassVar[int] = 3
FOOTNOTE_TO: ClassVar[int] = 4
FOOTNOTED_IN: ClassVar[int] = 5
LOCAL_NO: ClassVar[int] = 6
RECEIVED_AT: ClassVar[int] = 7
SENDER: ClassVar[int] = 8
SENT_AT: ClassVar[int] = 9
BCC_RECIPIENT: ClassVar[int] = 15
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Person(username: KomStr, privileges: PrivBits, flags: PersonalFlags, last_login: Time, user_area: TextNo, total_time_present: KomInt32, sessions: KomInt32, created_lines: KomInt32, created_bytes: KomInt32, read_texts: KomInt32, no_of_text_fetches: KomInt32, created_persons: KomInt16, created_confs: KomInt16, first_created_local_no: KomInt32, no_of_created_texts: KomInt32, no_of_marks: KomInt16, no_of_confs: KomInt16)
username: KomStr
privileges: PrivBits
flags: PersonalFlags
last_login: Time
user_area: TextNo
total_time_present: KomInt32
sessions: KomInt32
created_lines: KomInt32
created_bytes: KomInt32
read_texts: KomInt32
no_of_text_fetches: KomInt32
created_persons: KomInt16
created_confs: KomInt16
first_created_local_no: KomInt32
no_of_created_texts: KomInt32
no_of_marks: KomInt16
no_of_confs: KomInt16
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.PersonalFlags(unread_is_secret: KomBool, flg2: KomBool, flg3: KomBool, flg4: KomBool, flg5: KomBool, flg6: KomBool, flg7: KomBool, flg8: KomBool)
unread_is_secret: KomBool
flg2: KomBool
flg3: KomBool
flg4: KomBool
flg5: KomBool
flg6: KomBool
flg7: KomBool
flg8: KomBool
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.PrivBits(wheel: KomBool, admin: KomBool, statistic: KomBool, create_pers: KomBool, create_conf: KomBool, change_name: KomBool, flg7: KomBool, flg8: KomBool, flg9: KomBool, flg10: KomBool, flg11: KomBool, flg12: KomBool, flg13: KomBool, flg14: KomBool, flg15: KomBool, flg16: KomBool)
wheel: KomBool
admin: KomBool
statistic: KomBool
create_pers: KomBool
create_conf: KomBool
change_name: KomBool
flg7: KomBool
flg8: KomBool
flg9: KomBool
flg10: KomBool
flg11: KomBool
flg12: KomBool
flg13: KomBool
flg14: KomBool
flg15: KomBool
flg16: KomBool
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.ReadRange(first_read: LocalTextNo, last_read: LocalTextNo)

Read-Range

first_read: LocalTextNo
last_read: LocalTextNo
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.SessionFlags(invisible: KomBool, user_active_used: KomBool, user_absent: KomBool, reserved3: KomBool, reserved4: KomBool, reserved5: KomBool, reserved6: KomBool, reserved7: KomBool)
invisible: KomBool
user_active_used: KomBool
user_absent: KomBool
reserved3: KomBool
reserved4: KomBool
reserved5: KomBool
reserved6: KomBool
reserved7: KomBool
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.StaticServerInfo(boot_time: Time, save_time: Time, db_status: KomStr, existing_texts: KomInt32, highest_text_no: TextNo, existing_confs: KomInt32, existing_persons: KomInt32, highest_conf_no: ConfNo)

Static-Server-Info

boot_time: Time
save_time: Time
db_status: KomStr
existing_texts: KomInt32
highest_text_no: TextNo
existing_confs: KomInt32
existing_persons: KomInt32
highest_conf_no: ConfNo
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.StaticSessionInfo(username: KomStr, hostname: KomStr, ident_user: KomStr, connection_time: Time)

Static-Session-Info

username: KomStr
hostname: KomStr
ident_user: KomStr
connection_time: Time
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Stats(average: KomFloat, ascent_rate: KomFloat, descent_rate: KomFloat)
average: KomFloat
ascent_rate: KomFloat
descent_rate: KomFloat
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.StatsDescription(what: list[KomStr], when: list[KomInt32])

Stats-Description

what: list[KomStr]
when: list[KomInt32]
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.TextList(first_local_no: LocalTextNo, texts: list[TextNo])

Text-List

first_local_no: LocalTextNo
texts: list[TextNo]
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.TextMapping(range_begin: LocalTextNo, range_end: LocalTextNo, more_texts_exists: KomBool, block: LocalToGlobalBlock)

Text-Mapping

range_begin: LocalTextNo
range_end: LocalTextNo
more_texts_exists: KomBool
block: LocalToGlobalBlock
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.TextNumberPair(local_number: LocalTextNo, global_number: TextNo)

Text-Number-Pair

local_number: LocalTextNo
global_number: TextNo
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.TextStat(creation_time: Time, author: PersNo, no_of_lines: KomInt32, no_of_chars: KomInt32, no_of_marks: KomInt16, misc_info: list[MiscInfo], aux_items: list[AuxItem])

Text-Stat

creation_time: Time
author: PersNo
no_of_lines: KomInt32
no_of_chars: KomInt32
no_of_marks: KomInt16
misc_info: list[MiscInfo]
aux_items: list[AuxItem]
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Time(seconds: KomInt32, minutes: KomInt32, hours: KomInt32, day: KomInt32, month: KomInt32, year: KomInt32, day_of_week: KomInt32, day_of_year: KomInt32, is_dst: KomBool)
seconds: KomInt32
minutes: KomInt32
hours: KomInt32
day: KomInt32
month: KomInt32
year: KomInt32
day_of_week: KomInt32
day_of_year: KomInt32
is_dst: KomBool
property datetime: datetime
property timestamp: int
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.Uconference(name: KomStr, type: ExtendedConfType, highest_local_no: LocalTextNo, nice: GarbNice)

UConference

name: KomStr
type: ExtendedConfType
highest_local_no: LocalTextNo
nice: GarbNice
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.VersionInfo(protocol_version: KomInt32, server_software: KomStr, software_version: KomStr)

Version-Info

protocol_version: KomInt32
server_software: KomStr
software_version: KomStr
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.WhoInfo(person: PersNo, working_conference: ConfNo, session: SessionNo, what_am_i_doing: KomStr, username: KomStr)

Who-Info

person: PersNo
working_conference: ConfNo
session: SessionNo
what_am_i_doing: KomStr
username: KomStr
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
classmethod parse_array(parser: MessageParser) list[Self]
class pyskom.protocol.kom_types.AsyncNewName(conf_no: 'ConfNo', old_name: KomStr, new_name: KomStr)
conf_no: ConfNo
old_name: KomStr
new_name: KomStr
message_nr: ClassVar[int] = 5
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncIAmOn(info: 'WhoInfo')
info: WhoInfo
message_nr: ClassVar[int] = 6
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncSyncDb
message_nr: ClassVar[int] = 7
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncLeaveConf(conf_no: 'ConfNo')
conf_no: ConfNo
message_nr: ClassVar[int] = 8
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncLogin(pers_no: 'PersNo', session_no: 'SessionNo')
pers_no: PersNo
session_no: SessionNo
message_nr: ClassVar[int] = 9
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncRejectedConnection
message_nr: ClassVar[int] = 11
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncSendMessage(recipient: 'ConfNo', sender: 'PersNo', message: KomStr)
recipient: ConfNo
sender: PersNo
message: KomStr
message_nr: ClassVar[int] = 12
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncLogout(pers_no: 'PersNo', session_no: 'SessionNo')
pers_no: PersNo
session_no: SessionNo
message_nr: ClassVar[int] = 13
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncDeletedText(text_no: 'TextNo', text_stat: 'TextStat')
text_no: TextNo
text_stat: TextStat
message_nr: ClassVar[int] = 14
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncNewText(text_no: 'TextNo', text_stat: 'TextStat')
text_no: TextNo
text_stat: TextStat
message_nr: ClassVar[int] = 15
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncNewRecipient(text_no: 'TextNo', conf_no: 'ConfNo', type: 'InfoType')
text_no: TextNo
conf_no: ConfNo
type: InfoType
message_nr: ClassVar[int] = 16
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncSubRecipient(text_no: 'TextNo', conf_no: 'ConfNo', type: 'InfoType')
text_no: TextNo
conf_no: ConfNo
type: InfoType
message_nr: ClassVar[int] = 17
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncNewMembership(pers_no: 'PersNo', conf_no: 'ConfNo')
pers_no: PersNo
conf_no: ConfNo
message_nr: ClassVar[int] = 18
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncNewUserArea(pers_no: 'PersNo', old_user_area: 'TextNo', new_user_area: 'TextNo')
pers_no: PersNo
old_user_area: TextNo
new_user_area: TextNo
message_nr: ClassVar[int] = 19
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncNewPresentation(conf_no: 'ConfNo', old_presentation: 'TextNo', new_presentation: 'TextNo')
conf_no: ConfNo
old_presentation: TextNo
new_presentation: TextNo
message_nr: ClassVar[int] = 20
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncNewMotd(conf_no: 'ConfNo', old_motd: 'TextNo', new_motd: 'TextNo')
conf_no: ConfNo
old_motd: TextNo
new_motd: TextNo
message_nr: ClassVar[int] = 21
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncTextAuxChanged(text_no: 'TextNo', deleted: list['AuxItem'], added: list['AuxItem'])
text_no: TextNo
deleted: list[AuxItem]
added: list[AuxItem]
message_nr: ClassVar[int] = 22
write(writer: MessageWriter)
classmethod parse(parser: MessageParser) Self
class pyskom.protocol.kom_types.AsyncMessageNr
NEW_NAME = 5
I_AM_ON = 6
SYNC_DB = 7
LEAVE_CONF = 8
LOGIN = 9
REJECTED_CONNECTION = 11
SEND_MESSAGE = 12
LOGOUT = 13
DELETED_TEXT = 14
NEW_TEXT = 15
NEW_RECIPIENT = 16
SUB_RECIPIENT = 17
NEW_MEMBERSHIP = 18
NEW_USER_AREA = 19
NEW_PRESENTATION = 20
NEW_MOTD = 21
TEXT_AUX_CHANGED = 22