diff options
Diffstat (limited to 'src/modes')
-rw-r--r-- | src/modes/Makefile | 66 | ||||
-rw-r--r-- | src/modes/cmode_b.cpp | 186 | ||||
-rw-r--r-- | src/modes/cmode_h.cpp | 163 | ||||
-rw-r--r-- | src/modes/cmode_i.cpp | 36 | ||||
-rw-r--r-- | src/modes/cmode_k.cpp | 104 | ||||
-rw-r--r-- | src/modes/cmode_l.cpp | 98 | ||||
-rw-r--r-- | src/modes/cmode_m.cpp | 37 | ||||
-rw-r--r-- | src/modes/cmode_n.cpp | 37 | ||||
-rw-r--r-- | src/modes/cmode_o.cpp | 154 | ||||
-rw-r--r-- | src/modes/cmode_p.cpp | 36 | ||||
-rw-r--r-- | src/modes/cmode_s.cpp | 36 | ||||
-rw-r--r-- | src/modes/cmode_t.cpp | 37 | ||||
-rw-r--r-- | src/modes/cmode_v.cpp | 153 | ||||
-rw-r--r-- | src/modes/umode_i.cpp | 46 | ||||
-rw-r--r-- | src/modes/umode_n.cpp | 59 | ||||
-rw-r--r-- | src/modes/umode_o.cpp | 50 | ||||
-rw-r--r-- | src/modes/umode_s.cpp | 46 | ||||
-rw-r--r-- | src/modes/umode_w.cpp | 47 |
18 files changed, 1373 insertions, 18 deletions
diff --git a/src/modes/Makefile b/src/modes/Makefile index 1b7743649..8839168b7 100644 --- a/src/modes/Makefile +++ b/src/modes/Makefile @@ -1 +1,65 @@ -CC = i am cornholio
CXXFLAGS = -I../../include ${FLAGS}
all: umode_w.o umode_s.o umode_o.o umode_n.o umode_i.o cmode_v.o cmode_t.o cmode_s.o cmode_p.o cmode_o.o cmode_n.o cmode_m.o cmode_l.o cmode_k.o cmode_i.o cmode_h.o cmode_b.o modeclasses.a
umode_w.o: umode_w.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_w.cpp
umode_s.o: umode_s.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_s.cpp
umode_o.o: umode_o.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_o.cpp
umode_n.o: umode_n.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_n.cpp
umode_i.o: umode_i.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_i.cpp
cmode_v.o: cmode_v.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_v.cpp
cmode_t.o: cmode_t.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_t.cpp
cmode_s.o: cmode_s.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_s.cpp
cmode_p.o: cmode_p.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_p.cpp
cmode_o.o: cmode_o.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_o.cpp
cmode_n.o: cmode_n.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_n.cpp
cmode_m.o: cmode_m.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_m.cpp
cmode_l.o: cmode_l.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_l.cpp
cmode_k.o: cmode_k.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_k.cpp
cmode_i.o: cmode_i.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_i.cpp
cmode_h.o: cmode_h.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_h.cpp
cmode_b.o: cmode_b.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h
$(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_b.cpp
modeclasses.a: umode_w.o umode_s.o umode_o.o umode_n.o umode_i.o cmode_v.o cmode_t.o cmode_s.o cmode_p.o cmode_o.o cmode_n.o cmode_m.o cmode_l.o cmode_k.o cmode_i.o cmode_h.o cmode_b.o
@-rm -rf modeclasses.a
ar r modeclasses.a *.o
ranlib modeclasses.a
clean:
@-rm *.o
@-rm modeclasses.a
\ No newline at end of file +CC = i am cornholio +CXXFLAGS = -I../../include ${FLAGS} + +all: umode_w.o umode_s.o umode_o.o umode_n.o umode_i.o cmode_v.o cmode_t.o cmode_s.o cmode_p.o cmode_o.o cmode_n.o cmode_m.o cmode_l.o cmode_k.o cmode_i.o cmode_h.o cmode_b.o modeclasses.a + +umode_w.o: umode_w.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_w.cpp + +umode_s.o: umode_s.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_s.cpp + +umode_o.o: umode_o.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_o.cpp + +umode_n.o: umode_n.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_n.cpp + +umode_i.o: umode_i.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c umode_i.cpp + +cmode_v.o: cmode_v.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_v.cpp + +cmode_t.o: cmode_t.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_t.cpp + +cmode_s.o: cmode_s.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_s.cpp + +cmode_p.o: cmode_p.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_p.cpp + +cmode_o.o: cmode_o.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_o.cpp + +cmode_n.o: cmode_n.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_n.cpp + +cmode_m.o: cmode_m.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_m.cpp + +cmode_l.o: cmode_l.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_l.cpp + +cmode_k.o: cmode_k.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_k.cpp + +cmode_i.o: cmode_i.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_i.cpp + +cmode_h.o: cmode_h.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_h.cpp + +cmode_b.o: cmode_b.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/mode.h + $(CC) -pipe -I../../include $(FLAGS) -export-dynamic -c cmode_b.cpp + +modeclasses.a: umode_w.o umode_s.o umode_o.o umode_n.o umode_i.o cmode_v.o cmode_t.o cmode_s.o cmode_p.o cmode_o.o cmode_n.o cmode_m.o cmode_l.o cmode_k.o cmode_i.o cmode_h.o cmode_b.o + @-rm -rf modeclasses.a + ar r modeclasses.a *.o + ranlib modeclasses.a + +clean: + @-rm *.o + @-rm modeclasses.a + diff --git a/src/modes/cmode_b.cpp b/src/modes/cmode_b.cpp index dbc2e925d..e306f31f6 100644 --- a/src/modes/cmode_b.cpp +++ b/src/modes/cmode_b.cpp @@ -1 +1,185 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include <string>
#include <vector>
#include "inspircd_config.h"
#include "configreader.h"
#include "hash_map.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modules.h"
#include "inspstring.h"
#include "hashcomp.h"
#include "modes/cmode_b.h"
ModeChannelBan::ModeChannelBan(InspIRCd* Instance) : ModeHandler(Instance, 'b', 1, 1, true, MODETYPE_CHANNEL, false)
{
}
ModeAction ModeChannelBan::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
int status = channel->GetStatus(source);
/* Call the correct method depending on wether we're adding or removing the mode */
if (adding)
{
parameter = this->AddBan(source, parameter, channel, status);
}
else
{
parameter = this->DelBan(source, parameter, channel, status);
}
/* If the method above 'ate' the parameter by reducing it to an empty string, then
* it won't matter wether we return ALLOW or DENY here, as an empty string overrides
* the return value and is always MODEACTION_DENY if the mode is supposed to have
* a parameter.
*/
return MODEACTION_ALLOW;
}
void ModeChannelBan::RemoveMode(chanrec* channel)
{
BanList copy;
char moderemove[MAXBUF];
userrec* n = new userrec(ServerInstance);
n->SetFd(FD_MAGIC_NUMBER);
for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++)
{
copy.push_back(*i);
}
for (BanList::iterator i = copy.begin(); i != copy.end(); i++)
{
sprintf(moderemove,"-%c",this->GetModeChar());
const char* parameters[] = { channel->name, moderemove, i->data };
ServerInstance->SendMode(parameters, 3, n);
}
delete n;
}
void ModeChannelBan::RemoveMode(userrec* user)
{
}
void ModeChannelBan::DisplayList(userrec* user, chanrec* channel)
{
/* Display the channel banlist */
for (BanList::reverse_iterator i = channel->bans.rbegin(); i != channel->bans.rend(); ++i)
{
user->WriteServ("367 %s %s %s %s %d",user->nick, channel->name, i->data, i->set_by, i->set_time);
}
user->WriteServ("368 %s %s :End of channel ban list",user->nick, channel->name);
return;
}
std::string& ModeChannelBan::AddBan(userrec *user,std::string &dest,chanrec *chan,int status)
{
if ((!user) || (!chan))
{
ServerInstance->Log(DEFAULT,"*** BUG *** AddBan was given an invalid parameter");
dest = "";
return dest;
}
/* Attempt to tidy the mask */
ModeParser::CleanMask(dest);
/* If the mask was invalid, we exit */
if (dest == "")
return dest;
long maxbans = chan->GetMaxBans();
if ((unsigned)chan->bans.size() > (unsigned)maxbans)
{
user->WriteServ("478 %s %s :Channel ban list for %s is full (maximum entries for this channel is %d)",user->nick, chan->name,chan->name,maxbans);
dest = "";
return dest;
}
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAddBan,OnAddBan(user,chan,dest));
if (MOD_RESULT)
{
dest = "";
return dest;
}
for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++)
{
if (!strcasecmp(i->data,dest.c_str()))
{
/* dont allow a user to set the same ban twice */
dest = "";
return dest;
}
}
b.set_time = ServerInstance->Time();
strlcpy(b.data,dest.c_str(),MAXBUF);
if (*user->nick)
{
strlcpy(b.set_by,user->nick,NICKMAX-1);
}
else
{
strlcpy(b.set_by,ServerInstance->Config->ServerName,NICKMAX-1);
}
chan->bans.push_back(b);
return dest;
}
ModePair ModeChannelBan::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
{
for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++)
{
if (!strcasecmp(i->data,parameter.c_str()))
{
return std::make_pair(true, i->data);
}
}
return std::make_pair(false, parameter);
}
std::string& ModeChannelBan::DelBan(userrec *user,std::string& dest,chanrec *chan,int status)
{
if ((!user) || (!chan))
{
ServerInstance->Log(DEFAULT,"*** BUG *** TakeBan was given an invalid parameter");
dest = "";
return dest;
}
/* 'Clean' the mask, e.g. nick -> nick!*@* */
ModeParser::CleanMask(dest);
for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++)
{
if (!strcasecmp(i->data,dest.c_str()))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnDelBan,OnDelBan(user,chan,dest));
if (MOD_RESULT)
{
dest = "";
return dest;
}
chan->bans.erase(i);
return dest;
}
}
dest = "";
return dest;
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include <string> +#include <vector> +#include "inspircd_config.h" +#include "configreader.h" +#include "hash_map.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modules.h" +#include "inspstring.h" +#include "hashcomp.h" +#include "modes/cmode_b.h" + +ModeChannelBan::ModeChannelBan(InspIRCd* Instance) : ModeHandler(Instance, 'b', 1, 1, true, MODETYPE_CHANNEL, false) +{ +} + +ModeAction ModeChannelBan::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + int status = channel->GetStatus(source); + /* Call the correct method depending on wether we're adding or removing the mode */ + if (adding) + { + parameter = this->AddBan(source, parameter, channel, status); + } + else + { + parameter = this->DelBan(source, parameter, channel, status); + } + /* If the method above 'ate' the parameter by reducing it to an empty string, then + * it won't matter wether we return ALLOW or DENY here, as an empty string overrides + * the return value and is always MODEACTION_DENY if the mode is supposed to have + * a parameter. + */ + return MODEACTION_ALLOW; +} + +void ModeChannelBan::RemoveMode(chanrec* channel) +{ + BanList copy; + char moderemove[MAXBUF]; + userrec* n = new userrec(ServerInstance); + n->SetFd(FD_MAGIC_NUMBER); + + for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++) + { + copy.push_back(*i); + } + for (BanList::iterator i = copy.begin(); i != copy.end(); i++) + { + sprintf(moderemove,"-%c",this->GetModeChar()); + const char* parameters[] = { channel->name, moderemove, i->data }; + ServerInstance->SendMode(parameters, 3, n); + } + + delete n; +} + +void ModeChannelBan::RemoveMode(userrec* user) +{ +} + +void ModeChannelBan::DisplayList(userrec* user, chanrec* channel) +{ + /* Display the channel banlist */ + for (BanList::reverse_iterator i = channel->bans.rbegin(); i != channel->bans.rend(); ++i) + { + user->WriteServ("367 %s %s %s %s %d",user->nick, channel->name, i->data, i->set_by, i->set_time); + } + user->WriteServ("368 %s %s :End of channel ban list",user->nick, channel->name); + return; +} + +std::string& ModeChannelBan::AddBan(userrec *user,std::string &dest,chanrec *chan,int status) +{ + if ((!user) || (!chan)) + { + ServerInstance->Log(DEFAULT,"*** BUG *** AddBan was given an invalid parameter"); + dest = ""; + return dest; + } + + /* Attempt to tidy the mask */ + ModeParser::CleanMask(dest); + /* If the mask was invalid, we exit */ + if (dest == "") + return dest; + + long maxbans = chan->GetMaxBans(); + if ((unsigned)chan->bans.size() > (unsigned)maxbans) + { + user->WriteServ("478 %s %s :Channel ban list for %s is full (maximum entries for this channel is %d)",user->nick, chan->name,chan->name,maxbans); + dest = ""; + return dest; + } + + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnAddBan,OnAddBan(user,chan,dest)); + if (MOD_RESULT) + { + dest = ""; + return dest; + } + + for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++) + { + if (!strcasecmp(i->data,dest.c_str())) + { + /* dont allow a user to set the same ban twice */ + dest = ""; + return dest; + } + } + + b.set_time = ServerInstance->Time(); + strlcpy(b.data,dest.c_str(),MAXBUF); + if (*user->nick) + { + strlcpy(b.set_by,user->nick,NICKMAX-1); + } + else + { + strlcpy(b.set_by,ServerInstance->Config->ServerName,NICKMAX-1); + } + chan->bans.push_back(b); + return dest; +} + +ModePair ModeChannelBan::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) +{ + for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++) + { + if (!strcasecmp(i->data,parameter.c_str())) + { + return std::make_pair(true, i->data); + } + } + return std::make_pair(false, parameter); +} + +std::string& ModeChannelBan::DelBan(userrec *user,std::string& dest,chanrec *chan,int status) +{ + if ((!user) || (!chan)) + { + ServerInstance->Log(DEFAULT,"*** BUG *** TakeBan was given an invalid parameter"); + dest = ""; + return dest; + } + + /* 'Clean' the mask, e.g. nick -> nick!*@* */ + ModeParser::CleanMask(dest); + + for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++) + { + if (!strcasecmp(i->data,dest.c_str())) + { + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnDelBan,OnDelBan(user,chan,dest)); + if (MOD_RESULT) + { + dest = ""; + return dest; + } + chan->bans.erase(i); + return dest; + } + } + dest = ""; + return dest; +} + diff --git a/src/modes/cmode_h.cpp b/src/modes/cmode_h.cpp index f2ffff665..ecee93388 100644 --- a/src/modes/cmode_h.cpp +++ b/src/modes/cmode_h.cpp @@ -1 +1,162 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "configreader.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modules.h"
#include "modes/cmode_h.h"
ModeChannelHalfOp::ModeChannelHalfOp(InspIRCd* Instance) : ModeHandler(Instance, 'h', 1, 1, true, MODETYPE_CHANNEL, false, '%')
{
}
unsigned int ModeChannelHalfOp::GetPrefixRank()
{
return HALFOP_VALUE;
}
ModePair ModeChannelHalfOp::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
{
userrec* x = ServerInstance->FindNick(parameter);
if (x)
{
if (channel->GetStatusFlags(x) & UCMODE_HOP)
{
return std::make_pair(true, x->nick);
}
else
{
return std::make_pair(false, parameter);
}
}
return std::make_pair(false, parameter);
}
void ModeChannelHalfOp::RemoveMode(chanrec* channel)
{
CUList* list = channel->GetHalfoppedUsers();
CUList copy;
char moderemove[MAXBUF];
userrec* n = new userrec(ServerInstance);
n->SetFd(FD_MAGIC_NUMBER);
for (CUList::iterator i = list->begin(); i != list->end(); i++)
{
userrec* n = i->first;
copy.insert(std::make_pair(n,n->nick));
}
for (CUList::iterator i = copy.begin(); i != copy.end(); i++)
{
sprintf(moderemove,"-%c",this->GetModeChar());
const char* parameters[] = { channel->name, moderemove, i->first->nick };
ServerInstance->SendMode(parameters, 3, n);
}
delete n;
}
void ModeChannelHalfOp::RemoveMode(userrec* user)
{
}
ModeAction ModeChannelHalfOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
/* If halfops are not enabled in the conf, we don't execute
* anything in this class at all.
*/
if (!ServerInstance->Config->AllowHalfop)
{
parameter = "";
return MODEACTION_DENY;
}
int status = channel->GetStatus(source);
/* Call the correct method depending on wether we're adding or removing the mode */
if (adding)
{
parameter = this->AddHalfOp(source, parameter.c_str(), channel, status);
}
else
{
parameter = this->DelHalfOp(source, parameter.c_str(), channel, status);
}
/* If the method above 'ate' the parameter by reducing it to an empty string, then
* it won't matter wether we return ALLOW or DENY here, as an empty string overrides
* the return value and is always MODEACTION_DENY if the mode is supposed to have
* a parameter.
*/
if (parameter.length())
return MODEACTION_ALLOW;
else
return MODEACTION_DENY;
}
std::string ModeChannelHalfOp::AddHalfOp(userrec *user,const char* dest,chanrec *chan,int status)
{
userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status);
if (d)
{
if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_HALFOP));
if (MOD_RESULT == ACR_DENY)
return "";
if (MOD_RESULT == ACR_DEFAULT)
{
if ((status < STATUS_OP) && (!ServerInstance->ULine(user->server)))
{
user->WriteServ("482 %s %s :You're not a channel operator",user->nick, chan->name);
return "";
}
}
}
return ServerInstance->Modes->Grant(d,chan,UCMODE_HOP);
}
return "";
}
std::string ModeChannelHalfOp::DelHalfOp(userrec *user,const char *dest,chanrec *chan,int status)
{
userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status);
if (d)
{
if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEHALFOP));
if (MOD_RESULT == ACR_DENY)
return "";
if (MOD_RESULT == ACR_DEFAULT)
{
if ((user != d) && ((status < STATUS_OP) && (!ServerInstance->ULine(user->server))))
{
user->WriteServ("482 %s %s :You are not a channel operator",user->nick, chan->name);
return "";
}
}
}
return ServerInstance->Modes->Revoke(d,chan,UCMODE_HOP);
}
return "";
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "configreader.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modules.h" +#include "modes/cmode_h.h" + +ModeChannelHalfOp::ModeChannelHalfOp(InspIRCd* Instance) : ModeHandler(Instance, 'h', 1, 1, true, MODETYPE_CHANNEL, false, '%') +{ +} + +unsigned int ModeChannelHalfOp::GetPrefixRank() +{ + return HALFOP_VALUE; +} + +ModePair ModeChannelHalfOp::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) +{ + userrec* x = ServerInstance->FindNick(parameter); + if (x) + { + if (channel->GetStatusFlags(x) & UCMODE_HOP) + { + return std::make_pair(true, x->nick); + } + else + { + return std::make_pair(false, parameter); + } + } + return std::make_pair(false, parameter); +} + +void ModeChannelHalfOp::RemoveMode(chanrec* channel) +{ + CUList* list = channel->GetHalfoppedUsers(); + CUList copy; + char moderemove[MAXBUF]; + userrec* n = new userrec(ServerInstance); + n->SetFd(FD_MAGIC_NUMBER); + + for (CUList::iterator i = list->begin(); i != list->end(); i++) + { + userrec* n = i->first; + copy.insert(std::make_pair(n,n->nick)); + } + for (CUList::iterator i = copy.begin(); i != copy.end(); i++) + { + sprintf(moderemove,"-%c",this->GetModeChar()); + const char* parameters[] = { channel->name, moderemove, i->first->nick }; + ServerInstance->SendMode(parameters, 3, n); + } + delete n; +} + +void ModeChannelHalfOp::RemoveMode(userrec* user) +{ +} + +ModeAction ModeChannelHalfOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + /* If halfops are not enabled in the conf, we don't execute + * anything in this class at all. + */ + if (!ServerInstance->Config->AllowHalfop) + { + parameter = ""; + return MODEACTION_DENY; + } + + int status = channel->GetStatus(source); + + /* Call the correct method depending on wether we're adding or removing the mode */ + if (adding) + { + parameter = this->AddHalfOp(source, parameter.c_str(), channel, status); + } + else + { + parameter = this->DelHalfOp(source, parameter.c_str(), channel, status); + } + /* If the method above 'ate' the parameter by reducing it to an empty string, then + * it won't matter wether we return ALLOW or DENY here, as an empty string overrides + * the return value and is always MODEACTION_DENY if the mode is supposed to have + * a parameter. + */ + if (parameter.length()) + return MODEACTION_ALLOW; + else + return MODEACTION_DENY; +} + +std::string ModeChannelHalfOp::AddHalfOp(userrec *user,const char* dest,chanrec *chan,int status) +{ + userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status); + + if (d) + { + if (IS_LOCAL(user)) + { + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_HALFOP)); + + if (MOD_RESULT == ACR_DENY) + return ""; + if (MOD_RESULT == ACR_DEFAULT) + { + if ((status < STATUS_OP) && (!ServerInstance->ULine(user->server))) + { + user->WriteServ("482 %s %s :You're not a channel operator",user->nick, chan->name); + return ""; + } + } + } + + return ServerInstance->Modes->Grant(d,chan,UCMODE_HOP); + } + return ""; +} + +std::string ModeChannelHalfOp::DelHalfOp(userrec *user,const char *dest,chanrec *chan,int status) +{ + userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status); + + if (d) + { + if (IS_LOCAL(user)) + { + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEHALFOP)); + + if (MOD_RESULT == ACR_DENY) + return ""; + if (MOD_RESULT == ACR_DEFAULT) + { + if ((user != d) && ((status < STATUS_OP) && (!ServerInstance->ULine(user->server)))) + { + user->WriteServ("482 %s %s :You are not a channel operator",user->nick, chan->name); + return ""; + } + } + } + + return ServerInstance->Modes->Revoke(d,chan,UCMODE_HOP); + } + return ""; +} + diff --git a/src/modes/cmode_i.cpp b/src/modes/cmode_i.cpp index 1dd6dc857..12bdb18b8 100644 --- a/src/modes/cmode_i.cpp +++ b/src/modes/cmode_i.cpp @@ -1 +1,35 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_i.h"
ModeChannelInviteOnly::ModeChannelInviteOnly(InspIRCd* Instance) : ModeHandler(Instance, 'i', 0, 0, false, MODETYPE_CHANNEL, false)
{
}
ModeAction ModeChannelInviteOnly::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if (channel->modes[CM_INVITEONLY] != adding)
{
channel->modes[CM_INVITEONLY] = adding;
return MODEACTION_ALLOW;
}
else
{
return MODEACTION_DENY;
}
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/cmode_i.h" + +ModeChannelInviteOnly::ModeChannelInviteOnly(InspIRCd* Instance) : ModeHandler(Instance, 'i', 0, 0, false, MODETYPE_CHANNEL, false) +{ +} + +ModeAction ModeChannelInviteOnly::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + if (channel->modes[CM_INVITEONLY] != adding) + { + channel->modes[CM_INVITEONLY] = adding; + return MODEACTION_ALLOW; + } + else + { + return MODEACTION_DENY; + } +} diff --git a/src/modes/cmode_k.cpp b/src/modes/cmode_k.cpp index e06c35e83..eb59714f7 100644 --- a/src/modes/cmode_k.cpp +++ b/src/modes/cmode_k.cpp @@ -1 +1,103 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_k.h"
ModeChannelKey::ModeChannelKey(InspIRCd* Instance) : ModeHandler(Instance, 'k', 1, 1, false, MODETYPE_CHANNEL, false)
{
}
ModePair ModeChannelKey::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
{
if (channel->modes[CM_KEY])
{
return std::make_pair(true, channel->key);
}
else
{
return std::make_pair(false, parameter);
}
}
void ModeChannelKey::RemoveMode(chanrec* channel)
{
/** +k needs a parameter when being removed,
* so we have a special-case RemoveMode here for it
*/
char moderemove[MAXBUF];
const char* parameters[] = { channel->name, moderemove, channel->key };
if (channel->IsModeSet(this->GetModeChar()))
{
userrec* n = new userrec(ServerInstance);
sprintf(moderemove,"-%c",this->GetModeChar());
n->SetFd(FD_MAGIC_NUMBER);
ServerInstance->SendMode(parameters, 3, n);
delete n;
}
}
void ModeChannelKey::RemoveMode(userrec* user)
{
}
bool ModeChannelKey::CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel)
{
/* When TS is equal, the alphabetically later channel key wins */
return (their_param < our_param);
}
ModeAction ModeChannelKey::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if ((channel->modes[CM_KEY] != adding) || (!IS_LOCAL(source)))
{
if (((channel->modes[CM_KEY]) && (strcasecmp(parameter.c_str(),channel->key))) && (IS_LOCAL(source)))
{
/* Key is currently set and the correct key wasnt given */
return MODEACTION_DENY;
}
else if ((!channel->modes[CM_KEY]) || ((adding) && (!IS_LOCAL(source))))
{
/* Key isnt currently set */
if ((parameter.length()) && (parameter.rfind(' ') == std::string::npos))
{
strlcpy(channel->key,parameter.c_str(),32);
channel->modes[CM_KEY] = adding;
parameter = channel->key;
return MODEACTION_ALLOW;
}
else
return MODEACTION_DENY;
}
else if (((channel->modes[CM_KEY]) && (!strcasecmp(parameter.c_str(),channel->key))) || ((!adding) && (!IS_LOCAL(source))))
{
/* Key is currently set, and correct key was given */
*channel->key = 0;
channel->modes[CM_KEY] = adding;
return MODEACTION_ALLOW;
}
return MODEACTION_DENY;
}
else
{
return MODEACTION_DENY;
}
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/cmode_k.h" + +ModeChannelKey::ModeChannelKey(InspIRCd* Instance) : ModeHandler(Instance, 'k', 1, 1, false, MODETYPE_CHANNEL, false) +{ +} + +ModePair ModeChannelKey::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) +{ + if (channel->modes[CM_KEY]) + { + return std::make_pair(true, channel->key); + } + else + { + return std::make_pair(false, parameter); + } +} + +void ModeChannelKey::RemoveMode(chanrec* channel) +{ + /** +k needs a parameter when being removed, + * so we have a special-case RemoveMode here for it + */ + char moderemove[MAXBUF]; + const char* parameters[] = { channel->name, moderemove, channel->key }; + + if (channel->IsModeSet(this->GetModeChar())) + { + userrec* n = new userrec(ServerInstance); + + sprintf(moderemove,"-%c",this->GetModeChar()); + n->SetFd(FD_MAGIC_NUMBER); + + ServerInstance->SendMode(parameters, 3, n); + + delete n; + } +} + +void ModeChannelKey::RemoveMode(userrec* user) +{ +} + +bool ModeChannelKey::CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel) +{ + /* When TS is equal, the alphabetically later channel key wins */ + return (their_param < our_param); +} + +ModeAction ModeChannelKey::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + if ((channel->modes[CM_KEY] != adding) || (!IS_LOCAL(source))) + { + if (((channel->modes[CM_KEY]) && (strcasecmp(parameter.c_str(),channel->key))) && (IS_LOCAL(source))) + { + /* Key is currently set and the correct key wasnt given */ + return MODEACTION_DENY; + } + else if ((!channel->modes[CM_KEY]) || ((adding) && (!IS_LOCAL(source)))) + { + /* Key isnt currently set */ + if ((parameter.length()) && (parameter.rfind(' ') == std::string::npos)) + { + strlcpy(channel->key,parameter.c_str(),32); + channel->modes[CM_KEY] = adding; + parameter = channel->key; + return MODEACTION_ALLOW; + } + else + return MODEACTION_DENY; + } + else if (((channel->modes[CM_KEY]) && (!strcasecmp(parameter.c_str(),channel->key))) || ((!adding) && (!IS_LOCAL(source)))) + { + /* Key is currently set, and correct key was given */ + *channel->key = 0; + channel->modes[CM_KEY] = adding; + return MODEACTION_ALLOW; + } + return MODEACTION_DENY; + } + else + { + return MODEACTION_DENY; + } +} + diff --git a/src/modes/cmode_l.cpp b/src/modes/cmode_l.cpp index 5e1a8c26c..1a57a440d 100644 --- a/src/modes/cmode_l.cpp +++ b/src/modes/cmode_l.cpp @@ -1 +1,97 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_l.h"
ModeChannelLimit::ModeChannelLimit(InspIRCd* Instance) : ModeHandler(Instance, 'l', 1, 0, false, MODETYPE_CHANNEL, false)
{
}
ModePair ModeChannelLimit::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
{
if (channel->limit)
{
return std::make_pair(true, ConvToStr(channel->limit));
}
else
{
return std::make_pair(false, parameter);
}
}
bool ModeChannelLimit::CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel)
{
/* When TS is equal, the higher channel limit wins */
return (atoi(their_param.c_str()) < atoi(our_param.c_str()));
}
ModeAction ModeChannelLimit::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if (adding)
{
/* Setting a new limit, sanity check */
long limit = atoi(parameter.c_str());
/* Wrap low values at 32768 */
if (limit < 0)
limit = 0x7FFF;
/* If the new limit is the same as the old limit,
* and the old limit isnt 0, disallow */
if ((limit == channel->limit) && (channel->limit > 0))
{
parameter = "";
return MODEACTION_DENY;
}
/* They must have specified an invalid number.
* Dont allow +l 0.
*/
if (!limit)
{
parameter = "";
return MODEACTION_DENY;
}
parameter = ConvToStr(limit);
/* Set new limit */
channel->limit = limit;
channel->modes[CM_LIMIT] = 1;
return MODEACTION_ALLOW;
}
else
{
/* Check if theres a limit here to remove.
* If there isnt, dont allow the -l
*/
if (!channel->limit)
{
parameter = "";
return MODEACTION_DENY;
}
/* Removing old limit, no checks here */
channel->limit = 0;
channel->modes[CM_LIMIT] = 0;
return MODEACTION_ALLOW;
}
return MODEACTION_DENY;
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/cmode_l.h" + +ModeChannelLimit::ModeChannelLimit(InspIRCd* Instance) : ModeHandler(Instance, 'l', 1, 0, false, MODETYPE_CHANNEL, false) +{ +} + +ModePair ModeChannelLimit::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) +{ + if (channel->limit) + { + return std::make_pair(true, ConvToStr(channel->limit)); + } + else + { + return std::make_pair(false, parameter); + } +} + +bool ModeChannelLimit::CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel) +{ + /* When TS is equal, the higher channel limit wins */ + return (atoi(their_param.c_str()) < atoi(our_param.c_str())); +} + +ModeAction ModeChannelLimit::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + if (adding) + { + /* Setting a new limit, sanity check */ + long limit = atoi(parameter.c_str()); + + /* Wrap low values at 32768 */ + if (limit < 0) + limit = 0x7FFF; + + /* If the new limit is the same as the old limit, + * and the old limit isnt 0, disallow */ + if ((limit == channel->limit) && (channel->limit > 0)) + { + parameter = ""; + return MODEACTION_DENY; + } + + /* They must have specified an invalid number. + * Dont allow +l 0. + */ + if (!limit) + { + parameter = ""; + return MODEACTION_DENY; + } + + parameter = ConvToStr(limit); + + /* Set new limit */ + channel->limit = limit; + channel->modes[CM_LIMIT] = 1; + + return MODEACTION_ALLOW; + } + else + { + /* Check if theres a limit here to remove. + * If there isnt, dont allow the -l + */ + if (!channel->limit) + { + parameter = ""; + return MODEACTION_DENY; + } + + /* Removing old limit, no checks here */ + channel->limit = 0; + channel->modes[CM_LIMIT] = 0; + + return MODEACTION_ALLOW; + } + + return MODEACTION_DENY; +} diff --git a/src/modes/cmode_m.cpp b/src/modes/cmode_m.cpp index da882333b..520248fda 100644 --- a/src/modes/cmode_m.cpp +++ b/src/modes/cmode_m.cpp @@ -1 +1,36 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_m.h"
ModeChannelModerated::ModeChannelModerated(InspIRCd* Instance) : ModeHandler(Instance, 'm', 0, 0, false, MODETYPE_CHANNEL, false)
{
}
ModeAction ModeChannelModerated::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if (channel->modes[CM_MODERATED] != adding)
{
channel->modes[CM_MODERATED] = adding;
return MODEACTION_ALLOW;
}
else
{
return MODEACTION_DENY;
}
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/cmode_m.h" + +ModeChannelModerated::ModeChannelModerated(InspIRCd* Instance) : ModeHandler(Instance, 'm', 0, 0, false, MODETYPE_CHANNEL, false) +{ +} + +ModeAction ModeChannelModerated::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + if (channel->modes[CM_MODERATED] != adding) + { + channel->modes[CM_MODERATED] = adding; + return MODEACTION_ALLOW; + } + else + { + return MODEACTION_DENY; + } +} + diff --git a/src/modes/cmode_n.cpp b/src/modes/cmode_n.cpp index 3ae7d538c..ddc2e1bbd 100644 --- a/src/modes/cmode_n.cpp +++ b/src/modes/cmode_n.cpp @@ -1 +1,36 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_n.h"
ModeChannelNoExternal::ModeChannelNoExternal(InspIRCd* Instance) : ModeHandler(Instance, 'n', 0, 0, false, MODETYPE_CHANNEL, false)
{
}
ModeAction ModeChannelNoExternal::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if (channel->modes[CM_NOEXTERNAL] != adding)
{
channel->modes[CM_NOEXTERNAL] = adding;
return MODEACTION_ALLOW;
}
else
{
return MODEACTION_DENY;
}
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/cmode_n.h" + +ModeChannelNoExternal::ModeChannelNoExternal(InspIRCd* Instance) : ModeHandler(Instance, 'n', 0, 0, false, MODETYPE_CHANNEL, false) +{ +} + +ModeAction ModeChannelNoExternal::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + if (channel->modes[CM_NOEXTERNAL] != adding) + { + channel->modes[CM_NOEXTERNAL] = adding; + return MODEACTION_ALLOW; + } + else + { + return MODEACTION_DENY; + } +} + diff --git a/src/modes/cmode_o.cpp b/src/modes/cmode_o.cpp index 9ae18109e..47d191ff8 100644 --- a/src/modes/cmode_o.cpp +++ b/src/modes/cmode_o.cpp @@ -1 +1,153 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "configreader.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modules.h"
#include "modes/cmode_o.h"
ModeChannelOp::ModeChannelOp(InspIRCd* Instance) : ModeHandler(Instance, 'o', 1, 1, true, MODETYPE_CHANNEL, false, '@')
{
}
unsigned int ModeChannelOp::GetPrefixRank()
{
return OP_VALUE;
}
ModePair ModeChannelOp::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
{
userrec* x = ServerInstance->FindNick(parameter);
if (x)
{
if (channel->GetStatusFlags(x) & UCMODE_OP)
{
return std::make_pair(true, x->nick);
}
else
{
return std::make_pair(false, parameter);
}
}
return std::make_pair(false, parameter);
}
void ModeChannelOp::RemoveMode(chanrec* channel)
{
CUList* list = channel->GetOppedUsers();
CUList copy;
char moderemove[MAXBUF];
userrec* n = new userrec(ServerInstance);
n->SetFd(FD_MAGIC_NUMBER);
for (CUList::iterator i = list->begin(); i != list->end(); i++)
{
userrec* n = i->first;
copy.insert(std::make_pair(n,n->nick));
}
for (CUList::iterator i = copy.begin(); i != copy.end(); i++)
{
sprintf(moderemove,"-%c",this->GetModeChar());
const char* parameters[] = { channel->name, moderemove, i->first->nick };
ServerInstance->SendMode(parameters, 3, n);
}
delete n;
}
void ModeChannelOp::RemoveMode(userrec* user)
{
}
ModeAction ModeChannelOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
int status = channel->GetStatus(source);
/* Call the correct method depending on wether we're adding or removing the mode */
if (adding)
{
parameter = this->AddOp(source, parameter.c_str(), channel, status);
}
else
{
parameter = this->DelOp(source, parameter.c_str(), channel, status);
}
/* If the method above 'ate' the parameter by reducing it to an empty string, then
* it won't matter wether we return ALLOW or DENY here, as an empty string overrides
* the return value and is always MODEACTION_DENY if the mode is supposed to have
* a parameter.
*/
if (parameter.length())
return MODEACTION_ALLOW;
else
return MODEACTION_DENY;
}
std::string ModeChannelOp::AddOp(userrec *user,const char* dest,chanrec *chan,int status)
{
userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status);
if (d)
{
if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_OP));
if (MOD_RESULT == ACR_DENY)
return "";
if (MOD_RESULT == ACR_DEFAULT)
{
if ((status < STATUS_OP) && (!ServerInstance->ULine(user->server)))
{
user->WriteServ("482 %s %s :You're not a channel operator",user->nick, chan->name);
return "";
}
}
}
return ServerInstance->Modes->Grant(d,chan,UCMODE_OP);
}
return "";
}
std::string ModeChannelOp::DelOp(userrec *user,const char *dest,chanrec *chan,int status)
{
userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status);
if (d)
{
if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEOP));
if (MOD_RESULT == ACR_DENY)
return "";
if (MOD_RESULT == ACR_DEFAULT)
{
if ((status < STATUS_OP) && (!ServerInstance->ULine(user->server)) && (IS_LOCAL(user)))
{
user->WriteServ("482 %s %s :You are not a channel operator",user->nick, chan->name);
return "";
}
}
}
return ServerInstance->Modes->Revoke(d,chan,UCMODE_OP);
}
return "";
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "configreader.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modules.h" +#include "modes/cmode_o.h" + +ModeChannelOp::ModeChannelOp(InspIRCd* Instance) : ModeHandler(Instance, 'o', 1, 1, true, MODETYPE_CHANNEL, false, '@') +{ +} + +unsigned int ModeChannelOp::GetPrefixRank() +{ + return OP_VALUE; +} + +ModePair ModeChannelOp::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) +{ + userrec* x = ServerInstance->FindNick(parameter); + if (x) + { + if (channel->GetStatusFlags(x) & UCMODE_OP) + { + return std::make_pair(true, x->nick); + } + else + { + return std::make_pair(false, parameter); + } + } + return std::make_pair(false, parameter); +} + + +void ModeChannelOp::RemoveMode(chanrec* channel) +{ + CUList* list = channel->GetOppedUsers(); + CUList copy; + char moderemove[MAXBUF]; + userrec* n = new userrec(ServerInstance); + n->SetFd(FD_MAGIC_NUMBER); + + for (CUList::iterator i = list->begin(); i != list->end(); i++) + { + userrec* n = i->first; + copy.insert(std::make_pair(n,n->nick)); + } + for (CUList::iterator i = copy.begin(); i != copy.end(); i++) + { + sprintf(moderemove,"-%c",this->GetModeChar()); + const char* parameters[] = { channel->name, moderemove, i->first->nick }; + ServerInstance->SendMode(parameters, 3, n); + } + delete n; +} + +void ModeChannelOp::RemoveMode(userrec* user) +{ +} + +ModeAction ModeChannelOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + int status = channel->GetStatus(source); + + /* Call the correct method depending on wether we're adding or removing the mode */ + if (adding) + { + parameter = this->AddOp(source, parameter.c_str(), channel, status); + } + else + { + parameter = this->DelOp(source, parameter.c_str(), channel, status); + } + /* If the method above 'ate' the parameter by reducing it to an empty string, then + * it won't matter wether we return ALLOW or DENY here, as an empty string overrides + * the return value and is always MODEACTION_DENY if the mode is supposed to have + * a parameter. + */ + if (parameter.length()) + return MODEACTION_ALLOW; + else + return MODEACTION_DENY; +} + +std::string ModeChannelOp::AddOp(userrec *user,const char* dest,chanrec *chan,int status) +{ + userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status); + + if (d) + { + if (IS_LOCAL(user)) + { + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_OP)); + + if (MOD_RESULT == ACR_DENY) + return ""; + if (MOD_RESULT == ACR_DEFAULT) + { + if ((status < STATUS_OP) && (!ServerInstance->ULine(user->server))) + { + user->WriteServ("482 %s %s :You're not a channel operator",user->nick, chan->name); + return ""; + } + } + } + + return ServerInstance->Modes->Grant(d,chan,UCMODE_OP); + } + return ""; +} + +std::string ModeChannelOp::DelOp(userrec *user,const char *dest,chanrec *chan,int status) +{ + userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status); + + if (d) + { + if (IS_LOCAL(user)) + { + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEOP)); + + if (MOD_RESULT == ACR_DENY) + return ""; + if (MOD_RESULT == ACR_DEFAULT) + { + if ((status < STATUS_OP) && (!ServerInstance->ULine(user->server)) && (IS_LOCAL(user))) + { + user->WriteServ("482 %s %s :You are not a channel operator",user->nick, chan->name); + return ""; + } + } + } + + return ServerInstance->Modes->Revoke(d,chan,UCMODE_OP); + } + return ""; +} diff --git a/src/modes/cmode_p.cpp b/src/modes/cmode_p.cpp index c762b7827..15c33222e 100644 --- a/src/modes/cmode_p.cpp +++ b/src/modes/cmode_p.cpp @@ -1 +1,35 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_p.h"
ModeChannelPrivate::ModeChannelPrivate(InspIRCd* Instance) : ModeHandler(Instance, 'p', 0, 0, false, MODETYPE_CHANNEL, false)
{
}
ModeAction ModeChannelPrivate::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if (channel->modes[CM_PRIVATE] != adding)
{
channel->modes[CM_PRIVATE] = adding;
return MODEACTION_ALLOW;
}
else
{
return MODEACTION_DENY;
}
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/cmode_p.h" + +ModeChannelPrivate::ModeChannelPrivate(InspIRCd* Instance) : ModeHandler(Instance, 'p', 0, 0, false, MODETYPE_CHANNEL, false) +{ +} + +ModeAction ModeChannelPrivate::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + if (channel->modes[CM_PRIVATE] != adding) + { + channel->modes[CM_PRIVATE] = adding; + return MODEACTION_ALLOW; + } + else + { + return MODEACTION_DENY; + } +} diff --git a/src/modes/cmode_s.cpp b/src/modes/cmode_s.cpp index 069591e6b..135291592 100644 --- a/src/modes/cmode_s.cpp +++ b/src/modes/cmode_s.cpp @@ -1 +1,35 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_s.h"
ModeChannelSecret::ModeChannelSecret(InspIRCd* Instance) : ModeHandler(Instance, 's', 0, 0, false, MODETYPE_CHANNEL, false)
{
}
ModeAction ModeChannelSecret::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if (channel->modes[CM_SECRET] != adding)
{
channel->modes[CM_SECRET] = adding;
return MODEACTION_ALLOW;
}
else
{
return MODEACTION_DENY;
}
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/cmode_s.h" + +ModeChannelSecret::ModeChannelSecret(InspIRCd* Instance) : ModeHandler(Instance, 's', 0, 0, false, MODETYPE_CHANNEL, false) +{ +} + +ModeAction ModeChannelSecret::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + if (channel->modes[CM_SECRET] != adding) + { + channel->modes[CM_SECRET] = adding; + return MODEACTION_ALLOW; + } + else + { + return MODEACTION_DENY; + } +} diff --git a/src/modes/cmode_t.cpp b/src/modes/cmode_t.cpp index def48a781..2a6c06b42 100644 --- a/src/modes/cmode_t.cpp +++ b/src/modes/cmode_t.cpp @@ -1 +1,36 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_t.h"
ModeChannelTopicOps::ModeChannelTopicOps(InspIRCd* Instance) : ModeHandler(Instance, 't', 0, 0, false, MODETYPE_CHANNEL, false)
{
}
ModeAction ModeChannelTopicOps::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if (channel->modes[CM_TOPICLOCK] != adding)
{
channel->modes[CM_TOPICLOCK] = adding;
return MODEACTION_ALLOW;
}
else
{
return MODEACTION_DENY;
}
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/cmode_t.h" + +ModeChannelTopicOps::ModeChannelTopicOps(InspIRCd* Instance) : ModeHandler(Instance, 't', 0, 0, false, MODETYPE_CHANNEL, false) +{ +} + +ModeAction ModeChannelTopicOps::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + if (channel->modes[CM_TOPICLOCK] != adding) + { + channel->modes[CM_TOPICLOCK] = adding; + return MODEACTION_ALLOW; + } + else + { + return MODEACTION_DENY; + } +} + diff --git a/src/modes/cmode_v.cpp b/src/modes/cmode_v.cpp index c055cca7f..1e244c606 100644 --- a/src/modes/cmode_v.cpp +++ b/src/modes/cmode_v.cpp @@ -1 +1,152 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "configreader.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modules.h"
#include "modes/cmode_v.h"
ModeChannelVoice::ModeChannelVoice(InspIRCd* Instance) : ModeHandler(Instance, 'v', 1, 1, true, MODETYPE_CHANNEL, false, '+')
{
}
unsigned int ModeChannelVoice::GetPrefixRank()
{
return VOICE_VALUE;
}
ModePair ModeChannelVoice::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
{
userrec* x = ServerInstance->FindNick(parameter);
if (x)
{
if (channel->GetStatusFlags(x) & UCMODE_VOICE)
{
return std::make_pair(true, x->nick);
}
else
{
return std::make_pair(false, parameter);
}
}
return std::make_pair(false, parameter);
}
void ModeChannelVoice::RemoveMode(chanrec* channel)
{
CUList* list = channel->GetVoicedUsers();
CUList copy;
char moderemove[MAXBUF];
userrec* n = new userrec(ServerInstance);
n->SetFd(FD_MAGIC_NUMBER);
for (CUList::iterator i = list->begin(); i != list->end(); i++)
{
userrec* n = i->first;
copy.insert(std::make_pair(n,n->nick));
}
for (CUList::iterator i = copy.begin(); i != copy.end(); i++)
{
sprintf(moderemove,"-%c",this->GetModeChar());
const char* parameters[] = { channel->name, moderemove, i->first->nick };
ServerInstance->SendMode(parameters, 3, n);
}
delete n;
}
void ModeChannelVoice::RemoveMode(userrec* user)
{
}
ModeAction ModeChannelVoice::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
int status = channel->GetStatus(source);
/* Call the correct method depending on wether we're adding or removing the mode */
if (adding)
{
parameter = this->AddVoice(source, parameter.c_str(), channel, status);
}
else
{
parameter = this->DelVoice(source, parameter.c_str(), channel, status);
}
/* If the method above 'ate' the parameter by reducing it to an empty string, then
* it won't matter wether we return ALLOW or DENY here, as an empty string overrides
* the return value and is always MODEACTION_DENY if the mode is supposed to have
* a parameter.
*/
if (parameter.length())
return MODEACTION_ALLOW;
else
return MODEACTION_DENY;
}
std::string ModeChannelVoice::AddVoice(userrec *user,const char* dest,chanrec *chan,int status)
{
userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status);
if (d)
{
if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_VOICE));
if (MOD_RESULT == ACR_DENY)
return "";
if (MOD_RESULT == ACR_DEFAULT)
{
if ((status < STATUS_HOP) && (!ServerInstance->ULine(user->server)))
{
user->WriteServ("482 %s %s :You're not a channel (half)operator",user->nick, chan->name);
return "";
}
}
}
return ServerInstance->Modes->Grant(d,chan,UCMODE_VOICE);
}
return "";
}
std::string ModeChannelVoice::DelVoice(userrec *user,const char *dest,chanrec *chan,int status)
{
userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status);
if (d)
{
if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEVOICE));
if (MOD_RESULT == ACR_DENY)
return "";
if (MOD_RESULT == ACR_DEFAULT)
{
if ((status < STATUS_HOP) && (!ServerInstance->ULine(user->server)))
{
user->WriteServ("482 %s %s :You are not a channel (half)operator",user->nick, chan->name);
return "";
}
}
}
return ServerInstance->Modes->Revoke(d,chan,UCMODE_VOICE);
}
return "";
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "configreader.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modules.h" +#include "modes/cmode_v.h" + +ModeChannelVoice::ModeChannelVoice(InspIRCd* Instance) : ModeHandler(Instance, 'v', 1, 1, true, MODETYPE_CHANNEL, false, '+') +{ +} + +unsigned int ModeChannelVoice::GetPrefixRank() +{ + return VOICE_VALUE; +} + +ModePair ModeChannelVoice::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) +{ + userrec* x = ServerInstance->FindNick(parameter); + if (x) + { + if (channel->GetStatusFlags(x) & UCMODE_VOICE) + { + return std::make_pair(true, x->nick); + } + else + { + return std::make_pair(false, parameter); + } + } + return std::make_pair(false, parameter); +} + +void ModeChannelVoice::RemoveMode(chanrec* channel) +{ + CUList* list = channel->GetVoicedUsers(); + CUList copy; + char moderemove[MAXBUF]; + userrec* n = new userrec(ServerInstance); + n->SetFd(FD_MAGIC_NUMBER); + + for (CUList::iterator i = list->begin(); i != list->end(); i++) + { + userrec* n = i->first; + copy.insert(std::make_pair(n,n->nick)); + } + for (CUList::iterator i = copy.begin(); i != copy.end(); i++) + { + sprintf(moderemove,"-%c",this->GetModeChar()); + const char* parameters[] = { channel->name, moderemove, i->first->nick }; + ServerInstance->SendMode(parameters, 3, n); + } + delete n; +} + +void ModeChannelVoice::RemoveMode(userrec* user) +{ +} + +ModeAction ModeChannelVoice::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + int status = channel->GetStatus(source); + + /* Call the correct method depending on wether we're adding or removing the mode */ + if (adding) + { + parameter = this->AddVoice(source, parameter.c_str(), channel, status); + } + else + { + parameter = this->DelVoice(source, parameter.c_str(), channel, status); + } + /* If the method above 'ate' the parameter by reducing it to an empty string, then + * it won't matter wether we return ALLOW or DENY here, as an empty string overrides + * the return value and is always MODEACTION_DENY if the mode is supposed to have + * a parameter. + */ + if (parameter.length()) + return MODEACTION_ALLOW; + else + return MODEACTION_DENY; +} + +std::string ModeChannelVoice::AddVoice(userrec *user,const char* dest,chanrec *chan,int status) +{ + userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status); + + if (d) + { + if (IS_LOCAL(user)) + { + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_VOICE)); + + if (MOD_RESULT == ACR_DENY) + return ""; + if (MOD_RESULT == ACR_DEFAULT) + { + if ((status < STATUS_HOP) && (!ServerInstance->ULine(user->server))) + { + user->WriteServ("482 %s %s :You're not a channel (half)operator",user->nick, chan->name); + return ""; + } + } + } + + return ServerInstance->Modes->Grant(d,chan,UCMODE_VOICE); + } + return ""; +} + +std::string ModeChannelVoice::DelVoice(userrec *user,const char *dest,chanrec *chan,int status) +{ + userrec *d = ServerInstance->Modes->SanityChecks(user,dest,chan,status); + + if (d) + { + if (IS_LOCAL(user)) + { + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEVOICE)); + + if (MOD_RESULT == ACR_DENY) + return ""; + if (MOD_RESULT == ACR_DEFAULT) + { + if ((status < STATUS_HOP) && (!ServerInstance->ULine(user->server))) + { + user->WriteServ("482 %s %s :You are not a channel (half)operator",user->nick, chan->name); + return ""; + } + } + } + + return ServerInstance->Modes->Revoke(d,chan,UCMODE_VOICE); + } + return ""; +} diff --git a/src/modes/umode_i.cpp b/src/modes/umode_i.cpp index 6bd769a9a..5a9327375 100644 --- a/src/modes/umode_i.cpp +++ b/src/modes/umode_i.cpp @@ -1 +1,45 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/umode_i.h"
ModeUserInvisible::ModeUserInvisible(InspIRCd* Instance) : ModeHandler(Instance, 'i', 0, 0, false, MODETYPE_USER, false)
{
}
ModeAction ModeUserInvisible::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
/* Only opers can change other users modes */
if ((source != dest) && (!*source->oper))
return MODEACTION_DENY;
/* Set the bitfields */
if (dest->modes[UM_INVISIBLE] != adding)
{
dest->modes[UM_INVISIBLE] = adding;
this->count += (adding ? 1: -1);
return MODEACTION_ALLOW;
}
/* Allow the change */
return MODEACTION_DENY;
}
unsigned int ModeUserInvisible::GetCount()
{
return count;
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/umode_i.h" + +ModeUserInvisible::ModeUserInvisible(InspIRCd* Instance) : ModeHandler(Instance, 'i', 0, 0, false, MODETYPE_USER, false) +{ +} + +ModeAction ModeUserInvisible::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + /* Only opers can change other users modes */ + if ((source != dest) && (!*source->oper)) + return MODEACTION_DENY; + + /* Set the bitfields */ + if (dest->modes[UM_INVISIBLE] != adding) + { + dest->modes[UM_INVISIBLE] = adding; + this->count += (adding ? 1: -1); + return MODEACTION_ALLOW; + } + + /* Allow the change */ + return MODEACTION_DENY; +} + +unsigned int ModeUserInvisible::GetCount() +{ + return count; +} diff --git a/src/modes/umode_n.cpp b/src/modes/umode_n.cpp index c5d2599d8..c9c9e312e 100644 --- a/src/modes/umode_n.cpp +++ b/src/modes/umode_n.cpp @@ -1 +1,58 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/umode_n.h"
ModeUserServerNoticeMask::ModeUserServerNoticeMask(InspIRCd* Instance) : ModeHandler(Instance, 'n', 1, 0, false, MODETYPE_USER, true)
{
}
ModeAction ModeUserServerNoticeMask::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
/* Only opers can change other users modes */
if ((source != dest) && (!*source->oper))
return MODEACTION_DENY;
/* Set the bitfields */
if (adding)
{
/* Fix for bug #310 reported by Smartys */
if (!dest->modes[UM_SNOMASK])
memset(dest->snomasks, 0, sizeof(dest->snomasks));
parameter = dest->ProcessNoticeMasks(parameter.c_str());
dest->modes[UM_SNOMASK] = true;
if (!dest->modes[UM_SERVERNOTICE])
{
const char* newmodes[] = { dest->nick, "+s" };
ServerInstance->Modes->Process(newmodes, 2, source, true);
}
return MODEACTION_ALLOW;
}
else
{
if (dest->modes[UM_SNOMASK] != false)
{
dest->modes[UM_SNOMASK] = false;
return MODEACTION_ALLOW;
}
}
/* Allow the change */
return MODEACTION_DENY;
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/umode_n.h" + +ModeUserServerNoticeMask::ModeUserServerNoticeMask(InspIRCd* Instance) : ModeHandler(Instance, 'n', 1, 0, false, MODETYPE_USER, true) +{ +} + +ModeAction ModeUserServerNoticeMask::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + /* Only opers can change other users modes */ + if ((source != dest) && (!*source->oper)) + return MODEACTION_DENY; + + /* Set the bitfields */ + if (adding) + { + /* Fix for bug #310 reported by Smartys */ + if (!dest->modes[UM_SNOMASK]) + memset(dest->snomasks, 0, sizeof(dest->snomasks)); + + parameter = dest->ProcessNoticeMasks(parameter.c_str()); + dest->modes[UM_SNOMASK] = true; + if (!dest->modes[UM_SERVERNOTICE]) + { + const char* newmodes[] = { dest->nick, "+s" }; + ServerInstance->Modes->Process(newmodes, 2, source, true); + } + return MODEACTION_ALLOW; + } + else + { + if (dest->modes[UM_SNOMASK] != false) + { + dest->modes[UM_SNOMASK] = false; + return MODEACTION_ALLOW; + } + } + + /* Allow the change */ + return MODEACTION_DENY; +} + diff --git a/src/modes/umode_o.cpp b/src/modes/umode_o.cpp index 1b47fe8b2..30ed089f6 100644 --- a/src/modes/umode_o.cpp +++ b/src/modes/umode_o.cpp @@ -1 +1,49 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/umode_o.h"
ModeUserOperator::ModeUserOperator(InspIRCd* Instance) : ModeHandler(Instance, 'o', 0, 0, false, MODETYPE_USER, true)
{
}
ModeAction ModeUserOperator::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
/* Only opers can execute this class at all */
if (!*source->oper)
return MODEACTION_DENY;
/* Not even opers can GIVE the +o mode, only take it away */
if (adding)
return MODEACTION_DENY;
/* Set the bitfields.
* Note that oper status is only given in cmd_oper.cpp
* NOT here. It is impossible to directly set +o without
* verifying as an oper and getting an opertype assigned
* to your userrec!
*/
ServerInstance->SNO->WriteToSnoMask('o', "User %s de-opered (by %s)", dest->nick, source->nick);
dest->UnOper();
return MODEACTION_ALLOW;
}
unsigned int ModeUserOperator::GetCount()
{
return ServerInstance->all_opers.size();
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/umode_o.h" + +ModeUserOperator::ModeUserOperator(InspIRCd* Instance) : ModeHandler(Instance, 'o', 0, 0, false, MODETYPE_USER, true) +{ +} + +ModeAction ModeUserOperator::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + /* Only opers can execute this class at all */ + if (!*source->oper) + return MODEACTION_DENY; + + /* Not even opers can GIVE the +o mode, only take it away */ + if (adding) + return MODEACTION_DENY; + + /* Set the bitfields. + * Note that oper status is only given in cmd_oper.cpp + * NOT here. It is impossible to directly set +o without + * verifying as an oper and getting an opertype assigned + * to your userrec! + */ + ServerInstance->SNO->WriteToSnoMask('o', "User %s de-opered (by %s)", dest->nick, source->nick); + dest->UnOper(); + + return MODEACTION_ALLOW; +} + +unsigned int ModeUserOperator::GetCount() +{ + return ServerInstance->all_opers.size(); +} diff --git a/src/modes/umode_s.cpp b/src/modes/umode_s.cpp index f0441b85f..4b3179001 100644 --- a/src/modes/umode_s.cpp +++ b/src/modes/umode_s.cpp @@ -1 +1,45 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/umode_s.h"
ModeUserServerNotice::ModeUserServerNotice(InspIRCd* Instance) : ModeHandler(Instance, 's', 0, 0, false, MODETYPE_USER, false)
{
}
ModeAction ModeUserServerNotice::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
/* Only opers can change other users modes */
if ((source != dest) && (!*source->oper))
return MODEACTION_DENY;
/* Set the bitfields */
if (dest->modes[UM_SERVERNOTICE] != adding)
{
dest->modes[UM_SERVERNOTICE] = adding;
this->count += (adding ? 1: -1);
return MODEACTION_ALLOW;
}
/* Allow the change */
return MODEACTION_DENY;
}
unsigned int ModeUserServerNotice::GetCount()
{
return count;
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/umode_s.h" + +ModeUserServerNotice::ModeUserServerNotice(InspIRCd* Instance) : ModeHandler(Instance, 's', 0, 0, false, MODETYPE_USER, false) +{ +} + +ModeAction ModeUserServerNotice::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + /* Only opers can change other users modes */ + if ((source != dest) && (!*source->oper)) + return MODEACTION_DENY; + + /* Set the bitfields */ + if (dest->modes[UM_SERVERNOTICE] != adding) + { + dest->modes[UM_SERVERNOTICE] = adding; + this->count += (adding ? 1: -1); + return MODEACTION_ALLOW; + } + + /* Allow the change */ + return MODEACTION_DENY; +} + +unsigned int ModeUserServerNotice::GetCount() +{ + return count; +} diff --git a/src/modes/umode_w.cpp b/src/modes/umode_w.cpp index 21c007655..383c91f6e 100644 --- a/src/modes/umode_w.cpp +++ b/src/modes/umode_w.cpp @@ -1 +1,46 @@ -/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/umode_w.h"
ModeUserWallops::ModeUserWallops(InspIRCd* Instance) : ModeHandler(Instance, 'w', 0, 0, false, MODETYPE_USER, false)
{
}
ModeAction ModeUserWallops::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
/* Only opers can change other users modes */
if ((source != dest) && (!*source->oper))
return MODEACTION_DENY;
/* Set the bitfields */
if (dest->modes[UM_WALLOPS] != adding)
{
dest->modes[UM_WALLOPS] = adding;
this->count += (adding ? 1: -1);
return MODEACTION_ALLOW;
}
/* Allow the change */
return MODEACTION_DENY;
}
unsigned int ModeUserWallops::GetCount()
{
return count;
}
\ No newline at end of file +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "mode.h" +#include "channels.h" +#include "users.h" +#include "modes/umode_w.h" + +ModeUserWallops::ModeUserWallops(InspIRCd* Instance) : ModeHandler(Instance, 'w', 0, 0, false, MODETYPE_USER, false) +{ +} + +ModeAction ModeUserWallops::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +{ + /* Only opers can change other users modes */ + if ((source != dest) && (!*source->oper)) + return MODEACTION_DENY; + + /* Set the bitfields */ + if (dest->modes[UM_WALLOPS] != adding) + { + dest->modes[UM_WALLOPS] = adding; + this->count += (adding ? 1: -1); + return MODEACTION_ALLOW; + } + + /* Allow the change */ + return MODEACTION_DENY; +} + +unsigned int ModeUserWallops::GetCount() +{ + return count; +} + |