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:
brain 2006-07-08 15:05:33 +00:00
parent ed351d92cf
commit 2f32d64790
4 changed files with 156 additions and 91 deletions

View File

@ -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
View 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 &parameter, 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);
};

View File

@ -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
View 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 &parameter, 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 "";
}