summaryrefslogtreecommitdiff
path: root/src/command.cpp
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2025-04-19 16:43:21 +0100
committerSadie Powell <sadie@witchery.services>2025-04-19 16:54:26 +0100
commit70bf013ef0bf6c8ba60e85aacca2ec97848ca0b3 (patch)
tree70ae17296baa6de7bc7ffee105702b6e28584a5a /src/command.cpp
parent18dfa62626468c18177ba6ff24be34f4b64f1d37 (diff)
Allow syntax messages to take a predicate.
Diffstat (limited to 'src/command.cpp')
-rw-r--r--src/command.cpp32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/command.cpp b/src/command.cpp
index 86d96a02e..b688803cc 100644
--- a/src/command.cpp
+++ b/src/command.cpp
@@ -154,23 +154,35 @@ void Command::ClearSyntax()
this->syntax.clear();
}
-void Command::SetSyntax(const Anope::string &s)
+void Command::SetSyntax(const Anope::string &s, const std::function<bool(CommandSource&)> &p)
{
- this->syntax.push_back(s);
+ this->syntax.emplace_back(s, p);
}
void Command::SendSyntax(CommandSource &source)
{
- Anope::string s = Language::Translate(source.GetAccount(), _("Syntax"));
- if (!this->syntax.empty())
+ auto first = true;
+ Anope::string prefix = Language::Translate(source.GetAccount(), _("Syntax"));
+ for (const auto &[syntax, predicate] : this->syntax)
{
- source.Reply("%s: \002%s %s\002", s.c_str(), source.command.c_str(), Language::Translate(source.GetAccount(), this->syntax[0].c_str()));
- Anope::string spaces(s.length(), ' ');
- for (unsigned i = 1, j = this->syntax.size(); i < j; ++i)
- source.Reply("%s \002%s %s\002", spaces.c_str(), source.command.c_str(), Language::Translate(source.GetAccount(), this->syntax[i].c_str()));
+ if (predicate && !predicate(source))
+ continue; // Not for this user.
+
+ if (first)
+ {
+ first = false;
+ source.Reply("%s: \002%s %s\002", prefix.c_str(), source.command.c_str(),
+ Language::Translate(source.GetAccount(), syntax.c_str()));
+ }
+ else
+ {
+ source.Reply("%-*s \002%s %s\002", (int)prefix.length(), "", source.command.c_str(),
+ Language::Translate(source.GetAccount(), syntax.c_str()));
+ }
}
- else
- source.Reply("%s: \002%s\002", s.c_str(), source.command.c_str());
+
+ if (first)
+ source.Reply("%s: \002%s\002", prefix.c_str(), source.command.c_str());
}
bool Command::AllowUnregistered() const