• На проекте открылась регистрация только для продавцов. Для обычных пользователей будет открыта позже. Подробнее.
    P.S. Не надо скидывать ссылки на форумы, где у вас ноль сообщений. Подобные заявки будут отклонятся.

Скриптинг Скриптописание (mIRC-скриптинг)

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
Статьи для начинающих:
Скриптописание. Азы
Описание: Порой, так сложно взяться за изучение какого-либо языка программирования. mIRC скриптнг не исключение. Данная статья расскажет о первых шагах в мирк скриптинге, на наглядных примерах продемонстрирует удобство использования скриптов и простоту их написания!
------------------------------------------------------------------------------------------------


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



Чтобы начать изучение mIRC скриптописания ты должен достаточно хорошо знать IRC команды. Если ты их знаешь не достаточно хорошо, то в процессе обучения скриптописанию узнаешь побольше и о командах. Ну а теперь к делу!



Писать скрипты можно с помощью любого текстового редактора, в том числе и блокнота, но лучше использовать встроенный в mIRC редактор скриптов. Вызвать его можно, нажав сочетание клавишь Alt+R. Посмотрим на него. Сверху меню: Файл, Правка, ..., Справка. Ниже пять вкладок: Алиасы (Aliases), Менюшки (Popups), Скрипты (Remotes), Юзеры (Users), Переменные (Variables). Ниже окно для ввода/редактирования текста/кода. Ещё ниже что-то похожее на строку состояния. Ну и в самом низу три кнопки: Ок (OK), Отмена (Cancel), Помощь (Help).


Кстати, советую использовать именно русский mIRC, ибо не за чем усложнять себе жизнь, так как интерфейс программы на работоспособность скриптов и mIRC'а не влияет.

Примечание: дальше в статье к Вам я буду обращаться на "ты" в мужском роде. Если ты девушка, то воспринимай суффикс "л", как "ла" :)

--------------------------------------------------------------------------------

Алиасы

Начнём с Алиасов. Это самая первая вкладка.

Алиасы - это созданные пользователем команды для ускорения работы и упрощения часто повторяющихся действий.

Допустим, что каждый раз при подключении к серверу ты заходишь на канал #All. Для этого ты должен ввести целых десять символов "/join #All". Не надоедает?

И тут Алиасы приходят на помощь. Пропишем в Алиасах вот это:

/1 join #All

И нажмём Ок. В данном случае: "1" - имя новой команды, "join #All" - действие, которое должен совершить mIRC при вводе этой самой команды "1". Попробуй ввести /1 и нажать Энтер и ты попадёшь на канал #All. Удобно, не так ли? :)

А может тебе надо зайти сразу на несколько каналов, например на три сразу? На #a, #b и #c.

Пропиши это в алиасах:

