diff options
-rw-r--r-- | degesch.c | 36 |
1 files changed, 19 insertions, 17 deletions
@@ -417,8 +417,9 @@ struct app_context struct str_map irc_channels; ///< IRC channel data struct str_map irc_buffer_map; ///< Maps IRC identifiers to buffers - char *irc_nickname; ///< Current nickname - char *irc_user_mode; ///< Current user mode + struct user *irc_user; ///< Our own user + char *irc_user_mode; ///< Our current user mode + char *irc_user_host; ///< Our current user@host // Events: @@ -535,8 +536,9 @@ app_context_free (struct app_context *self) str_map_free (&self->irc_channels); str_map_free (&self->irc_buffer_map); - free (self->irc_nickname); + user_unref (self->irc_user); free (self->irc_user_mode); + free (self->irc_user_host); poller_free (&self->poller); @@ -1246,7 +1248,7 @@ static bool irc_is_this_us (struct app_context *ctx, const char *prefix) { char *nick = irc_cut_nickname (prefix); - bool result = !irc_strcmp (nick, ctx->irc_nickname); + bool result = !irc_strcmp (nick, ctx->irc_user->nickname); free (nick); return result; } @@ -1596,7 +1598,7 @@ make_prompt (struct app_context *ctx, struct str *output) str_append (output, "(disconnected)"); else { - str_append (output, ctx->irc_nickname); + str_append (output, ctx->irc_user->nickname); if (*ctx->irc_user_mode) str_append_printf (output, "(%s)", ctx->irc_user_mode); } @@ -1846,8 +1848,6 @@ irc_handle_nick (struct app_context *ctx, const struct irc_message *msg) if (!msg->prefix || msg->params.len < 1) return; - // FIXME: make sure we have an associated user; - // we might be able to get rid of "irc_nickname" then char *nickname = irc_cut_nickname (msg->prefix); struct user *user = str_map_find (&ctx->irc_users, nickname); free (nickname); @@ -1857,11 +1857,6 @@ irc_handle_nick (struct app_context *ctx, const struct irc_message *msg) const char *new_nickname = msg->params.vector[0]; if (irc_is_this_us (ctx, msg->prefix)) { - // Update user information - free (ctx->irc_nickname); - ctx->irc_nickname = xstrdup (new_nickname); - refresh_prompt (ctx); - // Log a message in all open buffers on this server struct str_map_iter iter; str_map_iter_init (&iter, &ctx->irc_buffer_map); @@ -1897,6 +1892,9 @@ irc_handle_nick (struct app_context *ctx, const struct irc_message *msg) // Finally rename the user free (user->nickname); user->nickname = xstrdup (new_nickname); + + // We might have renamed ourselves + refresh_prompt (ctx); } static void @@ -2104,7 +2102,7 @@ irc_process_message (const struct irc_message *msg, // TODO: parse any response and store the result for us in app_context; // this enables proper message splitting on output; // we can also use WHOIS if it's not supported (optional by RFC 2812) - irc_send (ctx, "USERHOST %s", ctx->irc_nickname); + irc_send (ctx, "USERHOST %s", ctx->irc_user->nickname); const char *autojoin = str_map_find (&ctx->config, "autojoin"); if (autojoin) @@ -2485,7 +2483,7 @@ send_message_to_target (struct app_context *ctx, // TODO: autosplit irc_send (ctx, "PRIVMSG %s :%s", target, message); buffer_send (ctx, buffer, BUFFER_LINE_PRIVMSG, 0, - ctx->irc_nickname, NULL, "%s", message); + ctx->irc_user->nickname, NULL, "%s", message); } static void @@ -2646,10 +2644,12 @@ on_irc_disconnected (struct app_context *ctx) xclose (ctx->irc_fd); ctx->irc_fd = -1; ctx->irc_ready = false; - free (ctx->irc_nickname); - ctx->irc_nickname = NULL; + user_unref (ctx->irc_user); + ctx->irc_user = NULL; free (ctx->irc_user_mode); ctx->irc_user_mode = NULL; + free (ctx->irc_user_host); + ctx->irc_user_host = NULL; ctx->irc_event.closed = true; poller_fd_reset (&ctx->irc_event); @@ -2813,8 +2813,10 @@ irc_connect (struct app_context *ctx, struct error **e) irc_send (ctx, "USER %s 8 * :%s", username, realname); // XXX: maybe we should wait for the first message from the server - ctx->irc_nickname = xstrdup (nickname); + ctx->irc_user = user_new (); + ctx->irc_user->nickname = xstrdup (nickname); ctx->irc_user_mode = xstrdup (""); + ctx->irc_user_host = NULL; return true; } |