From fcbe7af1e2ac2abb71251a51f5384d22cad9a87a Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Sun, 11 Sep 2022 17:34:41 -0400 Subject: Generate /ops from cache --- chat.h | 13 +++++++++++++ command.c | 27 +++++++++++++++++++++++++-- handle.c | 6 ------ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/chat.h b/chat.h index c7053c7..198b84e 100644 --- a/chat.h +++ b/chat.h @@ -168,6 +168,19 @@ extern struct Network { char invex; } network; +static inline uint prefixBit(char p) { + char *s = strchr(network.prefixes, p); + if (!s) return 0; + return 1 << (s - network.prefixes); +} + +static inline char bitPrefix(uint p) { + for (uint i = 0; network.prefixes[i]; ++i) { + if (p & (1 << i)) return network.prefixes[i]; + } + return '\0'; +} + #define ENUM_CAP \ X("causal.agency/consumer", CapConsumer) \ X("chghost", CapChghost) \ diff --git a/command.c b/command.c index 3acbe76..4fb58da 100644 --- a/command.c +++ b/command.c @@ -219,8 +219,31 @@ static void commandNames(uint id, char *params) { static void commandOps(uint id, char *params) { (void)params; - ircFormat("WHO %s\r\n", idNames[id]); - replies[ReplyWho]++; + char buf[1024]; + char *ptr = buf, *end = &buf[sizeof(buf)]; + ptr = seprintf( + ptr, end, "The council of \3%02d%s\3 are ", + idColors[id], idNames[id] + ); + bool first = true; + struct Cursor curs = {0}; + for (const char *nick; (nick = cacheNextKey(&curs, id));) { + char prefix = bitPrefix(curs.entry->prefixBits); + if (!prefix || prefix == '+') continue; + ptr = seprintf( + ptr, end, "%s\3%02d%c%s\3", + (first ? "" : ", "), curs.entry->color, prefix, nick + ); + first = false; + } + if (first) { + uiFormat( + id, Warm, NULL, "\3%02d%s\3 is a lawless wasteland", + idColors[id], idNames[id] + ); + } else { + uiWrite(id, Warm, NULL, buf); + } } static void commandInvite(uint id, char *params) { diff --git a/handle.c b/handle.c index a075d02..cebc7e4 100644 --- a/handle.c +++ b/handle.c @@ -560,12 +560,6 @@ static void handleErrorUserOnChannel(struct Message *msg) { ); } -static uint prefixBit(char p) { - char *s = strchr(network.prefixes, p); - if (!s) return 0; - return 1 << (s - network.prefixes); -} - static void handleReplyNames(struct Message *msg) { require(msg, false, 4); uint id = idFor(msg->params[2]); -- cgit 1.4.1