From 9cbec9ca7ee5a730f92587274bb6d7713c5671bf Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Sat, 8 Feb 2020 22:51:13 -0500 Subject: Color mentions Sort of like Textual does, but only in the first part of the messaage, either before a colon or before a space. Hopefully this makes it less costly than it would be, and prevents false positives on people with common nouns for nicks. --- handle.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) (limited to 'handle.c') diff --git a/handle.c b/handle.c index f919fcb..4ec0a90 100644 --- a/handle.c +++ b/handle.c @@ -389,6 +389,53 @@ static bool isMention(const struct Message *msg) { return false; } +static const char *colorMentions(size_t id, struct Message *msg) { + char *mention; + char final; + if (strchr(msg->params[1], ':')) { + mention = strsep(&msg->params[1], ":"); + final = ':'; + } else if (strchr(msg->params[1], ' ')) { + mention = strsep(&msg->params[1], " "); + final = ' '; + } else { + mention = msg->params[1]; + msg->params[1] = ""; + final = '\0'; + } + + static char buf[1024]; + size_t len = 0; + while (*mention) { + size_t skip = strspn(mention, ", "); + int n = snprintf( + &buf[len], sizeof(buf) - len, + "%.*s", (int)skip, mention + ); + assert(n >= 0 && len + n < sizeof(buf)); + len += n; + mention += skip; + + size_t word = strcspn(mention, ", "); + char punct = mention[word]; + mention[word] = '\0'; + + n = snprintf( + &buf[len], sizeof(buf) - len, + "\3%02d%s\3", completeColor(id, mention), mention + ); + assert(n > 0 && len + n < sizeof(buf)); + len += n; + + mention[word] = punct; + mention += word; + } + assert(len + 1 < sizeof(buf)); + buf[len++] = final; + buf[len] = '\0'; + return buf; +} + static void handlePrivmsg(struct Message *msg) { require(msg, true, 2); bool query = !strchr(self.chanTypes, msg->params[0][0]); @@ -423,10 +470,12 @@ static void handlePrivmsg(struct Message *msg) { (mention ? "\26" : ""), hash(msg->user), msg->nick, msg->params[1] ); } else { + const char *mentions = colorMentions(id, msg); uiFormat( id, (mention || query ? Hot : Warm), tagTime(msg), - "%s\3%d<%s>\17\t%s", - (mention ? "\26" : ""), hash(msg->user), msg->nick, msg->params[1] + "%s\3%d<%s>\17\t%s%s", + (mention ? "\26" : ""), hash(msg->user), msg->nick, + mentions, msg->params[1] ); } } -- cgit 1.4.1 a140647c033a87ca5e6c3064'>unfollow)
Commit message (Expand)Author
2018-08-04Add libedit to chrootJune McEnroe
2018-08-04Define A_ITALIC if not definedJune McEnroe
2018-08-04Do not free const string portJune McEnroe
2018-08-04Split source into several filesJune McEnroe
2018-08-04Exit on zero readJune McEnroe
2018-08-04Handle nick errorsJune McEnroe
2018-08-04Handle /nick and /quitJune McEnroe
2018-08-04Track own nickJune McEnroe
2018-08-04Word all status messages in presentJune McEnroe
2018-08-03Handle inputJune McEnroe
2018-08-03Track own usernameJune McEnroe
2018-08-03Use a wide pad for the topicJune McEnroe
2018-08-03Ignore NOTICEs not sent to the channelJune McEnroe
2018-08-03Handle KICK and NICKJune McEnroe
2018-08-03Continue on EINTR from pollJune McEnroe
2018-08-03Handle ACTIONsJune McEnroe
2018-08-03Use more octal char literalsJune McEnroe
2018-08-03Send a WHO in response to NAMES to get usernamesJune McEnroe
2018-08-03Colorize nicks and channelsJune McEnroe
2018-08-03Add support for mIRC colorsJune McEnroe
2018-08-03Handle bold, italic, underlineJune McEnroe
2018-08-03Add prift function for "prefix shift"June McEnroe
2018-08-03Link with -lcurseswJune McEnroe
2018-08-02Use libtls "compat" ciphersJune McEnroe
2018-08-02Add UI and handle some kinds of server messagesJune McEnroe
2018-08-02Add chroot.tar targetJune McEnroe