mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Add cmode +o (op/deop) and in the process change a lot of char* to const char* to avoid unneccessary casts
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4165 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
parent
ed351d92cf
commit
2f32d64790
@ -228,21 +228,23 @@ class ModeParser
|
||||
* we have 256 lists of them.
|
||||
*/
|
||||
std::vector<ModeWatcher*> modewatchers[256];
|
||||
|
||||
char* GiveOps(userrec *user,char *dest,chanrec *chan,int status);
|
||||
char* GiveHops(userrec *user,char *dest,chanrec *chan,int status);
|
||||
|
||||
/*char* GiveHops(userrec *user,char *dest,chanrec *chan,int status);
|
||||
char* GiveVoice(userrec *user,char *dest,chanrec *chan,int status);
|
||||
char* TakeOps(userrec *user,char *dest,chanrec *chan,int status);
|
||||
char* TakeHops(userrec *user,char *dest,chanrec *chan,int status);
|
||||
char* TakeVoice(userrec *user,char *dest,chanrec *chan,int status);
|
||||
userrec* SanityChecks(userrec *user,char *dest,chanrec *chan,int status);
|
||||
char* Grant(userrec *d,chanrec *chan,int MASK);
|
||||
char* Revoke(userrec *d,chanrec *chan,int MASK);
|
||||
char* TakeVoice(userrec *user,char *dest,chanrec *chan,int status);*/
|
||||
|
||||
public:
|
||||
|
||||
ModeParser();
|
||||
|
||||
static userrec* SanityChecks(userrec *user,const char *dest,chanrec *chan,int status);
|
||||
static const char* Grant(userrec *d,chanrec *chan,int MASK);
|
||||
static const char* Revoke(userrec *d,chanrec *chan,int MASK);
|
||||
static void CleanMask(std::string &mask);
|
||||
|
||||
bool AddMode(ModeHandler* mh, unsigned const char modeletter);
|
||||
void Process(char **parameters, int pcnt, userrec *user, bool servermode);
|
||||
static void CleanMask(std::string &mask);
|
||||
};
|
||||
|
||||
class cmd_mode : public command_t
|
||||
|
13
include/modes/cmode_o.h
Normal file
13
include/modes/cmode_o.h
Normal file
@ -0,0 +1,13 @@
|
||||
#include "mode.h"
|
||||
#include "channels.h"
|
||||
|
||||
class ModeChannelOp : public ModeHandler
|
||||
{
|
||||
private:
|
||||
public:
|
||||
ModeChannelOp();
|
||||
ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding);
|
||||
std::string AddOp(userrec *user,const char *dest,chanrec *chan,int status);
|
||||
std::string DelOp(userrec *user,const char *dest,chanrec *chan,int status);
|
||||
};
|
||||
|
110
src/mode.cpp
110
src/mode.cpp
@ -132,7 +132,7 @@ void ModeWatcher::AfterMode(userrec* source, userrec* dest, chanrec* channel, co
|
||||
{
|
||||
}
|
||||
|
||||
userrec* ModeParser::SanityChecks(userrec *user,char *dest,chanrec *chan,int status)
|
||||
userrec* ModeParser::SanityChecks(userrec *user,const char *dest,chanrec *chan,int status)
|
||||
{
|
||||
userrec *d;
|
||||
if ((!user) || (!dest) || (!chan) || (!*dest))
|
||||
@ -148,101 +148,75 @@ userrec* ModeParser::SanityChecks(userrec *user,char *dest,chanrec *chan,int sta
|
||||
return d;
|
||||
}
|
||||
|
||||
char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK)
|
||||
const char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK)
|
||||
{
|
||||
if (!chan)
|
||||
return NULL;
|
||||
return "";
|
||||
|
||||
for (std::vector<ucrec*>::const_iterator i = d->chans.begin(); i != d->chans.end(); i++)
|
||||
{
|
||||
if (((ucrec*)(*i))->channel == chan)
|
||||
ucrec* n = (ucrec*)(*i);
|
||||
if (n->channel == chan)
|
||||
{
|
||||
if (((ucrec*)(*i))->uc_modes & MASK)
|
||||
if (n->uc_modes & MASK)
|
||||
{
|
||||
return NULL;
|
||||
return "";
|
||||
}
|
||||
((ucrec*)(*i))->uc_modes = ((ucrec*)(*i))->uc_modes | MASK;
|
||||
n->uc_modes = ((ucrec*)(*i))->uc_modes | MASK;
|
||||
switch (MASK)
|
||||
{
|
||||
case UCMODE_OP:
|
||||
((ucrec*)(*i))->channel->AddOppedUser(d);
|
||||
n->channel->AddOppedUser(d);
|
||||
break;
|
||||
case UCMODE_HOP:
|
||||
((ucrec*)(*i))->channel->AddHalfoppedUser(d);
|
||||
n->channel->AddHalfoppedUser(d);
|
||||
break;
|
||||
case UCMODE_VOICE:
|
||||
((ucrec*)(*i))->channel->AddVoicedUser(d);
|
||||
n->channel->AddVoicedUser(d);
|
||||
break;
|
||||
}
|
||||
log(DEBUG,"grant: %s %s",((ucrec*)(*i))->channel->name,d->nick);
|
||||
log(DEBUG,"grant: %s %s",n->channel->name,d->nick);
|
||||
return d->nick;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
return "";
|
||||
}
|
||||
|
||||
char* ModeParser::Revoke(userrec *d,chanrec *chan,int MASK)
|
||||
const char* ModeParser::Revoke(userrec *d,chanrec *chan,int MASK)
|
||||
{
|
||||
if (!chan)
|
||||
return NULL;
|
||||
return "";
|
||||
|
||||
for (std::vector<ucrec*>::const_iterator i = d->chans.begin(); i != d->chans.end(); i++)
|
||||
{
|
||||
if (((ucrec*)(*i))->channel == chan)
|
||||
ucrec* n = (ucrec*)(*i);
|
||||
if (n->channel == chan)
|
||||
{
|
||||
if ((((ucrec*)(*i))->uc_modes & MASK) == 0)
|
||||
if ((n->uc_modes & MASK) == 0)
|
||||
{
|
||||
return NULL;
|
||||
return "";
|
||||
}
|
||||
((ucrec*)(*i))->uc_modes ^= MASK;
|
||||
n->uc_modes ^= MASK;
|
||||
switch (MASK)
|
||||
{
|
||||
case UCMODE_OP:
|
||||
((ucrec*)(*i))->channel->DelOppedUser(d);
|
||||
n->channel->DelOppedUser(d);
|
||||
break;
|
||||
case UCMODE_HOP:
|
||||
((ucrec*)(*i))->channel->DelHalfoppedUser(d);
|
||||
n->channel->DelHalfoppedUser(d);
|
||||
break;
|
||||
case UCMODE_VOICE:
|
||||
((ucrec*)(*i))->channel->DelVoicedUser(d);
|
||||
n->channel->DelVoicedUser(d);
|
||||
break;
|
||||
}
|
||||
log(DEBUG,"revoke: %s %s",((ucrec*)(*i))->channel->name,d->nick);
|
||||
log(DEBUG,"revoke: %s %s",n->channel->name,d->nick);
|
||||
return d->nick;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
return "";
|
||||
}
|
||||
|
||||
char* ModeParser::GiveOps(userrec *user,char *dest,chanrec *chan,int status)
|
||||
{
|
||||
userrec *d = this->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 NULL;
|
||||
if (MOD_RESULT == ACR_DEFAULT)
|
||||
{
|
||||
if ((status < STATUS_OP) && (!is_uline(user->server)))
|
||||
{
|
||||
WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this->Grant(d,chan,UCMODE_OP);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* ModeParser::GiveHops(userrec *user,char *dest,chanrec *chan,int status)
|
||||
/*char* ModeParser::GiveHops(userrec *user,char *dest,chanrec *chan,int status)
|
||||
{
|
||||
userrec *d = this->SanityChecks(user,dest,chan,status);
|
||||
|
||||
@ -298,34 +272,6 @@ char* ModeParser::GiveVoice(userrec *user,char *dest,chanrec *chan,int status)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* ModeParser::TakeOps(userrec *user,char *dest,chanrec *chan,int status)
|
||||
{
|
||||
userrec *d = this->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 NULL;
|
||||
if (MOD_RESULT == ACR_DEFAULT)
|
||||
{
|
||||
if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
|
||||
{
|
||||
WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this->Revoke(d,chan,UCMODE_OP);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* ModeParser::TakeHops(userrec *user,char *dest,chanrec *chan,int status)
|
||||
{
|
||||
userrec *d = this->SanityChecks(user,dest,chan,status);
|
||||
@ -341,7 +287,7 @@ char* ModeParser::TakeHops(userrec *user,char *dest,chanrec *chan,int status)
|
||||
return NULL;
|
||||
if (MOD_RESULT == ACR_DEFAULT)
|
||||
{
|
||||
/* Tweak by Brain suggested by w00t, allow a halfop to dehalfop themselves */
|
||||
// Tweak by Brain suggested by w00t, allow a halfop to dehalfop themselves
|
||||
if ((user != d) && ((status < STATUS_OP) && (!is_uline(user->server))))
|
||||
{
|
||||
WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
|
||||
@ -381,7 +327,7 @@ char* ModeParser::TakeVoice(userrec *user,char *dest,chanrec *chan,int status)
|
||||
return this->Revoke(d,chan,UCMODE_VOICE);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
}*/
|
||||
|
||||
void ModeParser::Process(char **parameters, int pcnt, userrec *user, bool servermode)
|
||||
{
|
||||
|
104
src/modes/cmode_o.cpp
Normal file
104
src/modes/cmode_o.cpp
Normal file
@ -0,0 +1,104 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "inspircd_config.h"
|
||||
#include "configreader.h"
|
||||
#include "hash_map.h"
|
||||
#include "inspircd.h"
|
||||
#include "mode.h"
|
||||
#include "channels.h"
|
||||
#include "users.h"
|
||||
#include "helperfuncs.h"
|
||||
#include "message.h"
|
||||
#include "commands.h"
|
||||
#include "modules.h"
|
||||
#include "inspstring.h"
|
||||
#include "hashcomp.h"
|
||||
#include "modes/cmode_o.h"
|
||||
|
||||
extern InspIRCd* ServerInstance;
|
||||
extern ServerConfig* Config;
|
||||
extern std::vector<Module*> modules;
|
||||
extern std::vector<ircd_module*> factory;
|
||||
extern int MODCOUNT;
|
||||
extern time_t TIME;
|
||||
|
||||
ModeChannelOp::ModeChannelOp() : ModeHandler('o', 1, 1, true, MODETYPE_CHANNEL, false)
|
||||
{
|
||||
}
|
||||
|
||||
ModeAction ModeChannelOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
|
||||
{
|
||||
int status = cstatus(source, channel);
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
return MODEACTION_ALLOW;
|
||||
}
|
||||
|
||||
std::string ModeChannelOp::AddOp(userrec *user,const char* dest,chanrec *chan,int status)
|
||||
{
|
||||
userrec *d = ModeParser::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) && (!is_uline(user->server)))
|
||||
{
|
||||
WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ModeParser::Grant(d,chan,UCMODE_OP);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string ModeChannelOp::DelOp(userrec *user,const char *dest,chanrec *chan,int status)
|
||||
{
|
||||
userrec *d = ModeParser::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) && (!is_uline(user->server)) && (IS_LOCAL(user)))
|
||||
{
|
||||
WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ModeParser::Revoke(d,chan,UCMODE_OP);
|
||||
}
|
||||
return "";
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user