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)
{
Ptr->modes[CM_TOPICLOCK] = Ptr->modes[CM_NOEXTERNAL] = 1;
Ptr->created = Instance->Time();
*Ptr->topic = 0;
- strlcpy(Ptr->setby, user->nick,NICKMAX-1);
+ *Ptr->setby = 0;
Ptr->topicset = 0;
Instance->Log(DEBUG,"chanrec::JoinUser(): created: %s",cname);
/*
FOREACH_RESULT_I(Instance,I_OnCheckKey,OnCheckKey(user, Ptr, key ? key : ""));
if (!MOD_RESULT)
{
- if (!key)
+ if ((!key) || strcmp(key,Ptr->key))
{
- Instance->Log(DEBUG,"chanrec::JoinUser(): no key given in JOIN");
- user->WriteServ("475 %s %s :Cannot join channel (Requires key)",user->nick, Ptr->name);
+ user->WriteServ("475 %s %s :Cannot join channel (Incorrect channel key)",user->nick, Ptr->name);
return NULL;
}
- else
- {
- if (strcmp(key,Ptr->key))
- {
- Instance->Log(DEBUG,"chanrec::JoinUser(): bad key given in JOIN");
- user->WriteServ("475 %s %s :Cannot join channel (Incorrect key)",user->nick, Ptr->name);
- return NULL;
- }
- }
}
}
if (Ptr->modes[CM_INVITEONLY])
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 */
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;
}
/* write formatted text from a source user to all users on a channel except
* for the sender (for privmsg etc) */
-void chanrec::WriteAllExceptSender(userrec* user, char status, char* text, ...)
+void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status, char* text, ...)
{
char textbuffer[MAXBUF];
va_list argsPtr;
- if (!user || !text)
+ if (!text)
return;
va_start(argsPtr, text);
vsnprintf(textbuffer, MAXBUF, text, argsPtr);
va_end(argsPtr);
- this->WriteAllExceptSender(user, status, std::string(textbuffer));
+ this->WriteAllExceptSender(user, serversource, status, std::string(textbuffer));
}
-void chanrec::WriteAllExceptSender(userrec* user, char status, const std::string& text)
+void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status, const std::string& text)
{
CUList *ulist;
- if (!user)
- return;
-
switch (status)
{
case '@':
for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
{
if ((IS_LOCAL(i->second)) && (user != i->second))
- i->second->WriteFrom(user,text);
+ {
+ if (serversource)
+ i->second->WriteServ(text);
+ else
+ i->second->WriteFrom(user,text);
+ }
}
}
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);
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