Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > IRC бот


Автор: Debosh 2.2.2007, 00:19
      Здравствуйте, уважаемые программисты.
      При написании IRC-бота возникли некоторые проблемы, надеюсь с вашей помощью их удастся решить.
      Я написал IRC бота, который выполняет различные сервисные функции.
Но теперь, мне захотелось сделать так, чтобы программа выполнялась строго в фоновом режиме, а все управление ей происходило непосредственно из IRC-клиента.
Я использую компонент IdIRC, потому что на мой взгляд это очень удобно и не нужно тратить много времени описывая интерфейс WinSock и изучая особенности протокола IRC.
Естественно, формы у меня в программе нет, и процедуру инициализации компонента теперь приходится выполнять вручную.
Но вся проблема в том, что при обработке сообщений Windows программа зависает. Она корректно подключается к серверу, заходит на канал, но видимо в связи с зацикливанием перестает реагировать на сообщения пользователей, а через некоторое время, видимо не ответив на пинг сервера и вовсе отключает сокет и тупо висит в памяти.
Пожалуйста объясните мне в чем проблема? При написании подобной программы на чистом WinSock таких неприятностей не возникало, а здесь столкнулся с настоящей бедой.

Код
                                           

program Project1;
uses
Windows, IdIRC;
type
TIRCBot = class
constructor Initialize;
destructor ExitProgram;
 procedure IRCMessage(Sender: TObject; AUser: TIdIRCUser; AChannel: TIdIRCChannel; Content: String);
 procedure ExecuteProc;
  private
  Msg: TMsg;
   IRC: TIdIRC;
 end;
procedure TIRCBot.IRCMessage(Sender: TObject; AUser: TIdIRCUser; AChannel: TIdIRCChannel; Content: String);
 begin
 if Content = '!exit' then          // Участок кода в этой процедуре не выполняется вообще
 ExitProgram()                     // Повидимому это связано с зацикливанием программы
 else
 IRC.Say('#services', Content);
end;
function WindowProc(Hwn, Msg, wParam, lParam: Longint): Longint; stdcall;
begin
  Result:=DefWindowProc(Hwn, Msg, wParam, lParam);
 // Не знаю нужна ли эта функция или нет
 // В исходнике вызовов на нее нигде нет
 // Возможно этот код и не выполняется вовсе
end;
procedure TIRCBot.ExecuteProc;
 begin
  Create;
  IRC.Connect();
  IRC.Join('#services');
  while GetMessage(Msg, 0, 0, 0) do // Почему то именно на этой строке возникает бесконечное ожидание, код ниже уже не вополняется
   begin
  TranslateMessage(Msg); // Под отладчиком это место вообще никогда не выполняется
   DispatchMessage(Msg);  // Здесь и происходит зависание программы
  end;
end;
 constructor TIRCBot.Initialize;
 begin
 IRC:=TIdIRC.Create(nil);
  IRC.Host:='irc.cyber-net.ru';
 IRC.Port:=6669;
  IRC.Nick:='Nick';
  IRC.AltNick:='Bot';
  IRC.RealName:='Peter';
  IRC.Username:='Bot';
 IRC.OnMessage:=IRCMessage;
end;
destructor TIRCBot.ExitProgram;
begin
IRC.Free;
 Free;
 end;
 var
 IRCBot: TIRCBot;
begin
IRCBot:=TIRCBot.Initialize;
 IRCBot.ExecuteProc;
end.    

  
 в панике. Очень жду решения поставленной задачи...

Автор: mntek 3.2.2007, 03:15
а ты не пробовал сначала создать окно, которое и будет получать сообщения?

Автор: Elfix 16.2.2007, 10:31
А зачем мне окно? Приложение будет работать в фоновом режиме. Окна мне не надо.
И потом, даже если я создам окно, и сделаю его невидимым (не прорисую) сообщения от IRC я получать не буду, так как идет зацикливание в GetMessage. Создав окно я буду получать сообщения Windows, а они мне нафиг не нужны...

Автор: dumb 14.3.2007, 04:09
Elfix, создай обычное приложение с формой(невидимой) и кинь туда IdIRC. либо разбирайся в сырцах индейских и осмысленно пытайся обеспечить компонент необходимым для него "окружением"...

Автор: bartram 14.3.2007, 12:46
Elfix, создай окно с флагом SW_HIDE...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)