Newsgroup: it.comp.lang.delphi
Titolo: Scrivere un client IRC in Delphy con Indy IRC Client

Salve a tutti.....
.......sto' cercando di accedere ad un server irc (es. quakenet o 
irc.ngi.it
 
come nel mio esempio) con un client irc fatto da me.
Premetto che ancora non ho fatto molto ma siccome temo di non essere in 
grado di andare avanti vi pongo subito qualche domanda:
1 - Alcuni eventi del IdIRC sembrano non funzionare affatto (esempio 
l'evento onconnect ...)
2 - Come faccio a leggere dal buffer di ricezione senza sapere quanto devo 
andare a leggere?
Diciamo che sul server dell'esempio qui sotto SO' che mi arrivano 3 righe... 
ed è presto fatto
ecco che leggo le 3 righe:
  Richedit1.Lines.Add(IdIrc1.Socket.ReadLn);
  Richedit1.Lines.Add(IdIrc1.Socket.ReadLn);
  Richedit1.Lines.Add(IdIrc1.Socket.ReadLn);
già con un + elegante:
  IdIrc1.Socket.ReadStrings(Richedit2.Lines,-1);
Mi perde qualche carattere (i primi 4 della 1ma riga) e poi mi va' in 
timeout (come se leggessi un eventuale 4ta riga inesistente... e quindi 
attende ke il server me la spedisca, in effetti arriva il disconnect dopo un 
bel po'.... )
Sapendo la grandezza delle stringhe nel buffer potrei leggere carattere x 
carattere (cosa che solitamente ho notato essere + sicura.... ovviamente 
moolto + lenta).
Altra domanda:
3 - Il componente ha diverse property tra cui: host (il server a cui mi 
voglio collegare), port ecc... ma anche quelli x l'autenticazione:
ho usato:
  IdIrc1.AltNickname:='provab';
  IdIrc1.Nickname:='provaa';
  IdIrc1.Host:='
irc.ngi.it
';
  IdIrc1.RealName:='first try to do it';
  IdIrc1.Connect;
Registration timeout?! che vuol dire? xkè vuole la registrazione e de ke?!
A tentativi ho provato con il comando:
IdIrc1.RegisterService( );
 ma.... a - non so' a cosa serve
          b - mi da' sempre errore parametro '%s' incompatibile
procedure RegisterService(const ANickname: String, const ADistribution: 
String, const AInfo: String, AType: Integer);Parameters
      Parameters Description
      ANickname
      ADistribution
      AInfo
      AType
Ecco un esempio di quello che ottengo da un richedit che ho usato come log:
Resolving hostname 
irc.ngi.it
.
Connecting to 194.185.88.200.
Connected.
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Found your hostname, cached
NOTICE AUTH :*** Checking Ident
ERROR :Closing Link:  by 
ngi1.it.quakenet.org
 (Registration Timeout)
Disconnected.
Sapresti indicarmi la via.... anche qualche doc su connessioni IRC nn 
sarebbe male!
Grazie 

Sto' leggendo l'RFC dell' Internet Relay Chat....
Ne quoto una parte:
***************************
3.1 Connection Registration
   The commands described here are used to register a connection with an IRC 
server as a user as well as to correctly disconnect.
   A "PASS" command is not required for a client connection to be 
registered, but it MUST precede the latter of the NICK/USER combination (for 
a user connection) or the SERVICE command (for a service connection). The 
RECOMMENDED order for a client to register is as follows:
           1. Pass message
           2. Nick message     or       2. Service message
           3. User message
   Upon success, the client will receive an RPL_WELCOME (for users) or 
RPL_YOURESERVICE (for services) message indicating that the  connection is 
now registered and known the to the entire IRC network.
   The reply message MUST contain the full client identifier upon which it 
was registered.
***************************
Intanto ho scoperto a cosa serve il comando registerservice, e nn mi serve.
Conoscendo anche solo un po'.... come funzionano le Indy, io credo che 
quando faccio la connessione il componente IndyIRCClient risponda 
automaticamente alle richieste PASS, NICK, USER che può fare il server, 
tanto più che questi valori sono delle property del componente, e xkè 
metterli come property se poi li devo "mandare a mano" durante la 
connessione con l'apposito comando IdIRC.Sendcmd('PASS ',ecc......); ??
Proseguendo su questa strada se l'autenticazione la fa' da solo.... xkè nn 
riesco a ricevere il WELCOME? eppure l'evento del client.OnServerWelcome è 
settato, ma niente.
procedure TForm1.IdIRC1ServerWelcome(ASender: TIdContext; AWelcomeInfo: 
TStrings);
begin
  Richedit2.Lines:=Awelcomeinfo;
end;
Qualche idea?!