degesch: halfplement NICK and QUIT handlers
This commit is contained in:
parent
8b279dde81
commit
8e7412eb97
94
degesch.c
94
degesch.c
|
@ -1835,9 +1835,57 @@ irc_handle_mode (struct app_context *ctx, const struct irc_message *msg)
|
||||||
static void
|
static void
|
||||||
irc_handle_nick (struct app_context *ctx, const struct irc_message *msg)
|
irc_handle_nick (struct app_context *ctx, const struct irc_message *msg)
|
||||||
{
|
{
|
||||||
// TODO: rename the user in all relevant channels
|
if (!msg->prefix || msg->params.len < 1)
|
||||||
// TODO: if it's us, rename ourselves
|
return;
|
||||||
// TODO: log a message in all relevant channels
|
|
||||||
|
// 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);
|
||||||
|
if (!user)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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);
|
||||||
|
struct buffer *buffer;
|
||||||
|
while ((buffer = str_map_iter_next (&iter)))
|
||||||
|
{
|
||||||
|
// TODO: log a "You are now known as" message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Log a message in any PM buffer
|
||||||
|
struct buffer *buffer =
|
||||||
|
str_map_find (&ctx->irc_buffer_map, user->nickname);
|
||||||
|
if (buffer)
|
||||||
|
{
|
||||||
|
// TODO: log a message in the buffer
|
||||||
|
// TODO: rename the buffer, and if it collides, merge them
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log a message in all channels the user is in
|
||||||
|
LIST_FOR_EACH (struct user_channel, iter, user->channels)
|
||||||
|
{
|
||||||
|
buffer = str_map_find (&ctx->irc_buffer_map, iter->channel->name);
|
||||||
|
hard_assert (buffer != NULL);
|
||||||
|
// TODO: log a message in the buffer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally rename the user
|
||||||
|
free (user->nickname);
|
||||||
|
user->nickname = xstrdup (new_nickname);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1916,8 +1964,44 @@ irc_handle_privmsg (struct app_context *ctx, const struct irc_message *msg)
|
||||||
static void
|
static void
|
||||||
irc_handle_quit (struct app_context *ctx, const struct irc_message *msg)
|
irc_handle_quit (struct app_context *ctx, const struct irc_message *msg)
|
||||||
{
|
{
|
||||||
// TODO: remove user from all channels
|
if (!msg->prefix)
|
||||||
// TODO: log a message
|
return;
|
||||||
|
|
||||||
|
// What the fuck
|
||||||
|
if (irc_is_this_us (ctx, msg->prefix))
|
||||||
|
return;
|
||||||
|
|
||||||
|
char *nickname = irc_cut_nickname (msg->prefix);
|
||||||
|
struct user *user = str_map_find (&ctx->irc_users, nickname);
|
||||||
|
free (nickname);
|
||||||
|
if (!user)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const char *message = NULL;
|
||||||
|
if (msg->params.len > 0)
|
||||||
|
message = msg->params.vector[0];
|
||||||
|
|
||||||
|
// Log a message in any PM buffer
|
||||||
|
struct buffer *buffer =
|
||||||
|
str_map_find (&ctx->irc_buffer_map, user->nickname);
|
||||||
|
if (buffer)
|
||||||
|
{
|
||||||
|
// TODO: log a message in the buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log a message in all channels the user is in
|
||||||
|
LIST_FOR_EACH (struct user_channel, iter, user->channels)
|
||||||
|
{
|
||||||
|
buffer = str_map_find (&ctx->irc_buffer_map, iter->channel->name);
|
||||||
|
hard_assert (buffer != NULL);
|
||||||
|
// TODO: log a message in the buffer
|
||||||
|
|
||||||
|
// TODO: remove the "channel_user" link from iter->channel
|
||||||
|
// TODO: remove the link from the list and free it
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: check reference count on the user and if it's just one,
|
||||||
|
// remove him from "irc_users"
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue