Исполнение желаний читателей
Если помнишь, пару месяцев назад я предложил читателям придумать свою тему
для кодинга. И, соответственно, удовлетворить самые популярные требования в
своей статье. Настало время воплотить этот план в жизнь. Сегодня мне в руки
попало письмо от "ViT" (noginsk@rambler.ru).
Он предложил мне рассказать о создании своего IRC-клиента с использованием
компонента ActiveIRC. Что ж, я просто не могу ему отказать :).
На самом деле, есть много способов написания IRC-клиента. Во-первых, это
прямая работа с IRC-протоколом. Дело весьма напряжное, и помочь в нем тебе
сможет либо старый добрый Indy, либо библа WSocket из комплекта
интернет-компонентов ICS (Internet Component Suite). Собственно, если посмотреть
на
www.torry.net/irc.htm - список наиболее популярных
IRC-компонентов, можно обнаружить, что большая их часть именно так и поступает -
использует Indy либо WSocket. Заметь, при этом они не стесняются требовать у
тебя десятки долларов за использование их софта. Компонент ActiveIRC лишен этого
недостатка, поэтому именно про него я сегодня и расскажу.
ActiveIRC Component
Представляет он собой обычный бесплатный ActiveX компонент. В поставку
компонента входит файл "ActiveIRC installer.exe" плюс документация. По большому
счету, никакой документации к нему и не требуется - все предельно ясно, но для
интереса можно и ознакомиться - там есть описание нескольких полезных функций.
После запуска обозначенного exe-файла тут же появится сообщение... об удачной
установке. Но радоваться еще рано, т.к. если ты запустишь Delphi и откроешь в
компонентах вкладку "ActiveX", то, разумеется, ничего не найдешь. Почему? Да
потому, что разбаловались Вы, батенька, и привыкли, что инсталлятор делает все
за Вас. На самом же деле он только переносит свой OCX файл в WINDOWS\SYSTEM, а
регистрировать его придется уже ручками: component -> import ActiveX control ->
ActiveIrc ActiveX -> выбрать файл Activeirc.ocx из системного каталога и
инсталлировать его. Теперь он появится во вкладке ActiveX, и его можно смело
класть на форму.
Create form
Наша форма будет довольно простой, состоящей из следующих элементов: 4
компонента Edit, 4 Кнопки, 3 Label, 1 Memo и собственно сам ActiveIRC. Результат
формы смотри на рис.1.
А теперь проставим названия:
Label1 - свойство "caption" - "Сервер:"
Label2 - свойство "caption" - "Порт:"
Label3 - свойство "caption" - "Ник:"
Button1 - свойство "caption" - "CONNECT"
Button2 - свойство "сaption" - "JOIN"
Button3 - свойство "caption" - "Leave"
Button4 - свойство "caption" - "Сказать"
Label'ы 1-3 будут сопровождать соответствующие Edit'ы. Также можешь создать
Edit'ы для ввода других данных, которые могут тебе понадобиться. Для них
существуют свойства Email, FullName и Ident (в последнем обычно прописано "localhost").
У каждой кнопки есть свой caption. Он соответствует назначению каждой кнопки.
Например, Button1 - CONNECT, отвечает за соединение с сервером. JOIN - зайти на
канал.
В общем-то, можно обойтись и без батонов - вместо них написать обработчик
OnKeyDown для Edit4 (в нем мы будем писать наши сообщения). Например, обработка
команды "/JOIN #LOVE" сведется к удалению из строки всех символов от "/" до "#"
и запуску процедуры: ActiveIrc1.Join ('#LOVE');.
Коннект и общение
Для коннекта к серверу и передачи данных о пользователе мы с тобой слепили
кнопку "CONNECT". Давай посмотрим на ее событие OnClick:
ActiveIrc1.server:= edit1.Text;
ActiveIrc1.port:= strtoint (edit2.text);
ActiveIrc1.nick:= edit3.Text;
ActiveIrc1.Connect;
Правда, здесь я прописываю не все свойства, а только те, без которых трудно
обойтись. Далее вызовом метода Connect запускаем процесс соединения.
Как ты, наверное, догадался, главным компонентом у нас будет Memo1. Именно в
нем будут отображаться все сообщения. А поскольку каждое сообщение - это уже
событие (я имею в виду Event), давай создадим необходимые обработчики:
OnConsole - как только ты получаешь очередную порцию данных, например,
служебная инфа от сервера, активизируется это событие. Единственное, что оно
может дать - это переменную text, содержащую в себе само сообщение, поэтому
пиши: memo1.lines.add (text);.
OnIRCReady - когда IRC-сервак будет готов принимать твои команды и свойство
IsConnected примет значение TRUE, вызывается этот Event. В его обработчик
достаточно написать, допустим, уведомление об этом: Memo1.Lines.Add ('Готов к
труду и обороне!');.
OnMessage - сообщение, отправленное любым пользователем на канале, активирует
этот Event. Естественно, что и возвращает он нам: channel - имя канала, user -
ник юзера, text - собственно само сообщение. В его обработчик я написал:
memo1.Lines.Add('('+channel+')'+user+'> '+text);. Заметь, что в этом случае к
каждой мессаге будет приплюсовываться имя канала, с которого она отправлена. Это
необходимо, если пользователь беседует на нескольких каналах, а при этом для
чата используется всего одно окно. Вот пример такого сообщения:
(#Xakep)Petrovis> Да, наш админ тоже этим страдает :).
OnPrivateMessage - если какой-нибудь пользователь соизволил сделать на тебя /msg,
т.е. отправить личное сообщение, придется обработать этот Event. Как это сделать
- решать тебе (тут большой простор для фантазии, особенно для бывалого скриптера),
но я сделал просто:
memo1.Lines.Add('Приват от '+user+'--> '+text);
OnUserJoins - в его обработчик ты можешь записать реакцию на приджойнившегося
к каналу юзера. Я сделал простое уведомление:
memo1.Lines.Add('Пришел товарищ '+user+' на канал: '+channel+'!');
Ничто не мешает тебе сделать автоматическое приветствие в духе:
IF User = 'Petya' then ActiveIRC.Say (Edit5.text, 'Привет, уважаемый! Давно ждал тебя :)');
OnUserKick - когда скрипты только входили в моду, это событие было крайне
необходимо для любителей сетевых разборок. После того как на канале кто-то
кого-то кикнет, в твое распоряжение поступят константы: channel - канал,
kickedby - имя обидчика, UserKicked - имя обиженного, Reason - основание. Как
реагировать на это событие - решать тебе.
OnUserQuits - твоя реакция на чей-то уход с канала. В этом событии содержится
имя покинувшего IRC-сервер пользователя.
События изучили, теперь перейдем к самому кодингу. Начнем с OnClick для
кнопки "JOIN": ActiveIrc1.Join(edit5.Text), а в OnClick для "LEAVE",
соответственно - ActiveIrc1.Leave;. Чтобы послать сообщение на канал или лично
юзеру, нам понадобится кнопка "Сказать". Строчка
ActiveIrc1.Say(edit5.Text,edit4.Text); позволит отправить на канал сообщение из
Edit5 (Edit4 - это имя канала), но если первым аргументом будет прописан чей-то
ник, то у этого пользователя откроется окно с приват-сообщением.
Полезные функции
Помимо той основы, что я описал, у этого компонента присутствуют еще
несколько интересных функций:
boolean Raw(string: command) - напрямую отправляет команду IRC-серверу без
обработки ActiveIRC. В случае успеха возвращает TRUE.
boolean CTCPRequest(string nick, string ctcp, string info) - направляет
пользователю CTCP-запрос. Очень поможет, если тебе захочется узнать:
VERSION - версию его IRC-софта.
PING - пинг к юзеру.
TIME - локальное время юзера. Действительно, это бывает полезным, особенно
если ты любишь разговаривать с иностранцами.
boolean CTCPReply(string nick, string ctcp, string reply) - отвечает на
CTCP-запрос.
boolean GetChannelMode(string channel, string mode) - возвращает тебе режим,
в котором работает канал. Например:
i - invite only. Если ты не относишься к приглашенным - извини. Вход закрыт.
M - Moderated.
N - No external messages.
T - только ОПы могут устанавливать темы.
boolean GetUserMode(string channel, string user, string mode); - то же самое,
но для пользователя. В данном случае он может быть либо о (ОП), либо v (войс).
И вновь продолжается бой!
Что ж, теперь у тебя в руках есть все необходимое. Осталось только напрячь
свою фантазию, сделать красивый интерфейс и выложить полученный результат в инет
для общего скачивания. Не будь жадным - выкладывай все бесплатно, а по
возможности давай и сорсы. Так у тебя больше шансов быть замеченным. Вдруг ты
задвинешь mIRC своим супернавороченным клиентом :).
P.S. И как обычно - готовый вариант программы вместе с сорсами бери с
www.xakep.ru или с нашего компакт-диска. Удачи!
Альтернативный вариант
Как я уже говорил, этот компонент далеко не единственный. Их довольно много,
правда, практически все они плохие. Но один из них все-таки стоит выделить -
компонент XiRC от простого мексиканского парня Martin Bleakley. Дело в том, что
этот господин выбрал верный путь - он программил свой компонент с использованием
Indy 8.0. Это его первый компонент и к тому же freeware.
Качай его с
www.torry.net/vcl/internet/irc/mbxirc.zip , т.к. собственный сайт
и мейл этого господина накрылись еще года полтора назад, и все мои попытки
сказать ему пару ласковых не увенчались успехом.
К компоненту прилагаются 2 демы, причем вторая - практически готовый
IRC-клиент. Но учти, что работать он у тебя не будет. Просто потому, что Мартин
забыл сказать, что для его оформления он использовал компоненты FlatStyle (их я
тоже положил на диск, а вообще их можно качать с
www.torry.net/vcl/packs/interfacemiddle/flatstyl.zip). Эта
коллекция - просто красивые аналоги дельфийских компонентов, но их отсутствие
грозит тебе изрядными проблемами с запуском его демы.
|