Simplify /SAJOIN syntax and add permission for joining other users.

This commit is contained in:
Daniel Vassdal 2013-11-12 10:10:25 -08:00 committed by Attila Molnar
parent 0ada3aeb10
commit 8af4a2795b
2 changed files with 19 additions and 8 deletions

View File

@ -1528,6 +1528,8 @@
# SAJOIN module: Adds the /SAJOIN command
# This module is oper-only.
# To use, SAJOIN must be in one of your oper class blocks.
# Opers need the users/sajoin-others priv to be able to /SAJOIN users
# other than themselves.
#<module name="m_sajoin.so">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#

View File

@ -26,24 +26,33 @@
class CommandSajoin : public Command
{
public:
CommandSajoin(Module* Creator) : Command(Creator,"SAJOIN", 2)
CommandSajoin(Module* Creator) : Command(Creator,"SAJOIN", 1)
{
allow_empty_last_param = false;
flags_needed = 'o'; Penalty = 0; syntax = "<nick> <channel>";
flags_needed = 'o'; Penalty = 0; syntax = "[<nick>] <channel>";
TRANSLATE2(TR_NICK, TR_TEXT);
}
CmdResult Handle (const std::vector<std::string>& parameters, User *user)
{
User* dest = ServerInstance->FindNick(parameters[0]);
const std::string& channel = parameters.size() > 1 ? parameters[1] : parameters[0];
const std::string& nickname = parameters.size() > 1 ? parameters[0] : user->nick;
User* dest = ServerInstance->FindNick(nickname);
if ((dest) && (dest->registered == REG_ALL))
{
if (user != dest && !user->HasPrivPermission("users/sajoin-others", false))
{
user->WriteNotice("*** You are not allowed to /SAJOIN other users (the privilege users/sajoin-others is needed to /SAJOIN others).");
return CMD_FAILURE;
}
if (dest->server->IsULine())
{
user->WriteNumeric(ERR_NOPRIVILEGES, ":Cannot use an SA command on a u-lined client");
return CMD_FAILURE;
}
if (IS_LOCAL(user) && !ServerInstance->IsChannel(parameters[1]))
if (IS_LOCAL(user) && !ServerInstance->IsChannel(channel))
{
/* we didn't need to check this for each character ;) */
user->WriteNotice("*** Invalid characters in channel name or name too long");
@ -57,15 +66,15 @@ class CommandSajoin : public Command
LocalUser* localuser = IS_LOCAL(dest);
if (localuser)
{
Channel* n = Channel::JoinUser(localuser, parameters[1], true);
Channel* n = Channel::JoinUser(localuser, channel, true);
if (n && n->HasUser(dest))
{
ServerInstance->SNO->WriteGlobalSno('a', user->nick+" used SAJOIN to make "+dest->nick+" join "+parameters[1]);
ServerInstance->SNO->WriteGlobalSno('a', user->nick+" used SAJOIN to make "+dest->nick+" join "+channel);
return CMD_SUCCESS;
}
else
{
user->WriteNotice("*** Could not join "+dest->nick+" to "+parameters[1]);
user->WriteNotice("*** Could not join "+dest->nick+" to "+channel);
return CMD_FAILURE;
}
}
@ -76,7 +85,7 @@ class CommandSajoin : public Command
}
else
{
user->WriteNotice("*** No such nickname "+parameters[0]);
user->WriteNotice("*** No such nickname "+nickname);
return CMD_FAILURE;
}
}