All pastes #398777 Raw Edit

Untitled

public text v1 · immutable
·published 2007-03-17 15:04 UTC
rendered paste body
(*
  Unit com a Classe TIrc e todas as classes necessárias ao seu funcionamento.
  Eduardo Rolim(Vndmtrx) - Knal #DelphiX - [BrasNet]
  www.delphix.com.br
*)

unit unIrc;

interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Contnrs, unCoreIrc, unModos;

Type

  TMode = Class;

  TMensagemEvent = Procedure (Mensagem: TMensagem) of Object;
  TModeEvent = Procedure (Mode: TMode) of Object;

  TIrc = Class (TObject)
  private
    FCore: TCoreIrcProtocol;
    FOnMensagem: TMensagemEvent;
    FOnPrivmsg: TMensagemEvent;
    FOnUnknownMensagem: TMensagemEvent;
    FOnMode: TModeEvent;
    FOnPing: TMensagemEvent;
    FOnKick: TMensagemEvent;
    // nicklist
    FOnNames: TMensagemEvent;
    FOnJoin: TMensagemEvent;
    FOnPart: TMensagemEvent;
    FOnNick: TMensagemEvent;
    FOnQuit: TMensagemEvent;
  protected
    procedure DoMensagem(const Mensagem: TMensagem); Virtual;
    procedure DoUnknownCmd(const Mensagem: TMensagem); Virtual;
    procedure DoPrivmsg(const Mensagem: TMensagem); Virtual;
    procedure DoMode(const Mensagem: TMensagem); Virtual;
    procedure DoJoin(const Mensagem: TMensagem); virtual;
    procedure DoPart(const Mensagem: TMensagem); virtual;
    procedure DoNick(const Mensagem: TMensagem); virtual;
    procedure DoPing(const Mensagem: TMensagem); virtual;
    procedure DoKick(const Mensagem: TMensagem); virtual;
    procedure DoNames(const Mensagem: TMensagem); virtual;
    procedure DoQuit(const Mensagem: TMensagem); virtual;
  public
    constructor Create;
    destructor Destroy; Override;

    procedure RecebeProtocolo(Mensagem: String);

    property OnMensagem: TMensagemEvent Read FOnMensagem Write FOnMensagem;
    property OnUnknownMensagem: TMensagemEvent Read FOnUnknownMensagem Write FOnUnknownMensagem;
    property OnPrivMsg: TMensagemEvent Read FOnPrivMsg Write FOnPrivMsg;
    property OnMode: TModeEvent Read FOnMode Write FOnMode;
    property OnJoin: TMensagemEvent read FOnJoin write FOnJoin;
    property OnPart: TMensagemEvent read FOnPart write FOnPart;
    property OnNickChange: TMensagemEvent read FOnNick write FOnNick;
    property OnPing: TMensagemEvent read FOnPing write FOnPing;
    property OnKick: TMensagemEvent read FOnKick write FOnKick;
    property OnNames: TMensagemEvent read FOnNames write FOnNames;
    property OnQuit: TMensagemEvent read FOnQuit write FOnQuit;
  end;

  TMode = Class(TObject)
  Private
    FAlvo: String;
    FOperador: Char;
    FModo: Char;
    FComplemento: String;
  Public
    Constructor Create;

    Class Function Transitivo(Modo: Char): Boolean;

    Property Alvo: String Read FAlvo Write FAlvo;
    Property Modo: Char Read FModo Write FModo;
    Property Operador: Char Read FOperador Write FOperador;
    Property Complemento: String Read FComplemento Write FComplemento;
  end;

implementation

{ TIrc }

constructor TIrc.Create;
begin
  FCore := TCoreIrcProtocol.Create;
  FCore.UnkownComando := DoUnknownCmd;
  FCore.Mensagem := DoMensagem;
  FCore.AddManipulador('PRIVMSG', DoPrivmsg);
  FCore.AddManipulador('MODE', DoMode);
  FCore.AddManipulador('JOIN', DoJoin);
  FCore.AddManipulador('PART', DoPart);
  FCore.AddManipulador('NICK', DoNick);
  FCore.AddManipulador('PING', DoPing);
  FCore.AddManipulador('KICK', DoKick);
  FCore.AddManipulador('353', DoNames);
  FCore.AddManipulador('QUIT', DoQuit);
end;

destructor TIrc.Destroy;
begin
  FCore.Free;
end;

