gomib

Timeline
Login

Timeline

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

50 most recent check-ins

2026-08-26
08:55
bridge: coalesce consecutive channel messages (Heisenbridge EventQueue)

Adds eventqueue.CoalescingQueue which groups consecutive events by key and flushes them as one batched message within a 1s window. ChannelRoom uses it for IRC->Matrix relay (grouping by puppet), mirroring Heisenbridge's message coalescing. Adds tests. leaf check-in: d9c163eecb user: bapt tags: trunk

08:52
bridge: join puppets via appservice m.room.member state event

Match Heisenbridge's mechanism for adding puppets to rooms: instead of POST /join?user_id= (which fails on invite/restricted rooms), send the m.room.member state event as the appservice, which has the privilege to set membership for its namespace users. Also derive the puppet prefix from the registration namespace regex (config.PuppetPrefix) instead of hardcoding. check-in: b2bc486906 user: bapt tags: trunk

2026-08-25
16:22
bridge: status command lists each user's IRC channels

cmdStatus now shows every network connection (network, user, connected state) and the channels bridged for each user. check-in: d7f2ce47ee user: bapt tags: trunk

16:17
bridge: Matrix appservice WebSocket transport (MSC2409)

Adds internal/appsws: a WebSocket client that connects to the homeserver appservice endpoint, performs the AS_CONNECTED handshake, and forwards AS_TRANSACTION events to the bridge while ACKing them. Enabled with --websocket. Adds golang.org/x/net dependency and Bridge.HandleRawEvent. check-in: abab7abb0e user: bapt tags: trunk

16:14
bridge: draft/relaymsg tag and pastebin (media file)

Relay Matrix->IRC messages with the draft/relaymsg tag when use_relaymsg is set. When use_pastebin is set and a message is truncated, upload it to the homeserver media and send an m.file instead of the clipped text. check-in: 66d5e53e13 user: bapt tags: trunk

16:01
bridge: add displayname/disambiguation/zwsp config fields

Adds use_displaynames, use_disambiguation and use_zwsp to the Config for Heisenbridge config compatibility. check-in: d6c324ed29 user: bapt tags: trunk

15:59
bridge: plumbed room ban bridging (Matrix ban -> IRC KICK)

A ban in a plumbed Matrix room kicks the corresponding IRC puppet nick. check-in: c0dc49dbeb user: bapt tags: trunk

15:58
irc: basic SASL PLAIN authentication

irc.Client sends CAP REQ sasl + AUTHENTICATE PLAIN with the configured username/password before NICK/USER. NetworkConfig gains sasl_username and sasl_password. check-in: 28d8139524 user: bapt tags: trunk

15:56
bridge: prefix Matrix replies when relaying to IRC

When a Matrix message is a reply, prefix it with the replied user's localpart before sending to IRC, like Heisenbridge. Adds matrix.Client.GetEvent. check-in: 7f96495672 user: bapt tags: trunk

15:55
cmd: add --uid/--gid privilege drop

Drops to the given gid/uid after startup (best-effort), mirroring Heisenbridge's privilege drop. check-in: 4658a93118 user: bapt tags: trunk

15:51
irc: outbound pacing to avoid flood kicks

Slow down long/burst sends proportional to line length, mirroring Heisenbridge's outbound pacing. check-in: 64f690edc6 user: bapt tags: trunk

15:49
bridge: reacts on truncation, --generate-compat, --safe-mode

Add m.reaction (scissors) when a relayed message is truncated and reacts are enabled. Add config.GenerateCompat (extra bot namespace for Dendrite/Conduit) and the --generate-compat and --safe-mode CLI flags. check-in: eb4d079337 user: bapt tags: trunk

15:46
bridge: staggered network connects and plumbed topic sync

Network rooms connect 1s apart (stagger) to avoid a connection storm. Plumbed rooms propagate Matrix room topic to IRC when topic_sync is enabled. check-in: 132fec6054 user: bapt tags: trunk

15:45
irc: server password (PASS) and basic CAP negotiation

