В некоторых случаях Вам может потребоваться привязать несколько типов bind к одной и той же процедуре. Однако лишь малое число bindов используют совместимые параметры. В нашем примере мы привяжем публичную (pub) и приватную (msg) команду к одной и той же процедуре.
# Классический подход
bind pub n|- ${trigger}join pub:join
proc pub:join {nick uhost hand chan text} {
dojoin $nick $text
}
bind msg n ${trigger}join msg:join
proc msg:join {nick uhost hand text} {
dojoin $nick $text
}
proc dojoin {nick chan} {
set sChan [split $chan]
if {![llength $sChan] || [validchan [set chan [lindex $sChan 0]]]} {
puthelp "NOTICE $nick :Пожалуйста, используйте $::lastbind #канал"
} else {
channel add $chan
}
}
bind pub n|- ${trigger}join pub:join
proc pub:join {nick uhost hand chan text} {
dojoin $nick $text
}
bind msg n ${trigger}join msg:join
proc msg:join {nick uhost hand text} {
dojoin $nick $text
}
proc dojoin {nick chan} {
set sChan [split $chan]
if {![llength $sChan] || [validchan [set chan [lindex $sChan 0]]]} {
puthelp "NOTICE $nick :Пожалуйста, используйте $::lastbind #канал"
} else {
channel add $chan
}
}
Как Вы видите, здесь довольно много лишнего кода. Более короткий способ приведен ниже.
# Новый подход
bind pub n|- ${trigger}join {dojoin $_pub1 $_pub5; return 1; #}
bind msg n ${trigger}join {dojoin $_msg1 $_msg4; #}
proc dojoin {nick chan} {
set sChan [split $chan]
if {![llength $sChan] || [validchan [set chan [lindex $sChan 0]]]} {
puthelp "NOTICE $nick :Пожалуйста, используйте $::lastbind #канал"
} else {
channel add $chan
}
}
bind pub n|- ${trigger}join {dojoin $_pub1 $_pub5; return 1; #}
bind msg n ${trigger}join {dojoin $_msg1 $_msg4; #}
proc dojoin {nick chan} {
set sChan [split $chan]
if {![llength $sChan] || [validchan [set chan [lindex $sChan 0]]]} {
puthelp "NOTICE $nick :Пожалуйста, используйте $::lastbind #канал"
} else {
channel add $chan
}
}
Чтобы понять как это работает, необходимо знать как Eggdrop вызывает функцию привязки. Во-первых, Eggdrop присваивает некоторые глобальные переменные. В нашем случае это переменные от $_pub1 до $_pub5 для публичного bind и от $_msg1 до $_msg4 для приватного. Полный список параметров различных типов bind приведен ниже. Во-вторых, eggdrop выполняет код после bind, передавая только что присвоенные переменные. Передавая эти глобальные переменные напрямую, мы можем сэкономить приличный объем кода. Этот способ схож с концепцией анонимных функций в Java.
Типы глобальных параметров bind
Тип Глобальные переменные
MSG nick user@host handle text
$_msg1 $_msg2 $_msg3 $_msg4
DCC handle idx text
$_dcc1 $_dcc2 $_dcc3
FIL handle idx text
$_fil1 $_fil2 $_fil3
PUB nick user@host handle channel text
$_pub1 $_pub2 $_pub3 $_pub4 $_pub5
MSGM nick user@host handle text
$_msgm1 $_msgm2 $_msgm3 $_msgm4
PUBM nick user@host handle channel text
$_pubm1 $_pubm2 $_pubm3 $_pubm4 $_pubm5
NOTC nick user@host handle text dest
$_notc1 $_notc2 $_notc3 $_notc4 $_notc5
JOIN nick user@host handle channel
$_jp1 $_jp2 $_jp3 $_jp4
PART nick user@host handle channel msg
$_p1 $_p2 $_p3 $_p4 $_p5
SIGN nick user@host handle channel reason
$_stnm1 $_stnm2 $_stnm3 $_stnm4 $_stnm5
TOPC nick user@host handle channel topic
$_stnm1 $_stnm2 $_stnm3 $_stnm4 $_stnm5
KICK nick user@host handle channel target reason
$_kick1 $_kick2 $_kick3 $_kick4 $_kick5 $_kick6
NICK nick user@host handle channel newnick
$_stnm1 $_stnm2 $_stnm3 $_stnm4 $_stnm5
MSG nick user@host handle text
$_msg1 $_msg2 $_msg3 $_msg4
DCC handle idx text
$_dcc1 $_dcc2 $_dcc3
FIL handle idx text
$_fil1 $_fil2 $_fil3
PUB nick user@host handle channel text
$_pub1 $_pub2 $_pub3 $_pub4 $_pub5
MSGM nick user@host handle text
$_msgm1 $_msgm2 $_msgm3 $_msgm4
PUBM nick user@host handle channel text
$_pubm1 $_pubm2 $_pubm3 $_pubm4 $_pubm5
NOTC nick user@host handle text dest
$_notc1 $_notc2 $_notc3 $_notc4 $_notc5
JOIN nick user@host handle channel
$_jp1 $_jp2 $_jp3 $_jp4
PART nick user@host handle channel msg
$_p1 $_p2 $_p3 $_p4 $_p5
SIGN nick user@host handle channel reason
$_stnm1 $_stnm2 $_stnm3 $_stnm4 $_stnm5
TOPC nick user@host handle channel topic
$_stnm1 $_stnm2 $_stnm3 $_stnm4 $_stnm5
KICK nick user@host handle channel target reason
$_kick1 $_kick2 $_kick3 $_kick4 $_kick5 $_kick6
NICK nick user@host handle channel newnick
$_stnm1 $_stnm2 $_stnm3 $_stnm4 $_stnm5
Источник: http://www.barkerjr.net/irc/eggdrop/Scripting/Binds.php