chiark / gitweb /
Add missing ucmdr {} {}
[ircbot] / usebnbot.tcl
CommitLineData
281f2c0e
IJ
1# Code for starting up bnbot
2
3proc def_bnbot {name argl body} {
4 proc "bnbot_$name" [concat botid $argl] \
5 "bnbot__vars\n
6 $body"
7}
8
9proc bnbot__vars {} {
10 global bnbot_callervars
11 upvar 1 botid botid
12 foreach v [concat {
13 host port nick pass channel
14 chan mbokafter state chanfn
15 } $bnbot_callervars] {
16 uplevel 1 [list upvar #0 "bot/$botid/$v" bn$v]
17 }
18}
19
20def_bnbot ensure_connecting {} {
0d3ea3aa 21 global muststartby_ms bnbot
281f2c0e
IJ
22
23 if {[info exists bnchan]} return
24 defset bnport 6112
25 set bnchan [open [list | $bnbot $bnhost $bnport] w+]
26 fconfigure $bnchan -buffering line
0d3ea3aa 27 set bnmbokafter [after $muststartby_ms \
281f2c0e
IJ
28 "fail {bot $botid not ok within timeout}"]
29 set bnstate Connected
30 fileevent $bnchan readable [list bnbot_onread $botid]
31}
32
33def_bnbot write {str} {
34 log "[clock seconds] -$botid-> $str"
35 puts $bnchan $str
36}
37
38def_bnbot writemsg {str} {
39 if {[regexp {^/} $str]} { set str " $str" }
40 bnbot_write $botid $str
41}
42
43def_bnbot onread {args} {
44 global channel
cd8c3236 45 if {[gets $bnchan l] == -1} { fail "bot $botid EOF/error on input" }
281f2c0e
IJ
46 if {[regexp {^1005 TALK ([^ ]+) \w+ \"(.*)\"$} $l dummy n text]} {
47 sendprivmsg $channel "\[$n] $text"
48 return
49 } elseif {[regexp {^1023 EMOTE ([^ ]+) \w+ \"(.*)\"$} $l dummy n text]} {
50 if {"$n" == "$bnnick"} return
51 sendprivmsg $channel "* $n $text"
52 return
53 }
54 log "[clock seconds] <-$botid- $l"
55 if {[string length $bnstate] && [regexp "^$bnstate" $l]} {
56 switch -exact $bnstate {
57 Connected { set bnstate Username }
58 Username { set bnstate Password; bnbot_write $botid $bnnick }
59 Password {
60 set bnstate "1007 CHANNEL"
61 puts $bnchan $bnpass
62 }
63 {1007 CHANNEL} {
64 set bnstate {}
65 bnbot_write $botid "/CHANNEL $bnchannel"
66 }
67 default { error "wrong bnstate: $bnstate" }
68 }
69 } elseif {[regexp {^1007 CHANNEL "(.*)"} $l dummy bnchanfn]} {
70 after cancel $bnmbokafter
71 unset bnmbokafter
1ae11f79 72 } elseif {[info exists bnchanfn]} {
281f2c0e
IJ
73 bnbot_event $botid $l
74 }
75}