- /*
- * Handles an SAMODE request. Notifies all +s users.
- */
- std::string result;
- Srv->Log(DEBUG,"SAMODE: Being handled");
- userrec* n = new userrec(ServerInstance);
- n->fd = FD_MAGIC_NUMBER;
- Srv->SendMode(parameters,pcnt,n);
- delete n;
- Srv->Log(DEBUG,"SAMODE: Modechange handled");
- result = std::string(user->nick);
- result.append(" used SAMODE");
- for (int n = 0; n < pcnt; n++)
+ if (parameters[0].c_str()[0] != '#')
+ {
+ User* target = ServerInstance->FindNickOnly(parameters[0]);
+ if ((!target) || (target->registered != REG_ALL))
+ {
+ user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel", user->nick.c_str(), parameters[0].c_str());
+ return CMD_FAILURE;
+ }
+
+ // Changing the modes of another user requires a special permission
+ if ((target != user) && (!user->HasPrivPermission("users/samode-usermodes", true)))
+ return CMD_FAILURE;
+ }
+
+ // XXX: Make ModeParser clear LastParse
+ Modes::ChangeList emptychangelist;
+ ServerInstance->Modes->ProcessSingle(ServerInstance->FakeClient, NULL, ServerInstance->FakeClient, emptychangelist);
+
+ this->active = true;
+ CmdResult result = ServerInstance->Parser.CallHandler("MODE", parameters, user);
+ this->active = false;
+
+ if (result == CMD_SUCCESS)