Выложу по мене разработки несколько примеров по использованию обработчиков событий (ивентов, эвентов, кому как нравится).
Превый пример будет по использованию протокола ICQ:
Code: Select all
program Informer;
const
ManagerUIN = 0000000000;//Номер учетной записи ICQ для менеджера
ManagerPass = '********';//Пароль учетной записи ICQ для менеджера
ParentUIN = 000000000;//Номер учетной записи, для которой разрешено подавать команды скрипту
var
Terminated: Boolean;
procedure OnICQDisconnect;
begin
//В случае непредвиденного дисконекта попытаемся снова подключиться к серверу
ICQConnect(IntToStr(ManagerUIN), ManagerPass);
end;
procedure OnICQError(Text: String);
begin
//При ошибке службы ICQ делаем запись в лог и отключаемся от сервера
AddToSystemJournal('Ошибка ICQ: ' + Text);
ICQDisconnect;
end;
procedure OnICQIncomingText(UIN: Cardinal; Text: String);
begin
//Если команды поступают от доверенной учетной записи, то отрабатываем их.
if UIN = ParentUIN then begin
if Text = 'stop' then begin
AddToSystemJournal('Получена удалённая команда оставновки скрипта');
Terminated := True;
end else begin
ICQSendText(IntToStr(UIN), Text + ': ' + FloatToStrF(GetSkillValue(Text), ffFixed, 3, 1));
end;
end;
end;
begin
//Установим обработчики событий
SetEventProc(evICQDisconnect, 'OnICQDisconnect');
SetEventProc(evICQError, 'OnICQError');
SetEventProc(evICQIncomingText, 'OnICQIncomingText');
//подключаемся к серверу ICQ
ICQConnect(IntToStr(ManagerUIN), ManagerPass);
while not Terminated do begin
//некоторые выполняемые в цикле действия.
Wait(2000);
end;
//Отключаем обработчики событий
SetEventProc(evICQDisconnect, '');
SetEventProc(evICQError, '');
SetEventProc(evICQIncomingText, '');
//Отключаемся от сервера ICQ и Ультимы
ICQDisconnect;
Disconnect;
end.
В начале работы скрипта через SetEventProc устанавливаются обработчики событий отключения от ICQ, ошибки при работе с ICQ и получени сообщения, после чего устанавливается подключение к серверу ICQ (через ICQConnect). Далее скрипт в цикле выполняет свои основные функции (в моём случае очень важный Wait(2000)) более не отвлекаясь на "аську" (не считая деактивации обработчиков событий в конце работы скрипта).
При случайном разрыве соединения с ICQ скрипт автоматически попытается его восстановить. При ошибке по работе с ICQ будет произведена попытка переподключения (на всякий пожарный).
При получении сообщения происходит самое интересное: проверяется UIN отправителя сообщения и если этому UIN разрешено "командовать" стелсом, то обрабатываются полученые в сообщении текстовые команды. На этом всё.
Соответственно учетные данные необходимо будет указать свои. Так же набор возможных команд, передаваемых стелсу через аську тоже может быть доукомплектован. Но это уже на совести разработчика
Результат работы данного скрипта в окне ICQ:
Системный журнал стелса по отработке даннго скрипта:Fenix, 28.09.2010 23:38:11:
Magery
Василий Пупкин, 28.09.2010 23:38:11:
Magery: 100,0
Fenix, 23:38:18:
Ncromancy
Василий Пупкин, 23:38:19:
Ncromancy: 0,0
Fenix, 23:38:31:
Necromancy
Василий Пупкин, 23:38:31:
Necromancy: 105,0
Fenix, 23:38:44:
stop
После команды "stop" работа скрипта была остановлена и он ушел по-английски (тобишь не попрощавшись). Обращу так же внимание, что в данной реализации "анализатора команд" не предусматривается вольное использование регистра символов в командах. Поэтому команда "Stop" будет проигнорирована и попытается отработаться как запрос значения скила.23:50:07:279 [Mondain]: Compiling
23:50:07:290 [Mondain]: Compiled succesfully
23:50:35:646 [Mondain]: Получена удалённая команда оставновки скрипта
23:50:37:353 [Mondain]: Character Mondain Disconnected.
23:50:37:361 [Mondain]: Succesfully executed
23:50:37:362 [Mondain]: Script ICQ.sc stopped successfuly
P.S.: Следующий пример предполагается посвятить обработчику события получения гампа.