feat: implement Tier 1 channel modes (+o/+v/+m/+t), KICK, NOTICE
All checks were successful
check / check (push) Successful in 1m4s
All checks were successful
check / check (push) Successful in 1m4s
Implement core IRC channel functionality: 1. Channel member flags: is_operator and is_voiced columns in channel_members table (proper boolean columns per sneak's instruction, not text string modes). 2. MODE +o/+v/-o/-v: Grant/revoke operator and voice status. Permission-checked (only +o can grant). NAMES replies show @nick for operators and +nick for voiced users. 3. MODE +m (moderated): Only +o and +v users can send PRIVMSG or NOTICE to moderated channels. Others get ERR_CANNOTSENDTOCHAN. 4. MODE +t (topic lock): Only +o can change topic when active. Default ON for new channels (standard IRC behavior). Others get ERR_CHANOPRIVSNEEDED. 5. KICK command: Operator-only, removes user from channel, broadcasts to all members including kicked user. 6. NOTICE differentiation: No RPL_AWAY auto-reply, skips hashcash validation on +H channels per RFC 2812. Additional improvements: - Channel creator auto-gets +o on first JOIN - ISUPPORT now advertises PREFIX=(ov)@+ and CHANMODES=,,H,mnst - MODE query shows accurate +nt/+m/+H mode string - Fixed pre-existing unparam lint issue in fanOutSilent Includes 22 new tests covering all requirements. closes #85
This commit is contained in:
@@ -40,6 +40,8 @@ CREATE TABLE IF NOT EXISTS channels (
|
||||
topic_set_by TEXT NOT NULL DEFAULT '',
|
||||
topic_set_at DATETIME,
|
||||
hashcash_bits INTEGER NOT NULL DEFAULT 0,
|
||||
is_moderated INTEGER NOT NULL DEFAULT 0,
|
||||
is_topic_locked INTEGER NOT NULL DEFAULT 1,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
@@ -49,6 +51,8 @@ CREATE TABLE IF NOT EXISTS channel_members (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
channel_id INTEGER NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
|
||||
session_id INTEGER NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
||||
is_operator INTEGER NOT NULL DEFAULT 0,
|
||||
is_voiced INTEGER NOT NULL DEFAULT 0,
|
||||
joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE(channel_id, session_id)
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user