Indy wie IRC nachrichten empfangen

Alle Fragen zur Netzwerkkommunikation
Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Indy wie IRC nachrichten empfangen

Beitrag von Dragon »

Hallo ich hatte hier ja gestern schonmal gefragt wegen indy
viewtopic.php?f=10&t=9373
und irc, und das hat am ende ja auch funktioniert was ich vorhatte, nur hab ich wieder mal ein Problem ich weiß nicht wie ich Nachrichten empfangen kann mit indy.

Hab dann ein bissl gegoogelt und https://github.com/fabioxgn/IRC diesen Client gefunden. Von diesem hab ich mir den code mal angeschaut doch es hat mir leider nicht weitergeholfen.

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: Indy wie IRC nachrichten empfangen

Beitrag von Dragon »

Weiß den wirklich keiner eine antwort.

versuch schon seit über 8std es hinzubekommen ohne erfolg. :cry:

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Indy wie IRC nachrichten empfangen

Beitrag von Christian »

Indy wird in Lazarus Kreisen wenig genutzt. Ist riesig und fehleranfällig.
Für Synaose hab ich das irgendwann schonmal gemacht muss ich aber schauen.

Allerdings ist das so trivial das dus auch selbst hinbekommen müsstest.
IRC ist einfach nur ne TCP Verbindung alle Befehle sind die selben wie du sie auch im IRC Client eingibst.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: Indy wie IRC nachrichten empfangen

Beitrag von Dragon »

Danke schonmal fur deine hilfe. Für indy hatte ich mich entschieden weil ich beib synapse gesehen hab das diebletzte version von 2012-13 war und ich somit dachte es ist eol. Auserdem möchte ich auch spater wenn alles funktioniert ssl einbauen

Vll wäre lnet noch ne möglichkeit.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Indy wie IRC nachrichten empfangen

Beitrag von theo »

Dragon hat geschrieben:Danke schonmal fur deine hilfe. Für indy hatte ich mich entschieden weil ich beib synapse gesehen hab das diebletzte version von 2012-13 war und ich somit dachte es ist eol. Auserdem möchte ich auch spater wenn alles funktioniert ssl einbauen
.

Merkwürdige Logik. Nur weil bei Indy nicht drauf steht, wie alt die Release Version ist, ist es aktueller? :wink:

Außerdem stimmt es nicht. An Synapse Trunk wurde in 2015 gearbeitet http://sourceforge.net/p/synalist/code/HEAD/tree/trunk/ und SSL unterstützt es auch.

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: Indy wie IRC nachrichten empfangen

Beitrag von Thomas B. »

Indy ... Ist riesig und fehleranfällig.

kann ich so nicht bestätigen. Bei mir läuft Indy (egal welche Komponente) seit Jahren stabil in verschiedenen Projekten.
Manchmal wird hier im Forum irgendein Vorurteil gegen Indy herausgekramt, ohne ein konkretes Beispiel zu zeigen bzw. zu nennen - das nervt.

zur Frage:
Wenn ich mir die IdIRC.pas so anschaue, dann scheint der Server verschiedene Events / Nachrichten zu schicken, auf die reagiert werden kann, sofern die Ereignisbehandlungsroutine auch zugewiesen ist.
Ein Beispiel für den Anfang:

Code: Alles auswählen

...
procedure MeineVerarbeitungsprozedur(ASender: TIdContext; AWelcomeInfo: TIdStrings); // siehe IdIRC.pas: TIdIRCServerWelcomeEvent = procedure(ASender: TIdContext; AWelcomeInfo: TIdStrings) of object;
...
// bei Programmstart zuweisen:
IdIRC.OnServerWelcome := @MeineVerarbeitungsprozedur;

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: Indy wie IRC nachrichten empfangen

Beitrag von Dragon »

@theo
ich hatte auf der website nicht im trunk nachgeguckt

@Thomas B.
die idirc hatte ich mir angegucktbhat mir nur leider net weitergeholfrn hab da nichts gefunden fur normale nachrichten nur events für topic, join, dejoin,.. nichts für message recieve. Ich werde mir die unit aber nochmal angucken wenn ich zuhause bin.

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: Indy wie IRC nachrichten empfangen

Beitrag von Thomas B. »

Die Events geben schon die entsprechende Klassifizierung der Nachricht vor.
Wer direkt auf die TCP-Daten zugreifen möchte, der nutzt wahrscheinlich am besten das OnRaw-Event, wie z.B. hier beschrieben

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: Indy wie IRC nachrichten empfangen

Beitrag von Dragon »

So sieht mein code jetzt aus

Code: Alles auswählen

 
program IRC_BOT;
 
{$mode objfpc}{$H+}
 
