Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // IRC engine by reiser
- //
- unit ReiIRC;
- interface
- uses
- Windows, WinSock2, ReiGlobal, ReiDCC, ReiStringArray, ReiThread, ReiCommandDispatcher;
- const
- IRC_DEFAULT_PORT = 6667; // Default port IRC servera
- AllowedChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789[]\`_^{|}-';
- type
- TReiIRC = class;
- TRawEvent = procedure(ASender : TReiIRC; const AMessage : String; const AIn : Boolean) of object;
- TMOTD = procedure of object;
- TPingEvent = procedure(ASender : TReiIRC; const AFrom : String; var returnPong : Boolean) of object;
- TJoinEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, AKeyword : String) of object;
- TPartEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, AReason : String) of object;
- TPrivMsgEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, ATarget, AMessage : String) of object;
- TCTCPEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, ATarget, AMessage : String) of object;
- TNoticeEvent = procedure(ASender : TReiIRC; const ANicknameFrom, AUser, AHost, ANicknameTo, AMessage : String) of object;
- TModeChangeEvent = procedure(ASender : TReiIRC; const ATarget, AMode, AParams : String) of object;
- TOPEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ATarget : String) of object;
- THOPEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ATarget : String) of object;
- TVoiceEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ATarget : String) of object;
- TDeOPEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ATarget : String) of object;
- TDeHOPEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ATarget : String) of object;
- TDeVoiceEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ATarget : String) of object;
- TKickEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ATarget : String) of object;
- TInviteEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ATarget : String) of object;
- TQuitEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AReason : String) of object;
- TNicknameChangeEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, ANewNickname : String) of object;
- TTopicChangeEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AChannel, ANewTopic : String) of object;
- TBanEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AHostmask : String) of object;
- TUnbanEvent = procedure(ASender : TReiIRC; const ANickname, AUser, AHost, AHostmask : String) of object;
- TTopicReceiveEvent = procedure(ASender : TReiIRC; const AChannel, ATopic : String) of object;
- TNicknamesListReceiveEvent = procedure(ASender : TReiIRC; const AChannel : String; const ANicknames : TStringArray) of object;
- TNicknameInUse = procedure(ASender : TReiIRC; const ANickname : String; var ANewNickname : String) of object;
- TNicknameNotify = procedure(ASender : TReiIRC; const ANickname : String; const AOnline : Boolean) of object;
- TErrorReceive = procedure(ASender : TReiIRC; const AError : String) of object;
- TDCCChatIncoming = procedure(ASender : TReiIRC; const AAddress : String; const APort : Integer; var AAccept : Boolean) of object;
- TDCCChatOutgoing = procedure(ASender : TReiIRC; const AAddress : String; const APort : Integer) of object;
- TDCCChatMessage = procedure(ASenderIRC : TReiIRC; ASenderDCC : TReiDCC; const AMessage : String) of object;
- TDCCFileIncoming = procedure(ASender : TReiIRC; const AFilename, AAddress : String; const APort, AFilesize : Integer; var AAccept : Boolean) of object;
- TDCCFileOutgoing = procedure(ASender : TReiIRC; const AFilename, AAddress : String; const APort, AFilesize : Integer) of object;
- TIRCChannels = class
- protected
- Channels : TReiStringArray;
- Keywords : TReiStringArray;
- FCount : DWORD;
- public
- constructor Create;
- destructor Free;
- function GetChannel(const AIndex : DWORD; var AChannel, AKeyword : String) : Integer;
- function FindChannel(const AChannel : String; var AIndex : DWORD) : Integer;
- function DeleteChannel(const AIndex : DWORD) : Integer;
- function AddChannel(const AChannel, AKeyword : String) : Integer;
- function SwapChannels(const AFirstIndex, ASecondIndex : DWORD) : Integer;
- procedure ClearChannels;
- published
- property Count : DWORD read FCount;
- end;
- TRawMessageInfo = record
- Prefix : record
- AType : Integer;
- Server : String;
- Nickname : String;
- Username : String;
- Hostmask : String;
- end;
- Command : record
- AType : Integer;
- Number : Integer;
- Text : String;
- end;
- Params : TStringArray;
- end;
- TDCC = record
- Count : Integer;
- Items : Array of TReiDCC;
- end;
- TReiIRC = class
- protected
- FConnected : Boolean;
- FSock : TSocket;
- FPort : DWORD;
- FServer : String;
- FPassword : String;
- FNickname : String;
- FHostmask : String;
- FUsername : String;
- FRealname : String;
- FSenderNick : String;
- FSenderUser : String;
- FSenderHost : String;
- FAutoRejoin : Boolean;
- FPingRespond : Boolean;
- FVersionRespondString : String;
- FMessageContainer : TReiStringArray;
- FChannels : TIRCChannels;
- FAntiFlood : Boolean;
- FMOTDReceived : Boolean;
- FNotifyList : TReiStringArray;
- FNotifyListOnline : TReiStringArray;
- FNotifyListEnabled : Boolean;
- MsgContainerThread : TReiThread;
- DataRecvThread : TReiThread;
- NotifyListThread : TReiThread;
- FOnRaw : TRawEvent;
- FOnMOTD : TMOTD;
- FOnPing : TPingEvent;
- FOnJoin : TJoinEvent;
- FOnPart : TPartEvent;
- FOnPrivMsg : TPrivMsgEvent;
- FOnCTCP : TCTCPEvent;
- FOnNotice : TNoticeEvent;
- FOnModeChange : TModeChangeEvent;
- FOnOP : TOPEvent;
- FOnHOP : THOPEvent;
- FOnVoice : TVoiceEvent;
- FOnDeOP : TDeOPEvent;
- FOnDeHOP : TDeHOPEvent;
- FOnDeVoice : TDeVoiceEvent;
- FOnKick : TKickEvent;
- FOnInvite : TInviteEvent;
- FOnQuit : TQuitEvent;
- FOnNicknameChange : TNicknameChangeEvent;
- FOnTopicChange : TTopicChangeEvent;
- FOnBan : TBanEvent;
- FOnUnban : TUnbanEvent;
- FOnTopicReceive : TTopicReceiveEvent;
- FOnNicknamesListReceive : TNicknamesListReceiveEvent;
- FOnNicknameInUse : TNicknameInUse;
- FOnNicknameNotify : TNicknameNotify;
- FOnErrorReceive : TErrorReceive;
- FOnDCCChatIncoming : TDCCChatIncoming;
- FOnDCCChatOutgoing : TDCCChatOutgoing;
- FOnDCCChatMessage : TDCCChatMessage;
- FOnDCCFileIncoming : TDCCFileIncoming;
- FOnDCCFileOutgoing : TDCCFileOutgoing;
- FCommands : TReiCommandDispatcher;
- FTag : Integer;
- MCLastSend : DWORD;
- MCNextDelay : DWORD;
- FUserModes : record
- Away : Boolean;
- RecvWallops : Boolean;
- Invisible : Boolean;
- end;
- function CommandMOTD(ACommand : TReiCommandData) : Integer;
- function CommandPing(ACommand : TReiCommandData) : Integer;
- function CommandJoin(ACommand : TReiCommandData) : Integer;
- function CommandPart(ACommand : TReiCommandData) : Integer;
- function CommandPrivMsg(ACommand : TReiCommandData) : Integer;
- function CommandNotice(ACommand : TReiCommandData) : Integer;
- function CommandModeChange(ACommand : TReiCommandData) : Integer;
- function CommandKick(ACommand : TReiCommandData) : Integer;
- function CommandInvite(ACommand : TReiCommandData) : Integer;
- function CommandQuit(ACommand : TReiCommandData) : Integer;
- function CommandNicknameChange(ACommand : TReiCommandData) : Integer;
- function CommandTopicChange(ACommand : TReiCommandData) : Integer;
- function CommandTopicReceive(ACommand : TReiCommandData) : Integer;
- function CommandNicknamesListReceive(ACommand : TReiCommandData) : Integer;
- function CommandNicknameInUse(ACommand : TReiCommandData) : Integer;
- function CommandNicknameNotify(ACommand : TReiCommandData) : Integer;
- function CommandErrorReceive(ACommand : TReiCommandData) : Integer;
- procedure CommandDCCChatMessage(ASenderDCC : TReiDCC; const AMessage : String);
- procedure MessageContainerThread(const AParam : pointer);
- procedure RecvThread(const AParam : pointer);
- procedure SetNickname(const AValue : String);
- procedure SetUsername(const AValue : String);
- procedure ProcessRawParams(const AParams : TStringArray);
- procedure SetInvisible(const AValue : Boolean);
- procedure SetRecvWallops(const AValue : Boolean);
- procedure SetNotifyListEnabled(const AValue : Boolean);
- procedure SendISON(const AParam : pointer);
- public
- DCC : TDCC;
- constructor Create;
- destructor Free;
- procedure AssignIRCClientCommands;
- function Connect : Integer;
- function Quit(const AReason : String) : Integer;
- procedure ParseRawMessage(const ARaw : String; out ARawMessageInfo : TRawMessageInfo);
- procedure SetAway(const AReason : String);
- procedure UnsetAway;
- procedure Raw(const AMsg : String; const Instant : Boolean = FALSE);
- procedure Join(const AChannel : String; const AKeyword : String = '');
- procedure Part(const AChannel : String; const AReason : String = '');
- procedure Say(const ATarget, AMessage : String);
- procedure Ping(const ATarget : String);
- procedure Pong(const ATarget : String);
- procedure Notice(const ATarget, AMessage : String);
- procedure SendCTCP(const ATarget, AMessage : String);
- procedure SetMode(const ATarget, AMode : String);
- procedure Kick(const AChannel, ANickname, AReason : String);
- procedure Ban(const AChannel, AHostmask : String);
- procedure Unban(const AChannel, AHostmask : String);
- procedure GiveOP(const AChannel, ANickname : String);
- procedure GiveHOP(const AChannel, ANickname : String);
- procedure GiveVoice(const AChannel, ANickname : String);
- procedure TakeOP(const AChannel, ANickname : String);
- procedure TakeHOP(const AChannel, ANickname : String);
- procedure TakeVoice(const AChannel, ANickname : String);
- procedure Invite(const AChannel, ANickname : String);
- procedure SendDCCFile(const ATarget, AFilename : String);
- published
- property Port : DWORD read FPort write FPort;
- property Server : String read FServer write FServer;
- property Password : String read FPassword write FPassword;
- property Nickname : String read FNickname write SetNickname;
- property Hostmask : String read FHostmask;
- property Username : String read FUsername write SetUsername;
- property Realname : String read FRealname write FRealname;
- property AutoRejoin : Boolean read FAutoRejoin write FAutoRejoin;
- property Connected : Boolean read FConnected;
- property PingRespond : Boolean read FPingRespond write FPingRespond;
- property VersionRespondString : String read FVersionRespondString write FVersionRespondString;
- property Away : Boolean read FUserModes.Away;
- property Invisible : Boolean read FUserModes.Invisible write SetInvisible;
- property RecvWallops : Boolean read FUserModes.RecvWallops write SetRecvWallops;
- property Channels : TIRCChannels read FChannels;
- property MessageContainer : TReiStringArray read FMessageContainer write FMessageContainer;
- property AntiFlood : Boolean read FAntiFlood write FAntiFlood;
- property NotifyList : TReiStringArray read FNotifyList write FNotifyList;
- property NotifyListEnabled : Boolean read FNotifyListEnabled write SetNotifyListEnabled;
- property MOTDReceived : Boolean read FMOTDReceived;
- property Tag : Integer read FTag write FTag;
- property OnRaw : TRawEvent read FOnRaw write FOnRaw;
- property OnMOTD : TMOTD read FOnMOTD write FOnMOTD;
- property OnPing : TPingEvent read FOnPing write FOnPing;
- property OnJoin : TJoinEvent read FOnJoin write FOnJoin;
- property OnPart : TPartEvent read FOnPart write FOnPart;
- property OnPrivMsg : TPrivMsgEvent read FOnPrivMsg write FOnPrivMsg;
- property OnCTCP : TCTCPEvent read FOnCTCP write FOnCTCP;
- property OnNotice : TNoticeEvent read FOnNotice write FOnNotice;
- property OnModeChange : TModeChangeEvent read FOnModeChange write FOnModeChange;
- property OnOP : TOPEvent read FOnOP write FOnOP;
- property OnHOP : THOPEvent read FOnHOP write FOnHOP;
- property OnVoice : TVoiceEvent read FOnVoice write FOnVoice;
- property OnDeOP : TDeOPEvent read FOnDeOP write FOnDeOP;
- property OnDeHOP : TDeHOPEvent read FOnDeHOP write FOnDeHOP;
- property OnDeVoice : TDeVoiceEvent read FOnDeVoice write FOnDeVoice;
- property OnKick : TKickEvent read FOnKick write FOnKick;
- property OnInvite : TInviteEvent read FOnInvite write FOnInvite;
- property OnQuit : TQuitEvent read FOnQuit write FOnQuit;
- property OnNicknameChange : TNicknameChangeEvent read FOnNicknameChange write FOnNicknameChange;
- property OnTopicChange : TTopicChangeEvent read FOnTopicChange write FOnTopicChange;
- property OnBan : TBanEvent read FOnBan write FOnBan;
- property OnUnban : TUnbanEvent read FOnUnban write FOnUnban;
- property OnTopicReceive : TTopicReceiveEvent read FOnTopicReceive write FOnTopicReceive;
- property OnNicknamesListReceive : TNicknamesListReceiveEvent read FOnNicknamesListReceive write FOnNicknamesListReceive;
- property OnNicknameInUse : TNicknameInUse read FOnNicknameInUse write FOnNicknameInUse;
- property OnNicknameNotify : TNicknameNotify read FOnNicknameNotify write FOnNicknameNotify;
- property OnDCCChatIncoming : TDCCChatIncoming read FOnDCCChatIncoming write FOnDCCChatIncoming;
- property OnDCCChatOutgoing : TDCCChatOutgoing read FOnDCCChatOutgoing write FOnDCCChatOutgoing;
- property OnDCCChatMessage : TDCCChatMessage read FOnDCCChatMessage write FOnDCCChatMessage;
- property OnDCCFileIncoming : TDCCFileIncoming read FOnDCCFileIncoming write FOnDCCFileIncoming;
- property OnDCCFileOutgoing : TDCCFileOutgoing read FOnDCCFileOutgoing write FOnDCCFileOutgoing;
- end;
- implementation
- {$I IRCCodes.inc}
- const
- CRLF = #$A;
- //
- // Create konstruktor
- //
- constructor TIRCChannels.Create;
- begin
- Channels := TReiStringArray.Create;
- Keywords := TReiStringArray.Create;
- Channels.AllowDuplicateItems := FALSE;
- Channels.CaseSensitive := FALSE;
- Keywords.AllowDuplicateItems := TRUE;
- Keywords.CaseSensitive := TRUE;
- FCount := 0;
- end;
- //
- // Free destruktor
- //
- destructor TIRCChannels.Free;
- begin
- Channels.Free;
- Keywords.Free;
- end;
- //
- // Vraca info o kanalu
- //
- function TIRCChannels.GetChannel(const AIndex : DWORD; var AChannel, AKeyword : String) : Integer;
- begin
- result := Channels.GetItem(AIndex, AChannel);
- If result <> ERROR_SUCCESS Then
- Exit;
- Keywords.GetItem(AIndex, AKeyword);
- end;
- //
- // Trazi zadati kanal u listi
- //
- function TIRCChannels.FindChannel(const AChannel : String; var AIndex : DWORD) : Integer;
- begin
- result := Channels.FindItem(AChannel, AIndex);
- end;
- //
- // Brise kanal iz liste
- //
- function TIRCChannels.DeleteChannel(const AIndex : DWORD) : Integer;
- begin
- result := Channels.DeleteItem(AIndex);
- If result = ERROR_SUCCESS Then
- Begin
- Keywords.DeleteItem(AIndex);
- Dec(FCount);
- End;
- end;
- //
- // Dodaje kanal u listu
- //
- function TIRCChannels.AddChannel(const AChannel, AKeyword : String) : Integer;
- begin
- result := Channels.AddItem(AChannel);
- If result = ERROR_SUCCESS Then
- Begin
- Keywords.AddItem(AKeyword);
- Inc(FCount);
- End;
- end;
- //
- // Menja mesta kanalima u listi
- //
- function TIRCChannels.SwapChannels(const AFirstIndex, ASecondIndex : DWORD) : Integer;
- begin
- result := Channels.SwapItems(AFirstIndex, ASecondIndex);
- If result = ERROR_SUCCESS Then
- Keywords.SwapItems(AFirstIndex, ASecondIndex);
- end;
- //
- // Brise sve kanale iz liste
- //
- procedure TIRCChannels.ClearChannels;
- begin
- Channels.ClearItems;
- Keywords.ClearItems;
- end;
- //
- // Create konstruktor
- //
- constructor TReiIRC.Create;
- begin
- FPort := IRC_DEFAULT_PORT;
- FSock := 0;
- FConnected := FALSE;
- FMOTDReceived := FALSE;
- FAutoRejoin := FALSE;
- FMessageContainer := TReiStringArray.Create;
- FAntiFlood := FALSE;
- FUserModes.Away := FALSE;
- FUserModes.Invisible := FALSE;
- FUserModes.RecvWallops := TRUE;
- FChannels := TIRCChannels.Create;
- FNotifyList := TReiStringArray.Create;
- FNotifyList.AllowDuplicateItems := FALSE;
- FNotifyList.CaseSensitive := FALSE;
- FNotifyList.ClearItems;
- FNotifyListOnline := TReiStringArray.Create;
- FNotifyListOnline.AllowDuplicateItems := FALSE;
- FNotifyListOnline.CaseSensitive := FALSE;
- FNotifyListOnline.ClearItems;
- SetNotifyListEnabled(FALSE);
- DCC.Count := 0;
- SetLength(DCC.Items, DCC.Count);
- FPingRespond := TRUE;
- FVersionRespondString := 'VERSION ReiIRC v0.02 engine';
- AssignIRCClientCommands;
- end;
- //
- // Free destruktor
- //
- destructor TReiIRC.Free;
- begin
- Quit('');
- end;
- //
- // Assignuje IRC komande
- //
- procedure TReiIRC.AssignIRCClientCommands;
- begin
- If not Assigned(FCommands) Then
- FCommands := TReiCommandDispatcher.Create;
- FCommands.ClearCommands;
- FCommands.AddCommand(IntToStr(RPL_ENDOFMOTD), CommandMOTD);
- FCommands.AddCommand(IntToStr(ERR_NOMOTD), CommandMOTD);
- FCommands.AddCommand('PING', CommandPing);
- FCommands.AddCommand('JOIN', CommandJoin);
- FCommands.AddCommand('PART', CommandPart);
- FCommands.AddCommand('PRIVMSG', CommandPrivMsg);
- FCommands.AddCommand('NOTICE', CommandNotice);
- FCommands.AddCommand('MODE', CommandModeChange);
- FCommands.AddCommand('KICK', CommandKick);
- FCommands.AddCommand('INVITE', CommandInvite);
- FCommands.AddCommand('QUIT', CommandQuit);
- FCommands.AddCommand('NICK', CommandNicknameChange);
- FCommands.AddCommand('TOPIC', CommandTopicChange);
- FCommands.AddCommand('ERROR', CommandErrorReceive);
- FCommands.AddCommand(IntToStr(RPL_NOTOPIC), CommandTopicReceive);
- FCommands.AddCommand(IntToStr(RPL_TOPIC), CommandTopicReceive);
- FCommands.AddCommand(IntToStr(RPL_NAMREPLY), CommandNicknamesListReceive);
- FCommands.AddCommand(IntToStr(ERR_NICKNAMEINUSE), CommandNicknameInUse);
- FCommands.AddCommand(IntToStr(RPL_ISON), CommandNicknameNotify);
- end;
- //
- // Konektovanje na IRC server
- //
- function TReiIRC.Connect : Integer;
- var
- WSAData : TWSAData;
- SockAddr : TSockAddrIn;
- positive : DWORD;
- begin
- If FConnected Then
- Begin
- result := ERROR_CONNECTED;
- Exit;
- End;
- result := WSAStartup($101, WSAData);
- If result <> 0 Then
- Begin
- WSACleanup;
- Exit;
- End;
- FSock := Socket(AF_INET, SOCK_STREAM, 0);
- If FSock = INVALID_SOCKET Then
- Begin
- Shutdown(FSock, SD_BOTH);
- CloseSocket(FSock);
- WSACleanup;
- result := INVALID_SOCKET;
- Exit;
- End;
- SockAddr.sin_family := AF_INET;
- SockAddr.sin_port := htons(FPort);
- SockAddr.sin_addr.S_addr := inet_addr(PAnsiChar(HostNameToIP(FServer)));
- result := WinSock2.Connect(FSock, @SockAddr, SizeOf(SockAddr));
- If result <> 0 Then
- Begin
- Shutdown(FSock, SD_BOTH);
- CloseSocket(FSock);
- WSACleanup;
- Exit;
- End;
- positive := 1;
- ioctlsocket(FSock, FIONBIO, positive);
- FConnected := TRUE;
- If not Assigned(DataRecvThread) Then
- DataRecvThread := TReiThread.Create;
- DataRecvThread.OnExecute := RecvThread;
- DataRecvThread.Start;
- If not Assigned(MsgContainerThread) Then
- MsgContainerThread := TReiThread.Create;
- MCNextDelay := 100;
- MCLastSend := GetTickCount;
- MsgContainerThread.OnExecute := MessageContainerThread;
- MsgContainerThread.Delay := CPUDelay;
- MsgContainerThread.Start;
- If FPassword <> '' Then
- Raw('PASS ' + FPassword);
- SetNickname(FNickname);
- SetUsername(FUsername);
- result := ERROR_SUCCESS;
- end;
- //
- // Diskonektuje se sa IRC servera
- //
- function TReiIRC.Quit(const AReason : String) : Integer;
- var
- C1 : Integer;
- begin
- If not FConnected Then
- Begin
- result := ERROR_NOT_CONNECTED;
- Exit;
- End
- else
- result := ERROR_SUCCESS;
- SetNotifyListEnabled(FALSE);
- FConnected := FALSE;
- If DCC.Count > 0 Then
- Begin
- For C1 := 0 to DCC.Count - 1 Do
- DCC.Items[C1].Free;
- DCC.Count := 0;
- SetLength(DCC.Items, DCC.Count);
- End;
- DataRecvThread.Stop;
- MsgContainerThread.Stop;
- Shutdown(FSock, SD_BOTH);
- CloseSocket(FSock);
- WSACleanup;
- FMOTDReceived := FALSE;
- FSock := 0;
- FUserModes.Away := FALSE;
- FUserModes.Invisible := FALSE;
- FUserModes.RecvWallops := TRUE;
- MCNextDelay := 100;
- MCLastSend := GetTickCount;
- FMessageContainer.ClearItems;
- FChannels.ClearChannels;
- end;
- //
- // Rasclanjuje raw poruku na njen prefix, komandu i parametre
- //
- procedure TReiIRC.ParseRawMessage(const ARaw : String; out ARawMessageInfo : TRawMessageInfo);
- var
- value : Int64;
- LD : Integer;
- C1 : Integer;
- rawPrefix : String;
- rawCommand : String;
- rawParams : String;
- begin
- If ARaw = '' Then
- Exit;
- rawPrefix := Copy(ARaw, 1, Pos(' ', ARaw) - 1);
- If (rawPrefix = '') or
- (rawPrefix = ':') Then
- Exit;
- If rawPrefix[1] = ':' Then
- Delete(rawPrefix, 1, 1);
- If (Pos('!', rawPrefix) = 0) and
- (Pos('@', rawPrefix) = 0) and
- (Pos('.', rawPrefix) > 0) and
- (PosEx('.', rawPrefix, Pos('.', rawPrefix) + 1) > 0) Then
- ARawMessageInfo.Prefix.AType := PREFIX_SERVER
- else
- ARawMessageInfo.Prefix.AType := PREFIX_USER;
- Case ARawMessageInfo.Prefix.AType of
- PREFIX_SERVER : ARawMessageInfo.Prefix.Server := rawPrefix;
- PREFIX_USER : Begin
- ARawMessageInfo.Prefix.Nickname := Copy(rawPrefix, 1, Pos('!', rawPrefix) - 1);
- ARawMessageInfo.Prefix.Username := Copy(rawPrefix, Pos('!', rawPrefix) + 1, Pos('@', rawPrefix) - Pos('!', rawPrefix) - 1);
- ARawMessageInfo.Prefix.Hostmask := Copy(rawPrefix, Pos('@', rawPrefix) + 1, Length(rawPrefix) - Pos('@', rawPrefix));
- End;
- End;
- rawCommand := Copy(ARaw, Pos(' ', ARaw) + 1, PosEx(' ', ARaw, Pos(' ', ARaw) + 1) - Pos(' ', ARaw) - 1);
- If rawCommand = '' Then
- Begin
- rawCommand := rawPrefix;
- ARawMessageInfo.Prefix.AType := 0;
- End;
- If (Length(rawCommand) = 3) and
- (TryStrToInt(rawCommand, value)) Then
- ARawMessageInfo.Command.AType := COMMAND_NUMBER
- else
- ARawMessageInfo.Command.AType := COMMAND_STRING;
- Case ARawMessageInfo.Command.AType of
- COMMAND_NUMBER : ARawMessageInfo.Command.Number := value;
- COMMAND_STRING : ARawMessageInfo.Command.Text := rawCommand;
- End;
- If ARawMessageInfo.Prefix.AType = 0 Then
- rawParams := Copy(ARaw, Pos(' ', ARaw) + 1, Length(ARaw) - Pos(' ', ARaw)) + ' '
- else
- rawParams := Copy(ARaw, PosEx(' ', ARaw, Pos(' ', ARaw) + 1) + 1, Length(ARaw) - PosEx(' ', ARaw, Pos(' ', ARaw) + 1)) + ' ';
- ARawMessageInfo.Params.Count := 0;
- SetLength(ARawMessageInfo.Params.Items, ARawMessageInfo.Params.Count);
- If (rawParams <> '') and
- (rawParams <> ' ') Then
- Begin
- LD := 0;
- For C1 := 1 to Length(rawParams) Do
- If rawParams[C1] = ' ' Then
- Begin
- Inc(ARawMessageInfo.Params.Count);
- SetLength(ARawMessageInfo.Params.Items, ARawMessageInfo.Params.Count);
- ARawMessageInfo.Params.Items[ARawMessageInfo.Params.Count - 1] := Copy(rawParams, LD + 1, C1 - LD - 1);
- LD := C1;
- End
- else
- If rawParams[C1] = ':' Then
- Begin
- Inc(ARawMessageInfo.Params.Count);
- SetLength(ARawMessageInfo.Params.Items, ARawMessageInfo.Params.Count);
- ARawMessageInfo.Params.Items[ARawMessageInfo.Params.Count - 1] := Copy(rawParams, C1 + 1, Length(rawParams) - C1 - 1);
- Break;
- End;
- End;
- end;
- //
- // Salje raw poruku na IRC server (u stvari, smesta poruku u listu poruka koje cekaju na slanje)
- //
- procedure TReiIRC.Raw(const AMsg : String; const Instant : Boolean = FALSE);
- begin
- If (FConnected) and
- (Assigned(FMessageContainer)) and
- (FMessageContainer.ItemsCount < 200) Then
- FMessageContainer.AddItem(AMsg, Instant);
- end;
- //
- // Ulazi na zadate kanale
- //
- procedure TReiIRC.Join(const AChannel : String; const AKeyword : String = '');
- begin
- Raw('JOIN ' + AChannel + ' ' + AKeyword);
- end;
- //
- // Izlazi sa zadatog kanala
- //
- procedure TReiIRC.Part(const AChannel : String; const AReason : String = '');
- begin
- Raw('PART ' + AChannel + ' :' + AReason);
- end;
- //
- // Salje message na kanal/user
- //
- procedure TReiIRC.Say(const ATarget, AMessage : String);
- var
- msg : String;
- begin
- msg := AMessage;
- Raw('PRIVMSG ' + ATarget + ' :' + msg);
- end;
- //
- // Salje PING targetu
- //
- procedure TReiIRC.Ping(const ATarget : String);
- begin
- Raw('PING :' + ATarget);
- end;
- //
- // Salje PONG targetu
- //
- procedure TReiIRC.Pong(const ATarget : String);
- begin
- Raw('PONG :' + ATarget);
- end;
- //
- // Salje notice na kanal/user
- //
- procedure TReiIRC.Notice(const ATarget, AMessage : String);
- var
- msg : String;
- begin
- msg := AMessage;
- Raw('NOTICE ' + ATarget + ' :' + msg);
- end;
- //
- // Salje CTCP na kanal/user
- //
- procedure TReiIRC.SendCTCP(const ATarget, AMessage : String);
- begin
- Say(ATarget, #1 + AMessage + #1);
- end;
- //
- // Setuje zadati mod
- //
- procedure TReiIRC.SetMode(const ATarget, AMode : String);
- begin
- Raw('MODE ' + ATarget + ' ' + AMode);
- end;
- //
- // Kickuje zadatog usera sa kanala
- //
- procedure TReiIRC.Kick(const AChannel, ANickname, AReason : String);
- begin
- Raw('KICK ' + AChannel + ' ' + ANickname + ' :' + AReason);
- end;
- //
- // Banuje zadati hostmask
- //
- procedure TReiIRC.Ban(const AChannel, AHostmask : String);
- begin
- SetMode(AChannel, '+b ' + AHostmask);
- end;
- //
- // Unbanuje zadati hostmask
- //
- procedure TReiIRC.Unban(const AChannel, AHostmask : String);
- begin
- SetMode(AChannel, '-b ' + AHostmask);
- end;
- //
- // Daje operator status nekom useru
- //
- procedure TReiIRC.GiveOP(const AChannel, ANickname : String);
- begin
- SetMode(AChannel, '+o ' + ANickname);
- end;
- //
- // Daje half-operator status nekom useru
- //
- procedure TReiIRC.GiveHOP(const AChannel, ANickname : String);
- begin
- SetMode(AChannel, '+h ' + ANickname);
- end;
- //
- // Daje voice status nekom useru
- //
- procedure TReiIRC.GiveVoice(const AChannel, ANickname : String);
- begin
- SetMode(AChannel, '+v ' + ANickname);
- end;
- //
- // Skida operator status nekom useru
- //
- procedure TReiIRC.TakeOP(const AChannel, ANickname : String);
- begin
- SetMode(AChannel, '-o ' + ANickname);
- end;
- //
- // Skida half-operator status nekom useru
- //
- procedure TReiIRC.TakeHOP(const AChannel, ANickname : String);
- begin
- SetMode(AChannel, '-h ' + ANickname);
- end;
- //
- // Skida voice status nekom useru
- //
- procedure TReiIRC.TakeVoice(const AChannel, ANickname : String);
- begin
- SetMode(AChannel, '-v ' + ANickname);
- end;
- //
- // Invite nekog usera na kanal
- //
- procedure TReiIRC.Invite(const AChannel, ANickname : String);
- begin
- Raw('INVITE ' + ANickname + ' ' + AChannel);
- end;
- //
- // Salje fajl preko DCC-a
- //
- procedure TReiIRC.SendDCCFile(const ATarget, AFilename : String);
- var
- port : Integer;
- sock : TSocket;
- readfd : TFDSet;
- tmo : TTimeVal;
- csock : TSocket;
- SAddr : TSockAddr;
- size : Integer;
- begin
- Inc(DCC.Count);
- SetLength(DCC.Items, DCC.Count);
- DCC.Items[DCC.Count - 1] := TReiDCC.Create;
- port := Random(40000) + 7000;
- If DCC.Items[DCC.Count - 1].OpenPort(port, sock) = ERROR_SUCCESS Then
- Begin
- SendCTCP(ATarget, 'DCC SEND ' + ExtractFileName(AFilename) + ' ' + LongIP(GetExternalIP) + ' ' + IntToStr(port) + ' ' + IntToStr(GetFileSize(AFilename)));
- readfd.fd_count := 1;
- readfd.fd_array[0] := sock;
- tmo.tv_sec := 10;
- tmo.tv_usec := 0;
- If select(0, @readfd, nil, nil, @tmo) = SOCKET_ERROR Then
- Begin
- Shutdown(sock, SD_BOTH);
- CloseSocket(sock);
- End
- else
- Begin
- size := SizeOf(TSockAddr);
- csock := accept(sock, @SAddr, @size);
- CloseSocket(sock);
- DCC.Items[DCC.Count - 1].SendFile(csock, AFilename);
- Shutdown(csock, SD_BOTH);
- CloseSocket(csock);
- End;
- End;
- end;
- //
- // Prethodnik OnMOTDReceived eventa
- //
- function TReiIRC.CommandMOTD(ACommand : TReiCommandData) : Integer;
- begin
- result := ERROR_SUCCESS;
- FMOTDReceived := TRUE;
- If Assigned(FOnMOTD) Then
- FOnMOTD;
- end;
- //
- // Prethodnik OnPing eventa
- //
- function TReiIRC.CommandPing(ACommand : TReiCommandData) : Integer;
- var
- from : String;
- returnPong : Boolean;
- begin
- result := ERROR_SUCCESS;
- from := ACommand.Params.Items[0];
- returnPong := TRUE;
- If Assigned(FOnPing) Then
- FOnPing(self, from, returnPong);
- If returnPong Then
- Pong(from);
- end;
- //
- // Prethodnik OnJoin eventa
- //
- function TReiIRC.CommandJoin(ACommand : TReiCommandData) : Integer;
- var
- channel, keyword : String;
- begin
- result := ERROR_SUCCESS;
- channel := ACommand.Params.Items[0];
- keyword := '';
- If ACommand.Params.Count > 1 Then
- keyword := ACommand.Params.Items[1];
- Channels.AddChannel(channel, keyword);
- If Assigned(FOnJoin) Then
- FOnJoin(self, FSenderNick, FSenderUser, FSenderHost, channel, keyword);
- end;
- //
- // Prethodnik OnPart eventa
- //
- function TReiIRC.CommandPart(ACommand : TReiCommandData) : Integer;
- var
- channel, reason : String;
- index : DWORD;
- begin
- result := ERROR_SUCCESS;
- reason := '';
- channel := ACommand.Params.Items[0];
- If ACommand.Params.Count > 1 Then
- reason := ACommand.Params.Items[1];
- If Channels.FindChannel(channel, index) = ERROR_SUCCESS Then
- Channels.DeleteChannel(index);
- If Assigned(FOnPart) Then
- FOnPart(self, FSenderNick, FSenderUser, FSenderHost, channel, reason);
- end;
- //
- // Prethodnik OnPrivMsg eventa
- //
- function TReiIRC.CommandPrivMsg(ACommand : TReiCommandData) : Integer;
- var
- target, msg : String;
- arr : TStringArray;
- port : Int64;
- filesize : Int64;
- accept : Boolean;
- loctime : TSystemTime;
- loctimes : String;
- begin
- result := ERROR_SUCCESS;
- target := ACommand.Params.Items[0];
- msg := '';
- If ACommand.Params.Count > 1 Then
- msg := ACommand.Params.Items[1];
- If (msg[1] = #1) and
- (msg[Length(msg)] = #1) Then
- Begin
- Delete(msg, 1, 1);
- Delete(msg, Length(msg), 1);
- ExtractParams(msg, arr, FALSE);
- If arr.Count > 0 Then
- Begin
- If (LowerCase(arr.Items[0]) = 'version') and
- (FVersionRespondString <> '') Then
- If target <> FNickname Then
- Notice(target, FVersionRespondString)
- else
- Notice(FSenderNick, FVersionRespondString);
- If LowerCase(arr.Items[0]) = 'time' Then
- Begin
- GetLocalTime(loctime);
- loctimes := 'TIME ' + FormatStr(IntToStr(loctime.wHour), 2, '0', asRight) + ':' + FormatStr(IntToStr(loctime.wMinute), 2, '0', asRight) + ':' +
- FormatStr(IntToStr(loctime.wSecond), 2, '0', asRight) + ' ' + FormatStr(IntToStr(loctime.wDay), 2, '0', asRight) + '/' +
- FormatStr(IntToStr(loctime.wMonth), 2, '0', asRight) + '/' + IntToStr(loctime.wYear);
- If target <> FNickname Then
- Notice(target, loctimes)
- else
- Notice(FSenderNick, loctimes);
- End;
- If (LowerCase(arr.Items[0]) = 'dcc') and
- (arr.Count >= 5) Then
- Begin
- If (LowerCase(arr.Items[1]) = 'chat') and
- (LowerCase(arr.Items[2]) = 'chat') Then
- Begin
- If (Assigned(FOnDCCChatIncoming)) and
- (TryStrToInt(arr.Items[4], port)) Then
- Begin
- accept := FALSE;
- FOnDCCChatIncoming(self, arr.Items[3], port, accept);
- If accept Then
- Begin
- Inc(DCC.Count);
- SetLength(DCC.Items, DCC.Count);
- DCC.Items[DCC.Count - 1] := TReiDCC.Create;
- DCC.Items[DCC.Count - 1].Host := ShortIP(arr.Items[3]);
- DCC.Items[DCC.Count - 1].Port := port;
- DCC.Items[DCC.Count - 1].Tag := DCC.Count - 1;
- If DCC.Items[DCC.Count - 1].Connect = ERROR_SUCCESS Then
- DCC.Items[DCC.Count - 1].OnPrivMsg := CommandDCCChatMessage;
- End;
- End;
- End;
- If LowerCase(arr.Items[1]) = 'send' Then
- Begin
- If (Assigned(FOnDCCFileIncoming)) and
- (TryStrToInt(arr.Items[4], port)) Then
- Begin
- filesize := -1;
- If arr.Count > 5 Then
- If not TryStrToInt(arr.Items[5], filesize) Then
- filesize := -1;
- accept := FALSE;
- FOnDCCFileIncoming(self, arr.Items[2], arr.Items[3], port, filesize, accept);
- If accept Then
- Begin
- // *****
- End;
- End;
- End;
- End;
- End;
- If Assigned(FOnCTCP) Then
- FOnCTCP(self, FSenderNick, FSenderUser, FSenderHost, TrimRight(target), TrimRight(msg));
- End
- else
- If Assigned(FOnPrivMsg) Then
- FOnPrivMsg(self, FSenderNick, FSenderUser, FSenderHost, TrimRight(target), TrimRight(msg));
- end;
- //
- // Prethodnik OnNotice eventa
- //
- function TReiIRC.CommandNotice(ACommand : TReiCommandData) : Integer;
- var
- target, msg : String;
- begin
- result := ERROR_SUCCESS;
- target := ACommand.Params.Items[0];
- msg := '';
- If ACommand.Params.Count > 1 Then
- msg := ACommand.Params.Items[1];
- If Assigned(FOnNotice) Then
- FOnNotice(self, FSenderNick, FSenderUser, FSenderHost, target, msg);
- end;
- //
- // Prethodnik OnModeChange eventa
- //
- function TReiIRC.CommandModeChange(ACommand : TReiCommandData) : Integer;
- var
- target, mode, params : String;
- plus : Boolean;
- C1 : Integer;
- begin
- result := ERROR_SUCCESS;
- target := ACommand.Params.Items[0];
- mode := ACommand.Params.Items[1];
- If ACommand.Params.Count > 2 Then
- params := ACommand.Params.Items[2];
- If Assigned(FOnModeChange) Then
- FOnModeChange(self, target, mode, params);
- plus := FALSE;
- For C1 := 1 to Length(mode) Do
- Begin
- If mode[C1] = '-' Then
- plus := FALSE
- else
- If mode[C1] = '+' Then
- plus := TRUE
- else
- Case mode[C1] of
- 'b' : If not plus Then
- Begin
- If Assigned(FOnUnban) Then
- FOnUnban(self, FSenderNick, FSenderUser, FSenderHost, params);
- End
- else
- If Assigned(FOnBan) Then
- FOnBan(self, FSenderNick, FSenderUser, FSenderHost, params);
- 'o' : If not plus Then
- Begin
- If Assigned(FOnDeOP) Then
- FOnOP(self, FSenderNick, FSenderUser, FSenderHost, target, params);
- End
- else
- If Assigned(FOnOP) Then
- FOnOP(self, FSenderNick, FSenderUser, FSenderHost, target, params);
- 'h' : If not plus Then
- Begin
- If Assigned(FOnDeHOP) Then
- FOnHOP(self, FSenderNick, FSenderUser, FSenderHost, target, params);
- End
- else
- If Assigned(FOnHOP) Then
- FOnHOP(self, FSenderNick, FSenderUser, FSenderHost, target, params);
- 'v' : If not plus Then
- Begin
- If Assigned(FOnDeVoice) Then
- FOnVoice(self, FSenderNick, FSenderUser, FSenderHost, target, params);
- End
- else
- If Assigned(FOnVoice) Then
- FOnVoice(self, FSenderNick, FSenderUser, FSenderHost, target, params);
- End;
- End;
- end;
- //
- // Prethodnik OnKick eventa
- //
- function TReiIRC.CommandKick(ACommand : TReiCommandData) : Integer;
- var
- channel, target : String;
- index : DWORD;
- keyword : String;
- begin
- result := ERROR_SUCCESS;
- channel := ACommand.Params.Items[0];
- target := ACommand.Params.Items[1];
- If Channels.FindChannel(channel, index) = ERROR_SUCCESS Then
- If FAutoRejoin Then
- Begin
- Channels.Keywords.GetItem(index, keyword);
- Join(channel, keyword);
- End
- else
- Channels.DeleteChannel(index);
- If Assigned(FOnKick) Then
- FOnKick(self, FSenderNick, FSenderUser, FSenderHost, channel, target);
- end;
- //
- // Prethodnik OnInvite eventa
- //
- function TReiIRC.CommandInvite(ACommand : TReiCommandData) : Integer;
- var
- channel, target : String;
- begin
- result := ERROR_SUCCESS;
- channel := ACommand.Params.Items[0];
- target := ACommand.Params.Items[1];
- If Assigned(FOnInvite) Then
- FOnInvite(self, FSenderNick, FSenderUser, FSenderHost, channel, target);
- end;
- //
- // Prethodnik OnQuit eventa
- //
- function TReiIRC.CommandQuit(ACommand : TReiCommandData) : Integer;
- var
- reason : String;
- begin
- result := ERROR_SUCCESS;
- reason := ACommand.Params.Items[0];
- If Assigned(FOnQuit) Then
- FOnQuit(self, FSenderNick, FSenderUser, FSenderHost, reason);
- end;
- //
- // Prethodnik OnNicknameChange eventa
- //
- function TReiIRC.CommandNicknameChange(ACommand : TReiCommandData) : Integer;
- var
- newnickname : String;
- begin
- result := ERROR_SUCCESS;
- newnickname := ACommand.Params.Items[0];
- If Assigned(FOnNicknameChange) Then
- FOnNicknameChange(self, FSenderNick, FSenderUser, FSenderHost, newnickname);
- end;
- //
- // Prethodnik OnTopicChange eventa
- //
- function TReiIRC.CommandTopicChange(ACommand : TReiCommandData) : Integer;
- var
- channel, newtopic : String;
- begin
- result := ERROR_SUCCESS;
- channel := ACommand.Params.Items[0];
- If ACommand.Params.Count > 1 Then
- newtopic := ACommand.Params.Items[1]
- else
- newtopic := '';
- If Assigned(FOnTopicChange) Then
- FOnTopicChange(self, FSenderNick, FSenderUser, FSenderHost, channel, newtopic);
- end;
- //
- // Prethodnik OnTopicReceive eventa
- //
- function TReiIRC.CommandTopicReceive(ACommand : TReiCommandData) : Integer;
- var
- channel, topic : String;
- begin
- result := ERROR_SUCCESS;
- channel := ACommand.Params.Items[1];
- If ACommand.Command = IntToStr(RPL_NOTOPIC) Then
- topic := ''
- else
- topic := ACommand.Params.Items[2];
- If Assigned(FOnTopicReceive) Then
- FOnTopicReceive(self, channel, topic);
- end;
- //
- // Prethodnik OnNicknamesReceive eventa
- //
- function TReiIRC.CommandNicknamesListReceive(ACommand : TReiCommandData) : Integer;
- var
- channel : String;
- nicknames : TStringArray;
- begin
- result := ERROR_SUCCESS;
- channel := ACommand.Params.Items[2];
- If ACommand.Params.Count >= 4 Then
- ExtractParams(ACommand.Params.Items[3], nicknames, FALSE)
- else
- Begin
- nicknames.Count := 0;
- SetLength(nicknames.Items, nicknames.Count);
- End;
- If Assigned(FOnNicknamesListReceive) Then
- FOnNicknamesListReceive(self, channel, nicknames);
- end;
- //
- // Prethodnik OnNicknameInUse eventa
- //
- function TReiIRC.CommandNicknameInUse(ACommand : TReiCommandData) : Integer;
- var
- newnickname : String;
- begin
- result := ERROR_SUCCESS;
- newnickname := FNickname + '^';
- If Assigned(FOnNicknameInUse) Then
- FOnNicknameInUse(self, FNickname, newnickname);
- SetNickname(newnickname);
- end;
- //
- // Prethodnik OnNicknameNotify eventa
- //
- function TReiIRC.CommandNicknameNotify(ACommand : TReiCommandData) : Integer;
- var
- C1, C2 : DWORD;
- item : String;
- index : DWORD;
- narr : TStringArray;
- marked : Boolean;
- begin
- result := ERROR_SUCCESS;
- narr.Count := 0;
- SetLength(narr.Items, narr.Count);
- If ACommand.Params.Count >=2 Then
- Begin
- ACommand.Params.Items[1] := Trim(ACommand.Params.Items[1]);
- ACommand.Params.Items[1] := ACommand.Params.Items[1] + ' ';
- While Pos(' ', ACommand.Params.Items[1]) > 0 Do
- Begin
- If Copy(ACommand.Params.Items[1], 1, Pos(' ', ACommand.Params.Items[1]) - 1) <> '' Then
- Begin
- Inc(narr.Count);
- SetLength(narr.Items, narr.Count);
- narr.Items[narr.Count - 1] := Copy(ACommand.Params.Items[1], 1, Pos(' ', ACommand.Params.Items[1]) - 1);
- End;
- Delete(ACommand.Params.Items[1], 1, Pos(' ', ACommand.Params.Items[1]));
- End;
- End;
- C1 := 0;
- While C1 < FNotifyListOnline.ItemsCount Do
- Begin
- FNotifyListOnline.GetItem(C1, item);
- marked := FALSE;
- If narr.Count > 0 Then
- Begin
- For C2 := 0 to narr.Count - 1 Do
- Begin
- If LowerCase(item) = LowerCase(narr.Items[C2]) Then
- Begin
- Inc(C1);
- marked := TRUE;
- Break;
- End;
- End;
- End;
- If not marked Then
- Begin
- FNotifyListOnline.DeleteItem(C1);
- If Assigned(FOnNicknameNotify) Then
- FOnNicknameNotify(self, item, FALSE);
- End;
- End;
- If narr.Count > 0 Then
- For C1 := 0 to narr.Count - 1 Do
- If FNotifyListOnline.FindItem(narr.Items[C1], index) <> ERROR_SUCCESS Then
- Begin
- FNotifyListOnline.AddItem(narr.Items[C1]);
- If Assigned(FOnNicknameNotify) Then
- FOnNicknameNotify(self, narr.Items[C1], TRUE);
- End;
- end;
- //
- // Prethodnik OnErrorReceive eventa
- //
- function TReiIRC.CommandErrorReceive(ACommand : TReiCommandData) : Integer;
- begin
- result := ERROR_SUCCESS;
- Quit('');
- If Assigned(FOnErrorReceive) Then
- FOnErrorReceive(self, ACommand.Params.Items[0]);
- end;
- //
- // Prethodnik OnDCCChatMessage eventa
- //
- procedure TReiIRC.CommandDCCChatMessage(ASenderDCC : TReiDCC; const AMessage : String);
- begin
- If Assigned(FOnDCCChatMessage) Then
- FOnDCCChatMessage(self, ASenderDCC, AMessage);
- end;
- //
- // Lista poruka koje cekaju na slanje
- //
- procedure TReiIRC.MessageContainerThread;
- var
- msg : String;
- subs : DWORD;
- begin
- If (Assigned(FMessageContainer)) and
- (FMessageContainer.ItemsCount > 0) Then
- Begin
- If FAntiFlood Then
- Begin
- subs := GetTickCount - MCLastSend;
- If subs < MCNextDelay Then
- Begin
- If subs div 5 > MCNextDelay Then
- MCNextDelay := 0
- else
- Dec(MCNextDelay, subs div 5);
- If MCNextDelay < 2500 Then
- Inc(MCNextDelay, 150);
- Sleep(MCNextDelay - subs);
- End;
- End;
- If (FMessageContainer.ItemsCount > 0) and
- (FMessageContainer.GetItem(0, msg) = ERROR_SUCCESS) and
- (FConnected) Then
- Begin
- If Copy(msg, Length(msg) - 1, Length(CRLF)) <> CRLF Then
- msg := msg + CRLF;
- send(FSock, msg[1], Length(msg), 0);
- MCLastSend := GetTickCount;
- FMessageContainer.DeleteItem(0);
- If Assigned(FOnRaw) Then
- FOnRaw(self, Copy(msg, 1, Length(msg) - 2), FALSE);
- End;
- End;
- end;
- //
- // Thread koji prima podatke sa IRC servera
- //
- procedure TReiIRC.RecvThread;
- const
- bufsize = 4096;
- var
- buf : Array[1..bufsize] of Char;
- len : Integer;
- params : TStringArray;
- C1 : Integer;
- begin
- len := recv(FSock, buf[1], bufsize, 0);
- If len > 0 Then
- Begin
- ExtractParams(Copy(buf, 1, len), params, FALSE, CRLF);
- ProcessRawParams(params);
- For C1 := 0 to params.Count - 1 Do
- WriteLn(params.Items[C1]);
- End
- else
- Case len of
- 0 : Quit('');
- SOCKET_ERROR : If WSAGetLastError <> WSAEWOULDBLOCK Then
- Quit('');
- End;
- end;
- //
- // Setuje nickname
- //
- procedure TReiIRC.SetNickname(const AValue : String);
- begin
- If not StringInString(AValue, AllowedChars) Then
- Exit;
- FNickname := AValue;
- Raw('NICK ' + FNickname);
- end;
- //
- // Setuje username
- //
- procedure TReiIRC.SetUsername(const AValue : String);
- var
- modes : String;
- begin
- If not StringInString(AValue, AllowedChars) Then
- Exit;
- FUsername := AValue;
- modes := '+';
- If FUserModes.RecvWallops Then
- modes := modes + 'w';
- If FUserModes.Invisible Then
- modes := modes + 'i';
- Raw('USER ' + FUsername + ' ' + modes + ' * :' + FRealname);
- end;
- //
- // Obradjuje raw podatke primljene sa servera
- //
- procedure TReiIRC.ProcessRawParams(const AParams : TStringArray);
- var
- C1 : Integer;
- msginfo : TRawMessageInfo;
- command : String;
- begin
- For C1 := 0 to AParams.Count - 1 Do
- Begin
- If Assigned(FOnRaw) Then
- FOnRaw(self, AParams.Items[C1], TRUE);
- FillChar(msginfo, SizeOf(TRawMessageInfo), 0);
- ParseRawMessage(AParams.Items[C1], msginfo);
- FSenderNick := '';
- FSenderUser := '';
- FSenderHost := '';
- Case msginfo.Prefix.AType of
- PREFIX_SERVER : FSenderNick := msginfo.Prefix.Server;
- PREFIX_USER : Begin
- FSenderNick := msginfo.Prefix.Nickname;
- FSenderUser := msginfo.Prefix.Username;
- FSenderHost := msginfo.Prefix.Hostmask;
- End;
- End;
- Case msginfo.Command.AType of
- COMMAND_NUMBER : command := IntToStr(msginfo.Command.Number);
- COMMAND_STRING : command := msginfo.Command.Text;
- End;
- FCommands.DispatchCommand(command, msginfo.Params);
- End;
- end;
- //
- // Setuje away status
- //
- procedure TReiIRC.SetAway(const AReason : String);
- begin
- FUserModes.Away := TRUE;
- Raw('AWAY :' + AReason)
- end;
- //
- // Unsetuje away status
- //
- procedure TReiIRC.UnsetAway;
- begin
- FUserModes.Away := FALSE;
- Raw('AWAY');
- end;
- //
- // Setuje +i mod
- //
- procedure TReiIRC.SetInvisible(const AValue : Boolean);
- begin
- FUserModes.Invisible := AValue;
- If AValue Then
- SetMode(FNickname, '+i')
- else
- SetMode(FNickname, '-i');
- end;
- //
- // Setuje +w mod
- //
- procedure TReiIRC.SetRecvWallops(const AValue : Boolean);
- begin
- FUserModes.RecvWallops := AValue;
- If AValue Then
- SetMode(FNickname, '+w')
- else
- SetMode(FNickname, '-w');
- end;
- //
- // Notify lista on/off
- //
- procedure TReiIRC.SetNotifyListEnabled(const AValue : Boolean);
- begin
- If AValue = FNotifyListEnabled Then
- Exit;
- FNotifyListEnabled := AValue;
- If FNotifyListEnabled Then
- Begin
- If not Assigned(NotifyListThread) Then
- NotifyListThread := TReiThread.Create;
- NotifyListThread.Delay := 5000;
- NotifyListThread.OnExecute := SendISON;
- NotifyListThread.Start;
- End
- else
- If Assigned(NotifyListThread) Then
- NotifyListThread.Stop;
- end;
- //
- // Salje ISON komandu serveru
- //
- procedure TReiIRC.SendISON;
- var
- tmp : String;
- C1 : DWORD;
- item : String;
- begin
- tmp := '';
- If FNotifyList.ItemsCount > 0 Then
- Begin
- For C1 := 0 to FNotifyList.ItemsCount - 1 Do
- Begin
- FNotifyList.GetItem(C1, item);
- tmp := tmp + ' ' + item;
- End;
- Raw('ISON' + tmp);
- End;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement