switch (MASK)
{
case UCMODE_OP:
- d->chans[i].channel->AddOppedUser((char*)d);
+ d->chans[i].channel->AddOppedUser(d);
break;
case UCMODE_HOP:
- d->chans[i].channel->AddHalfoppedUser((char*)d);
+ d->chans[i].channel->AddHalfoppedUser(d);
break;
case UCMODE_VOICE:
- d->chans[i].channel->AddVoicedUser((char*)d);
+ d->chans[i].channel->AddVoicedUser(d);
break;
}
log(DEBUG,"grant: %s %s",d->chans[i].channel->name,d->nick);
switch (MASK)
{
case UCMODE_OP:
- d->chans[i].channel->DelOppedUser((char*)d);
+ d->chans[i].channel->DelOppedUser(d);
break;
case UCMODE_HOP:
- d->chans[i].channel->DelHalfoppedUser((char*)d);
+ d->chans[i].channel->DelHalfoppedUser(d);
break;
case UCMODE_VOICE:
- d->chans[i].channel->DelVoicedUser((char*)d);
+ d->chans[i].channel->DelVoicedUser(d);
break;
}
log(DEBUG,"revoke: %s %s",d->chans[i].channel->name,d->nick);
if (d)
{
- if (user->server == d->server)
+ if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_OP));
return NULL;
if (MOD_RESULT == ACR_DEFAULT)
{
- if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ if ((status < STATUS_OP) && (!is_uline(user->server)))
{
- log(DEBUG,"%s cant give ops to %s because they have status %d and needs %d",user->nick,dest,status,STATUS_OP);
WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
return NULL;
}
if (d)
{
- if (user->server == d->server)
+ if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_HALFOP));
return NULL;
if (MOD_RESULT == ACR_DEFAULT)
{
- if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ 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;
if (d)
{
- if (user->server == d->server)
+ if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_VOICE));
return NULL;
if (MOD_RESULT == ACR_DEFAULT)
{
- if ((status < STATUS_HOP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ if ((status < STATUS_HOP) && (!is_uline(user->server)))
{
WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, chan->name);
return NULL;
if (d)
{
- if (user->server == d->server)
+ if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEOP));
return NULL;
if (MOD_RESULT == ACR_DEFAULT)
{
- if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)) && (IS_LOCAL(user)))
+ 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;
if (d)
{
- if (user->server == d->server)
+ if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEHALFOP));
if (MOD_RESULT == ACR_DEFAULT)
{
/* Tweak by Brain suggested by w00t, allow a halfop to dehalfop themselves */
- if ((user != d) && ((status < STATUS_OP) && (!is_uline(user->server))) && (IS_LOCAL(user)))
+ 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);
return NULL;
if (d)
{
- if (user->server == d->server)
+ if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEVOICE));
return NULL;
if (MOD_RESULT == ACR_DEFAULT)
{
- if ((status < STATUS_HOP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ if ((status < STATUS_HOP) && (!is_uline(user->server)))
{
WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, chan->name);
return NULL;
return NULL;
}
-// tidies up redundant modes, e.g. +nt-nt+i becomes +-+i,
-// a section further down the chain tidies up the +-+- crap.
+
+/** ModeParser::CompressModes()
+ * Tidies up redundant modes,
+ * e.g. +nt-nt+i becomes +-+i
+ * A section further down the chain tidies up the +-+- crap.
+ */
std::string ModeParser::CompressModes(std::string modes,bool channelmodes)
{
- int counts[127];
+ /*
+ * OK, iterate over the mode string and count how many times a certain mode appears in it.
+ * Then, erase all instances of any character that appears more than once.
+ * This only operates on modes with no parameters, you can still +v-v+v-v+v-v to your heart's content.
+ */
+
+ /* Do we really need an int here? Can you fit enough modes in a line to overflow a short? */
+ short counts[127];
bool active[127];
- memset(counts,0,sizeof(counts));
- memset(active,0,sizeof(active));
- for (unsigned int i = 0; i < modes.length(); i++)
+ memset(counts, 0, sizeof(counts));
+ memset(active, 0, sizeof(active));
+
+ for(unsigned char* i = (unsigned char*)modes.c_str(); *i; i++)
{
- if ((modes[i] == '+') || (modes[i] == '-'))
+ if((*i == '+') || (*i == '-'))
continue;
- if (channelmodes)
- {
- if ((strchr("itnmsp",modes[i])) || ((ModeDefined(modes[i],MT_CHANNEL)) && (ModeDefinedOn(modes[i],MT_CHANNEL)==0) && (ModeDefinedOff(modes[i],MT_CHANNEL)==0)))
- {
- log(DEBUG,"Tidy mode %c",modes[i]);
- counts[(unsigned int)modes[i]]++;
- active[(unsigned int)modes[i]] = true;
- }
- }
- else
+
+ if(!channelmodes || (channelmodes && (strchr("itnmsp", *i) || (ModeDefined(*i, MT_CHANNEL) && !ModeDefinedOn(*i,MT_CHANNEL) && !ModeDefinedOff(*i,MT_CHANNEL)))))
{
- log(DEBUG,"Tidy mode %c",modes[i]);
- counts[(unsigned int)modes[i]]++;
- active[(unsigned int)modes[i]] = true;
+ log(DEBUG,"Tidy mode %c", *i);
+ counts[*i]++;
+ active[*i] = true;
}
}
- for (int j = 65; j < 127; j++)
+
+ for(unsigned char j = 65; j < 127; j++)
{
if ((counts[j] > 1) && (active[j] == true))
{
- static char v[2];
- v[0] = (unsigned char)j;
- v[1] = '\0';
- std::string mode_str = v;
- std::string::size_type pos = modes.find(mode_str);
- if (pos != std::string::npos)
+ std::string::size_type pos;
+
+ while((pos = modes.find(j)) != std::string::npos)
{
- log(DEBUG,"all occurances of mode %c to be deleted...",(unsigned char)j);
- while (modes.find(mode_str) != std::string::npos)
- modes.erase(modes.find(mode_str),1);
- log(DEBUG,"New mode line: %s",modes.c_str());
+ log(DEBUG, "Deleting occurence of mode %c...", j);
+ modes.erase(pos, 1);
+ log(DEBUG,"New mode line: %s", modes.c_str());
}
}
}
+
return modes;
}
}
char outlist[MAXBUF];
+ char mlist[MAXBUF];
char *outpars[32];
int param = 2;
int pc = 0;
return;
}
- char* modelist = parameters[1]; /* mode list, e.g. +oo-o *
- * parameters[2] onwards are parameters for
- * modes that require them :) */
+ std::string tidied = this->CompressModes(parameters[1],true);
+ strlcpy(mlist,tidied.c_str(),MAXBUF);
+ char* modelist = mlist;
+
*outlist = *modelist;
char* outl = outlist+1;
log(DEBUG,"process_modes: modelist: %s",modelist);
- std::string tidied = this->CompressModes(modelist,true);
- strlcpy(modelist,tidied.c_str(),MAXBUF);
-
int len = tidied.length();
while (modelist[len-1] == ' ')
modelist[--len] = '\0';
FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'o', parameters[param], true, 1));
if (!MOD_RESULT)
{
- log(DEBUG,"calling GiveOps");
r = GiveOps(user,parameters[param++],chan,status);
}
else param++;
FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'o', parameters[param], false, 1));
if (!MOD_RESULT)
{
- log(DEBUG,"calling TakeOps");
r = TakeOps(user,parameters[param++],chan,status);
}
else param++;
break;
default:
- log(DEBUG,"Preprocessing custom mode %c: modelist: %s",*modechar,chan->custom_modes);
string_list p;
p.clear();
- if (((!strchr(chan->custom_modes,*modechar)) && (!mdir)) || ((strchr(chan->custom_modes,*modechar)) && (mdir)))
+ bool x = chan->custom_modes[*modechar-65];
+ if ((!x && !mdir) || (x && mdir))
{
if (!ModeIsListMode(*modechar,MT_CHANNEL))
{
}
if (ModeDefined(*modechar,MT_CHANNEL))
{
- log(DEBUG,"A module has claimed this mode");
+ /* A module has claimed this mode */
if (param<pcnt)
{
if ((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir))
}
else
{
- if (param < pcnt)
+ *outl++ = *modechar;
+ chan->SetCustomMode(*modechar,mdir);
+ // include parameters in output if mode has them
+ if ((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir))
{
- *outl++ = *modechar;
- chan->SetCustomMode(*modechar,mdir);
- // include parameters in output if mode has them
- if ((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir))
+ if (param < pcnt)
{
- chan->SetCustomModeParam(modelist[ptr],parameters[param],mdir);
+ chan->SetCustomModeParam(*modechar,parameters[param],mdir);
outpars[pc++] = parameters[param++];
}
}
bool ModeParser::AllowedUmode(char umode, char* sourcemodes,bool adding,bool serveroverride)
{
+ bool sourceoper = (strchr(sourcemodes,'o') != NULL);
log(DEBUG,"Allowed_umode: %c %s",umode,sourcemodes);
// Servers can +o and -o arbitrarily
if ((serveroverride == true) && (umode == 'o'))
// RFC1459 specified modes
if ((umode == 'w') || (umode == 's') || (umode == 'i'))
{
- log(DEBUG,"umode %c allowed by RFC1459 scemantics",umode);
+ /* umode allowed by RFC1459 scemantics */
return true;
}
- // user may not +o themselves or others, but an oper may de-oper other opers or themselves
- if ((strchr(sourcemodes,'o')) && (!adding))
+ /* user may not +o themselves or others, but an oper may de-oper other opers or themselves */
+ if (sourceoper && !adding)
{
- log(DEBUG,"umode %c allowed by RFC1459 scemantics",umode);
return true;
}
else if (umode == 'o')
{
- log(DEBUG,"umode %c allowed by RFC1459 scemantics",umode);
+ /* Bad oper, bad bad! */
return false;
}
- // process any module-defined modes that need oper
- if ((ModeDefinedOper(umode,MT_CLIENT)) && (strchr(sourcemodes,'o')))
+ /* process any module-defined modes that need oper */
+ if ((ModeDefinedOper(umode,MT_CLIENT)) && (sourceoper))
{
log(DEBUG,"umode %c allowed by module handler (oper only mode)",umode);
return true;
}
- else
- if (ModeDefined(umode,MT_CLIENT))
+ else if (ModeDefined(umode,MT_CLIENT))
{
// process any module-defined modes that don't need oper
log(DEBUG,"umode %c allowed by module handler (non-oper mode)",umode);
- if ((ModeDefinedOper(umode,MT_CLIENT)) && (!strchr(sourcemodes,'o')))
+ if ((ModeDefinedOper(umode,MT_CLIENT)) && (!sourceoper))
{
// no, this mode needs oper, and this user 'aint got what it takes!
return false;
void cmd_mode::Handle (char **parameters, int pcnt, userrec *user)
{
chanrec* Ptr;
- userrec* dest;
+ userrec* dest = Find(parameters[0]);
int can_change;
int direction = 1;
char outpars[MAXBUF];
bool next_ok = true;
- dest = Find(parameters[0]);
-
if (!user)
- {
return;
- }
if ((dest) && (pcnt == 1))
{
WriteServ(user->fd,"221 %s :+%s",dest->nick,dest->modes);
return;
}
-
- if ((dest) && (pcnt > 1))
+ else if ((dest) && (pcnt > 1))
{
std::string tidied = ServerInstance->ModeGrok->CompressModes(parameters[1],false);
parameters[1] = (char*)tidied.c_str();
can_change = 0;
if (user != dest)
{
- if ((strchr(user->modes,'o')) || (is_uline(user->server)))
+ if ((*user->oper) || (is_uline(user->server)))
{
can_change = 1;
}
for (char* i = parameters[1]; *i; i++)
{
- if (*i == ' ')
- continue;
-
if ((i != parameters[1]) && (*i != '+') && (*i != '-'))
next_ok = true;
- if (*i == '+')
+ switch (*i)
{
- if ((direction != 1) && (next_ok))
- {
- charlcat(outpars,'+',MAXBUF);
- next_ok = false;
- }
- direction = 1;
- }
- else
- if (*i == '-')
- {
- if ((direction != 0) && (next_ok))
- {
- charlcat(outpars,'-',MAXBUF);
- next_ok = false;
- }
- direction = 0;
- }
- else
- {
- can_change = 0;
- if (strchr(user->modes,'o'))
- {
- can_change = 1;
- }
- else
- {
- if ((*i == 'i') || (*i == 'w') || (*i == 's') || (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,direction,false)))
+ case ' ':
+ continue;
+
+ case '+':
+ if ((direction != 1) && (next_ok))
+ {
+ charlcat(outpars,'+',MAXBUF);
+ next_ok = false;
+ }
+ direction = 1;
+ break;
+
+ case '-':
+ if ((direction != 0) && (next_ok))
+ {
+ charlcat(outpars,'-',MAXBUF);
+ next_ok = false;
+ }
+ direction = 0;
+ break;
+
+ default:
+ can_change = 0;
+ if (*user->oper)
{
can_change = 1;
}
- }
- if (can_change)
- {
- if (direction == 1)
+ else
{
- if ((!strchr(dmodes,*i)) && (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,true,false)))
+ if ((*i == 'i') || (*i == 'w') || (*i == 's') || (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,direction,false)))
{
- if ((ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)) || (*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o'))
+ can_change = 1;
+ }
+ }
+ if (can_change)
+ {
+ if (direction == 1)
+ {
+ if ((!strchr(dmodes,*i)) && (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,true,false)))
{
- charlcat(dmodes,*i,MAXMODES);
- charlcat(outpars,*i,MAXMODES);
- if (*i == 'o')
+ if ((ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)) || (*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o'))
{
- FOREACH_MOD(I_OnGlobalOper,OnGlobalOper(dest));
+ charlcat(dmodes,*i,53);
+ charlcat(outpars,*i,MAXMODES);
+ if (*i == 'o')
+ {
+ FOREACH_MOD(I_OnGlobalOper,OnGlobalOper(dest));
+ }
}
}
}
- }
- else
- {
- if ((ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,false,false)) && (strchr(dmodes,*i)))
+ else
{
- if ((ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)) || (*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o'))
+ if ((ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,false,false)) && (strchr(dmodes,*i)))
{
- charlcat(outpars,*i,MAXMODES);
- charremove(dmodes,*i);
- if (*i == 'o')
+ if ((ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)) || (*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o'))
{
- *dest->oper = 0;
- DeleteOper(dest);
+ charlcat(outpars,*i,MAXMODES);
+ charremove(dmodes,*i);
+ if (*i == 'o')
+ {
+ *dest->oper = 0;
+ DeleteOper(dest);
+ }
}
}
}
}
- }
+ break;
}
}
if (*outpars)
return;
}
-
- Ptr = FindChan(parameters[0]);
- if (Ptr)
+ else
{
- if (pcnt == 1)
- {
- /* just /modes #channel */
- WriteServ(user->fd,"324 %s %s +%s",user->nick, Ptr->name, chanmodes(Ptr,has_channel(user,Ptr)));
- WriteServ(user->fd,"329 %s %s %d", user->nick, Ptr->name, Ptr->created);
- return;
- }
- else
- if (pcnt == 2)
+ Ptr = FindChan(parameters[0]);
+ if (Ptr)
{
- char* mode = parameters[1];
- if (*mode == '+')
- mode++;
- int MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, Ptr, *mode, "", false, 0));
- if (!MOD_RESULT)
- {
- if (*mode == 'b')
- {
-
- for (BanList::iterator i = Ptr->bans.begin(); i != Ptr->bans.end(); i++)
+ if (pcnt == 1)
+ {
+ /* just /modes #channel */
+ WriteServ(user->fd,"324 %s %s +%s",user->nick, Ptr->name, chanmodes(Ptr,Ptr->HasUser(user)));
+ WriteServ(user->fd,"329 %s %s %d", user->nick, Ptr->name, Ptr->created);
+ return;
+ }
+ else if (pcnt == 2)
+ {
+ char* mode = parameters[1];
+ if (*mode == '+')
+ mode++;
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, Ptr, *mode, "", false, 0));
+ if (!MOD_RESULT)
+ {
+ if (*mode == 'b')
{
- WriteServ(user->fd,"367 %s %s %s %s %d",user->nick, Ptr->name, i->data, i->set_by, i->set_time);
+ for (BanList::iterator i = Ptr->bans.begin(); i != Ptr->bans.end(); i++)
+ {
+ WriteServ(user->fd,"367 %s %s %s %s %d",user->nick, Ptr->name, i->data, i->set_by, i->set_time);
+ }
+ WriteServ(user->fd,"368 %s %s :End of channel ban list",user->nick, Ptr->name);
+ return;
+ }
+ if ((ModeDefined(*mode,MT_CHANNEL)) && (ModeIsListMode(*mode,MT_CHANNEL)))
+ {
+ // list of items for an extmode
+ log(DEBUG,"Calling OnSendList for all modules, list output for mode %c",*mode);
+ FOREACH_MOD(I_OnSendList,OnSendList(user,Ptr,*mode));
+ return;
}
- WriteServ(user->fd,"368 %s %s :End of channel ban list",user->nick, Ptr->name);
- return;
- }
- if ((ModeDefined(*mode,MT_CHANNEL)) && (ModeIsListMode(*mode,MT_CHANNEL)))
- {
- // list of items for an extmode
- log(DEBUG,"Calling OnSendList for all modules, list output for mode %c",*mode);
- FOREACH_MOD(I_OnSendList,OnSendList(user,Ptr,*mode));
- return;
}
}
- }
- if (((Ptr) && (!has_channel(user,Ptr))) && (!is_uline(user->server)) && (IS_LOCAL(user)))
- {
- WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name);
- return;
- }
-
- if (Ptr)
- {
- int MOD_RESULT = 0;
- FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,NULL,Ptr,AC_GENERAL_MODE));
-
- if (MOD_RESULT == ACR_DENY)
- return;
- if (MOD_RESULT == ACR_DEFAULT)
+ if ((IS_LOCAL(user)) && (!is_uline(user->server)) && (!Ptr->HasUser(user)))
+ {
+ WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name);
+ return;
+ }
+
+ if (Ptr)
{
- if ((cstatus(user,Ptr) < STATUS_HOP) && (IS_LOCAL(user)))
- {
- WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, Ptr->name);
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,NULL,Ptr,AC_GENERAL_MODE));
+
+ if (MOD_RESULT == ACR_DENY)
return;
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ if ((IS_LOCAL(user)) && (cstatus(user,Ptr) < STATUS_HOP))
+ {
+ WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, Ptr->name);
+ return;
+ }
}
+
+ ServerInstance->ModeGrok->ProcessModes(parameters,user,Ptr,cstatus(user,Ptr),pcnt,false,false,false);
}
-
- ServerInstance->ModeGrok->ProcessModes(parameters,user,Ptr,cstatus(user,Ptr),pcnt,false,false,false);
}
- }
- else
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
+ else
+ {
+ WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
+ }
}
}
void ModeParser::ServerMode(char **parameters, int pcnt, userrec *user)
{
chanrec* Ptr;
- userrec* dest;
+ userrec* dest = Find(parameters[0]);
int can_change;
int direction = 1;
char outpars[MAXBUF];
bool next_ok = true;
- dest = Find(parameters[0]);
-
- // fix: ChroNiCk found this - we cant use this as debug if its null!
- if (dest)
- {
- log(DEBUG,"server_mode on %s",dest->nick);
- }
-
if ((dest) && (pcnt > 1))
{
std::string tidied = ServerInstance->ModeGrok->CompressModes(parameters[1],false);
for (char* i = parameters[1]; *i; i++)
{
- if (*i == ' ')
- continue;
-
if ((i != parameters[1]) && (*i != '+') && (*i != '-'))
next_ok = true;
- if (*i == '+')
- {
- if ((direction != 1) && (next_ok))
- {
- next_ok = false;
- charlcat(outpars,'+',MAXBUF);
- }
- direction = 1;
- }
- else
- if (*i == '-')
- {
- if ((direction != 0) && (next_ok))
- {
- next_ok = false;
- charlcat(outpars,'-',MAXBUF);
- }
- direction = 0;
- }
- else
+ switch (*i)
{
- log(DEBUG,"begin mode processing entry");
- can_change = 1;
- if (can_change)
- {
- if (direction == 1)
+ case ' ':
+ continue;
+
+ case '+':
+ if ((direction != 1) && (next_ok))
+ {
+ next_ok = false;
+ charlcat(outpars,'+',MAXBUF);
+ }
+ direction = 1;
+ break;
+
+ case '-':
+ if ((direction != 0) && (next_ok))
+ {
+ next_ok = false;
+ charlcat(outpars,'-',MAXBUF);
+ }
+ direction = 0;
+ break;
+
+ default:
+ log(DEBUG,"begin mode processing entry");
+ can_change = 1;
+ if (can_change)
{
- log(DEBUG,"umode %c being added",*i);
- if ((!strchr(dmodes,*i)) && (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,true,true)))
+ if (direction == 1)
{
- log(DEBUG,"umode %c is an allowed umode",*i);
- if ((ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)) || (*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o'))
+ log(DEBUG,"umode %c being added",*i);
+ if ((!strchr(dmodes,*i)) && (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,true,true)))
{
- charlcat(dmodes,*i,MAXMODES);
- charlcat(outpars,*i,MAXMODES);
+ log(DEBUG,"umode %c is an allowed umode",*i);
+ if ((*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o') || (ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)))
+ {
+ charlcat(dmodes,*i,MAXBUF);
+ charlcat(outpars,*i,53);
+ }
}
}
- }
- else
- {
- // can only remove a mode they already have
- log(DEBUG,"umode %c being removed",*i);
- if ((ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,false,true)) && (strchr(dmodes,*i)))
+ else
{
- log(DEBUG,"umode %c is an allowed umode",*i);
- if ((ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)) || (*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o'))
+ // can only remove a mode they already have
+ log(DEBUG,"umode %c being removed",*i);
+ if ((ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,false,true)) && (strchr(dmodes,*i)))
{
- charlcat(outpars,*i,MAXMODES);
- charremove(dmodes,*i);
+ log(DEBUG,"umode %c is an allowed umode",*i);
+ if ((*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o') || (ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)))
+ {
+ charlcat(outpars,*i,MAXBUF);
+ charremove(dmodes,*i);
+ }
}
}
}
- }
+ break;
}
}
if (*outpars)