From 281b5f05b709342999c50f6483528569169b8051 Mon Sep 17 00:00:00 2001 Message-Id: <281b5f05b709342999c50f6483528569169b8051.1715847473.git.mdw@distorted.org.uk> From: Mark Wooding Date: Mon, 15 Jan 2001 02:23:04 +0000 Subject: [PATCH] New topic management features. Organization: Straylight/Edgeware From: Ian Jackson --- bot.tcl | 162 ++++++++++++++++++++++++++++++++++++++++++++++-------- helpinfos | 18 ++++++ 2 files changed, 158 insertions(+), 22 deletions(-) diff --git a/bot.tcl b/bot.tcl index 9d5457b..0b12a54 100755 --- a/bot.tcl +++ b/bot.tcl @@ -413,7 +413,37 @@ proc recordlastseen_n {n how here} { msendprivmsg_delayed 1000 $n $ml } } - + +proc note_topic {showoff whoby topic} { + if {[string length $whoby]} { + set msg "FYI, $whoby has changed the topic on $showoff" + } else { + set msg "FYI, I have reset the topic on $showoff" + } + if {[string length $topic] < 160} { + append msg " to $topic" + } else { + append msg " but it is too long to reproduce here !" + } + set showoff [irctolower $showoff] + set tell [chandb_get $showoff topictell] + if {[lsearch -exact $tell *] >= 0} { + set tryspies [chandb_list] + } else { + set tryspies $tell + } +puts "NT>showoff $showoff|whoby $whoby|topic $topic|tell $tell|tryspies $tryspies|msg $msg<" + foreach spy $tryspies { + set see [chandb_get $spy topicsee] +puts "NT>spy $spy|see $see<" + if {[lsearch -exact $see $showoff] >= 0 || \ + ([lsearch -exact $see *] >= 0 && \ + [lsearch -exact $tell $spy] >= 0)} { + sendprivmsg $spy $msg + } + } +} + proc recordlastseen_p {p how here} { prefix_nick recordlastseen_n $n $how $here @@ -504,6 +534,11 @@ proc check_justme {lchan} { if {"$mode" != "*"} { sendout MODE $lchan $mode } + set topic [chandb_get $lchan topicset] + if {[string length $topic]} { + sendout TOPIC $lchan $topic + note_topic $lchan {} $topic + } } else { sendout PART $lchan leaving $lchan @@ -532,6 +567,13 @@ proc process_kickpart {chan user} { } } +proc msg_TOPIC {p c dest topic} { + prefix_nick + if {![ischan $dest]} return + recordlastseen_n $n "changing the topic on $dest" 1 + note_topic [irctolower $dest] $n $topic +} + proc msg_KICK {p c chans users comment} { set chans [split $chans ,] set users [split $users ,] @@ -865,7 +907,14 @@ def_somedb_id delete {} { } set default_settings_nick {timeformat ks} -set default_settings_chan {autojoin 1 mode * userinvite pub} +set default_settings_chan { + autojoin 1 + mode * + userinvite pub + topicset {} + topicsee {} + topictell {} +} def_somedb_id set {args} { upvar #0 default_settings_$nickchan def @@ -943,34 +992,52 @@ proc def_chancmd {name body} { " upvar 1 target chan; upvar 1 n n; upvar 1 text text; $body" } -def_chancmd manager { +proc ta_listop {findnow procvalue} { + # findnow and procvalue are code fragments which will be executed + # in the caller's level. findnow should set ta_listop_ev to + # the current list, and procvalue should treat ta_listop_ev as + # a proposed value in the list and check and possibly modify + # (canonicalise?) it. After ta_listop, ta_listop_ev will + # be the new value of the list. + upvar 1 ta_listop_ev exchg + upvar 1 text text set opcode [ta_word] switch -exact _$opcode { - _= { set ml {} } + _= { } _+ - _- { - if {[chandb_exists $chan]} { - set ml [chandb_get $chan managers] - } else { - set ml [list [irctolower $n]] - } + uplevel 1 $findnow + foreach item $exchg { set array($item) 1 } } default { - error "`channel manager' opcode must be one of + - =" + error "list change opcode must be one of + - =" } } - foreach nn [split $text " "] { - if {![string length $nn]} continue - check_nick $nn - set nn [irctolower $nn] + foreach exchg [split $text " "] { + if {![string length $exchg]} continue + uplevel 1 $procvalue if {"$opcode" != "-"} { - lappend ml $nn + set array($exchg) 1 } else { - set ml [grep nq {"$nq" != "$nn"} $ml] + catch { unset array($exchg) } } } - if {[llength $ml]} { - chandb_set $chan managers $ml - ucmdr "Managers of $chan: $ml" {} + set exchg [lsort [array names array]] +} + +def_chancmd manager { + ta_listop { + if {[chandb_exists $chan]} { + set ta_listop_ev [chandb_get $chan managers] + } else { + set ta_listop_ev [list [irctolower $n]] + } + } { + check_nick $ta_listop_ev + set ta_listop_ev [irctolower $ta_listop_ev] + } + if {[llength $ta_listop_ev]} { + chandb_set $chan managers $ta_listop_ev + ucmdr "Managers of $chan: $ta_listop_ev" {} } else { chandb_delete $chan ucmdr {} {} "forgets about managing $chan." {} @@ -1004,6 +1071,42 @@ def_chancmd userinvite { ucmdr $txt {} } +def_chancmd topic { + set what [ta_word] + switch -exact $what { + leave { + ta_nomore + chandb_set $chan topicset {} + ucmdr "I won't ever change the topic of $chan." {} + } + set { + set t [string trim $text] + if {![string length $t]} { + error "you must specific the topic to set" + } + chandb_set $chan topicset $t + ucmdr "Whenever I'm alone on #chan, I'll set the topic to $t." {} + } + see - tell { + ta_listop { + set ta_listop_ev [chandb_get $chan topic$what] + } { + if {"$ta_listop_ev" != "*"} { + if {![ischan $ta_listop_ev]} { + error "bad channel \`$ta_listop_ev' in topic $what" + } + set ta_listop_ev [irctolower $ta_listop_ev] + } + } + chandb_set $chan topic$what $ta_listop_ev + ucmdr "Topic $what list for $chan: $ta_listop_ev" {} + } + default { + error "unknown channel topic subcommand - see help channel" + } + } +} + def_chancmd mode { set mode [ta_word] if {"$mode" != "*" && ![regexp {^(([-+][imnpst]+)+)$} $mode mode]} { @@ -1011,9 +1114,9 @@ def_chancmd mode { } chandb_set $chan mode $mode if {"$mode" == "*"} { - ucmdr "I won't ever change the mode of #chan." {} + ucmdr "I won't ever change the mode of $chan." {} } else { - ucmdr "Whenever I'm alone on #chan, I'll set the mode to $mode." {} + ucmdr "Whenever I'm alone on $chan, I'll set the mode to $mode." {} } } @@ -1024,7 +1127,22 @@ def_chancmd show { append l ", mode " [chandb_get $chan mode] append l ", userinvite " [chandb_get $chan userinvite] "." append l "\nManagers: " - append l [join [chandb_get $chan managers] " "] + append l [join [chandb_get $chan managers] " "] "\n" + set t [chandb_get $chan topicset] + if {[string length $t]} { + append l "Topic to set: $t" + } else { + append l "I will not change the topic." + } + foreach {ts sep} {see "\n" tell " "} { + set t [chandb_get $chan topic$ts] + append l $sep + if {[llength $t]} { + append l "Topic $ts list: $t." + } else { + append l "Topic $ts list is empty." + } + } ucmdr {} $l } else { ucmdr {} "The channel $chan is not managed." diff --git a/helpinfos b/helpinfos index 902911e..4a55aa4 100644 --- a/helpinfos +++ b/helpinfos @@ -60,8 +60,26 @@ channel [] !manager +|-|= ... set manager list channel [] !autojoin yes|no join at bot start ? channel [] !userinvite pub|here|all|none who can \!invite ? channel [] !mode *|+...-... set modes when alone +channel [] !topic leave | set set topic when alone? +channel [] !topic see|tell +|-|= |* ... See `help ' (eg, `help manager') for more info. +:topic +channel [] topic set set topic when alone +channel [] topic leave don't (default) + If set to `topic set ' then whenever I'm alone in the channel + I'll reset the topic; if se to `topic leave' I'll leave it alone. +channel [] topic see|tell +|-|= |* ... + I can inform one channel about topic changes in another. Each + channel has a `see list' and a `tell list' which may be empty or + contain some channel names and/or a `*'. I'll tell channel #spy + whenever I see the topic change in #showoff if: #showoff or * is + mentioned in #spy's see list, and #spy or * is mentioned in + #showoff's tell list, and at least one those mentions is not a `*'. + + adds items to the relevant list, - removes them, and = sets the + list to exactly those items specified. Both lists are empty by + default, but a good permissive value is just `*' for both lists. + :autojoin !channel [] autojoin yes|no (`yes' is the default.) Controls whether I'll join the channel when I'm (re)started. -- [mdw]