uses {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads, {$ENDIF} {$ENDIF}
  Classes,
  SysUtils,
  IdIRC,
  idContext;
 
 procedure Test(ASender: TIdContext; AWelcomeInfo: TIdStrings);
 begin
     Writeln(AWelcomeInfo);
     Say('#test', 'Wilkommen erhalten');
 end;
 
{ you can add units after this }
var
  a: string;
  MyIdIRC: TIdIRC; // Vllt. heißt es auch anders, musst du mal schauen
begin
  ReadLn(a);
  if a = 'Connect' then
  begin
    begin
      MyIdIRC := TIdIRC.Create; // Kann sein, dass da noch ein Parameter hin muss, aber du musst erst das Objekt konstruieren
      MyIdIRC.username := 'Bot';
      MyIdIRC.nickname := 'Bot';
      MyIdIRC.Host := '127.0.0.1';
      MyIdIRC.Port := 6667;
 
 
      MyIdIRC.OnServerWelcome := @Test;
      try
        MyIdIRC.Connect();
        MyIdIRC.Join('#test');
      except
        Writeln('Fehler beim Verbinden!');
      end;
      FreeAndNil(MyIdIRC); // Objekt wieder freigeben
    end;
  end;
end.     
 

Aber jetzt mekert er in der IdsocketHandle unit das er IdGlobal nicht finden kann

P.S. Das Stackoverflow example kann ich auch nicht kompilieren
Zuletzt geändert von Dragon am Mo 25. Jan 2016, 16:07, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Indy wie IRC nachrichten empfangen

Beitrag von theo »

Für Kommandozeilenprogramme ist Synapse mMn besser geeignet.
Synapse wartet, statt ein Event zu schmeißen.

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: Indy wie IRC nachrichten empfangen

Beitrag von Dragon »

Offenbar konnte er die unit "IdGlobal" nicht finden hab sie manuell eingebunden.

Jetzt hab ich aber den fehler
"IdIRC.pas(39,22) Fatal: Kann idContext nicht finden verwendet von IdIRC. Make sure all ppu files of a package are in its output directory. ppu im falschen Verzeichnis=/usr/local/codetyphon/typhon/components/pl_Indy/lib/x86_64-linux/qt/IdContext.ppu.."

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Indy wie IRC nachrichten empfangen

Beitrag von Warf »

Christian hat geschrieben:Indy wird in Lazarus Kreisen wenig genutzt. Ist riesig und fehleranfällig.


Etwas das ich nie verstehen konnte, die LCL ist auch riesig und fehleranfällig, warum verwendet man nach dieser Logik nicht lieber ein anderes Framework?

Bisher hat Indy bei mir, natürlich mit ein wenig Aufwand, immer alles geleistet was ich wollte. Nur man sollte nicht den Release nutzen, sondern den Trunk, da der Release mittlerweile schon ein paar Jahre gesehen hat, der trunk allerdings fortlaufend aktualisiert wird.

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: Indy wie IRC nachrichten empfangen

Beitrag von Dragon »

@Warf ich habe nicht eine stable genommen war die version die bei CT5.60 dabei war.

Hab eben auf ne testing version von 5.70 aktualisierthab jetzt aber neue fehler

nähmlich wieder Identifier fehler
Hier erstmal der CODE

Code: Alles auswählen

program IRC_BOT;
 
{$mode objfpc}{$H+}
 
uses {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads, {$ENDIF} {$ENDIF}
  Classes,
  SysUtils,
  IdIRC,
  IdGlobal,
  pl_indy;
 
{ you can add units after this }
  procedure test(ASender: TIdContext; AWelcomeInfo: TIdStrings);
  begin
 
  end;
 
var
  Stop: boolean;
  MyIdIRC: TIdIRC;                                              // Vllt. heißt es auch anders, musst du mal schauen
begin
  MyIdIRC.OnServerWelcome := @test;
  Stop := False;
  try
    MyIdIRC := TIdIRC.Create;
    // Kann sein, dass da noch ein Parameter hin muss, aber du musst erst das Objekt konstruieren
    MyIdIRC.username := 'Bot';
    MyIdIRC.nickname := 'Bot';
    MyIdIRC.Host := '127.0.0.1';
    MyIdIRC.Port := 6667;
    try
      MyIdIRC.Connect();
      MyIdIRC.Join('#test');
    except
      Writeln('Fehler beim Verbinden!');
      ReadLn();
    end;
  finally
    repeat
      // MyIdirc.Say('#test', 'Hi');
      // sleep(1000);
 
    until Stop = True;
    FreeAndNil(MyIdIRC); // Objekt wieder freigeben
  end;
end.               
 


Die fehler lauten

Nachrichten, Warnungen: 1
Warning: other unit files search path (aka unit path) of "IRC_BOT" contains "/usr/local/codetyphon/typhon/components/pl_Indy/source", which belongs to package "pl_indy"
Projekt kompilieren, Ziel: IRC_BOT: Exit code 256, Fehler: 3
IRC_BOT.lpr(14,27) Error: Identifier not found "TIdContext"
IRC_BOT.lpr(14,53) Error: Identifier not found "TIdStrings"
IRC_BOT.lpr(23,30) Error: Incompatible types: got "<address of procedure(<erroneous type>;<erroneous type>);Register>" expected "<procedure variable type of procedure(TIdContext;const AnsiString) of object;Register>"

die unit IdGlobal.pas hab ich per hand eingefügt weil er sie sonst nicht gefunden hat

Nat würde ich auch theo LNET oder Synapse nehmen nur zu indy hab ich bisher am meisten hilfen gefunden deshalb hatte ich das genommen auserdem ar dort schon eine IRC unit vorhanden.

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Indy wie IRC nachrichten empfangen

Beitrag von creed steiger »

Zu dem CT Zeugs kann dir wohl am bestem im Pilotlogic/CT Forum geholfen werden.

Davon abgesehen ist IRC dokumentiert

http://www.faqs.org/rfcs/rfc2812.html

https://tools.ietf.org/html/rfc1459

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Indy wie IRC nachrichten empfangen

Beitrag von Warf »

Zu CT weiß ich relativ wenig,
aber versucht mal idContext & idStrings in der uses Klausel zu verwenden, Indy ist über sehr viele Dateien verteilt

und:

Code: Alles auswählen

  MyIdIRC.OnServerWelcome := @test;

das Funktioniert nicht da OnServerWelcome eine Methode erwartet (Funktion/Prozedur einer Klasse, da dieses über thiscall aufgerufen wird) du übergibst eine normale funktion.

Antworten