about summary refs log tree commit diff
path: root/channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'channel.c')
-rw-r--r--channel.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/channel.c b/channel.c
index 0cf0b30..94b0d6c 100644
--- a/channel.c
+++ b/channel.c
@@ -73,8 +73,38 @@ channel_exit(struct Channel *channel, struct Peer *peer)
 		ensure(i != channels_c, warnx(
 			"channel_exit(): couldn't find empty channel"
 		), 1);
-		channels[i] = channels[--channels_c];
+		channel_remove(i);
 	}
 
 	return 0;
 }
+
+void
+channel_remove(size_t cid)
+{
+	struct Channel *tofix;
+	size_t i, j;
+
+	tofix = &channels[channels_c-1];
+	for (i = 0; i < tofix->users_c; ++i)
+	{
+		for (j = 0; j < tofix->users[i]->channels_c; ++j)
+			if (!strcmp(tofix->users[i]->channels[j]->name, tofix->name))
+				break;
+		if (j == tofix->users[i]->channels_c)
+		{
+			warnx(
+				"channel_remove(): %s doesn't belong to %s@%s, "
+				"though they believe in the opposite",
+				tofix->name,
+				getnick(tofix->users[i]),
+				tofix->users[i]->host
+			);
+			continue;
+		}
+
+		tofix->users[i]->channels[j] = &channels[cid];
+	}
+
+	channels[cid] = channels[--channels_c];
+}