IRC
IRC 適配器將 Hermes 連接到任意 IRC 服務器,並在 IRC 頻道(或私信)與代理之間中繼消息。它基於 Python 標準庫 asyncio 實現 IRC 協議通信——無外部依賴、無 SDK、無守護進程。它適用於 Libera.Chat 等公共網絡以及任何自託管的 ircd。
IRC 是純文本協議:不支持語音、圖片、文件、線程、反應表情、輸入狀態或流式傳輸——回覆以 PRIVMSG 行發送,長消息會被拆分以符合 IRC 的行長度限制。
運行
hermes gateway setup並選擇 IRC 以獲取引導式配置流程。
前提條件
- 要連接的 IRC 服務器(例如
irc.libera.chat) - 要加入的頻道(例如
#hermes)——若要加入多個頻道,請使用逗號分隔 - 機器人的暱稱(默認:
hermes-bot) - 可選:如果網絡要求身份驗證,則需要註冊的暱稱 + NickServ 密碼
配置 Hermes
你可以通過兩種方式配置 IRC——環境變量(用於快速的僅環境變量設置)或 ~/.hermes/gateway-config.yaml 中的 gateway 塊。
選項 A — gateway-config.yaml
gateway:
platforms:
irc:
enabled: true
extra:
server: irc.libera.chat
port: 6697
nickname: hermes-bot
channel: "#hermes"
use_tls: true
server_password: "" # optional server password
nickserv_password: "" # optional NickServ identification
allowed_users: [] # empty = allow all, or list of nicks
max_message_length: 450 # IRC line limit (safe default)
選項 B — 環境變量
| 變量 | 必需 | 描述 |
|---|---|---|
IRC_SERVER | ✅ | IRC 服務器主機名(例如 irc.libera.chat) |
IRC_CHANNEL | ✅ | 要加入的頻道——多個頻道用逗號分隔 |
IRC_NICKNAME | ✅ | 機器人暱稱(默認:hermes-bot) |
IRC_PORT | — | 服務器端口(默認:TLS 為 6697,非 TLS 為 6667) |
IRC_USE_TLS | — | 使用 TLS(true/false;端口 6697 時默認為 true) |
IRC_SERVER_PASSWORD | — | 用於 PASS 命令的服務器密碼 |
IRC_NICKSERV_PASSWORD | — | 用於連接時自動 IDENTIFY 的 NickServ 密碼 |
IRC_ALLOWED_USERS | — | 允許與機器人對話的暱稱,逗號分隔 |
IRC_ALLOW_ALL_USERS | — | 允許頻道中的任何人與機器人對話(僅限開發環境) |
IRC_HOME_CHANNEL | — | 用於定時任務/通知投遞的頻道(默認為 IRC_CHANNEL) |
訪問控制
默認情況下,只有在 allowed_users(或 IRC_ALLOWED_USERS)中列出的暱稱才能與機器人對話。將列表留空並設置 IRC_ALLOW_ALL_USERS=true 可讓頻道中的任何人與 Hermes 聊天——這適用於測試,但不建議在公共網絡上使用,因為除非網絡強制使用 NickServ,否則 IRC 暱稱未經過身份驗證。
如果你的網絡支持暱稱註冊,請設置 IRC_NICKSERV_PASSWORD(或 nickserv_password),以便機器人在連接時向 NickServ 進行身份驗證並保持其註冊暱稱。
頻道與私信
- 已加入頻道中的消息被視為群組對話。
- 發送給機器人的私信被視為直接消息。
定時任務和通知會投遞到主頻道——如果設置了 IRC_HOME_CHANNEL 則使用該頻道,否則使用第一個 IRC_CHANNEL。
運行網關
hermes gateway start
使用 hermes gateway status 檢查狀態——此處會報告 IRC 連接狀態,包括僅使用環境變量的設置。
注意事項
- 較長的代理回覆會自動拆分為多個
PRIVMSG行,以保持在 IRC 行長度限制內(max_message_length,默認在協議開銷後為 450 字節)。 - 適配器會為每個服務器+暱稱獲取一個 scoped credential lock(作用域憑證鎖),因此兩個 Hermes 配置文件不會爭奪同一個 IRC 身份。