irc.Client sends CAP LS, PASS (if configured), NICK, USER on connect and CAP REQ/END on welcome. NetworkConfig gains Pass and Caps. check-in: 7f646bb9ed user: bapt tags: trunk

15:43
cmd: add --reset to leave all rooms and wipe config

Bridge.Reset leaves every joined room and resets the bridge config, mirroring heisenbridge --reset. check-in: e8725c350d user: bapt tags: trunk

15:41
bridge: add missing network and control-room commands

Network room: whoami, umode, raw, nickserv, chanserv, ctcp, reconnect. Control room: delnetwork (alias), avatar, ident, maxlines, pastebin, reacts, hiddenroom. Adds matrix.Client.SetAvatarURL. check-in: ca2cfbfa9e user: bapt tags: trunk

15:39
irc: keepnick and ping timeout

Handle ERR_NICKNAMEINUSE (433) by appending '_' and retrying (keepnick), and disconnect if no data is received within 300s (ping timeout), which the reconnect loop then handles. check-in: cef1fee7f7 user: bapt tags: trunk

15:29
bridge: hidden rooms (room v9) with restricted join rules

Channel and private rooms get a hidden room (room version 9, unfederated) and are set to restricted join rules allowing it, so puppets can be added without individual invites (Heisenbridge hidden-room mechanism). Best-effort; needs live validation. check-in: bb506e8057 user: bapt tags: trunk

15:27
bridge: IRC formatting parser and Matrix pills

Parse IRC formatting (bold, colour, underline, italic) into m.html formatted_body and strip CTCP; convert Matrix user/room references into pills. Used for channel, private and plumbed IRC->Matrix relays. check-in: dc393cf19e user: bapt tags: trunk

15:22
bridge: route connection/status notices to the network room like Heisenbridge

Server NOTICEs (*** Checking Ident, proxy scans), CTCP requests, the welcome (001), user mode changes, the bot's own JOINs, and the client-side Connecting / Connected / Joining channels status all go to the network room; only genuine private PRIVMSGs open a DM. check-in: cf0b5283e3 user: bapt tags: trunk

15:18
bridge: self-echo for channel sends when member sync is off

When member_sync is off, IRC does not echo the sender's own messages back, so show a 'You said: ...' notice, like Heisenbridge. check-in: db6c8a8cc1 user: bapt tags: trunk

15:17
irc: split long messages to fit the 512-byte IRC line limit

Adds irc.Client.PrivmsgSplit and uses it for Matrix->IRC relays (channel, private, plumbed), mirroring Heisenbridge's split_long without breaking UTF-8. check-in: 93ec826872 user: bapt tags: trunk

15:16
bridge: synapse-admin detection and more admin commands

