强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 4 章:频道管理

第 4 章:频道管理

频道(Channel)是 IRC 社区的核心载体。本章系统讲解频道的创建、模式、管理技巧和最佳实践。


4.1 频道基础

4.1.1 频道命名规则

规则说明
前缀# 为标准频道,& 为本地频道(不跨服务器传播)
长度通常限制为 50-64 个字符
字符集a-z, A-Z, 0-9, -, _(IRC 历史上支持更多,但推荐使用安全字符)
大小写通常大小写不敏感(取决于 casemapping 设置)
禁止字符空格、逗号、冒号(:)、ASCII 7(响铃符 \x07)

合法频道名示例:

#general
#dev-chat
#project_alpha
#技术支持

非法频道名:

#hello world    ← 包含空格
#hello,world    ← 包含逗号

4.1.2 创建频道

IRC 频道采用惰性创建模式——当第一个用户加入时自动创建:

/* 加入一个不存在的频道,即自动创建 */
/join #new-channel

/* 你将自动获得频道创建者(Founder)状态 */
/* 你将看到: +o (operator) 标志 */

/* 设置频道主题 */
/topic #new-channel :欢迎来到 #new-channel!这是一个新频道。

4.1.3 频道类型

类型前缀特点
标准频道#全网可见,跨服务器传播
本地频道&仅本服务器可见,不传播到其他服务器
安全频道!UnrealIRCd 特有,具有唯一 ID

4.2 频道模式详解

频道模式(Channel Modes)控制频道的可见性、访问权限和行为。

4.2.1 基本模式

/* 设置模式 */
/mode #channel +<mode> [<parameters>]

/* 取消模式 */
/mode #channel -<mode>

4.2.2 模式分类

核心模式表

模式名称需要参数说明
+nNo External禁止非成员发送消息
+tTopic Lock仅操作员可更改主题
+sSecret频道不出现在 LIST 中
+pPrivate频道在 LIST 中隐藏,但 WHO 可见
+iInvite Only仅受邀用户可加入
+kKey密钥设置频道密码
+lUser Limit数字限制最大用户数
+oOperator昵称授予频道操作员权限
+vVoice昵称授予发言权(在 +m 频道中)
+hHalf-Operator昵称授予半操作员权限
+bBan用户掩码封禁用户
+eExcept用户掩码封禁例外(豁免)
+IInvite Except用户掩码邀请例外(自动受邀)
+mModerated仅 +v 及以上可发言
+rRegistered仅注册用户可加入(Ergo)
+RRegNick仅注册昵称可加入
+cNo Colors禁止 ANSI 颜色代码
+CNo CTCPs禁止 CTCP 消息
+qOwner昵称频道所有者权限
+aAdmin昵称频道管理员权限
+fFlood参数防刷屏设置
+jJoin Throttle参数加入频率限制
+GCensor启用内容过滤
+zSecure仅 TLS 连接用户可见消息

4.2.3 常见模式组合

/* 公开讨论频道(标准设置) */
/mode #general +nt

/* 半公开频道(需密码) */
/mode #vip +ntk secretpassword

/* 完全私密频道(仅邀请) */
/mode #private +ntsi

/* 只读公告频道 */
/mode #announcements +ntm
/* 然后给特定人 +v 以允许发言 */

/* 安全频道(仅 TLS) */
/mode #secure +ntz

/* 受限频道(仅注册用户) */
/mode #registered +ntr

/* 带人数限制的频道 */
/mode #limited +ntl 50

/* 完整的防刷屏配置 */
/mode #protected +ntf [10j#R5]:5
/* 解释: 10 秒内最多 10 次加入, 消息速率 5 条/5 秒 */

4.2.4 模式实际操作

/* 授予操作员权限 */
/mode #channel +o alice

/* 同时授予多个权限 */
/mode #channel +ovv bob charlie dave

/* 踢出用户(比 +b 更温和) */
/kick #channel bob :请遵守频道规则

/* 封禁用户 */
/mode #channel +b *!*@host.example.com

