summaryrefslogtreecommitdiff
path: root/degesch.c
diff options
context:
space:
mode:
Diffstat (limited to 'degesch.c')
-rw-r--r--degesch.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/degesch.c b/degesch.c
index 6ddfc6e..6d75532 100644
--- a/degesch.c
+++ b/degesch.c
@@ -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;
}