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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
#include "Chan.h"
#include "Nick.h"
#include "User.h"
#include "IRCSock.h"
CNick::CNick() {
Reset();
}
CNick::CNick(const CString& sNick) {
Reset();
Parse(sNick);
}
CNick::~CNick() {}
void CNick::Reset() {
m_cPerm = '\0';
}
CString CNick::Concat(const CString& sNick, const CString& sSuffix, unsigned int uMaxNickLen) {
if (sSuffix.length() >= uMaxNickLen) {
return sSuffix.Left(uMaxNickLen);
}
return sNick.Left(uMaxNickLen - sSuffix.length()) + sSuffix;
}
void CNick::Parse(const CString& sNickMask) {
if (sNickMask.empty()) {
return;
}
CString::size_type uPos = sNickMask.find('!');
if (uPos == CString::npos) {
m_sNick = sNickMask.substr((sNickMask[0] == ':'));
return;
}
m_sNick = sNickMask.substr((sNickMask[0] == ':'), uPos);
m_sHost = sNickMask.substr(uPos +1);
if ((uPos = m_sHost.find('@')) != CString::npos) {
m_sIdent = m_sHost.substr(0, uPos);
m_sHost = m_sHost.substr(uPos +1);
}
}
unsigned int CNick::GetCommonChans(vector<CChan*>& vRetChans, CUser* pUser) const {
vRetChans.clear();
const vector<CChan*>& vChans = pUser->GetChans();
for (unsigned int a = 0; a < vChans.size(); a++) {
CChan* pChan = vChans[a];
const map<CString,CNick*>& msNicks = pChan->GetNicks();
for (map<CString,CNick*>::const_iterator it = msNicks.begin(); it != msNicks.end(); it++) {
if (it->first.CaseCmp(m_sNick) == 0) {
vRetChans.push_back(pChan);
continue;
}
}
}
return vRetChans.size();
}
void CNick::SetUser(CUser* pUser) { m_pUser = pUser; }
void CNick::SetPermChar(char c) { m_cPerm = c; }
void CNick::SetNick(const CString& s) { m_sNick = s; }
void CNick::SetIdent(const CString& s) { m_sIdent = s; }
void CNick::SetHost(const CString& s) { m_sHost = s; }
bool CNick::HasPerm(unsigned char uPerm) const {
return (uPerm && m_suChanPerms.find(uPerm) != m_suChanPerms.end());
}
bool CNick::AddPerm(unsigned char uPerm) {
if (!uPerm || HasPerm(uPerm)) {
return false;
}
m_suChanPerms.insert(uPerm);
UpdatePermChar();
return true;
}
bool CNick::RemPerm(unsigned char uPerm) {
if (!HasPerm(uPerm)) {
return false;
}
m_suChanPerms.erase(uPerm);
UpdatePermChar();
return true;
}
void CNick::UpdatePermChar() {
const CString& sChanPerms = (!m_pUser) ? "@+" : m_pUser->GetIRCSock()->GetPerms();
m_cPerm = 0;
for (unsigned int a = 0; a < sChanPerms.size(); a++) {
const unsigned char& c = sChanPerms[a];
if (HasPerm(c)) {
m_cPerm = c;
break;
}
}
}
const set<unsigned char>& CNick::GetChanPerms() const { return m_suChanPerms; }
const unsigned char CNick::GetPermChar() const { return m_cPerm; }
CString CNick::GetPermStr() const {
CString sRet;
if (m_cPerm) {
sRet += m_cPerm;
}
return sRet;
}
const CString& CNick::GetNick() const { return m_sNick; }
const CString& CNick::GetIdent() const { return m_sIdent; }
const CString& CNick::GetHost() const { return m_sHost; }
CString CNick::GetNickMask() const {
if (m_sNick.find('.') != CString::npos) {
return m_sNick;
}
return (m_sNick + "!" + m_sIdent + "@" + m_sHost);
}
CString CNick::GetHostMask() const {
CString sRet = m_sNick;
if (!m_sIdent.empty()) {
sRet += "!" + m_sIdent;
}
if (!m_sHost.empty()) {
sRet += "@" + m_sHost;
}
return (sRet);
}
|