3.8 KiB
PyLink hooks reference
Introduction
In PyLink, protocol modules communicate with plugins through a system
of hooks. This has the benefit of being IRCd-independent, allowing most
plugins to function regardless of the IRCd being used. Each hook payload
is formatted as a Python list
, with three arguments
(numeric, command, args)
:
numeric: The sender of the message (UID).
command: The command name (hook name) of the payload. These are always UPPERCASE, and those starting with “PYLINK_” indicate hooks sent out by IRC objects themselves, that don’t require protocol modules to send.
args: The hook data (args), a Python
dict
, with different data keys depending on the command given.
Note that the ts
key is automatically added
(using the current time) to all hook data dicts that don’t include it -
such a key should only be provided if the command the uplink IRCd send
has a TS value itself.
Example syntax
The command :42XAAAAAB PRIVMSG #dev :test
would result
in the following raw hook data:
['42XAAAAAB', 'PRIVMSG', {'target': '#dev', 'text': 'test', 'ts': 1451174041}]
On UnrealIRCd, because SETHOST is mapped to CHGHOST,
:GL SETHOST blah
would return the raw hook data of this
(with the nick converted into UID by the UnrealIRCd protocol
module):
['001ZJZW01', 'CHGHOST', {'ts': 1451174512, 'target': '001ZJZW01', 'newhost': 'blah'}]
Some hooks, like MODE, are more complex and can include the entire
state of a channel! This will be further described later.
:GL MODE #chat +o PyLink-devel
is converted into
(pretty-printed for readability):
['001ZJZW01',
'MODE',
{'modes': [('+o', '38QAAAAAA')],
'oldchan': IrcChannel({'modes': set(),
'prefixmodes': {'admins': set(),
'halfops': set(),
'ops': set(),
'owners': set(),
'voices': set()},
'topic': '',
'topicset': False,
'ts': 1451169448,
'users': {'38QAAAAAA', '001ZJZW01'}}),
'target': '#chat',
'ts': 1451174702}]
Core hooks
The following hooks, sent with their correct data keys, are required for PyLink’s basic functioning.
- ENDBURST:
{}
- The hook data here is empty.
- This payload should be sent whenever a server finishes its burst, with the SID of the bursted server as the sender.
- Plugins like Relay need this to know that the uplink has finished bursting all its users!
- PYLINK_DISCONNECT:
{}
- This is sent to plugins by IRC object instances whenever their network has disconnected. The sender (numeric) here is always None.
- PYLINK_SPAWNMAIN:
{'olduser': olduserobj}
This is sent whenever
Irc.spawnMain()
is called to (re)spawn the main PyLink client, for example to rejoin it from a KILL. It basically tells plugins that the UID of the main PyLink client has changed, while giving them the old data too.Example payload:
{'olduser': IrcUser({'away': '', 'channels': {'#chat'}, 'host': 'pylink.local', 'ident': 'pylink', 'identified': False, 'ip': '0.0.0.0', 'manipulatable': True, 'modes': {('o', None)}, 'nick': 'PyLink-devel', 'realhost': 'pylink.local', 'realname': 'PyLink development server', 'ts': 1452393682, 'uid': '7PYAAAAAE'}), 'ts': 1452393899)}
IRC command hooks
The following hooks represent regular IRC commands sent between servers.
(under construction)