created = topicset = limit = 0;
internal_userlist.clear();
memset(&modes,0,64);
+ age = ServerInstance->Time(true);
}
void chanrec::SetMode(char mode,bool mode_on)
}
if (Ptr->bans.size())
{
- char mask[MAXBUF];
- snprintf(mask, MAXBUF, "%s!%s@%s",user->nick, user->ident, user->GetIPString());
if (Ptr->IsBanned(user))
{
user->WriteServ("474 %s %s :Cannot join channel (You're banned)",user->nick, Ptr->name);
chanrec* chanrec::ForceChan(InspIRCd* Instance, chanrec* Ptr,ucrec *a,userrec* user, const std::string &privs)
{
+ userrec* dummyuser = new userrec(Instance);
+ std::string nick = user->nick;
+
a->uc_modes = 0;
+ dummyuser->SetFd(FD_MAGIC_NUMBER);
+
+ a->channel = Ptr;
+ Ptr->AddUser(user);
+ user->ModChannelCount(1);
for (std::string::const_iterator x = privs.begin(); x != privs.end(); x++)
{
const char status = *x;
- switch (status)
- {
- case '@':
- a->uc_modes |= UCMODE_OP;
- break;
- case '%':
- a->uc_modes |= UCMODE_HOP;
- break;
- case '+':
- a->uc_modes |= UCMODE_VOICE;
- break;
- }
ModeHandler* mh = Instance->Modes->FindPrefix(status);
if (mh)
{
Ptr->SetPrefix(user, status, mh->GetPrefixRank(), true);
+ /* Make sure that the mode handler knows this mode was now set */
+ mh->OnModeChange(dummyuser, dummyuser, Ptr, nick, true);
}
}
- a->channel = Ptr;
- Ptr->AddUser(user);
- user->ModChannelCount(1);
+ delete dummyuser;
+
Ptr->WriteChannel(user,"JOIN :%s",Ptr->name);
/* Theyre not the first ones in here, make sure everyone else sees the modes we gave the user */
Ptr->UserList(user);
}
FOREACH_MOD_I(Instance,I_OnUserJoin,OnUserJoin(user,Ptr));
+ FOREACH_MOD_I(Instance,I_OnPostJoin,OnPostJoin(user,Ptr));
return Ptr;
}
*/
const char* chanrec::GetPrefixChar(userrec *user)
{
- static char px[2];
- unsigned int mx = 0;
-
- *px = 0;
- *(px+1) = 0;
-
+ static char pf[2] = {0, 0};
+
prefixlist::iterator n = prefixes.find(user);
if (n != prefixes.end())
{
- for (std::vector<prefixtype>::iterator x = n->second.begin(); x != n->second.end(); x++)
+ if (n->second.size())
{
- if (x->second > mx)
- {
- *px = x->first;
- mx = x->second;
- }
+ /* If the user has any prefixes, their highest prefix
+ * will always be at the head of the list, as the list is
+ * sorted in rank order highest first (see SetPrefix()
+ * for reasons why)
+ */
+ *pf = n->second.begin()->first;
+ return pf;
}
}
- return px;
+ *pf = 0;
+ return pf;
}
const char* chanrec::GetAllPrefixChars(userrec* user)
unsigned int chanrec::GetPrefixValue(userrec* user)
{
- unsigned int mx = 0;
-
prefixlist::iterator n = prefixes.find(user);
if (n != prefixes.end())
{
- for (std::vector<prefixtype>::iterator x = n->second.begin(); x != n->second.end(); x++)
- {
- if (x->second > mx)
- mx = x->second;
- }
+ if (n->second.size())
+ return n->second.begin()->second;
}
-
- return mx;
+ return 0;
}
return STATUS_NORMAL;
}
-/*bool ModeParser::PrefixComparison(const prefixtype one, const prefixtype two)
-{
- return one.second > two.second;
-}*/
-
void chanrec::SetPrefix(userrec* user, char prefix, unsigned int prefix_value, bool adding)
{
prefixlist::iterator n = prefixes.find(user);
if (std::find(n->second.begin(), n->second.end(), pfx) == n->second.end())
{
n->second.push_back(pfx);
+ /* We must keep prefixes in rank order, largest first.
+ * This is for two reasons, firstly because x-chat *ass-u-me's* this
+ * state, and secondly it turns out to be a benefit to us later.
+ * See above in GetPrefix().
+ */
std::sort(n->second.begin(), n->second.end(), ModeParser::PrefixComparison);
}
}
n->second.erase(x);
}
}
+ ServerInstance->Log(DEBUG,"Added prefix %c to %s for %s, prefixlist size is now %d", prefix, this->name, user->nick, prefixes.size());
}
void chanrec::RemoveAllPrefixes(userrec* user)
{
prefixlist::iterator n = prefixes.find(user);
if (n != prefixes.end())
+ {
+ ServerInstance->Log(DEBUG,"Removed prefixes from %s for %s, prefixlist size is now %d", this->name, user->nick, prefixes.size());
prefixes.erase(n);
+ }
}