Скоро у меня экзамены - заканчиваю 9 класс. Решил сделать ICQ-бота, который выступит в роли шпаргалки. Вдруг попадется билет, который я не знаю. Все билеты учить, разумеется, лень, а хорошую оценку ой как хочется. Итак, как же будет работать наша программа?
Принцип таков: Мы отправляем номер билета боту, он в соответствии с предварительно составленной «базой» отправляет нам ответ. Как полагается, начнем с интерфейса. Для начала нам потребуется компонент ICQClient. Наверняка у тебя его нет, поэтому скачиваем по этой ссылке.
Как его установить?
Кидаем на форму компоненты:
Принцип таков: Мы отправляем номер билета боту, он в соответствии с предварительно составленной «базой» отправляет нам ответ. Как полагается, начнем с интерфейса. Для начала нам потребуется компонент ICQClient. Наверняка у тебя его нет, поэтому скачиваем по этой ссылке.
Как его установить?
1) Открываем TICQClient.dpk;
2)Переходим в меню Tools -> Environment Options -> Library;
3)Жмем кнопку "..." напротив Library path;
4)Добавляем путь к папке, где лежит компонент;
5)Возвращаемся к окну с открытым .dpk, жмем Compile и Install по очереди;
На вкладке Samples палитры компонентов должен появится наш компонент.
- 1 Memo с именем ICQLog;
- 2 Edit с именами UINEdit и PasswordEdit;
- 2 Button с «кепшинами» - «Онлайн» и «Оффлайн», и именами OnlineBtn и OfflineBtn соответственно;
- 1 Label, переименованный в ICQStatus;
- 1 Timer;
- 1 ICQClient, переименованный в ICQ;
procedure TForm1.ICQOnlineClick(Sender: TObject); begin // Проверяем корректность введеных значений if (UINEdit.Text = '') or (PasswordEdit.Text = '') then // если поля пусты, то предупреждаем об этом пользователя MessageDlg('Поля UIN и Пароль не должны быть пустыми!',mtError,[mbYes],0) else // Пытаемся подключиться begin ICQ.UIN := StrToInt(UINEdit.Text); ICQ.Password := PasswordEdit.Text; ICQ.Login(); ICQLog.Lines.Add('Соединение сервером ICQ... '); end; end;
Тут проверяем корректность введеных значений, если поля введены корректно то подключаемся и пишим в лог (ICQLog) «Соединение сервером ICQ... »
Обработчик нажатия на кнопку «Оффлайн» довольно прост и понятен:
procedure TForm1.ICQOflineClick(Sender: TObject); begin ICQ.Disconnect; end;
Далее мы проверяем подключились ли мы. Для этого у ICQ создаем обработчик события OnLogin.
procedure TForm1.ICQLogin(Sender: TObject); begin if ICQ.LoggedIn then begin ICQStatus.Caption := 'Онлайн'; // Меняем «статус» подключения OnlineBtn.Enabled := False; // Отключаем кнопку Онлайн OfflineBtn.Enabled := True; // Включаем кнопку Оффлайн Timer1.Enabled := True; // ...и таймер end else begin // Тут все, практически, наоборот ICQStatus.Caption := 'Оффлайн'; OnlineBtn.Enabled := True; OfflineBtn.Enabled := False; Timer1.Enabled := False; end; end;
Если (ICQ.LoggedIn) равно True мы «Онлайн», False мы «Офлайн».
procedure TForm1.Timer1Timer(Sender: TObject); begin ICQ.SendKeepAlive; // Даем знать серверу, чтомы все еще Онлайн if ICQ.LoggedIn then // Дальше ты уже знаешь что происходит :-) begin ICQStatus.Caption := 'Онлайн'; OnlineBtn.Enabled := False; OfflineBtn.Enabled := True; Timer1.Enabled := True; end else OfflineBtn.Enabled := False; Timer1.Enabled := False; end; End;
SendKeepAlive нужно отсылать на сервер каждые 2 минуты чтобы давать знать что мы еще весим в «Онлайн»
В событие OnError все того же компонента ICQ суём вот такое:
procedure TForm1.ICQError(Sender: TObject; ErrorType: TErrorType; ErrorMsg: String); begin ICQLog.Lines.Add('Ошибка при подключении. '); // Логируем событие Timer1.Enabled := False; // Отключаем таймер End;
Вот и дошли до самого главного - событие OnMessageRecv. Оно позволяет получать входящие сообщения. В папке, например, «Информатика» будут хранится *.txt-файлы, которые проименованы по номерам билетов.
Здесь мы обрабатываем входящее сообщение. Отправлять боту мы будем только номер билета. А бот, если существует файл с таким именем (номером вопроса), открывает нужный файл, считывает ответ на вопрос билета и отсылает обратно.
procedure TForm1.ICQMessageRecv(Sender: TObject; Msg, UIN: String); var f: TextFile; // Текстовый файл, который будем открывать bilet: String; // Содержимое файла begin ICQLog.Lines.Add(UIN + ': ' + Msg); // Логируем входящее сообщение if FileExists('Информатика\' + Msg + '.txt') then begin // Если существует запрошенный файл... AssignFile(f,'Информатика\' + Msg + '.txt'); Reset(f); // ...то открываем его для чтения While not Eof(f) do // И до конца файла ReadLn(f, bilet); // Считываем каждую строку ICQ.SendMessage(StrToInt(UIN), bilet); // Посылаем готовое сообщение ICQLog.Lines.Add(UINEdit.Text + ': ' + bilet); // и снова логируем CloseFile(f); // Освобождаем файл, т.к. больше он нам не понадобится end else // А если запрошенного билета (файла) нет begin // Посылаем соответствующее сообщение клиенту ICQ.SendMessage(StrToInt(UIN),'Такого билета не существует!'); // И логируем ICQLog.Lines.Add(UIN + ' : Такого билета не существует!'); end; end;
Вначале кода мы добавляем в лог уин того кто нам прислал сообщение, и содержимое. Далее мы проверяем на существования файла в папке «Информатике», если файл существует мы связываем переменную «f» с файлом, и открываем файл для чтения.И до конца строкмы добавляем в переменную «bilet» текст и предаем содержимое.Нам не нужно рыться в каком либо коде и изменять переменные где содержится информация о билета, нам придется всего лишь зайди в папку и добавить *.txt файл с номером билета. Программа откроет нужный файл при небходимости и отправит его содержимое.Вот и подходит к концу данная статья, мы рассмотрели компонент ICQClient и научилсь им пользоваться, сделали простенький бот который будет небольшой шпаргалкой на экзамене.
Комментариев нет:
Отправить комментарий
Сделай автору приятно - оставь комментарий!