AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi INDY 10 IRC -> Raw Nickname?
Thema durchsuchen
Ansicht
Themen-Optionen

INDY 10 IRC -> Raw Nickname?

Ein Thema von FireOfSorrow · begonnen am 21. Jun 2009 · letzter Beitrag vom 24. Dez 2009
Antwort Antwort
FireOfSorrow

Registriert seit: 21. Jun 2009
6 Beiträge
 
Delphi 2007 Professional
 
#1

INDY 10 IRC -> Raw Nickname?

  Alt 21. Jun 2009, 08:57
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:
procedure TForm16.IdIRC1Raw(ASender: TIdContext; AIn: Boolean;
  AMessage: string);
begin
  memo3.lines.add(AMessage);
end;
In AIn kann es nicht sein, in Boolean passt ja kein Nick rein. In AMessage ist es nicht, das ganze gibt mir folgendes aus:
Zitat:
PRIVMSG #CHANNEL :TEXT
obwohl ja eigentlich:
Zitat:
NICK PRIVMSG #CHANNEL :TEXT
die richtige Ausgabe wäre.
Bleibt nur noch ASender, dort vermute ich es aber auch nicht.
Wenn ich das ganze mit:
Delphi-Quellcode:
procedure TForm16.IdIRC1PrivateMessage(ASender: TIdContext; const ANicknameFrom,
  AHost, ANicknameTo, AMessage: string);
begin
  memo3.lines.add(ANicknameFrom+' >> '+AMessage);
end;
ausgebe, bekomme ich folgendes:
Zitat:
:NICK >> TEX
Toll, da ist der Nick drin, allerdings wird der Text abgeschnitten. Nun habe ich in früheren Projekten das ganze umgangen, indem ich bei OnRaw die Message in eine Variable gespeichert habe und bei OnPrivateMessage wieder zusammen mit dem Nick ausgegeben habe. Allerdings treten dabei Bugs auf, wenn wirklich Private Nachrichten gesendet werden, ausserdem ist das ganze recht umständlich.
Ich bitte um Hilfe,
FireOfSorrow
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

Re: INDY 10 IRC -> Raw Nickname?

  Alt 21. Jun 2009, 12:20
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:
procedure TForm16.IdIRC1PrivateMessage(ASender: TIdContext; const ANicknameFrom,
  AHost, ANicknameTo, AMessage: string);
ist ja eigentlich selbsterklärend, wie die Parameter übergeben werden müssen.
Einen IRC-Client (oder gar Server?) kann man nicht mal "so eben programmieren"
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
FireOfSorrow

Registriert seit: 21. Jun 2009
6 Beiträge
 
Delphi 2007 Professional
 
#3

Re: INDY 10 IRC -> Raw Nickname?

  Alt 21. Jun 2009, 12:48
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").
  Mit Zitat antworten Zitat
FireOfSorrow

Registriert seit: 21. Jun 2009
6 Beiträge
 
Delphi 2007 Professional
 
#4

Re: INDY 10 IRC -> Raw Nickname?

  Alt 23. Jun 2009, 12:44
Scheint sich keiner mit auszukennen, dann werd ich das wohl lassen.
  Mit Zitat antworten Zitat
Avatar_SBV

Registriert seit: 16. Sep 2009
1 Beiträge
 
#5

Re: INDY 10 IRC -> Raw Nickname?

  Alt 16. Sep 2009, 23:55
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:
procedure TIdIRC.DoBeforeCmd(ASender: TIdCommandHandlers; var AData: string; AContext: TIdContext);
4. Wir erläutern die Zeilen

Delphi-Quellcode:
{  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;}
5. Wir sparen die Veränderungen auf und nur ist danach Indy von neuem einsteilbar.
6. Jetzt bei der Ausführung

Delphi-Quellcode:
procedure TForm16.IdIRC1Raw(ASender: TIdContext; AIn: Boolean;
  AMessage: string);
begin
  memo3.lines.add(AMessage);
end;
Sie werden dass jenes типо seiner sehen

Zitat:
:SecureServ PRIVMSG Avatar :VERSION
7. Jetzt können Sie mit der vollen Zeile arbeiten. Ich habe so gemacht - hat diese Zeile zur Art Indy9 gebracht

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;
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.197 Beiträge
 
Delphi 2007 Architect
 
#6

Re: INDY 10 IRC -> Raw Nickname?

  Alt 24. Dez 2009, 19:05
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.

LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2) ersetzen durch

LTmp := copy(ASender.RawLine,Pos(':',ASender.RawLine),(Length(ASender.RawLine)-Pos(':',ASender.RawLine))+1); Für die leute die Indy nicht übersetzt bekommen habe ich die Source und die fertig unit drangehängt.

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.
Angehängte Dateien
Dateityp: zip idirc_176.zip (31,2 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz