summaryrefslogtreecommitdiff
path: root/degesch.c
diff options
context:
space:
mode:
Diffstat (limited to 'degesch.c')
-rw-r--r--degesch.c17
1 files changed, 13 insertions, 4 deletions
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":