/* $Core: libIRCDchannels */
#include "inspircd.h"
-#include <stdarg.h>
+#include <cstdarg>
#include "wildcard.h"
#include "mode.h"
throw CoreException("Cannot create duplicate channel " + cname);
(*(ServerInstance->chanlist))[cname.c_str()] = this;
- this->name.assign(cname, 0, CHANMAX);
+ this->name.assign(cname, 0, ServerInstance->Config->Limits.ChanMax);
this->created = ts ? ts : ServerInstance->Time();
this->age = this->created;
void Channel::SetModeParam(char mode,const char* parameter,bool mode_on)
{
- CustomModeList::iterator n = custom_mode_params.find(mode);
+ CustomModeList::iterator n = custom_mode_params.find(mode);
if (mode_on)
{
unsigned long Channel::DelUser(User* user)
{
CUListIter a = internal_userlist.find(user);
-
+
if (a != internal_userlist.end())
{
internal_userlist.erase(a);
DelHalfoppedUser(user);
DelVoicedUser(user);
}
-
+
return internal_userlist.size();
}
CUListIter a = internal_halfop_userlist.find(user);
if (a != internal_halfop_userlist.end())
- {
+ {
internal_halfop_userlist.erase(a);
}
}
void Channel::DelVoicedUser(User* user)
{
CUListIter a = internal_voice_userlist.find(user);
-
+
if (a != internal_voice_userlist.end())
{
internal_voice_userlist.erase(a);
}
}
-/*
+/*
* add a channel to a user, creating the record for it if needed and linking
- * it to the user record
+ * it to the user record
*/
Channel* Channel::JoinUser(InspIRCd* Instance, User *user, const char* cn, bool override, const char* key, bool bursting, time_t TS)
{
}
}
- strlcpy(cname, cn, CHANMAX);
+ strlcpy(cname, cn, Instance->Config->Limits.ChanMax);
Ptr = Instance->FindChan(cname);
if (!Ptr)
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)))
bool Channel::IsExtBanned(User *user, char type)
{
- // XXX. do we need events?
char mask[MAXBUF];
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnCheckExtBan,OnCheckExtBan(user, this, type));
- snprintf(mask, MAXBUF, "%s!%s@%s", user->nick.c_str(), user->ident.c_str(), user->GetIPString());
-
- for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
+ if (MOD_RESULT == -1)
+ return true;
+ else if (MOD_RESULT == 0)
{
- if (i->data[0] != type || i->data[1] != ':')
- continue;
-
- // Iterate past char and : to get to the mask without doing a data copy(!)
- std::string maskptr = i->data.substr(2);
+ snprintf(mask, MAXBUF, "%s!%s@%s", user->nick.c_str(), user->ident.c_str(), user->GetIPString());
- /* This allows CIDR ban matching
- *
- * Full masked host Full unmasked host IP with/without CIDR
- */
- if ((match(user->GetFullHost(), maskptr)) || (match(user->GetFullRealHost(), maskptr)) || (match(mask, maskptr, true)))
+ for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
{
- return true;
+ if (i->data[0] != type || i->data[1] != ':')
+ continue;
+
+ // Iterate past char and : to get to the mask without doing a data copy(!)
+ std::string maskptr = i->data.substr(2);
+
+ /* This allows CIDR ban matching
+ *
+ * Full masked host Full unmasked host IP with/without CIDR
+ */
+ if ((match(user->GetFullHost(), maskptr)) || (match(user->GetFullRealHost(), maskptr)) || (match(mask, maskptr, true)))
+ {
+ return true;
+ }
}
}
/* Channel::PartUser
* remove a channel from a users record, and return the number of users left.
* Therefore, if this function returns 0 the caller should delete the Channel.
+ *
+ * XXX: bleh, string copy of reason, fixme! -- w00t
*/
-long Channel::PartUser(User *user, const char* reason)
+long Channel::PartUser(User *user, std::string &reason)
{
bool silent = false;
UCListIter i = user->chans.find(this);
if (i != user->chans.end())
{
- FOREACH_MOD(I_OnUserPart,OnUserPart(user, this, reason ? reason : "", silent));
+ FOREACH_MOD(I_OnUserPart,OnUserPart(user, this, reason, silent));
if (!silent)
- this->WriteChannel(user, "PART %s%s%s", this->name.c_str(), reason ? " :" : "", reason ? reason : "");
+ this->WriteChannel(user, "PART %s%s%s", this->name.c_str(), reason.empty() ? "" : ":", reason.c_str());
user->chans.erase(i);
this->RemoveAllPrefixes(user);
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(src,user,this,AC_KICK));
if ((MOD_RESULT == ACR_DENY) && (!ServerInstance->ULine(src->server)))
return this->GetUserCounter();
-
+
if ((MOD_RESULT == ACR_DEFAULT) || (!ServerInstance->ULine(src->server)))
{
int them = this->GetStatus(src);
if (call_modules)
{
FOREACH_MOD(I_OnNamesListItem, OnNamesListItem(user, i->first, this, prefixlist, nick));
-
+
/* Nick was nuked, a module wants us to skip it */
if (nick.empty())
continue;
}
-
+
size_t ptrlen = 0;
- if (curlen > (480-NICKMAX))
+ if (curlen + prefixlist.length() + nick.length() + 1 > 480)
{
/* list overflowed into multiple numerics */
user->WriteServ(std::string(list));
const char* Channel::GetPrefixChar(User *user)
{
static char pf[2] = {0, 0};
-
+
prefixlist::iterator n = prefixes.find(user);
if (n != prefixes.end())
{