Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problema con Indy/IRC (https://www.clubdelphi.com/foros/showthread.php?t=65954)

Gean 24-01-2010 12:37:38

Problema con Indy/IRC
 
Vereis, uso este codigo que vi en una pagina para conectarme a un servidor irc:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
IdIRC1.Host := 'irc.irc-hispano.org';
  IdIRC1.Port := 6667;
  IdIRC1.Nickname := edit1.Text;//insert your nickname here
   IdIRC1.Username:='JoeBlogg';
    IdIRC1.AltNickname:=' JoeB';
    try
    idIRC1.Connect;   
  except
    if not idIRC1.Connected then
      begin
        MessageDlg('Error connecting to ' + idIRC1.Host, mtError,
[mbOK], 0);
        Exit;
      end;
  end;
  MessageDlg('Connected to ' + idIRC1.Host, mtInformation,
[mbOK], 0);
  button1.Enabled:=false;
end;
y me devuelve el mensaje de conectado, entonces, creo otro boton para unirme a un chanel con el codigo:
Código Delphi [-]
IdIRC1.Join ('#delphi')
pero no me conecta al canal(estoi dentro con mIRC, y no lo veo)
En que fallo (?)

Gean 24-01-2010 15:51:21

umm :| abri y cerre delphi y se me soluciono :S
ahora lo que me esta costando es recibir la lista de usuarios en el canal...

Gean 26-01-2010 20:07:47

=( no he conseguido listar la lista de usuarios en el canal, alguien me puede ayudar :( ?

DriverOp 26-01-2010 21:44:54

El servidor IRC no te envia la lista a menos que se la pidas. El comando para ello es (si mi memoria no me falla):

NAMES #NombreDelCanal

La lista es un string con los nicks separados por espacios.

Enan0 27-01-2010 15:47:09

Hola Gean, mira creo que para futuros problemas que vas a tener.

te va a servir mucho lo Siguiente. "RFC- del IRC" te dejo el linc con todos los Comandos Cliente /servidor. Etc.

saludos.

http://www.rfc-es.org/rfc/rfc1459-es.txt

Gean 31-01-2010 13:56:13

Cita:

Empezado por DriverOp (Mensaje 351921)
El servidor IRC no te envia la lista a menos que se la pidas. El comando para ello es (si mi memoria no me falla):

NAMES #NombreDelCanal

La lista es un string con los nicks separados por espacios.

no me sirve ese comando
y sigo sin poder realizarlo :S
la verdad es que no se como hacerlo, solo kiero listar los usuarios de un chanel en un memo o un list, y no puedo T_T

DriverOp 31-01-2010 19:08:51

Cita:

Empezado por Gean (Mensaje 352412)
no me sirve ese comando

Lo lamento, a mi no me sirve que me digas que no te sirve. Me serviría si me dijeras por qué no te sirve.
Acabo de leer el RFC1459 y el comando NAMES es el que debes usar para lo que quieres. Si tienes problemas con esto me gustaría que me lo comentaras, en un mensaje de no menos de 100 palabras.

Gean 31-01-2010 19:50:01

No, si eso lo he visto, pero te explico, el componente IdIRC no tiene ese procedimiento, o yo por lo menos no lo veo, como tendria que llamarlo? con RAW?

DriverOp 31-01-2010 20:02:30

Cita:

Empezado por Gean (Mensaje 352433)
No, si eso lo he visto, pero te explico, el componente IdIRC no tiene ese procedimiento, o yo por lo menos no lo veo, como tendria que llamarlo? con RAW?

Bueno!, vamos progresando, primera vez que mencionas que estás usando un idIRC. Veamos...

Leo la ayuda del componente en cuestión y encuentro un método llamado ListChannelNicknames y un evento llamado OnNicknamesListReceived y me pregunto si tendrá algo que ver con tu problema ;).

Gean 31-01-2010 20:09:29

sii, tengo puesto esto:
Código Delphi [-]
procedure TForm2.IdIRC1NicknamesListReceived(ASender: TIdContext;
  const AChannel: string; ANicknameList: TStrings);
var
  i:integer;
begin
Usuarios.Items.Add('Nicknames in Channel: '+AChannel);
for i:= 0 to ANicknameList.Count-1 do begin
Usuarios.Items.add(ANicknameList.Strings[i]);
end;
end;
pero lo que me devuelve esto asi:
minick
minick = nombredelcanal: minick nick1 nick2...

como podria listar solamente minick en una linea
nick1 en otra linea
nick2 en otra linea...
es eso lo k kiero, si no puede ser en un listbox, en un memo

DriverOp 31-01-2010 20:17:12

Hombre... La lista ya está en un TStrings, entonces si la quieres en un TMemo basta con hacer:

Código Delphi [-]
Memo1.Lines.AddStrings(ANicknameList);

y listo ;).

Gean 31-01-2010 20:20:36

claro, pero con ese codigo me devuelve lo que te he puesto en el mensaje anterior, lo que me gustaria es que se quedasen en lineas distintas en un memo, o preferiblemente en items diferentes en un list Box

DriverOp 31-01-2010 21:05:59

Cita:

Empezado por Gean (Mensaje 352440)
claro, pero con ese codigo me devuelve lo que te he puesto en el mensaje anterior, lo que me gustaria es que se quedasen en lineas distintas en un memo, o preferiblemente en items diferentes en un list Box

Ah, comprendo, parece que ANicknameList devuelve todos los nicks de un canal en una línea y en la siguiente línea los de otro canal y así sucesivamente.

Pues habrá que parsear el string donde están los nicks que te interesan, digo yo. Me parece extraño pero no tengo Indy10 para probar lo que dices. Como sea, este código te puede ayudar a parsear la cadena que tiene los nicks:

Código Delphi [-]
function GetToken(Cadena:string; Separador:char; Token:integer):string;
var
   Posicion:integer;
begin
     while Token > 1 do begin
       Delete(Cadena,1,Pos(Separador,Cadena));
       Dec(Token);
     end;
     Posicion:=Pos(Separador,Cadena);
     if Posicion=0 then
       Result:=cadena
     else
       Result:=Copy(Cadena,1,Posicion-Length(Separador));
end;

function GetTokenCount(Cadena:string; Separador:char):integer;
var
   Posicion:integer;
begin
  Posicion:=Pos(Separador,Cadena);
  Result:=1;
  if Cadena <> '' then
    begin
      if Posicion <> 0 then
        begin
        while Posicion <> 0 do
          begin
            Delete(Cadena,1,Posicion);
            Posicion:=Pos(Separador,Cadena);
            Inc(Result);
          end; // while
      end; // if
  end // if
    else Result:=0;
end;

procedure TForm2.IdIRC1NicknamesListReceived(ASender: TIdContext;
  const AChannel: string; ANicknameList: TStrings);
var
  Str: string;
  n: integer;
begin
  Str:=ANicknameList.Strings[1]; { Según el código es el string en la posición 1 el que te interesa }
  for n:=1 to GetTokenCount(Str,' ') do
    Memo1.Lines.Append(GetToken(Str,' ',n));
end;
En el TMemo obtendrás algo más que los nicks pero supongo que sabrás qué hacer con el resto.

Gean 31-01-2010 22:45:47

=( muxas gracias por la paciencia k tienes conmigo, pero probando con ese codigo solo me sale mi nick... dejalo ya si kieres, haber si encuentro algo yo... :S

DriverOp 31-01-2010 22:52:35

Como gustes...

genyus00 23-07-2010 04:22:18

Encontrastes solucion?
 
por si no.. o si alguien llega a este punto. utilicen:

para indy 9.00.19 delphi 7

procedure TSoundForm.IdIRC1Names(Sender: TObject; AUsers: TIdIRCUsers; AChannel: TIdIRCChannel);
var i: Integer;
begin
if Assigned(AUsers) then
begin
ListBox1.Clear;
for i := 0 to AUsers.Count - 1 do
ListBox1..Items.Add( AUsers.Items[i].Nick );
end;
end;


La franja horaria es GMT +2. Ahora son las 14:17:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi