summaryrefslogtreecommitdiff
path: root/modules/global/gl_global.cpp
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2024-03-14 21:18:08 +0000
committerSadie Powell <sadie@witchery.services>2024-03-14 21:35:17 +0000
commitbeaf09de7bcb0042dfd8f388064126e511a5b28d (patch)
treeba14e1ff1ff96b5623c459b2de35d766d086e427 /modules/global/gl_global.cpp
parentc8d8978cd0bfb10613da331c5b13bbcf8486f85f (diff)
Rework sending global notices.
Admins can now queue multiple messages and send them when they are ready. This is fully compatible with the previous global behaviour. Admins can now also send messages to individual servers. This is useful for informing users of maintenance due to downtime.
Diffstat (limited to 'modules/global/gl_global.cpp')
-rw-r--r--modules/global/gl_global.cpp73
1 files changed, 55 insertions, 18 deletions
diff --git a/modules/global/gl_global.cpp b/modules/global/gl_global.cpp
index edfaa21a5..25fd05f08 100644
--- a/modules/global/gl_global.cpp
+++ b/modules/global/gl_global.cpp
@@ -14,40 +14,75 @@
class CommandGLGlobal final
: public Command
{
- ServiceReference<GlobalService> GService;
+private:
+ ServiceReference<GlobalService> global;
+
+ BotInfo *GetSender(CommandSource &source)
+ {
+ Reference<BotInfo> sender;
+ if (global)
+ sender = global->GetDefaultSender();
+ if (!sender)
+ sender = source.service;
+ return sender;
+ }
public:
- CommandGLGlobal(Module *creator) : Command(creator, "global/global", 1, 1), GService("GlobalService", "Global")
+ CommandGLGlobal(Module *creator)
+ : Command(creator, "global/global", 0)
+ , global("GlobalService", "Global")
{
this->SetDesc(_("Send a message to all users"));
- this->SetSyntax(_("\037message\037"));
+ this->SetSyntax(_("[\037message\037]"));
}
void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
{
- const Anope::string &msg = params[0];
+ if (!global)
+ {
+ source.Reply(SERVICE_UNAVAILABLE, source.service->nick.c_str());
+ return;
+ }
+
+ auto queuesize = global->CountQueue(source.nc);
+ if (!queuesize && params.empty())
+ {
+ source.Reply(GLOBAL_NO_MESSAGE);
+ return;
+ }
- if (!GService)
- source.Reply("No global reference, is global loaded?");
+ if (queuesize && !params.empty())
+ {
+ source.Reply(GLOBAL_QUEUE_CONFLICT);
+ return;
+ }
+
+ if (params.empty())
+ {
+ // We are sending the message queue.
+ global->SendQueue(source, GetSender(source));
+ }
else
{
- Log(LOG_ADMIN, source, this);
- GService->SendGlobal(NULL, source.GetNick(), msg);
+ // We are sending a single message.
+ global->SendSingle(params[0], &source, GetSender(source));
+ queuesize = 1;
}
+
+ Log(LOG_ADMIN, source, this) << "to send " << queuesize << " messages to all users";
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
{
- Reference<BotInfo> sender;
- if (GService)
- sender = GService->GetDefaultSender();
- if (!sender)
- sender = source.service;
-
this->SendSyntax(source);
source.Reply(" ");
- source.Reply(_("Allows Administrators to send messages to all users on the\n"
- "network. The message will be sent from the nick \002%s\002."), sender->nick.c_str());
+ source.Reply(_(
+ "Allows sending messages to all users on the network. The message will be sent\n"
+ "from \002%s\002.\n"
+ "\n"
+ "You can either send a message by specifying it as a parameter or provide no\n"
+ "parameters to send a previously queued message.\n"
+ ), GetSender(source)->nick.c_str());
return true;
}
};
@@ -55,11 +90,13 @@ public:
class GLGlobal final
: public Module
{
+private:
CommandGLGlobal commandglglobal;
public:
- GLGlobal(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR),
- commandglglobal(this)
+ GLGlobal(const Anope::string &modname, const Anope::string &creator)
+ : Module(modname, creator, VENDOR)
+ , commandglglobal(this)
{
}