+ return d;
+}
+
+char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK)
+{
+ for (unsigned int i = 0; i < d->chans.size(); i++)
+ {
+ if ((d->chans[i].channel != NULL) && (chan != NULL))
+ if (d->chans[i].channel == chan)
+ {
+ if (d->chans[i].uc_modes & MASK)
+ {
+ return NULL;
+ }
+ d->chans[i].uc_modes = d->chans[i].uc_modes | MASK;
+ switch (MASK)
+ {
+ case UCMODE_OP:
+ d->chans[i].channel->AddOppedUser(d);
+ break;
+ case UCMODE_HOP:
+ d->chans[i].channel->AddHalfoppedUser(d);
+ break;
+ case UCMODE_VOICE:
+ d->chans[i].channel->AddVoicedUser(d);
+ break;
+ }
+ log(DEBUG,"grant: %s %s",d->chans[i].channel->name,d->nick);
+ return d->nick;
+ }
+ }
+ return NULL;
+}
+
+char* ModeParser::Revoke(userrec *d,chanrec *chan,int MASK)
+{
+ for (unsigned int i = 0; i < d->chans.size(); i++)
+ {
+ if ((d->chans[i].channel != NULL) && (chan != NULL))
+ if (d->chans[i].channel == chan)
+ {
+ if ((d->chans[i].uc_modes & MASK) == 0)
+ {
+ return NULL;
+ }
+ d->chans[i].uc_modes ^= MASK;
+ switch (MASK)
+ {
+ case UCMODE_OP:
+ d->chans[i].channel->DelOppedUser(d);
+ break;
+ case UCMODE_HOP:
+ d->chans[i].channel->DelHalfoppedUser(d);
+ break;
+ case UCMODE_VOICE:
+ d->chans[i].channel->DelVoicedUser(d);
+ break;
+ }
+ log(DEBUG,"revoke: %s %s",d->chans[i].channel->name,d->nick);
+ return d->nick;
+ }
+ }
+ return NULL;
+}
+
+char* ModeParser::GiveOps(userrec *user,char *dest,chanrec *chan,int status)
+{
+ userrec *d = this->SanityChecks(user,dest,chan,status);
+
+ if (d)