-
Notifications
You must be signed in to change notification settings - Fork 0
/
IRCSock.h
126 lines (113 loc) · 4.56 KB
/
IRCSock.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
* Copyright (C) 2004-2011 See the AUTHORS file for details.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*/
#ifndef _IRCSOCK_H
#define _IRCSOCK_H
#include "zncconfig.h"
#include "Socket.h"
#include "Nick.h"
// Forward Declarations
class CChan;
class CUser;
class CClient;
// !Forward Declarations
class CIRCSock : public CZNCSock {
public:
CIRCSock(CUser* pUser);
virtual ~CIRCSock();
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;
// Message Handlers
bool OnCTCPReply(CNick& Nick, CString& sMessage);
bool OnPrivCTCP(CNick& Nick, CString& sMessage);
bool OnChanCTCP(CNick& Nick, const CString& sChan, CString& sMessage);
bool OnGeneralCTCP(CNick& Nick, CString& sMessage);
bool OnPrivMsg(CNick& Nick, CString& sMessage);
bool OnChanMsg(CNick& Nick, const CString& sChan, CString& sMessage);
bool OnPrivNotice(CNick& Nick, CString& sMessage);
bool OnChanNotice(CNick& Nick, const CString& sChan, CString& sMessage);
bool OnServerCapAvailable(const CString& sCap);
// !Message Handlers
virtual void ReadLine(const CString& sData);
virtual void Connected();
virtual void Disconnected();
virtual void ConnectionRefused();
virtual void SockError(int iErrno);
virtual void Timeout();
virtual void ReachedMaxBuffer();
void PutIRC(const CString& sLine);
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();
// Setters
void SetPass(const CString& s) { m_sPass = s; }
// !Setters
// Getters
unsigned int GetMaxNickLen() const { return m_uMaxNickLen; }
EChanModeArgs GetModeType(unsigned char uMode) const;
unsigned char GetPermFromMode(unsigned char uMode) const;
const map<unsigned char, EChanModeArgs>& GetChanModes() const { return m_mueChanModes; }
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; }
CUser* GetUser() const { return m_pUser; }
bool HasNamesx() const { return m_bNamesx; }
bool HasUHNames() const { return m_bUHNames; }
const set<unsigned char>& GetUserModes() const { return m_scUserModes; }
// This is true if we are past raw 001
bool IsAuthed() const { return m_bAuthed; }
bool IsCapAccepted(const CString& sCap) { return 1 == m_ssAcceptedCaps.count(sCap); }
// !Getters
// This handles NAMESX and UHNAMES in a raw 353 reply
void ForwardRaw353(const CString& sLine) const;
void ForwardRaw353(const CString& sLine, CClient* pClient) const;
private:
void SetNick(const CString& sNick);
void ParseISupport(const CString& sLine);
// This is called when we connect and the nick we want is already taken
void SendAltNick(const CString& sBadNick);
void SendNextCap();
protected:
bool m_bISpoofReleased;
bool m_bAuthed;
bool m_bNamesx;
bool m_bUHNames;
CString m_sPerms;
CString m_sPermModes;
set<unsigned char> m_scUserModes;
map<unsigned char, EChanModeArgs> m_mueChanModes;
CUser* m_pUser;
CNick m_Nick;
CString m_sPass;
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;
};
#endif // !_IRCSOCK_H