Detect whether the appservice user is a Synapse admin at startup. Add control-room admin commands: displayname, mediaurl, mediapath, and forget (disconnect + leave/forget a user's rooms). check-in: b877b0ad30 user: bapt tags: trunk

15:11
bridge: create private rooms as proper Matrix DMs

Mark /query rooms as direct messages with preset private_chat, is_direct and a power-level override matching Heisenbridge, so clients classify them under People/DMs instead of normal rooms. check-in: cdebc564a8 user: bapt tags: trunk

15:09
bridge: serialized event queue for channel message sends

Adds an eventqueue package (single-worker FIFO) and uses it to serialize ChannelRoom IRC->Matrix message sends, preserving message ordering (mirrors Heisenbridge's EventQueue). Includes a FIFO order test. check-in: 58272143cd user: bapt tags: trunk

15:07
bridge: admin commands addserver/delserver/masks

Adds admin-only control-room commands to manage network servers (addserver, delserver) and list the allow masks. check-in: 4673d91c9a user: bapt tags: trunk

15:06
bridge: presence keepalive and bridge state

Sets the appservice user online every 60s (presence keepalive) and pushes bridge state CONNECTED / TRANSIENT_DISCONNECT on network connection changes, mirroring Heisenbridge. Adds matrix.Client.SetPresence. check-in: 24e180cd28 user: bapt tags: trunk

15:02
bridge: add version/status/sync control commands and network whois

Adds control-room status, version, and sync (member sync mode), and the network-room whois command (raw WHOIS). Adds irc.Client.Raw and a Version constant. check-in: 54a403f62f user: bapt tags: trunk

14:59
bridge: full glob (fnmatch) matching for user allow masks

User allow masks now match with glob wildcards (*, ?, [seq]) like Python's fnmatch instead of a simple suffix check. check-in: 76f6838a88 user: bapt tags: trunk

14:58
bridge: remove members on PART/QUIT/KICK (member sync)

Handle IRC PART/QUIT/KICK to remove a nick from the channel roster and best- effort leave the puppet from the Matrix room. LeaveRoom now supports impersonating a user (?user_id=). check-in: da23a141de user: bapt tags: trunk

14:57
irc: auto-reconnect with exponential backoff and failover

Network rooms now reconnect automatically after a drop, trying each server in the list (failover) and backing off exponentially (1s..1800s), like Heisenbridge. irc.Client gains Wait() and closes a done channel on disconnect so the connect loop can detect the drop and retry. check-in: 39d3d584e1 user: bapt tags: trunk

14:18
bridge: join the puppet to the private room before relaying IRC PMs

The relayed IRC private message is sent as the nick's puppet, but the puppet was not a member of the room, so the message did not appear. Join the puppet to the room first. check-in: a447bf1bab user: bapt tags: trunk

14:15
bridge: puppet impersonation, /query auto-open, channel keys, user mgmt, in-place graceful upgrade

- Send relayed IRC messages as the puppet via appservice masquerading (?user_id=) so nicks show instead of the bot. - Re-open PrivateRooms on real PRIVMSG (/query) while still filtering connection NOTICEs. - Load ChannelRoom name from the 'name' key and join channels with their key. - Add network connection status, and user management (users/admins/allow/ disallow/whoami). - Graceful upgrade now replaces the process in place (syscall.Exec, same PID, preserved listener + IRC fds) so the daemon does not restart it and there is no duplicate process. check-in: f853003d90 user: bapt tags: trunk

13:23
matrix: accept appservice auth from Bearer header and return JSON body

Synapse (with use_appservice_legacy_authorization=false) sends the hs_token in the Authorization: Bearer header, not as an access_token query param, so gomib was returning 401. Also the appservice spec expects a JSON object (empty {}) in the transaction response; gomib returned an empty body, causing Synapse's JSONDecodeError and repeated backoff. Both are now fixed. check-in: bf3afbeea4 user: bapt tags: trunk

13:08
matrix: serve transactions on the real appservice path

The homeserver pushes appservice transactions to /_matrix/app/v1/transactions/{txnId} (and /_matrix/app/unstable/...), but the server only listened on /transactions/, so Synapse got 404 and backed off and the bridge never received user events. Now serves the standard appservice path (plus the legacy aliases) and extracts the txn id from the last path segment. Adds a test for the appservice path. check-in: 2d2883d41a user: bapt tags: trunk

13:00
bridge: drop-in fixes for live Heisenbridge replacement

- reconnect: load NetworkRoom name from the 'name' key (Heisenbridge format), use per-user nicks, and re-join all channels/plumbed rooms after (re)connect so bridged channels come back up. - routing: IRC connection/server notices go to the network room (not private DM rooms); private rooms are never auto-created on inbound traffic and require an explicit query. - auto-open a control room for the owner at startup so the bridge responds. - rc.d: keep identd off. check-in: 89f1a9dd15 user: bapt tags: trunk

11:57
rc.d: FreeBSD service script for gomib using daemon(8)

Adds rc.d/gomib: starts gomib under daemon(8) (-r restart, -S syslog, -P/-p pidfiles), with config/homeserver/server-name overridable via rc.conf. Also installed the release binary into the heisenbridge jail (usr/local/bin/gomib) and the rc.d script + rc.conf.d enable entry there. check-in: e3915bbf5c user: bapt tags: trunk

11:26
docs: remove French guide; keep English only check-in: 4e9d6f9f4d user: bapt tags: trunk
11:26
docs: add English installation and validation guide check-in: a516844470 user: bapt tags: trunk
11:22
docs: real-world installation and validation guide (Synapse + Ergo)

Adds a step-by-step guide covering building gomib, generating the registration, configuring Synapse and an Ergo IRC server, validating the bridge (control room, addnetwork, query, plumb, PM relay), testing the graceful restart, and replacing an existing Heisenbridge, plus a troubleshooting table. Linked from the README. check-in: d183be2088 user: bapt tags: trunk

11:20
docs: document graceful (Apache-style) upgrade check-in: 0c3ba1b65e user: bapt tags: trunk
11:20
graceful: in-place restart with listener and IRC fd handoff

Adds Bridge.Restart, which re-execs the binary passing the open appservice listener and all IRC connections as fds plus a readiness pipe, so the homeserver endpoint and IRC peers see no drop. Adds a restart/reload control-room command, --inherit-listen-fd / --inherit-irc-fds / --ready-fd flags to resume an upgraded process, and AttachInheritedIRC to re-attach inherited IRC sessions. check-in: bdcd906236 user: bapt tags: trunk

11:20
graceful: fd handoff primitives for Apache-style upgrades

Adds the graceful package (InheritListener/InheritConn/ListenerFile/ConnFile), irc.Client.Attach to resume an existing connection without the NICK/USER handshake, and matrix.Server.Serve to run on an already-open listener (zero HTTP downtime). IRC readLoop no longer dispatches PING to handlers. Tests cover fd handoff, Attach resume, and serving an inherited listener. check-in: 0867cea334 user: bapt tags: trunk

10:56
bridge: end-to-end inbound IRC integration test

Adds a real IRC server for tests that speaks the protocol over TCP: accepts a connection, performs NICK/USER registration, and injects a remote user's JOIN, NAMES and PRIVMSG. Verifies the full inbound path — the bridge's IRC client reads the message over TCP and relays it into the Matrix channel room as a puppet. Also records matrix message sends in the fake homeserver. check-in: c14574cf52 user: bapt tags: trunk

10:54
docs: document per-user bouncer behavior check-in: d3c30d1330 user: bapt tags: trunk
10:53
bridge: per-user bouncer connections (multi-user)

Refactors network rooms from one-per-network to one-per-user-per-network, so each user gets their own IRC connection (the Heisenbridge bouncer model). A user's query/plumb commands create their own connection on demand; channel, private and plumbed rooms are registered on and relay through the owning user's connection. LoadRooms reconnects per-user network rooms at startup. Adds a test verifying two users on one network get separate connections and rooms. check-in: 3e2387a468 user: bapt tags: trunk

10:45
bridge: max_lines message truncation

Adds a clip helper that truncates relayed messages to the configured max_lines (0 = unlimited), mirroring Heisenbridge, and applies it in channel, private, and plumbed room relays. Adds a clip test. check-in: 4cf8885ea5 user: bapt tags: trunk

10:44
bridge: push bridge state to optional status endpoint

Adds BridgeState and pushBridgeState, which POSTs the running state to the registration's heisenbridge.status_endpoint authenticated with the as_token, mirroring Heisenbridge's bridge-state reporting. gomib pushes RUNNING on start. Tests added for the status push and the no-endpoint case. check-in: 2d1ac8cd02 user: bapt tags: trunk

10:40
bridge: advanced commands and IRC member sync

Adds control-room commands nick, servers, and reset; network-room commands nick and send/msg; and IRC member sync via NAMES (RPL 353) that registers each nick's puppet and joins it into bridged channel/plumbed rooms. PlumbedRoom gains a joinPuppet helper. Tests added for nick/servers commands and NAMES member sync. check-in: 0e47192e95 user: bapt tags: trunk

10:35
docs: document full drop-in runtime (media proxy, identd, commands, rooms) check-in: ef8353f389 user: bapt tags: trunk