From 0d0a6d15757f02eaee879e4f7f1bb3c24dab8f1d Mon Sep 17 00:00:00 2001 From: C. McEnroe Date: Sun, 22 Mar 2020 11:40:58 -0400 Subject: Handle RPL_CHANNELMODEIS --- handle.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'handle.c') diff --git a/handle.c b/handle.c index 4392094..fa3f36b 100644 --- a/handle.c +++ b/handle.c @@ -512,13 +512,13 @@ static void handleReplyUserModeIs(struct Message *msg) { if (UserModes[(byte)*ch]) { catf(buf, sizeof(buf), ", %s", UserModes[(byte)*ch]); } else { - catf(buf, sizeof(buf), ", mode %c", *ch); + catf(buf, sizeof(buf), ", +%c", *ch); } } uiFormat( Network, Warm, tagTime(msg), - "\3%02d%s\3\tis%s", - self.color, self.nick, (buf[0] ? &buf[1] : buf) + "\3%02d%s\3\tis %s", + self.color, self.nick, (buf[0] ? &buf[2] : buf) ); } @@ -537,6 +537,35 @@ static const char *ChanModes[256] = { ['v'] = "voice", }; +static void handleReplyChannelModeIs(struct Message *msg) { + require(msg, false, 3); + uint param = 3; + char buf[1024] = ""; + for (char *ch = msg->params[2]; *ch; ++ch) { + if (*ch == '+') continue; + const char *name = ChanModes[(byte)*ch]; + if (!name) name = (const char[]) { '+', *ch, '\0' }; + if ( + strchr(network.paramModes, *ch) || + strchr(network.setParamModes, *ch) + ) { + assert(param < ParamCap); + catf( + buf, sizeof(buf), ", has %s of %s", + name, msg->params[param++] + ); + } else { + catf(buf, sizeof(buf), ", is %s", name); + } + } + uiFormat( + idFor(msg->params[1]), Cold, tagTime(msg), + "\3%02d%s\3\t%s", + hash(msg->params[1]), msg->params[1], + (buf[0] ? &buf[2] : "has no modes") + ); +} + static void handleMode(struct Message *msg) { require(msg, true, 2); @@ -1017,6 +1046,7 @@ static const struct Handler { { "319", handleReplyWhoisChannels }, { "322", handleReplyList }, { "323", handleReplyListEnd }, + { "324", handleReplyChannelModeIs }, { "330", handleReplyWhoisGeneric }, { "331", handleReplyNoTopic }, { "332", handleReplyTopic }, -- cgit 1.4.1-2-gfad0