Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Irc mit Indy (https://www.delphipraxis.net/113729-irc-mit-indy.html)

MSSSSM 13. Mai 2008 19:18


Irc mit Indy
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, herzlich Willkommen!

In diesem Beitrag geht es um die Indy IRC-Komponente

Du kannst sie hier downloaden.
Mann, war ich doof, da sind doch noch die 9er!


Fangen wir an:

Zuerst, ziehe eine Iindy-IRC Komponente (IdIRC) auf das Formular

Dann sollte im Form.Create folgendes stehen:
Delphi-Quellcode:
IdIRC1.Nick:='MyNick';  // Legt den Nick fest

IdIRC1.Host:='irc.server.org';  // Gibt den Server an

IdIRC1.Port:=6667; //Irc Port
Damit legst du die Einstellungen für das Verbinden fest.

Nun, müssen wir uns nur noch verbinden:

Ziehe einen Button auf das Formular, und erstelle ein OnClick Ereignis
Caption sollte 'Verbinden' lauten

Folgender Code kommt hinein:
Delphi-Quellcode:
try //versuche
IdIRC1.Connect(); //zu verbinden
except //wenn Fehler
showMessage('Fehler beim Verbinden!'); //Meldung zeigen
end;
Du solltest einen Button erstellen, mit folgendem Code im Ereignis onClick:
Delphi-Quellcode:
IdIRC1.Join('#lima-city');
Nun kannst du schon Verbinden und einen Channel joinen.
Damit aber später aber auch Nachrichten angezeigt werden, solltest du noch eine Memo-Komponente auf das Formular ziehen.

Dann musst du noch zwei Ereignisse, OnReceive und OnMessage, hinzufügen

OnReceive (Bei mit hat es nur mit diesem zusätzlichen Ereignis geklappt):
Delphi-Quellcode:
Memo1.lines.add(ACommand); //zum Memo hinzufügen
OnMessage:
Delphi-Quellcode:
Memo1.lines.add(AUser.Nick+': '+Content); // Nachricht in Form Nick: Nachricht zum Memo hinzufügen


Jetzt kannst du schon Nachrichten empfangen, fehlt nur noch das Schreiben:

Ziehe eine Edit- und eine Button-Komponente auf das Formular.

Die Button-Komponente bekommt die Caption "Senden".

Die OnClick-Ereignis Routine lautet:

Delphi-Quellcode:
IdIRC1.Say('#CHANNEL',Edit1.Text); //Nachricht zum Channel schicken
Memo1.Lines.Add(IdIRC1.Nick+': '+Edit1.Text); //Zum Memo hinzufügen, denn durch eigene Nachrichten wird das OnMessage-Ereignis nicht ausgelöst
Damit kannst du jetzt Nachrichten empfangen und senden.

Schreibe in das OnClose Ereignis des Formulars:

Delphi-Quellcode:
IdIRC1.Disconnect(); //Zum stoppen


Zusatzcode:
Erstelle eine Listbox.
Erstelle das OnNames Ereignis und schreibe dorthin:
Delphi-Quellcode:
var
 i: integer;
//begin
for i:=0 to AUsers.Count-1 do //führe sooft aus wie User im Channel sind
ListBox1.Items.Add(AUsers.Items[i].Nick); //Adde diese zu ListBox
//end
Nun hast du schon einen funktionierenden IRC-Client.

Tipp: Baue einen IRC-Bot, du brauchst nur den Content bei OnMessage überprüfen!

FAlter 13. Mai 2008 19:24

Re: Irc mit Indy
 
Hi,

:kiss: danke, darauf hab ich schon immer gewartet. Ich habe es mal vor einer Ewigkeit alleine probiert, aber irgenwie hat es nicht geklappt.

Aber ist das nicht eher ein Tutorial?

Egal, ich füge es erst einmal den Lesezeichen hinzu, falls ich mal Langeweile habe.

Mfg
FAlter

MSSSSM 14. Mai 2008 13:37

Re: Irc mit Indy
 
Das dies ein Tutorial ist habe ich auch schon gedacht :lol:
Aber letzendlich wollte ichs ja nicht noch einmal neu machen!

Dann ist es leicht einen bot zu machen!
z.B.: Befehl !learn BEFEHL ANTWORT


mfg

FAlter 16. Mai 2008 11:41

Re: Irc mit Indy
 
Hi,

irgendwie heißen die Events bei mir anders. OnReceive und OnMessage gibts gar nicht.

Mfg
FAlter

MSSSSM 16. Mai 2008 12:42

Re: Irc mit Indy
 
benutzt du Indy 10?

Und wirklich die IdIrc Komponente? :twisted:

:gruebel:

Aber wenn sonts nix ist....

mfg


Antwortet doch mal was mehr :lol:

FAlter 16. Mai 2008 12:51

Re: Irc mit Indy
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ja, ich habe bei der TurboDelphi-Installation definitiv Indy 10 ausgewählt, und in D2k5 hab ich Version 10 manuell installiert und es stimmt mit TurboDelphi überein.

Ansonsten noch ein Problem, aber das liegt wohl eher an Indy. Wenn ich OnPrivateMessage / OnNotice usw. verwende, wird die Nachricht immer beim letzten Buchstaben vor dem ersten Leerzeichen abgeschnitten. Hier mal mein Beispiel, wo der Bot alles einfach zurückschickt... In OnRaw steht es drin, aber dann müsste ich das ganze ja selbst zerpflücken...

[edit] Als Anhang... [/edit]

Wichtig noch:

Fast immer sollte man UserName und evtl. RealName zuschicken, auch bei öffentlichen Servern, da bleibt dann das Passwort leer. Also entsprechende Eigenschaften setzen. Vorher hab ich nur Access denied gekriegt, von allen Servern, bei denen ichs probiert habe.

Mfg
FAlter

JonnyGuitar 16. Mai 2008 13:04

Re: Irc mit Indy
 
servus,

ich habe auch definitiv indy 10 installiert in verbindung mit delphi 2007.
auch bei mir fehlen die besagten events.


mfg Jonny

DP-Maintenance 16. Mai 2008 13:06

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Tutorials und Kurse" verschoben.
Das passt hier besser

MSSSSM 16. Mai 2008 13:21

Re: Irc mit Indy
 
tipp: nimm die explode-funktion aus der CodeLibrary!

Ich hab das ganze mit D7 vllt. liegts daran, dass meine eigl. eine Prof. ist? :evil:

mfg

Flamemaster 16. Mai 2008 13:23

Re: Irc mit Indy
 
bei mir kennt er merkwürdigerweise "IdIRC1.Nick" nicht.

Alles andere funktioniert.
weis evtl. jemand was man da machen kann?

FAlter 16. Mai 2008 13:27

Re: Irc mit Indy
 
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]

Valle 20. Dez 2008 13:54

Re: Irc mit Indy
 
Ich habe das Tutorial mal aus gegebenem Anlass ins Englische übersetzt, damit unser User dangerduck auch was davon versteht. Ich hoffe, MSSSSM hat nichts dagegen. :-)

---

Hello and welcome!

This post is about the Indy IRC component.

You can download it here.

Let's begin:

First, put the Indy IRC component on your form.

Form.Create should now look like the following:
Delphi-Quellcode:
IdIRC1.Nick:='MyNick';  // Defines the nickname

IdIRC1.Host:='irc.server.org';  // Defines the Server

IdIRC1.Port:=6667; //Irc Port
With this you define the settings for the connection.

Now we have to connect:

Put a button on your form and create the onClick-event:
The buttons caption should be 'Connect'

Put in this code:
Delphi-Quellcode:
try // try ...
IdIRC1.Connect(); // ... to connect
except // ... when an error happens ...
showMessage('Fehler beim Verbinden!'); // ... show a message
end;
You should make a buton with the folling code in the onClick-event
Delphi-Quellcode:
IdIRC1.Join('#lima-city');
Now you can already connect and join a channel.
But to display messages later, you should put a the TMemo component on the form.

The you have to add two events: OnReceive and OnMessage.

OnReceive (It only works with this additional event):
Delphi-Quellcode:
Memo1.lines.add(ACommand); // add to memo
OnMessage:
Delphi-Quellcode:
Memo1.lines.add(AUser.Nick+': '+Content); // Add message

Now you can already receive a message, but it lacks writing yet.

Put a TEdit and a TButton component on your form.

The button gets the caption "Send".

The OnClick-event is:

Delphi-Quellcode:
IdIRC1.Say('#CHANNEL',Edit1.Text); // Send message to the channel
Memo1.Lines.Add(IdIRC1.Nick+': '+Edit1.Text); // Ad to memo, because the OnMessage event won't be called when sending own messages
Now you can send and receive messages with that.

Put the following into the forms OnClose event:

Delphi-Quellcode:
IdIRC1.Disconnect(); // to stop


Additional code:
Create a TListBox.
Create the OnNames event and write:
Delphi-Quellcode:
var
 i: integer;
//begin
for i:=0 to AUsers.Count-1 do // execute as many times as users in the channel
ListBox1.Items.Add(AUsers.Items[i].Nick); // Add to ListBox
//end
Now you have a working IRC client!

Tip: Build an IRC-bot, you only have to work with the content in OnMessage!

Die Muhkuh 20. Dez 2008 14:05

Re: Irc mit Indy
 
Hi,

Du solltest noch dazu schreiben, ob es sich um die Indy 9 oder Indy 10 handelt!

Valle 20. Dez 2008 14:08

Re: Irc mit Indy
 
Zitat:

Zitat von Die Muhkuh
Hi,

Du solltest noch dazu schreiben, ob es sich um die Indy 9 oder Indy 10 handelt!

Ich als Übersetzer oder MSSSSM als Autor? Er hat oben geschrieben, dass er Indy 10 benutzt. ;-)

Mit freundlichen Grüßen,

Valle

Die Muhkuh 20. Dez 2008 14:10

