📄 idirc.pas
字号:
{ $HDR$}
{**********************************************************************}
{ Unit archived using Team Coherence }
{ Team Coherence is Copyright 2002 by Quality Software Components }
{ }
{ For further information / comments, visit our WEB site at }
{ http://www.TeamCoherence.com }
{**********************************************************************}
{}
{
//----------------------------------------------------------------------------//
2003-11-Jul:
Original author: Sergio Perry
Based on TIRCClient component by Steve Williams (stevewilliams@kromestudios.com)
ported to Indy by Daaron Dwyer (ddwyer@ncic.com)
Matthew Elzer - bug fixes & modifications
//----------------------------------------------------------------------------//
}
unit IdIRC;
interface
uses
Classes,
IdAssignedNumbers, IdContext, IdCmdTCPClient, IdCommandHandlers, IdIOHandler,
IdTStrings;
type
TIdIRC = class;
//============================================================================//
TIdIRCUserMode = (amAway, amInvisible, amWallops, amRestricted, amOperator,
amLocalOperator, amReceiveServerNotices);
TIdIRCUserModes = set of TIdIRCUserMode;
TIdIRCStat = (stServerConnectionsList, stCommandUsageCount, stOperatorList,
stUpTime);
//============================================================================//
{ Events }
{ -WELCOME- }
TIdIRCServerWelcomeEvent = procedure(ASender: TIdContext;
AWelcomeInfo: TIdStrings) of object;
TIdIRCPingPongEvent = procedure(ASender: TIdContext) of object;
{ -MESSAGE- }
TIdIRCPrivMessageEvent = procedure(ASender: TIdContext; const ANicknameFrom,
AHost, ANicknameTo, AMessage: String) of object;
{ -NOTICE- }
TIdIRCNoticeEvent = procedure(ASender: TIdContext; const ANicknameFrom,
AHost, ANicknameTo, ANotice: String) of object;
{ -REHASH- }
TIdIRCRehashEvent = procedure(ASender: TIdContext; ANickname, AHost: String) of object;
{ -SUMMON- }
TIdIRCSummonEvent = procedure(ASender: TIdContext; ANickname, AHost: String) of object;
{ -WALLOPS- }
TIdIRCWallopsEvent = procedure(ASender: TIdContext; const ANickname,
AHost, AMessage: String) of object;
{ -ISON- }
TIdIRCIsOnIRCEvent = procedure(ASender: TIdContext; ANickname, AHost: String) of object;
{ -AWAY- }
TIdIRCAwayEvent = procedure(ASender: TIdContext; ANickname, AHost,
AAwayMessage: String; UserAway: Boolean) of object;
{ -JOIN- }
TIdIRCJoinEvent = procedure(ASender: TIdContext; ANickname, AHost, AChannel: String) of object;
{ -PART- }
TIdIRCPartEvent = procedure(ASender: TIdContext; ANickname, AHost, AChannel: String) of object;
{ -TOPIC- }
TIdIRCTopicEvent = procedure(ASender: TIdContext; ANickname, AHost, AChannel,
ATopic: String) of object;
{ -KICK- }
TIdIRCKickEvent = procedure(ASender: TIdContext; ANickname, AHost, AChannel,
ATarget, AReason: String) of object;
{ -MOTD- }
TIdIRCMOTDEvent = procedure(ASender: TIdContext; AMOTD: TIdStrings) of object;
{ -TRACE- }
TIdIRCServerTraceEvent = procedure(ASender: TIdContext; ATraceInfo: TIdStrings) of object;
{ -OPER- }
TIdIRCOpEvent = procedure(ASender: TIdContext; ANickname, AChannel, AHost: String) of object;
{ -INV- }
TIdIRCInvitingEvent = procedure(ASender: TIdContext; ANickname, AHost: String) of object;
TIdIRCInviteEvent = procedure(ASender: TIdContext; ANicknameFrom, AHost, ANicknameTo,
AChannel: String) of object;
{ -LIST- }
TIdIRCChanBANListEvent = procedure(ASender: TIdContext; AChannel: String;
ABanList: TIdStrings) of object;
TIdIRCChanEXCListEvent = procedure(ASender: TIdContext; AChannel: String;
AExceptList: TIdStrings) of object;
TIdIRCChanINVListEvent = procedure(ASender: TIdContext; AChannel: String;
AInviteList: TIdStrings) of object;
TIdIRCServerListEvent = procedure(ASender: TIdContext; AServerList: TIdStrings) of object;
TIdIRCNickListEvent = procedure(ASender: TIdContext; AChannel: String;
ANicknameList: TIdStrings) of object;
{ -STATS- }
TIdIRCServerUsersEvent = procedure(ASender: TIdContext; AUsers: TIdStrings) of object;
TIdIRCServerStatsEvent = procedure(ASender: TIdContext; AStatus: TIdStrings) of object;
TIdIRCKnownServerNamesEvent = procedure(ASender: TIdContext; AKnownServers: TIdStrings) of object;
{ -INFO- }
TIdIRCAdminInfoRecvEvent = procedure(ASender: TIdContext; AAdminInfo: TIdStrings) of object;
TIdIRCUserInfoRecvEvent = procedure(ASender: TIdContext; AUserInfo: TIdStrings) of object;
{ -WHO- }
TIdIRCWhoEvent = procedure(ASender: TIdContext; AWhoResults: TIdStrings) of object;
TIdIRCWhoIsEvent = procedure(ASender: TIdContext; AWhoIsResults: TIdStrings) of object;
TIdIRCWhoWasEvent = procedure(ASender: TIdContext; AWhoWasResults: TIdStrings) of object;
{ Mode }
TIdIRCChanModeEvent = procedure(ASender: TIdContext) of object;
TIdIRCUserModeEvent = procedure(ASender: TIdContext; ANickname, AHost,
AUserMode: String) of object;
{ -CTCP- }
TIdIRCCTCPQueryEvent = procedure(ASender: TIdContext; ANicknameFrom, AHost,
ANicknameTo, AChannel, ACommand, AParams: String) of object;
TIdIRCCTCPReplyEvent = procedure(ASender: TIdContext; ANicknameFrom, AHost,
ANicknameTo, AChannel, ACommand, AParams: String) of object;
{ -DCC- }
TIdIRCDCCChatEvent = procedure(ASender: TIdContext; ANickname, AHost: String;
APort: Integer) of object;
TIdIRCDCCSendEvent = procedure(ASender: TIdContext; ANickname, AHost,
AFilename: String; APort, AFileSize: Integer) of object;
TIdIRCDCCResumeEvent = procedure(ASender: TIdContext; ANickname, AHost,
AFilename: String; APort, AFilePos: Integer) of object;
TIdIRCDCCAcceptEvent = procedure(ASender: TIdContext; ANickname, AHost,
AFilename: String; APort, AFilePos: Integer) of object;
{ -Errors- }
TIdIRCServerErrorEvent = procedure(ASender: TIdContext; AErrorCode: Integer;
AErrorMessage: String) of object;
TIdIRCNickErrorEvent = procedure(ASender: TIdContext; AError: Integer) of object;
TIdIRCKillErrorEvent = procedure(ASender: TIdContext) of object;
{ Other }
TIdIRCNicknameChangedEvent = procedure(ASender: TIdContext; AOldNickname,
AHost, ANewNickname: String) of object;
TIdIRCKillEvent = procedure(ASender: TIdContext; ANicknameFrom, AHost,
ANicknameTo, AReason: String) of object;
TIdIRCQuitEvent = procedure(ASender: TIdContext; ANickname, AHost, AReason: String) of object;
TIdIRCSvrTimeEvent = procedure(ASender: TIdContext; Host, Time: String) of object;
TIdIRCServiceEvent = procedure(ASender: TIdContext) of object;
TIdIRCSvrVersionEvent = procedure(ASender: TIdContext; Version, Host, Comments: String) of object;
TIdIRCRawEvent = procedure(ASender: TIdContext; AIn: boolean; AMessage: String) of object;
//============================================================================//
{ TIdIRCReplies }
TIdIRCReplies = class(TPersistent)
protected
FFinger: String;
FVersion: String;
FUserInfo: String;
FClientInfo: String;
public
constructor Create;
procedure Assign(Source: TPersistent); override;
published
property Finger: String read FFinger write FFinger;
property Version: String read FVersion write FVersion;
property UserInfo: String read FUserInfo write FUserInfo;
property ClientInfo: String read FClientInfo write FClientInfo;
end;
//============================================================================//
{ TIdIRC }
TIdIRC = class(TIdCmdTCPClient)
protected
FNickname: String;
FAltNickname: String;
FUsername: String;
FRealName: String;
FPassword: String;
FUserMode: TIdIRCUserModes;
FUserAway: Boolean;
FReplies: TIdIRCReplies;
//
FSenderNick: String;
FSenderHost: String;
FTmp: TIdStrings;
//
FOnSWelcome: TIdIRCServerWelcomeEvent;
FOnPingPong: TIdIRCPingPongEvent;
FOnPrivMessage: TIdIRCPrivMessageEvent;
FOnNotice: TIdIRCNoticeEvent;
FOnRehash: TIdIRCRehashEvent;
FOnSummon: TIdIRCSummonEvent;
FOnWallops: TIdIRCWallopsEvent;
FOnIsOnIRC: TIdIRCIsOnIRCEvent;
FOnAway: TIdIRCAwayEvent;
FOnJoin: TIdIRCJoinEvent;
FOnPart: TIdIRCPartEvent;
FOnTopic: TIdIRCTopicEvent;
FOnKick: TIdIRCKickEvent;
FOnMOTD: TIdIRCMOTDEvent;
FOnTrace: TIdIRCServerTraceEvent;
FOnOp: TIdIRCOpEvent;
FOnInviting: TIdIRCInvitingEvent;
FOnInvite: TIdIRCInviteEvent;
FOnBANList: TIdIRCChanBANListEvent;
FOnEXCList: TIdIRCChanEXCListEvent;
FOnINVList: TIdIRCChanINVListEvent;
FOnSvrList: TIdIRCServerListEvent;
FOnNickList: TIdIRCNickListEvent;
FOnSvrUsers: TIdIRCServerUsersEvent;
FOnSvrStats: TIdIRCServerStatsEvent;
FOnKnownSvrs: TIdIRCKnownServerNamesEvent;
FOnAdminInfo: TIdIRCAdminInfoRecvEvent;
FOnUserInfo: TIdIRCUserInfoRecvEvent;
FOnWho: TIdIRCWhoEvent;
FOnWhoIs: TIdIRCWhoIsEvent;
FOnWhoWas: TIdIRCWhoWasEvent;
FOnChanMode: TIdIRCChanModeEvent;
FOnUserMode: TIdIRCUserModeEvent;
FOnCTCPQry: TIdIRCCTCPQueryEvent;
FOnCTCPRep: TIdIRCCTCPReplyEvent;
FOnDCCChat: TIdIRCDCCChatEvent;
FOnDCCSend: TIdIRCDCCSendEvent;
FOnDCCResume: TIdIRCDCCResumeEvent;
FOnDCCAccept: TIdIRCDCCAcceptEvent;
FOnServerError: TIdIRCServerErrorEvent;
FOnNickError: TIdIRCNickErrorEvent;
FOnKillError: TIdIRCKillErrorEvent;
FOnNickChange: TIdIRCNicknameChangedEvent;
FOnKill: TIdIRCKillEvent;
FOnQuit: TIdIRCQuitEvent;
FOnSvrTime: TIdIRCSvrTimeEvent;
FOnService: TIdIRCServiceEvent;
FOnSvrVersion: TIdIRCSvrVersionEvent;
FOnRaw: TIdIRCRawEvent;
//
procedure SetNickname(AValue: String);
procedure SetUsername(AValue: String);
procedure SetIdIRCUserMode(AValue: TIdIRCUserModes);
procedure SetIdIRCReplies(AValue: TIdIRCReplies);
function GetUserMode: String;
procedure ParseCTCPQuery(CTCPQuery, AChannel: String);
procedure ParseCTCPReply(CTCPReply, AChannel: String);
procedure ParseDCC(ADCC: String);
//Command handlers
procedure DoBeforeCmd(ASender: TIdCommandHandlers; var AData: string;
AContext: TIdContext);
procedure DoCmdHandlersException(ACommand: String; AContext: TIdContext);
procedure CommandPRIVMSG(ASender: TIdCommand);
procedure CommandNOTICE(ASender: TIdCommand);
procedure CommandJOIN(ASender: TIdCommand);
procedure CommandPART(ASender: TIdCommand);
procedure CommandKICK(ASender: TIdCommand);
procedure CommandMODE(ASender: TIdCommand);
procedure CommandNICK(ASender: TIdCommand);
procedure CommandQUIT(ASender: TIdCommand);
procedure CommandINVITE(ASender: TIdCommand);
procedure CommandKILL(ASender: TIdCommand);
procedure CommandPING(ASender: TIdCommand);
procedure CommandWALLOPS(ASender: TIdCommand);
procedure CommandTOPIC(ASender: TIdCommand);
procedure CommandServerWelcome(ASender: TIdCommand);
procedure CommandUSERHOST(ASender: TIdCommand);
procedure CommandISON(ASender: TIdCommand);
procedure CommandENDOFWHOIS(ASender: TIdCommand);
procedure CommandENDOFWHOWAS(ASender: TIdCommand);
procedure CommandLISTEND(ASender: TIdCommand);
procedure CommandINVITING(ASender: TIdCommand);
procedure CommandSUMMONING(ASender: TIdCommand);
procedure CommandENDOFINVITELIST(ASender: TIdCommand);
procedure CommandENDOFEXCEPTLIST(ASender: TIdCommand);
procedure CommandENDOFWHO(ASender: TIdCommand);
procedure CommandENDOFNAMES(ASender: TIdCommand);
procedure CommandENDOFLINKS(ASender: TIdCommand);
procedure CommandENDOFBANLIST(ASender: TIdCommand);
procedure CommandENDOFINFO(ASender: TIdCommand);
procedure CommandENDOFMOTD(ASender: TIdCommand);
procedure CommandREHASHING(ASender: TIdCommand);
procedure CommandENDOFUSERS(ASender: TIdCommand);
procedure CommandENDOFSTATS(ASender: TIdCommand);
procedure CommandSERVLISTEND(ASender: TIdCommand);
procedure CommandSTIME(ASender: TIdCommand);
procedure CommandSERVICE(ASender: TIdCommand);
procedure CommandSVERSION(ASender: TIdCommand);
procedure CommandCHANMODE(ASender: TIdCommand);
procedure CommandOPER(ASender: TIdCommand);
//
procedure AssignIRCClientCommands;
procedure SetIOHandler(AValue: TIdIOHandler); override;
procedure InitComponent; override;
public
destructor Destroy; override;
//
procedure Connect; override;
procedure Disconnect(AReason: String = ''); reintroduce;
//
function IsChannel(AChannel: String): Boolean;
function IsOp(ANickname: String): Boolean;
function IsVoice(ANickname: String): Boolean;
procedure Raw(ALine: String);
procedure Say(ATarget, AMsg: String);
procedure Notice(ATarget, AMsg: String);
procedure Action(ATarget, AMsg: String);
procedure CTCPQuery(ATarget, ACommand, AParameters: String);
procedure CTCPReply(ATarget, ACTCP, AReply: String);
procedure Join(AChannel: String; const AKey: String ='');
procedure Part(AChannel: String; const AReason: String = '');
procedure Kick(AChannel, ANickname, AReason: String);
procedure SetChannelMode(AChannel, AMode: String; const AParams: String = '');
procedure SetUserMode(ANickname, AMode: String);
procedure GetChannelTopic(AChannel: String);
procedure SetChannelTopic(AChannel, ATopic: String);
procedure SetAway(AMsg: String);
procedure Op(AChannel, ANickname: String);
procedure Deop(AChannel, ANickname: String);
procedure Voice(AChannel, ANickname: String);
procedure Devoice(AChannel, ANickname: String);
procedure Ban(AChannel, AHostmask: String);
procedure Unban(AChannel, AHostmask: String);
procedure RegisterService(const ANickname, ADistribution, AInfo: String;
AType: Integer);
procedure ListChannelNicknames(AChannel: String; ATarget: String = '');
procedure ListChannel(AChannel: String; ATarget: String = '');
procedure Invite(ANickname, AChannel: String);
procedure GetMessageOfTheDay(ATarget: String = '');
procedure GetNetworkStatus(AHostMask: String = ''; ATarget: String = '');
procedure GetServerVersion(ATarget: String = '');
procedure GetServerStatus(AQuery: TIdIRCStat; ATarget: String = '');
procedure ListKnownServerNames(ARemoteHost: String = ''; AHostMask: String = '');
procedure QueryServerTime(ATarget: String = '');
procedure RequestServerConnect(ATarget, AHost: String; APort: Integer;
ARemoteHost: String = '');
procedure TraceServer(ATarget: String = '');
procedure GetAdminInfo(ATarget: String = '');
procedure GetServerInfo(ATarget: String = '');
procedure ListNetworkServices(AHostMask: String; AType: String = '');
procedure QueryService(AServiceName, AMessage: String);
procedure Who(AMask: String; AOnlyAdmins: Boolean);
procedure WhoIs(AMask: String; ATarget: String = '');
procedure WhoWas(ANickname: String; ACount: Integer = -1; ATarget: String = '');
procedure Kill(ANickname, AComment: String);
procedure Ping(AServer1: String; AServer2: String = '');
procedure Pong(AServer1: String; AServer2: String = '');
procedure Error(AMessage: String);
procedure ReHash;
procedure Die;
procedure Restart;
procedure Summon(ANickname: String; ATarget: String = ''; AChannel: String = '');
procedure ListServerUsers(ATarget: String = '');
procedure SayWALLOPS(AMessage: String);
procedure GetUserInfo(ANickname: String);
procedure IsOnIRC(ANickname: String);
procedure BecomeOp(ANickname, APassword: String);
procedure SQuit(AHost, AComment: String);
procedure SetChannelLimit(AChannel: String; ALimit: Integer);
procedure SetChannelKey(AChannel, AKey: String);
//
property Away: Boolean read FUserAway;
published
property Nickname: String read FNickname write SetNickname;
property AltNickname: String read FAltNickname write FAltNickname;
property Username: String read FUsername write SetUsername;
property RealName: String read FRealName write FRealName;
property Password: String read FPassword write FPassword;
property Replies: TIdIRCReplies read FReplies write SetIdIRCReplies;
property UserMode: TIdIRCUserModes read FUserMode write SetIdIRCUserMode;
{ Events }
property OnServerWelcome: TIdIRCServerWelcomeEvent read FOnSWelcome write FOnSWelcome;
property OnPingPong: TIdIRCPingPongEvent read FOnPingPong write FOnPingPong;
property OnPrivateMessage: TIdIRCPrivMessageEvent read FOnPrivMessage
write FOnPrivMessage;
property OnNotice: TIdIRCNoticeEvent read FOnNotice write FOnNotice;
property OnRehash: TIdIRCRehashEvent read FOnRehash write FOnRehash;
property OnSummon: TIdIRCSummonEvent read FOnSummon write FOnSummon;
property OnWallops: TIdIRCWallopsEvent read FOnWallops write FOnWallops;
property OnIsOnIRC: TIdIRCIsOnIRCEvent read FOnIsOnIRC write FOnIsOnIRC;
property OnAway: TIdIRCAwayEvent read FOnAway write FOnAway;
property OnJoin: TIdIRCJoinEvent read FOnJoin write FOnJoin;
property OnPart: TIdIRCPartEvent read FOnPart write FOnPart;
property OnTopic: TIdIRCTopicEvent read FOnTopic write FOnTopic;
property OnKick: TIdIRCKickEvent read FOnKick write FOnKick;
property OnMOTD: TIdIRCMOTDEvent read FOnMOTD write FOnMOTD;
property OnTrace: TIdIRCServerTraceEvent read FOnTrace write FOnTrace;
property OnOp: TIdIRCOpEvent read FOnOp write FOnOp;
property OnInviting: TIdIRCInvitingEvent read FOnInviting write FOnInviting;
property OnInvite: TIdIRCInviteEvent read FOnInvite write FOnInvite;
property OnBanListReceived: TIdIRCChanBANListEvent read FOnBANList write FOnBANList;
property OnExceptionListReceived: TIdIRCChanEXCListEvent read FOnEXCList
write FOnEXCList;
property OnInvitationListReceived: TIdIRCChanINVListEvent read FOnINVList
write FOnINVList;
property OnServerListReceived: TIdIRCServerListEvent read FOnSvrList write FOnSvrList;
property OnNicknamesListReceived: TIdIRCNickListEvent read FOnNickList write FOnNickList;
property OnServerUsersListReceived: TIdIRCServerUsersEvent read FOnSvrUsers
write FOnSvrUsers;
property OnServerStatsReceived: TIdIRCServerStatsEvent read FOnSvrStats
write FOnSvrStats;
property OnKnownServersListReceived: TIdIRCKnownServerNamesEvent read FOnKnownSvrs
write FOnKnownSvrs;
property OnAdminInfoReceived: TIdIRCAdminInfoRecvEvent read FOnAdminInfo
write FOnAdminInfo;
property OnUserInfoReceived: TIdIRCUserInfoRecvEvent read FOnUserInfo
write FOnUserInfo;
property OnWho: TIdIRCWhoEvent read FOnWho write FOnWho;
property OnWhoIs: TIdIRCWhoIsEvent read FOnWhoIs write FOnWhoIs;
property OnWhoWas: TIdIRCWhoWasEvent read FOnWhoWas write FOnWhoWas;
property OnChannelMode: TIdIRCChanModeEvent read FOnChanMode write FOnChanMode;
property OnUserMode: TIdIRCUserModeEvent read FOnUserMode write FOnUserMode;
property OnCTCPQuery: TIdIRCCTCPQueryEvent read FOnCTCPQry write FOnCTCPQry;
property OnCTCPReply: TIdIRCCTCPReplyEvent read FOnCTCPRep write FOnCTCPRep;
property OnDCCChat: TIdIRCDCCChatEvent read FOnDCCChat write FOnDCCChat;
property OnDCCSend: TIdIRCDCCSendEvent read FOnDCCSend write FOnDCCSend;
property OnDCCResume: TIdIRCDCCResumeEvent read FOnDCCResume write FOnDCCResume;
property OnDCCAccept: TIdIRCDCCAcceptEvent read FOnDCCAccept write FOnDCCAccept;
property OnServerError: TIdIRCServerErrorEvent read FOnServerError write FOnServerError;
property OnNicknameError: TIdIRCNickErrorEvent read FOnNickError write FOnNickError;
property OnKillError: TIdIRCKillErrorEvent read FOnKillError write FOnKillError;
property OnNicknameChange: TIdIRCNicknameChangedEvent read FOnNickChange write FOnNickChange;
property OnKill: TIdIRCKillEvent read FOnKill write FOnKill;
property OnQuit: TIdIRCQuitEvent read FOnQuit write FOnQuit;
property OnServerTime: TIdIRCSvrTimeEvent read FOnSvrTime write FOnSvrTime;
property OnService: TIdIRCServiceEvent read FOnService write FOnService;
property OnServerVersion: TIdIRCSvrVersionEvent read FOnSvrVersion write FOnSvrVersion;
property OnRaw: TIdIRCRawEvent read FOnRaw write FOnRaw;
property Port default IdPORT_IRC;
end;
//============================================================================//
const
// ChannelModeChars: array [0..7] of Char = ('p', 's', 'i', 't', 'n', 'm', 'l', 'k'); {do not localize}
IdIRCUserModeChars: array [0..6] of char = ('a', 'i', 'w', 'r', 'o', 'O', 's'); {do not localize}
IdIRCStatChars: array[0..3] of char = ('l', 'm', 'o', 'u'); {do not localize}
IdIRCCTCP: array [0..9] of String =
(
'ACTION', 'SOUND', 'PING', 'FINGER', 'USERINFO', 'VERSION', 'CLIENTINFO', {do not localize}
'TIME', 'ERROR', 'DCC' {do not localize}
);
IdIRCDCC: array [0..3] of String =
(
'SEND', 'CHAT', 'RESUME', 'ACCEPT' {do not localize}
);
//============================================================================//
implementation
uses
IdGlobal, IdException, IdGlobalProtocols, IdResourceStringsProtocols, IdSSL, IdStack,
SysUtils;
//============================================================================//
{ TIdIRCReplies }
constructor TIdIRCReplies.Create;
begin
inherited Create;
//
end;
procedure TIdIRCReplies.Assign(Source: TPersistent);
begin
if Source is TIdIRCReplies then
begin
FFinger := TIdIRCReplies(Source).Finger;
FVersion := TIdIRCReplies(Source).Version;
FUserInfo := TIdIRCReplies(Source).UserInfo;
FClientInfo := TIdIRCReplies(Source).ClientInfo;
end;
end;
//============================================================================//
{ TIdIRC }
procedure TIdIRC.InitComponent;
begin
inherited;
//
FReplies := TIdIRCReplies.Create;
FTmp := TIdStringList.Create;
Port := IdPORT_IRC;
FUserMode := [];
//
if not (csDesigning in ComponentState) then
begin
AssignIRCClientCommands;
end;
end;
destructor TIdIRC.Destroy;
begin
FreeAndNil(FReplies);
FreeAndNil(FTmp);
//
inherited Destroy;
end;
function TIdIRC.GetUserMode: String;
var
i: TIdIRCUserMode;
begin
if FUserMode <> [] then
begin
result := '+';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -