diff options
| author | C. McEnroe | 2020-11-08 12:42:01 -0500 | 
|---|---|---|
| committer | C. McEnroe | 2020-11-08 12:42:01 -0500 | 
| commit | a0abd6582e07292f8bcb57530093f2ef0de5595f (patch) | |
| tree | 3ad15e758810f40772b908108c664bb8139a50d1 | |
| parent | 59006d18bb3119a3cdf6ff1494aebaf8bdc82dd9 (diff) | |
Highlight changed portion of topic
"%.*ls" is useless.
| -rw-r--r-- | handle.c | 73 | 
1 files changed, 59 insertions, 14 deletions
@@ -33,6 +33,7 @@  #include <stdlib.h>  #include <string.h>  #include <sysexits.h> +#include <wchar.h>  #include "chat.h" @@ -601,23 +602,16 @@ static void handleReplyTopic(struct Message *msg) {  	);  } +static void swap(wchar_t *a, wchar_t *b) { +	wchar_t x = *a; +	*a = *b; +	*b = x; +} +  static void handleTopic(struct Message *msg) {  	require(msg, true, 2);  	uint id = idFor(msg->params[0]); -	if (msg->params[1][0]) { -		topicComplete(id, msg->params[1]); -		urlScan(id, msg->nick, msg->params[1]); -		uiFormat( -			id, Warm, tagTime(msg), -			"\3%02d%s\3\tplaces a new sign in \3%02d%s\3: %s", -			hash(msg->user), msg->nick, hash(msg->params[0]), msg->params[0], -			msg->params[1] -		); -		logFormat( -			id, tagTime(msg), "%s places a new sign in %s: %s", -			msg->nick, msg->params[0], msg->params[1] -		); -	} else { +	if (!msg->params[1][0]) {  		topicComplete(id, NULL);  		uiFormat(  			id, Warm, tagTime(msg), @@ -628,7 +622,58 @@ static void handleTopic(struct Message *msg) {  			id, tagTime(msg), "%s removes the sign in %s",  			msg->nick, msg->params[0]  		); +		return;  	} + +	char buf[1024]; +	struct Cat cat = { buf, sizeof(buf), 0 }; +	const char *prev = complete(id, "/topic "); +	completeReject(); +	if (prev) { +		prev += 7; +	} else { +		goto plain; +	} + +	wchar_t old[512]; +	wchar_t new[512]; +	if (swprintf(old, ARRAY_LEN(old), L"%s", prev) < 0) goto plain; +	if (swprintf(new, ARRAY_LEN(new), L"%s", msg->params[1]) < 0) goto plain; + +	size_t pre; +	for (pre = 0; old[pre] && new[pre] && old[pre] == new[pre]; ++pre); +	wchar_t *osuf = &old[wcslen(old)]; +	wchar_t *nsuf = &new[wcslen(new)]; +	while (osuf > &old[pre] && nsuf > &new[pre] && osuf[-1] == nsuf[-1]) { +		osuf--; +		nsuf--; +	} + +	wchar_t nul = L'\0'; +	swap(&new[pre], &nul); +	catf(&cat, "%ls", new); +	swap(&new[pre], &nul); +	swap(osuf, &nul); +	catf(&cat, "\399,%02d%ls", Brown, &old[pre]); +	swap(osuf, &nul); +	swap(nsuf, &nul); +	catf(&cat, "\399,%02d%ls", Green, &new[pre]); +	swap(nsuf, &nul); +	catf(&cat, "\399,99%ls", nsuf); + +plain: +	topicComplete(id, msg->params[1]); +	urlScan(id, msg->nick, msg->params[1]); +	uiFormat( +		id, Warm, tagTime(msg), +		"\3%02d%s\3\tplaces a new sign in \3%02d%s\3: %s", +		hash(msg->user), msg->nick, hash(msg->params[0]), msg->params[0], +		(cat.len ? cat.buf : msg->params[1]) +	); +	logFormat( +		id, tagTime(msg), "%s places a new sign in %s: %s", +		msg->nick, msg->params[0], msg->params[1] +	);  }  static const char *UserModes[256] = {  | 
