summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--handle.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/handle.c b/handle.c
index a2d0ddd..d268d14 100644
--- a/handle.c
+++ b/handle.c
@@ -491,6 +491,7 @@ static void handleMode(struct Message *msg) {
 		// TODO: User mode changes.
 		return;
 	}
+
 	uint id = idFor(msg->params[0]);
 	bool set = false;
 	uint param = 2;
@@ -499,6 +500,7 @@ static void handleMode(struct Message *msg) {
 			set = true;
 		} else if (*ch == '-') {
 			set = false;
+
 		} else if (strchr(network.prefixModes, *ch)) {
 			assert(param < ParamCap);
 			char *nick = msg->params[param++];
@@ -512,8 +514,35 @@ static void handleMode(struct Message *msg) {
 				(set ? "grants" : "revokes"),
 				completeColor(id, nick), prefix, nick
 			);
+
 		} else if (strchr(network.listModes, *ch)) {
-			// TODO
+			assert(param < ParamCap);
+			char *mask = msg->params[param++];
+			if (*ch == 'b') {
+				uiFormat(
+					id, Cold, tagTime(msg),
+					"\3%02d%s\3\t%s %s from \3%02d%s\3",
+					hash(msg->user), msg->nick,
+					(set ? "bans" : "unbans"),
+					mask,
+					hash(msg->params[0]), msg->params[0]
+				);
+				continue;
+			}
+			const char *list = (const char[]) { *ch, '\0' };
+			if (*ch == network.excepts) list = "except";
+			if (*ch == network.invex) list = "invite";
+			uiFormat(
+				id, Cold, tagTime(msg),
+				"\3%02d%s\3\t%s %s %s the \3%02d%s\3 %s list",
+				hash(msg->user), msg->nick,
+				(set ? "adds" : "removes"),
+				mask,
+				(set ? "to" : "from"),
+				hash(msg->params[0]), msg->params[0],
+				list
+			);
+
 		} else if (strchr(network.paramModes, *ch)) {
 			// TODO
 		} else if (strchr(network.setParamModes, *ch)) {