chiark / gitweb /
New topic management features.
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 15 Jan 2001 02:23:04 +0000 (02:23 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 15 Jan 2001 02:23:04 +0000 (02:23 +0000)
bot.tcl
helpinfos

diff --git a/bot.tcl b/bot.tcl
index 9d5457b6590e2a34deda62602c4a9a52ec1979a4..0b12a54d1dcf2049be684f4f00f0dda95407a55a 100755 (executable)
--- 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."
index 902911e1e334acab4e1c14a8395b60069ef177c7..4a55aa42bbc4d49c2488acd8f7dca50ed1567f3d 100644 (file)
--- a/helpinfos
+++ b/helpinfos
@@ -60,8 +60,26 @@ channel [<chan>] !manager +|-|= <nick> ...     set manager list
 channel [<chan>] !autojoin yes|no              join at bot start ?
 channel [<chan>] !userinvite pub|here|all|none who can \!invite ?
 channel [<chan>] !mode *|+...-...              set modes when alone
+channel [<chan>] !topic leave | set <topic>    set topic when alone?
+channel [<chan>] !topic see|tell +|-|= <chan>|* ...
  See `help <setting>' (eg, `help manager') for more info.
 
+:topic
+channel [<chan>] topic set <topic>    set topic when alone
+channel [<chan>] topic leave          don't (default)
+ If set to `topic set <topic>' then whenever I'm alone in the channel
+ I'll reset the topic; if se to `topic leave' I'll leave it alone.
+channel [<chan>] topic see|tell +|-|= <chan>|* ...
+ 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 [<chan>] autojoin yes|no      (`yes' is the default.)
  Controls whether I'll join the channel when I'm (re)started.