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

Delphi Простенький IRC-клиент на Delphi

Тема в разделе "PR0GRAMM1NG", создана пользователем ddd, 27 июн 2011.

  1. ddd (•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿

    ddd
    TS
    Команда форума WebOwner WebVoice
    Регистрация:
    5 мар 2007
    Сообщения:
    2.898
    Симпатии:
    191
    ICQ:
    943084
    Потребность в написании собственной софтины с поддержкой IRC-протокола возникла у меня не так давно. В «интернетах» видел различные реализации IRC-клиентов. Сначала бросил свой взгляд в сторону ActiveIRC, но потом решил не заморачиваться с ним и поработать с idIRC (как минимум, в шестой версии Borland Delphi уже должен быть). Чем может быть полезен IRC-клиент? Ну, во-первых, практика – в жизни всё может пригодиться. Во-вторых, можно поиграться и написать собственный бот (особенно, если нет времени или желания изучать mIRC-скриптинг).

    [​IMG]

    Итак, что понадобится: на форму кидаем 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 – ну, и так понятно
    По идее, этого вполне достаточно для обработки основных событий, которые могут возникнуть.

    Источник: alex-romanov.net