void CChan::OnWho(const CString& sNick, const CString& sIdent, const CString& sHost) { CNick* pNick = FindNick(sNick); if (pNick) { pNick->SetIdent(sIdent); pNick->SetHost(sHost); } }
bool CChan::AddNick(const CString& sNick) { const char* p = sNick.c_str(); CString sPrefix, sTmp, sIdent, sHost; while (m_pNetwork->GetIRCSock()->IsPermChar(*p)) { sPrefix += *p; if (!*++p) { return false; } } sTmp = p; // The UHNames extension gets us nick!ident@host instead of just plain nick sIdent = sTmp.Token(1, true, "!"); sHost = sIdent.Token(1, true, "@"); sIdent = sIdent.Token(0, false, "@"); // Get the nick sTmp = sTmp.Token(0, false, "!"); CNick tmpNick(sTmp); CNick* pNick = FindNick(sTmp); if (!pNick) { pNick = &tmpNick; pNick->SetNetwork(m_pNetwork); } if (!sIdent.empty()) pNick->SetIdent(sIdent); if (!sHost.empty()) pNick->SetHost(sHost); for (CString::size_type i = 0; i < sPrefix.length(); i++) { pNick->AddPerm(sPrefix[i]); } if (pNick->GetNick().Equals(m_pNetwork->GetCurNick())) { for (CString::size_type i = 0; i < sPrefix.length(); i++) { AddPerm(sPrefix[i]); } } m_msNicks[pNick->GetNick()] = *pNick; return true; }
// #124: OnChanMsg(): nick doesn't have perms static void FixupChanNick(CNick& Nick, CChan* pChan) { // A channel nick has up-to-date channel perms, but might be // lacking (usernames-in-host) the associated ident & host. // An incoming message, on the other hand, has normally a full // nick!ident@host prefix. Sync the two so that channel nicks // get the potentially missing piece of info and module hooks // get the perms. CNick* pChanNick = pChan->FindNick(Nick.GetNick()); if (pChanNick) { if (!Nick.GetIdent().empty()) { pChanNick->SetIdent(Nick.GetIdent()); } if (!Nick.GetHost().empty()) { pChanNick->SetHost(Nick.GetHost()); } Nick.Clone(*pChanNick); } }