diff options
| -rw-r--r-- | chat.h | 2 | ||||
| -rw-r--r-- | complete.c | 21 | ||||
| -rw-r--r-- | handle.c | 17 | 
3 files changed, 40 insertions, 0 deletions
| @@ -151,8 +151,10 @@ char *editTail(void);  const char *complete(size_t id, const char *prefix);  void completeAccept(void);  void completeReject(void); +size_t completeID(const char *str);  void completeAdd(size_t id, const char *str, enum Color color);  void completeTouch(size_t id, const char *str, enum Color color); +void completeReplace(size_t id, const char *old, const char *new);  void completeRemove(size_t id, const char *str);  void completeClear(size_t id); @@ -110,6 +110,27 @@ void completeReject(void) {  	match = NULL;  } +size_t completeID(const char *str) { +	for (match = (match ? match->next : head); match; match = match->next) { +		if (match->id && !strcmp(match->str, str)) return match->id; +	} +	return None; +} + +void completeReplace(size_t id, const char *old, const char *new) { +	struct Node *next = NULL; +	for (struct Node *node = head; node; node = node->next) { +		next = node->next; +		if (id && node->id != id) continue; +		if (strcmp(node->str, old)) continue; +		if (match == node) match = NULL; +		free(node->str); +		node->str = strdup(new); +		if (!node->str) err(EX_OSERR, "strdup"); +		prepend(detach(node)); +	} +} +  void completeRemove(size_t id, const char *str) {  	struct Node *next = NULL;  	for (struct Node *node = head; node; node = next) { @@ -261,6 +261,22 @@ static void handleTopic(struct Message *msg) {  	}  } +static void handleNick(struct Message *msg) { +	require(msg, true, 1); +	if (self.nick && !strcmp(msg->nick, self.nick)) { +		set(&self.nick, msg->params[0]); +	} +	size_t id; +	completeReplace(None, msg->nick, msg->params[0]); +	while (None != (id = completeID(msg->params[0]))) { +		uiFormat( +			id, Cold, tagTime(msg), +			"\3%02d%s\3\tis now known as \3%02d%s\3", +			hash(msg->user), msg->nick, hash(msg->user), msg->params[0] +		); +	} +} +  static bool isAction(struct Message *msg) {  	if (strncmp(msg->params[1], "\1ACTION ", 8)) return false;  	msg->params[1] += 8; @@ -354,6 +370,7 @@ static const struct Handler {  	{ "CAP", handleCap },  	{ "ERROR", handleError },  	{ "JOIN", handleJoin }, +	{ "NICK", handleNick },  	{ "NOTICE", handlePrivmsg },  	{ "PART", handlePart },  	{ "PING", handlePing }, | 
