using namespace std;
-chanrec* ForceChan(chanrec* Ptr,ucrec &a,userrec* user, int created);
+chanrec* ForceChan(chanrec* Ptr,ucrec *a,userrec* user, int created);
chanrec::chanrec()
{
*name = *topic = *setby = *key = 0;
- created = topicset = limit = binarymodes = 0;
+ created = topicset = limit = 0;
internal_userlist.clear();
- memset(&custom_modes,0,64);
+ memset(&modes,0,64);
}
void chanrec::SetCustomMode(char mode,bool mode_on)
{
- custom_modes[mode-65] = mode_on;
+ modes[mode-65] = mode_on;
if (!mode_on)
this->SetCustomModeParam(mode,"",false);
}
}
}
-bool chanrec::IsCustomModeSet(char mode)
+bool chanrec::IsModeSet(char mode)
{
- return custom_modes[mode-65];
+ return modes[mode-65];
}
std::string chanrec::GetModeParameter(char mode)
{
- std::map<char,char*>::iterator n = custom_mode_params.find(mode);
- if (n != custom_mode_params.end())
+ if (mode == 'k')
{
- return n->second;
+ return this->key;
+ }
+ else if (mode == 'l')
+ {
+ return ConvToStr(this->limit);
+ }
+ else
+ {
+ std::map<char,char*>::iterator n = custom_mode_params.find(mode);
+ if (n != custom_mode_params.end())
+ {
+ return n->second;
+ }
+ return "";
}
- return "";
}
long chanrec::GetUserCounter()
return (this->internal_userlist.size());
}
-void chanrec::AddUser(userrec* castuser)
+void chanrec::AddUser(userrec* user)
{
- internal_userlist[castuser] = castuser;
- log(DEBUG,"Added casted user to channel's internal list");
+ internal_userlist[user] = user;
}
-void chanrec::DelUser(userrec* castuser)
+unsigned long chanrec::DelUser(userrec* user)
{
- CUList::iterator a = internal_userlist.find(castuser);
+ CUList::iterator a = internal_userlist.find(user);
if (a != internal_userlist.end())
{
- log(DEBUG,"Removed casted user from channel's internal list");
internal_userlist.erase(a);
/* And tidy any others... */
- DelOppedUser(castuser);
- DelHalfoppedUser(castuser);
- DelVoicedUser(castuser);
- return;
+ DelOppedUser(user);
+ DelHalfoppedUser(user);
+ DelVoicedUser(user);
+ return internal_userlist.size();
}
+ return internal_userlist.size();
+}
+
+bool chanrec::HasUser(userrec* user)
+{
+ return (internal_userlist.find(user) != internal_userlist.end());
}
-void chanrec::AddOppedUser(userrec* castuser)
+void chanrec::AddOppedUser(userrec* user)
{
- internal_op_userlist[castuser] = castuser;
- log(DEBUG,"Added casted user to channel's internal list");
+ internal_op_userlist[user] = user;
}
-void chanrec::DelOppedUser(userrec* castuser)
+void chanrec::DelOppedUser(userrec* user)
{
- CUList::iterator a = internal_op_userlist.find(castuser);
+ CUList::iterator a = internal_op_userlist.find(user);
if (a != internal_op_userlist.end())
{
- log(DEBUG,"Removed casted user from channel's internal list");
internal_op_userlist.erase(a);
return;
}
}
-void chanrec::AddHalfoppedUser(userrec* castuser)
+void chanrec::AddHalfoppedUser(userrec* user)
{
- internal_halfop_userlist[castuser] = castuser;
- log(DEBUG,"Added casted user to channel's internal list");
+ internal_halfop_userlist[user] = user;
}
-void chanrec::DelHalfoppedUser(userrec* castuser)
+void chanrec::DelHalfoppedUser(userrec* user)
{
- CUList::iterator a = internal_halfop_userlist.find(castuser);
+ CUList::iterator a = internal_halfop_userlist.find(user);
if (a != internal_halfop_userlist.end())
{
- log(DEBUG,"Removed casted user from channel's internal list");
internal_halfop_userlist.erase(a);
return;
}
}
-void chanrec::AddVoicedUser(userrec* castuser)
+void chanrec::AddVoicedUser(userrec* user)
{
- internal_voice_userlist[castuser] = castuser;
- log(DEBUG,"Added casted user to channel's internal list");
+ internal_voice_userlist[user] = user;
}
-void chanrec::DelVoicedUser(userrec* castuser)
+void chanrec::DelVoicedUser(userrec* user)
{
- CUList::iterator a = internal_voice_userlist.find(castuser);
+ CUList::iterator a = internal_voice_userlist.find(user);
if (a != internal_voice_userlist.end())
{
- log(DEBUG,"Removed casted user from channel's internal list");
internal_voice_userlist.erase(a);
return;
}
}
-CUList *chanrec::GetUsers()
+CUList* chanrec::GetUsers()
{
return &internal_userlist;
}
-CUList *chanrec::GetOppedUsers()
+CUList* chanrec::GetOppedUsers()
{
return &internal_op_userlist;
}
-CUList *chanrec::GetHalfoppedUsers()
+CUList* chanrec::GetHalfoppedUsers()
{
return &internal_halfop_userlist;
}
-CUList *chanrec::GetVoicedUsers()
+CUList* chanrec::GetVoicedUsers()
{
return &internal_voice_userlist;
}
/* create a new one */
chanlist[cname] = new chanrec();
strlcpy(chanlist[cname]->name, cname,CHANMAX);
- chanlist[cname]->binarymodes = CM_TOPICLOCK | CM_NOEXTERNAL;
+ 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);
else
{
/* Already on the channel */
- if (has_channel(user,Ptr))
+ if (Ptr->HasUser(user))
return NULL;
/*
}
}
}
- if (Ptr->binarymodes & CM_INVITEONLY)
+ if (Ptr->modes[CM_INVITEONLY])
{
MOD_RESULT = 0;
irc::string xname(Ptr->name);
log(DEBUG,"Passed channel checks");
- for (unsigned int index =0; index < user->chans.size(); index++)
+ for (std::vector<ucrec*>::const_iterator index = user->chans.begin(); index != user->chans.end(); index++)
{
- if (user->chans[index].channel == NULL)
+ if ((ucrec*)(*index)->channel == NULL)
{
- return ForceChan(Ptr,user->chans[index],user,created);
+ return ForceChan(Ptr,(ucrec*)(*index),user,created);
}
}
*/
if (!IS_LOCAL(user)) /* was a check on fd < 0 */
{
- ucrec a;
+ ucrec* a = new ucrec();
chanrec* c = ForceChan(Ptr,a,user,created);
user->chans.push_back(a);
return c;
/* Oper allows extension up to the OPERMAXCHANS value */
if (user->chans.size() < OPERMAXCHANS)
{
- ucrec a;
+ ucrec* a = new ucrec();
chanrec* c = ForceChan(Ptr,a,user,created);
user->chans.push_back(a);
return c;
chanlist.erase(n);
for (unsigned int index =0; index < user->chans.size(); index++)
{
- if (user->chans[index].channel == Ptr)
+ if (user->chans[index]->channel == Ptr)
{
- user->chans[index].channel = NULL;
- user->chans[index].uc_modes = 0;
+ user->chans[index]->channel = NULL;
+ user->chans[index]->uc_modes = 0;
}
}
}
return NULL;
}
-chanrec* ForceChan(chanrec* Ptr,ucrec &a,userrec* user, int created)
+chanrec* ForceChan(chanrec* Ptr,ucrec *a,userrec* user, int created)
{
if (created == 2)
{
/* first user in is given ops */
- a.uc_modes = UCMODE_OP;
+ a->uc_modes = UCMODE_OP;
Ptr->AddOppedUser(user);
}
else
{
- a.uc_modes = 0;
+ a->uc_modes = 0;
}
- a.channel = Ptr;
+ a->channel = Ptr;
Ptr->AddUser(user);
WriteChannel(Ptr,user,"JOIN :%s",Ptr->name);
- log(DEBUG,"Sent JOIN to client");
- if (Ptr->topicset)
+ /* Major improvement by Brain - we dont need to be calculating all this pointlessly for remote users */
+ if (IS_LOCAL(user))
{
- WriteServ(user->fd,"332 %s %s :%s", user->nick, Ptr->name, Ptr->topic);
- WriteServ(user->fd,"333 %s %s %s %lu", user->nick, Ptr->name, Ptr->setby, (unsigned long)Ptr->topicset);
+ log(DEBUG,"Sent JOIN to client");
+ if (Ptr->topicset)
+ {
+ WriteServ(user->fd,"332 %s %s :%s", user->nick, Ptr->name, Ptr->topic);
+ WriteServ(user->fd,"333 %s %s %s %lu", user->nick, Ptr->name, Ptr->setby, (unsigned long)Ptr->topicset);
+ }
+ userlist(user,Ptr);
+ WriteServ(user->fd,"366 %s %s :End of /NAMES list.", user->nick, Ptr->name);
}
-
- userlist(user,Ptr);
- WriteServ(user->fd,"366 %s %s :End of /NAMES list.", user->nick, Ptr->name);
FOREACH_MOD(I_OnUserJoin,OnUserJoin(user,Ptr));
return Ptr;
}
for (unsigned int i =0; i < user->chans.size(); i++)
{
/* zap it from the channel list of the user */
- if (user->chans[i].channel == Ptr)
+ if (user->chans[i]->channel == Ptr)
{
if (reason)
{
FOREACH_MOD(I_OnUserPart,OnUserPart(user,Ptr,""));
WriteChannel(Ptr,user,"PART :%s",Ptr->name);
}
- user->chans[i].uc_modes = 0;
- user->chans[i].channel = NULL;
+ user->chans[i]->uc_modes = 0;
+ user->chans[i]->channel = NULL;
log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
break;
}
if (IS_LOCAL(user))
{
- if (!has_channel(user,Ptr))
+ if (!Ptr->HasUser(user))
{
/* Not on channel */
return;
for (unsigned int i =0; i < user->chans.size(); i++)
{
- if (user->chans[i].channel)
- if (!strcasecmp(user->chans[i].channel->name,Ptr->name))
+ if ((user->chans[i]->channel) && (user->chans[i]->channel == Ptr))
{
WriteChannelWithServ(Config->ServerName,Ptr,"KICK %s %s :%s",Ptr->name, user->nick, reason);
- user->chans[i].uc_modes = 0;
- user->chans[i].channel = NULL;
+ user->chans[i]->uc_modes = 0;
+ user->chans[i]->channel = NULL;
break;
}
}
if (IS_LOCAL(src))
{
- if (!has_channel(user,Ptr))
+ if (!Ptr->HasUser(user))
{
WriteServ(src->fd,"441 %s %s %s :They are not on that channel",src->nick, user->nick, Ptr->name);
return;
}
FOREACH_MOD(I_OnUserKick,OnUserKick(src,user,Ptr,reason));
-
- for (unsigned int i =0; i < user->chans.size(); i++)
+
+ for (std::vector<ucrec*>::const_iterator i = user->chans.begin(); i != user->chans.end(); i++)
{
/* zap it from the channel list of the user */
- if (user->chans[i].channel)
+ if ((((ucrec*)(*i))->channel) && (((ucrec*)(*i))->channel == Ptr))
{
- if (!strcasecmp(user->chans[i].channel->name,Ptr->name))
- {
- WriteChannel(Ptr,src,"KICK %s %s :%s",Ptr->name, user->nick, reason);
- user->chans[i].uc_modes = 0;
- user->chans[i].channel = NULL;
- log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
- break;
- }
+ WriteChannel(Ptr,src,"KICK %s %s :%s",Ptr->name, user->nick, reason);
+ ((ucrec*)(*i))->uc_modes = 0;
+ ((ucrec*)(*i))->channel = NULL;
+ log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
+ break;
}
}
- Ptr->DelUser(user);
-
+ if (!Ptr->DelUser(user))
/* if there are no users left on the channel */
- if (!usercount(Ptr))
{
chan_hash::iterator iter = chanlist.find(Ptr->name);