summaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2020-02-03 10:47:44 +0000
committerSadie Powell <sadie@witchery.services>2020-02-18 14:26:35 +0000
commit5ddbcd3f56bb79a5dc6b693fc2c6ad7a46ba5a3c (patch)
treed00db909276824906f2bf0166c9012128475e8f2 /src/modules
parent24f1224f770eb8f6a075d3c8bd083545c17bba10 (diff)
Add support for the IRCv3 extensions to the SETNAME command.
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/m_setname.cpp48
1 files changed, 36 insertions, 12 deletions
diff --git a/src/modules/m_setname.cpp b/src/modules/m_setname.cpp
index 7510a79f7..25675dcee 100644
--- a/src/modules/m_setname.cpp
+++ b/src/modules/m_setname.cpp
@@ -26,45 +26,58 @@
#include "inspircd.h"
+#include "modules/ircv3.h"
+#include "modules/ircv3_replies.h"
-
-
-class CommandSetname : public Command
+class CommandSetName : public SplitCommand
{
+private:
+ IRCv3::Replies::Fail fail;
+
public:
+ Cap::Capability cap;
bool notifyopers;
- CommandSetname(Module* Creator) : Command(Creator,"SETNAME", 1, 1)
+
+ CommandSetName(Module* Creator)
+ : SplitCommand(Creator, "SETNAME", 1, 1)
+ , fail(Creator)
+ , cap(Creator, "setname")
{
allow_empty_last_param = false;
syntax = ":<realname>";
}
- CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE
+ CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE
{
if (parameters[0].size() > ServerInstance->Config->Limits.MaxReal)
{
- user->WriteNotice("*** SETNAME: Real name is too long");
+ fail.SendIfCap(user, cap, this, "INVALID_REALNAME", "Real name is too long");
return CMD_FAILURE;
}
- if (user->ChangeRealName(parameters[0]))
+ if (!user->ChangeRealName(parameters[0]))
{
- if (notifyopers)
- ServerInstance->SNO->WriteGlobalSno('a', "%s used SETNAME to change their real name to '%s'",
- user->nick.c_str(), parameters[0].c_str());
+ fail.SendIfCap(user, cap, this, "CANNOT_CHANGE_REALNAME", "Unable to change your real name");
+ return CMD_FAILURE;
}
+ if (notifyopers)
+ ServerInstance->SNO->WriteGlobalSno('a', "%s used SETNAME to change their real name to '%s'",
+ user->nick.c_str(), parameters[0].c_str());
return CMD_SUCCESS;
}
};
-
class ModuleSetName : public Module
{
- CommandSetname cmd;
+ private:
+ CommandSetName cmd;
+ ClientProtocol::EventProvider setnameevprov;
+
public:
ModuleSetName()
: cmd(this)
+ , setnameevprov(this, "SETNAME")
{
}
@@ -80,6 +93,17 @@ class ModuleSetName : public Module
cmd.notifyopers = tag->getBool("notifyopers", !operonly);
}
+ void OnChangeRealName(User* user, const std::string& real) CXX11_OVERRIDE
+ {
+ if (!(user->registered & REG_NICKUSER))
+ return;
+
+ ClientProtocol::Message msg("SETNAME", user);
+ msg.PushParamRef(real);
+ ClientProtocol::Event protoev(setnameevprov, msg);
+ IRCv3::WriteNeighborsWithCap(user, protoev, cmd.cap, true);
+ }
+
Version GetVersion() CXX11_OVERRIDE
{
return Version("Provides the SETNAME command", VF_VENDOR);