Thema: Delphi Irc mit Indy

Einzelnen Beitrag anzeigen

Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#11

Re: Irc mit Indy

  Alt 16. Mai 2008, 14:27
Hi,

Nickname?

Mein Test-Code:

Delphi-Quellcode:
//IRC = TIdIRC
      IRC.OnPrivateMessage := HandleMsg;
      IRC.OnNotice := HandleMsg;
      IRC.OnWallops := HandleMsg2;
      //IRC.OnRaw := HandleRaw;
      IRC.Nickname := NickEdit.Text;
      IRC.RealName := 'FAlter Bot';
      IRC.Username := 'FAlterBot';
      IRC.Host := ServerEdit.Text;
      IRC.Port := StrToIntDef(PortEdit.Text, IRC.Port);
      IRC.Connect;
Muss natürlich noch verbessert werden... Ist ja erstmal nur zum Test.

Mfg
FAlter

[edit]

Aus der IdIRC.Pas: (Indy 10)
Delphi-Quellcode:
procedure TIdIRC.CommandPRIVMSG(ASender: TIdCommand);
var
  LTmp: String;
begin
  if ASender.Params[0][1] = #1 then
  begin
    ParseCTCPQuery(ASender.Params[1], ASender.Params[0]);
  end
  else if Assigned(FOnPrivMessage) then
  begin
    LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2); ///!!!!!!!!!!!!!!!
    OnPrivateMessage(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], LTmp);
  end;
end;
In der markierten Zeile liegt ein Fehler. Das -2 ist falsch und kann sogar komplett weggelassen werden, ansonsten kommt da -1 hin. Das erklärt das Fehlen des letzten Buchstabens.

Die anderen Worte liegen vermutlich in Params[3]..Params[Count-1], schätz ich mal.

[/edit]

[edit]
Mit dieser Änderung gehts erstmal. Ist natürlich nicht gerade optimal, wenns erst auseinandergepflückt und hier wieder zusammengesetzt wird, erstmal reichts jedoch. Der Bot muss "liest" trotzdem schneller als ein Mensch.

Delphi-Quellcode:
procedure TIdIRC.CommandPRIVMSG(ASender: TIdCommand);
var
  LTmp: String;
  I: Integer;
begin
  if ASender.Params[0][1] = #1 then
  begin
    ParseCTCPQuery(ASender.Params[1], ASender.Params[0]);
  end
  else if Assigned(FOnPrivMessage) then
  begin
    LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]));
    for I := 2 to ASender.Params.Count - 1 do
      LTmp := LTmp + ' ' + ASender.Params[I];
    OnPrivateMessage(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], LTmp);
  end;
end;

procedure TIdIRC.CommandNOTICE(ASender: TIdCommand);
var
  LTmp: String;
  I: Integer;
begin
  if ASender.Params[0][1] = #1 then
  begin
    ParseCTCPReply(ASender.Params[1], ASender.Params[0]);
  end
  else if Assigned(FOnNotice) then
  begin
    LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]));
    for I := 2 to ASender.Params.Count - 1 do
      LTmp := LTmp + ' ' + ASender.Params[I];
    OnNotice(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], LTmp);
  end;
end;
[/edit]
Felix Alter
  Mit Zitat antworten Zitat