summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-02-08 22:51:13 -0500
committerJune McEnroe <june@causal.agency>2020-02-08 22:51:13 -0500
commit9cbec9ca7ee5a730f92587274bb6d7713c5671bf (patch)
tree24291df147ee7b69df260da02650418606612d12 /handle.c
parentTrim whitespace from both ends of command params (diff)
downloadcatgirl-9cbec9ca7ee5a730f92587274bb6d7713c5671bf.tar.gz
catgirl-9cbec9ca7ee5a730f92587274bb6d7713c5671bf.zip
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.
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c53
1 files changed, 51 insertions, 2 deletions
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]
 		);
 	}
 }
I figure there should be some way to scroll without keypad, and apparently this is what emacs offers... 2020-02-12Allow for arguments to open/copy utilitiesJune McEnroe 2020-02-12Handle RPL_AWAYJune McEnroe 2020-02-11Support monochromatic terminalsJune McEnroe Oops, division by zero! 2020-02-11Add .gz to chroot-man scriptJune McEnroe 2020-02-11Add -R restricted flagJune McEnroe 2020-02-11Add chroot targetJune McEnroe 2020-02-11Exit focus and paste modes on err exitJune McEnroe 2020-02-11Add startup GPLv3 note and URLJune McEnroe I am a degenerate. 2020-02-11Make sure -D_GNU_SOURCE ends up in CFLAGS on LinuxJune McEnroe 2020-02-11Add note about setting PKG_CONFIG_PATHJune McEnroe 2020-02-11Rename query ID on nick changeJune McEnroe 2020-02-11Call completeClear when closing a windowJune McEnroe 2020-02-11Don't insert color codes for non-mentionsJune McEnroe 2020-02-11Take first two words in colorMentionsJune McEnroe This lets phrases like "hi june" get colored, but still doesn't get carried away. 2020-02-11Use time_t for save signatureJune McEnroe It's actually more likely to be 64-bit than size_t anyway, and it eliminates some helper functions. Also don't error when reading an empty save file. 2020-02-11Set self.nick to * initiallyJune McEnroe Allows removing a bunch of checks that self.nick is set, and it's what the server usually calls you before registration. Never highlight notices as mentions. 2020-02-11Define ColorCap instead of hardcoding 100June McEnroe 2020-02-11Move hash to top of chat.hJune McEnroe 2020-02-11Move base64 out of chat.hJune McEnroe 2020-02-11Move XDG_SUBDIR out of chat.hJune McEnroe 2020-02-11Fix whois idle unit calculationJune McEnroe Rookie mistake. 2020-02-11Cast towupper to wchar_tJune McEnroe For some reason it takes and returns wint_t... 2020-02-11Cast set but unused variables to voidJune McEnroe 2020-02-11Declare strlcatJune McEnroe 2020-02-11Check if VDSUSP existsJune McEnroe 2020-02-11Fix completeReplace iterationJune McEnroe 2020-02-11Use pkg(8) to configure on FreeBSDJune McEnroe 2020-02-11Remove legacy codeJune McEnroe 2020-02-11Add INSTALLING section to READMEJune McEnroe