%PDF- %PDF-
| Direktori : /data/old/usr/local/include/znc/ |
| Current File : //data/old/usr/local/include/znc/IRCSock.h |
/*
* Copyright (C) 2004-2018 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ZNC_IRCSOCK_H
#define ZNC_IRCSOCK_H
#include <znc/zncconfig.h>
#include <znc/Socket.h>
#include <znc/Nick.h>
#include <znc/Message.h>
#include <deque>
// Forward Declarations
class CChan;
class CUser;
class CIRCNetwork;
class CClient;
// !Forward Declarations
// TODO: This class needs new name
class CIRCSock : public CIRCSocket {
public:
CIRCSock(CIRCNetwork* pNetwork);
virtual ~CIRCSock();
CIRCSock(const CIRCSock&) = delete;
CIRCSock& operator=(const CIRCSock&) = delete;
typedef enum {
// These values must line up with their position in the CHANMODE
// argument to raw 005
ListArg = 0,
HasArg = 1,
ArgWhenSet = 2,
NoArg = 3
} EChanModeArgs;
void ReadLine(const CString& sData) override;
void Connected() override;
void Disconnected() override;
void ConnectionRefused() override;
void SockError(int iErrno, const CString& sDescription) override;
void Timeout() override;
void ReachedMaxBuffer() override;
/** Sends a raw data line to the server.
* @param sLine The line to be sent.
*
* The line is first passed \e unmodified to the \ref
* CModule::OnSendToIRC() module hook. If no module halts the process,
* the line is then sent to the server.
*
* Prefer \l PutIRC() instead.
*/
void PutIRCRaw(const CString& sLine);
/** Sends a message to the server.
* See \l PutIRC(const CMessage&) for details.
*/
void PutIRC(const CString& sLine);
/** Sends a message to the server.
* @param Message The message to be sent.
* @note Only known and compatible messages and tags are sent.
*
* This method can delay the delivery of the message to honor protection
* from flood.
*
* This method ensures that only tags, that were negotiated with CAP REQ
* and CAP ACK, are sent. Not all IRC server are capable of handling all
* messages and tags. Thus, in order to stay compatible with a variety of
* IRC servers, ZNC has to filter out messages and tags that the server
* has not explicitly acknowleged.
*
* Additional tags can be added via \l CIRCSock::SetTagSupport().
*
* @warning Bypassing the filter may cause troubles to some older IRC
* servers.
*
* It is possible to bypass the filter by converting a message to a string
* using \l CMessage::ToString(), and passing the resulting raw line to the
* \l CIRCSock::PutIRCRaw(const CString& sLine):
* \code
* pServer->PutIRCRaw(Message.ToString());
* \endcode
*/
void PutIRC(const CMessage& Message);
void PutIRCQuick(const CString& sLine); //!< Should be used for PONG only
void ResetChans();
void Quit(const CString& sQuitMsg = "");
/** You can call this from CModule::OnServerCapResult to suspend
* sending other CAP requests and CAP END for a while. Each
* call to PauseCap should be balanced with a call to ResumeCap.
*/
void PauseCap();
/** If you used PauseCap, call this when CAP negotiation and logging in
* should be resumed again.
*/
void ResumeCap();
bool IsTagEnabled(const CString& sTag) const {
return 1 == m_ssSupportedTags.count(sTag);
}
/** Registers a tag as being supported or unsupported by the server.
* This doesn't affect tags which the server sends.
* @param sTag The tag to register.
* @param bState Whether the client supports the tag.
*/
void SetTagSupport(const CString& sTag, bool bState);
// Setters
void SetPass(const CString& s) { m_sPass = s; }
// !Setters
// Getters
unsigned int GetMaxNickLen() const { return m_uMaxNickLen; }
EChanModeArgs GetModeType(char cMode) const;
char GetPermFromMode(char cMode) const;
const std::map<char, EChanModeArgs>& GetChanModes() const {
return m_mceChanModes;
}
bool IsPermChar(const char c) const {
return (c != '\0' && GetPerms().find(c) != CString::npos);
}
bool IsPermMode(const char c) const {
return (c != '\0' && GetPermModes().find(c) != CString::npos);
}
const CString& GetPerms() const { return m_sPerms; }
const CString& GetPermModes() const { return m_sPermModes; }
CString GetNickMask() const { return m_Nick.GetNickMask(); }
const CString& GetNick() const { return m_Nick.GetNick(); }
const CString& GetPass() const { return m_sPass; }
CIRCNetwork* GetNetwork() const { return m_pNetwork; }
bool HasNamesx() const { return m_bNamesx; }
bool HasUHNames() const { return m_bUHNames; }
bool HasAwayNotify() const { return m_bAwayNotify; }
bool HasAccountNotify() const { return m_bAccountNotify; }
bool HasExtendedJoin() const { return m_bExtendedJoin; }
bool HasServerTime() const { return m_bServerTime; }
const std::set<char>& GetUserModes() const {
return m_scUserModes;
}
// This is true if we are past raw 001
bool IsAuthed() const { return m_bAuthed; }
const SCString& GetAcceptedCaps() const { return m_ssAcceptedCaps; }
bool IsCapAccepted(const CString& sCap) {
return 1 == m_ssAcceptedCaps.count(sCap);
}
const MCString& GetISupport() const { return m_mISupport; }
CString GetISupport(const CString& sKey,
const CString& sDefault = "") const;
// !Getters
// TODO move this function to CIRCNetwork and make it non-static?
static bool IsFloodProtected(double fRate);
private:
// Message Handlers
bool OnAccountMessage(CMessage& Message);
bool OnActionMessage(CActionMessage& Message);
bool OnAwayMessage(CMessage& Message);
bool OnCapabilityMessage(CMessage& Message);
bool OnCTCPMessage(CCTCPMessage& Message);
bool OnErrorMessage(CMessage& Message);
bool OnInviteMessage(CMessage& Message);
bool OnJoinMessage(CJoinMessage& Message);
bool OnKickMessage(CKickMessage& Message);
bool OnModeMessage(CModeMessage& Message);
bool OnNickMessage(CNickMessage& Message);
bool OnNoticeMessage(CNoticeMessage& Message);
bool OnNumericMessage(CNumericMessage& Message);
bool OnPartMessage(CPartMessage& Message);
bool OnPingMessage(CMessage& Message);
bool OnPongMessage(CMessage& Message);
bool OnQuitMessage(CQuitMessage& Message);
bool OnTextMessage(CTextMessage& Message);
bool OnTopicMessage(CTopicMessage& Message);
bool OnWallopsMessage(CMessage& Message);
bool OnServerCapAvailable(const CString& sCap);
// !Message Handlers
void SetNick(const CString& sNick);
void ParseISupport(const CMessage& Message);
// This is called when we connect and the nick we want is already taken
void SendAltNick(const CString& sBadNick);
void SendNextCap();
void TrySend();
protected:
bool m_bAuthed;
bool m_bNamesx;
bool m_bUHNames;
bool m_bAwayNotify;
bool m_bAccountNotify;
bool m_bExtendedJoin;
bool m_bServerTime;
CString m_sPerms;
CString m_sPermModes;
std::set<char> m_scUserModes;
std::map<char, EChanModeArgs> m_mceChanModes;
CIRCNetwork* m_pNetwork;
CNick m_Nick;
CString m_sPass;
std::map<CString, CChan*> m_msChans;
unsigned int m_uMaxNickLen;
unsigned int m_uCapPaused;
SCString m_ssAcceptedCaps;
SCString m_ssPendingCaps;
time_t m_lastCTCP;
unsigned int m_uNumCTCP;
static const time_t m_uCTCPFloodTime;
static const unsigned int m_uCTCPFloodCount;
MCString m_mISupport;
std::deque<CMessage> m_vSendQueue;
short int m_iSendsAllowed;
unsigned short int m_uFloodBurst;
double m_fFloodRate;
bool m_bFloodProtection;
SCString m_ssSupportedTags;
friend class CIRCFloodTimer;
};
#endif // !ZNC_IRCSOCK_H