Потребность в написании собственной софтины с поддержкой IRC-протокола возникла у меня не так давно. В «интернетах» видел различные реализации IRC-клиентов. Сначала бросил свой взгляд в сторону ActiveIRC, но потом решил не заморачиваться с ним и поработать с idIRC (как минимум, в шестой версии Borland Delphi уже должен быть). Чем может быть полезен IRC-клиент? Ну, во-первых, практика – в жизни всё может пригодиться. Во-вторых, можно поиграться и написать собственный бот (особенно, если нет времени или желания изучать mIRC-скриптинг).
Итак, что понадобится: на форму кидаем TListBox (для вывода туда списка пользователей IRC-канала) и два TMemo или TMemo и TEdit (окно с чатом и строка для ввода текста). Располагаем примерно так, как на скриншоте илл как-то по-своему. Ну, и самое основное – idIRC (со вкладки Indy Clients на палитре компонентов). Первоначально этого хватит, все напантовки (менюшку, форму с авторизацией и т.п.) можно добавить потом.
Самое основное: в свойствах idIRC прописываем:
• Host – сервер (например, irc.forestnet.org)
• Port – порт (6667 или 6669)
• Nick – имя пользователя
• AllNick – запасной ник (вдруг первый уже кем-то занят)
• Password – пароль (если не зарегистрированы, можно оставить поле пустым)
• Replies – всё, что будет отображаться при запросе User Info (можно задать, например, название и версию клиента).
В принципе, этого достаточно.
Если вы уже прикрутили форму с авторизацией – отлично, если нет – тоже неплохо. Объявляем глобальную переменную (или константу) типа string, присваиваем имя канала (например ‘#yoohoo’). Прописываем в нужном событии (во втором случае – это Form.OnCreate) следующее:
В обработчике событий idIRC1.OnJoined должно быть следующее:
Таким образом, мы получили список пользователей на конкретном канале и заполнили им ListBox1.
Теперь в обработчике событий idIRC1.onMessage добавляем:
На всякий случай: AUser – пользователь, написавший сообщение (в приват или на канал – значения не имеет), AChannel – канал (если nil – значит в приват) и Content – собственно сообщение. Когда основная часть клиента будет дописана, можно вполне заменить TMemo на TRichEdit и прикрутить обработчик цветов. Ах, и чуть не забыл: желательно также будет отображать и время события, отображаемого в Memo1 (на том, как это сделать, останавливаться не буду).
Теперь в обработчике TEdit или TMemo onKeyPress пишем:
Тем самым, помимо сообщений, оставляемых пользователями на канале, мы будем также видеть и системные сообщения сервера.
Ну вот, даже этого уже достаточно, чтобы запустить наш «клиент» и посмотреть как он будет работать. При запуске (или нажатии соответствующей кнопки на форме авторизации) наш «клиент» будет подключаться к серверу, заходить на нужный канал (до подключения сразу к нескольким каналам и переключения окошек с ними нам ещё далеко), получать список пользователей канала (он, кстати, обрабатываться должен вручную – при возникновении определённых событий), ну и сможет отправлять сообщения на канал и получать их. Этого вполне достаточно (даже можно было обойтись и без списка пользователей), чтобы написать простенький IRC-бот, который что-нибудь бы там делал.
Но всё же лучше разобраться с остальными событиями idIRC, для чего они нужны:
• onAway – когда какой-нибудь пользователь меняет статус на «away» (нет на месте)
• onBan – когда кого-то банят (в т.ч. и вас)
• onConnect и onConnected – когда только начинаем устанавливать соединение и когда соединение уже установлено
• onOp и onDeop – когда кого-то назначают опом или когда кого-то разжаловали из операторов
• onVoice и onDevoice – когда кому-то дали войс или отобрали его
• onDisconnect и onDisconnected – когда только задумали отключиться (там ещё всё поправимо) и когда уже отключились
• onJoin и onJoined – когда только заходим на канал и когда уже зашли на него
• onKick и onKicked – когда кого-то кикнули и когда кикнули вас
• onNickChange и onNickChanged – когда кто-то меняет ник, и когда ник меняете вы
• onNickIsInUse – когда выбранное имя уже кем-то используется и даже запасной ник не помогает (можно, например, приписать случайные символы к выбранному нику)
• onPart и onParted – когда кто-то покидает канал, и когда вы сами покинули канал
• onPingPong – ну, и так понятно
По идее, этого вполне достаточно для обработки основных событий, которые могут возникнуть.
Источник: alex-romanov.net

Итак, что понадобится: на форму кидаем TListBox (для вывода туда списка пользователей IRC-канала) и два TMemo или TMemo и TEdit (окно с чатом и строка для ввода текста). Располагаем примерно так, как на скриншоте илл как-то по-своему. Ну, и самое основное – idIRC (со вкладки Indy Clients на палитре компонентов). Первоначально этого хватит, все напантовки (менюшку, форму с авторизацией и т.п.) можно добавить потом.
Самое основное: в свойствах idIRC прописываем:
• Host – сервер (например, irc.forestnet.org)
• Port – порт (6667 или 6669)
• Nick – имя пользователя
• AllNick – запасной ник (вдруг первый уже кем-то занят)
• Password – пароль (если не зарегистрированы, можно оставить поле пустым)
• Replies – всё, что будет отображаться при запросе User Info (можно задать, например, название и версию клиента).
В принципе, этого достаточно.
Если вы уже прикрутили форму с авторизацией – отлично, если нет – тоже неплохо. Объявляем глобальную переменную (или константу) типа string, присваиваем имя канала (например ‘#yoohoo’). Прописываем в нужном событии (во втором случае – это Form.OnCreate) следующее:
Код:
idIrc1.Connect();
idIrc1.Join (channel);
Код:
var i: integer;
begin
try
i:=0;
ListBox1.Clear;
for i := 0 to iDiRC1.Users.Count - 1 do
ListBox1.Items.Add(iDiRC1.Users.Items[i].Nick);
except
ListBox1.Items.Add('Что-то не так...');
end;
Теперь в обработчике событий idIRC1.onMessage добавляем:
Код:
if AChannel <> nil then
Memo1.Lines.Add ('<' + AUser.Nick + '> ' + content)
else
Memo1.Lines.Add ('> приват от ' + AUser.Nick + ': ' + content);
Теперь в обработчике TEdit или TMemo onKeyPress пишем:
Код:
if (length(Edit1.text)=0) or (Key <> #13) then
begin
Memo1.Lines.Add ('<' + idIRC1.Nick + '> ' + Edit1.Text;
idIRC1.Say (channel, Edit1.text);
end;
В idIRC1.OnAction прописываем:
Memo1.Lines.Add ('*** ' + Content);
Ну вот, даже этого уже достаточно, чтобы запустить наш «клиент» и посмотреть как он будет работать. При запуске (или нажатии соответствующей кнопки на форме авторизации) наш «клиент» будет подключаться к серверу, заходить на нужный канал (до подключения сразу к нескольким каналам и переключения окошек с ними нам ещё далеко), получать список пользователей канала (он, кстати, обрабатываться должен вручную – при возникновении определённых событий), ну и сможет отправлять сообщения на канал и получать их. Этого вполне достаточно (даже можно было обойтись и без списка пользователей), чтобы написать простенький IRC-бот, который что-нибудь бы там делал.
Но всё же лучше разобраться с остальными событиями idIRC, для чего они нужны:
• onAway – когда какой-нибудь пользователь меняет статус на «away» (нет на месте)
• onBan – когда кого-то банят (в т.ч. и вас)
• onConnect и onConnected – когда только начинаем устанавливать соединение и когда соединение уже установлено
• onOp и onDeop – когда кого-то назначают опом или когда кого-то разжаловали из операторов
• onVoice и onDevoice – когда кому-то дали войс или отобрали его
• onDisconnect и onDisconnected – когда только задумали отключиться (там ещё всё поправимо) и когда уже отключились
• onJoin и onJoined – когда только заходим на канал и когда уже зашли на него
• onKick и onKicked – когда кого-то кикнули и когда кикнули вас
• onNickChange и onNickChanged – когда кто-то меняет ник, и когда ник меняете вы
• onNickIsInUse – когда выбранное имя уже кем-то используется и даже запасной ник не помогает (можно, например, приписать случайные символы к выбранному нику)
• onPart и onParted – когда кто-то покидает канал, и когда вы сами покинули канал
• onPingPong – ну, и так понятно
По идее, этого вполне достаточно для обработки основных событий, которые могут возникнуть.
Источник: alex-romanov.net