Скрытый раздел, посвященный IRC, со статьями вынесенными в главное меню

Eggdrop and non-latin characters.


It is known that popular irc-bot eggdrop ( has some troubles with non-latin characters. You can see a lot of messages on forum ( under titles like "Some characters aren't correctly handled by the eggdrop".
Also I asked eggdrop's users, whose alphabet in general has Latin characters and in addition has Latin characters with diacritic signs (cedilla, diaeresis, caron, acute, etc.), about problem with these characters (for example: there are 'ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽáčďéěíňóřšťúůýž' characters in Czech alphabet). Many of them said that they don't have any problems, because they can easily replace these characters with Latin characters without diacritic signs. One french-speaking friend said that the word 'garçon' (boy, fr.) can be written as 'garcon'. On the other hand, many people, whose native alphabet is Cyrillic or Greek answered positively. They have some problems with case sensitive binds that contains non-latin characters and sometimes bot even outputs 'trash' instead of expected characters.

1. Suzi project patch.

The patch intends to avoid problems listed below:
- problem with get/send/process strings which contain non-Latin characters in TCL interpreter when encoding system is not iso8859-1 (also there are problems even if encoding system is iso8859-1)
- problem with 'case sensitive' and 'not matching' binds, which contains non-Latin characters in match part
- problem with 'set nick "non-Latin-characters"'
- problem with stripping characters with code 255 in party line or DCC chat
- problem with DCC commands '.chhandle' and '.handle' and their TCL analogs
- problem with detecting locale encoding

Although, this problems have the relationship between themselves and if you fix one also will be fixed the other, I've separated and sorted them by 'severity'.

Of course, the patch is not revolutionary, ideas implemented by the patch were discussed many times in various forums. But I've not seen the realization yet. This patch replaces calls TCL API function which requires well formed utf-8 strings as input/output arguments to wrappers that convert strings which come in locale encoding to utf-8 and back.

After applying patch you avoid ALL problems described below and your bots will work as expected at any test.

2. Problem details

So, if you haven't believed me yet, follow the detailed explanation of each problem.

I have bot installed in '~/eggdrop' compiled from original sources (without any patch). Version of eggdrop is 1.8.16, TCL is 8.4.13.

2.1. Problem with get/send/process strings which contain non-Latin characters.

This problem has long history, but it's not still solved. There is a particular solution for some languages, but I haven't seen really universal one. Problem has appeared when TCL's developers changed internal and external API of TCL library to Unicode (since version 8.1.0, but I'm not sure). Now functions of TCL library require well formed utf-8 strings as input argument and return also utf-8 encoded string (with some exception). Alas, eggdrop internals do not meet this requirement. It has been changed partially, but not at all.
Let users on some IRC server use cp1251 encoding for chat. We have configured the bot connected to an IRC server and a small script for testing purposes that was loaded via 'source scripts/test.cp1251.tcl' command in eggdrop’s configuration file:

'scripts/test.cp1251.tcl' (script contains characters in cp1251 encoding):

 bind pub -|- {!test} test_handler
bind pub -|- {!тест} test_handler
proc test_handler { unick uhost uhandle uchannel utext } {
set text [string toupper "$unick on $uchannel, you said (ты сказал): $utext ([encoding system])"]
putserv "PRIVMSG $channel :$text"

Test it on channel #eggtes (bot run in locale en_US.iso8859-1)

 < lynxy> !test abcd абвг
< lynxy> !tEsT abcd абвг
< lynxy> !тест abcd абвг
< lynxy> !тЕсТ abcd абвг

There are two problems. The first problem is that 'bind' for '!тест' does not work and the second one is that 'string toupper' converts both Latin and Cyrillic characters which are in the body of the script, but Cyrillic characters in the input string are left unchanged.

Why does 'bind' not work?
Go to bot's party line and type '.binds'

[13:26] tcl: builtin dcc call: *dcc:binds lynxy 7
[13:26] #lynxy# binds
Command bindings:
evnt -|- init-server 1 evnt:init_server
pub -|- !B5AB 0 test_handler
pub -|- !test 2 test_handler

Wow! The second bind is wrong! I wrote '!тест' for match, but I've got strange '!B5AB' sequence. Look at the table below: the first two columns are Cyrillic letter and corresponding Unicode code, the second two columns are Latin letter and its Unicode code:

| 1 | uni | 2 | uni |
| т | 0442 | B | 0042 |
| е | 0435 | 5 | 0035 |
| с | 0441 | A | 0041 |
| т | 0442 | B | 0042 |

Seems that 'bind' just takes only the lower byte of each Unicode character.

Why 'string toupper' does not work properly with non-Latin characters?
The string is received from IRC server in cp1251 encoding and when eggdrop's core sets values of TCL variables and calls the handler it does not convert this string from cp1251 to utf-8 (as required by TCL API) and TCL function 'string toupper' can't process these characters properly.
Ok, now I know why it happens. Let's change the script by applying 'encoding convertfrom' to string that is passed to TCL interpreter by eggdrop's C-code and 'encoding convertto' to string that is sent to C-code.
Also we must run bot in locale with proper encoding, because eggdrop uses functions from C library like 'strcasecmp()', 'tolower()', 'toupper()' with locale depended behaviour.


 bind pub -|- {!test} test_handler
bind pub -|- [encoding convertto {!тест}] test_handler
proc test_handler { unick uhost uhandle uchannel utext } {
set nick [encoding convertfrom $unick]
set channel [encoding convertfrom $uchannel]
set text [encoding convertfrom $utext]
set str [string toupper "$nick on $channel, you said (ты сказал): $text ([encoding system])"]
putserv [encoding convertto "PRIVMSG $channel :$text"]

And run bot in locale with cp1251 encoding:

user@sys:~/eggdrop> LANG=ru_RU.cp1251 ./eggdrop


 < lynxy> !test SoMe TeXt нЕкИй ТеКсТ
< lynxy> !tEsT SoMe TeXt нЕкИй ТеКсТ
< lynxy> !тест SoMe TeXt нЕкИй ТеКсТ
<lynxy> !тЕсТ SoMe TeXt нЕкИй ТеКсТ

Wow! It works! But the body of handler proc generally contains 'encoding ...' lines, of course I could write an alias for 'bind', 'putserv' and other functions like this:

 proc i18bind {type flags name handler} {
bind $type $flag [encoding convertto $name] $handler

It solves many encoding problems, but not them all.

I think that passing locale encoded string as byte array to TCL interpreter and getting back was intended by eggdrop's developers, but this idea seems a bit useless. I haven't seen any scripts yet that required byte array rather than a string. Why I must use 'encoding ...' in scripts when it is task of eggdrop's C-code? You can use Suzi project patch and forget about 'encoding ...' hell or do not use patch and use 'encoding ...' everywhere. It is your choice.

Problem with 'set nick "non-Latin-chars"' has similar solution.

2.2. Problem with stripping characters with code 255 in party line or DCC chat.

There are two types of clients which can connect to bot:
1. IRC clients working via DCC chat
2. Telnet clients

Telnet protocol has some control sequences which starts with code 255 and eggdrop silently strips it from incoming strings:

encoding system is cp1251

 .say #eggtest меня зовут Настя
[14:20] tcl: builtin dcc call: *dcc:say lynxy 7 #eggtest мен зовут Наст
[14:20] #lynxy# (#eggtest) say мен зовут Наст
Said to #eggtest: мен зовут Наст

Stripped letter 'я' (code 255 in cp1251), this letter very often appears in Russian words.

encoding system iso8859-1 (letter 'ÿ' has code 255 in iso8859-1)

 .say #eggtest saÿ ÿo-ÿo
[14:24] tcl: builtin dcc call: *dcc:say lynxy 7 #eggtest sa o-o
[14:24] #lynxy# (#eggtest) say sa o-o
Said to #eggtest: sa o-o

Also stripped (I don't know how often this letter is used, but it is stripped!)

There is a solution. Telnet clients send some control sequences while establishing the connection, but IRC clients do not. If control sequences are sent while the connection establishes stripping will be enabled and if there are no any control sequences, stripping will be disabled. This allows to avoid the problem.

2.3. Problem with DCC commands '.chhandle' and '.handle' and their TCL analogs
Bugs in DCC commands 'chhandle','handle' lead to substitution of non-Latin characters by '?'. Although you can add handle with non-Latin characters, but DCC commands 'chhandle', 'handle' and their analogs for TCL replace all the characters of the code above 127 to '?' (question mark)

 .+user LamoЮзер
[14:37] tcl: builtin dcc call: *dcc:+user lynxy 7 LamoЮзер
[14:37] #lynxy# +user LamoЮзер
Added LamoЮзер (no host) with no password and no flags.
.chhandle LamoЮзер ЛамоЮзер
[14:37] tcl: builtin dcc call: *dcc:chhandle lynxy 7 LamoЮзер ЛамоЮзер
[14:37] Switched 0 notes from LamoЮзер to ????????.
[14:37] #lynxy# chhandle LamoЮзер ????????

The problem is located in 'cmd_handle', 'cmd_chhandle' and 'tcl_chhandle' functions, that treat all the characters with code not in range from 32 to 127 as bad. Other procedures related to user handles don't have such problems.

2.4. Problem with detecting locale encoding.
This problem has very low severity, but I'll describe it.

Create small configuration file 'eggenc.conf':

user@sys:~/eggdrop> echo -e "putlog \"eggdrop encoding: [encoding system]\"; die;" > eggenc.conf

And test:

 user@sys:~/eggdrop> echo $LANG
user@sys:~/eggdrop> ./eggdrop eggenc.conf
Eggdrop v1.6.18 (C) 1997 Robey Pointer (C) 2006 Eggheads
[10:48] --- Loading eggdrop v1.6.18 (Sat Jul 22 2006)
[10:48] eggdrop encoding: cp1251
[10:48] * EXIT


Now run in locale ru_RU.koi8-r:

 user@sys:~/eggdrop> LANG=ru_RU.koi8-r ./eggdrop eggenc.conf
Eggdrop v1.6.18 (C) 1997 Robey Pointer (C) 2006 Eggheads
[10:57] --- Loading eggdrop v1.6.18 (Sat Jul 22 2006)
[10:57] eggdrop encoding: iso8859-1
[10:57] * EXIT



 user@sys:~/eggdrop> LANG=ko_KR.euckr ./eggdrop eggenc.conf
Eggdrop v1.6.18 (C) 1997 Robey Pointer (C) 2006 Eggheads
[10:58] --- Loading eggdrop v1.6.18 (Sat Jul 22 2006)
[10:58] eggdrop encoding: iso8859-1
[10:58] * EXIT

Wrong again!

You can force setting appropriate locale encoding by placing at the begin of eggdrop's configuration file something like this:

encoding system koi8-r


encoding system euc-kr

But if I run 'tclsh', it detects locale encoding properly:

 user@sys:~/eggdrop> LANG=ru_RU.koi8r tclsh
% encoding system; exit
user@sys:~/eggdrop> LANG=ko_KR.euckr tclsh
% encoding system; exit

When eggdrop initializes TCL interpreter it also tries to detect locale encoding and then set it for the interpreter. But eggdrop's code has some errors in encoding detection and doesn't always detect encoding properly. In comments written to this code in 'src/tcl.c' is said that the code is grabbed from TCL sources, but it seems to be very old. Furthermore now there is no need of this code because TCL library detects locale encoding while perform self-initialization. Patch just removes this strange code from eggdrop and now it detects ALL the encodings that I have on my system.

3. Windows and Eggdrop

Eggdrop compiled with Cygwin environment (also known as Windrop) has the same problems and even more.
As I know Cygwin does not support any locale encoding except ASCII and UTF-8, but it is useless in many cases. So case insensetive binds does not work with non-latin characters (see test 2.1). I also include separate patch to make Windrop use Windows API locale depended routines for case of insensetive string comparision instead their Cygwin's analogs.

P.S. Sorry for bad english.

Date: 2006-Jul-26
Author: Anastasia Zemina a.k.a. lynxy (WeNet, #eggtest), Suzi project team
Thanks to: ZemIn, Buster, Yxaaaaaaa.

Eggdrop и национальные символы.


Далеко не новость то, что популярный бот eggdrop ( имеет проблемы при работе с нелатинскими символами. Достаточно посмотреть множество сообщений форума ( по поводу проблем с символами национальных алфавитов. Также были опрошены пользователи eggdrop, чей алфавит содержит символы не входящие в латинцу, имеют ли они какие либо проблемы с ботом при использовании национальных символов. Большая часть опрошенных, которые в основном используют латинский алфавит и дополнительно буквы латинского алфавита с диакритическими знаками (например алфавит чешского языка содержит помимо латиницы ещё буквы 'ACDEEINORSTUUYZacdeeinorstuuyz'), ответили мне что особенных проблем они не испытывают, просто потому что легко могут заменить буквы с диакритическими знаками на такие же без них. Так, один французско-говорящий собеседник объяснил что 'garcon' (мальчик, фр.) может быть легко записано как 'garcon' и такая замена вполне допустима. С другой стороны, большинство тех, чей алфавит значительно отличается от латинского (например кириллический или греческий) ответили утвердительно на этот вопрос. Те или иные проблемы при использовании национальных символов у них возникают, например проблема с регистрозависимостью 'bind' или вывод 'крякозябликов' вместо ожидаемых символов.

Что же, оставим тех кто могут легко заменять символы национальных алфавитов на чистую латиницу и перейдём к нам, простым смертным, которые любят и уважают свой родной язык и хотят научить бота любить родину.

В скобочках, с указанием версии, будет помечаться то, что уже перенесено или исправлено в официальных исходниках бота.

1. Патч Suzi project

Данный патч предназначен для устранения ВСЕХ нижеописанных проблем с национальными символами (это те, которые не входят в ANSI и имеют коды больше 127). Например это актуально для кириллического алфавита, греческого и других. Сразу хотелось бы отметить, что патч не является чем то революционным и тем более мы не претендуем на оригинальность подхода для коррекции проблемы (хотя именно патчей, готовых, не встречалось). Одна из проблем, которую исправляет патч -- "съедание" символов с кодом 255 в сеансе dcc или telnet (для cp1251 это 'я', для koi8-r это 'Ъ', для iso8859-1 это буква 'y'). Этот патч, господина с ником vd включен в патч без изменений. (1.6.20+)

Идея конвертирования всех входящих/исходящих строк в/из utf-8, как это требует API TCL озвучивалась на форумах посвящённых eggdrop неоднократно, но конкретной реализации кажется не было. Что, впрочем, вполне обосновано -- это повлекло бы за собой множество несовместимостей и возможных ошибок и не годилось для быстрого решения проблемы. Этот патч представляет собой конкретную реализацию коррекции вызовов TCL API внутри eggdrop, где в качестве параметра(ов) или возвращаемого значения используется строка, выполняя преобразования в формат требуемый TCL API. То есть является кардинальным изменением структуры вызовов (хотя реально, в патче на данный момент используются подстановки).

2. Проблемы присущие eggdrop при использовании национальных символов.

Все описанные ниже проблемы так или иначе проявляются когда используются национальные символы:

  • проблема с вводом/выводом/обработкой строк при использовании encoding system отличной от iso8859-1 (да и с ней тоже проблем много, одним словом проблемы есть)
  • проблема с регистрозависимостью и несрабатыванием bind'ов содержащих нелатинские символы.
  • проблема с установкой ника бота с нелатинскими символмами.
  • проблема со "съеданием" символа с кодом 255 в party-line или сеансе DCC chat. (1.6.20+)
  • проблема с DCC командами '.chhandle' и '.handle' и их TCL аналогами. (1.6.20+)
  • проблема с определением кодировки локали. (1.6.20+)

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

3. Причины проблем и их проявления

Что же, я думаю Вы не верите мне на слово, давайте проверять. Итак, у нас есть скомпилированный и инсталированный оригинальный бот (без каких бы то ни было патчей) в директории '~/eggdrop'. Я использую eggdrop1.6.18 и TCL8.4.13. Бот минимально сконфигурирован и подключен к irc серверу.

3.1. Проблема с вводом/выводом/обработкой строк при использовании encoding system отличной от iso8859-1.

Эта проблема имеет давнюю историю, ей посвящено множество тем форума, отдельных статей и вопросов. Но универсального решения до сих пор, кажется, не было. Причина этой проблемы проста и банальна. В своё время разработчики TCL перевели внутренности интерпретатора на unicode, а функции API принимающие/возвращающие в качестве параметров строки требуют чтобы эти строки были utf-8. Но увы и ах, eggdrop передаёт/получает строки TCL интерпретатора как последовательность байт (byte array в терминах TCL), а не как строку.

Напишем небольшой тестовый скрипт 'scripts/test.cp1251.tcl' (кодировка файла однобайтная cp1251):

 bind pub -|- {!test} test_handler
bind pub -|- {!тест} test_handler
proc test_handler { unick uhost uhandle uchannel utext } {
set text [string toupper "$unick on $uchannel, you said (ты сказал): $utext ([encoding system])"]
putserv "PRIVMSG $channel :$text"

Незатейливо проверяем в локали с кодировкой iso8859-1:

 < lynxy> !test SoMe TeXt нЕкИй ТеКсТ
 < lynxy> !tEsT SoMe TeXt нЕкИй ТеКсТ
 < lynxy> !тест SoMe TeXt нЕкИй ТеКсТ
 < lynxy> !тЕсТ SoMe TeXt нЕкИй ТеКсТ

Видим сразу две проблемы: во-первых не сработал 'bind' содержащий национальные символы, во-вторых 'string toupper' отработал только на английских символах и на национальных, которые были в исходном тексте, но те котрые были введены в качестве параметра обработчику не были конвертированы в верхний регистр.

Почему не сработал 'string toupper'? Причина этому проста, для того чтобы работала правильно эта функция, строка должна быть верно сконвертированна из однобайтной кодировки, в которой она приходит с сервера во внутреннее unicode представление TCL. Пользователи моего irc сервера используют кодировку cp1251. Что же, установим encoding system cp1251 (например командой '.tcl encoding system cp1251' или принудительно в конфигурационном файле устанавливаем 'encoding system cp1251' и делаем '.rehash' или, что правильней всего, запускаем бота в нужной локали LANG=ru_RU.cp1251 ./eggdrop).

Проверяем, что у нас получилось:

 < lynxy> !test SoMe TeXt нЕкИй ТеКсТ
 <eggbot> LYNXY ON #EGGTEST, YOU SAID ("+ !ZPWP): SOME TEXT нЕкИй ТеКсТ (CP1251)
 < lynxy> !tEsT SoMe TeXt нЕкИй ТеКсТ
 <eggbot> LYNXY ON #EGGTEST, YOU SAID ("+ !ZPWP): SOME TEXT нЕкИй ТеКсТ (CP1251)
 < lynxy> !тест SoMe TeXt нЕкИй ТеКсТ
 < lynxy> !тЕсТ SoMe TeXt нЕкИй ТеКсТ

Стало немного хуже, по-прежнему не работает 'bind' и 'string toupper', а с национальными символами содержащимися в скрипте произошло что то непонятное. Попробуем разобраться что же произошло. Возьмём две строки 'ТЫ СКАЗАЛ' и '"+ !ZPWP' и напишем коды символов в unicode:

| 1 | uni | 2 | uni |
| Т | 0422 | | 0022 |
| Ы | 042B | + | 002B |
| | 0415 | | 0015 |
| С | 0421 | ! | 0021 |
| . | .... | . | .... |

Смотрим в party-line '.binds'

 [13:26] tcl: builtin dcc call: *dcc:binds lynxy 7
 [13:26] #lynxy# binds
 Command bindings:
 evnt -|- init-server 1 evnt:init_server
 pub -|- !B5AB 0 test_handler
 pub -|- !test 2 test_handler

Стало немного понятней, он просто отрезает верхний байт. И понятно почему не работает 'bind', в функцию попадают символы в "кастрированном" unicode. Более того, чтобы правильно работал регистронезависимый 'bind' необходимо запускать бота в соответствующей локали, потому что для сравнения используются функции библиотеки C 'strcasecmp' и подобные, чьё поведение зависит от локали.

Ну раз он такой плохой попробуем избежать этого. Модифицируем скрипт и будем передавать функциям написанным на C строки предварительно сконвертированные в однобайтную кодировку ('encoding converto'), а при получении строк будем приводить их к TCL unicode ('encoding convertfrom'):

 bind pub -|- {!test} test_handler
 bind pub -|- [encoding convertto {!тест}] test_handler
 proc test_handler { unick uhost uhandle uchannel utext } {
  set nick [encoding convertfrom $unick]
  set channel [encoding convertfrom $uchannel]
  set text [encoding convertfrom $utext]
  set str [string toupper "$nick on $channel, you said (ты сказал): $text ([encoding system])"]
  putserv [encoding convertto "PRIVMSG $channel :$text"]

И запускаем бота в правильной локали:

 user@sys:~/eggdrop> LANG=ru_RU.cp1251 ./eggdrop


 < lynxy> !test SoMe TeXt нЕкИй ТеКсТ
 < lynxy> !tEsT SoMe TeXt нЕкИй ТеКсТ
 < lynxy> !тест SoMe TeXt нЕкИй ТеКсТ
 <lynxy> !тЕсТ SoMe TeXt нЕкИй ТеКсТ

Ухты! Кажется что работает! Сработал и 'string toupper' и 'bind', в том числе независимо от регистра. Но поводов для веселья в данном случае не так и много. Во-первых это просто утомительно, каждый раз писать переконвертацию для каждой строки которая возможно содержит национальные символы. Конечно, можно написать некие обёртки для часто используемых функций, например:

 proc i18nbind {type flags name handler} {
  bind $type $flag [encoding convertto $name] $handler

Однако это не решит ВСЕХ проблем (например party-line так не вылечить). Я предпочитаю изменить исходный текст eggdrop для достижения требуемого эффекта, чтобы можно было безболезненно использовать национальные символы избегая постоянной конверсии. Проблема установлена и её можно достаточно просто устранить если сделать эти преобразования незаметными и реализовать их на уровне языка C.

Я думаю что разработчики eggdrop намеренно не сделали автоматическую конвертацию С-строк в кодировке локали в/из UTF-8, поскольку это можно сделать внутри TCL интерпретатора. Но, на мой взгляд, такой способ передачи строк в интерпретатор почти бесполезен, потому что в 99% случаев требуется именно строка, а не последовательность байт и приходится её конвертировать, загромождая код лишними преобразованиями. Патч изменяет это поведение и в интерпретатор строки передаются уже правильно сформированными в utf-8 (и вы всегда можете конвертировать их обратно в последовательность байт посредством encoding convertto, но мне ещё ни разу не встречалось случая когда это было необходимо). Проблема с установкой боту ника содержащего национальные символы имеет тот же источник и решается подобным образом.

3.2. Проблема со "съеданием" символа с кодом 255 в party-line или сеансе DCC chat. (1.6.20+)

!!! ВНИМАНИЕ! Здесь использованы материалы vd и я никоим образом не претендую на авторство !!!

К боту могут подключаться два вида клиентов:

  1. IRC клиенты по протоколу DCC CHAT
  2. Telnet клиенты по протоколу telnet

И хотя эти протоколы похожи между собой, но telnet протокол поддерживает так же управляющие последовательности, которые впрочем обрабатываются ботом в режиме мягкой задумчивости (а попросту говоря он их вырезает). Но IRC клиенты в сеансе DCC CHAT не используют управляющие последовательности и ничего про них не знают, а бот, поскольку не умеет отличать одних клиентов от других со спокойной совестью вырезает национальные символы с кодом 255. Например для кодировки cp1251 это буква 'я':

 .say #eggtest меня зовут Настя
 [14:20] tcl: builtin dcc call: *dcc:say lynxy 7 #eggtest мен зовут Наст
 [14:20] #lynxy# (#eggtest) say мен зовут Наст
 Said to #eggtest: мен зовут Наст

Даже для разлюбезной кодировки iso8859-1 которую к делу и не к делу рекомендуют устанавливать всеразличные "умельцы" это буква 'y' (впрочем я не знаю насколько часто она используется в других языках, но факт налицо):

 .say #eggtest say yo-yo
 [14:24] tcl: builtin dcc call: *dcc:say lynxy 7 #eggtest sa o-o
 [14:24] #lynxy# (#eggtest) say sa o-o
 Said to #eggtest: sa o-o

Эта проблема исправляется патчем vd, который учит eggdrop отличать клиентов. Отличаются они при авторизации, при подключении к боту Telnet клиентом, в частности на этапе ввод логина и пароля, telnet клиент выдает себя тем что он посылает управляющие коды вначале текста что используется для его идентификации и, следовательно, управляющие последовательности вырезаются. IRC клиенты управляющих последовательностей при соединении не посылают и в дальнейшем работа с таким клиентом ведётся без вырезания управляющих последовательностей.

3.3. Проблема с DCC командами '.chhandle' и '.handle' и их TCL аналогами. (1.6.20+)

Ошибки в DCC командах chhandle, handle (и их аналогах для TCL скриптов) приводят к замене национальных символов на '?' (знак вопроса), хотя при этом добавить хендл с национальными символами можно. Конечно, это не самое лучшее решение использовать хендлы содержащие национальные символы, но ведь если можно добавить то почему нельзя переименовать?!

 .+user LamoЮзер
 [14:37] tcl: builtin dcc call: *dcc:+user lynxy 7 LamoЮзер
 [14:37] #lynxy# +user LamoЮзер
 Added LamoЮзер (no host) with no password and no flags.
 .chhandle LamoЮзер ЛамоЮзер
 [14:37] tcl: builtin dcc call: *dcc:chhandle lynxy 7 LamoЮзер ЛамоЮзер
 [14:37] Switched 0 notes from LamoЮзер to ????????.
 [14:37] #lynxy# chhandle LamoЮзер ????????

Проблема заключена в процедурах 'cmd_handle', 'cmd_chhandle' и 'tcl_chhandle' которые считают все символы с кодом больше 127 плохими и заменяет их на '?' (знак вопроса), при этом другие процедуры так не считают.

3.4. Проблема с определением кодировки локали. (1.6.20+)

Хотя эта проблема незначительная, я всё таки опишу её.

Создадим небольшой тестовый файл 'eggenc.conf':

 user@sys:~/eggdrop> echo -e "putlog \"eggdrop encoding: [encoding system]\"; die;" > eggenc.conf

Проверяем правильность определения кодировки локали:

 user@sys:~/eggdrop> echo $LANG
 user@sys:~/eggdrop> ./eggdrop eggenc.conf
 Eggdrop v1.6.18 (C) 1997 Robey Pointer (C) 2006 Eggheads
 [10:48] --- Loading eggdrop v1.6.18 (Sat Jul 22 2006)
 [10:48] eggdrop encoding: cp1251
 [10:48] * EXIT

Выглядит хорошо, а теперь другой тест запускаем бота в локали ru_RU.koi8-r:

 user@sys:~/eggdrop> LANG=ru_RU.koi8-r ./eggdrop eggenc.conf
 Eggdrop v1.6.18 (C) 1997 Robey Pointer (C) 2006 Eggheads
 [10:57] --- Loading eggdrop v1.6.18 (Sat Jul 22 2006)
 [10:57] eggdrop encoding: iso8859-1
 [10:57] * EXIT

А вот и не угадал!

Ещё пример:

 user@sys:~/eggdrop> LANG=ko_KR.euckr ./eggdrop eggenc.conf
 Eggdrop v1.6.18 (C) 1997 Robey Pointer (C) 2006 Eggheads
 [10:58] --- Loading eggdrop v1.6.18 (Sat Jul 22 2006)
 [10:58] eggdrop encoding: iso8859-1
 [10:58] * EXIT

Опять мимо.

Возможное решение проблемы состоит в принудительном указании кодировки в начале конфигурационного файла, например так:

 encoding system koi8-r

или вот так:

encoding system euc-kr

Одако, если запустить интерпретатор 'tclsh' в тех же самых локалях он верно определяет кодировки:

 user@sys:~/eggdrop> LANG=ru_RU.koi8r tclsh
 % encoding system; exit
 user@sys:~/eggdrop> LANG=ko_KR.euckr tclsh
 % encoding system; exit

Спрашивать где проблема -- бессмысленно, она в коде eggdrop. А точнее в файле 'src/tcl.c' строки 597-682, с незапамятных времён содержится код, который пытается определить кодировку и установить её для интерпретатора. Если верить коментариям к этому участку кода он взят из исходников TCL. Но видимо это было так давно, что сейчас он просто работает неверно. Более того, в этом коде нет необходимости, потому что библиотека TCL во время инициализации сама делает определение кодировки локали. После удаления этого странного кода бот стал уверенно определять ВСЕ кодировки которые есть на моей системе.

4. Windows и Eggdrop

Eggdrop собранный в среде Cygwin (более известный как Windrop) имеет все вышеописанные проблемы (которые так же лечатся патчем) плюс ещё одну.

Насколько мне известно, Cygwin на данный момент не поддерживает никаких кодировок локалей кроме ASCII и UTF-8, но в нашем случае они почти бесполезны. И регистронезависимые бинды содержащие национальные символы не будут работать регистронезависимо. Поэтому мною был сделан отдельный патч, который заставляет windrop использовать функции сравнения строк Windows API вместо аналогичных Cygwin'a. Использовать или нет этот дополнительный патч -- решать Вам.


Дата: 28-Июль-2006

Автор: Анастасия Зёмина a.k.a. lynxy (WeNet, #eggtest), Suzi project team

Благодарности: ZemIn, Buster, Yxaaaaaaa.

Конфигурационный файл eggdrop.conf

Конфигурационный файл с описанием можно скачать по ссылке: eggdrop.conf


  1. Введение
  2. Описание файла eggdrop.conf
    1. Основное
    2. лог-файлы
    3. console
    4. файлы и директории
    5. ботнет
    6. дополнительное
    7. модули
    8. DNS модуль
    9. CHANNELS модуль
    10. SERVER модуль
    11. CTCP модуль
    12. IRC модуль
    13. TRANSFER модуль
    14. SHARE модуль
    15. COMPRESS модуль
    16. FILESYSTEM модуль
    17. NOTES модуль
    18. CONSOLE модуль
    19. WOOBIE модуль
    20. SEEN модуль
    21. BLOWFISH модуль
    22. ASSOC модуль
    23. WIRE модуль
    24. UPTIME модуль
    25. скрипты


#! /path/to/executable/eggdrop
# ^- путь к исполняемому файлу бота. "#! /home/lamest/egg/eggdrop"
# это нужно для того, чтобы запускать бота из конфигурационного файла.
# например: ./lamest.conf
# $Id: eggdrop.conf,v 1.9 2002/12/27 22:48:49 wcc Exp $
# детальные описания настроек на английском языке вы найдете в директории:
# doc/settings/

#### ОСНОВНОЕ ####

# имя, которым бот идентифицирует себя как пользователя,
# при подключении к серверу. не работает, если на машине есть
# ident-сервер.
set username "lamest"

# имя и email владельца бота.
# выводится в .status и /msg <botnick> help
set admin "Lamer <e-mail: lamer(at)>" 

# в какой IRC-сети сидит бот. данная строка нужна для того, чтобы
# в ботнет было видно откуда он.
# наилучший формат: "Undernet", "EFNet" и т.д.
set network "WeNet"

# в какой часовом поясе (timezone) ваш бот?
# часовой пояс задается тремя или более алфавитными символами.
# например: Central European Time (UTC+1) будет "CET"
# списки поясов доступны в любой системе типа unix/linux.
set timezone "GMT"

# "cмeщeниe" вaшeгo чacoвoгo пoяca oтнocитeльнo гpинвичa (GMT, oнo жe UTC).
# пoлoжитeльнo, ecли вы зaпaднee нулeвoгo мepидиaнa и oтpицaтeльнo,
# ecли вocтoчнee. например: если временная зона UTC+1, то поправка будет "-1"
set offset "+3"

# если вы хотите использовать значения timezone и offset не только в
# скриптах, но и глобально в системе, то раскомментируйте эту строку.
#set env(TZ) "$timezone $offset"

# если ваша машина имеет более одного IP, вы можете установить на каком
# именно IP будет работать бот. установить можно как IP, так и хост.
# но обычно хост требуется прописывать только в том случае, если бот не
# может его определить сам во время запуска.
#set my-hostname ""
#set my-ip ""

# если вы хотите изменить язык сообщений, что выдает бот, то установите
# предпочитаемый язык.
#addlang "english"

#### ЛОГ-ФАЙЛЫ ####

# события, записываемые в лог файлы:
#   m  приватные сообщения и ctcp на бота
#   k  кики, баны, смены режимов канала
#   j  входы, выходы, сетевые-сплиты
#   p  публичные разговоры в канале
#   s  серверные соединения/сообщения
#   b  линковка ботов и обмен файлом пользователей
#   c  команды даваемые боту через msg и dcc
#   x  работа с файловым пространством
#   r  (если use-console-r 1) ВСЁ приходящее от сервера
#   v  (если debug-output 1) ВСЁ исходящее на сервер
#   t  (если debug-output 1) botnet-траффик
#   o  прочее: информация, ошибки (ВАЖНАЯ ИНФОРМАЦИЯ)
#   w  wallops: сообщения между IRCop'ами (нужен флаг +w в init-server)

# максимальное количество логов (не меньше 5!).
set max-logs 25

# максимальный размер лог-файлов. "0" для отключения.
# работает только, если keep-all-logs 0 (выключено).
# размер указывается в килобайтах. например: "550" указывает, что надо
# перезаписать лог, если он стал больше 550 килобайт.
set max-logsize 0

# отписывать лог и проверять размер (если max-logsize указан) КАЖДУЮ минуту
# вместо каждых 5-ти. это бывает нужно, если бот ведет статистику на www.
set quick-logs 0

# для логов с флагами "k", "j" и "p" надо указать канал принадлежности.
# для ведения лога от всех каналов укажите "*".

# в 'eggdrop.log' будут храниться приватные msg/ctcp, команды, прочая
# информация и ошибки с каналов:
logfile mco * "logs/eggdrop.log"

# в 'lamest.log' будут храниться входы, выходы, кики, баны и смены режимов
# канала #lamest:
#logfile jk #lamest "logs/lamest.log"

# [0/1] проставлять время сообщений в лог-файлы?
set log-time 1

# [0/1] хранить все логи? вместо только последних 48 часов.
# если отключить, то будут храниться только текущий день и вчерашний.
# вчерашний будет иметь имя "(logfilename).yesterday".
set keep-all-logs 0

# если keep-all-logs установлен в "1", то вам необходимо задать формат
# времени, который будет приписываться к имени лога в виде суффикса.
# по умолчанию: "%d%m%Y". пример: "04May2000".
# внимание: на системах не поддерживающих strftime будет использоваться
# формат, который установлен по умолчанию.
set logfile-suffix ".%d%b%Y"

# раз в сутки текущий лог-файл заканчивается и начинается новый.
# этот параметр задает (в формате military time), когда это должно
# происходить. имейте ввиду, что 0 в начале может запутать TCL и
# он может принять его не за то значение, которое вам нужно.
# формат military time прост: 3 ночи это 300, 4 дня это 1600
set switch-logfiles-at 300

# [0/1] включить "тихую" запись? фразы "Writing user file..." и
# "Writing channel file ..." не будут выводиться в консоль.
set quiet-save 0

#### CONSOLE ####

# консольные флаги по умолчанию. затем каждый мастер/владелец смогут
# поставить все необходимые флаги для себя с помощью команды .console
set console "mkcobxs"


# файл пользователей: где будут храниться данные о пользователях.
set userfile "LamestBot.user"

# файл запуска: в какой файл бот будет отписывать номер своего процесса?
# по умолчанию: pid.<botnet-nick>
# set pidfile "pid.LamestBot"

# [0/1] сортировать пользователей в алфавитном порядке внутри файла
# пользователей?
set sort-users 0

# путь, где находятся файлы помощи.
set help-path "help/"

# путь, где находятся текстовые файлы (используются разными dump-командами).
set text-path "text/"

# место для хранения временных файлов (рекомендуется: /tmp)
set temp-path "tmp/"

# путь до файла с MOTD, который отображается при входе в патилайн бота.
# о встроенных маркерах смотрите doc/text-substitutions.doc
set motd "text/motd"

# путь до файла с баннером для телнет-соединений.
set telnet-banner "text/banner"

# установите права доступа к файлам: userfile, chanfile и notefile.
#          u  g  o           u  g  o           u  g  o
#    0600  rw-------   0400  r--------   0200  -w-------    u - user
#    0660  rw-rw----   0440  r--r-----   0220  -w--w----    g - group
#    0666  rw-rw-rw-   0444  r--r--r--   0222  -w--w--w-    o - others
# для максимальной безопасности рекомендуется установить 0600.
set userfile-perm 0600

#### БОТНЕТ ####

# перед тем, как настраивать эту часть вы должны ясно представлять, что
# такое ботнет и что именно вы от него хотите.

# если вы хотите чтобы в ботнете бот использовал ник отличный от главного
# ника бота, пропишите эту переменную.
#set botnet-nick "LlamaBot.WeNet"

# какие порты должен "слушать" бот?
# внимание: если вы запускаете на одной машине больше одного бота, то
# их порты НЕ ДОЛЖНЫ пересекаться!
# вы можете разделить доступ сделав отдельный порт для пользователей
# и отдельный для ботов. но на практике это не имеет особого значения.
#listen 3333 bots
#listen 4444 users
listen 3333 all

# [0/1] не давать соединения, если хост не совпадает с известными?
# позволяет cкpывать фaкт пpиcутcтвия бoтa на сервере oт нeизвecтныx
# eму пользовaтeлeй. включение сразу подразумевает невозможность регистрации
# новых пользователей через телнет.
set protect-telnet 0

# [0/1] проверять dcc-соединение на отсутствие "мусора", который может
# заставить бота работать медленнее или неправильно?
set dcc-sanitycheck 0

# время ожидания определения идента (в секундах)
set ident-timeout 5

# [0/1] в патилайн пускать только тех пользователей у которых есть флаг "p"?
set require-p 1

# [0/1] разрешить пользователям телнет возможность набирать 'NEW' и
# становиться новыми пользователями?
# (если ставите 1, то вы должны сделать protect-telnet 0)
set open-telnets 0

# [0/1] отображать информацию, что это eggdrop при соединение на телнет?
set stealth-telnets 0

# [0/1] отображать телнет-баннер?
set use-telnet-banner 0

# время ожидания dcc/telnet/relay/etc соединений (в секундах)
set connect-timeout 15

# максимальное количество строк в патилайн не расцениваемое как флуд.
set dcc-flood-thr 3

# сколько попыток соединения с телнет за какое количество секунд не
# считать это флудом?
set telnet-flood 5:60

# [0/1] защищать телнет от флуда?
# значение "0" тоже защищает от флуда, кроме от пользователей с флагом "f".
set paranoid-telnet-flood 1

# время ожидания ответа на определение ip/хоста (в секундах)
# (на медленном интернет-канале лучше увеличить).
set resolve-timeout 15


# если вы находитесь за firewall, задайте правильный socks-хост и
# раскомментируйте следующую строку.
#set firewall "proxy:178"
# для sun'овского "telnet passthru" firewall'а установите данную опцию.
#set firewall "!sun-barr.ebay:3666"

# если у вас NAT firewall (на вашем компьютере установлены IP в диапазоне:
#, или
# и ваш firewall прозрачно меняет ваш адрес на
# уникальный) или вы работаете через IP-маскарад, то вероятно, что dcc chat,
# ctcp chat и обмен файлом пользователей может не работать.
# попробуйте прописать здесь IP-адрес внешнего интерфейса вашего шлюза
# в интернет. и ничего не прописывайте в my-ip и my-hostname.
#set nat-ip ""

# использовать заданный диапазон портов для dcc-пересылок.
#set reserved-portrange 2010:2020

# сколько минут продолжать игнорирование?
set ignore-time 15

# в какие минуты часа производить ежечасные действия?
# например, если прописать 15, то каждые xx:15 минут будут выполняться
# системные действия, например, сохранение файла пользователей.
set hourly-updates 00

# какие пользователи будут ВСЕГДА иметь флаг "+n"?
set owner "MrLame, MrsLame"

# кому бот должен посылать уведомления о начале обучения нового пользователя?
set notify-newusers "$owner"

# какие флаги ставить новым пользователям по умолчанию?
set default-flags "h"

# какие пользовательские поля показывать при выводе команды .whois?
# будут выводится поля XTRA. например при пользовании скрипта
# userinfo.tcl можно назначить вывод полей url и birthday.
set whois-fields "url birthday"

# [0/1/2] разрешить с удаленных ботов в вашем ботнет "пинать" пользователей
# вашего патилайн?
# 0: запретить
# 1: только с share-ботов
# 2: разрешить
set remote-boots 2

# [0/1] разрешить разлинковывать ваших ботов (которые включены в систему
# обмена общим файлом пользователей) с удаленных ботов?
set share-unlinks 1

# [0/1] что делать при получении сигнала SIGHUP?
# 0: сохранять файл пользователей.
# 1: "умирать" (завершение процесса)
set die-on-sighup 0

# [0/1] что делать при получении сигнала SIGTERM?
# 0: сохранять файл пользователей.
# 1: "умирать" (завершение процесса)
set die-on-sigterm 1

# закомментируйте строки, если хотите добавить команды "tcl" и "set".
# "tcl" позволит владельцам запускать tcl команды напрямую на боте.
# "set" позволит владельцам устанавлить переменные напрямую на боте.
# обе команды это потенциальная "дыра" в безопасности бота!
# если вы выбираете себе владельцев (+n) очень аккуратно, то можете
# включить эти команды.
unbind dcc n tcl *dcc:tcl
unbind dcc n set *dcc:set

# [0/1/2] разрешить постоянным (permanent) владельцам команды tcl/set/dump?
# 0: запретить
# 1: дать владельцам команды .tcl и .set
# 2: дать владельцам команду .dump
set must-be-owner 1

# закомментируйте строку, если хотите добавить команду "simul", которая
# позволит манипулировать пользователями в патилайн.
# но следите кому раздаете +n!
unbind dcc n simul *dcc:simul

# максимальное количество dcc-соединений к боту одновременно.
# можно увеличить, но не уменьшайте.
set max-dcc 50

# [0/1] добавить 'dccsimul' команду? (требуется скрипт action.fix.tcl)
set enable-simul 1

# [0/1] разрешить пользователям с флагами +d и +k использовать команды
# с флагами -|- ?
set allow-dk-cmds 1

# время (в секундах) при попытке бота подлинковаться повторно в ботнет?
# живой пример: бот пытается подлинковаться, но его не пускают, так как
# он уже есть в ботнет, но это только потому, что старый хаб, через
# который этот бот сидел до этого, из-за лага еще не успел сообщить
# текущему хабу, что бот от него "отвалился".
set dupwait-timeout 5

# вы должны удалить или закомментировать эту строку, добавленную для
# предотвращения запуска бота с ненастроенным конфигом.
# боты с ненастроенными конфигами принимают не те ники, входят не в те
# IRC-сети и каналы. дважды перепроверьте ваш конфигурационный файл.
# ниже есть еще такая же линия. просто настраивайте конфиг :)
#die "Please make sure you edit your config file completely."

######## МОДУЛИ ########

# укажите директорию в которой находятся модули (если вы собирали бота
# не в режиме static)
set mod-path "modules/"

#### DNS МОДУЛЬ ####

# модуль предоставляет асинхронную поддержку dns-запросов.
# это предотвратит длительные ожидания ответов на запросы (и соответсвенно
# "провисы" бота), если по каким либо причинам хост не может быть определен.
loadmodule dns


# модуль предоставляет поддержку каналов для бота.
# без него бот сможет сидеть на IRC-сервере, но не будет входить в каналы.
loadmodule channels

# файл, для хранения данных о каналах.
set chanfile "LamestBot.chan"

# [0/1] пытаться по истечению времени снимать bans/exempts/invites
# установленные другими ботами на канале?
set force-expire 0

# [0/1] передавать "приветствия" (info-строки) при обмене userfile?
set share-greet 0

# [0/1] разрешить пользователям установку info-строк?
set use-info 1

# глобальные настройки, которые будут использованы при +chan.
set global-flood-chan 100:60
set global-flood-deop 3:10
set global-flood-kick 3:10
set global-flood-join 5:60
set global-flood-ctcp 3:60
set global-flood-nick 20:30

set global-aop-delay 5:30

set global-idle-kick 0
set global-chanmode ""
set global-stopnethack-mode 0
set global-revenge-mode 0
set global-ban-time 0
set global-exempt-time 60
set global-invite-time 60

set global-chanset {
        -autoop         -autovoice
        -bitch          +cycle
        +dontkickops    +dynamicbans
        +dynamicexempts +dynamicinvites
        -enforcebans    +greet
        -inactive       -nodesynch
        -protectfriends +protectops
        -revenge        -revengebot
        -secret         -seen
        +shared         -statuslog
        +userbans       +userexempts
        +userinvites    -protecthalfops

# внимание: TCL не позволяет устанавливать комментарии внутри { }

# channel add #lamest {
#   chanmode "+nt-likm"
#   idle-kick 0
#   stopnethack-mode 0
#   revenge-mode 1
#   aop-delay 5:30
#   need-op { putserv "PRIVMSG #lamest :op me cos i'm lame!" }
#   need-invite { putserv "PRIVMSG #lamest :let me in!" }
#   need-key { putserv "PRIVMSG #lamest :let me in!" }
#   need-unban { putserv "PRIVMSG #lamest :let me in!" }
#   need-limit { putserv "PRIVMSG #lamest :let me in!" }
#   flood-chan 10:60
#   flood-deop 3:10
#   flood-kick 3:10
#   flood-join 5:60
#   flood-ctcp 3:60
#   flood-nick 5:60
# }

# параметры внутри { } являются канальными значениями и могут быть добавлены
# или изменены с помощью команд channel add и channel set.

# chanmode
#   какие канальные режими бот будет "удерживать"?
#   '+' означает включен
#   '-' означает выключен
# idle-kick
#   через сколько минут бездействия в канале кикать пользователей?
#   (установите "0" для отключения)
# stopnethack-mode
#   снимать оп со всех, кто входит в канал и получает опа от сервера.
#     0 выключено
#     1 isoptest (не снимать, если он registered op),
#     2 wasoptest (не снимать, если он был op до split)
#     3 не снимать, если isop или wasop
#     4 не снимать, если isop и wasop
#     5 если у канала -bitch: смотри stopnethack-mode 3
#       если у канала +bitch: смотри stopnethack-mode 1
#     6 если у канала -bitch: смотри stopnethack-mode 2
#       если у канала +bitch: смотри stopnethack-mode 4
# revenge-mode
#   что делать боту, если у него установлен режим revenge?
#   (по умолчанию 1).
#     0 - деопать
#     1 - деопать и ставить +d
#     2 - деопать, ставить +d и кикать
#     3 - деопать, ставить +d, банить и кикать
# ban-time
#   время (в минутах) на временные баны. если "0", то "вечный" бан.
# exempt-time
#   продолжительность действия исключений из бан-листа, в минутах.
#   при нулевом значении исключения не снимаются никогда.
#   исключение снимается в случае, если на канале нет банов, удовлетворяющих
#   этой же маске. поддерживается лишь некоторыми сетями (например, IRCnet и
#   ForestNet), определяется наличием символа 'e' в numeric 004,
#   получаемым от сервера в момент соединения.
# invite-time
#   продолжительность действия приглашений (+I режим), в минутах.
#   при нулевом значении приглашения не имею срока истечения.
#   бот будет проверять приглашения каждые X минут, но не будет их удалять,
#   если канал имеет флаг +i.
# aop-delay (минимум:максимум)
# для autoop и autovoice
#   aop-delay 0                     без задержки
#   aop-delay x или aop-delay x:x   x секунд задержка
#   aop-delay x:y                   разная задержка
# если автоопный пользователь войдет в момент обработки другого автоопного
# пользователя, то бот отдаст серверу команду на оп одной строкой.
# need-op
#   скрипт, выполняющийся при желании бота получить опа на канале.
#   очень эффективно в сочетании с сервисами, если Ваша сеть их поддерживает.
#   допускается использование переменной $botnick, однако имя канала
#   необходимо указывать непосредственно.
# need-invite
#   скрипт, выполняющийся при желании бота войти на канал по приглашению.
#   очень эффективно в сочетании с сервисами, если Ваша сеть их поддерживает.
#   допускается использование переменной $botnick, однако имя канала
#   необходимо указывать непосредственно.
# need-key
#   скрипт, выполняющийся при желании бота войти на канал закрытый ключом.
#   очень эффективно в сочетании с сервисами, если Ваша сеть их поддерживает.
#   допускается использование переменной $botnick, однако имя канала
#   необходимо указывать непосредственно.
# need-unban
#   скрипт, выполняющийся при желании бота войти на канал, где его забанили.
#   очень эффективно в сочетании с сервисами, если Ваша сеть их поддерживает.
#   допускается использование переменной $botnick, однако имя канала
#   необходимо указывать непосредственно.
# need-limit
#   скрипт, выполняющийся при желании бота войти на канал, где лимит
#   пользователей достиг максимума и новым нет места.
#   очень эффективно в сочетании с сервисами, если Ваша сеть их поддерживает.
#   допускается использование переменной $botnick, однако имя канала
#   необходимо указывать непосредственно.
# flood-chan (10:60)
#   сколько сообщений в канал за какое количество секунд от одного хоста
#   считать флудом?
# flood-deop (3:10)
#   сколько деопов за какое количество секунд от одного хоста считать
#   mass de-op?
# flood-kick (3:10)
#   сколько киков за какое количество секунд от одного хоста считать
#   mass kick?
# flood-join (5:60)
#   сколько входов за какое количество секунд от одного хоста считать
#   join-флудом?
# flood-ctcp (3:60)
#   сколько ctcp-запросов в канал за какое количество секунд от одного хоста
#   считать ctcp-флудом?
# flood-nick (5:60)
#   сколько смен ников за какое количество секунд от одного хоста считать
#   nick-флудом?
# указав 0 или 0:0 вы отключите проверку на флуд

# внимание! "need-op", "need-invite", и т.д. имеют лимит строки в 120 символов.
# если вам необходимо больше, создайте свою процедуру и просто вызывайте.

# также есть еще множество настроек канальных опций, которые имеют два
# состояния: включено/выключено
# включенные опции в виде: +autoop
# выключенные опции в виде: -autoop
#channel set #lamest +enforcebans +dynamicbans +userbans +dynamicexempts +greet
#channel set #lamest +userexempts +dynamicinvites +userinvites +protectops
#channel set #lamest +protectfriends +statuslog +revenge -protecthalfops +cycle
#channel set #lamest +revengebot +dontkickops +autovoice -autoop -autohalfop
#channel set #lamest -bitch -secret -shared

# Список доступных опций канала:
# enforcebans
#    кикать пользователей, если установлен бан и на канале есть совпадающие
#    с маской бана люди
# dynamicbans
#    активировать бан только при необходимости. бот будет хранить внутри себя
#    полный список банов, но активировать их на сервере будет только, если
#    появится пользователь совпадающий с маской бана.
# userbans
#    позволять установку банов напрямую?
#    если выключить, то поставить можно будет только из консоли бота.
# dynamicexempts
#    активировать исключение только при необходимости. бот будет хранить
#    внутри себя полный список исключений, но активировать их на сервере
#    будет только, если появится появится бан совпадающий с маской исключения.
#    Исключение будет сброшено, как только будет снят сам бан.
# userexempts
#    позволять установку исключений напрямую?
#    если выключить, то поставить можно будет только из консоли бота.
# dynamicinvites
#    активировать приглашение только при необходимости. бот будет хранить
#    внутри себя полный список приглашений, но активировать их на сервере
#    будет только, если канал будет в режиме +i и появится пользователь
#    запросивший приглашение. Приглашение сбросится при установке режима -i
# userinvites
#    позволять установку приглашений напрямую?
#    если выключить, то поставить можно будет только из консоли бота.
# autoop
#   давать статус op при входе пользователям, которые имеют флаг +o.
# authalfoop
#   давать статус halfop при входе пользователей, которые меют флаг +l.
# bitch
#   только пользователи с флагом +o могуть получить статус опа на канале.
# greet
#   выводит приветствия установленные пользователями.
# protectops
#   снова давать статус опа пользователям с флагом +o, если они были
#   деопнуты.
# protecthalfops
#   снова давать статус halfop пользователям с флагом +l, если они были dehalfop-нуты.
# protectfriends
#   снова давать статус опа пользователям с флагом +f, если они были
#   деопнуты.
# statuslog
#   отображать статус канала в консоли каждые 5 минут.
# revenge
#   мстить людям, которые деопали/кикали/банили ботов, опов (+o) и друзей (+f)
#   пользователи с +f не подвергаются мщению
# revengebot
#   то же самое что и revenge, но мстит только за ботов
#   все пользователи подвергаются мщению, даже опы (+o)
# autovoice
#   давать статус voice при входе пользователям, которые имеют флаг +v.
# secret
#   показывать канал при выводе команды botinfo и who в ботнет.
# shared
#   сделать общими пользовательские данные канала и обменивать их с
#   передачей файла пользователей.
# cycle
#   производить попытки перевойти в канал, если потеряны все опы.
# dontkickops
#  не кикать пользователей с флагом +o при нарушениях.
# inactive
#   не обслуживать канал, но при этом и не потерять данные и настройки
#   (flood, channel set), флаги пользователей и баны для этого канала.
#   установка +inactive заставит бота покинуть канал.
# seen
#   обработка seen-запросов в канале (требуется seen модуль).
# nodesynch
#   не обращать внимания на смену режимов канала не опами канала.
#   (это предотвратит "борьбу" ботов с irc-сервисами)

# короткий пример:
#   channel add #botcentral {
#    chanmode "+mntisl 1"
#    idle-kick 1
#   }
#   channel set #botcentral +bitch +enforcebans -greet +revenge


# модуль предоставляет серверную поддержку.
loadmodule server

# [0/1/2/3/4/5] тип IRC-сети?
# 0 = Efnet (non +e/+I hybrid)
# 1 = IRCnet
# 2 = Undernet
# 3 = Dalnet
# 4 = Efnet +e/+I hybrid
# 5 = Прочие
set net-type 5

#### настройки:
# ник бота, который будет использоваться на IRC (и в ботнет, если не
# установлен botnet-nick).
set nick "Lamestbot"

# альтернативный ник, если основной ник будет недоступен.
# символ "?" в нике будет автоматически заменяться на цифру.
set altnick "Llamabot"

# что выводить в поле realname?
set realname "Owner: $owner"

# скрипт, который выполнится во время подключения к серверу.
# максимум 120 символов.
set init-server { putserv "MODE $botnick +i-h" }

# если при использовании команды .jump не будет указан порт,
# какой использовать по умолчанию?
set default-port 6667

# список серверов.

set servers {

# [0/1] пытаться вернуть свой ник?
set keep-nick 1

# [0/1] не "отстригать" символ "~" в хостмаске user@hosts?
set strict-host 0

# [0/1] не выводить сообщение об обрыве DCC CHAT или SEND?
set quiet-reject 1

# [0/1] отвечать на CTCP в нижнем регистре (несовместимо с RFC).
# mIRC будет обрабатывать это, другие клиенты НЕТ.
set lowercase-ctcp 0

# сколько выдавать CTCP-ответов за один раз?
set answer-ctcp 3

# свыше скольки приватных сообщений за сколько секунд от одного хоста
# считать флудом? "0" отключает.
set flood-msg 60:60

# свыше скольки CTCP-запросов за сколько секунд считать флудом?
# "0" отключает.
set flood-ctcp 3:60

# [0/1] если все указанные сервера не отвечают, продолжать попытки
# на них зайти?
set never-give-up 1

# [0/1] списки серверов.
# 0: бот будет хранить вызываемые сервера в отдельном списке,
#     не затрагивая те, что были занесены через конфиг.
# 1: бот будет заменять главный список серверов теми, что вызываются
#     в ходе работы.
set strict-servernames 0

# пауза (в секундах) сколько ждать между пересоединениями (0 = не ждать).
# полезно чтобы не случилось "throttling" на серверах undernet'a.
set server-cycle-wait 20

# время ожидания ответа (в секундах) от сервера, перед началом попыток
# зайти через другой сервер.
set server-timeout 60

# если количество серверов в сети становится меньше указанного значения,
# попытаться зайти через следующий сервер. "0" отключает.
# нужно для ухода с отсплитившихся серверов.
# многие сети используют TS или ND сейчас и поэтому эта опция не особенно
# нужна.
set servlimit 0

# [0/1] проверять сервера на "жизнеспособность". при установке 1 - бот в
# случае отсутствия ответа от сервера в течение продолжительного периода
# времени, "прыгнет" на другой, считая этот умершим.
set check-stoned 1

# [0/1] включить вывод debug-информации приходящей ОТ сервера?
# для просмотра установите консольный флаг "r".
# внимание! это большая "дыра", так как позволяет видеть пароли присылаемые
# боту от сервера. доступно только для пользователей с +n.
set use-console-r 0

# [0/1] включить вывод debug-информации посылаемой НА сервер?
# для просмотра используйте флаг консоли и логов "v".
# флаг "t" позволяет просматривать botnet-траффик.
# внимание! это большая "дыра", так как позволяет видеть пароли посылаемые
# на сервер. доступно только для пользователей с +n.
set debug-output 0

# [0/1] закрывать бота, если от сервера поступает сообщение о форсированном
# отключении клиента, например по команде quit, kill, kline...
set serverror-quit 1

# максимальное количество строк в очереди на сервер.
set max-queue-msg 300

# [0/1] отрабатывать триггеры для игнорируемых пользователей?
set trigger-on-ignore 1

# [0/1] разрешить дубли в очередях?
set double-mode 0
set double-server 0
set double-help 0

# [0/1/2] оптимизировать кики?
# 0: не отпимизировать, просто кикать
# 1: да. подбирать очередь и выводить туда кик
# 2: да. отслеживать ники и не кикать отсутствующие
# внимание: значение 2 требует много CPU времени.
set optimize-kicks 1

#### SERVER МОДУЛЬ - net-type 5 спец.настройки (прочие сети) ####

# [0/1] некоторые сети используют режим +r подразумевающий ограниченное
# соединение. чтобы бот не оставался на таких серверах и "прыгал" на
# другие - установите 1.
# автоматически ставится 0, если установленный тип IRC-сети: 0/2/3/4.
# автоматически ставится 1, если установленный тип IRC-сети: 1.
# используйте только с типом IRC-сети 5!
# set check-mode-r 1

# максимальная длина ников. большинство сетей поддерживают только 9.
# максимальное значение поддерживаемое ботом это 32.
set nick-len 32

#### CTCP МОДУЛЬ ####

# модуль предоставляет поддержку CTCP ответов (рекомендуется).
loadmodule ctcp

# вы можете настроить следующие переменные:
# ctcp-version, ctcp-finger и ctcp-userinfo

# [0/1/2] методы обработки CTCP-запросов:
# 0: обычно.
# 1: бот будет игнорировать все CTCP-запросы, кроме CTCP CHAT и PING от
#    пользователей с флагом +o и выше.
# 2: бот не будет отвечать более чем на "C" запросов в "S" секунд.
#    данные значения устанавливаются в flood-ctcp C:S (см. server модуль)
set ctcp-mode 0

#### IRC МОДУЛЬ ####

# модуль предоствляет доступ к стандартным IRC-операциям.
loadmodule irc

# [0/1] отклонение банов, устанавливаемых кем-либо кроме операторов канала
# (например, серверами или пользователями извне канала). актуально
# только для серверов, неиспользующих TS/ND (систему защиты от сплитов).
set bounce-bans 1

# [0/1] отклонение режимов, устанавливаемых кем-либо кроме операторов канала
# (например, серверами или пользователями извне канала). актуально
# только для серверов, неиспользующих TS/ND (систему защиты от сплитов).
set bounce-modes 0

# максимальное количество банов. при большем количестве, бот просто не будет
# пытаться установить еще. ircnet поддерживает до 30 банов, efnet 20,
# dalnet 100.
set max-bans 100

# максимальное количество режимов +b/+e/+I. ircd 2.10 поддерживает до 30.
set max-modes 100

# [0/1] кикать пользователей посылающих в канал лавину контрольных кодов и
# ctcp-запросов? (может привести к кик-флуду)
set kick-fun 0

# [0/1] банить пользователей посылающих в канал лавину контрольных кодов и
# ctcp-запросов? (кик-флуда уже не будет, но может быть большой бан-лист)
set ban-fun 0

# [0/1] начинать "обучение" пользователей после команды "hello"?
set learn-users 0

# время (в секундах) ожидания возвращения пользователей из сплита.
set wait-split 600

# время (в секундах) для перепоказа приветствия.
# если пользователь вышел и затем вошел в канал через меньшее количество
# времени, то приветствие не будет отображено.
set wait-info 180

# максимальный размер (в байтах) строки аргументов посылаемых с командой mode
# серверу. обычный лимит сервера составляет 200 байт.
set mode-buf-length 200

# некоторые IRCop ищут ботов задавая им вопрос "hello".
# обычно бот отвечает на такой запрос, чтобы этого не происходило
# раскомментируйте следующие две строки и замените "myword" на любое другое
# слово, которое заменит вам "hello"
# unbind msg - hello *msg:hello
# bind msg - myword *msg:hello

# некоторые takeover'ы посылают боту команды /msg ident
# закомментировав следующие строки, избавим себя от этого
# но тем самым и не дадим нормально работать "хорошим" пользователям
unbind msg - ident *msg:ident
unbind msg - addhost *msg:addhost

# для того чтобы дать нормально работать "хорошим" пользователям с ident
# создадим ему замену. раскомментируйте строку и замените "myidentword"
# bind msg - myidentword *msg:ident

# [0/1] с помощью этого параметра можно ограничить пользователей лишь одной,
# глобальной строкой описания, которая будет использоваться в качестве
# приветсвия при заходе на любой канал. рекоммендуется не изменять, тем самым
# дав пользователям возможность указывать приветствия (или их отсутствие)
# для каждого канала в отдельности.
set no-chanrec-info 0

#### IRC МОДУЛЬ - net-type 1 спец.настройки (IRCnet) ####

# не настраивайте этот раздел, если ваш бот не в сети типа IRCnet!

# [0/1] отклонение исключений, устанавливаемых кем-либо кроме операторов
# канала (например, серверами или пользователями извне канала). актуально
# только для серверов, неиспользующих TS/ND (систему защиты от сплитов).
set bounce-exempts 1

# [0/1] отклонение приглашений, устанавливаемых кем-либо кроме операторов
# канала (например, серверами или пользователями извне канала). актуально
# только для серверов, неиспользующих TS/ND (систему защиты от сплитов).
set bounce-invites 0

# максимальное количество исключений на канале.
# Только ircd версии 2.10 поддерживает +e режимы.
set max-exempts 100

# максимальное количество приглашений на канале.
# Только ircd версии 2.10 поддерживает +I режимы.
set max-invites 100

# по-умолчанию использование +e и +I режимой разрешено для IRCnet и EFnet,
# и запрещено для всех остальных.
# [0/1] разрешить использовать исключения?
set use-exempts 1

# [0/1] разрешить использовать приглашения?
set use-invites 0

# [0/1] управление смешиванием +I/+e и остальных параматров команды MODE.
# на момент появления параметров +I/+e, их смешивание с другими не допускалось
# с целью обеспечения обратной совместимости со старыми версиями серверов.
# однако большинтсво серверов, поддерживающих исключения
# для инвайт-/бан-листов, за исключением канонического ircd2.x, допускают
# смешивание для более оптимального использования ресурсов.
# Проверьте возможности используемого сервера, перед изменением этого параметра.
set prevent-mixing 1

#### IRC МОДУЛЬ - net-type 5 спец.настройки (прочие сети) ####

# кик-метод задает как кикать (при enforce-bans):
#    0 = кикать все ники одной командой
#    X = кикать X пользователей за один раз
# автоматические установки для net-type:
#  net-type 0, 2, 3 и 4 устанавливается в 1
#  net-type 1 устанавливается в 4
# при использовании net-type 5, вы можете настраивать как хотите
set kick-method 1

# некоторые типы irc-серверов позволяют передавать им команды изменений
# канальных режимов (modes) одной строкой сразу несколько переключений.
# гарантия дана на 3 режима за один раз, но многие поддерживают и больше.
# автоматические установки для net-type:
# 4 для net-type 0 или 4
# 3 для net-type 1
# 6 для net-type 2 или 3
# используйте настройку только при работе в net-type 5
set modes-per-line 6

# [0/1] не все irc-сервера позволяют передавать режимы +l и +k одной строкой.
# вы можете указать, разрешить их передачу вместе с другими или слать отдельно.
# автоматические установки для net-type:
# 1 для net-type 1/2/3
# 0 для net-type 0/4
# используйте настройку только при работе в net-type 5
set include-lk 1

# [0/1] использовать специальные /who запросы поддерживаемые ircu2.10.01
# автоматически выбирается 0 для net-type 0/1/3/4, 1 для net-type 2.
# используйте это только при работе в net-type 5
#set use-354 0

# [0/1] соответствовать rfc-1459?
# сервера на исходном коде DALnet, нарушают стандарт IRC (RFC1459), различая
# фигурные и квадратные скобки, которые в финском языке используются как буквы.
# сервера, не основанные на DALnet, считают их одним символом,
# что соответствует стандарту.
set rfc-compliant 0


# модуль поддержки dcc send/get, а также обмена общим файлом пользователей.
#loadmodule transfer

#### настройки:
# максимальное количество одновременных скачиваний для одного пользователя.
set max-dloads 3

# размер блока для передачи через dcc (ircII использует 512 байт, но на
# сегодня нормой считается 1024 байт).
# установите "0" для использования turbo-dcc (рекомендуется)
set dcc-block 0

# [0/1] копировать файл в /tmp перед отсылкой?
# возможная ситуация, что кто-то скачивает файл с бота, а в это время админ
# удаляет или переименовывает его и передача прерывается.
set copy-to-tmp 1

# время ожидания (в секундах) продолжения передачи файла, если по какой-либо
# причине он перестал передаваться.
set xfer-timeout 30

#### SHARE МОДУЛЬ ####

# модуль предоставляет поддержку общего файла пользователей путем обмена им
# через ботнет. (также требуются модули: channels и transfer)
#loadmodule share

#### настройки:
# [0/1] если между ботами была прервана связь, восстанавливать ли после
# их воссоединения в общий файл пользователей все изменения, которые были
# сделаны на обоих ботах во время отсутствия связи?
#set allow-resync 0

# "время жизни" данных с другого бота перед их очередным обновлением.
#set resync-time 900

# [0/1] при обмене файлом пользователей не принимать изменения в глобальных
# флагах? бот по прежнему будет слать изменения сделанные на нем, но не будет
# принимать их от других ботов.
#set private-global 0

# во время обмена файлом пользователей, если опция private-global не
# установлена, то какие глобальные флаги игнорировать при их изменениях?
#set private-globals "mnot"

# [0/1] при обмене файлом пользователей не принимать вообще никаких изменений
# с других ботов? данный режим будет игнорировать все +host/+user/chpass и
# прочие изменения сделанные на хабе.
#set private-user 0

# [0/1] разрешить перезаписывать локальные данные и флаги ботов новыми,
# пришедшими от хаба. будет работать только, если хабы на базе eggdrop
# версий 1.5.1 и выше.
#set override-bots 0


# модуль предоставляет функцию сжатия данных.
# полезен для ботов, которые обмениваются общими файлом пользователей.
#loadmodule compress

# [0/1] сжимать файл пользователей перед обменом?
set share-compressed 1

# [0-9] уровень сжатия (0 мин. - 9 макс.)
set compress-level 9


# модуль позволяет открыть файловое пространство для пользователей.
#loadmodule filesys

# корневая директория файлового пространства (установите "", если не хотите
# открывать файловое пространство).
set files-path "filesys/"

# если ваше файловое пространство подразумевает возможность закачки на него
# файлов, то укажите директорию куда складывать "входящие" файлы.
set incoming-path "filesys/incoming/"

# [0/1] разрешить закачивать файлы в текущую директорию, где в данный момент
# находится пользователь?
set upload-to-pwd 0

# бот создает файл ".filedb" в каждой директории файлового пространства
# для хранения в нем системной информации. вы можете указать один путь, где
# хранить эти файлы вместо того, чтобы они были в каждой директории.
# установка "" включает храниение в каждой директории своего файла.
set filedb-path ""

# максимальное количество пользователей, которые могут пользоваться
# файловым пространством в один момент.
# установка числа "0" будет означать без лимита.
set max-file-users 20

# максимальный размер файла, который бот будет принимать.
# размер в килобайтах. по умолчанию это 1024K, то есть 1M.
# установка числа "0" будет означать без лимита.
set max-filesize 1024

#### NOTES МОДУЛЬ ####

# модуль позволяет оставлять сообщения для пользователей.
# поддержка прямых сообщений user->user встроена и не требует модуля.
loadmodule notes

# файл, где будут храниться сообщения.
set notefile "LamestBot.notes"

# максимальное количество сообщений одновременно хранящихся для одного
# пользователя (для предотвращения флуда).
set max-notes 50

# время хранения сообщения в базе (в днях).
set note-life 60

# [0/1] позволять пользователям перенаправлять сообщения на других ботов?
set allow-fwd 0

# [0/1] уведомлять каждый час пользователей, что для них есть сообщения?
set notify-users 1

# [0/1] уведомлять пользователей во время входа в канал о том, что для них
# есть сообщения?
set notify-onjoin 1

# закомментируйте эту строку, иначе бот не запустится.
#die "You didn't edit your config file completely like you were told, did you?"


# модуль дает возможность сохранять настройки вашей консоли на боте,
# когда вы уходите с него (автоматически или через .store)
loadmodule console

#### настройки:
# [0/1] сохранять настройки консоли автоматически? (иначе используйте .store)
set console-autosave 1

# [0-99999] если пользователь не имеет сохраненных настроек, к какому каналу
# их подключить?
set force-channel 0

# [0/1] отображать персональную строку приветствия при входе и в ботнет?
set info-party 0


# модуль создан только для демонстративных целей.
# использовать его не имеет смысла.
#loadmodule woobie

#### SEEN МОДУЛЬ ####

# модуль предоставляет доступ к команде seen через msg, dcc и pub.
# раскомментируйте для использования.
#loadmodule seen


# выберите метод шифрования. на данный момент доступен только: blowfish
# раскомментируйте строку для проверки модуля иначе бот даже не запустится.
# это сделано для того чтобы вы все-таки прошлись по конфигурационному файлу.
loadmodule blowfish

#### ASSOC МОДУЛЬ ####

# модуль позволяет давать имена внутренним каналам на патилайн.
# раскомментируйте для использования.
#loadmodule assoc

#### WIRE МОДУЛЬ ####

# модуль позволяет использовать шифрованный канал .wire через dcc.
# совместим с wire.tcl
# раскомментируйте для использования.
#loadmodule wire


# модуль сбора статистики самых "долгоиграющих" ботов.
# списки на сайте
# обычно бот там появляется после 9 часов
loadmodule uptime

#### СКРИПТЫ ####

# это обычные и необходимые для работы скрипты.
source scripts/alltools.tcl
source scripts/action.fix.tcl

# данный скрипт нужен для совместимости со старыми скриптами.
source scripts/compat.tcl

# этот скрипт позволяет приписывать к пользователям в userfile
# дополнительную информацию, например: url, email, birthday и т.д.
source scripts/userinfo.tcl

# Чтобы бот не вылетал при запуске/перезапуске, в случае если есть ошибки
# в скриптах, необходимо поместить их запуск между следущими фигурными скобками
# Пример (для использования необходимо раскомментировать):
#utimer 1 {
#source scripts/ваш_скрипт.tcl

Как исправить кривые кодировки Eggdrop & Windrop


Данная статья была написана по причине большого количества ошибок связанных с кодировками бота. А точнее получается ситуация которую можно описать примерно так: кто то начинает писать скрипт; опыта у него нету и в большинстве случаев устранение каких то ошибок, связанных с кодировками, идет методом подбора; написав для себя успешно и не задумываясь о том что данный скрипт будет работать на других ботах выкладывают на общее пользование. А тут ещё и не совсем корректная работа не патченного бота с кодировками. И свалив все вместе (бота, всевозможные скрипты, операционную систему) получаем случайную машину, которую настроить на правильную работу при большом количестве скриптов будет очень проблематично.

Ещё хуже это скрипты ориентированные на библиотеку egglib_pub. Почему? Да потому что неправильная работа бота используется для получения правильного результата, что отводит от стандарта и усложняет, как ни странно, работу скриптов.

Начнем с выбора кодировки, под которой будет работать бот. Для России основная кодировка это cp1251 или же для ОС семейства Windows Win1251, такая же кодировка, в большинстве случаев, используется для передачи данных между IRC сервером и клиентом (в нашем случае ботом) при этом используется порт 6667 (для WeNet).

При заходе на сервер мы можем получить сообщение от сервера, в котором данные кодировки расписаны:
Например для сети WeNet:
- 6667: CP1251 6669: KOI8-F 6671: CP866
- 6668: Translit 6670: KOI8-R 6672: ISO8859-5

Или для RusNet:
- 6666: KOI8-U 7770: KOI8-R 7774: Macintosh
- 6667: KOI8-R 7771: CP1251 7775: Translit
- 6668: Translit 7772: CP866 7776: KOI8-U
- 6669: CP1251 7773: ISO-8859_5 7777: MacRoman

Ко всему прочему большая часть скриптов написана опять же в кодировке cp1251, поэтому лучший вариант использовать её во всех местах:
- ядро бота (локаль+интерпретатор);
- скрипты;
- порт коннекта к серверу.

Теперь рассмотрим проблемы, которые могут повлечь некорректную работу как отдельного скрипта, так и работу всего бота.

1) Самое важное это использование не патченного бота, в котором допущено много ошибок связанных с кодировками. Для не патченного бота характерны перечисленные ситуации: невозможность использование русского ника у бота; некорректное использование встроенных функций работы с юзер листом (.chhandle и др.); моментальное покидание канала после захода, в случае если в имени канал есть русские буквы, некорректное поведение функций tcl при работе со строками в которых содержаться русские буквы. Решение: установка патченного бота.

2) Скрипты имеющие строку encoding system ххх (на текущий момент антиматы и игра в слова). Данная команда меняет системную кодировку бота, что неправильно с точки зрения построения скрипты, если кому, то нужно в какой, то исключительной ситуации поменять системную кодировку бота то он знает, где это и как делается, но ни как не должен этого делать скрипт. Так же данная строка может быть в конфигурационном файле бота. Нам изменение кодировки работы ядра бота не пригодиться, поэтому и данной строки недолжно быть. Решение: закомментировать, либо убрать вообще, данные строки из скриптов и конфигурационного файла.

3) Неправильное использование функций [encoding convertto xxx yyy], [encoding convertfrom xxx yyy]. Под неправильным использованием я понимаю как выбор неправильной кодировки, так и избыточное и недостающее использование функции. Пример избыточного использования скрипты (rss, викторины) в которых полученные данные конвертируются сначала из кодировки страницы, а затем в системную кодировку, либо просто сразу в системную кодировку. В случае недостающего использования перекодировка данных вообще отсутствует. Так же встречаются но в меньшей степени ситуации, где неправильно указана кодировка. Решение: в случае избыточного использования необходимо закомментировать или убрать строку, в которой идет переконвертация; в случае недостающего использования необходимо добавить строку, которая бы переконвертировала данные из нужной кодировки; если выбрана неправильная кодировка, то необходимо только указать правильную.

4) Запуск бота не в той кодировки. Для патченного бота Windrop это не актуально, так как патчь содержит изменение, которое позволяет определять кодировку операционной системы по умолчанию и запускать под ней, рассматривать запуск не патченного бота под Windows я рассматривать не буду. Теперь что же касается юникс систем. Поскольку локаль пользователя, под которым запускается бот, обычно не та которая нужна боту то соответственно и бот будет работать не в правильной кодировки. Но мало кому известно, что запустить приложение, под нужной локалью, можно без изменения локали пользователя. Решение: запуск бота командой LANG=ru_RU.CP1251 LC_TIME=en_US ./eggdrop, при этом не стоит забывать о том, чтобы данные кодировки вообще были установлены в системе (cd /usr/lib/locale && localedef -i ./ru_RU -f CP1251 ./ru_RU.cp1251).