📄 idirc.pas
字号:
end;
procedure TIdIRC.CommandPING(ASender: TIdCommand);
begin
Pong(ASender.Params[0]);
if Assigned(FOnPingPong) then
begin
OnPingPong(ASender.Context);
end;
end;
procedure TIdIRC.CommandWALLOPS(ASender: TIdCommand);
var
LTmp: String;
begin
if Assigned(FOnWallops) then
begin
LTmp := copy(ASender.Params[1], 2, length(ASender.Params[1]) - 2);
OnWallops(ASender.Context, FSenderNick, FSenderHost, LTmp);
end;
end;
procedure TIdIRC.CommandTOPIC(ASender: TIdCommand);
begin
if Assigned(FOnTopic) then
begin
OnTopic(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0], ASender.Params[1]);
end;
end;
procedure TIdIRC.CommandServerWelcome(ASender: TIdCommand);
begin
if Assigned(FOnSWelcome) then
begin
FTmp.Add(ASender.UnparsedParams);
OnServerWelcome(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandUSERHOST(ASender: TIdCommand);
begin
if Assigned(FOnUserInfo) then
begin
FTmp.Add(ASender.UnparsedParams);
OnUserInfoReceived(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandISON(ASender: TIdCommand);
begin
if Assigned(FOnIsOnIRC) then
begin
OnIsOnIRC(ASender.Context, FSenderNick, FSenderHost);
end;
end;
procedure TIdIRC.CommandENDOFWHOIS(ASender: TIdCommand);
begin
if Assigned(FOnWhoIs) then
begin
FTmp.Add(ASender.UnparsedParams);
OnWhoIs(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFWHOWAS(ASender: TIdCommand);
begin
if Assigned(FOnWhoWas) then
begin
FTmp.Add(ASender.UnparsedParams);
OnWhoWas(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandLISTEND(ASender: TIdCommand);
begin
if Assigned(FOnSvrList) then
begin
FTmp.Add(ASender.UnparsedParams);
OnServerListReceived(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandINVITING(ASender: TIdCommand);
begin
if Assigned(FOnInviting) then
begin
OnInviting(ASender.Context, FSenderNick, FSenderHost);
end;
end;
procedure TIdIRC.CommandSUMMONING(ASender: TIdCommand);
begin
if Assigned(FOnSummon) then
begin
OnSummon(ASender.Context, FSenderNick, FSenderHost);
end;
end;
procedure TIdIRC.CommandENDOFINVITELIST(ASender: TIdCommand);
begin
if Assigned(FOnINVList) then
begin
FTmp.Add(ASender.UnparsedParams);
OnInvitationListReceived(ASender.Context, FSenderNick, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFEXCEPTLIST(ASender: TIdCommand);
begin
if Assigned(FOnEXCList) then
begin
FTmp.Add(ASender.UnparsedParams);
OnExceptionListReceived(ASender.Context, FSenderNick, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFWHO(ASender: TIdCommand);
begin
if Assigned(FOnWho) then
begin
FTmp.Add(ASender.UnparsedParams);
OnWho(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFNAMES(ASender: TIdCommand);
begin
if Assigned(FOnNickList) then
begin
FTmp.Add(ASender.UnparsedParams);
OnNicknamesListReceived(ASender.Context, FSenderNick, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFLINKS(ASender: TIdCommand);
begin
if Assigned(FOnKnownSvrs) then
begin
FTmp.Add(ASender.UnparsedParams);
OnKnownServersListReceived(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFBANLIST(ASender: TIdCommand);
begin
if Assigned(FOnBanList) then
begin
FTmp.Add(ASender.UnparsedParams);
OnBanListReceived(ASender.Context, FSenderNick, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFINFO(ASender: TIdCommand);
begin
if Assigned(FOnUserInfo) then
begin
FTmp.Add(ASender.UnparsedParams);
OnUserInfoReceived(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFMOTD(ASender: TIdCommand);
begin
if Assigned(FOnMOTD) then
begin
FTmp.Add(ASender.UnparsedParams);
OnMOTD(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandREHASHING(ASender: TIdCommand);
begin
if Assigned(FOnRehash) then
begin
OnRehash(ASender.Context, FSenderNick, FSenderHost);
end;
end;
procedure TIdIRC.CommandENDOFUSERS(ASender: TIdCommand);
begin
if Assigned(FOnSvrUsers) then
begin
FTmp.Add(ASender.UnparsedParams);
OnServerUsersListReceived(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandENDOFSTATS(ASender: TIdCommand);
begin
if Assigned(FOnSvrStats) then
begin
FTmp.Add(ASender.UnparsedParams);
OnServerStatsReceived(ASender.Context, FTmp);
if FTmp.Count > 0 then
begin
FTmp.Clear;
end;
end;
end;
procedure TIdIRC.CommandSERVLISTEND(ASender: TIdCommand);
begin
//
end;
procedure TIdIRC.CommandSTIME(ASender: TIdCommand);
begin
if Assigned(FOnSvrTime) then
begin
OnServerTime(ASender.Context, ASender.Params[0], ASender.Params[1]);
end;
end;
procedure TIdIRC.CommandSERVICE(ASender: TIdCommand);
begin
if Assigned(FOnService) then
begin
OnService(ASender.Context);
end;
end;
procedure TIdIRC.CommandSVERSION(ASender: TIdCommand);
begin
if Assigned(FOnSvrVersion) then
begin
OnServerVersion(ASender.Context, ASender.Params[0], ASender.Params[1], ASender.Params[2]);
end;
end;
procedure TIdIRC.CommandCHANMODE(ASender: TIdCommand);
begin
if Assigned(FOnChanMode) then
begin
OnChannelMode(ASender.Context);
end;
end;
procedure TIdIRC.CommandOPER(ASender: TIdCommand);
begin
if Assigned(FOnOp) then
begin
OnOp(ASender.Context, FSenderNick, FSenderHost, ASender.Params[0]);
end;
end;
//============================================================================//
procedure TIdIRC.ParseCTCPQuery(CTCPQuery, AChannel: String);
var
CTCP: String;
LTmp: String;
LTmp1: String;
begin
CTCP := CTCPQuery;
LTmp := Fetch(CTCP, #32);
LTmp1 := CTCP;
case PosInStrArray(LTmp1, IdIRCCTCP) of
0: { ACTION }
begin
//if Assigned(FOnAction) then
// FOnAction(FSenderNick, AChannel, LTmp1);
end;
1: { SOUND }
begin
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, LTmp, LTmp);
end;
end;
2: { PING }
begin
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, LTmp, Ltmp);
end;
OnCTCPReply(nil, FSenderNick, LTmp, LTmp1, ltmp, ltmp, ltmp);
end;
3: { FINGER }
begin
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, LTmp, Ltmp);
end;
OnCTCPReply(nil, FSenderNick, LTmp, Replies.Finger, ltmp, ltmp, ltmp);
end;
4: { USERINFO }
begin
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, Ltmp, ltmp);
end;
OnCTCPReply(nil, FSenderNick, LTmp, Replies.UserInfo, ltmp, ltmp, ltmp);
end;
5: { VERSION }
begin
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, ltmp, ltmp);
end;
OnCTCPReply(nil, FSenderNick, LTmp, Replies.Version, ltmp, ltmp, ltmp);
end;
6: { CLIENTINFO }
begin
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, ltmp, ltmp);
end;
OnCTCPReply(nil, FSenderNick, LTmp, Replies.ClientInfo, ltmp, ltmp, ltmp);
end;
7: { TIME }
begin
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, ltmp, ltmp);
end;
OnCTCPReply(nil, FSenderNick, LTmp, Format(RSIRCTimeIsNow, [DateTimeToStr(now)]), ltmp, ltmp, ltmp);
end;
8: { ERROR }
begin
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, ltmp, ltmp);
end;
end;
9: { DCC }
begin
ParseDCC(LTmp1);
end;
else
if Assigned(FOnCTCPQry) then
begin
FOnCTCPQry(nil, FSenderNick, AChannel, LTmp, LTmp1, ltmp, ltmp);
end;
end;
end;
procedure TIdIRC.ParseCTCPReply(CTCPReply, AChannel: String);
var
CTCP: String;
LTmp: String;
LTmp1: String;
begin
CTCP := CTCPReply;
LTmp := Fetch(CTCP, #32);
LTmp1 := CTCP;
if PosInStrArray(LTmp1, IdIRCCTCP) = 9 then { DCC }
begin
{ FIXME: To be completed. }
end
else if Assigned(FOnCTCPRep) then
begin
FOnCTCPRep(nil, FSenderNick, AChannel, LTmp, LTmp1, ltmp, ltmp);
end;
end;
procedure TIdIRC.ParseDCC(ADCC: String);
var
LTmp: String;
LTmp1, LTmp2, LTmp3: String;
begin
LTmp := ADCC;
LTmp1 := Fetch(LTmp, #32);
LTmp2 := Fetch(LTmp, #32);
LTmp3 := Fetch(LTmp, #32);
//
case PosInStrArray(LTmp1, IdIRCDCC) of
0: {SEND}
begin
if Assigned(FOnDCCSend) then
begin
FOnDCCSend(nil, FSenderNick, LTmp2, LTmp3, StrToInt(LTmp1), StrToInt(LTmp));
end;
end;
1: {CHAT}
begin
if Assigned(FOnDCCChat) then
begin
FOnDCCChat(nil, FSenderNick, LTmp2, StrToInt(LTmp3));
end;
end;
2: {RESUME}
begin
if Assigned(FOnDCCResume) then
begin
FOnDCCResume(nil, FSenderNick, LTmp2, LTmp1, StrToInt(Ltmp1), StrToInt(LTmp3));
end;
end;
3: {ACCEPT}
begin
if Assigned(FOnDCCAccept) then
begin
FOnDCCAccept(nil, FSenderNick, LTmp2, LTmp1, StrToInt(LTmp3), StrToInt(LTmp));
end;
end;
end;
end;
//============================================================================//
procedure TIdIRC.SetNickname(AValue: String);
begin
if not Connected then
begin
FNickname := AValue;
end
else
Raw(Format('NICK %s', [AValue])); {do not localize}
end;
procedure TIdIRC.SetUsername(AValue: String);
begin
if not Connected then
begin
FUsername := AValue;
end
else
Raw(Format('USER %s %s %s :%s', [AValue, GetUserMode, '*', FRealName])); {do not localize}
end;
procedure TIdIRC.SetIdIRCUserMode(AValue: TIdIRCUserModes);
begin
FUserMode := AValue;
end;
procedure TIdIRC.SetIdIRCReplies(AValue: TIdIRCReplies);
begin
FReplies.Assign(AValue);
end;
function TIdIRC.IsChannel(AChannel: String): Boolean;
begin
//Result := (Length(AChannel) > 0) and CharIsInSet(AChannel, 1, ['&','#','+','!']); {do not localize}
Result := False;
if Length(AChannel) > 0 then begin
if CharIsInSet(AChannel, 1, ['&','#','+','!']) then begin {do not localize}
Result := True;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -