21
Свой IRC-клиент на Delphi
Потребность в написании собственной софтины с поддержкой 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.Connect();
idIrc1.Join (channel);
В обработчике событий idIRC1.OnJoined должно быть следующее:
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;
Таким образом, мы получили список пользователей на конкретном канале и заполнили им ListBox1.
Теперь в обработчике событий idIRC1.onMessage добавляем:
if AChannel <> nil then
Memo1.Lines.Add ('<' + AUser.Nick + '> ' + content)
else
Memo1.Lines.Add ('> приват от ' + AUser.Nick + ': ' + content);
На всякий случай: AUser — пользователь, написавший сообщение (в приват или на канал — значения не имеет), AChannel — канал (если nil — значит в приват) и Content — собственно сообщение. Когда основная часть клиента будет дописана, можно вполне заменить TMemo на TRichEdit и прикрутить обработчик цветов. Ах, и чуть не забыл: желательно также будет отображать и время события, отображаемого в Memo1 (на том, как это сделать, останавливаться не буду).
Теперь в обработчике 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 — ну, и так понятно ![]()
По идее, этого вполне достаточно для обработки основных событий, которые могут возникнуть.
Если напишете что-то интересное или вовсе гениальное — хвастайтесь.
2 коммент. к записи “Свой IRC-клиент на Delphi”
Оставить комментарий
Последние комментарии
- Кос к записи Совсем немного Кирово-Чепецка
- UnKnOwn к записи Непонимашки февраля и марта
- Алексей к записи Железнодорожные билеты в кредит
- StM к записи Железнодорожные билеты в кредит
- Алексей к записи Непонимашки февраля и марта
- UnKnOwn к записи Непонимашки апреля
- UnKnOwn к записи Непонимашки февраля и марта
- Алексей к записи Кирово-Чепецк
- Алексей к записи Непонимашки апреля
- Алексей к записи Непонимашки февраля и марта
Облачко
Ссылки
- Строительство и реконструкция: коттедж. Строительство домов, коттеджей. .
StM пишет:
Эпично: изучать целый протокол IRC и устраивать себе головомойку для написания тех же алиасов лишь бы не выучить пару команд и работу токенов в скриптинге.
Алексей пишет:
@StM: ну, для чего именно я писал ирц-клиент, ты и сам в курсе + для одного рабочего прожекта пригодились возможности ирц-протокола.