using namespace std;
-#include <string>
-#include <map>
-#include <sstream>
-#include <vector>
-#include <deque>
#include <stdarg.h>
#include "configreader.h"
#include "inspircd.h"
-#include "hash_map.h"
#include "users.h"
-#include "ctables.h"
-#include "globals.h"
#include "modules.h"
-#include "dynamic.h"
-#include "commands.h"
#include "wildcard.h"
#include "mode.h"
-#include "xline.h"
-#include "inspstring.h"
-
-#include "typedefs.h"
chanrec::chanrec(InspIRCd* Instance) : ServerInstance(Instance)
{
sprintf(mask,"%s!%s@%s",user->nick, user->ident, user->GetIPString());
if (!MOD_RESULT)
{
- for (BanList::iterator i = Ptr->bans.begin(); i != Ptr->bans.end(); i++)
+ if (Ptr->IsBanned(user))
{
- /* This allows CIDR ban matching
- *
- * Full masked host Full unmasked host IP with/without CIDR
- */
- if ((match(user->GetFullHost(),i->data)) || (match(user->GetFullRealHost(),i->data)) || (match(mask, i->data, true)))
- {
- user->WriteServ("474 %s %s :Cannot join channel (You're banned)",user->nick, Ptr->name);
- return NULL;
- }
+ user->WriteServ("474 %s %s :Cannot join channel (You're banned)",user->nick, Ptr->name);
+ return NULL;
}
}
}
a->channel = Ptr;
Ptr->AddUser(user);
+ user->ModChannelCount(1);
Ptr->WriteChannel(user,"JOIN :%s",Ptr->name);
/* Major improvement by Brain - we dont need to be calculating all this pointlessly for remote users */
user->WriteServ("333 %s %s %s %lu", user->nick, Ptr->name, Ptr->setby, (unsigned long)Ptr->topicset);
}
Ptr->UserList(user);
- user->WriteServ("366 %s %s :End of /NAMES list.", user->nick, Ptr->name);
}
FOREACH_MOD_I(Instance,I_OnUserJoin,OnUserJoin(user,Ptr));
return Ptr;
}
+bool chanrec::IsBanned(userrec* user)
+{
+ char mask[MAXBUF];
+ sprintf(mask,"%s!%s@%s",user->nick, user->ident, user->GetIPString());
+ for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
+ {
+ /* This allows CIDR ban matching
+ *
+ * Full masked host Full unmasked host IP with/without CIDR
+ */
+ if ((match(user->GetFullHost(),i->data)) || (match(user->GetFullRealHost(),i->data)) || (match(mask, i->data, true)))
+ {
+ return true;
+ }
+
+ }
+ return false;
+}
+
/* chanrec::PartUser
* remove a channel from a users record, and remove the record from the hash
* if the channel has become empty
}
user->chans[i]->uc_modes = 0;
user->chans[i]->channel = NULL;
+ user->ModChannelCount(-1);
this->RemoveAllPrefixes(user);
break;
}
{
char list[MAXBUF];
size_t dlen, curlen;
+ int MOD_RESULT = 0;
+
+ FOREACH_RESULT(I_OnUserList,OnUserList(user, this));
+ ServerInstance->Log(DEBUG,"MOD_RESULT for UserList = %d",MOD_RESULT);
+ if (MOD_RESULT == 1)
+ return;
+
+ ServerInstance->Log(DEBUG,"Using builtin NAMES list generation");
dlen = curlen = snprintf(list,MAXBUF,"353 %s = %s :", user->nick, this->name);
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;
if (curlen > (480-NICKMAX))
{
/* list overflowed into multiple numerics */
- user->WriteServ(list);
+ user->WriteServ(std::string(list));
/* reset our lengths */
dlen = curlen = snprintf(list,MAXBUF,"353 %s = %s :", user->nick, this->name);
/* if whats left in the list isnt empty, send it */
if (numusers)
{
- user->WriteServ(list);
+ user->WriteServ(std::string(list));
}
+
+ user->WriteServ("366 %s %s :End of /NAMES list.", user->nick, this->name);
}
long chanrec::GetMaxBans()
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;
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);
+ std::sort(n->second.begin(), n->second.end(), ModeParser::PrefixComparison);
}
}
else