procedure TIrc.DoMensagem(Const Mensagem: TMensagem);
begin
  If Assigned(FOnMensagem) then
    FOnMensagem(Mensagem);
end;

// Descrição do comando MODE <alvo> +/-<modo> <complemento>
procedure TIrc.DoMode(Const Mensagem: TMensagem);
Var
 Alvo, Mode: String;
 TempOp, TempMode: Char;
 ClModo: TMode;
 QueueComplemento: TQueue;
 I: Integer;
begin
  QueueComplemento := TQueue.Create;
  TempOp := #0;
  If Assigned(FOnMode) then begin
    //Efetua a divisão do mode e chama FOnMode(Alvo, Op, Modo, Complemento) para
    //cada modo individual (MODE #Knl +vv-o nick nick nick = 3 chamadas à FOnMode)
    //Implementar uma classe específica para tratamento de modes
    Alvo := Mensagem.Params[0];
    Mode := Mensagem.Params[1];

    for I := 2 to Mensagem.ParamCount - 1 do
      QueueComplemento.Push(PChar(Mensagem.Params[I]));

    while Length(Mode) > 0 do begin
      if Mode[1] in ['+', '-']then begin
        TempOp := Mode[1];
        Delete(Mode, 1, 1);
      end else begin
        TempMode := Mode[1];
        Delete(Mode, 1, 1);
        
        ClModo := TMode.Create;
        ClModo.Alvo := Alvo;
        ClModo.Operador := TempOp;
        ClModo.Modo := TempMode;
        
        if ClModo.Transitivo(TempMode) then
          ClModo.Complemento := String(QueueComplemento.Pop);
          
        FOnMode(ClModo);
        ClModo.Free;
      end;
    end;
  QueueComplemento.Free;
  end;
end;

procedure TIrc.DoNames(const Mensagem: TMensagem);
begin
  if Assigned(FOnNames) then
    FOnNames(Mensagem);
end;

procedure TIrc.DoNick(const Mensagem: TMensagem);
begin
  if Assigned(FOnNick) then
    FOnNick(Mensagem);
end;

procedure TIrc.DoPart(const Mensagem: TMensagem);
begin
  if Assigned(FOnPart) then
    FOnPart(Mensagem);
end;

procedure TIrc.DoPing(const Mensagem: TMensagem);
begin
  if Assigned(FOnPing) then
    FOnPing(Mensagem);
end;

procedure TIrc.DoPrivmsg(Const Mensagem: TMensagem);
begin
  If Assigned(FOnPrivmsg) then
    FOnPrivmsg(Mensagem);
end;

procedure TIrc.DoQuit(const Mensagem: TMensagem);
begin
  if Assigned(FOnQuit) then
    FOnQuit(Mensagem);
end;

procedure TIrc.DoUnknownCmd(Const Mensagem: TMensagem);
begin
  If Assigned(FOnUnknownMensagem) then
    FOnUnknownMensagem(Mensagem);
end;

procedure TIrc.DoJoin(const Mensagem: TMensagem);
begin
  if Assigned(FOnJoin) then
    FOnJoin(Mensagem);
end;

procedure TIrc.DoKick(const Mensagem: TMensagem);
begin
  if Assigned(FOnKick) then
    FOnKick(Mensagem);  
end;

procedure TIrc.RecebeProtocolo(Mensagem: String);
begin
  FCore.ProcessProtocol(Mensagem);
end;

{ TModo }

constructor TMode.Create;
begin
  FAlvo := #0;
  FOperador := #0;
  FComplemento := #0;
  FModo := #0;
end;

class function TMode.Transitivo(Modo: Char): Boolean;
begin
  Result := Modo in ['a','o','v','b','e','f','k','l'];
end;

end.










//----------------------------------------------------
//---------------------------------------------------

unit UnIrcEx;

interface

uses
  UnIrc, Classes, unCoreIrc, SysUtils;

type
  TPing      = procedure (const Resposta: String) of Object;
  TListNicks = procedure (const Canal: String; ListaNicks: TStringList) of object;
  TChangeList= procedure (const Canal: String; Nick: String) of Object;
  TKick      = procedure (const Operador, Nick, Canal, Razao: String) of object;
  TNickChange= procedure (const OldNick: String; NewNick: String) of Object;
  TQuit      = procedure (const Nick: String) of Object;

