diff --git a/degesch.c b/degesch.c index 5c90ddf..1c6e530 100644 --- a/degesch.c +++ b/degesch.c @@ -820,7 +820,7 @@ struct channel_user LIST_HEADER (struct channel_user) struct user *user; ///< Reference to user - char *modes; ///< Op/voice/... characters + char *modes; ///< Ordered @+... characters }; static struct channel_user * @@ -4478,16 +4478,25 @@ irc_process_names (struct server *s, struct channel *channel) { const char *item = updates->vector[i]; const char *nick = item + strspn (item, s->irc_chanuser_prefixes); + char *modes = xstrndup (item, nick - item); + struct channel_user *channel_user = str_map_find (&map, nick); if (!channel_user) { channel_user = channel_user_new (); channel_user->user = irc_get_or_make_user (s, nick); - channel_user->modes = xstrdup (""); + channel_user->modes = modes; LIST_PREPEND (channel->users, channel_user); } - - // TODO: update the user's modes + // If our idea of the user's modes disagrees with what the server's + // sent us (the most powerful modes differ), use the latter one + else if (channel_user->modes[0] != modes[0]) + { + free (channel_user->modes); + channel_user->modes = modes; + } + else + free (modes); } // TODO: get rid of channel users missing from "updates":