/j {

join #a

join #b

join #c }

Зачем нужны скобочки? Затем, что у нас больше одной команды, целых три. Скобочки говорят mIRC'у, где начинается и заканчивается действие, которое должно быть выполнено при вводе команды /j.

Когды ты вводишь в эдитбоксе (строке ввода текста) /j, твой mIRC автоматически заходит на три канала, #a, #b и #c.

Ещё ппример:

/jj {

join #All

msg #All Привет всем! }

При вводе /jj mIRC зайдёт на канал #All и напечатает там Привет всем! От твоего имени конечно же :)

И напоследок:

/r nickserv identify $?"Введи пароль"

Это пример идентификации ника. При вводе команды /r вылетит окно, где будет написано "Введи пароль". Если введёшь - твой пароль отправится никсерву, если щёлкнешь Отмену или оставишь пустым - выполнение алиаса прекратится. $? - позволяет нам вызвать окошко, куда надо что-либо вводить.

Это не предел возможностей алиасов, но для начинающего пока что хватит. Азы написания алиасов у тебя есть!



--------------------------------------------------------------------------------

Менюшки


Менюшки (Popus) - это вторая вкладка. Здесь мы можем написать собственное меню. До пяти меню нам предлагает написать автор mIRC'a (перейди на вкладку Менюшки и посмотри меню "Вид"). А именно: меню Статуса, меню Канала, меню Привата, меню Списка ников и меню в Главном меню mIRC'a.

Поработаем с менюшкой окна Статуса.

Введём туда:

Зайти на #All: join #All

Выйти c #All: part #All

Сначала идёт название пункта меню, затем двоеточие (всегда), затем команда. Двоеточие даёт понять mIRC'у, что справа находится название, а слева сама команда.

Нажми ОК, перейди в окно статуса и нажми правую кнопку мыши. О чудо! :) Появилось меню из 2ух пунктов, которое ты сделал сам только что! Нажми на первый пункт и ты попадёшь на канал #All, затем на второй и ты выйдешь с этого канала.

В Менюшках между пунктами можно поставить знак "-". Это сепаратор, то есть разграничительная черта между пунктами.

Зайти на #All: join #All

-

Выйти c #All: part #All

Менюшки могут взаимодействовать с алиасами:

В менюшках прописываем:

Избранное: j
И жмём Ок.

А в Алиасах должны присутствовать строки, если ты не стёр:

/j {

join #a

join #b

join #c }

Теперь при нажатии в меню Статуса на пункт "Избранное" ты попадёшь на три канала, а,b и с.



Идею уловили? Поэкспериментируйте, создайте небольшое, но своё меню канала, привата :)



--------------------------------------------------------------------------------

Скрипты (Remote)


В скриптах обраватываются какие-либо события происходящие на IRC. Например, когда кто-нибудь зашёл - это событие, за него отвечает обработчик "JOIN", когда кто-нибудь вышел с IRC - это тоже событие, за него отвечает обработчик "QUIT". Обработчиков очень много, подробнее читай в хелпе к мирку (скачать можно в раздеое "IRC Софт")

Приведу пару примеров (а точнее всего 1), а остальное в хелпе по мирку.

Пример 1: пропиши это в "скриптах"(Remote):

on *:JOIN:#:msg $chan Привет $nick

Разберёмся по порядку. on - означает, что это обработчик (on употребляется со всеми обработчиками кроме ctcp и raw); * - означает, что обработчик будет работать не смотря на уровень пользователя; JOIN - сам обработчик, обрабатывающий всех, кто входит на канал; # - означает, что обработчик сработает на любом канале, где ты находишься; "msg $chan Привет $nick" - команда, которая выполнится, когда любой пользователь (так как *) зайдёт на любой канал (так как #) на котором ты сидишь.

$chan и $nick - это идентификаторы, $chan - это канал на котором сработал обработчик, $nick - это ник пользователя из-за которого сработал обработчик.

Не буду здесь расписывать что и как, так как всё чётко и доходчиво написано в справочном материале, который можно скачать в разделе "IRC Софт"



--------------------------------------------------------------------------------

Переменные


При более детальном изучении скриптов тебе придётся столкнуться с переменнымa.

Создать переменную можно командой /set.

Например: /set %my computer

Где %my - имя переменной (всегда начинается с "%"), а computer - значение переменной.

Ну и примерчик для закрепления: создадим две переменных, для этого перейдём к пятой вкладке "Переменные" и в одной строчке напишем "%1 кошка", а в другой "%2 собака" (естественно без кавычек). Жмём ОК.
Либо создадим, путём ввода
/set %1 кошка и /set %2 собака.

Теперь на канале в строке ввода текста (эдитбоксе) введём:

//say %1 это не %2 $+ , так как %2 гавкает, а %1 мяукает

Идентификатор $+ позволяет склеивать текст, в данном случае переменную (а точнее её значение) с запятой.
Источник: bestirc.ru
Автор: yXo
Использование $submenu
Описание: В данной статье мы рассмотрим создание всплывающих меню с помощью идентификатора $submenu.
------------------------------------------------------------------------------------------------

Использование $submenu

Введение
$submenu это идентификатор, появившийся в mIRC 6.0, помощь по mIRC описывает его так:
$submenu($id($1)) - это идентификатор, позволяющий вам динамически создавать пункты меню, и может быть вызван только из popup меню.
Идентификатор вызывает $id($1), где $id() это название вашего идентификатора, и где $1 = 1, и возрастает на 1 с каждым вызовом, дополняя своим содержанием $id() popup менюху.
Значение, которое возвращает $id()должно быть однострочным, как и в popup меню.
Операция прерывается, когда идентификатор $id() не возвращает ничего.
menu status {
Animal
.$submenu($animal($1))
}

alias animal {
if ($1 == begin) return -
if ($1 == 1) return Cow:echo Cow
if ($1 == 2) return Llama:echo Llama
if ($1 == 3) return Emu:echo Emu
if ($1 == end) return -
}
Значения begin и end заключаются в разделители.
Примечание: Вы не сможете создавать вложенные меню, данный идентификатор строит только одно меню.

Еще примеры
К несчастью, в помощи к mIRC дан только один пример этого очень нужного идентификатора.
Сейчас попытаемся понять его работу более глубоко на примерах. Итак начнем:
Сначало создадим следующий алиас:
alias _partchan {
if ($1 == begin) return -
if ($chan($1) ischan) return $ifmatch :part $ifmatch
}
Если не поняли его работу, то введите //echo -a $_partchan(1) и покажет первый из всего списка каналов на которых вы сидите, ввиде: #bestirc :part #bestirc
На первый взгляд ничего полезного в этом нет, но используя наш идентификатор $submenu мы сделаем из этого конфетку.
Вставляем в Popups, раздел Канал следующее:
Покинуть
.Все каналы:partall
.$submenu($_partchan($1))
И смотрим, что получилось, mIRC вставляет все каналы на которых вы сидите в popup меню. Раньше бы пришлось писать что-нибудь такое:
Покинуть
.Все каналы:partall
.-
.$chan(1):part $chan(1)
.$chan(2):part $chan(2)
; и т.д.
С использованием идентификатора $submenu, работать с popup стало намного проще и легче.

Продвинутые примеры
Еще один хороший пример использования $submenu – это когда у вас есть список элементов. Допустим у вас есть переменная %variable, содержащая список каналов. Например %recent.channels #mirc,#bestirc,#irchelp,#mircscripts,#help
Создаем такой алиас:
alias _recentchan {
if ($gettok(%recent.channels,$1,44)) return $ifmatch :join $ifmatch
}
И вставляем следующее в Popups:
Мои каналы
.$submenu($_recentchan($1))
И смотрим результат..

И еще несколько примеров
Еще одной отличительной особенностью $submenu является его поддержка других идентификаторов. Сейчас рассмотрим еще один интересный пример возможностей $submenu. Допустим у вас три переменные: одна – под любимые каналы, другая – под любимые ники, третья – под любимые ники:
%recent.join #mirc,#help,#irchelp,#mircscripts,#bestirc
%recent.server irc.dalnet.ru,irc.bestirc.ru,irc.dogma.net, irc.ru
%recent.nick yXo,yXu,yXa,yxactuk
Сейчас вы увидите, что даже название переменных создано с умыслом.
Создаем такой алиас:
alias _recent {
if ($gettok($($+(%,recent.,$2),2),$1,44)) return $ifmatch : $2 $ifmatch
}
Разберем скрипт по кусочкам:
$+(%,recent.,$2) – создаст переменную вида %recent.$2
Если значение $2 будет join, он создаст переменную %recent.join и т.д.
$(%recent.join,2) – это тоже самое, что использование идентификатора $eval. Таким образом, если у нас была переменная %recent.join, то использование данной конструкции вернет значение этой переменной (#help,#bestirc.. и т.д.).
А $gettok я думаю не нуждается в пояснениях, также как и $ifmatch.
Причина по которой мы назвали так наши идентификаторы, это чтобы удобнее было работать с ними в $_recent identifier.
Но вернемся к нашему скрипту, вставляем это в Popups:
Любимые
.Серваки
..$submenu($_recent($1,server))
.Каналы
..$submenu($_recent($1,join))
.Ники
..$submenu($_recent($1,nick))

И тестим, что мы получили ;)

А сейчас поработает с идентификаторами и переменными внутри $submenu. Если вы умеете динамически создавать и изменять вашим popups, используя команду /write, то скорей всего вы уже знакомы с такими конструкциями как $!identifiers и % $+ variables.
Для тех, кто не знает, они предназначены для записи в popup файлы не значения идентификатора $identifiers, а его самого, т.е. слово '$identifiers'. Тоже самое и для переменных %variables.
Как это все применимо для $submenu?
Сейчас увидим на простом примере. Пишем алиас:
alias _part {
if ($chan($1) ischan) return $ifmatch : part $ifmatch $!input(Введите сообщение,1,Part)
}
Заметьте, я использовал $!input вместо $input. Это не даст mIRC интерпритировать значение идентификатора $input при создании подменю (или значения popup).
Тоже самое и для переменных, если вы не хотите, чтобы переменная была обработана и считано ее значение, просто используем такую конструкцию % $+ variablename.
Вот еще один алиас для примера:
alias _rfpop {
var %c = $chan($1), %n = $gettok($3,1,33), %m = kick %c %n : $!+ $!input(Введите причину кика %n с %c ,1,Кик)
if ($2 == kb) %m = .raw mode %c +b $mask($gettok($3,2,33),2) $!+ $!lf $!+ %m
else %m = .raw %m
if ($1 isalpha) return -
if ($comchan(%n,$1).op) return %c : %m
if ($chan($1) ischan) return $!style(2) %c :return
}

Заключение
Надеюсь теперь, когда мы расширили свои познания в этом вопросе с помощью этих нескольких скриптов, у вас в голове созреет еще несколько идей использования данного идентификатора. Это не важно, используете ли вы переменные, ini файл, hash таблицы или просто текстовые файлы, идентификатор $submenu все равно может быть использован. Все, что вам понадобиться, это капелька выдумки и ваши скрипты превратятся действительно в произведения искусства.
 

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
Вот еще пару примеров:

Источник: bestirc.ru
Автор: yXo

Пишем несколько маленьких, но полезных скриптов.
Описание: В данной статье я расскажу как написать несколько необходимых и полезных скриптиков аля mIRC.
------------------------------------------------------------------------------------------------

Итак, начнем. Я думаю многие из вас видели в ирк как кто-либо написал абрукадабру типа ghbdtn dctv (привет всем), да и мы сами порой пишем подобное. А бывает пишешь длиииинную фразу, поднимаешь глаза и..опс все русские буквы на английском. Перепечатывать каждый раз ох как неохота. Именно для таких случаев мы и напишем маленький скриптик.

F5 editbox -a $replacecs($editbox($active),.,
ю,$chr(44),б,q,й,w,ц,e,у,r,к,t,е,y,н,u,г,i,ш,o,щ,
p,з,[,х,],ъ,a,ф,s,ы,d,в,f,а,g,п,h,р,j,о,k,л,l,д,;,
ж,\\\\\\\',э,z,я,x,ч,c,с,v,м,b,и,n,т,m,ь,.,ю,
Q,Й,W,Ц,E,У,R,К,T,Е,Y,Н,U,Г,I,Ш,O,Щ,P,З,
[,Х,A,Ф,S,Ы,D,В,F,А,G,П,H,Р,J,О,K,Л,L,Д,:,
Ж,\\\\\\\",Э,Z,Я,X,Ч,C,С,V,М,B,И,N,Т,<,Б,>,
Ю,&,?,^,:,/,.,`,ё,$,;)

F6 editbox -a $replacecs($editbox($active),.,/,?,&,:,^,б,
$chr(44),й,q,ц,w,у,e,к,r,
е,t,н,y,г,u,ш,i,щ,o,з,p,х,[,ъ,],ф,a,ы,s,в,d,а
,f,п,g,р,h,о,j,л,k,д,l,ж,;,э,\\\\\\\',я,z,ч,x,с,c,
м,v,и,b,т,n,ь,m,ю,.,Й,Q,Ц,W,У,E,К,R,Е,T,
Н,Y,Г,U,Ш,I,Щ,O,З,P,Ф,A,Ы,S,
В,D,А,F,П,G,Р,H,О,J,Л,K,Д,L,Ж,:,Э,\\\\\\\",Я,Z,Ч
,X,С,C,М,V,И,B,Т,N,Ь,M,Б,<,Ю,>)

Данные скриптики вставляем в раздел Алиасы(Aliases). То, что в скобках - одной строчкой. Для проверки пишем текст в эдитбоксе и нажимаем F5 или F6.
Готовый скрипт тут


А теперь второй не менее удобный скриптик-обращения. Многие из вас видели такое:
[20:29:46] .:yXo:.-> привет
[20:29:55] UserM »» привет
Хотите такое же? Тогда приступим. Жмем Alt+O -> Mouse(Мышь) -> Nicklist(Список ников) стираем /query $$1 и пишем туда mouse.nut, тыкаем Ок. Далее заходим опять же на вкладку Aliases(Алиасы) и пишем такой скриптик:

mouse.nut {
var %nut.text = $editbox($active), %nut.say = $snick(#,1) »»
if (%nut.text == %nut.say) { editbox -r # | query $snick(#,1) }
elseif (%nut.text) { msg # %nut.say %nut.text | editbox -af }
else editbox -apf %nut.say
}

Итак, начнем разбираться. Тыкаем по нику в никлисте два раза и он вставляется в эдитбокс, ввиде: yXo »» далее просто пишите текст, либо сначало пишите текст, а потом дважды кликаете по нику кому это адресовано, ник будет автоматически вставлен перед текстом. Если же кликнуть 4 раза подряд по одному нику, т.е. первый раз ник-обращения появится в эдитбоксе, при последущем двойном клике откроется приват.
А теперь разберем по кусочкам сам скриптик.
1 строчка - присваиваем переменной %nut.text текст из эдитбокса, а переменной %nut.say - ник из никлиста плюс финтифлюшка, можете изменять по вкусу и цвету ;)
2 строчка - проверяем, если текст в эдитбоксе равен нашей ранее присвоенной переменной %nut.say, то очищаем эдитбокс и открываем приват.
3 строчка - если эдитбокс уже содержит текст, то прибавляем ник-обращение в начало и кидаем на канал.
4 строчка - просто добавляем в эдитбокс обращение.

А готовый скрипт вы можете скачать тут
На этом пока всё, удачи.

Пишем защиту от разных видов флуда
Описание: Существует очень много видов флуда в irc. В данной статье мы рассмотрим как написать своими руками(безусловно в нашей любимой программе mIRC) защиту от некоторых видов.
------------------------------------------------------------------------------------------------

Кроме различных стандартных методов атаки на компьютер, в IRC существует еще несколько способов, одним из самых распространённых является вызывание переполнения (flood) сообщениями. Сейчас многие сервера, да и клиенты встраивают различные защиты, но они не всегда помогают, да и попрактиковатся в написании скриптов никогда не помешает.
Скрипты будут очень простыми, расчитанными в первую очередь для начинающих скриптописателей :)

Итак наш первый скрипт - защита от CTCP переполнения:
Вставляем в ремоуты/скрипты(Remote/Scripts), в разные версиях и переводах по разному этот раздел называется.

ctcp *:*:*: {
if (!%ctcps.flood) { set -u8 %ctcps.flood 1 }
else { inc %ctcps.flood }
if (%ctcps.flood > 3) {
.ignore -u60 $wildsite
echo -a >> Ctcp flood от $wildsite - игнорим на 60 сек...
}
}
Данный скрипт предотвратит flood, если вам будет послано свыше 3 ctcp запросов в течение 8 секунд, юзер пославший вам их будет заигнорен на 60 секунд.

Разберем скрипт по строчкам:
1 строчка - проверяем наличие перменной %ctcps.flood, если она не существует(символ !) мы создаем ее на 8 секунд и присваиваем значение 1.
2 строчка - если же наша переменная %ctcps.flood уже существует, увеличиваем ее на единицу.
3 строчка - проверка, если переменная %ctcps.flood больше 3, то..
4 строчка - то игнорим на 60 секунд
5 строчка - и выдаем сообщение о флуде в активное окно.

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

Данный скрипт имеет несколько недостатков, во-первых он не проверяет тип ctcpc запроса, например ping,version,finger,time или dcc. Данная пробема решается вставкой исключений if ($1 == PING)..
Во-вторых он не проверяет ник того, кто вас флудит и заигнорен будет последний, кто пошлет запрос. Для решения данной проблемы можно создавать переменную с ником флудящего set -u8 %ctcps.flood. [ $+ [ $wildsite ] ] 1
Ну собственно, данный скрипт и не притендует на лучший, это всего лишь пример, скелет самого скрипта, а остальное все в ваших руках ;)

А сейчас рассмотрим ещо один скриптик для защиты от query(приват) флуда.
Вставляем естественно в remote/ремоуты:
on *:open:?: {
; если открытых окон приват больше 5
if ($query(0) > 5) {
; добавляем в переменную на 10 секунд очередной приват флуда
set -u10 %query.fl %query.fl $nick
; ставим игнор на 60 секунд на все приваты
.ignore -pu60 *
; данный мод есть не на всех серверах, так что проверьте сами
mode $me +G
; сообщаем в активное окно
echo -a >> Query flood, игнорим все приваты на 45 секунд...
; закрываем все приваты флуда
close -m %query.fl
haltdef
}
}

В комментариях я постарался изложить всю работу скрипта. Кому, что не понятно излагайте в форуме.

На подобие нашего первого скрипта от ctcp флуда, можно написать защиту от notice, text и т.д.
На этом пока все, в следущей статье я расскажу как написать простейшую защиту от флуда на канале.
Удачи и держите ушки на макушке ;)

Пишем простейшую защиту канала от флуда
Описание: В этой статье, как и обещал, мы рассмотрим несколько способов защиты нашего канала от флуда.
------------------------------------------------------------------------------------------------

Итак, наш первый скрипт будет для защиты канала от многочисленных повторов текста. Скрипт очень похож на скрипт от ctcp флуда рассмотренный в предыдущей статье:

Вставляем в ремоуты(Remote):

on @*:TEXT:*:#: {
if (%text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] == $null ) { set -u8 %text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] 1 }
else { inc %text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] }
if (%text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] > 3) {
.ignore -u10 $address($nick,3)
.mode # +b $address($nick,2)
.kick # $nick Больше 3 повторов за 8 секунд
}
}

Комментарии излишни, т.к. данный скрипт подробно рассматривался в предыдущей статье. Я хочу добавить лишь одно, переменная %text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] будет иметь вид %text.#help.chertopolox.

Следущий скрипт будет наказывать всех кто любит очень много писать Caps Lockом:

on @*:text:*:#:{
; очищаем %text.caps от цветов, пробелов
var %i = 1, %text.caps = $remove($strip($1-),$chr(32)), %j
; запускаем цикл
while (%i <= $len(%text.caps)) {
; если сли буква большая то увеличиваем счетчик
if ($mid(%text.caps,%i,1) !islower) { inc %j }
; увеличиваем значение цикла на единицу
inc %i
}
; если количество больших букв в тексте превышает 80%
if ($round($calc((%j / %i) * 100),0) > 80) {
; кикаем нарушителя
.kick # $nick Отключите Caps Lock
}
}

В комментариях я постарался изложить все наиболее непонятные моменты, остальное (хотя точнее сказать все :) можно найти в help

Итак, наш следущий скрипт будет наказывать тех, кто любит излишне писать цветом на каналах. Не все серверы поддерживают опцию +c, так что это этот скрипт тоже будет полезен.

on @*:text:*:#:{
; если количество вхождений символа , символ получается при нажатии ctrl+k, в тексте больше 5
if ($count($1-,) > 5) {
; игнорим, баним и кикаем ник
.ignore -u10 $address($nick,3)
.mode # +b $address($nick,2)
kick # $nick Слишком много цветов
}
}

Вместо символа ctrl+k можно сделать ctrl+b или ctrl+u для считания соответственно жирного или подчеркнутого текста.

Теперь не менее занятный скрипт предотвращения join/part флуда.

on @*:part:#:{
if (%joinpart. [ $+ [ $nick $+ . $+ [ $chan ] ] ] == $null) { set -u60 %joinpart. [ $+ [ $nick $+ . $+ [ $chan ] ] ] 1 }
else { inc %joinpart. [ $+ [ $nick $+ . $+ [ $chan ] ] ] }
if (%joinpart. [ $+ [ $nick $+ . $+ [ $chan ] ] ] >= 3) {
.raw -q mode # +b $address($nick,2)
.echo -a >>> Join/Part Flood на #
}
}

Я думаю тут и так все понятно без комментариев, если вы разобрались в предыдущих скриптах.

На этом пока все, существует множество других видов флуда канала, но почти все защиты пишутся аналогично:
1 шаг - создается переменная на определенное время в которую мы сохраняем ник,канал (можно даже сеть) и закладываем туда какие нибудь данные
2 шаг - сравнение этой переменной с данными, которые мы считаем наиболее правильными
3 шаг - если сравнение не удалось, осуществляем наказание

Пишем нашего первого бота на сокетах
Описание: Данная статья рассматривает самые азы понятия сокетов и написания простейшего бота на них.
------------------------------------------------------------------------------------------------

Не буду вас долго напрягать лекциями что же такое сокет, если хотите поищите в интернете масса информации по данной теме.
Очень коротко о главном: сокеты представляют из себя прикладной программный интерфейс, входящий в состав многих ОС. Сокеты находятся на так назывемом транспортном уровне - ниже находится сетевой протокол IP, выше - специализированные протоколы, ориентированные на решение конкретных задач - это всем известные HTTP, FTP, SMTP и т.д.
Для начала советую хотя бы разок прочитать раздел хелпа, касающийся socket.
Итак, приступим.. Все что здесь будет написано нужно помещать в раздел ремоуты(Remote):
; создаем алиас для коннекта нашего бота, здесь sbot название сокета, далее сервак и порт для соединения
alias bot { sockopen sbot irc.spir.ru 6667 }

on *:sockopen:sbot: {
; если мы действительно законекались
if ($sock($sockname,1).status == active) {
; посылаем данные, необходимые для соединения, кому не понятно читаем статью русский RFC 1459
.sockwrite -n $sockname user 11 22 33 44
.sockwrite -n $sockname nick sockbot
; заходим на канал
.sockwrite -n $sockname join #test
}
}

on *:sockread:sbot:{
; читаем текст полученный от сокета
sockread %sock.text
; создаем окно для текста от бота
window -e @sockbot
; добавляем полученный текст
aline @sockbot %sock.text
; если сервак пингует нас, отвечаем, иначе улетим как мертвый груз ;)
if ($gettok(%sock.text,1,32) == PING) { .sockwrite -tn $sockname PONG $gettok(%sock.text,2,32) }
}

on *:input:@sockbot:{
; посылаем команды боту, команды должны соответствовать RFC 1459. Ну или просто добавляем условия и пишем свои команды...
.sockwrite -n sbot $1-
}

Все команды, полученные от сервера, будут обрабатываться on *:sockread так что если хотите добавить что либо ползем туда. На пример, если бота кикнут, чтоб он снова заходил на канал:
просто добавить:
if ($gettok(%sock.text,2,32) == KICK) { .sockwrite -tn $sockname JOIN $gettok(%sock.text,3,32) }
Ну и т.д.
Играя с этими командами можно создать специализированного бота, например для защиты канала, или развлекательного, допустим для чтения анекдотов с какого либо сайта.
В следущей статье я расскажу как осуществить соединение через прокси, а точнее через Socks4 протокол.
Удачи вам в скриптописании.

Основы протокола Socks4 на mIRC скриптах
Описание: Основы соединения в irc через прокси, а именно через Sock4 протокол. Рекомендуется более или менее продвинутым скриптописателям.
------------------------------------------------------------------------------------------------

Сегодня мы разберем один из непростых вопросов, как же подсоединить допустим нашего бота из прошлой статьи, используя mIRC скрипты. Применения сокс4 протокола довольно велико, например когда вы не можете зайти из-за того что сервер не пускает много соединений с одной ip адреса, или же вашего бота забанили на канале, но вы очень хотите туда попасть, или же просто любителям пофлудить :)

Ну чтож начнем (то что взято из предыдущей статьи без комментариев):

; конекаемся к сокс4 прокси, вместо ip и port вписываем соответственно айпи и порт сокс4 прокси
alias bot { sockopen sock4clone ip port }

on 1:sockopen:sock4clone: {
; если ошибка то выход
if ($sockerr > 0) { return }
; создаем бинарную переменную byte и вписывает туда данные согласно RFC сокс4, здесь 62.192.224.50 ip адрес сервера к которому подключаемся
bset &byte 1 4 1 $int($calc(6667/256)) $calc(6667 - $int($calc(6667 / 256)) * 256) $replace(62.192.224.50,$chr(46),$chr(32))
; посылаем нашу переменную
sockwrite $sockname &byte
}

on 1:sockread:sock4clone: {
; полученную от сокета инфу суем в переменную
sockread %sock4.text
; и в бинарную переменную
sockread &s4
; если первые два символа бинарной переменной равны 90
if ($bvar(&s4,2) == 90) {
; ну а это стандартный коннект в ирк
sockwrite -tn $sockname USER 111 222 333 444
sockwrite -tn $sockname NICK sockbot
sockwrite -tn $sockname join #test
sockwrite -tn $sockname privmsg #arkhangelsk :socks4 test
}
if ( $gettok(%sock4.text,1,32) == PING) { sockwrite -tn $sockname PONG $remove($gettok(%sock4.text,2,32),$chr(58)) }
if ($gettok(%sock4.text,2,32) == KICK) { sockwrite -tn $sockname JOIN $gettok(%sock4.text,3,32) }
}
 

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
Вот еще пару статей

Источник: bestirc.ru
Автор: yXo

Описание: Итак, сегодня рассмотрим один из самых распространенных вопросов, "Как автоматически послать сообщение, когда кто либо заходит к нам в приват"
------------------------------------------------------------------------------------------------

Итак для разминки простенький скриптик, который будет отвечать вошедшему к нам в приват.
Вставляем в ремоуты(Remote):

on *:open:?:*: msg $nick Здравствуйте, вы вошли ко мне в приват. Погодите немного, я скоро отвечу..

Также, многие любят чтоб при закрытии окна привата, собеседнику писало или кидало нотис о том что приват закрыт, делается это следующим образом:

on *:close:?: .notice $nick Приват с вами закрыт. Спасибо за внимание.

Кстати, стоит заметить, тем кто не знал точка(.) перед командой обозначает, что мы не увидим результата вывода команды.
На пример, если написать в эдитбоксе /timer 1 1 echo -a test, то мы увидим наподобие этого:
* Timer 1 activated
-
test
-
* Timer 1 halted
Если же написать /.timer 1 1 echo -a test, то мы увидим просто test.

Ну вернемся к нашим баранам, т.е. к приватам ;)
Сейчас мы напишем более продвинутый скриптик, который будет показывать нам диалог с ником зашедшего в приват и текстом который он написал. Вставляем опять же в ремоуты:

on *:open:?:*:{
; запоминаем ник открывшего приват
set %fr.user $nick
; запооминаем текст привата
set %user.text $1-
; открываем диалог
dialog -moa FriendPrivat FriendPrivat
}

dialog FriendPrivat {
size -1 -1 300 100
title Ник %fr.user открыл приват с вами
box "Текст привата", 5, 5 1 290 70
text %user.text, 1, 10 15 280 40, center
button "Отвечу", 3, 55 75 90 20, flat, ok
button "Не отвечу",4,155 75 90 20, flat, ok
}
on *:DIALOG:FriendPrivat:sclick:*:{
; если принимаем
if ($did == 3) {
; открываем на весь экран мирк, малоли он свернут
showmirc -xs
; закрываем диалог
dialog -ux $dname $dname
; шлем нотис
.notice %fr.user Ваш приват принят
}
; если нет, закрываем приват и отписываемся юзеру
if ($did == 4) { .notice %fr.user Ваш приват отклонен | close -m %fr.user }
}
Описание: Данная статья посвящена рассмотрению некоторых, наиболее часто встречаемых токенов.
------------------------------------------------------------------------------------------------

Я думаю, не один более или менее солидный скрипт не обходится без токенов. Если же вы до сих пор не знаете что это такое и с чем их едят, то не отчаивайтесь, после прочтения данной статьи вы сможете уже писать небольшие скриптики с их помощью.
Итак, начнем. Первый, и один из самых популярных идентификаторов для работы с токенами это безусловно - $gettok.
Синтаксис данного идентификатора - $gettok(text,N,C)
text - это сообственно текст, который вы хотите обрабатывать
N - номер токена который мы хотим взять
C - ascii символ-разделитель нашего токена.
Иными словами, токен - это какой-то кусок из текста. Если вы не знаете ascii символ вашего разделителя, наберите в эдитбокс - //echo -a $asc(:),(обязательно две палки (//)), где двоеточие(:) и будет разделитель.
Чтобы окончательно вас не запутать рассмотрим работу $gettok на нескольких примерах и все станет ясно:
Пример1:
пишем в эдитбокс //echo -a $gettok(Мама сшила мне штаны из березовой коры,4,32). Данная команда вернет нам слово "штаны". Теперь разберем работу:
$gettok(text,N,C) в нашем случае выглядит как $gettok(Мама сшила мне штаны из березовой коры,4,32)
text - Мама сшила мне штаны из березовой коры
N - 4
C - 32
Итак мы берем из text 4 слово(токен) с разделителем между словами(токенами) 32 - это ascii символ пробела.

Пример2:
более сложный пример //echo -a $gettok($gettok(раз:два;три:четыре,2,59),1,58). На экран нам выведет слово "три". Как видим данный пример состоит из двух использований идентификатора $gettok. Для разбора начинать следует изнутри:
$gettok($gettok(раз:два;три:четыре,2,59),1,58), т.е. сначало рассмотрим работу $gettok(раз:два;три:четыре,2,59). Оснополагаясь на предыдущий пример мы видим:
text - раз:два;три:четыре
N - 2
C - 59
Мы берем 2 токен из text с ascii символом 59, что соответствует символу ";", т.е. после работы данного идентификатора плучится текст "три:четыре".
Далее, теперь самостоятельно попробуйте понять как работает $gettok(три:четыре,1,58).

Следущим идентификатором, который я хотел бы разобрать будет - $numtok, он показывает количество токенов в тексте. Синтаксис - $numtok(text,C). Что такое text и С смотрите выше.
А пока разберем пример //echo -a $numtok(наш сайт самый реальный,32). После ввода команды мы увидим число 4. И действительно количество слов(токенов) с разделителем 32(пробел) равно 4.
Наиболее частое распростронение $numtok получил в циклах while:
test.tok {
var %i = 1
while (%i <= $numtok($1-,32)) {
echo -a $gettok($1-,%i,32)
inc %i
}
}
Рассматривать подробно работу данного цикла я специально не буду, т.к. хочу чтобы и вы немного подумали ;)
Вставляете его в алиасы(aliases) и пишете в эдитбоксе - /test.tok Мама сшила мне штаны из березовой коры.

Существует еще несколько идентификаторов токенов, но они не так часто применяются и поняв работу этих двух разобраться с остальными не составит большого труда. В хелпе они рассмотрены даже с маленькими примерами. Если же что-то будет непонятно с ними,отпишитесь и возможно я напишу еще одну статью про токены.
Пишем отправку смс на beeline на сокетах
Описание: Данная статья рассматривает как с помощью сокетов mIRC отправить на HTTP страничку данные. Пример будет рассмотрен на отсылке смс на один из мобильных провайдеров, всем известный как beeline.
------------------------------------------------------------------------------------------------

Работать наше чудо будет вот так(по желанию и при помощи прямых рук этот скрипт можно переделать под свои нужны или прикрутить к боту) /beesms 903ххххххх Привет как дела. Т.е. не нужно писать +7(8) в начале номера телефона, префикс 903 также выбран случайно, можно писать любые номера билайн.

; запоминаем в переменные номер телефона и текст смс, далее проверяем длину, если все нормально то конект к сайту билайна
alias beesms {
set -u60 %sms.nomer $1
set -u60 %sms.text $2-
if ($len(%sms.text) <= 156) { sockopen bee 217.118.84.204 80 }
else echo -a >> Сообщение содержит слишком много символов (максимум 156)
}
; кодируем сообщение
alias urlencode {
var %i = 0, %r | while (%i < $len($1-)) {
inc %i
%r = %r $+ $chr(37) $+ $base($asc($mid($1-,%i,1)),10,16,2)
}
return %r
}

; при конекте отправляем данные
on *:sockopen:bee:{
.sockwrite -n $sockname GET /servlet/send/sms/?phone= $+ $mid(%sms.nomer,4,$calc($len(%sms.nomer)-3)) $+ &number_sms=number_sms_send&prf=8 $+ $mid(%sms.nomer,1,3) $+ &termtype=G&message= $+ $urlencode(%sms.text) $+ &translit=0&x=5&y=4 HTTP/1.1
.sockwrite -n $sockname Accept: */*
.sockwrite -n $sockname Accept-Language: ru
.sockwrite -n $sockname Accept-Encoding: gzip, deflate
.sockwrite -n $sockname User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; .NET CLR 1.1.4322)
.sockwrite -n $sockname Host: www.beeonline.ru
.sockwrite -n $sockname Connection: Keep-Alive
.sockwrite -n $sockname Cookie: JSESSIONID=apJESbvY7gBc
.sockwrite -n $sockname
}

; и обрабатываем ответ
on *:sockread:bee:{
if ($sockerr > 0) return
sockread %temp
if (Content-Length isin %temp) {
var %buf = $gettok(%temp,2,58)
if (%buf >= 99) { echo -a >> Сообщение отправить не удалось | .sockclose bee }
else { echo -a >> Сообщение отправлено | .sockclose bee }
}
}
Каких то особенный команд я тут не использовал, все что непонятно ищем в хелпе или спрашиваем в форум.
Учимся работать с циклами и идентификатором $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 файлике не совсем безопасно или хотя бы сделать какое-нибудь простенькое кодирование. В данном скрипте также были задеты токены, кто не умеет ими пользоваться прочитайте мою статью "Учимся работать с токенами в мирк". Надеюсь данный скрипт будет работать, т.к. я писал его прямо тут ;), если найдете будут ошибки постарайтесь поднапрячь мозги и найти их сами, я думаю это будет тренировка для вас.
Прикольные менюшки для mIRC
Описание: Сегодня рассмотрим написание различных маленьких забавных менюшек(popups).
------------------------------------------------------------------------------------------------

Менюшки или popups позволяет создавать всплывающие меню для всех видов окон (статуса, привата, канала, списка ников канала, главного меню). Грузить вас теорией я не буду, поэтому начнем: нажимаем Alt+r, открываем вкладку popups, сверху в меню Вид(View), выбираем Никлист(Nicklist) и пишем:

.Пополам: { $popolam($1) }

Далее выбираем алиасы(aliases) и пишем туда такой код:

popolam {
; если длина ника равна 1 букве
if ($len($1) == 1) { return me расчленил $$1 на много половинок }
; если длина больше 2 и точка содержится при делении длины на 2, т.е. мы проверяем четное слово или нет
if ($len($1) > 2) && ($chr(46) isin $calc($len($$1) / 2)) { return me разрубил $$1 на две половинки - $right($$1,$calc($len($$1) / 2)) и $left($$1,$calc($len($$1) / 2)) , a $mid($1,$int($calc(($len($1) /2)+1)),1) выкинул в окно }
; если число четное
else { return me разрубил $$1 на две половинки - $right($$1,$calc($len($$1) / 2)) и $left($$1,$calc($len($$1) / 2)) }
}

Нажав теперь на определенный ник в никлисте и выбрав только что созданный нами пунк меню, мы увидим что-нибудь типа этого:
** yXo разрубил yXo на две половинки - o и y , a X выкинул в окно
или ** yXo разрубил AllBot на две половинки - Bot и All

Сейчас мы замутит еще что-нибудь эдакое. Открываем опять же popups, никлист и вставляем туда это:
.Насос:/me надул $$1 насосом и $replace($upper($$1),ё,Ё,й,Й,ц,Ц,у,У,к,К,е,Е,н,Н,г,Г,ш,Ш,щ,Щ,з,З,х,Х,ъ,Ъ,ф,Ф,ы,Ы,в,В,а,А,п,П,р,Р,о,О,л,Л,д,Д,ж,Ж,э,Э,я,Я,ч,Ч,с,С,м,М,и,И,т,Т,ь,Ь,б,Б,ю,Ю) улетело в небо!

.Иголка:/me проткнул $$1 иголкой и сдутое $replace($lower($$1),Ё,ё,Й,й,Ц,ц,У,у,К,к,Е,е,Н,н,Г,г,Ш,ш,Щ,щ,З,з,Х,х,Ъ,ъ,Ф,ф,Ы,ы,В,в,А,а,П,п,Р,р,О,о,Л,л,Д,д,Ж,ж,Э,э,Я,я,Ч,ч,С,с,М,м,И,и,Т,т,Ь,ь,Б,б,Ю,ю) упало к ногам $me !

Тут используются два идентификатора $upper и $lower переводящие латинский алфавит в верхний и нижний регистр соответственно, русские же буквы мы заменяем идентификатором $replace.

Ну и на последок еще несколько менюшек - раскрасок, вставляем в все в теже попапы/никлист:

.Зебра: me раскрасил $p4olka($1,zebra) под зебру
.Билайн: me раскрасил $p4olka($1,bee) под билайн
.Кислота: me полил кислотой $1 и получилось $p4olka($1,kisl)
.Тельняшка: me одевает $p4olka($1,tel) в матросскую тельняжку
.Пчолка: me раскрасил $p4olka($1,p4) под пчёлку

А этот алиасик вставляем естественно в aliases:

p4olka {
; создаем переменные
var %p4.i = 1, %p4.zvet = 1, %p4ela
; проверяет второй передаваемый параметр в алиас и в зависимости от него подбирает цвет
if ($2 == p4) { %p41 = 07,01 | %p42 = 01,07 }
if ($2 == tel) { %p41 = 12,00 | %p42 = 00,12 }
if ($2 == kisl) { %p41 = 09,01 | %p42 = 01,09 }
if ($2 == zebra) { %p41 = 00,01 | %p42 = 01,00 }
if ($2 == bee) { %p41 = 08,01 | %p42 = 01,08 }
; закручиваем цикл, пока наша переменная меньше или равна длине первого передаваемого параметра, в нашем случае это будет длина ника
while (%p4.i <= $len($1)) {
; если переменная не равна 1 берем первый цвет и i-ую букву из ника и присваиваем переменной 1
if (%p4.zvet != 1) { %p4ela = %p4ela $+ %p41 $+ $mid($1,%p4.i,1) $+  | %p4.zvet = 1 }
; если переменная равна 1 берем i-ую букву из ника и присваиваем переменной 0
else { %p4ela = %p4ela $+ %p42 $+ $mid($1,%p4.i,1) $+  | %p4.zvet = 0 }
; увеличиваем счетчик на 1
inc %p4.i
}
; возвратим конечное значение алиаса
return %p4ela
}

Остальные фразы можете придумать сами при наличии небольшого количества выдумки ;)

P.S. По многочисленным просьбам добавляю скрипт мешалку. Пишем в попапы:

.МЕШАЛКА: me засунул $$1 в миксер и получилось $mixer($$1) $+ ...

И добавляем следущий алиас, естественно в алиасы:

mixer {
var %t = $1, %was
while (%t != $null) {
var %x = $rand(1,$len(%t))
var %was = %was $+ $mid(%t,%x,1)
%t = $left(%t,$calc(%x - 1)) $+ $right(%t,$calc($len(%t) - %x))
}
return %was
}

После применения вы увидите примерно следущее:
** Pupkin засунул Fifka в миксер и получилось kiFaf...
уХо засунул уХо в миксер и получилось оуХ...
 

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
ОчереднЫе статьи от yXo :)

Счетчик киков и скрипт автоприветствие
Описание: В данной статье мы рассмотрим как считать количество киков и банов, а также научимся писать простейшее, но \"разумное\" автоприветствие.
------------------------------------------------------------------------------------------------

Часто в irc, при киках, можно наблюдать следущую картину:
** Pupkin kick vasya from #help [Kick: 150 Ban: 50]
Тоже хотите такое, да запросто, сейчас сделаем. Итак открываем Скрипты(Remote), нажатием alt+r или соответствующей кнопки на тулбаре и пишем туда следущее:

on *:kick:#: {
; если вы кикаете
if ($nick == $me) {
; если переменная существует увеличиваем ее на 1
if (%kickun) { inc %kickun }
; если не существует, создаем и приравниваем единице
else { %kickun = 1 }
}
}

; тут все аналогично
on *:ban:#: {
if ($nick == $me) {
if (%banick) { inc %banick }
else { %banick = 1 }
}
}

Далее ползем в закладку Попапы(Popups), сверху нажимаем Вид(View) и выбираем Никлист(Nicklist). И вставляем туда следущее:

Кик/Бан: mode # +b $address($$1,2) | kick # $$1 [Kick: %kickun Ban: %banick $+ ]

Ну вот и все, теперь воспользовавшись только что созданной меню мы увидим:

* ghjks sets mode: +b *!*@127.0.0.1
* Pupkin was kicked by ghjks ([Kick: 1 Ban: 1])


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

on !*:join:#: Привет $nick!

Но, согласитесь глупо будет выглядеть, когда зайдут сразу 3-5 юзеров или кто-нибудь из них еще и перезайдет. Поэтому мы будем писать \"умный\" скрипт. Для начала создадим переменную с приветствиями, делаем это так /set %privet привет ку хай hi re превед hello прет ре (пишется это в едитбоксе, строчке где вы пишете весь текст, для тех кто в танке ;). Делаем мы это, чтобы не повторять какждый раз одно и тоже однообразное \"привет\". Можно также, по желанию, занести эти слова в txt файлик и обрабатывать $read, можете прочитать одну из моих предыдущих статей и сделать самим.
Итак, открываем наши любимые скрипты(remote) и пишем туда следущий код:

on *:join:#: {
; если переменной нету
if ($eval(% $+ $network $+ . $+ $chan $+ . $+ $nick,2) == $null) {
; создаем ее на 60 сек
set -u60 $eval(% $+ $network $+ . $+ $chan $+ . $+ $nick,1) 1
; здороваемся, выбирая приветствие рандомайзом
msg # $gettok(%privet,$rand(1,$numtok(%privet,32)),32) $nick
}
}

Работает это чудо так: заходит ник на канал, мы здороваемся рандомным приветствием и заносим ник в переменную на 60 сек, т.е. если он в течение этого времени перезайдет то мы больше не поздороваемся. Простенько и со вкусом ;)

Уходим в away и возвращаем баны
Описание: Сегодня мы будем писать простенькую away систему и возвращать снятые \"чужими\" баны.
------------------------------------------------------------------------------------------------

Режим Away служит для уведомления пользователей о том, что вы в данный момент недоступны для беседы. Когда кто-то посылает вам сообщение и у вас включен режим Away, пользователь получит сообщение [away message]. Для выключения режима используется команда /away без параметров. Это немного теории из хелп файла.
Итак, начнем разбираться. Таким образом написав в эдитбоксе:
/away Я ушел кушать
мы уйдем в эвей с сообщением \"Я ушел кушать\". Но согласитесь это как то просто. Сейчас попробуем замутить что-нибудь посложнее, открываем Попапы(popups), сверху в меню Вид(view) выбираем Канал(channel), (т.е. наша менюшка будет видна при клике правой кнопкой на канале) и пишем туда следущее:

Away
.$iif($away == $false,Уйти): away $$?=\"Введите причину эвея\" | nick $me $+ [away]
.$iif($away == $true,Вернуться): away | nick $remove($me,[away])

Конструкция $iif проверяет условие и в зависимости от него создает меню. Если $away == $false, мы не в эвее, то создаем менюшку Уйти, уходим в эвей и меняем ник на наш плюс [away]. Если же мы в эвее покажет меню Вернуться мы возвращаемся из эвея и меняем ник. Лично для меня этого достаточно, но т.к. многие юзеры любят всякие фишечки и прибамбахи мы сейчас модернезируем скрипт и он буде показывать время эвея и причину на канал.
Вставляем туда же это:

Away
.$iif($away == $false,Уйти): { .away $$?=\"Введите причину эвея\" | nick $me $+ [away] | set %awtime $ctime | ame >> ушел в эвей с причиной ( $! ) в $time }
.$iif($away == $true,Вернуться): { .away | nick $remove($me,[away]) | ame >> вернулся отсутствовал $duration($calc($ctime - %awtime)) | unset %awtime }

Ну разбор скрипта я ложу на ваших хрупкие плечи, не все же коту масленица :) пора подумать и своей головой.

А теперь скриптик, возвращающий поставленные вами баны, при снятии их другими юзерами. Открываем раздел скрипты:

on *:ban:#:{
if ($nick == $me) && ($banmask !isin %bm) { set %bm %bm $banmask }
}

Когда ставим бан, проверяем, если ник - это вы и маски бана нету в переменной то добавляем.

on *:UNBAN:#:{
if ($banmask isin %bm) {
if ($nick != $me) mode # +b $banmask
else set %bm $remove(%bm,$banmask)
}
}

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

UDP Сокеты. Сбор статистики с серверов Quake3 и Counter-Strike
Описание: В этой статье попытаюсь объяснить на примерах работу с UDP сокетами.
За примеры возьмем сбор статистики с игровых серверов Quake3 и Counter-Strike.
------------------------------------------------------------------------------------------------

Немного теории (Подробное описание содержится в официальной спецификации UDP (RFC 768)).

UDP (User Datagram Protocol) - протокол без установки соединения, ориентированный на передачу датаграмм (чтобы сильно не углубляться в теорию: датаграмма - пакет данных, который мы будем отсылать/принимать серверу/от сервера).
Отослать такую датаграмму средствами mIRC можно командой sockudp (за один раз отсылается только одна датаграмма)

Т.к. соединение не устанавливается, то для работы с UDP сокетами не понадобятся обработчики on SOCKLISTEN on SOCKOPEN и on SOCKCLOSE
После отправки данных командой sockudp в буфер считываются принятые данные, которые можно обработать через on UDPREAD
Во время отправки срабатывает обработчик on SOCKWRITE, через который можно отловить ошибки возникшие при выполнении sockudp

Ну, а теперь практика.

Рассмотрим пример получения и вывода статистики игрового сервера Quake3

Общий принцип получения тактой информации очень прост:
1. Посылаем команду, на которую сервер должен выдать свои настройки, текущее/максимальное кол-во игроков, название карты и тд. и тп.
2. Посылаем следующую команду для получения информации о самих игроках (фраги, пинг, ник и тп.)

Нужную команду и формат данных можно отследить снифером.

Алиасы потребующиеся для работы:

alias q3s return 83.102.231.34
;ip адрес сервера
alias q3sp return 27960
;порт q3 сервера

alias q3getinfo sockudp -kn q3getinfo_sock $q3s $q3sp яяяяgetinfo
;алиас отсылающий серверу команду для получения информации о нем
;флаги sockudp
; -k оставляет сокет открытым, чтобы мы могли получить все данные
; -n добавляет символы конца строки $crlf (если их нет) к передаваемой строке
; (некоторые серверы считывают строку от начала до этих символов)
;q3getinfo_sock - имя сокета для обработки принятых от него данных

alias q3getstatus {
if ($sock(q3getstatus_sock)) sockclose q3getstatus_sock
;если сокет открыт закрываем его
sockudp -kn q3getstatus_sock $q3s $q3sp яяяяgetstatus
}
;алиас отсылающий серверу команду для получения информации о игроках

alias q3getoptionval {
if ($regex(q3,$2-,$+(\\,[ [ $1 ] ],\\,$chr(40),.*?,$chr(41),\\))) return $regml(q3,1)
}
;алиас возвращающий значение опции по названию \название_опции\значение\

alias q3colors {
if ($1) {
;если первый параметр не равен null, то продолжаем
var %i, %buff = $remove($1-,")
;объявляем переменные, в %buff заносим весь текст переданный алиасу и удаляем из него символы "
if ($regex(q3,%buff,/(\^x[a-f\d]+|\^[a-z])/ig)) {
;проверяем нашло ли текст в переменной %buff, который соответствует регулярному выражению
;текст может быть выглядеть так: ^XAAbFAC или ^h
;флаг i означает, что ищем текст независимо от регистра
;флаг g - поиск по всей строке
%i = 1
while ($regml(q3,%i)) {
;цикл с изменяющимся, за счет увеличения %i, условием
;$regml(q3,%i) - возвращает %i-й текст найденный через $regex
%buff = $remove(%buff,$ifmatch)
;$ifmatch - возвращает значение условия находящегося в while или if
inc %i
}
}
%buff = $replace(%buff,^1,$chr(3) $+ 04,^2,$chr(3) $+ 09,^3,$chr(3) $+ 08,^4,$chr(3) $+ 12,^5,$chr(3) $+ 11,^6,$chr(3) $+ 13,^7,$chr(3) $+ 00,^8,$chr(3) $+ 01,^9,$chr(3) $+ 04,^0,$chr(3) $+ 01)
;заменяем цвета q3 на цвета мирка
return %buff $+ $chr(3)
;возвращаем обработанный текст в переменной %buff и заканчиваем его символом цвета в мирке (чтобы, текст далее идущий не раскрасило цветами)
}
}
;алиас заменяющий q3 цвета на цвета мирка

;После того как выполнится алиас q3getinfo в буфер приема должны поступить данные, которые можно обработать следующим образом

on *:udpread:q3getinfo_sock:{
sockread -f %q3
;считываем данные в переменную, флаг -f заставляет mIRC заполнить переменную любым текстом, какой находится в буфере

if ((Response isin %q3) && ($chr(92) !isin %q3)) q3getinfo

;после первого выполнения алиаса q3getinfo должны получить пакет следующего содержания: яяяяstatusResponse
;в нем не должно быть символа перечисления настроек (\dmflags\0\fraglimit\30 .....)
;если так оно и есть, то выполняем еще раз все тотже алиас q3getinfo для получения следующей порции инфы

elseif ($q3getoptionval(clients, %q3) >= 1) {

;после второго выполнения алиаса q3getinfo должны получить примерно следующее:
;\game\osp\punkbuster\0\pure\0\gametype\0\sv_maxclients\17\clients\11\mapname\ospdm9\hostname\name_server\protocol\68
;и тут мы проверяем если игроков больше 1, то будем запрашивать инфу о них, а затем выводить ее в нужном формате

set %q3p $q3getoptionval(clients, %q3)
;заносим в переменную %q3p количество игроков \clients\11\

q3getstatus

echo -ag Имя сервера: $q3colors($q3getoptionval(hostname, %q3)) Игроков: $+($q3getoptionval(clients, %q3),/,$q3getoptionval(sv_maxclients, %q3)) Карта: $q3getoptionval(mapname, %q3)
;выводим нужную информацию

set %q3temp 1
;эта переменная будет хранить порядковый номемер игрока при выводе

sockclose $sockname
;закрываем сокет.. дальнейшая обработка будет выполнятся над данными полученными с помощью алиаса q3getstatus
}
else {
;если игроков нет то просто выводим информацию о сервере
echo -ag Имя сервера: $q3colors($q3getoptionval(hostname, %q3)) Игроков: $+($q3getoptionval(clients, %q3),/,$q3getoptionval(sv_maxclients, %q3)) Карта: $q3getoptionval(mapname, %q3)
sockclose $sockname
unset %q3*
}
}


;Здесь обрабатываем инфу о игроках добытую с помощью алиаса q3getstatus

on *:udpread:q3getstatus_sock:{
sockread -f %q3
if (Response !isin %q3) && ($chr(92) !isin %q3) {
tokenize 32 %q3
;разбиваем переменную по пробелам, в которой содержится следующее: 4 31 "Hrensgory" , на токены $1 $2 $3 ...
;формат данных в ней: фраги_число пинг_число "ник игрока"

echo -ag Игрок №: %q3temp Фраги: $1 Ник: $q3colors($3-) Пинг: $2

if (%q3temp < %q3p) inc %q3temp
else {
echo -ag Конец вывода
sockclose $sockname
unset %q3*
}
}
}

Копируем все это дело в Remote (Alt+R) и набираем /q3getinfo
Получаем следующее:

Имя сервера: www.q3dm6.ru Corbina Q3A FFA Server!!! Игроков: 11/17 Карта: pro-q3tourney4
Игрок №: 1 Фраги: 0 Ник: MrAlex Пинг: 37
Игрок №: 2 Фраги: 6 Ник: CMD Пинг: 8
Игрок №: 3 Фраги: 4 Ник: 19 Пинг: 31
Игрок №: 4 Фраги: 4 Ник: KiWi Пинг: 41
Игрок №: 5 Фраги: 6 Ник: kenny Пинг: 4
Игрок №: 6 Фраги: 6 Ник: vasya Пинг: 24
Игрок №: 7 Фраги: 5 Ник: K1M0 Пинг: 37
Игрок №: 8 Фраги: 8 Ник: yup Пинг: 31
Игрок №: 9 Фраги: 14 Ник: Alex Пинг: 14
Конец вывода


Теперь рассмотрим такой же пример с сервером Counter-Strike
Практически тоже самое, но при считывании информации из буфера будем использовать не простую, а бинарную переменную (&var) т.к. данные, которые будет нам выдавать сервер CS, содержат "невидимые" символы (с кодом <= 32) (при занесении таких символов в обычную переменную мирк может их просто обрезать при выводе/работе). Код такого символа может обозначать кол-во фрагов игрока.

Алиасы потребующиеся для работы:

alias css return 62.192.233.6
;ip адрес сервера
alias cssp return 27015
;порт сервера

alias csgetinfo {
var %i = 1, %result
;объявляем переменные

var %buf = $regsubex(cs,$2-,^255 255 255 255 109,), %buf = $regsubex(cs,%buf,^255 255 255 255 68 \d+,)
;присваиваем переменной %buf входящий текст начиная со второго слова (первое будет параметром, по которому будем определять нужное поле)
;и удаляем из него текст попадающий под регулярные выражения

var %re = $iif($gettok($2-, 5, 32) == 109, /(\d+.*?)\s0[\s]?/g, /(\d+\s.*?\s[0]\s\d+\s\d+\s\d+\s\d+\s\d+\s\d+\s\d+\s\d+)/g)
;определяем регулярное выражение, по которому будем искать нужные данные.. если $gettok($2-, 5, 32) пятый параметр, в передаваемой строке начиная со второго слова, равен 109,
;то значит нам нужно искать поле в данных о сервере (т.к. они начинаются с заголовка 255 255 255 255 149), если же нет то значит ищем данные о игроке
;конструкция $iif : $iif(условие, A, B) вернет A если условие верно, B наоборот
;^ - начало строки \d - одна цифра \d+ - последовательность рядом стоящих цифр \s - пробел . - любой символ .* - любая последовательность символов ? - одно вхождение [] - перечисление доступных символов
;выражение пишется в / /, после второго слеша можно поставить какой-нибудь флаг (или сразу несколько), например, g - поиск по всему тексту или i - поиск без учета регистра
;подробнее о регулярных выражениях можно почитать на ru.php.net

if ($regex(cs,%buf,%re)) {
;если что-нибудь найдено по выражению находящемуся в переменной %re, то идем дальше
while ($regml(cs,%i)) {
;цикл с изменяющимся, за счет увеличения %i, условием
;$regml(q3,%i) - возвращает %i-й текст найденный через $regex
bset &tmp 1 $ifmatch
;заполняем бинарную переменную &tmp содержимым $ifmatch
;$ifmatch - возвращает значение условия находящегося в while или if
%result = $iif($gettok($2-, 5, 32) == 109, $bvar(&tmp, 1, $bvar(&tmp,0)).text, $bvar(&tmp, 1, $bvar(&tmp,0)))
;в зависимости от условия заполняем переменную %result
;$bvar(&tmp, 1, $bvar(&tmp,0)).text - вернет содержимое переменной текстом
;$bvar(&tmp, 1, $bvar(&tmp,0)) - вернет содержимое переменной ascii кодами символов текста, находящегося в &tmp
bunset &tmp
if (%i == $1) break
;если счетчик равен первому переданному параметру, то значит мы нашли то, что нужно
inc %i
}
}
if ($prop) {
;$prop - значение параметра передаваемого через точку, $csgetinfo().значение
;если он есть то выводим не весь %result, а только только ascii код символа порядковый номер которого равен $prop
%result = $asc($mid(%result, $prop, 1))
}
return %result
}
;алиас возвращающий значение поля/данные о игроке по номеру

alias csgetinfoplayers sockudp -kn csgetinfoplayers_sock $css $cssp яяяяUяяяя
;алиас отсылающий серверу команду для получения информации о игроках
;для версии cs 1.5 команда может быть яяяяplayers


alias csgetinfoserv sockudp -kn csgetinfo_sock $css $cssp яяяяT
;алиас отсылающий серверу команду для получения информации о нем
;для версии cs 1.5 команда может быть яяяяdetails


;После выполнения алиаса csgetinfoserv в буфер должны поступить данные о сервере
;информация в полученных данных распределена следующим образом:
;заголовок + cимвол "m" + адрес сервера / имя сервера / имя карты / директория / описание / текущее кол-во игроков (1символ) + максимальное кол-во игроков (1символ) + версия протокола (1символ) + тип сервера (1символ) + ос сервера (l - linux w - windows) (1символ) .. / ...
;все поля разделены нулевым символом
;заголовок состоит из 4х символов с кодом 255
;
;для упрощения изъятия нужного поля был написан алиас csgetinfo, синтаксис алиаса:
;$csgetinfo(3, %var) - вернет третье поле т.е. название карты
;$csgetinfo(6, %var).1 - вернет код первого символа 6-го поля т.е. текущее кол-во игроков
;$csgetinfo(6, %var).5 - вернет код пятого символа 6-го поля т.е. если сделать $chr($csgetinfo(6, %var).5) можно опр еделить ос сервера l или w
;
;итак, обрабатываем нифу полученную через csgetinfoserv

on *:udpread:csgetinfo_sock:{
sockread -fn &tmp
;считываем данные из буфера в бинарную переменную
;после этого она будет содержать ascii код каждого символа считанного из буфера
var %cstmp = $bvar(&tmp,1,$bvar(&tmp,0))
;присваиваем обычной переменной содержание бинарной переменной &tmp
;теперь переменная %cstmp содержит ascii код символа начиная с первого по последний. $bvar(&tmp,0) - возвращает длину переменной т.е. кол-во кодов
set %csnum $csgetinfo(6, %cstmp).1
;эта переменная будет хранить количиство игроков на сервере
echo -a Имя сервера: $csgetinfo(2, %cstmp) Карта: $csgetinfo(3, %cstmp) Игроков: $+(%csnum,/,$csgetinfo(6, %cstmp).2)
if (%csnum > 0) csgetinfoplayers
;если игроков > 0 отправляем команду алиасом csgetinfoplayers для получения данных о игроках
else unset %cs*

sockclose $sockname
}
;приступаем к обработке данных о игроках полученных с помощью алиаса csgetinfoplayers
on *:udpread:csgetinfoplayers_sock:{
sockread -fn &tmp
var %cstmp = $bvar(&tmp,1,$bvar(&tmp,0)), %i = 1, %cstmptext
while (%i <= %csnum) {

;алиас csgetinfo написан не только для изъятия полей данных сервера
;им еще можно "фильтровать" данные игроков (эти данных аслиа возвратит не как текст при извлечении инфы о сервере, а код каждого символа текста)
;после считывания данных командой sockread переменная &tmp будет содержать:
;255 255 255 255 68 4 1 82 111 109 97 0 23 0 0 0 128 241 143 69 2 67 66 85 72 84 89 67 0 4 0 0 0 235 31 135 66 ...
;здес формат следующий:
;заголовок + символ D : 255 255 255 255 68
;кол-во игроков : 4
;данные первого игрока 1 82 111 109 97 0 23 0 0 0 128 241 143 69
;данные второго игрока 2 67 66 85 72 84 89 67 0 4 0 0 0 235 31 135 66
; 2 - порядковый номер
; 67 66 85 72 84 89 67 - коды символов ника
; 0 - нулевой символ разделитель
; 4 0 0 0 - фраги
; 235 31 135 66 - время

bset &cstmpinfo 1 $csgetinfo(%i, %cstmp)
;заполняем бинарную переменную нашими кодами %i -го игрока

%cstmptext = $bvar(&cstmpinfo,1,$bvar(&cstmpinfo,0)).text
;.text возвращает текст из бинарной переменной
%cstmpascii = $bvar(&cstmpinfo,1,$bvar(&cstmpinfo,0))
echo -a Игрок №: $chr($csgetinfo(%i, %cstmp).1) Ник: $mid(%cstmptext, 2) Фраги: $gettok(%cstmpascii, $calc($findtok(%cstmpascii, 0, 1, 32) + 1), 32)
bunset &cstmpinfo
;очищаем память &cstmpinfo, если этого не сделать, то получится следующее:
;в переменной находится текст abcdefg мы заполнияем ее текстом меньшей длины 123 => получаем 123defg
;этого конечно можно избежать если запоминать длину вносимого текста и выводить по длине

inc %i
}
sockclose $sockname
unset %cs*
}

Прописываем все в Remote и выполняем /csgetinfoserv
Получаем:

Имя сервера: ATKNet Counter-Strike 1.6 Public Server Карта: de_nuke Игроков: 3/26
Игрок №: 1 Ник: Roma Фраги: 1
Игрок №: 2 Ник: ][AOC Фраги: 0
Игрок №: 3 Ник: ShiftCtrl Фраги: 1
 

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
Еще парочка статей от yXaстоко :)

DCC Протокол и возможные ошибки
Описание: В этой статье постараемся постараемся понять, что такое и как работает DCC (Direct Client Connection), и рассмотрим наиболее известные проблемы DCC протокола при использовании в mIRC. Всю нижеизложенную информацию можно применить и ко всем остальным IRC клиентам, несмотря на то, что упор в данной статье будет именно на mIRC.
------------------------------------------------------------------------------------------------

DCC Протокол и его ошибки

В этой статье постараемся постараемся понять, что такое и как работает DCC (Direct Client Connection), и рассмотрим наиболее известные проблемы DCC протокола при использовании в mIRC. Всю нижеизложенную информацию можно применить и ко всем остальным IRC клиентам, несмотря на то, что упор в данной статье будет именно на mIRC.

Часть 1 - DCC Протокол
DCC соединение начинается с того, что один клиент, назовем его Клиент А подключается к IRC серверу и начинает прослушивание определенного порта. Затем он шлет CTCP запрос Клиенту Б, получателю DCC соединения. CTCP запрос содержит тип соединения, информацию (такую как название файла и размер), IP адрес и прослушиваемый порт Клиента А.
Если Клиент Б получает CTCP запрос, обычно в настройках указывается, что при этом необходимо будет сделать: принять запрос, проигнорировать запрос, спросить юзера. Если юзер примет DCC запрос, Клиент Б ожидает установки TCP соединения к указанному Клиентом А в CTCP соединении IP и порту. Если Клиент Б успешно установит соединение, DCC соединение можно продолжать.
Следует отметить, что Клиент Б не шлет ничего в ответ, если он отклоняет запрос, следовательно Клиент А должен подождать какое-то время, а затем сбрасывает соединение. Это называется таймаут. Время таймаута возможно изменять, но не стоит его делать слишком большим.

Основные виды CTCP запросов:
Для DCC Чата: PRIVMSG ClientB :DCC CHAT Chat longip port
Для DCC Отсылки: PRIVMSG ClientB :DCC SEND filename longip port filesize

Существует также еще несколько видов запросов, например для продолжения приемки файла или еще несколько альтернативных способов для установления DCC соединения, если захотите, то самостоятельно поищите нужную информацию, например в файле помощи по mIRC в разделах DCC Resume Protocol, DCC Server Protocol или DCC Socks5 Protocol.
Часть 2 – Ошибки и проблемы DCC протокола в mIRC
Для начала соединяемся с IRC сервером. Затем пишем: //dns $me, а затем //echo -a $ip
Если ваш IP адрес, возвращенный командой //echo, соответствует следующим маскам - 192.168.*.*, 10.*.*.*, или между 172.16.0.0 и 172.31.255.255, тогда пропустите следующие два параграфа.
Если же оба IP адреса одинаковые, тогда скорее всего дело в установленном в системе firewall. Если вы используете Windows XP, попробуйте выключить встроенный firewall. Если же вы используете сторонний firewall, например Zone Alarm, Tiny/Kerio Personal Firewall и т.д., проверьте в них разрешено ли mIRC прослушивать соединения.
Если же оба IP адреса неодинаковые, вводим команду /localinfo -u (когда соединены!), а затем вводим //echo -a $ip снова. Если команда вернет IP, соответствующий любому из DNS, можете продолжать. Попробуйте установить DCC чат с кем-нибудь. И еще, если вы можете установить DCC чат, вы также сможете посылать файлы по DCC.
Если вы не можете установить DCC чат или ваш IP соответствует одному из вышеизложенных видов, тогда скорее всего вы используете для соединения один из видов сети. Многие DSL и другие кабельные модемы используют сеть по умолчанию. Вам следует полистать мануал, чтобы узнать как перекинуть один порт на другой. Если же вы знаете то “прикрепите” 113, 59, и 1500-1510 порты к вашему “внутреннему” IP адресу. Порт 113 используется для идентификации, некоторые сервера запрещают соединения, если данный порт у вас не доступен. Порт 59 – по умолчанию считается портом DCC сервера. Если ваш друг не может послать вам файл, введите /dccserver +s on 59 и он сможет послать вам файл, используя /dcc send ваш_ip. Также для получения “внутреннего” IP используйте Пуск – Выполнить – winipcfg, а если вы используете Windows (2000, NT, и т.д.) вам следует использовать команду ipconfig. Если вам не нравится такой способ, введите в mIRC /localinfo –h, затем //echo -a $ip. Только не забудьте после этого ввести /localinfo –u, для установки всего на свои места.
Если вы перекинули порты, вам следует также сконфигурировать mIRC под них. Открываем опции mIRC (alt+o), открываем ветку 'Connect(Подключение)', в нем ищем 'Options(Настройка)', затем нажимаем кнопку 'Advanced…(Дополнительно)'. Устанавливаем 'Port range for connections' как указано ниже:
Первый: 1500
Последний: 1510
Убедитесь, что чекбоксы 'DCC' и 'Use random ports' включены.
После всего проделанного, потестите DCC чат с другим юзером. Если соединение не установится, прочитайте еще раз параграф про firewall или проверьте еще раз корректно ли были переназначены порты и проверьте диапазон портов в настройках DCC.
Следует отметить и еще один факт, что если DCC чат успешно устанавливается, а DCC отсылка до сих пор не работает, проблема в получателе. Вам обоим следует выключить DCC игнор (в mIRC команда /dcc ignore off), добавить друг друга в DCC список исключений (/dcc trust {nick|address}), а в сетях наподобие Dalnet, еще понадобится ввести команду (например /dccallow +theirnick).
Если же вы на работе, в школе, университете, библиотеке и т.д. и не имеете доступа к конфигурированию настроек как системы, так и различных firewall, то тут есть два способа отсылки файлов. Тем не менее, оба эти способа подразумевают, что юзер, которому вы шлете файлы, принимает соединения.
Метод1: использовать DCC сервер. Юзер получатель должен ввести /dccserver +s on port, где port – порт для получения соединений, по умолчанию 59. Затем, узнайте IP адрес юзера командой /dns nick или спросить его  и наконец ввести /dcc send theirip [file], где theirip – ip юзера, [] в названии файла означает, что можно и не указывать имя файла, тогда появится диалог с выбором файла.
Метод2: намного проще. Т.к. уже начиная с версии mIRC 6.17, автор ввел опцию конфигурирования пассивных DCC отсылок. Используйте /dcc passive {on|off} для включения или выключения их. Использование пассивных DCC запросов добавляет дополнительный параметр к DCC сообщению. Если получатель поддерживает пассивные DCC, он вернет вам DCC сообщение с его IP адресом и прослушиваемым портом, к которому вам следует соединяться. К сожалению не все IRC клиенты поддерживают этот метод.

Часть 3 - Скрипт WhatIsMyIp.com
Используйте этот скрипт для корректной установки вашего IP, когда вы используете сетевое соединение с Интернетом, но используете bnc или другой вид прокси.
; myndzi © / v1.0
; whatismyip.com автоматически конфигурирует локальную информацию
; введите /wimip для установки информации
; Вставлять в Remote(Ремоуты/Скрипты)

; при старте mIRC выключаем группу #wimhost
on *:start: .disable #wimhost

; алиас запуска скрипта, закрываем сокет(вдруг он открыт) и устанавливаем соединение с сайтом
alias wimip sockclose wimip | sockopen wimip www.whatismyip.com 80

; при открытии нашего сокета
on *:sockopen:wimip:{
; если ошибка вырубаемся
if ($sockerr) return
; отсылаем HTTP запрос
sockwrite -n $sockname GET / HTTP/1.1
sockwrite -n $sockname Host: www.whatismyip.com
sockwrite -n $sockname
}

; при получении инфы с сокета
on *:sockread:wimip:{
; если ошибка вырубаемся
if ($sockerr) return
читаем все из сокета в переменную %t
var %t | sockread %t
; читаем до конца инфы
while ($sockbr) {
; если маска есть в переменной
if (** iswm %t) {
; считываем 4 токен из переменной
var %ip = $gettok(%t,4,32)
; устанавливаем найденный ip
localinfo $iif($host == $null,%ip,$host) %ip
; закрываем сокет
sockclose $sockname
; врубаем группу
.enable #wimhost
; чекаем ip
.timer 1 0 .dns $ip
return
}
sockread %t
}
}

on *:sockwrite:wimip:if ($sockerr) return
on *:sockclose:wimip:if ($sockerr) return

#wimhost off
; при dns запросе
on *:dns:{
; если ip запроса и наш айпи совпадают вырубаем группу
if ($dns(1).ip == $ip) .disable #wimhost
; если возвращаемый адрес не пустой, устанавливаем его
if ($dns(1).addr != $null) localinfo $dns(%i).addr $ip
; возвращаем данные
echo -st Local host: $host ( $+ $ip $+ )
}
#wimhost end

Руководство по написанию DLL для mIRC в Delphi. Часть 1.
Описание: Статья познакомит вас с азами написания простейших DLL для mIRC, познакомит с корректными вызовами, результатами выполнения.
------------------------------------------------------------------------------------------------

Руководство по написанию DLL для mIRC в Delphi.
Часть 1.

Все это дело тестировалось и собиралось на mIRC 6.21 и Delphi 7.

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

Итак, начнем.
DLL (Dynamic Link Libraries) – это один из самых быстрых и удобных способов обработки и сбора информации из других приложений или окон, с которыми mIRC не взаимосвязан.
Каждый из вас может сможет создать простенькую DLL, это в принципе просто, не смотря на все устрашающие разговоры на эту тему. DLL маленькие по размеру и многофункциональны по возможностям. Они включают в себя набор процедур и функций для использования в других программах. Так зачем же они нам понадобятся в mIRC? На пример, если вы хотите узнать размер физической памяти своей операционной системы, переключить программно текущую раскладку клавиатуры или же на конец переключить на любимую песенку свой Winamp.
Статья подразумевает, что вы имеете базовые навыки работы с программной средой Delphi, в нашей же статье, мы будем кодить на Delphi 7, наиболее стабильной и ненагруженной лишним хламом версии.

Итак, в Delphi, выбираем меню File и нажимаем New. Из списка выбираем DLL, если в нем нет такого пункта, выбираем Other и там уже ищем DLL. В итоге вы увидите что-то такое:
library Project1;

uses
SysUtils,
Classes;

{$R *.RES}

begin
end.

Для удобства можно выбрать в меню Project подменю Options и на закладке Directories and Conditionals указать путь до папки с mIRC. Теперь после компилирования DLL, она окажется в папке с mIRC.

Пишем нашу первую функцию, которая вернет 'hello world'.
function helloworld(mWnd, aWnd: HWND; data, parms: PChar; show, nopause:boolean) :integer; stdcall;
begin
StrCopy(data,'Hello World!');
Result := 3;
End;

Если вы еще не знаете, то все процедуры и функции в Delphi должны вставляться между uses и begin. Также добавьте unit windows в список uses. На пример:
uses
Windows, SysUtils, Classes;

Итак, разберемся по кусочкам, что означает каждая переменная (взято из файла помощи к mIRC)

mWnd – хэндл главного окна mIRC.
aWnd – хэндл окна в котором должна выполнятся команда, может быть и не только активным окном, если команда вызывается удаленным скриптом.
data – информация, которую вы желаете послать DLL. DLL может заполнить эту переменную командой, которую mIRC должен будет выполнить, если таковая имеется.
parms – переменная заполняется DLL после выполнения параметрами, которыми mIRC должен будет выполнить при выполнении команды из переменной data.
show – переменная может быть FALSE, если префикс . был указан для скрытия выполнения команды, в противном случае TRUE.
nopause – переменная может быть TRUE, mIRC в критической для выполнения процедуре и DLL не должна ничего делать, что может вызвать паузу в процессе, например DLL не должна дать выскочить диалогу

Результаты выполнения функции могут быть следущими:
0 означает, что mIRC должен прервать процесс командой /halt
1 означает, что mIRC должен продолжать процесс
2 означает, что DLL заполнило переменную data командой, которую mIRC должен выполнить, и что заполнило переменную parms параметрами при выполнении команды
3 означает, что DLL заполнило переменную data результатом, который идентификатор $dll() должен вернуть.

Таким образом StrCopy(data,'Hello World!'); просто скопирует строку Hello World в переменную data. Не следует писать так data := 'Hello World';. Результат 3 и будет обозначать, что вам следует использовать идентификатор $dll в mIRC для получения данных из переменной data.

И нам следует добавить еще одну вещь в наш проект перед компилированием, это добавление секции exports. После нашем функции вставьте это:
Exports Helloworld;

Это позволит mIRC иметь доступ к функции внутри нашей DLL под названием helloworld.

Теперь, открываем меню Project и нажимаем подменю Build Project. Все наша DLL готова! Открываем mIRC и пишем //echo -a $dll(project1.dll,helloworld,NOT_USED). И видим надпись Hello World! Нам не нужно использование 3-го параметра, потому что мы не посылаем никаких данных нашей DLL. Если у вас возникли какие то ошибки при компиляции, попробуйте прочитать статью заново или спрашивайте на форуме.

Поздравляю, вы только что создали свою первую DLL

Полный ее исходник выглядит так:
library Project1;

uses
Windows, SysUtils, Classes;

function helloworld(mWnd, aWnd: HWND; data, parms: PChar; show, nopause:boolean):integer; stdcall;
begin
StrCopy(data,'Hello World!');
Result := 3;
End;

exports
helloworld;

{$R *.RES}

begin
end.

А теперь давайте немного усложним задачу и попробуем использовать параметры. Придадим нашей функции следующий вид:

function helloworld(mWnd, aWnd: HWND; data, parms: PChar; show, nopause:boolean):integer; stdcall;
begin
StrCopy(data,'/echo -a Hello World!');
Result := 2;
End;

Компилируем заново и набираем в mIRC команду /dll project1.dll helloworld , которая и вернет нам Hello World! Как видите, мы изменили result на 2. Что и “приказало” mIRC выполнить команду из переменной data, которое имело вид /echo -a.

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

Руководство по написанию DLL для mIRC в Delphi. Часть 2.
Описание: После прочтения первой статьи, мы уже имеем достаточные знания написать что-нибудь посложнее, на пример напишем простенькую DLL для управления известным медиа проигрователем Winamp.
------------------------------------------------------------------------------------------------

После прочтения первой статьи, мы уже имеем достаточные знания написать что-нибудь посложнее, на пример напишем простенькую DLL для управления известным медиа проигрывателем Winamp.

Тестировалось это все опять же на последней версии mIRC и Delphi 7.

Вам наверно часто приходилось видеть во время пребывания в IRC как кто-нибудь кидал на канал, что в данный момент проигрывает его любимая программа Winamp. Делается это с помощью нехитрого плагина, установленного в сам проигрыватель. Сегодня же мы будем писать свою DLL для почти полного управления Winamp и вытаскивания из него нужной информации.

Итак, приступим. Создаем пустую форму для создания DLL как в предыдущей статье и суем туда нашу первую функцию:

function nexttrack(mWnd, aWnd: HWND; data, parms: PChar; show, nopause:boolean):integer;
stdcall; export;
begin
sendmessage(findwindow('Winamp v1.x',nil), WM_COMMAND, 40048,0); //след трек
end;

exports nexttrack;

Сейчас попробуем разобраться как и что работает. Всего 1 строчка, а вы боялись ;) Функция SendMessage посылает специальное сообщение окну. Полный синтаксис и описание можно найти в файле помощи по Delphi. Функция имеет 4 параметра: 1 – окно, которому мы все это шлем; 2 – команда окну; 3 и 4 – специальные параметры для команды. В нашем случае окно мы находим функцией findwindow, где первый параметр это название класса окна, а второй – название заголовка. Естественно для универсальности, мы ищем по классу. Далее шлем команду WM_COMMAND с параметром 40048, который и будет переключать программу на следующий трек. Список всех параметров можно найти на официальном сайте Winamp.

Получаем исходник следующего вида:

library Project2;
uses
windows, messages;

function nexttrack(mWnd, aWnd: HWND; data, parms: PChar; show, nopause:boolean):integer;
stdcall; export;
begin
sendmessage(findwindow('Winamp v1.x',nil), WM_COMMAND,40048,0); //след трек
end;
exports nexttrack;

begin
end.

Компилируем DLL, копируем ее в папку с mIRC, если она еще не там, запускаем Winamp и включаем для проверки песню, далее открываем сам mIRC и пишем команду /dll project2.dll nexttrack и о, чудо Winamp переключил песенку ;)

Для удобства управления, можете забиндить кнопки на управление или же добавить их на панель управления.
 
Сверху