Commit | Line | Data |
---|---|---|
281f2c0e IJ |
1 | # Code for starting up bnbot |
2 | ||
3 | proc def_bnbot {name argl body} { | |
4 | proc "bnbot_$name" [concat botid $argl] \ | |
5 | "bnbot__vars\n | |
6 | $body" | |
7 | } | |
8 | ||
9 | proc 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 | ||
20 | def_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 | ||
33 | def_bnbot write {str} { | |
34 | log "[clock seconds] -$botid-> $str" | |
35 | puts $bnchan $str | |
36 | } | |
37 | ||
38 | def_bnbot writemsg {str} { | |
39 | if {[regexp {^/} $str]} { set str " $str" } | |
40 | bnbot_write $botid $str | |
41 | } | |
42 | ||
43 | def_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 | } |