degesch: store channel modes differently
This commit is contained in:
parent
b0753438c4
commit
9b1664f968
42
degesch.c
42
degesch.c
|
@ -852,9 +852,12 @@ struct channel
|
|||
// TODO: eventually a reference to the server
|
||||
|
||||
char *name; ///< Channel name
|
||||
char *mode; ///< Channel mode
|
||||
char *topic; ///< Channel topic
|
||||
|
||||
// XXX: write something like an ordered set of characters object?
|
||||
struct str no_param_modes; ///< No parameter channel modes
|
||||
struct str_map param_modes; ///< Parametrized channel modes
|
||||
|
||||
struct channel_user *users; ///< Channel users
|
||||
struct str_vector names_buf; ///< Buffer for RPL_NAMREPLY
|
||||
};
|
||||
|
@ -864,6 +867,9 @@ channel_new (void)
|
|||
{
|
||||
struct channel *self = xcalloc (1, sizeof *self);
|
||||
self->ref_count = 1;
|
||||
str_init (&self->no_param_modes);
|
||||
str_map_init (&self->param_modes);
|
||||
self->param_modes.free = free;
|
||||
str_vector_init (&self->names_buf);
|
||||
return self;
|
||||
}
|
||||
|
@ -872,8 +878,9 @@ static void
|
|||
channel_destroy (struct channel *self)
|
||||
{
|
||||
free (self->name);
|
||||
free (self->mode);
|
||||
free (self->topic);
|
||||
str_free (&self->no_param_modes);
|
||||
str_map_free (&self->param_modes);
|
||||
// Owner has to make sure we have no users by now
|
||||
hard_assert (!self->users);
|
||||
str_vector_free (&self->names_buf);
|
||||
|
@ -2796,7 +2803,6 @@ irc_make_channel (struct server *s, char *name)
|
|||
channel->on_destroy = irc_channel_on_destroy;
|
||||
channel->user_data = s;
|
||||
channel->name = name;
|
||||
channel->mode = xstrdup ("");
|
||||
channel->topic = NULL;
|
||||
str_map_set (&s->irc_channels, channel->name, channel);
|
||||
return channel;
|
||||
|
@ -3604,6 +3610,27 @@ make_unseen_prefix (struct app_context *ctx)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static char *
|
||||
make_chanmode_postfix (struct channel *channel)
|
||||
{
|
||||
struct str modes;
|
||||
str_init (&modes);
|
||||
if (channel->no_param_modes.len)
|
||||
str_append (&modes, channel->no_param_modes.str);
|
||||
|
||||
struct str_map_iter iter;
|
||||
str_map_iter_init (&iter, &channel->param_modes);
|
||||
char *param;
|
||||
while ((param = str_map_iter_next (&iter)))
|
||||
str_append_c (&modes, iter.link->key[0]);
|
||||
|
||||
if (modes.len)
|
||||
return str_steal (&modes);
|
||||
|
||||
str_free (&modes);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
make_prompt (struct app_context *ctx, struct str *output)
|
||||
{
|
||||
|
@ -3620,8 +3647,13 @@ make_prompt (struct app_context *ctx, struct str *output)
|
|||
|
||||
str_append_printf (output, "%d:%s",
|
||||
buffer_get_index (ctx, buffer), buffer->name);
|
||||
if (buffer->type == BUFFER_CHANNEL && *buffer->channel->mode)
|
||||
str_append_printf (output, "(%s)", buffer->channel->mode);
|
||||
if (buffer->type == BUFFER_CHANNEL)
|
||||
{
|
||||
char *modes = make_chanmode_postfix (buffer->channel);
|
||||
if (modes)
|
||||
str_append_printf (output, "(+%s)", modes);
|
||||
free (modes);
|
||||
}
|
||||
|
||||
if (buffer != ctx->global_buffer)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue