AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Irc mit Indy
Tutorial durchsuchen
Ansicht
Themen-Optionen

Irc mit Indy

Ein Tutorial von MSSSSM · begonnen am 13. Mai 2008 · letzter Beitrag vom 2. Aug 2018
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von MSSSSM
MSSSSM
Registriert seit: 18. Apr 2008
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:
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):
Memo1.lines.add(ACommand); //zum Memo hinzufügen OnMessage:
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:

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!
Angehängte Dateien
Dateityp: zip ircindy_179.zip (4,0 KB, 158x aufgerufen)
 
Benutzerbild von FAlter
FAlter

 
FreePascal / Lazarus
 
#11
  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
Benutzerbild von Valle
Valle
 
#12
  Alt 20. Dez 2008, 14:54
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
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):
Memo1.lines.add(ACommand); // add to memo OnMessage:
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:

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!
Valentin Voigt
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

 
Delphi 2009 Professional
 
#13
  Alt 20. Dez 2008, 15:05
Hi,

Du solltest noch dazu schreiben, ob es sich um die Indy 9 oder Indy 10 handelt!
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle
 
#14
  Alt 20. Dez 2008, 15:08
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
Valentin Voigt
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

 
Delphi 2009 Professional
 
#15
  Alt 20. Dez 2008, 15:10
Er als Autor. Ich meinte, dass er es ins Tutorial schreiben soll und nicht nur in ein paar Beiträgen drunter.
Manuel
  Mit Zitat antworten Zitat
dangerduck
 
#16
  Alt 20. Dez 2008, 17:07
Danke!
  Mit Zitat antworten Zitat
dangerduck
 
#17
  Alt 20. Dez 2008, 19:17
download link doestn work
could someone upload it on rapidshare or megaupload please
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 12 Athens
 
#18
  Alt 20. Dez 2008, 19:19
Which link do you mean?
Detlef
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle
 
#19
  Alt 20. Dez 2008, 19:27
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.
Valentin Voigt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 12 Athens
 
#20
  Alt 20. Dez 2008, 19:57
Maybe you can have a look at this page.
Detlef
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 02:13 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