Quiz Memorial Forum

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
> Как отменить задержку между фразами
Kreon
post Nov 24 2007, 06:29 PM
Post #1


Developer
******

Group: Root Admin
Posts: 396
Joined: --
From: Внешние пределы
Member No.: 2



Как известно, eggdrop имеет встроенный конвеер для вывода всех сообщений, отправляемых ботом, который служит для предотвращения зафлуживания бота, но в то же время и существенно замедляет вывод ботом текста. В определенных случаях может появиться желание подобную очередь отключить. Например, это может понадобиться, если не требуется выводить одновременно большого количества текста, требуется мгновенная реакция бота на события, или же просто ваш бот наделен правами IRC-оператора.
Тогда на помощь придет встроенная, но недокументированная в eggdrop команда putdccraw, позволяющая отправлять сообщения в обход очереди.
Синтаксис: putdccraw <idx> <len> <text>
IRC-сервер, к которому подключен бот, имеет idx = 0; len - длина отправляемой строки текста; в конец text необходимо добавить символ перевода строки '\n'.
Пример применения в виде функции:
CODE
proc putfast {arg} {
  append arg "\n"
  putdccraw 0 [string length $arg] $arg
}

Таким образом, заменив требуемые putserv в вашем скрипте на определенный таким образом putfast можно добиться мгновенного вывода.
Более того, есть возможность автоматически заменить все имеющиеся и будущие putserv'ы, puthelp'ы и putquick'и, переопределив их, чтобы бот использовал putfast для вывода всех своих данных с помощью следующего скрипта.
Внимание!
Использование данного кода может спровоцировать флуд вашим ботом ирк-сервера, что может вызвать любые последствия от единичного дисконнекта вашего бота от сервера, вплоть до перманентного gline'а.

CODE
proc putfast {text} {
    append text "\n"
    catch {putdccraw 0 [string length $text] $text}
}
if {[info commands "putserv_original"]=="putserv_original"} {
    rename putserv ""
    rename putserv_original putserv
}
rename putserv putserv_original
proc putserv { text {mode ""}} {
    putfast $text
}
if {[info commands "puthelp_original"]=="puthelp_original"} {
    rename puthelp ""
    rename puthelp_original puthelp
}
rename puthelp puthelp_original
proc puthelp { text {mode ""}} {
    putfast $text
}
if {[info commands "putquick_original"]=="putquick_original"} {
    rename putquick ""
    rename putquick_original putquick
}
rename putquick putquick_original
proc putquick { text {mode ""}} {
    putfast $text
}

В отличие от оригинальной версии putfast_vs_putserv.tcl, в данный код добавлена проверка на подключенность бота к IRC-серверу, что исключает возможность возникновения ошибки "invalid idx" при попытке отправления какого-либо текста по таймерам после отключения бота от IRC-сервера.
В принципе, также для проверки подключения можно использовать следующий код:
CODE
if {![string match "*(server)*" [dcclist]]} {return}


ЗЫ: Если у кого-либо есть предложения, как можно более оптимально проверить, подключен ли бот к серверу или нет - поделитесь ими smile.gif
Сложность заключается в том факте, что переменные $server и бинды, сообщающие об успешном подключении, выставляются после успешной окончательной регистрации ботом на сервере, тогда как возможность отсылки RAW-команд, собственно, для этой самой регистрации, появляется раньше, и отследить её можно только в [dcclist].


--------------------
Не понял сам - не дай понять другому
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 User(s) are reading this topic (2 Guests and 0 Anonymous Users)
0 Members:

 



Lo-Fi Version Time is now: 29th March 2024 - 12:27 AM
Design by GPF © 2006