#include "helperfuncs.h"
#include "typedefs.h"
-extern InspIRCd* ServerInstance;
-
extern int MODCOUNT;
extern std::vector<Module*> modules;
extern std::vector<ircd_module*> factory;
extern time_t TIME;
-extern chan_hash chanlist;
-chanrec::chanrec()
+chanrec::chanrec(InspIRCd* Instance) : ServerInstance(Instance)
{
*name = *topic = *setby = *key = 0;
created = topicset = limit = 0;
* add a channel to a user, creating the record for it if needed and linking
* it to the user record
*/
-chanrec* chanrec::JoinUser(userrec *user, const char* cn, bool override, const char* key)
+chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bool override, const char* key)
{
if (!user || !cn)
return NULL;
if (user->fd > -1)
{
MOD_RESULT = 0;
- FOREACH_RESULT(I_OnUserPreJoin,OnUserPreJoin(user,NULL,cname));
+ FOREACH_RESULT_I(Instance,I_OnUserPreJoin,OnUserPreJoin(user,NULL,cname));
if (MOD_RESULT == 1)
return NULL;
}
/* create a new one */
- chanlist[cname] = new chanrec();
- strlcpy(chanlist[cname]->name, cname,CHANMAX);
- chanlist[cname]->modes[CM_TOPICLOCK] = chanlist[cname]->modes[CM_NOEXTERNAL] = 1;
- //chanlist[cname]->binarymodes = CM_TOPICLOCK | CM_NOEXTERNAL;
- chanlist[cname]->created = TIME;
- *chanlist[cname]->topic = 0;
- strlcpy(chanlist[cname]->setby, user->nick,NICKMAX-1);
- chanlist[cname]->topicset = 0;
- Ptr = chanlist[cname];
+ Ptr = new chanrec(Instance);
+ Instance->chanlist[cname] = Ptr;
+
+ strlcpy(Ptr->name, cname,CHANMAX);
+ Ptr->modes[CM_TOPICLOCK] = Ptr->modes[CM_NOEXTERNAL] = 1;
+ Ptr->created = TIME;
+ *Ptr->topic = 0;
+ strlcpy(Ptr->setby, user->nick,NICKMAX-1);
+ Ptr->topicset = 0;
log(DEBUG,"chanrec::JoinUser(): created: %s",cname);
/*
* set created to 2 to indicate user
if (IS_LOCAL(user)) /* was a check on fd > -1 */
{
MOD_RESULT = 0;
- FOREACH_RESULT(I_OnUserPreJoin,OnUserPreJoin(user,Ptr,cname));
+ FOREACH_RESULT_I(Instance,I_OnUserPreJoin,OnUserPreJoin(user,Ptr,cname));
if (MOD_RESULT == 1)
{
return NULL;
if (*Ptr->key)
{
MOD_RESULT = 0;
- FOREACH_RESULT(I_OnCheckKey,OnCheckKey(user, Ptr, key ? key : ""));
+ FOREACH_RESULT_I(Instance,I_OnCheckKey,OnCheckKey(user, Ptr, key ? key : ""));
if (!MOD_RESULT)
{
if (!key)
{
MOD_RESULT = 0;
irc::string xname(Ptr->name);
- FOREACH_RESULT(I_OnCheckInvite,OnCheckInvite(user, Ptr));
+ FOREACH_RESULT_I(Instance,I_OnCheckInvite,OnCheckInvite(user, Ptr));
if (!MOD_RESULT)
{
if (user->IsInvited(xname))
if (Ptr->limit)
{
MOD_RESULT = 0;
- FOREACH_RESULT(I_OnCheckLimit,OnCheckLimit(user, Ptr));
+ FOREACH_RESULT_I(Instance,I_OnCheckLimit,OnCheckLimit(user, Ptr));
if (!MOD_RESULT)
{
- if (usercount(Ptr) >= Ptr->limit)
+ if (Ptr->GetUserCounter() >= Ptr->limit)
{
user->WriteServ("471 %s %s :Cannot join channel (Channel is full)",user->nick, Ptr->name);
return NULL;
if (Ptr->bans.size())
{
MOD_RESULT = 0;
- FOREACH_RESULT(I_OnCheckBan,OnCheckBan(user, Ptr));
+ FOREACH_RESULT_I(Instance,I_OnCheckBan,OnCheckBan(user, Ptr));
char mask[MAXBUF];
sprintf(mask,"%s!%s@%s",user->nick, user->ident, user->GetIPString());
if (!MOD_RESULT)
{
if ((*index)->channel == NULL)
{
- return chanrec::ForceChan(Ptr, *index, user, created);
+ return chanrec::ForceChan(Instance, Ptr, *index, user, created);
}
}
if (!IS_LOCAL(user)) /* was a check on fd < 0 */
{
ucrec* a = new ucrec();
- chanrec* c = chanrec::ForceChan(Ptr,a,user,created);
+ chanrec* c = chanrec::ForceChan(Instance, Ptr,a,user,created);
user->chans.push_back(a);
return c;
}
if (user->chans.size() < OPERMAXCHANS)
{
ucrec* a = new ucrec();
- chanrec* c = chanrec::ForceChan(Ptr,a,user,created);
+ chanrec* c = chanrec::ForceChan(Instance, Ptr,a,user,created);
user->chans.push_back(a);
return c;
}
{
log(DEBUG,"BLAMMO, Whacking channel.");
/* Things went seriously pear shaped, so take this away. bwahaha. */
- chan_hash::iterator n = chanlist.find(cname);
- if (n != chanlist.end())
+ chan_hash::iterator n = Instance->chanlist.find(cname);
+ if (n != Instance->chanlist.end())
{
Ptr->DelUser(user);
DELETE(Ptr);
- chanlist.erase(n);
+ Instance->chanlist.erase(n);
for (unsigned int index =0; index < user->chans.size(); index++)
{
if (user->chans[index]->channel == Ptr)
return NULL;
}
-chanrec* chanrec::ForceChan(chanrec* Ptr,ucrec *a,userrec* user, int created)
+chanrec* chanrec::ForceChan(InspIRCd* Instance, chanrec* Ptr,ucrec *a,userrec* user, int created)
{
if (created == 2)
{
userlist(user,Ptr);
user->WriteServ("366 %s %s :End of /NAMES list.", user->nick, Ptr->name);
}
- FOREACH_MOD(I_OnUserJoin,OnUserJoin(user,Ptr));
+ FOREACH_MOD_I(Instance,I_OnUserJoin,OnUserJoin(user,Ptr));
return Ptr;
}
if (!this->DelUser(user)) /* if there are no users left on the channel... */
{
- chan_hash::iterator iter = chanlist.find(this->name);
+ chan_hash::iterator iter = ServerInstance->chanlist.find(this->name);
/* kill the record */
- if (iter != chanlist.end())
+ if (iter != ServerInstance->chanlist.end())
{
log(DEBUG,"del_channel: destroyed: %s", this->name);
FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(this));
- chanlist.erase(iter);
+ ServerInstance->chanlist.erase(iter);
}
return 0;
}
if (!this->DelUser(user))
{
- chan_hash::iterator iter = chanlist.find(this->name);
+ chan_hash::iterator iter = ServerInstance->chanlist.find(this->name);
/* kill the record */
- if (iter != chanlist.end())
+ if (iter != ServerInstance->chanlist.end())
{
FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(this));
- chanlist.erase(iter);
+ ServerInstance->chanlist.erase(iter);
}
return 0;
}
if (!this->DelUser(user))
/* if there are no users left on the channel */
{
- chan_hash::iterator iter = chanlist.find(this->name);
+ chan_hash::iterator iter = ServerInstance->chanlist.find(this->name);
/* kill the record */
- if (iter != chanlist.end())
+ if (iter != ServerInstance->chanlist.end())
{
FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(this));
- chanlist.erase(iter);
+ ServerInstance->chanlist.erase(iter);
}
return 0;
}