feat: initial IRC bouncer implementation

Async Python IRC bouncer with SOCKS5 proxy support, multi-network
connections, password auth, and persistent SQLite backlog with replay.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
user
2026-02-19 11:29:59 +01:00
commit ced6232373
28 changed files with 2079 additions and 0 deletions

112
tests/test_config.py Normal file
View File

@@ -0,0 +1,112 @@
"""Tests for configuration loading."""
import tempfile
from pathlib import Path
import pytest
from bouncer.config import load
MINIMAL_CONFIG = """\
[bouncer]
password = "secret"
[proxy]
host = "127.0.0.1"
port = 1080
[networks.test]
host = "irc.example.com"
"""
FULL_CONFIG = """\
[bouncer]
bind = "0.0.0.0"
port = 6668
password = "hunter2"
[bouncer.backlog]
max_messages = 5000
replay_on_connect = false
[proxy]
host = "10.0.0.1"
port = 9050
[networks.libera]
host = "irc.libera.chat"
port = 6697
tls = true
nick = "testbot"
user = "testuser"
realname = "Test Bot"
channels = ["#test", "#dev"]
autojoin = true
[networks.oftc]
host = "irc.oftc.net"
port = 6697
tls = true
nick = "testbot"
channels = ["#debian"]
"""
def _write_config(content: str) -> Path:
f = tempfile.NamedTemporaryFile(mode="w", suffix=".toml", delete=False)
f.write(content)
f.close()
return Path(f.name)
class TestLoad:
def test_minimal(self):
cfg = load(_write_config(MINIMAL_CONFIG))
assert cfg.bouncer.password == "secret"
assert cfg.bouncer.bind == "127.0.0.1"
assert cfg.bouncer.port == 6667
assert cfg.bouncer.backlog.max_messages == 10000
assert cfg.proxy.host == "127.0.0.1"
assert "test" in cfg.networks
net = cfg.networks["test"]
assert net.host == "irc.example.com"
assert net.port == 6667
assert net.tls is False
def test_full(self):
cfg = load(_write_config(FULL_CONFIG))
assert cfg.bouncer.bind == "0.0.0.0"
assert cfg.bouncer.port == 6668
assert cfg.bouncer.backlog.max_messages == 5000
assert cfg.bouncer.backlog.replay_on_connect is False
assert cfg.proxy.port == 9050
assert len(cfg.networks) == 2
libera = cfg.networks["libera"]
assert libera.tls is True
assert libera.port == 6697
assert libera.channels == ["#test", "#dev"]
assert libera.nick == "testbot"
def test_no_networks_raises(self):
config = """\
[bouncer]
password = "x"
[proxy]
"""
with pytest.raises(ValueError, match="at least one network"):
load(_write_config(config))
def test_tls_default_port(self):
config = """\
[bouncer]
password = "x"
[proxy]
[networks.test]
host = "irc.example.com"
tls = true
"""
cfg = load(_write_config(config))
assert cfg.networks["test"].port == 6697