* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * Inspire is copyright (C) 2002-2005 ChatSpike-Dev.
+ * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
* E-mail:
* <brain@chatspike.net>
* <Craig@chatspike.net>
#include "inspircd_config.h"
#include "inspircd.h"
#include "inspircd_io.h"
-#include "inspircd_util.h"
#include <unistd.h>
#include <sys/errno.h>
#include <sys/ioctl.h>
chanrec::chanrec()
{
- strcpy(name,"");
- strcpy(custom_modes,"");
- strcpy(topic,"");
- strcpy(setby,"");
- strcpy(key,"");
- created = topicset = limit = 0;
- binarymodes = 0;
+ *name = *custom_modes = *topic = *setby = *key = 0;
+ created = topicset = limit = binarymodes = 0;
internal_userlist.clear();
}
std::string a = this->custom_modes;
int pos = a.find(mode);
a.erase(pos,1);
- strncpy(this->custom_modes,a.c_str(),MAXMODES);
+ strlcpy(this->custom_modes,a.c_str(),MAXMODES);
log(DEBUG,"Custom mode %c removed: modelist='%s'",mode,this->custom_modes);
this->SetCustomModeParam(mode,"",false);
void chanrec::AddUser(char* castuser)
{
- internal_userlist.push_back(castuser);
+ internal_userlist[castuser] = castuser;
log(DEBUG,"Added casted user to channel's internal list");
}
void chanrec::DelUser(char* castuser)
{
- for (std::vector<char*>::iterator a = internal_userlist.begin(); a < internal_userlist.end(); a++)
+ std::map<char*,char*>::iterator a = internal_userlist.find(castuser);
+ if (a != internal_userlist.end())
{
- if (*a == castuser)
- {
- log(DEBUG,"Removed casted user from channel's internal list");
- internal_userlist.erase(a);
- return;
- }
+ log(DEBUG,"Removed casted user from channel's internal list");
+ internal_userlist.erase(a);
+ return;
}
log(DEBUG,"BUG BUG BUG! Attempt to remove an uncasted user from the internal list of %s!",name);
}
-std::vector<char*> *chanrec::GetUsers()
+std::map<char*,char*> *chanrec::GetUsers()
{
return &internal_userlist;
}
int created = 0;
char cname[MAXBUF];
int MOD_RESULT = 0;
- strncpy(cname,cn,CHANMAX);
+ strlcpy(cname,cn,CHANMAX);
+ log(DEBUG,"cname='%s' cn='%s'",cname,cn);
log(DEBUG,"add_channel: %s %s",user->nick,cname);
if (user->fd > -1)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnUserPreJoin(user,NULL,cname));
+ FOREACH_RESULT(I_OnUserPreJoin,OnUserPreJoin(user,NULL,cname));
if (MOD_RESULT == 1)
return NULL;
}
strlcpy(chanlist[cname]->name, cname,CHANMAX);
chanlist[cname]->binarymodes = CM_TOPICLOCK | CM_NOEXTERNAL;
chanlist[cname]->created = TIME;
- strcpy(chanlist[cname]->topic, "");
- strncpy(chanlist[cname]->setby, user->nick,NICKMAX);
+ *chanlist[cname]->topic = 0;
+ strlcpy(chanlist[cname]->setby, user->nick,NICKMAX);
chanlist[cname]->topicset = 0;
Ptr = chanlist[cname];
log(DEBUG,"add_channel: created: %s",cname);
if (user->fd > -1)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnUserPreJoin(user,Ptr,cname));
+ FOREACH_RESULT(I_OnUserPreJoin,OnUserPreJoin(user,Ptr,cname));
if (MOD_RESULT == 1)
{
return NULL;
}
- else
+ else if (MOD_RESULT == 0)
{
if (*Ptr->key)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnCheckKey(user, Ptr, key ? key : ""));
+ FOREACH_RESULT(I_OnCheckKey,OnCheckKey(user, Ptr, key ? key : ""));
if (!MOD_RESULT)
{
if (!key)
{
MOD_RESULT = 0;
irc::string xname(Ptr->name);
- FOREACH_RESULT(OnCheckInvite(user, Ptr));
+ FOREACH_RESULT(I_OnCheckInvite,OnCheckInvite(user, Ptr));
if (!MOD_RESULT)
{
log(DEBUG,"add_channel: channel is +i");
if (Ptr->limit)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnCheckLimit(user, Ptr));
+ FOREACH_RESULT(I_OnCheckLimit,OnCheckLimit(user, Ptr));
if (!MOD_RESULT)
{
if (usercount(Ptr) >= Ptr->limit)
{
log(DEBUG,"add_channel: about to walk banlist");
MOD_RESULT = 0;
- FOREACH_RESULT(OnCheckBan(user, Ptr));
+ FOREACH_RESULT(I_OnCheckBan,OnCheckBan(user, Ptr));
if (!MOD_RESULT)
{
for (BanList::iterator i = Ptr->bans.begin(); i != Ptr->bans.end(); i++)
}
userlist(user,Ptr);
WriteServ(user->fd,"366 %s %s :End of /NAMES list.", user->nick, Ptr->name);
- FOREACH_MOD OnUserJoin(user,Ptr);
+ FOREACH_MOD(I_OnUserJoin,OnUserJoin(user,Ptr));
return Ptr;
}
if (!Ptr)
return NULL;
- FOREACH_MOD OnUserPart(user,Ptr);
log(DEBUG,"del_channel: removing: %s %s",user->nick,Ptr->name);
for (unsigned int i =0; i < user->chans.size(); i++)
{
if (reason)
{
+ FOREACH_MOD(I_OnUserPart,OnUserPart(user,Ptr,reason));
WriteChannel(Ptr,user,"PART %s :%s",Ptr->name, reason);
}
else
{
+ FOREACH_MOD(I_OnUserPart,OnUserPart(user,Ptr,""));
WriteChannel(Ptr,user,"PART :%s",Ptr->name);
}
user->chans[i].uc_modes = 0;
if (iter != chanlist.end())
{
log(DEBUG,"del_channel: destroyed: %s",Ptr->name);
+ FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(Ptr));
delete Ptr;
chanlist.erase(iter);
}
return NULL;
}
+void server_kick_channel(userrec* user, chanrec* Ptr, char* reason, bool triggerevents)
+{
+ if ((!user) || (!Ptr) || (!reason))
+ {
+ return;
+ }
+
+ if (!has_channel(user,Ptr))
+ {
+ /* Not on channel */
+ return;
+ }
+
+ if (triggerevents)
+ {
+ FOREACH_MOD(I_OnUserKick,OnUserKick(NULL,user,Ptr,reason));
+ }
+
+ for (unsigned int i =0; i < user->chans.size(); i++)
+ {
+ if (user->chans[i].channel)
+ if (!strcasecmp(user->chans[i].channel->name,Ptr->name))
+ {
+ WriteChannelWithServ(Ptr,"KICK %s %s :%s",Ptr->name, user->nick, reason);
+ user->chans[i].uc_modes = 0;
+ user->chans[i].channel = NULL;
+ break;
+ }
+ }
+
+ Ptr->DelUser((char*)user);
+
+ if (!usercount(Ptr))
+ {
+ chan_hash::iterator iter = chanlist.find(Ptr->name);
+ log(DEBUG,"del_channel: destroying channel: %s",Ptr->name);
+ /* kill the record */
+ if (iter != chanlist.end())
+ {
+ log(DEBUG,"del_channel: destroyed: %s",Ptr->name);
+ FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(Ptr));
+ delete Ptr;
+ chanlist.erase(iter);
+ }
+ }
+}
void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
{
return;
}
- if ((!Ptr) || (!user) || (!src))
- {
- return;
- }
-
log(DEBUG,"kick_channel: removing: %s %s %s",user->nick,Ptr->name,src->nick);
if (!has_channel(user,Ptr))
}
int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(src,user,Ptr,AC_KICK));
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(src,user,Ptr,AC_KICK));
if ((MOD_RESULT == ACR_DENY) && (!is_uline(src->server)))
return;
if (!is_uline(src->server))
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnUserPreKick(src,user,Ptr,reason));
+ FOREACH_RESULT(I_OnUserPreKick,OnUserPreKick(src,user,Ptr,reason));
if (MOD_RESULT)
return;
}
- FOREACH_MOD OnUserKick(src,user,Ptr,reason);
+ FOREACH_MOD(I_OnUserKick,OnUserKick(src,user,Ptr,reason));
for (unsigned int i =0; i < user->chans.size(); i++)
{
if (iter != chanlist.end())
{
log(DEBUG,"del_channel: destroyed: %s",Ptr->name);
+ FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(Ptr));
delete Ptr;
chanlist.erase(iter);
}