Skip to main content

Async IRC library for Python 3.14+

Project description

ircio

An asynchronous IRC client library for Python 3.14+, built on top of asyncio.

Features

  • Fully async — all I/O is non-blocking via asyncio.StreamReader/StreamWriter
  • IRCv3 message tags — parsed and serialised transparently
  • TLS — plain ssl=True for system CA verification, or pass a custom ssl.SSLContext for client certificates and private networks
  • SASL authentication
    • PLAIN — username and password (RFC 4616)
    • EXTERNAL — identity delegated to the TLS certificate
    • ECDSA-NIST256P-CHALLENGE — challenge–response using an ECDSA key on the NIST P-256 curve (used by Libera.Chat and other networks)
  • Event dispatcher — register async handlers per command, with wildcard ("*") support
  • Structured concurrency — handlers are dispatched via asyncio.TaskGroup

Requirements

  • Python ≥ 3.14
  • uv (recommended) or any PEP 517-compatible build tool

Optional, for ECDSA-NIST256P-CHALLENGE:

pip install "ircio[ecdsa]"

Quick start

import asyncio
from ircio import Client

client = Client(
    "irc.libera.chat",
    6697,
    nick="mybot",
    user="mybot",
    realname="My Bot",
    ssl=True,
)

@client.on("PRIVMSG")
async def on_privmsg(msg):
    target = msg.params[0]
    text   = msg.params[1]
    print(f"[{target}] {msg.prefix}: {text}")

async def main():
    await client.connect()
    await client.join("#python")
    await client.run()

asyncio.run(main())

SASL authentication

PLAIN

from ircio import Client, SASLPlain

client = Client(
    "irc.libera.chat", 6697,
    nick="mybot", user="mybot", realname="My Bot",
    ssl=True,
    sasl=SASLPlain("mybot", "s3cr3t"),
)

ECDSA-NIST256P-CHALLENGE

Register your public key with NickServ, then authenticate using the corresponding private key:

from ircio import Client, SASLEcdsaNist256pChallenge

sasl = SASLEcdsaNist256pChallenge.from_pem_file("mybot", "~/.irc/key.pem")

client = Client(
    "irc.libera.chat", 6697,
    nick="mybot", user="mybot", realname="My Bot",
    ssl=True,
    sasl=sasl,
)

Generate a key with OpenSSL:

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ~/.irc/key.pem
openssl pkey -in ~/.irc/key.pem -pubout

Provide the public key to NickServ: /msg NickServ SET PUBKEY <base64-pubkey>.

EXTERNAL (client certificate)

import ssl
from ircio import Client, SASLExternal

ctx = ssl.create_default_context()
ctx.load_cert_chain("cert.pem", "key.pem")

client = Client(
    "irc.libera.chat", 6697,
    nick="mybot", user="mybot", realname="My Bot",
    ssl=ctx,
    sasl=SASLExternal(),
)

Low-level API

Connection and Dispatcher are exposed for use cases that require finer control:

from ircio import Connection, Dispatcher, Message

async def main():
    async with Connection("irc.libera.chat", 6697, ssl=True) as conn:
        await conn.send(Message("NICK", ["mybot"]))
        await conn.send(Message("USER", ["mybot", "0", "*", "My Bot"]))
        while True:
            msg = await conn.readline()
            print(msg)

Development

uv sync
uv run pytest
uv run ruff check src/ tests/
uv run ruff format src/ tests/

Pre-commit hooks (ruff linter + formatter) are installed automatically on first commit after:

uv run pre-commit install

Licence

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ircio-1.0.0.tar.gz (27.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ircio-1.0.0-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

Details for the file ircio-1.0.0.tar.gz.

File metadata

  • Download URL: ircio-1.0.0.tar.gz
  • Upload date:
  • Size: 27.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ircio-1.0.0.tar.gz
Algorithm Hash digest
SHA256 8bd60dc8246902e2e32cf3e22e5f81293ab8a2fcd7431f477e7be37916314d5b
MD5 7d2fe0d6971cc5bad4686a7244641def
BLAKE2b-256 3347cb3c50ec7f2a9556e7e430041fd70064f2f47acbe3e7be63bdf4a2cc263e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ircio-1.0.0.tar.gz:

Publisher: release.yml on pbiernacki/ircio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ircio-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: ircio-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 10.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ircio-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2c551a3238b94183443a316a89e3c149c2000054476ba3807fefff0e36415221
MD5 7b89a7c644741754bd5db2bc1efac197
BLAKE2b-256 e320de5a23bb472b890028ff8cbcc1c4749a696ed7d75d8eb9cff39d5a76c3de

See more details on using hashes here.

Provenance

The following attestation bundles were made for ircio-1.0.0-py3-none-any.whl:

Publisher: release.yml on pbiernacki/ircio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page