/* 封禁并踢出 */
/mode #channel +b *!*@host.example.com
/kick #channel bob :已封禁

/* 解封 */
/mode #channel -b *!*@host.example.com

/* 设置封禁例外(被封禁但某些掩码豁免) */
/mode #channel +e *!*@trusted.example.com

/* 邀请例外(自动受邀) */
/mode #channel +I *!*@vip.example.com

4.3 频道主题

4.3.1 设置主题

/* 设置频道主题 */
/topic #channel :新主题内容

/* 带时间戳的主题(某些客户端支持) */
/topic #channel :[2026-05-10] 欢迎!今日议题: 项目进度

4.3.2 主题长度限制

服务端默认限制
UnrealIRCd307 字符
InspIRCd307 字符
Ergo390 字符

4.3.3 主题保护

/* 锁定主题(仅操作员可改) */
/mode #channel +t

/* 解锁主题(所有人可改) */
/mode #channel -t

4.3.4 主题最佳实践

推荐的频道主题格式

#项目频道
[项目名称 v2.0 | 文档: https://docs.example.com | Wiki: https://wiki.example.com] 欢迎讨论

#支持频道
[请先阅读 FAQ: https://example.com/faq] 发问前请使用 paste 服务粘贴日志

#公告频道
[公告] 🔴 2026-05-10: v3.0 发布!请升级。

4.4 频道密钥(Key)

4.4.1 设置频道密码

/* 设置密码 */
/mode #channel +k mysecretpassword

/* 使用密码加入频道 */
/join #channel mysecretpassword

/* 取消密码 */
/mode #channel -k mysecretpassword

4.4.2 密钥安全建议

建议说明
长度至少 12 个字符
复杂度包含字母、数字、符号
轮换定期更换密钥
分享通过私信分享,不要在公开频道发送
临时密钥使用完后及时取消

4.5 用户限制

4.5.1 人数限制

/* 设置最大用户数 */
/mode #channel +l 100

/* 取消人数限制 */
/mode #channel -l

/* 动态人数限制(当人数减少时自动调整) */
/* 需要脚本或 Bot 支持 */

4.5.2 仅邀请模式

/* 开启邀请模式 */
/mode #channel +i

/* 邀请用户 */
/invite alice #channel

/* 关闭邀请模式 */
/mode #channel -i

4.5.3 邀请列表

/* 查看邀请列表 */
/mode #channel I

/* 添加永久邀请例外 */
/mode #channel +I *!*@vip.example.com

/* 移除邀请例外 */
/mode #channel -I *!*@vip.example.com

4.6 封禁管理

4.6.1 封禁掩码格式

掩码格式示例说明
*!*@host*!*@example.com封禁整个域名
nick!*@*troll!*@*封禁昵称
*!user@**!baduser@*封禁用户名
nick!user@host[email protected]精确封禁
*!*@192.168.1.**!*@192.168.1.*封禁 IP 段
$a:account$a:troll_account按账户封禁(需要服务包)
$x:nick!user@host#realname精确匹配按完整信息封禁

4.6.2 临时封禁

/* 封禁 1 小时(使用 +b + 时间戳) */
/mode #channel +b *!*@troll.example.com 3600

/* 或使用 KICKBAN */
/kick #channel troll :违反规则
/mode #channel +b *!*@troll.example.com

4.6.3 封禁列表管理

/* 查看封禁列表 */
/mode #channel b

/* 输出示例 */
/* *!*@bad.com (set by alice, 2026-05-10 12:00:00) */
/* troll!*@* (set by bob, 2026-05-10 13:00:00) */

/* 移除特定封禁 */
/mode #channel -b *!*@bad.com

4.6.4 封禁策略

行为升级策略:

1. 第一次违规 → 口头警告
2. 第二次违规 → 临时封禁 (1 小时)
3. 第三次违规 → 长期封禁 (1 天)
4. 第四次违规 → 永久封禁

封禁掩码选择:
- 临时违规者 → 精确掩码 (nick!user@host)
- 使用代理的骚扰者 → 宽泛掩码 (*!*@host)
- 持续骚扰者 → 账户封禁 ($a:account)

4.7 频道权限层级

4.7.1 权限层级表

权限符号UnrealIRCdInspIRCdErgo
创始人~q / +q❌(通过服务包)
管理员&a / +a
操作员@o / +o
半操作员%h / +h
发言权+v / +v
普通成员

4.7.2 权限矩阵

操作成员+v+h+o+a+q
发言(+m)
发言(+n)
修改主题(+t)
踢出用户
设置 +o
设置 +b
设置 +k
设置 +i/+s
取消 +q

4.8 频道管理实用命令

/* 查看频道信息 */
/info #channel

/* 查看频道用户列表 */
/names #channel
/who #channel

/* 查看频道模式 */
/mode #channel

/* 设置频道限制 */
/mode #channel +nt          /* 标准安全设置 */
/mode #channel +snt         /* 秘密 + 安全 */
/mode #channel +ntk secret  /* 带密码 */

/* 批量操作(需要 Oper 权限) */
/* 批量封禁 */
/mode #channel +bbbb *!*@spam1.com *!*@spam2.com *!*@spam3.com *!*@spam4.com

/* 清除所有封禁(谨慎使用) */
/* 需要逐个移除或使用服务包命令 */

/* 频道日志(通过服务包) */
/ChanServ SET #channel LOG on

4.9 频道管理脚本示例

4.9.1 自动频道创建脚本

#!/usr/bin/env python3
"""自动创建和配置频道的脚本"""

import socket
import ssl
import time

class IRCChannelManager:
    def __init__(self, server, port, nickname, password):
        self.server = server
        self.port = port
        self.nickname = nickname
        self.password = password
        self.sock = None

    def connect(self):
        """连接到 IRC 服务器"""
        context = ssl.create_default_context()
        raw_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock = context.wrap_socket(raw_sock, server_hostname=self.server)
        self.sock.connect((self.server, self.port))
        self.send(f"NICK {self.nickname}")
        self.send(f"USER {self.nickname} 0 * :Channel Manager")

    def send(self, message):
        """发送 IRC 消息"""
        self.sock.send(f"{message}\r\n".encode())
        time.sleep(0.2)

    def create_channel(self, channel, modes="+nt", topic="", password=None):
        """创建并配置频道"""
        # 加入频道
        if password:
            self.send(f"JOIN {channel} {password}")
        else:
            self.send(f"JOIN {channel}")

        time.sleep(1)

        # 设置模式
        self.send(f"MODE {channel} {modes}")

        # 设置主题
        if topic:
            self.send(f"TOPIC {channel} :{topic}")

        print(f"[+] 频道 {channel} 已创建并配置")

    def batch_create(self, config_file):
        """批量创建频道"""
        channels = [
            ("#general", "+nt", "公共讨论频道"),
            ("#dev", "+ntm", "开发者频道 - 需要发言权"),
            ("#announcements", "+ntm", "公告频道"),
            ("#help", "+nt", "帮助与支持"),
        ]

        for channel, modes, topic in channels:
            self.create_channel(channel, modes, topic)
            time.sleep(0.5)

# 使用示例
if __name__ == "__main__":
    manager = IRCChannelManager("irc.example.com", 6697, "ChannelBot", None)
    manager.connect()
    time.sleep(5)  # 等待连接建立
    manager.batch_create("channels.conf")

4.10 ⚠️ 注意事项

事项说明
频道所有权没有服务包时,频道创建者离开即失去控制权
密钥泄露频道密钥一旦泄露,需要立即更换
模式限制部分模式需要 Oper 权限才能设置(如 +z 安全模式)
封禁过度过宽的掩码可能误伤正常用户
频道名称避免使用过于相似的频道名(如 #dev 和 #dev-)
人数限制设置过低的限制可能导致合法用户无法加入

扩展阅读


下一章: 第 5 章:用户管理 — 用户模式、认证机制、昵称服务和主机掩码的详细讲解。