Go to file
jesopo 2094648a51 freenode is dead long live libera.chat 2021-05-24 17:26:37 +00:00
irctokens superfluous old line 2020-10-01 22:00:21 +00:00
test merge tokenise() and tokenise_b() - using Union[str,bytes] 2020-09-30 20:00:36 +00:00
.gitignore Initial commit 2020-03-11 11:26:13 +00:00
.travis.yml remove pyyaml from requirements.txt - just make it a travis thing 2020-03-24 14:32:20 +00:00
LICENSE change LICENSE from GPL-3.0 to MIT 2020-03-23 13:05:14 +00:00
README.md freenode is dead long live libera.chat 2021-05-24 17:26:37 +00:00
VERSION v2.0.0 release 2020-09-30 20:03:24 +00:00
setup.py remove pyyaml from requirements.txt - just make it a travis thing 2020-03-24 14:32:20 +00:00

README.md

irctokens

Build Status

rationale

there's far too many IRC client implementations out in the world that do not tokenise data correctly and thus fall victim to things like colons either being where you don't expect them or not being where you expect them.

usage

installation

$ pip3 install irctokens

tokenisation

>>> import irctokens
>>> line = irctokens.tokenise(
...     "@id=123 :jess!~jess@hostname PRIVMSG #chat :hello there!")
>>>
>>> line.tags
{'id': '123'}
>>> line.source
'jess!~jess@hostname'
>>> line.hostmask
Hostmask(nickname='jess', username='~jess', hostname='hostname')
>>> line.command
'PRIVMSG'
>>> line.params
['#chat', 'hello there!']

formatting

>>> irctokens.build("USER", ["user", "0", "*", "real name"]).format()
'USER user 0 * :real name'

stateful

below is an example of a fully socket-wise safe IRC client connection that will connect and join a channel. both protocol sending and receiving are handled by irctokens.


import irctokens, socket

NICK = "nickname"
CHAN = "#channel"

d = irctokens.StatefulDecoder()
e = irctokens.StatefulEncoder()
s = socket.socket()
s.connect(("127.0.0.1", 6667))

def _send(line):
    print(f"> {line.format()}")
    e.push(line)
    while e.pending():
        e.pop(s.send(e.pending()))

_send(irctokens.build("USER", ["username", "0", "*", "real name"]))
_send(irctokens.build("NICK", [NICK]))

while True:
    lines = d.push(s.recv(1024))
    if lines == None:
        print("! disconnected")
        break

    for line in lines:
        print(f"< {line.format()}")
        if line.command == "PING":
            to_send = irctokens.build("PONG", [line.params[0]])
            _send(to_send)

        elif line.command == "001":
            to_send = irctokens.build("JOIN", [CHAN])
            _send(to_send)

contact

Come say hi at #irctokens on irc.libera.chat