Страница 1 из 1

Не стандартное использование bind

СообщениеДобавлено: 14 июн 2009 19:11
Deniska
Предупреждение: Этот метод использования bind официально не поддерживается сообществом Eggheads. Причина этого в том, что этот метод может не поддерживаться в будущих версиях. Однако, этот метод довольно удобен.

В некоторых случаях Вам может потребоваться привязать несколько типов bind к одной и той же процедуре. Однако лишь малое число bindов используют совместимые параметры. В нашем примере мы привяжем публичную (pub) и приватную (msg) команду к одной и той же процедуре.

TCL: [ Скачать ] [ Скрыть ]
# Классический подход

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
  }
}


Как Вы видите, здесь довольно много лишнего кода. Более короткий способ приведен ниже.

TCL: [ Скачать ] [ Скрыть ]
# Новый подход

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
TCL: [ Скачать ] [ Скрыть ]
Тип  Глобальные переменные

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

Re: Не стандартное использование bind

СообщениеДобавлено: 26 янв 2011 22:44
FallFromGrace
спс огромное, половину инета облазил и вот только тут нашел)

Не хотелось писать одно и то же по 2 раза.