Re: Irc mit Indy
 
Er als Autor. Ich meinte, dass er es ins Tutorial schreiben soll und nicht nur in ein paar Beiträgen drunter.

dangerduck 20. Dez 2008 16:07

Re: Irc mit Indy
 
Danke!
:-D

dangerduck 20. Dez 2008 18:17

Re: Irc mit Indy
 
download link doestn work :cry:
could someone upload it on rapidshare or megaupload please :D

DeddyH 20. Dez 2008 18:19

Re: Irc mit Indy
 
Which link do you mean?

Valle 20. Dez 2008 18:27

Re: Irc mit Indy
 
Zitat:

Zitat von DeddyH
Which link do you mean?

This one.

Everywhere I click, sooner or later I always find this page. But I don't know where to go now, there's no "Continue" button, no "Download" button. And every link on this page results in a 404 error page. :?

DeddyH 20. Dez 2008 18:57

Re: Irc mit Indy
 
Maybe you can have a look at this page.

dangerduck 20. Dez 2008 19:34

Re: Irc mit Indy
 
i dont understand this :
http://www.shrani.si/t/1z/zb/3t7a3Q2m/problem.jpg

dangerduck 20. Dez 2008 20:52

Re: Irc mit Indy
 
:?:

dangerduck 20. Dez 2008 22:09

Re: Irc mit Indy
 
:roll: anyone?

inherited 20. Dez 2008 22:39

Re: Irc mit Indy
 
It's Private Message. Double click on "OnPrivateMesssage" and you should get the text there

dangerduck 21. Dez 2008 13:58

Re: Irc mit Indy
 
Thx man

robinWie 21. Dez 2008 14:41

Re: Irc mit Indy
 
Ich bekommt wenn ich Verbinden will immer die Meldung "Zugriffsverletzung bei Adresse 00466A19 in Modul 'Project1.exe'. Lesen von Adresse 00000000' auf getreten." Das kommt immer an der Quelltetstelle:
Delphi-Quellcode:
procedure TIdReply.UpdateText;
begin
  FReplyTexts.UpdateText(Self);
end;
in der Unit IdReplay

Ich hab Indy 10 und Delphy 2k5 Personal

Weiss jemand woran das liegt?

inherited 21. Dez 2008 15:08

Re: Irc mit Indy
 
:glaskugel:
In Zeile 42 fehlt ein "if Assigned"






ohne Sourcecode können wir es nicht wissen. Aber das gehört hier nicht her, mach dafür ein eigenes Thema auf!

dangerduck 21. Dez 2008 15:31

Re: Irc mit Indy
 
Nothing work i will try with socekts now thx anyway :mrgreen:

sh0xX 18. Apr 2009 22:42

Re: Irc mit Indy
 
Hey ;)
Habe da eine kleine frage:

Ich habe mich genau an das gehalten, was du in deinem tutorial geschrieben hast.

Wenn ich nun allerdings auf den Conenctbutton klicke, verbindet er zu dem server.

Einen channel allerdings will er nicht joinen.. Hier mein source:

Delphi-Quellcode:
procedure TForm1.btConnectClick(Sender: TObject);
begin
try
  IdIRC1.connect();
except
 showmessage('Verbidnung fehlgeschlagen');
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
IdIRC1.Nickname:='sh0xXb0t';
IdIRC1.Host:='irc.3dl.am';
IdIrc1.Port:=6667;
end;
Den join-button habe ich weggelassen da auf dem server autojoin an ist, habe ihn zu testzwecken mal hinzugefüht, bringt allerdings auch kein ergebnis..

Würde mich über hilfe freuen

Edit: Nutze Codeagear RAD studio 2009 (Demo-Version), soweit ichs erkennen kann nutzt diese Indy 12
Edit2: durch die andere indy-version steht bei mir statt "nick" auch "nickname" etc. und ich kann deinen source leider nicht benutzen.

mfg
sh0xX

ford42 2. Aug 2018 07:25

AW: Irc mit Indy
 
Hey,

Ich komme gerade einfach nicht weiter und habe dazu auch schon einen Thread eröffnet... https://www.delphipraxis.net/197331-...ml#post1409330

LG ford

ford42 2. Aug 2018 09:01

AW: Irc mit Indy
 
Ok, der Client geht nun, aber nur ohne Proxy, mit habe ich es immer noch nicht hinbekommen...

Wie heißt denn das OnMessage-Ereignis in der neuen Version??

Neutral General 2. Aug 2018 09:04

AW: Irc mit Indy
 
Warum führst du jetzt hier in einem 9 Jahre alten Thread Monologe, statt in deinem eigenen IRC-Thread zu posten? :roll:

ford42 2. Aug 2018 09:20

AW: Irc mit Indy
 
Dachte, dass das vlt auch andere interessiert, die das machen wollen und auf diesen Thread stoßen...

EDIT: Würde es hier drin stehen müsste ich nicht fragen und in nem anderen Thread steht das vlt versteckt drin...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 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