Авторские статьи Простейший IRC-клиент на Delphi, средствами INDY.

Discussion in 'Статьи' started by begin_end, 7 Mar 2007.

  1. begin_end

    begin_end Green member

    Joined:
    4 Jan 2007
    Messages:
    265
    Likes Received:
    638
    Reputations:
    476
    Целью данной статьи было освещение возможностей среды разработки приложений Borland Delphi в создании клиента IRC-чата, при использовании INDY-компонента idIRC. А также приведение примера такого, уже созданного автором клиента, с наличием всех базовых возможностей IRC. К статье прилагается прокомментированный исходный код и скомпилированное приложение (СКАЧАТЬ ЗДЕСЬ).

    Статья рассчитана на читателей, умеющих создавать на Delphi простейшие приложения, хорошо знакомых с синтаксисом среды. Некоторые термины, применяемые здесь:
    INDY – Internet Dyrect, набор компонентов для Delphi, ориентированный преимущественно на работу с сетевыми функциями.
    idIRC – INDY компонент для клиентской работы в чате IRC, полностью обеспечивающий весь функционал IRC.


    Поставленная для рассмотрения задача. ПО «Simple IRC Client» (далее sIRC) должно иметь следующие возможности: возможность задать ник, второй ник, имя пользователя и пароль (для авторизованного входа); возможность соединения с любым выбранным IRC-сервером, возможность входа на указанный IRC-канал и возможность передавать туда сообщения (простые, NOTICE, ACTION); получение списка пользователей; приём всех сообщений (как пользовательских, так и сервисных).

    Создание основы приложения: форм и их элементов.
    Начнём процесс решения данной задачи с определения количества необходимых форм, исходя из предполагаемых пользовательских действий. Очевидно, что будет базовая главная форма с окном сообщений (классический вариант). Должна быть ещё: форма настроек пользователя, форма входа на сервер и форма входа на канал. Итого:

    [​IMG]

    Форма SIRC содержит меню (Файл: Подключиться, Войти на канал, Выйти из канала, Отключиться, Настройки, Выход), многострочное поле типа Memo, ListBox (для вывода списка пользователей) и Edit для ввода текста. Также имеются кнопки для сообщений типа NOTICE и ACTION. И на форме лежит компонент idIRC.
    Form1 имеет 5 полей ввода (для: ник, ник2, реальное имя, имя пользователя, пароль) и две кнопки.
    Form2 – с двумя полями ввода (сервер и порт) и кнопкой.
    Form3 – одно поле ввода для задания имени канала и кнопка.

    Программирование приложения: связь элементов форм, работа с idIRC.
    Ход работы приложения: запуск, задание настроек пользователя (Form1), подключение к серверу (Form2) с данными из Form1. При удачном подключении – вывод сообщения об этом. Далее ожидание ответа сервера в виде информационных сообщений. Вход на канал, задаваемый в Form3. При удачном входе – получение списка пользователей на канале и внесение их в ListBox на форме SIRC. Постоянное ожидание и приём обычных сообщений, а также: приём сообщений о изменении статуса пользователей, о кике и о выходе из канала или чата, приём пинг-понг, приём сообщений типа action (/me) и notice. При вводе текста в поле ввода на форме SIRC его отправка по нажатию на ввод, как обычного текста с одновременным добавлением в своё окно. При клике правой кнопкой мыши по пользователю в ListBox – попытка кика.
    Для того, чтобы всё это работало, отследим следующие события idIRC:

    Code:
       1.  procedure IdIRC1System(Sender: TObject; AUser: TIdIRCUser;
          ACmdCode: Integer; ACommand, AContent: String);
       2.  procedure IdIRC1Message(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel; Content: String);
       3.  procedure IdIRC1PingPong(Sender: TObject);
       4.  procedure IdIRC1Connected(Sender: TObject);
       5.  procedure IdIRC1Kick(Sender: TObject; AUser, AVictim: TIdIRCUser;
          AChannel: TIdIRCChannel);
       6.  procedure IdIRC1Kicked(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel);
       7.  procedure IdIRC1NickChange(Sender: TObject; AUser: TIdIRCUser;
          ANewNick: String);
       8.  procedure IdIRC1Join(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel);
       9.  procedure IdIRC1Part(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel);
       10.  procedure IdIRC1Deop(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel; ATarget: TIdIRCUser);
       11.  procedure IdIRC1Devoice(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel; ATarget: TIdIRCUser);
       12.  procedure IdIRC1Voice(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel; ATarget: TIdIRCUser);
       13.  procedure IdIRC1Op(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel; ATarget: TIdIRCUser);
       14.  procedure IdIRC1Quit(Sender: TObject; AUser: TIdIRCUser);
       15.  procedure IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
          AContent: String; var Suppress: Boolean);
       16.  procedure IdIRC1Action(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel; Content: String);
       17.  procedure IdIRC1Notice(Sender: TObject; AUser: TIdIRCUser;
          AChannel: TIdIRCChannel; Content: String);
    
    
    1. приём системных сообщений;
    2. приём сообщения от пользователя;
    3. приём сообщения «пинг-понг»;
    4. событие успеха соединения с сервером;
    5. приём сообщения о кике юзера юзером;
    6. если кикнули текущего пользователя;
    7. приём сообщения о изменении ника;
    8. сообщение о входе пользователя;
    9. сообщение о выходе пользователя;
    10. если сняли статус оператора с пользователя;
    11. если сняли статус войса с пользователя;
    12. сообщение о даче войса пользователю;
    13. сообщение о даче статуса оператора пользователю;
    14. приём сообщения о выходе из IRC;
    15. приём любого сообщения (т.е. всех);
    16. приём сообщения типа «action»;
    17. приём сообщения типа «notice».

    Все настройки из Form1 хранятся в реестре, за исключением пароля. При нажатии на элементы меню меняется их статус (включены/выключены). Для подключения к серверу используется процедура IdIRC1.Connect с предварительно заданными значениями информации пользователя, сервера и его порта. Для входа на канал используется процедура IdIRC1.Join(‘имя канала’). Соответственно выход из канала: idIRC1.Part(‘имя канала’, ‘текст') и отключение от сервера - idIRC1.Disconnect. Список пользователей следует получать при входе на канал в iDiRC1.Users, а далее обрабатывать самостоятельно входы/выходы на канал, меняя этот список (сам он не изменяется при действиях, заполняясь лишь единократно). При выходе список пользователей очищается процедурой iDiRC1.Users.Clear. Отправка сообщения notice: idirc1.Notice(‘канал’,’текст’). Отправка сообщения action: idirc1.Action (‘канал’,’текст’). Отправка команды кика: idIRC1.Kick (‘канал’,’юзер’,'причина').

    Заключение.
    При работе над ПО sIRC использовалась среда разработки Дельфи 7.0. Для придания sIRC завершённого вида использовался редактор ресурсов Restorator 3.51, упаковщик исполняемых файлов UPX 1.95. Весь код данного ПО, кроме автокода модулей Дельфи, был написан автором.

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

    PS: Если возникнут вопросы по разработке IRC-клента, можно сразу обращаться ко мне. Охотно помогу всем, чем смогу.
     
    _________________________
    #1 begin_end, 7 Mar 2007
    Last edited: 7 Mar 2007
    10 people like this.