📄 dxircservercore.pas
字号:
unit DXIRCServerCore;
interface
///////////////////////////////////////////////////////////////////////////////
// Component: TDXIRCServerCore
// Author: G.E. Ozz Nixon Jr. (staff@bpdx.com)
// ========================================================================
// Source Owner: DX, Inc. 1995-2003
// Copyright: All code is the property of DX, Inc. Licensed for
// resell by Brain Patchwork DX (tm) and part of the
// DX (r) product lines, which are (c) 1999-2003
// DX, Inc. Source may not be distributed without
// written permission from both Brain Patchwork DX,
// and DX, Inc.
// License: (Reminder), None of this code can be added to other
// developer products without permission. This includes
// but not limited to DCU's, DCP's, DLL's, OCX's, or
// any other form of merging our technologies. All of
// your products released to a public consumer be it
// shareware, freeware, commercial, etc. must contain a
// license notification somewhere visible in the
// application.
// Example is Internet Explorer - Help->About screen
// shows the licensed code contained in the application.
// Code Version: (4th Generation Code)
// ========================================================================
// Description: implements IRC (Internet Relay Chat) protocol
// ========================================================================
///////////////////////////////////////////////////////////////////////////////
uses
Classes,
DXServerCore;
{$I DXSock.def}
Const
MaxStatusCodes=45;
ERR_NOSUCHNICK=401;
ERR_NOSUCHSERVER=402;
ERR_NOSUCHCHANNEL=403;
ERR_CANNOTSENDTOCHAN=404;
ERR_TOOMANYCHANNELS=405;
ERR_WASNOSUCHNICK=406;
ERR_TOOMANYTARGETS=407;
ERR_NOORIGIN=409;
ERR_NORECIPIENT=411;
ERR_NOTEXTTOSEND=412;
ERR_NOTOPLEVEL=413;
ERR_WILDTOPLEVEL=414;
ERR_UNKNOWNCOMMAND=421;
ERR_NOMOTD=422;
ERR_NOADMININFO=423;
ERR_FILEERROR=424;
ERR_NONICKNAMEGIVEN=431;
ERR_ERRONEUSNICKNAME=432;
ERR_NICKNAMEINUSE=433;
ERR_NICKCOLLISION=436;
ERR_USERNOTINCHANNEL=441;
ERR_NOTONCHANNEL=442;
ERR_USERONCHANNEL=443;
ERR_NOLOGIN=444;
ERR_SUMMONDISABLED=445;
ERR_USERSDISABLED=446;
ERR_NOTREGISTERED=451;
ERR_NEEDMOREPARAMS=461;
ERR_ALREADYREGISTRED=462;
ERR_NOPERMFORHOST=463;
ERR_PASSWDMISMATCH=464;
ERR_YOUREBANNEDCREEP=465;
ERR_KEYSET=467;
ERR_CHANNELISFULL=471;
ERR_UNKNOWNMODE=472;
ERR_INVITEONLYCHAN=473;
ERR_BANNEDFROMCHAN=474;
ERR_BADCHANNELKEY=475;
ERR_BADCHANMASK=476;
ERR_NOPRIVILEGES=481;
ERR_CHANOPRIVSNEEDED=482;
ERR_CANTKILLSERVER=483;
ERR_NOOPERHOST=491;
ERR_UMODEUNKNOWNFLAG=501;
ERR_USERSDONTMATCH=502;
StatusCodes:array[0..MaxStatusCodes-1] of record
Code:Integer;
Msg:string
end =
((Code:ERR_NOSUCHNICK; Msg:' :No such nick/channel'),
(Code:ERR_NOSUCHSERVER; Msg:' :No such server'),
(Code:ERR_NOSUCHCHANNEL; Msg:' :No such channel'),
(Code:ERR_CANNOTSENDTOCHAN; Msg:' :Cannot send to channel'),
(Code:ERR_TOOMANYCHANNELS; Msg:' :You have joined too many channels'),
(Code:ERR_WASNOSUCHNICK; Msg:' :There was no such nickname'),
(Code:ERR_TOOMANYTARGETS; Msg:' :Duplicate recipients. No message delivered'),
(Code:ERR_NOORIGIN; Msg:':No origin specified'),
(Code:ERR_NORECIPIENT; Msg:':No recipient givin'),
(Code:ERR_NOTEXTTOSEND; Msg:':No text to send'),
(Code:ERR_NOTOPLEVEL; Msg:' :No toplevel domain specified'),
(Code:ERR_WILDTOPLEVEL; Msg:' :Wildcard in toplevel domain'),
(Code:ERR_UNKNOWNCOMMAND; Msg:' :Unknown command'),
(Code:ERR_NOMOTD; Msg:':MOTD file is missing'),
(Code:ERR_NOADMININFO; Msg:' :No administrative info available'),
(Code:ERR_FILEERROR; Msg:':File error doing requested operation'),
(Code:ERR_NONICKNAMEGIVEN; Msg:':No nickname given'),
(Code:ERR_ERRONEUSNICKNAME; Msg:' :Erroneus nickname'),
(Code:ERR_NICKNAMEINUSE; Msg:' :Nickname is already in use'),
(Code:ERR_NICKCOLLISION; Msg:' :Nickname collision KILL'),
(Code:ERR_USERNOTINCHANNEL; Msg:' :They are not on that channel'),
(Code:ERR_NOTONCHANNEL; Msg:' :You are not on that channel'),
(Code:ERR_USERONCHANNEL; Msg:' :is already on channel'),
(Code:ERR_NOLOGIN; Msg:' :User not logged in'),
(Code:ERR_SUMMONDISABLED; Msg:':SUMMON has been disabled'),
(Code:ERR_USERSDISABLED; Msg:':USERS has been disabled'),
(Code:ERR_NOTREGISTERED; Msg:':You have not registered'),
(Code:ERR_NEEDMOREPARAMS; Msg:' :Not enough parameters'),
(Code:ERR_ALREADYREGISTRED; Msg:':You may not reregister'),
(Code:ERR_NOPERMFORHOST; Msg:':Your host is not among the privileged'),
(Code:ERR_PASSWDMISMATCH; Msg:':Password incorrect'),
(Code:ERR_YOUREBANNEDCREEP; Msg:':You are banned from this server'),
(Code:ERR_KEYSET; Msg:' :Channel key already set'),
(Code:ERR_CHANNELISFULL; Msg:' :Cannot join channel (+l)'),
(Code:ERR_UNKNOWNMODE; Msg:' :is unknown mode char to me'),
(Code:ERR_INVITEONLYCHAN; Msg:' :Cannot join channel (+i)'),
(Code:ERR_BANNEDFROMCHAN; Msg:' :Cannot join channel (+b)'),
(Code:ERR_BADCHANNELKEY; Msg:' :Cannot join channel (+k)'),
(Code:ERR_BADCHANMASK; Msg:' :Bad Channel Name or Mask'),
(Code:ERR_NOPRIVILEGES; Msg:':Permission Denied- You are not an IRC operator'),
(Code:ERR_CHANOPRIVSNEEDED; Msg:' :You are not channel operator'),
(Code:ERR_CANTKILLSERVER; Msg:':You cannot kill a server!'),
(Code:ERR_NOOPERHOST; Msg:':No O-lines for your host'),
(Code:ERR_UMODEUNKNOWNFLAG; Msg:':Unknown MODE flag'),
(Code:ERR_USERSDONTMATCH; Msg:':Cannot change mode for other users')
);
Type
IRCTBasicEvent = procedure(ClientThread:TDXClientThread;Parm1:string) of object;
IRCTMultipleEvent = procedure(ClientThread:TDXClientThread;Parm1:string) of object;
IRCTComplexEvent = procedure(ClientThread:TDXClientThread;Parm1,Parm2:string) of object;
IRCTSimpleEvent = procedure(ClientThread:TDXClientThread) of object;
IRCTOtherEvent = procedure(ClientThread:TDXClientThread;Command,Parms:String;var Handled:Boolean) of object;
TDXIRCServerCore = class(TDXServerCore)
private
fOnCommandPASS:IRCTBasicEvent; // PASS <password>}
fOnCommandNICK:IRCTMultipleEvent; // NICK <nickname> [hopcount] (hopcount is from server to server)}
fOnCommandUSER:IRCTMultipleEvent; // USER <username> <hostname> <servername> <realname>}
fOnCommandSERVER:IRCTMultipleEvent; // SERVER <servername> <hopcount> <info>}
fOnCommandOPER:IRCTComplexEvent; // OPER <user> <password>}
fOnCommandQUIT:IRCTBasicEvent; // QUIT [quit message]}
fOnCommandSQUIT:IRCTComplexEvent; // SQUIT <server> <comment>}
// Channel Commands
fOnCommandJOIN:IRCTMultipleEvent; // JOIN <channel>[,<channel>...] [<key>[,<key>]]}
fOnCommandPART:IRCTBasicEvent; // PART <channel>[,<channel>...]}
fOnCommandMODE:IRCTMultipleEvent; // MODE <channel> [[+|-]o|p|s|i|t|n|b|v] [<limits>] [<user>] [<ban mask>]}
// MODE <nickname> [[+|-]i|w|s|o]}
fOnCommandTOPIC:IRCTComplexEvent; // TOPIC <channel> [<topic>]}
fOnCommandNAMES:IRCTBasicEvent; // NAMES [<channel>[,<channel>...]]}
fOnCommandLIST:IRCTComplexEvent; // LIST [<channel>[,<channel>...]] [<server>]}
fOnCommandINVITE:IRCTComplexEvent; // INVITE <nickname> <channel>}
fOnCommandKICK:IRCTMultipleEvent; // KICK <channel>[,<channel>...] <user>[,<user>...] [<comment>]}
// Server Commands
fOnCommandVERSION:IRCTBasicEvent; // VERSION [<server>]}
fOnCommandSTATS:IRCTComplexEvent; // STATS [<query> [<server>]]}
fOnCommandLINKS:IRCTComplexEvent; // LINKS [[<remote server>] <server mask>]}
fOnCommandTIME:IRCTBasicEvent; // TIME [<server>]}
fOnCommandCONNECT:IRCTMultipleEvent;// CONNECT <target server> [<port> [<remote server>]]}
fOnCommandTRACE:IRCTBasicEvent; // TRACE [<server>]}
fOnCommandADMIN:IRCTBasicEvent; // ADMIN [<server>]}
fOnCommandINFO:IRCTBasicEvent; // INFO [<server>]}
// Messages
fOnCommandPRIVMSG:IRCTComplexEvent; // PRIVMSG <receiver>[,<receiver>...] <text>}
fOnCommandNOTICE:IRCTComplexEvent; // NOTICE <nickname> <text>}
// User Based Queries
fOnCommandWHO:IRCTComplexEvent; // WHO [<name> [<o>]]}
fOnCommandWHOIS:IRCTComplexEvent; // WHOIS [<server>] <nickname>[,<nickname>...]}
fOnCommandWHOWAS:IRCTMultipleEvent; // WHOWAS <nickname> [<count> [<server>]]}
// Miscellaneous
fOnCommandKILL:IRCTComplexEvent; // KILL <nickname> <comment>}
fOnCommandPING:IRCTComplexEvent; // PING <server1> [<server2>]}
fOnCommandPONG:IRCTComplexEvent; // PONG <daemon1> [<daemon2>]}
fOnCommandAWAY:IRCTBasicEvent; // AWAY [<message>]}
fOnCommandREHASH:IRCTSimpleEvent; // REHASH}
fOnCommandRESTART:IRCTSimpleEvent; // RESTART}
fOnCommandSUMMON:IRCTComplexEvent; // SUMMON <user> [<server>]}
fOnCommandUSERS:IRCTBasicEvent; // USERS [<server>]}
fOnCommandWALLOPS:IRCTBasicEvent; // WALLOPS <text>}
fOnCommandUSERHOST:IRCTComplexEvent;// USERHOST <nickname> [<nickname>]}
fOnCommandISON:IRCTComplexEvent; // ISON <nickname> [<nickname>]}
fOnCommandERROR:IRCTMultipleEvent; // ERROR <message> from server to server
fOnCommandOther:IRCTOtherEvent;
fOnCommandTimeout:IRCTSimpleEvent; // server should send PING
// new as of 3.0a:
fServerName:String;
protected
Procedure SetOnCommandPASS(Value:IRCTBasicEvent);
Procedure SetOnCommandNICK(Value:IRCTMultipleEvent);
Procedure SetOnCommandUSER(Value:IRCTMultipleEvent);
Procedure SetOnCommandSERVER(Value:IRCTMultipleEvent);
Procedure SetOnCommandOPER(Value:IRCTComplexEvent);
Procedure SetOnCommandQUIT(Value:IRCTBasicEvent);
Procedure SetOnCommandSQUIT(Value:IRCTComplexEvent);
Procedure SetOnCommandJOIN(Value:IRCTMultipleEvent);
Procedure SetOnCommandPART(Value:IRCTBasicEvent);
Procedure SetOnCommandMODE(Value:IRCTMultipleEvent);
Procedure SetOnCommandTOPIC(Value:IRCTComplexEvent);
Procedure SetOnCommandNAMES(Value:IRCTBasicEvent);
Procedure SetOnCommandLIST(Value:IRCTComplexEvent);
Procedure SetOnCommandINVITE(Value:IRCTComplexEvent);
Procedure SetOnCommandKICK(Value:IRCTMultipleEvent);
Procedure SetOnCommandVERSION(Value:IRCTBasicEvent);
Procedure SetOnCommandSTATS(Value:IRCTComplexEvent);
Procedure SetOnCommandLINKS(Value:IRCTComplexEvent);
Procedure SetOnCommandTIME(Value:IRCTBasicEvent);
Procedure SetOnCommandCONNECT(Value:IRCTMultipleEvent);
Procedure SetOnCommandTRACE(Value:IRCTBasicEvent);
Procedure SetOnCommandADMIN(Value:IRCTBasicEvent);
Procedure SetOnCommandINFO(Value:IRCTBasicEvent);
Procedure SetOnCommandPRIVMSG(Value:IRCTComplexEvent);
Procedure SetOnCommandNOTICE(Value:IRCTComplexEvent);
Procedure SetOnCommandWHO(Value:IRCTComplexEvent);
Procedure SetOnCommandWHOIS(Value:IRCTComplexEvent);
Procedure SetOnCommandWHOWAS(Value:IRCTMultipleEvent);
Procedure SetOnCommandKILL(Value:IRCTComplexEvent);
Procedure SetOnCommandPING(Value:IRCTComplexEvent);
Procedure SetOnCommandPONG(Value:IRCTComplexEvent);
Procedure SetOnCommandAWAY(Value:IRCTBasicEvent);
Procedure SetOnCommandREHASH(Value:IRCTSimpleEvent);
Procedure SetOnCommandRESTART(Value:IRCTSimpleEvent);
Procedure SetOnCommandSUMMON(Value:IRCTComplexEvent);
Procedure SetOnCommandUSERS(Value:IRCTBasicEvent);
Procedure SetOnCommandWALLOPS(Value:IRCTBasicEvent);
Procedure SetOnCommandUSERHOST(Value:IRCTComplexEvent);
Procedure SetOnCommandISON(Value:IRCTComplexEvent);
Procedure SetOnCommandERROR(Value:IRCTMultipleEvent);
public
constructor Create(AOwner:TComponent); {$IFNDEF OBJECTS_ONLY} override; {$ENDIF}
destructor Destroy; override;
procedure ProcessSession(ClientThread:TDXClientThread);
Procedure AddBasicEvent(Command:String;EventProc:IRCTBasicEvent);
Procedure AddSimpleEvent(Command:String;EventProc:IRCTSimpleEvent);
Procedure AddComplexEvent(Command:String;EventProc:IRCTComplexEvent);
Procedure AddMultipleEvent(Command:String;EventProc:IRCTMultipleEvent);
Procedure SayError(ErrorCode:Integer;OptionalText:String;ClientThread:TDXClientThread); // 3.0a
Procedure SayWelcome(Nick:String;Text:TStrings;ClientThread:TDXClientThread); // 4.0
Procedure SayMOTD(Nick:String;Text:TStrings;ClientThread:TDXClientThread); // 4.0
Procedure SayNOTICE(Nick,Text:String;ClientThread:TDXClientThread); // 4.0
Procedure SayChannelList(Nick:String;Text:TStrings;ClientThread:TDXClientThread); // 4.0
published
property OnCommandPASS: IRCTBasicEvent read fOnCommandPASS
write SetOnCommandPASS;
property OnCommandNICK: IRCTMultipleEvent read fOnCommandNICK
write SetOnCommandNICK;
property OnCommandUSER: IRCTMultipleEvent read fOnCommandUSER
write SetOnCommandUSER;
property OnCommandSERVER: IRCTMultipleEvent read fOnCommandSERVER
write SetOnCommandSERVER;
property OnCommandOPER: IRCTComplexEvent read fOnCommandOPER
write SetOnCommandOPER;
property OnCommandQUIT: IRCTBasicEvent read fOnCommandQUIT
write SetOnCommandQUIT;
property OnCommandSQUIT: IRCTComplexEvent read fOnCommandSQUIT
write SetOnCommandSQUIT;
property OnCommandJOIN: IRCTMultipleEvent read fOnCommandJOIN
write SetOnCommandJOIN;
property OnCommandPART: IRCTBasicEvent read fOnCommandPART
write SetOnCommandPART;
property OnCommandMODE: IRCTMultipleEvent read fOnCommandMODE
write SetOnCommandMODE;
property OnCommandTOPIC: IRCTComplexEvent read fOnCommandTOPIC
write SetOnCommandTOPIC;
property OnCommandNAMES: IRCTBasicEvent read fOnCommandNAMES
write SetOnCommandNAMES;
property OnCommandLIST: IRCTComplexEvent read fOnCommandLIST
write SetOnCommandLIST;
property OnCommandINVITE: IRCTComplexEvent read fOnCommandINVITE
write SetOnCommandINVITE;
property OnCommandKICK: IRCTMultipleEvent read fOnCommandKICK
write SetOnCommandKICK;
property OnCommandVERSION: IRCTBasicEvent read fOnCommandVERSION
write SetOnCommandVERSION;
property OnCommandSTATS: IRCTComplexEvent read fOnCommandSTATS
write SetOnCommandSTATS;
property OnCommandLINKS: IRCTComplexEvent read fOnCommandLINKS
write SetOnCommandLINKS;
property OnCommandTIME: IRCTBasicEvent read fOnCommandTIME
write SetOnCommandTIME;
property OnCommandCONNECT: IRCTMultipleEvent read fOnCommandCONNECT
write SetOnCommandCONNECT;
property OnCommandTRACE: IRCTBasicEvent read fOnCommandTRACE
write SetOnCommandTRACE;
property OnCommandADMIN: IRCTBasicEvent read fOnCommandADMIN
write SetOnCommandADMIN;
property OnCommandINFO: IRCTBasicEvent read fOnCommandINFO
write SetOnCommandINFO;
property OnCommandPRIVMSG: IRCTComplexEvent read fOnCommandPRIVMSG
write SetOnCommandPRIVMSG;
property OnCommandNOTICE: IRCTComplexEvent read fOnCommandNOTICE
write SetOnCommandNOTICE;
property OnCommandWHO: IRCTComplexEvent read fOnCommandWHO
write SetOnCommandWHO;
property OnCommandWHOIS: IRCTComplexEvent read fOnCommandWHOIS
write SetOnCommandWHOIS;
property OnCommandWHOWAS: IRCTMultipleEvent read fOnCommandWHOWAS
write SetOnCommandWHOWAS;
property OnCommandKILL: IRCTComplexEvent read fOnCommandKILL
write SetOnCommandKILL;
property OnCommandPING: IRCTComplexEvent read fOnCommandPING
write SetOnCommandPING;
property OnCommandPONG: IRCTComplexEvent read fOnCommandPONG
write SetOnCommandPONG;
property OnCommandAWAY: IRCTBasicEvent read fOnCommandAWAY
write SetOnCommandAWAY;
property OnCommandREHASH: IRCTSimpleEvent read fOnCommandREHASH
write SetOnCommandREHASH;
property OnCommandRESTART: IRCTSimpleEvent read fOnCommandRESTART
write SetOnCommandRESTART;
property OnCommandSUMMON: IRCTComplexEvent read fOnCommandSUMMON
write SetOnCommandSUMMON;
property OnCommandUSERS: IRCTBasicEvent read fOnCommandUSERS
write SetOnCommandUSERS;
property OnCommandWALLOPS: IRCTBasicEvent read fOnCommandWALLOPS
write SetOnCommandWALLOPS;
property OnCommandUSERHOST: IRCTComplexEvent read fOnCommandUSERHOST
write SetOnCommandUSERHOST;
property OnCommandISON: IRCTComplexEvent read fOnCommandISON
write SetOnCommandISON;
property OnCommandERROR: IRCTMultipleEvent read fOnCommandERROR
write SetOnCommandERROR;
property OnCommandOther: IRCTOtherEvent read fOnCommandOther
write fOnCommandOther;
property ServerName:String read fServerName
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -