@@ -180,7 +180,8 @@ if [[ -z "$IRC_CONN_HANDLER" ]]; then
180
180
query ' CREATE TABLE IF NOT EXISTS channels
181
181
(
182
182
id INTEGER PRIMARY KEY AUTOINCREMENT,
183
- name varchar(201) NOT NULL UNIQUE
183
+ name varchar(201) NOT NULL UNIQUE,
184
+ topic varchar(500)
184
185
);'
185
186
186
187
query ' INSERT INTO channels(name) VALUES("#test");'
@@ -291,6 +292,28 @@ else
291
292
fi
292
293
printf " %s\r\n" " :$NICK PRIVMSG $TARGET $MSG " | broadcast
293
294
;;
295
+
296
+ TOPIC)
297
+ # TODO
298
+ CHANNEL=" ${arr[0]} "
299
+ arr=(" ${arr[@]: 1} " )
300
+ # TOPIC="$(query "SELECT topic FROM channels WHERE name = ?;" "$CHANNEL")"
301
+ # reply TOPIC "$CHANNEL" "$TOPIC"
302
+ ;;
303
+ LIST)
304
+ while IFS=$' \t ' read -r channel_id channel visible topic; do
305
+ reply 322 " $NICK $channel $visible :$topic "
306
+ done <<< " $(query " SELECT
307
+ channels.id,
308
+ channels.name,
309
+ COUNT(membership.who) AS visible,
310
+ channels.topic
311
+ FROM channels
312
+ LEFT JOIN membership
313
+ ON membership.channel = channels.id
314
+ GROUP BY channels.id, channels.name, channels.topic; " )"
315
+ reply 323 " :End of LIST"
316
+ ;;
294
317
JOIN)
295
318
if [[ " ${arr[@]} " == " 0" ]]; then
296
319
debug " joins: $NICK did join 0"
@@ -304,15 +327,20 @@ else
304
327
split " $KEYS " ' ,'
305
328
KEYS=(" ${arr[@]} " )
306
329
for CHANNEL in ${CHANNELS[@]} ; do
307
- CHANNEL_ID= " $( query " SELECT id FROM channels WHERE name = ?;" " $CHANNEL " ) "
330
+ IFS= $' \t ' read -r CHANNEL_ID TOPIC <<< " $(query " SELECT id, topic FROM channels WHERE name = ? ; " " $CHANNEL " )"
308
331
if [[ -z " $CHANNEL_ID " ]]; then
309
332
continue
310
333
fi
311
334
query " INSERT INTO membership(channel, who) VALUES(?, ?);" " $CHANNEL_ID " " $CONN_ID "
312
335
debug " joins: $NICK joined $CHANNEL "
313
336
SUBS[" $CHANNEL " ]=true
314
337
printf " %s\r\n" " :$NICK !$USER @$IRC_SERVER_HOST JOIN :$CHANNEL " | broadcast
315
- reply 366 $NICK $CHANNEL :
338
+ EVERYONE=" $( query " SELECT conns.nick FROM membership LEFT JOIN conns
339
+ ON conns.id = membership.who WHERE membership.channel = ?;" " $CHANNEL_ID " ) "
340
+ EVERYONE=" ${EVERYONE// $' \n ' / } "
341
+ reply 353 " $NICK " ' =' " $CHANNEL " " :$EVERYONE "
342
+ reply 366 " $NICK " " $CHANNEL " ' :'
343
+ reply 332 " $NICK " " $CHANNEL " " :$TOPIC "
316
344
done
317
345
fi
318
346
;;
328
356
CHANNELS=(" ${arr[@]} " )
329
357
split " $KEYS " ' ,'
330
358
KEYS=(" ${arr[@]} " )
359
+ query " DELETE FROM membership WHERE channel = ? AND who = ?;" " $CHANNEL_ID " " $CONN_ID "
331
360
332
361
for CHANNEL in ${CHANNELS[@]} ; do
333
362
unset SUBS[" $CHANNEL " ]
0 commit comments