aboutsummaryrefslogtreecommitdiff
path: root/degesch.c
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2015-06-04 22:19:32 +0200
committerPřemysl Janouch <p.janouch@gmail.com>2015-06-04 22:19:32 +0200
commit9b1664f968a96b9000417550a51ad56423ed7cbc (patch)
treeea5584ed8386599f80ba2b288428d19c5865f26f /degesch.c
parentb0753438c46064d1a085afa7a494cb1e52f5548c (diff)
downloadxK-9b1664f968a96b9000417550a51ad56423ed7cbc.tar.gz
xK-9b1664f968a96b9000417550a51ad56423ed7cbc.tar.xz
xK-9b1664f968a96b9000417550a51ad56423ed7cbc.zip
degesch: store channel modes differently
Diffstat (limited to 'degesch.c')
-rw-r--r--degesch.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/degesch.c b/degesch.c
index d1c5058..cbcec56 100644
--- a/degesch.c
+++ b/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)
{