Команда say

Решение вопросов при работе с TCL скриптами.

Модератор: Модераторы

Команда say

Сообщение FallFromGrace » 26 янв 2011 22:57

Удобная обертка для сообщений, можно писать как на канал, так и в приват кому-то или нотайсом.

Что делает:
- Автоматически разбивает длинный текст на 2 сообщения (но не более, чтобы не спамил слишком много)
- Автоматически очищает очередь сообщений если бота слишком заспамили
- Добавляет в логи канала то что говорит бот

Что можно поменять:
- У меня установлен канал по умолчанию в переменной $def(chan). Можете сделать её, или просто заменить своим каналом
- Убрать запись в логи
- Поменять тип вывода команд (у меня сделано через /me)
- Поменять очередь команд (вместо putquick поставить puthelp/putserv)

Как пользоваться:
- Просто сказать что-то на канал по умолчанию: <say "Hello">
- Сказать в приват юзеру: <say "Hello" "priv $nick">
- Сказать нотайсом: <say "Hello" "notc $nick">
- Сказать на другом канале: <say "Hello" "#channel2">

TCL: [ Скачать ] [ Скрыть ]
proc say {mes {type "chan"}} {
   global botnick def

   set chan $def(chan)
   if {[queuesize mode] >= 10} then {clearqueue all}

   if {[string first "#" $type] == 0} {
      set chan $type
      set type "chan"
   }

   if {$type == "chan"} then {
      if {[string length $mes] > 380} {
      putquick "PRIVMSG $chan :\001ACTION [string range $mes 0 379]"
      putquick "PRIVMSG $chan :\001ACTION [string range $mes 380 end]"
   } else {
      putquick "PRIVMSG $chan :\001ACTION $mes"
   }
   putloglev p $chan "Action: $botnick $mes"
   } elseif {[lindex $type 0] == "priv"} {
      putquick "PRIVMSG [lindex $type 1] :\001ACTION $mes"
   } elseif {[lindex $type 0] == "notc"} {
      putquick "NOTICE [lindex $type 1] :$mes"
   }
       
   return true
}
Последний раз редактировалось FallFromGrace 27 янв 2011 00:00, всего редактировалось 1 раз.
FallFromGrace
 
Сообщения: 9
Зарегистрирован: 26 янв 2011 22:35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21

Re: Команда say

Сообщение tvrsh » 26 янв 2011 23:32

Типо круто.
1. Последняя } лишняя.
2. Берем такой скрипт:
TCL: [ Скачать ] [ Скрыть ]
bind pub n !say say
set def(chan) #erotic
proc say {mes {type "chan"}} {
   global botnick def

   set chan $def(chan)
   if {[queuesize mode] >= 10} then {clearqueue all}

   if {[string first "#" $type] == 0} {
      set chan $type
      set type "chan"
   }

   if {$type == "chan"} then {
      if {[string length $mes] > 380} {
      putquick "PRIVMSG $chan :\001ACTION [string range $mes 0 379]"
      putquick "PRIVMSG $chan :\001ACTION [string range $mes 380 end]"
   } else {
      putquick "PRIVMSG $chan :\001ACTION $mes"
   }
   putloglev p $chan "Action: $botnick $mes"
   } elseif {[lindex $type 0] == "priv"} {
      putquick "PRIVMSG [lindex $type 1] :\001ACTION $mes"
   } elseif {[lindex $type 0] == "notc"} {
      putquick "NOTICE [lindex $type 1] :$mes"
   }
       
   return true
}

<tvrsh> !load qwer.tcl
<@bionic> -(Load)- Script: qwer.tcl - Size: 0.78515625 Kb - Status: OK -(Info)-
<tvrsh> !say hello

И в патилайне:
<bionic> [22:30:13] Tcl error [say]: wrong # args: should be "say mes ?type?"
<tvrsh> .set errorInfo
<bionic> [22:30:31] #tvrsh# set errorInfo
<bionic> Currently: wrong # args: should be "say mes ?type?"
<bionic> Currently: while executing
<bionic> Currently: "say $_pub1 $_pub2 $_pub3 $_pub4 $_pub5"


Добавлено спустя 27 минут 51 секунду:
TCL: [ Скачать ] [ Скрыть ]
# !say #chan nick text

bind pub n !say say_
proc say_ {n u h c t} {

set dc "#testchan"

if {[validchan [lindex [split $t] 0]]} {
    if {[onchan [lindex [split $t] 1] [lindex [split $t] 0]]} {
        putserv "PRIVMSG $c :В процедуру попали валидный канал, ник и текст, текст будет отправлен в приват нику на канале."
        putserv "PRIVMSG [lindex [split $t] 1] :[lrange $t 2 end]"
        return 0
    } else {
        putserv "PRIVMSG $c :В процедуру попали валидный канал и текст, но ника на канале нет. Текст будет отправлен в канал."
        putserv "PRIVMSG [lindex [split $t] 0] :[lrange $t 1 end]"
        return 0
    }
} else {
    if {[onchan [lindex [split $t] 0] $dc]} {
        putserv "PRIVMSG $c :В процедуру попали валидный ник и текст, но канал не обслуживается ботом. Текст будет отправлен в приват нику на дефолтном канале."
        putserv "PRIVMSG [lindex [split $t] 0] :[lrange $t 1 end]"
        return 0
    } else {
        putserv "PRIVMSG $c :Тут вообще капец. Все пишем в дефолтный канал."
        putserv "PRIVMSG $dc :[join $t]"
        return 0
    }
}
}

