Specify commands which depend on caps

Currently only /setname.
master
June McEnroe 2022-02-26 15:51:42 -05:00
parent b7fe705c91
commit b6c7280649
3 changed files with 53 additions and 49 deletions

3
chat.c
View File

@ -1,4 +1,4 @@
/* Copyright (C) 2020 C. McEnroe <june@causal.agency> /* Copyright (C) 2020 June McEnroe <june@causal.agency>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -371,7 +371,6 @@ int main(int argc, char *argv[]) {
set(&network.name, host); set(&network.name, host);
set(&self.nick, "*"); set(&self.nick, "*");
commandCompleteAdd();
inputCompleteAdd(); inputCompleteAdd();
ircConfig(insecure, trust, cert, priv); ircConfig(insecure, trust, cert, priv);

View File

@ -537,53 +537,54 @@ static const struct Handler {
const char *cmd; const char *cmd;
Command *fn; Command *fn;
enum Flag flags; enum Flag flags;
enum Cap caps;
} Commands[] = { } Commands[] = {
{ "/away", commandAway, 0 }, { "/away", commandAway, 0, 0 },
{ "/ban", commandBan, 0 }, { "/ban", commandBan, 0, 0 },
{ "/close", commandClose, 0 }, { "/close", commandClose, 0, 0 },
{ "/copy", commandCopy, Restrict | Kiosk }, { "/copy", commandCopy, Restrict | Kiosk, 0 },
{ "/cs", commandCS, 0 }, { "/cs", commandCS, 0, 0 },
{ "/debug", commandDebug, Kiosk }, { "/debug", commandDebug, Kiosk, 0 },
{ "/deop", commandDeop, 0 }, { "/deop", commandDeop, 0, 0 },
{ "/devoice", commandDevoice, 0 }, { "/devoice", commandDevoice, 0, 0 },
{ "/except", commandExcept, 0 }, { "/except", commandExcept, 0, 0 },
{ "/exec", commandExec, Multiline | Restrict | Kiosk }, { "/exec", commandExec, Multiline | Restrict | Kiosk, 0 },
{ "/help", commandHelp, 0 }, // Restrict special case. { "/help", commandHelp, 0, 0 }, // Restrict special case.
{ "/highlight", commandHighlight, 0 }, { "/highlight", commandHighlight, 0, 0 },
{ "/ignore", commandIgnore, 0 }, { "/ignore", commandIgnore, 0, 0 },
{ "/invex", commandInvex, 0 }, { "/invex", commandInvex, 0, 0 },
{ "/invite", commandInvite, 0 }, { "/invite", commandInvite, 0, 0 },
{ "/join", commandJoin, Kiosk }, { "/join", commandJoin, Kiosk, 0 },
{ "/kick", commandKick, 0 }, { "/kick", commandKick, 0, 0 },
{ "/list", commandList, Kiosk }, { "/list", commandList, Kiosk, 0 },
{ "/me", commandMe, Multiline }, { "/me", commandMe, Multiline, 0 },
{ "/mode", commandMode, 0 }, { "/mode", commandMode, 0, 0 },
{ "/move", commandMove, 0 }, { "/move", commandMove, 0, 0 },
{ "/msg", commandMsg, Multiline | Kiosk }, { "/msg", commandMsg, Multiline | Kiosk, 0 },
{ "/names", commandNames, 0 }, { "/names", commandNames, 0, 0 },
{ "/nick", commandNick, 0 }, { "/nick", commandNick, 0, 0 },
{ "/notice", commandNotice, Multiline }, { "/notice", commandNotice, Multiline, 0 },
{ "/ns", commandNS, 0 }, { "/ns", commandNS, 0, 0 },
{ "/o", commandOpen, Restrict | Kiosk }, { "/o", commandOpen, Restrict | Kiosk, 0 },
{ "/op", commandOp, 0 }, { "/op", commandOp, 0, 0 },
{ "/open", commandOpen, Restrict | Kiosk }, { "/open", commandOpen, Restrict | Kiosk, 0 },
{ "/ops", commandOps, 0 }, { "/ops", commandOps, 0, 0 },
{ "/part", commandPart, Kiosk }, { "/part", commandPart, Kiosk, 0 },
{ "/query", commandQuery, Kiosk }, { "/query", commandQuery, Kiosk, 0 },
{ "/quit", commandQuit, 0 }, { "/quit", commandQuit, 0, 0 },
{ "/quote", commandQuote, Multiline | Kiosk }, { "/quote", commandQuote, Multiline | Kiosk, 0 },
{ "/say", commandPrivmsg, Multiline }, { "/say", commandPrivmsg, Multiline, 0 },
{ "/setname", commandSetname, 0 }, { "/setname", commandSetname, 0, CapSetname },
{ "/topic", commandTopic, 0 }, { "/topic", commandTopic, 0, 0 },
{ "/unban", commandUnban, 0 }, { "/unban", commandUnban, 0, 0 },
{ "/unexcept", commandUnexcept, 0 }, { "/unexcept", commandUnexcept, 0, 0 },
{ "/unhighlight", commandUnhighlight, 0 }, { "/unhighlight", commandUnhighlight, 0, 0 },
{ "/unignore", commandUnignore, 0 }, { "/unignore", commandUnignore, 0, 0 },
{ "/uninvex", commandUninvex, 0 }, { "/uninvex", commandUninvex, 0, 0 },
{ "/voice", commandVoice, 0 }, { "/voice", commandVoice, 0, 0 },
{ "/whois", commandWhois, 0 }, { "/whois", commandWhois, 0, 0 },
{ "/whowas", commandWhowas, 0 }, { "/whowas", commandWhowas, 0, 0 },
{ "/window", commandWindow, 0 }, { "/window", commandWindow, 0, 0 },
}; };
static int compar(const void *cmd, const void *_handler) { static int compar(const void *cmd, const void *_handler) {
@ -642,6 +643,9 @@ size_t commandWillSplit(uint id, const char *input) {
static bool commandAvailable(const struct Handler *handler) { static bool commandAvailable(const struct Handler *handler) {
if (handler->flags & Restrict && self.restricted) return false; if (handler->flags & Restrict && self.restricted) return false;
if (handler->flags & Kiosk && self.kiosk) return false; if (handler->flags & Kiosk && self.kiosk) return false;
if (handler->caps && (handler->caps & self.caps) != handler->caps) {
return false;
}
return true; return true;
} }

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2020 C. McEnroe <june@causal.agency> /* Copyright (C) 2020 June McEnroe <june@causal.agency>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -254,6 +254,7 @@ static void handleReplyWelcome(struct Message *msg) {
replies[ReplyTopicAuto] += count; replies[ReplyTopicAuto] += count;
replies[ReplyNamesAuto] += count; replies[ReplyNamesAuto] += count;
} }
commandCompleteAdd();
} }
static void handleReplyISupport(struct Message *msg) { static void handleReplyISupport(struct Message *msg) {