Об IRC. Доступно и со вкусом.

Учимся работать с циклами и идентификатором $read

В этой статье мы научимся работать с азами написания скриптов с использованием циклов.
В старых версиях mIRC использование циклов было большим и громоздким, т.к. отсутствовало самое понятие цикла и их приходилось делать через метки. Вот простейший пример из хелпа mIRC:
listops {
echo 4 * Listing Ops on #
set %i 1
:next
set %nick $nick(#,%i)
if %nick == $null goto done
if %nick isop # echo 3 %nick is an Op!
inc %i
goto next
:done
echo 4 * End of Ops list
}
Скрипт выглядит довольно громоздко. После того как автор mIRC`а ввел использование такого оператора циклов как while, все стало намного проще (если бы он ввел какой-нибудь оператор типа for, все было бы ещо проще ;).
Итак во что превратится наш скрипт используя while:
listops {
echo 4 * Listing Ops on #
; создаем переменную
var %i = 1
; запускаем цикл, пока %i меньше или равно числу юзеров на канале выполняем цикл
while (%i <= $nick(#,0)) {
; если i-ый ник является опом, тогда сообщаем об этом
if ($nick(#,%i) isop #) echo 3 $nick(#,%i) is an Op!
; увеливаем счетчик цикла на единичку
inc %i
}
; цикл закончен сообщаем об этом
echo 4 * End of Ops list
}

Как видите, все стало намного меньше, а значит и более читаемо, да и ошибок меньше можно где допустить.

Теперь рассмотрим работу такого идентификатора как $read. Описание его флагов будет лишь бессмысленой тафтологией хелп файла, просто напиши /help $read и почитайте описание всех флагов с небольшими примерчиками и все сразу станет понятным.
Мы же приступим сразу к практике. Допустим у нас есть *.txt файл со следкщим содержанием:
Pupkin:156789
Vasya:45672
Pupok:15644
Иными словами, содержится txt файл со списком каких-то данных, допустим у нас это будет ирк ник:пароль от ника. Конешно, с такими данными лучше и удобнее работать в ini файлах, но для тренировки и понимания мы будем использовать txt.
Итак, допустим при смене ника, мы хотим, чтобы наш скрипт искал в нашем txt файлике наличие данного ника и если находит автоматически идентифицировался.
Ну-с приступим, создадим файлик nicks.txt и скопируем туда данные рассмотреные выше, т.е. ник:пароль и начнем кодить:

on *:NICK: {
; создаем переменную, куда запоминаем смененный ник, и вторую переменную для цикла
var %nick.id = $newnick, %i =1
; запускаем цикл, пока %i меньше либо равно строк в нашем txt файлике с никами выполняется цикл
while (%i <= $lines(nicks.txt)) {
; если первое слово, взятое из i-ой строчки txt файла с разделителем ":"(ascii код 58) равно смененному нику, то идентифицируемся к никсерверу(ну там или сами напишите к чему) со втором словом, взятым из i-ой строчки и прерываем выполнение цикла
if ($gettok($read(nicks.txt,%i),1,58) == %nick.id) { .msg nickserv identify $gettok($read(nicks.txt,%i),2,58) | break }
; увеличиваем счетчик цикла на единицу
inc %i
}
}

Конешно хранить свои пароли в txt файлике не совсем безопасно или хотя бы сделать какое-нибудь простенькое кодирование. В данном скрипте также были задеты токены, кто не умеет ими пользоваться прочитайте мою статью "Учимся работать с токенами в мирк". Надеюсь данный скрипт будет работать, т.к. я писал его прямо тут ;), если найдете будут ошибки постарайтесь поднапрячь мозги и найти их сами, я думаю это будет тренировка для вас.

На этом я думаю пока все. Удачи всем.