putlog "say.tcl by tvrsh loaded..."
 


И тестируем все это на канале.
<tvrsh> !say #testchan tvrsh test test
<@bionic> В процедуру попали валидный канал, ник и текст, текст будет отправлен в приват нику на канале.
<tvrsh> !say #testchan tyyvrsh test test
<@bionic> В процедуру попали валидный канал и текст, но ника на канале нет. Текст будет отправлен в канал.
<@bionic> tyyvrsh test test
<tvrsh> !say #tttttestchan tvrsh test test
<@bionic> Тут вообще капец. Все пишем в дефолтный канал.
<@bionic> #tttttestchan tvrsh test test
<tvrsh> !say tvrsh test test
<@bionic> В процедуру попали валидный ник и текст, но канал не обслуживается ботом. Текст будет отправлен в приват нику на дефолтном канале.
И еще у меня два привата от бота с текстом test test.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Команда say

Сообщение FallFromGrace » 27 янв 2011 00:02

Назначение этого скрипта - не бинд для использования на канале, а использование внутри бота, чтобы отвечать юзерам.

Т.е. если у нас имеется какой-то скрипт, который, например, говорит юзеру что-то, то лучше будет использовать команду <say "Hello, $nick, how are you?">, вместо стандартных puthelp/putserv
FallFromGrace
 
Сообщения: 9
Зарегистрирован: 26 янв 2011 22:35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21

Re: Команда say

Сообщение tvrsh » 27 янв 2011 00:04

Вот как оказывается твой скрипт должен выглядеть:
TCL: [ Скачать ] [ Скрыть ]
bind pub n !say say_
set def(chan) #erotic

proc say_ {n u h c t} {
say $t
}

proc say {mes {type "chan"}} {
   global botnick def

   set chan $def(chan)
   if {[queuesize mode] >= 10} then {clearqueue all}

   if {[string first "#" $type] == 0} {
      set chan $type
      set type "chan"
   }

   if {$type == "chan"} then {
      if {[string length $mes] > 380} {
      putquick "PRIVMSG $chan :\001ACTION [string range $mes 0 379]"
      putquick "PRIVMSG $chan :\001ACTION [string range $mes 380 end]"
   } else {
      putquick "PRIVMSG $chan :\001ACTION $mes"
   }
   putloglev p $chan "Action: $botnick $mes"
   } elseif {[lindex $type 0] == "priv"} {
      putquick "PRIVMSG [lindex $type 1] :\001ACTION $mes"
   } elseif {[lindex $type 0] == "notc"} {
      putquick "NOTICE [lindex $type 1] :$mes"
   }
       
   return true
}


Тогда кажется все работает.

Добавлено спустя 2 минуты 32 секунды:
Нет не работает.
[23:03:18] <tvrsh> !say hello
[23:03:19] * @bionic hello
[23:04:48] <tvrsh> !say #testchan hello
[23:04:49] * @bionic #testchan hello
[23:04:54] <tvrsh> !say #testchan tvrsh hello
[23:04:55] * @bionic #testchan tvrsh hello
[23:05:03] <tvrsh> !say tvrsh hello
[23:05:03] * @bionic tvrsh hello


Чето все в канал пишет. Покажи как у тебя ему что-то передается.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Команда say

Сообщение FallFromGrace » 27 янв 2011 00:08

не уверен что он будет работать как бинд.

если там юзер напишет !say "привет как дела #chan2", то скрипт не сможет определить, где - сама фраза, а где - канал, на который надо отправть мессагу.

Поэтому если в своих скриптах писать say "привет как дела" "#chan2" - то всё будет работать, потому что оно разделяется на две строки

И ты кстати путаешь местами канал и мессагу, канал нужно в конце писать =)
FallFromGrace
 
Сообщения: 9
Зарегистрирован: 26 янв 2011 22:35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21

Re: Команда say

Сообщение tvrsh » 27 янв 2011 00:26

Не вижу в использовании этой процедуры практического смысла, она ничего не упрощает а наоборот.
На универсальную оно совсем не смахивает ибо по-странному делятся строки. Посмотри как это реализовано тут: tcl-skripti/rabota-dlinnimi-strokami-t38.html
Еще бы добавить проверку на валидность канала, на отправку текста ботом самому себе. Все это конечно "защита от дурака", но раз уж есть претензия на универсальность то надо все варианты проработать.
К тому же в alltools.tcl есть putmsg, putchan, putnotc и putact.

Вообще я сторонник ухода от такого рода библиотек. Думаю, что это только усложняет скрипт и делает его менее понятным для других.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Команда say

Сообщение FallFromGrace » 27 янв 2011 00:38

у меня бот в 8000 строк, и единый стандарт для вывода команд это очень удобно

если вдруг тебе захочется сделать вывод команд не через /me, а простым выводом то тебе не надо будет переписывать всего бота, достаточно поменять команду say, которая отвечает за вывод.

Строки делятся странно - да, согласен, можно написать и лучше.
Насчет "защиты от дурака" - если у меня бот будет слать инфу на несуществующий канал, то это проблема не команды say, а другой функции в которой прописан этот самый несуществующий канал.

Да и производительность будет падать, если добавлять миллион лишних проверок, особенно если они не критичны
FallFromGrace
 
Сообщения: 9
Зарегистрирован: 26 янв 2011 22:35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21


Вернуться в TCL скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

cron