#include "mode.h"
#include "xline.h"
#include "inspstring.h"
-#include "helperfuncs.h"
+
#include "typedefs.h"
chanrec::chanrec(InspIRCd* Instance) : ServerInstance(Instance)
if (!Ptr)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
MOD_RESULT = 0;
FOREACH_RESULT_I(Instance,I_OnUserPreJoin,OnUserPreJoin(user,NULL,cname));
/* first user in is given ops */
a->uc_modes = UCMODE_OP;
Ptr->AddOppedUser(user);
+ Ptr->SetPrefix(user, '@', OP_VALUE, true);
}
else
{
}
user->chans[i]->uc_modes = 0;
user->chans[i]->channel = NULL;
+ this->RemoveAllPrefixes(user);
break;
}
}
this->WriteChannelWithServ(ServerInstance->Config->ServerName, "KICK %s %s :%s", this->name, user->nick, reason);
user->chans[i]->uc_modes = 0;
user->chans[i]->channel = NULL;
+ this->RemoveAllPrefixes(user);
break;
}
}
src->WriteServ("441 %s %s %s :They are not on that channel",src->nick, user->nick, this->name);
return this->GetUserCounter();
}
- if ((is_uline(user->server)) && (!is_uline(src->server)))
+ if ((ServerInstance->ULine(user->server)) && (!ServerInstance->ULine(src->server)))
{
src->WriteServ("482 %s %s :Only a u-line may kick a u-line from a channel.",src->nick, this->name);
return this->GetUserCounter();
}
int MOD_RESULT = 0;
- if (!is_uline(src->server))
+ if (!ServerInstance->ULine(src->server))
{
MOD_RESULT = 0;
FOREACH_RESULT(I_OnUserPreKick,OnUserPreKick(src,user,this,reason));
if (MOD_RESULT != -1)
{
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(src,user,this,AC_KICK));
- if ((MOD_RESULT == ACR_DENY) && (!is_uline(src->server)))
+ if ((MOD_RESULT == ACR_DENY) && (!ServerInstance->ULine(src->server)))
return this->GetUserCounter();
- if ((MOD_RESULT == ACR_DEFAULT) || (!is_uline(src->server)))
+ if ((MOD_RESULT == ACR_DEFAULT) || (!ServerInstance->ULine(src->server)))
{
int them = this->GetStatus(src);
int us = this->GetStatus(user);
this->WriteChannel(src, "KICK %s %s :%s", this->name, user->nick, reason);
(*i)->uc_modes = 0;
(*i)->channel = NULL;
+ this->RemoveAllPrefixes(user);
break;
}
}
for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
{
- if (i->second->fd != FD_MAGIC_NUMBER)
+ if (IS_LOCAL(i->second))
user->WriteTo(i->second,text);
}
}
continue;
}
- size_t ptrlen = snprintf(ptr, MAXBUF, "%s%s ", this->GetStatusChar(i->second), i->second->nick);
+ size_t ptrlen = snprintf(ptr, MAXBUF, "%s%s ", this->GetPrefixChar(i->second), i->second->nick);
curlen += ptrlen;
ptr += ptrlen;
/* returns the status character for a given user on a channel, e.g. @ for op,
* % for halfop etc. If the user has several modes set, the highest mode
- * the user has must be returned. */
-
-const char* chanrec::GetStatusChar(userrec *user)
+ * the user has must be returned.
+ */
+const char* chanrec::GetPrefixChar(userrec *user)
{
- for (std::vector<ucrec*>::const_iterator i = user->chans.begin(); i != user->chans.end(); i++)
+ static char px[2];
+ unsigned int mx = 0;
+
+ *px = 0;
+ *(px+1) = 0;
+
+ prefixlist::iterator n = prefixes.find(user);
+ if (n != prefixes.end())
{
- if ((*i)->channel == this)
+ for (std::vector<prefixtype>::iterator x = n->second.begin(); x != n->second.end(); x++)
{
- if (((*i)->uc_modes & UCMODE_OP) > 0)
- {
- return "@";
- }
- if (((*i)->uc_modes & UCMODE_HOP) > 0)
- {
- return "%";
- }
- if (((*i)->uc_modes & UCMODE_VOICE) > 0)
+ if (x->second > mx)
{
- return "+";
+ *px = x->first;
+ mx = x->second;
}
- return "";
}
}
- return "";
+
+ return px;
+}
+
+const char* chanrec::GetAllPrefixChars(userrec* user)
+{
+ static char prefix[MAXBUF];
+ int ctr = 0;
+ *prefix = 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++)
+ {
+ prefix[ctr++] = x->first;
+ }
+ }
+
+ prefix[ctr] = 0;
+
+ return prefix;
+}
+
+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;
+ }
+ }
+
+ return mx;
}
}
-
int chanrec::GetStatus(userrec *user)
{
- if (is_uline(user->server))
+ if (ServerInstance->ULine(user->server))
return STATUS_OP;
for (std::vector<ucrec*>::const_iterator i = user->chans.begin(); i != user->chans.end(); i++)
return STATUS_NORMAL;
}
+void chanrec::SetPrefix(userrec* user, char prefix, unsigned int prefix_value, bool adding)
+{
+ prefixlist::iterator n = prefixes.find(user);
+ prefixtype pfx = std::make_pair(prefix,prefix_value);
+ if (adding)
+ {
+ if (n != prefixes.end())
+ {
+ if (std::find(n->second.begin(), n->second.end(), pfx) == n->second.end())
+ {
+ n->second.push_back(pfx);
+ }
+ }
+ else
+ {
+ pfxcontainer one;
+ one.push_back(pfx);
+ prefixes.insert(std::make_pair<userrec*,pfxcontainer>(user, one));
+ }
+ }
+ else
+ {
+ if (n != prefixes.end())
+ {
+ pfxcontainer::iterator x = std::find(n->second.begin(), n->second.end(), pfx);
+ if (x != n->second.end())
+ n->second.erase(x);
+ }
+ }
+}
+
+void chanrec::RemoveAllPrefixes(userrec* user)
+{
+ prefixlist::iterator n = prefixes.find(user);
+ if (n != prefixes.end())
+ prefixes.erase(n);
+}