![]() |
INDY 10 IRC -> Raw Nickname?
Hallo erstmal.
Ich programmiere in letzter Zeit gerne mit Indy Komponenten, am liebsten mit der IRC Komponente. Allerdings habe ich folgendes Problem: - Beim Ereignis "OnPrivateMessage" wird der Text ab 1 Zeichen vor dem ersten Leerzeichen abgeschnitten. - Deswegen wollte ich alles per "OnRaw" machen. Allerdings finde ich dort nirgendswo einen Nicknamen Parameter:
Delphi-Quellcode:
In AIn kann es nicht sein, in Boolean passt ja kein Nick rein. In AMessage ist es nicht, das ganze gibt mir folgendes aus:
procedure TForm16.IdIRC1Raw(ASender: TIdContext; AIn: Boolean;
AMessage: string); begin memo3.lines.add(AMessage); end; Zitat:
Zitat:
Bleibt nur noch ASender, dort vermute ich es aber auch nicht. Wenn ich das ganze mit:
Delphi-Quellcode:
ausgebe, bekomme ich folgendes:
procedure TForm16.IdIRC1PrivateMessage(ASender: TIdContext; const ANicknameFrom,
AHost, ANicknameTo, AMessage: string); begin memo3.lines.add(ANicknameFrom+' >> '+AMessage); end; Zitat:
Ich bitte um Hilfe, FireOfSorrow |
Re: INDY 10 IRC -> Raw Nickname?
IRCRaw gibt die blanke Textzeile (unbearbeitet und undecodiert) aus. Die muss man dann selbst "auseinanderpflücken".
Weiterhin solltest du dich mit dem IRC-Protokoll beschäftigen. Darauf bauen die IRC-Komponenten auf. Zum Beispiel gibt es eine Konstellation wie "NICK PRIVMSG #CHANNEL :TEXT" gar nicht. "NICK" am Anfang würde dem IRC-Server mitteilen, dass ein neuer Nick festgelegt werden soll. Und
Delphi-Quellcode:
ist ja eigentlich selbsterklärend, wie die Parameter übergeben werden müssen.
procedure TForm16.IdIRC1PrivateMessage(ASender: TIdContext; const ANicknameFrom,
AHost, ANicknameTo, AMessage: string); Einen IRC-Client (oder gar Server?) kann man nicht mal "so eben programmieren" ;) |
Re: INDY 10 IRC -> Raw Nickname?
Das ist ja das Problem. Ich kenne mich mit dem IRC Protokoll eigentlich aus (vorhin habe ich nur den Doppelpunkt vergessen, es heißt ":NICK PRIVMSG CHANNEL/USER :TEXT", siehe RFC)
Ich habe auch bereits einmal einen IRC Bot mit der IndyKomponente geschrieben allerdings musste ich dort wegen dem Bug (welchen du anscheinend überlesen hast) das ganze relativ umständlich programmieren. Bei der PrivateMessage Prozedur wird nämlich in Message NICHT alles komplett übergeben, es schneidet alles ab 1 Zeichen vor dem ersten Leerzeichen ab (siehe oben, "Bla ich bin ein Text" wird zu "Bl"). |
Re: INDY 10 IRC -> Raw Nickname?
Scheint sich keiner mit auszukennen, dann werd ich das wohl lassen.
|
Re: INDY 10 IRC -> Raw Nickname?
Ich tue für meine Sprache - ich aus Russland Abbitte. Aber ich denke klar ich werde schreiben:)
1. Wir nehmen den Distributionssatz Indy (besser als Version 10.5.6). Ist nicht einsteilbar. 2. Wir suchen die Datei IdIRC.pas und ist es im Texteditoren geöffnet. 3. Wir suchen darin die Prozedur Zitat:
Delphi-Quellcode:
5. Wir sparen die Veränderungen auf und nur ist danach Indy von neuem einsteilbar.
{ if TextStartsWith(AData, ':') then begin
LTmp := Fetch(AData, #32); Delete(LTmp, 1, 1); // remove ':' FSenderNick := Fetch(LTmp, '!'); FSenderHost := LTmp; end else begin FSenderNick := ''; FSenderHost := ''; end;} 6. Jetzt bei der Ausführung
Delphi-Quellcode:
Sie werden dass jenes типо seiner sehen
procedure TForm16.IdIRC1Raw(ASender: TIdContext; AIn: Boolean;
AMessage: string); begin memo3.lines.add(AMessage); end; Zitat:
Delphi-Quellcode:
procedure TForm16.IdIRC1Raw(ASender: TIdContext; AIn: Boolean;
AMessage: string); var AUserNick,ACommand,AContent,AUserAddress:string; begin AUserNick:=''; ACommand:=''; AContent:=AMessage; if copy(AContent,1,1)=':' then begin AContent:=copy(AContent,2,length(AContent)-1); AUserNick:=copy(AContent,1,pos(' ',AContent)-1); if pos('!',AUserNick)<>0 then begin AUserNick:=copy(AUserNick,1,pos('!',AUserNick)-1); AUserAddress:=copy(AUserNick,pos('!',AUserNick)+1,length(AUserNick)-pos('!',AContent)); end else AUserNick:=''; AContent:=copy(AContent,pos(' ',AContent)+1,length(AContent)-pos(' ',AContent)); end; ACommand:=copy(AContent,1,pos(' ',AContent)-1); AContent:=copy(AContent,pos(' ',AContent)+1,length(AContent)-pos(' ',AContent)); Memo7.Lines.Add(AUserNick+'---'+ACommand+'---'+AContent); end; |
Re: INDY 10 IRC -> Raw Nickname?
Liste der Anhänge anzeigen (Anzahl: 1)
Die idee ist gut. Aber danach gehen z.b. die OnPrivateMessage, OnInvite usw nichtmehr. Das OnPrivateMessage hat auch einen bösen fehler. Wenn es ein wort ist, schneidet er den letzten buchstaben ab. Wenn es mehrere wörter sind gibt er nur das erste wort (mit abgeschnittende buchstaben) zurück.
Den fehler kann man aber schnell fixen. In der IdIRC.pas folgende zeile (898) ändern.
Delphi-Quellcode:
ersetzen durch
LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2)
Delphi-Quellcode:
Für die leute die Indy nicht übersetzt bekommen habe ich die Source und die fertig unit drangehängt.
LTmp := copy(ASender.RawLine,Pos(':',ASender.RawLine),(Length(ASender.RawLine)-Pos(':',ASender.RawLine))+1);
Gruss EDIT: Ich habe nun noch den "fehler" gefixt das der nick fehlt. Der nick steht nun an zweiter stelle, so das die Events wieder durchkommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz