第 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 模式分类
核心模式表
| 模式 | 名称 | 需要参数 | 说明 |
|---|
+n | No External | ❌ | 禁止非成员发送消息 |
+t | Topic Lock | ❌ | 仅操作员可更改主题 |
+s | Secret | ❌ | 频道不出现在 LIST 中 |
+p | Private | ❌ | 频道在 LIST 中隐藏,但 WHO 可见 |
+i | Invite Only | ❌ | 仅受邀用户可加入 |
+k | Key | 密钥 | 设置频道密码 |
+l | User Limit | 数字 | 限制最大用户数 |
+o | Operator | 昵称 | 授予频道操作员权限 |
+v | Voice | 昵称 | 授予发言权(在 +m 频道中) |
+h | Half-Operator | 昵称 | 授予半操作员权限 |
+b | Ban | 用户掩码 | 封禁用户 |
+e | Except | 用户掩码 | 封禁例外(豁免) |
+I | Invite Except | 用户掩码 | 邀请例外(自动受邀) |
+m | Moderated | ❌ | 仅 +v 及以上可发言 |
+r | Registered | ❌ | 仅注册用户可加入(Ergo) |
+R | RegNick | ❌ | 仅注册昵称可加入 |
+c | No Colors | ❌ | 禁止 ANSI 颜色代码 |
+C | No CTCPs | ❌ | 禁止 CTCP 消息 |
+q | Owner | 昵称 | 频道所有者权限 |
+a | Admin | 昵称 | 频道管理员权限 |
+f | Flood | 参数 | 防刷屏设置 |
+j | Join Throttle | 参数 | 加入频率限制 |
+G | Censor | ❌ | 启用内容过滤 |
+z | Secure | ❌ | 仅 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 主题长度限制
| 服务端 | 默认限制 |
|---|
| UnrealIRCd | 307 字符 |
| InspIRCd | 307 字符 |
| Ergo | 390 字符 |
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 权限层级表
| 权限 | 符号 | UnrealIRCd | InspIRCd | Ergo |
|---|
| 创始人 | ~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 章:用户管理 — 用户模式、认证机制、昵称服务和主机掩码的详细讲解。