📄 idirc.pas
字号:
for i := amAway to amReceiveServerNotices do
begin
if i in FUserMode then
begin
result := result + IdIRCUserModeChars[ord(i)];
end;
end;
end
else
begin
result := '0';
end;
end;
//============================================================================//
procedure TIdIRC.Connect;
begin
// I doubt that there is explicit SSL support in the IRC protocol
if (IOHandler is TIdSSLIOHandlerSocketBase) then
begin
(IOHandler as TIdSSLIOHandlerSocketBase).PassThrough := False;
end;
inherited;
//
try
if FPassword <> '' then
begin
Raw(Format('PASS %s', [FPassword])); {do not localize}
end;
SetNickname(FNickname);
SetUsername(FUsername);
except
on E: EIdSocketError do begin
raise EComponentError.Create(RSIRCCannotConnect);
end;
end;
end;
procedure TIdIRC.Disconnect(AReason: String = '');
begin
Raw(Format('QUIT :%s', [AReason])); {do not localize}
inherited Disconnect;
end;
procedure TIdIRC.Raw(ALine: String);
begin
if Connected then
begin
if Assigned(FOnRaw) then
begin
FOnRaw(nil, False, ALine);
end;
IOHandler.WriteLn(ALine + EOL);
end;
end;
//============================================================================//
procedure TIdIRC.AssignIRCClientCommands;
begin
{ Text commands }
//PRIVMSG Nickname/#channel :message
with CommandHandlers.Add do
begin
Command := 'PRIVMSG'; {do not localize}
OnCommand := CommandPRIVMSG;
end;
//NOTICE Nickname/#channel :message
with CommandHandlers.Add do
begin
Command := 'NOTICE'; {do not localize}
OnCommand := CommandNOTICE;
end;
//JOIN #channel
with CommandHandlers.Add do
begin
Command := 'JOIN'; {do not localize}
OnCommand := CommandJOIN;
end;
//PART #channel
with CommandHandlers.Add do
begin
Command := 'PART'; {do not localize}
OnCommand := CommandPART;
end;
//KICK #channel target :reason
with CommandHandlers.Add do
begin
Command := 'KICK'; {do not localize}
OnCommand := CommandKICK;
end;
//MODE Nickname/#channel +/-modes parameters...
with CommandHandlers.Add do
begin
Command := 'MODE'; {do not localize}
OnCommand := CommandMODE;
end;
//Nickname newNickname
with CommandHandlers.Add do
begin
Command := 'NICK'; {do not localize}
OnCommand := CommandNICK;
end;
//QUIT :reason
with CommandHandlers.Add do
begin
Command := 'QUIT'; {do not localize}
OnCommand := CommandQUIT;
end;
//INVITE Nickname :#channel
with CommandHandlers.Add do
begin
Command := 'INVITE'; {do not localize}
OnCommand := CommandINVITE;
end;
//KILL Nickname :reason
with CommandHandlers.Add do
begin
Command := 'KILL'; {do not localize}
OnCommand := CommandKILL;
end;
//PING server
with CommandHandlers.Add do
begin
Command := 'PING'; {do not localize}
OnCommand := CommandPING;
end;
//WALLOPS :message
with CommandHandlers.Add do
begin
Command := 'WALLOPS'; {do not localize}
OnCommand := CommandWALLOPS;
end;
//TOPIC
with CommandHandlers.Add do
begin
Command := 'TOPIC'; {do not localize}
OnCommand := CommandTOPIC;
end;
{ Numeric commands }
//004
with CommandHandlers.Add do
begin
Command := '004'; {do not localize}
OnCommand := CommandServerWelcome;
end;
//ENDOFSTATS
with CommandHandlers.Add do
begin
Command := '219'; {do not localize}
OnCommand := CommandENDOFSTATS;
end;
//SERVLISTEND
with CommandHandlers.Add do
begin
Command := '235'; {do not localize}
OnCommand := CommandSERVLISTEND;
end;
//USERHOST
with CommandHandlers.Add do
begin
Command := '302'; {do not localize}
OnCommand := CommandUSERHOST;
end;
//ISON
with CommandHandlers.Add do
begin
Command := '303'; {do not localize}
OnCommand := CommandISON;
end;
//ENDOFWHO
with CommandHandlers.Add do
begin
Command := '315'; {do not localize}
OnCommand := CommandENDOFWHO;
end;
//ENDOFWHOIS
with CommandHandlers.Add do
begin
Command := '318'; {do not localize}
OnCommand := CommandENDOFWHOIS;
end;
//LISTEND
with CommandHandlers.Add do
begin
Command := '323'; {do not localize}
OnCommand := CommandLISTEND;
end;
//CHANMODEIS
with CommandHandlers.Add do
begin
Command := '324'; {do not localize}
OnCommand := CommandCHANMODE;
end;
//NOTOPIC
with CommandHandlers.Add do
begin
Command := '331'; {do not localize}
OnCommand := CommandTOPIC;
end;
//INVITING
with CommandHandlers.Add do
begin
Command := '341'; {do not localize}
OnCommand := CommandINVITING;
end;
//SUMMONING
with CommandHandlers.Add do
begin
Command := '342'; {do not localize}
OnCommand := CommandSUMMONING;
end;
//ENDOFINVITELIST
with CommandHandlers.Add do
begin
Command := '347'; {do not localize}
OnCommand := CommandENDOFINVITELIST;
end;
//ENDOFEXCEPTLIST
with CommandHandlers.Add do
begin
Command := '349'; {do not localize}
OnCommand := CommandENDOFEXCEPTLIST;
end;
//SVERSION
with CommandHandlers.Add do
begin
Command := '351'; {do not localize}
OnCommand := CommandSVERSION;
end;
//ENDOFLINKS
with CommandHandlers.Add do
begin
Command := '365'; {do not localize}
OnCommand := CommandENDOFLINKS;
end;
//ENDOFNAMES
with CommandHandlers.Add do
begin
Command := '366'; {do not localize}
OnCommand := CommandENDOFNAMES;
end;
//ENDOFBANLIST
with CommandHandlers.Add do
begin
Command := '368'; {do not localize}
OnCommand := CommandENDOFBANLIST;
end;
//ENDOFWHOWAS
with CommandHandlers.Add do
begin
Command := '369'; {do not localize}
OnCommand := CommandENDOFWHOWAS;
end;
//ENDOFINFO
with CommandHandlers.Add do
begin
Command := '374'; {do not localize}
OnCommand := CommandENDOFINFO;
end;
//ENDOFMOTD
with CommandHandlers.Add do
begin
Command := '376'; {do not localize}
OnCommand := CommandENDOFMOTD;
end;
//YOUREOPER
with CommandHandlers.Add do
begin
Command := '381'; {do not localize}
//OnCommand := CommandYOUAREOPER;
end;
//REHASHING
with CommandHandlers.Add do
begin
Command := '382'; {do not localize}
OnCommand := CommandREHASHING;
end;
//YOUARESERVICE
with CommandHandlers.Add do
begin
Command := '383'; {do not localize}
OnCommand := CommandSERVICE;
end;
//STIME
with CommandHandlers.Add do
begin
Command := '391'; {do not localize}
OnCommand := CommandSTIME;
end;
//ENDOFUSERS
with CommandHandlers.Add do
begin
Command := '394'; {do not localize}
OnCommand := CommandENDOFUSERS;
end;
with FCommandHandlers do
begin
OnBeforeCommandHandler := DoBeforeCmd;
OnCommandHandlersException := DoCmdHandlersException;
end;
end;
//============================================================================//
{ Command handlers }
procedure TIdIRC.DoBeforeCmd(ASender: TIdCommandHandlers; var AData: string;
AContext: TIdContext);
var
LTmp: String;
begin
// ":sender!pc@domain"
if AData <> '' then begin
if AData[1] = ':' then begin
LTmp := Fetch(AData, #32);
FSenderNick := Fetch(LTmp, '!');
FSenderHost := LTmp;
end;
end;
if Assigned(FOnRaw) then
begin
FOnRaw(AContext, True, AData);
end;
end;
procedure TIdIRC.DoCmdHandlersException(ACommand: String; AContext: TIdContext);
var
ACmdCode: Integer;
begin
ACmdCode := StrToIntDef(Fetch(ACommand, #32), -1);
//
case ACmdCode of
6,
7:
begin
//MAP
end;
301,
305,
306:
begin
if Assigned(FOnAway) then
begin
if (ACmdCode = 305) or (ACmdCode = 306) then
FUserAway := False
else
FUserAway := True;
OnAway(AContext, FSenderNick, FSenderHost, Fetch(ACommand, #32), FUserAway);
end;
end;
5,
401..424,
437..502:
begin
if Assigned(FOnServerError) then
begin
OnServerError(AContext, ACmdCode, ACommand);
end;
end;
431,
432,
433,
436:
begin
if Assigned(FOnNickError) then
begin
OnNicknameError(AContext, StrToInt(Fetch(ACommand, #32)));
end;
end;
else
{ anything else, just add to TIdStrings }
if ACmdCode <> -1 then
begin
if length(ACommand) <> 0 then
begin
FTmp.Add(ACommand);
end;
end;
end;
end;
//============================================================================//
procedure TIdIRC.CommandPRIVMSG(ASender: TIdCommand);
var
LTmp: String;
begin
if ASender.Params[0][1] = #1 then
begin
ParseCTCPQuery(ASender.Params[1], ASender.Params[0]);
end
else if Assigned(FOnPrivMessage) then
begin
LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2);
OnPrivateMessage(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], LTmp);
end;
end;
procedure TIdIRC.CommandNOTICE(ASender: TIdCommand);
var
LTmp: String;
begin
if ASender.Params[0][1] = #1 then
begin
ParseCTCPReply(ASender.Params[1], ASender.Params[0]);
end
else if Assigned(FOnNotice) then
begin
LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2);
OnNotice(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], LTmp);
end;
end;
procedure TIdIRC.CommandJOIN(ASender: TIdCommand);
begin
if Assigned(FOnJoin) then
begin
OnJoin(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0]);
end;
end;
procedure TIdIRC.CommandPART(ASender: TIdCommand);
begin
if Assigned(FOnPart) then
begin
OnPart(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0]);
end;
end;
procedure TIdIRC.CommandKICK(ASender: TIdCommand);
var
LTmp: String;
begin
if Assigned(FOnKick) then
begin
LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2);
OnKick(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], ASender.Params[1], LTmp);
end;
end;
procedure TIdIRC.CommandMODE(ASender: TIdCommand);
begin
if IsChannel(ASender.Params[1]) then
begin
OnChannelMode(ASender.Context);
end
else if Assigned(FOnUserMode) then
begin
OnUserMode(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0]);
end;
end;
procedure TIdIRC.CommandNICK(ASender: TIdCommand);
begin
if Assigned(FOnNickChange) then
begin
OnNicknameChange(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0]);
end;
end;
procedure TIdIRC.CommandQUIT(ASender: TIdCommand);
var
LTmp: String;
begin
if Assigned(FOnQuit) then
begin
LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2);
OnQuit(ASender.Context, FSenderNick, FSenderHost, LTmp);
end;
end;
procedure TIdIRC.CommandINVITE(ASender: TIdCommand);
var
LTmp: String;
begin
if Assigned(FOnInvite) then
begin
LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2);
OnInvite(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], LTmp);
end;
end;
procedure TIdIRC.CommandKILL(ASender: TIdCommand);
var
LTmp: String;
begin
if Assigned(FOnKill) then
begin
OnKill(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], LTmp);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -