+
+ /* Screw it, just return the default of 64 */
+ this->maxbans = 64;
+ return this->maxbans;
+}
+
+void Channel::ResetMaxBans()
+{
+ this->maxbans = 0;
+}
+
+/* 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* Channel::GetPrefixChar(User *user)
+{
+ static char pf[2] = {0, 0};
+
+ prefixlist::iterator n = prefixes.find(user);
+ if (n != prefixes.end())
+ {
+ if (n->second.size())
+ {
+ /* 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;
+ }
+ }
+
+ *pf = 0;
+ return pf;
+}
+
+const char* Channel::GetAllPrefixChars(User* 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 Channel::GetPrefixValue(User* user)
+{
+ prefixlist::iterator n = prefixes.find(user);
+ if (n != prefixes.end())
+ {
+ if (n->second.size())
+ return n->second.begin()->second;
+ }
+ return 0;
+}
+
+int Channel::GetStatusFlags(User *user)
+{
+ UCListIter i = user->chans.find(this);
+ if (i != user->chans.end())
+ {
+ return i->second;
+ }
+ return 0;
+}
+
+int Channel::GetStatus(User *user)
+{
+ if (ServerInstance->ULine(user->server))
+ return STATUS_OP;
+
+ UCListIter i = user->chans.find(this);
+ if (i != user->chans.end())
+ {
+ if ((i->second & UCMODE_OP) > 0)
+ {
+ return STATUS_OP;
+ }
+ if ((i->second & UCMODE_HOP) > 0)
+ {
+ return STATUS_HOP;
+ }
+ if ((i->second & UCMODE_VOICE) > 0)
+ {
+ return STATUS_VOICE;
+ }
+ return STATUS_NORMAL;
+ }
+ return STATUS_NORMAL;
+}
+
+void Channel::SetPrefix(User* 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);
+ /* 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);
+ }
+ }
+ else
+ {
+ pfxcontainer one;
+ one.push_back(pfx);
+ prefixes.insert(std::make_pair<User*,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);
+ }
+ }