Code: Select all
# chan-relay v1.01 by shred, 2001 <shreder@tsu.tmn.ru>
# <vars>
set cr(version) "1.01"
# format: "bot1 #bot1chan flags1 {users1} bot2 #bot2chan flags2 {users2}"
# bot1 <--- #bot2chan, flags2, {users2}
# #bot1chan, flags1, {users1} ---> bot2
# users:
# {} - no users
# {*} - all users
# {nick1 nick2} - selected users (only nick1 and nick2)
# flags (what to send):
# - - NOTHING
# c - chan msgs, actions
# C - chan msgs, actions with @/+ prefix
# j - join, part, quit msgs
# m - mode change msgs
# k - kick msgs
# n - nick change
# N - send with out nick (message only)
# t - topic change
# u - request user list (from another side)
# T - t + synchronize
# 1|2|3 - output priority (default is 3, 1 is NOT recommended)
# a = cjmnkt
# A = CjmknT
# !! incorrect lines are ignored !!
### *** THIS IS WORKING EXAMPLE:
set cr(sets) {
"dnr #distributed cN {dctievent} duron #distributed - {}"
"dnr #distributed cN {dctievent} chasm #distributed - {}"
"dnr #distributed cN {dctievent} chasm #dnet.ru - {}"
"dnr #distributed cN {dctievent} Cluster #distributed - {}"
"chasm #nnm.ru A {*} duron #noname uc {shred}"
"ZED #qw.ru A {*} duron #qw.ru ucjn1 {shred}"
"Cluster #atom a {*} duron #tyumen u {shred}"
"dnr #qq A {*} duron #eggdrop A {*}"
}
# list of bots with this script on board (authorized bots)
# also needed for dcc command "cr_rehash" (rehash all selected bots)
### *** THIS IS WORKING EXAMPLE:
set cr(netbots) "Cluster ZED Fiber BadBlock def chasm duron dnr"
# </vars>
# <procs>
proc xindex {xarg xarg1} {return [join [lrange [split $xarg] $xarg1 $xarg1]]}
proc xrange {xarg xarg1 xarg2} {return [join [lrange [split $xarg] $xarg1 $xarg2]]}
proc b {} { return \002 }
proc cr_modep {nick chan cmd} {
if {$cmd == "cr_pubm" || $cmd == "cr_act"} {
if {[isop $nick $chan]} {return "\@$nick"}
if {[isvoice $nick $chan]} {return "\+$nick"}
}
return $nick
}
proc cr_cansend {cmd modes} {
if {$modes == "-"} {return 0}
regsub "a" $modes "cjmnkt" modes
regsub "A" $modes "CjmnkT" modes
if {[lsearch "cr_report cr_ulist" $cmd] != -1} {return 1}
switch $cmd {
cr_pubm {if {[string match "*\[cC\]*" $modes]} {return 1}}
cr_act {if {[string match "*\[cC\]*" $modes]} {return 1}}
cr_join {if {[string match "*j*" $modes]} {return 1}}
cr_part {if {[string match "*j*" $modes]} {return 1}}
cr_sign {if {[string match "*j*" $modes]} {return 1}}
cr_mode {if {[string match "*m*" $modes]} {return 1}}
cr_nick {if {[string match "*n*" $modes]} {return 1}}
cr_topc {if {[string match "*\[tT\]*" $modes]} {return 1}}
cr_ulistreq {if {[string match "*u*" $modes]} {return 1}}
}
return 0
}
proc cr_getpri {modes} {
if {[string match "*1*" $modes]} {return 1}
if {[string match "*2*" $modes]} {return 2}
return 3
}
proc cr_send2 {b1d b2d cmd nick text} {
set b1name [xindex $b1d 0]
set b1chan [xindex $b1d 1]
set b1modes [xindex $b1d 2]
set b1users [xindex $b1d 3]
set b1pri [cr_getpri $b1modes]
set b2name [xindex $b2d 0]
set b2chan [xindex $b2d 1]
set b2modes [xindex $b2d 2]
set b2users [xindex $b2d 3]
set b2pri [cr_getpri $b2modes]
if {![cr_cansend $cmd $b1modes]} {return}
if {$b1name == $b2name} {
if {[string match "*\[CA\]*" $b1modes]} {set nick [cr_modep $nick $b1chan $cmd]}
cr_brecive $b1name $cmd [concat $b2chan $nick $text]
} else {
if {[string match "*\[CA\]*" $b1modes]} {set nick [cr_modep $nick $b1chan $cmd]}
foreach x $b1users {
if {$x == $nick || $x == "\*"} {
if {$cmd == "cr_topc" && $nick == $b1name} {continue}
if {($cmd == "cr_topc") && [string match "*\[AT\]*" $b1modes]} {append cmd "s"}
if {($cmd == "cr_pubm" || $cmd == "cr_act") && [string match "*N*" $b1modes]} {set nick "\*"}
if {[catch {putbot $b2name "$cmd $b1pri $b2chan $nick $text"} err]} {putlog "$x bot error: $err"}
}
}
}
}
proc cr_send {cmd chan nick text} {
global botnick cr
regsub -all ï $text Ÿ text
foreach i $cr(sets) {
if {[llength $i] != 8} {continue}
set b1name [xindex $i 0]
set b1chan [xindex $i 1]
set b1modes [xindex $i 2]
set b1users [xindex $i 3]
set b2name [xindex $i 4]
set b2chan [xindex $i 5]
set b2modes [xindex $i 6]
set b2users [xindex $i 7]
if {$b1name == $botnick && $b1chan == $chan} {
cr_send2 "$b1name $b1chan $b1modes $b1users" "$b2name $b2chan $b2modes $b2users" $cmd $nick $text
} elseif {$b2name == $botnick && $b2chan == $chan} {
cr_send2 "$b2name $b2chan $b2modes $b2users" "$b1name $b1chan $b1modes $b1users" $cmd $nick $text
}
}
}
proc cr_pubm {nick uhost hand chan text} {cr_send cr_pubm $chan $nick $text}
proc cr_act {nick uhost hand chan keyw text} {cr_send cr_act $chan $nick $text}
proc cr_nick {nick uhost hand chan newnick} {cr_send cr_nick $chan $nick $newnick}
proc cr_mode {nick uhost hand chan mc victim} {
if {$nick == "" && $hand == "\*"} {
cr_send cr_mode $chan $uhost "$chan $mc $victim"
} else {
cr_send cr_mode $chan $nick "$chan $mc $victim"
}
}
proc cr_join {nick uhost hand chan} {
cr_send cr_join $chan $nick "$chan $uhost"
cr_send cr_ulistreq $chan $nick "$chan"
}
proc cr_part {nick uhost hand chan msg} {cr_send cr_part $chan $nick "$chan $uhost"}
proc cr_sign {nick uhost hand chan reason} {cr_send cr_sign $chan $nick "$uhost $reason"}
proc cr_topc {nick uhost hand chan topic} {if {$nick == "\*"} {return}; cr_send cr_topc $chan $nick "$chan $topic"}
proc cr_kick {nick uhost hand chan target reason} {cr_send cr_kick $chan $nick "$target $reason"}
proc cr_putx {pri text} {
switch $pri {
1 {putquick $text}
2 {putserv $text}
3 {puthelp $text}
default {putlog "ERROR: Wrong priority ($pri) for message '$text'"}
}
}
proc cr_brecive {frombot cmd arg} {
global cr server
if {$server == ""} {return}
if {[lsearch $cr(netbots) $frombot] == -1} {return}
set pri [xindex $arg 0]
set chan [xindex $arg 1]
set nick [xindex $arg 2]
set text [xrange $arg 3 end]
switch $cmd {
cr_pubm {if {$nick == "*"} {cr_putx $pri "PRIVMSG $chan :$text"} else {cr_putx $pri "PRIVMSG $chan :\<$nick\> $text"}}
cr_act {if {$nick == "*"} {putact $chan $text} else {cr_putx $pri "PRIVMSG $chan :\* $nick $text"}}
cr_nick {cr_putx $pri "PRIVMSG $chan :\*\*\* $nick is now known as $text"}
cr_mode {cr_putx $pri "PRIVMSG $chan :\*\*\* $nick sets [xindex $text 0] mode: [xrange $text 1 end]"}
cr_sign {cr_putx $pri "PRIVMSG $chan :\*\*\* $nick ([xindex $text 0]) Quit ([xrange $text 1 end])"}
cr_join {cr_putx $pri "PRIVMSG $chan :\*\*\* $nick ([xindex $text 1]) has joined [xindex $text 0]"}
cr_part {cr_putx $pri "PRIVMSG $chan :\*\*\* $nick ([xindex $text 1]) has left [xindex $text 0]"}
cr_topc {cr_putx $pri "PRIVMSG $chan :\*\*\* $nick changes [xindex $text 0] topic to '[xrange $text 1 end]'"}
cr_topcs {cr_putx $pri "PRIVMSG $chan :\*\*\* $nick changes [xindex $text 0] topic to '[xrange $text 1 end]'"; if {[botisop $chan]} {putserv "TOPIC $chan :[xrange $text 1 end] ($nick)"}}
cr_kick {cr_putx $pri "PRIVMSG $chan :\*\*\* [xindex $text 0] was kicked from $chan by $nick ([xrange $text 1 end])"}
cr_dorehash {putbot $frombot cr_rehashing; putlog "REHASH request from $frombot"; rehash}
cr_rehashing {putlog " $frombot: rehashing..."}
cr_report {cr_putx $pri "PRIVMSG $chan :\! Relay bot (${frombot}) reporting: $text"}
cr_ulistreq {putbot $frombot "cr_ulist 3 $text $nick [b][llength [chanlist $chan]][b] users on [b]$chan[b]: [join [lsort [chanlist $chan]] {, }]"}
cr_ulist {cr_putx $pri "NOTICE $nick :\[$chan\] $text"}
}
}
proc cr_sendrehash {hand idx arg} {
global cr botnick
putlog "Sending REHASH request to [llength $cr(netbots)] bots..."
foreach x $cr(netbots) {
if {$x == $botnick} {continue}
if {![islinked $x]} {putlog "$x bot is not currently linked"; continue}
if {[catch {putbot $x "cr_dorehash"} err]} {putlog "$x bot error: $err"}
}
putlog "Send completed. Rehashing myself..."; rehash
}
proc cr_need {chan type} {
if {$type == "unban"} {cr_send cr_report $chan - "need unban on $chan"}
}
# </procs>
# <binds>
bind dcc n cr_rehash cr_sendrehash
bind need - * cr_need
bind pubm - * cr_pubm
bind ctcp - ACTION cr_act
bind nick - * cr_nick
bind mode - * cr_mode
bind join - * cr_join
bind part - * cr_part
bind sign - * cr_sign
bind topc - * cr_topc
bind kick - * cr_kick
bind bot - cr_pubm cr_brecive
bind bot - cr_act cr_brecive
bind bot - cr_nick cr_brecive
bind bot - cr_mode cr_brecive
bind bot - cr_join cr_brecive
bind bot - cr_part cr_brecive
bind bot - cr_sign cr_brecive
bind bot - cr_topc cr_brecive
bind bot - cr_topcs cr_brecive
bind bot - cr_kick cr_brecive
bind bot - cr_dorehash cr_brecive
bind bot - cr_rehashing cr_brecive
bind bot - cr_report cr_brecive
bind bot - cr_ulistreq cr_brecive
bind bot - cr_ulist cr_brecive
# </binds>
# <c>
putlog " chan-relay v$cr(version) by shred, 2001 <shreder@tsu.tmn.ru>"
# </c>