feat: implement Tier 2 channel modes (+b/+i/+s/+k/+l)
Implement the second tier of IRC channel features: 1. Ban system (+b): Add/remove/list bans with wildcard matching. Bans prevent both joining and sending messages. Schema: channel_bans table with mask, set_by, created_at. 2. Invite-only (+i): Channel mode requiring invitation to join. INVITE command for operators. Invites stored in DB and cleared after successful JOIN. 3. Secret (+s): Hides channel from LIST for non-members and from WHOIS channel lists when querier is not in same channel. 4. Channel key (+k): Password-protected channels. Key required on JOIN, set/cleared by operators. 5. User limit (+l): Maximum member count enforcement. Rejects JOIN when channel is at capacity. Updated ISUPPORT CHANMODES to b,k,Hl,imnst. Updated RPL_MYINFO available modes to ikmnostl. Comprehensive tests for all features at both DB and handler levels. README updated with full documentation of all new modes. closes #86
This commit is contained in:
@@ -42,10 +42,36 @@ CREATE TABLE IF NOT EXISTS channels (
|
||||
hashcash_bits INTEGER NOT NULL DEFAULT 0,
|
||||
is_moderated INTEGER NOT NULL DEFAULT 0,
|
||||
is_topic_locked INTEGER NOT NULL DEFAULT 1,
|
||||
is_invite_only INTEGER NOT NULL DEFAULT 0,
|
||||
is_secret INTEGER NOT NULL DEFAULT 0,
|
||||
channel_key TEXT NOT NULL DEFAULT '',
|
||||
user_limit INTEGER NOT NULL DEFAULT 0,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Channel bans
|
||||
CREATE TABLE IF NOT EXISTS channel_bans (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
channel_id INTEGER NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
|
||||
mask TEXT NOT NULL,
|
||||
set_by TEXT NOT NULL,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE(channel_id, mask)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_channel_bans_channel ON channel_bans(channel_id);
|
||||
|
||||
-- Channel invites (in-memory would be simpler but DB survives restarts)
|
||||
CREATE TABLE IF NOT EXISTS channel_invites (
|
||||
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,
|
||||
invited_by TEXT NOT NULL DEFAULT '',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE(channel_id, session_id)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_channel_invites_channel ON channel_invites(channel_id);
|
||||
|
||||
-- Channel members
|
||||
CREATE TABLE IF NOT EXISTS channel_members (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
|
||||
Reference in New Issue
Block a user