type
  TIrcEx = class(TObject)
  private
    Irc: TIrc;
    FOnMode: TModeEvent;
    FOnNames: TListNicks;
    FOnJoin: TChangeList;
    FOnPart: TChangeList;
    FOnKick: TKick;
    FOnNickChange: TNickChange;
    FOnPing: TPing;
    FOnQuit: TQuit;
  protected
    procedure DoUserJoin(Mensagem: TMensagem);
    procedure DoUserPart(Mensagem: TMensagem);
    procedure DoNick(Mensagem: TMensagem);
    procedure DoPing(Mensagem: TMensagem);
    procedure DoKick(Mensagem: TMensagem);
    procedure DoNames(Mensagem: TMensagem);
    procedure DoQuit(Mensagem: TMensagem);
    procedure DoMode(Mode: TMode); virtual;
  public
    procedure RecebeProtocolo(Mensagem: String);
    // eventos
    property OnNames: TListNicks read FOnNames write FOnNames;
    property OnJoin: TChangeList read FOnJoin write FOnJoin;
    property OnPart: TChangeList read FOnPart write FOnPart;
    property OnUserKicked: TKick read FOnKick write FOnKick;
    property OnNickChange: TNickChange read FOnNickChange write FOnNickChange;
    property OnServerPing: TPing read FOnPing write FOnPing;
    property OnMode: TModeEvent read FOnMode write FOnMode;
    property OnPing: TPing read FOnPing write FOnPing;
    property OnQuit: TQuit read FOnQuit write FOnQuit;
  published
    constructor Create;
    destructor Destroy;
  end;

implementation

{ TIrcEx }

constructor TIrcEx.Create;
begin
  inherited Create;
  Irc := TIrc.Create;
  Irc.OnNickChange := DoNick;
  Irc.OnJoin  := DoUserJoin;
  Irc.OnPart  := DoUserPart;
  Irc.OnPing  := DoPing;
  Irc.OnKick  := DoKick;
  Irc.OnNames := DoNames;
  Irc.OnQuit  := DoQuit;
end;

destructor TIrcEx.Destroy;
begin
  Irc.Destroy;
  inherited;
end;

procedure TIrcEx.DoMode(Mode: TMode);
begin
  if Assigned(FOnMode) then
    FOnMode(Mode);
end;

procedure TIrcEx.DoKick(Mensagem: TMensagem);
begin
  if(Assigned(FOnKick))and(Mensagem.ParamCount = 2)then
    FOnKick(Copy(Mensagem.Host, 1, Pos('!', Mensagem.Host)-1),{ Kickador }
           Mensagem.Params[1]{Canal},
           Mensagem.Params[0]{Nick} ,
           Mensagem.Params[2]{Razao});
end;

procedure TIrcEx.DoNames(Mensagem: TMensagem);
var
  Str: TStringList;
begin
  if(Assigned(FOnNames))and(Mensagem.Command = '353')then
  begin
    Str := TStringList.Create;
    Str.Text := StringReplace(Mensagem.Params[3], #32, #13#10, [rfReplaceAll]);
    FOnNames(Mensagem.Params[2], Str);
    Str.Free;
  end;
end;

procedure TIrcEx.DoNick(Mensagem: TMensagem);
begin
  if Assigned(FOnNickChange) then
    FOnNickChange(Copy(Mensagem.Host, 1, Pos('!', Mensagem.Host)-1), Mensagem.Params[0]);
end;

procedure TIrcEx.DoPing(Mensagem: TMensagem);
begin
  if Assigned(FOnPing) then
    FOnPing(Mensagem.Params[0]);
end;

procedure TIrcEx.DoQuit(Mensagem: TMensagem);
begin
  if Assigned(FOnQuit) then
    FOnQuit(Copy(Mensagem.Host, 1, Pos('!', Mensagem.Host)-1));
end;

procedure TIrcEx.DoUserJoin(Mensagem: TMensagem);
begin
  if Assigned(FOnJoin) then
    FOnJoin(Mensagem.Params[0], Copy(Mensagem.Host, 1, Pos('!', Mensagem.Host)-1));
end;

procedure TIrcEx.DoUserPart(Mensagem: TMensagem);
begin
  if Assigned(FOnPart) then
    FOnPart(Mensagem.Params[0], Copy(Mensagem.Host, 1, Pos('!', Mensagem.Host)-1));
end;

procedure TIrcEx.RecebeProtocolo(Mensagem: String);
begin
  Irc.RecebeProtocolo(Mensagem);
end;

end.