ncdc/libdc/src/guild.c

134 lines
2.8 KiB
C

#include <dc/guild.h>
#include <dc/refable.h>
#include "internal.h"
struct dc_guild_
{
dc_refable_t ref;
char *name;
char *id;
GPtrArray *channels;
};
static void dc_guild_free(dc_guild_t ptr)
{
free(ptr->name);
free(ptr->id);
if (ptr->channels != NULL) {
g_ptr_array_unref(ptr->channels);
ptr->channels = NULL;
}
free(ptr);
}
dc_guild_t dc_guild_new(void)
{
dc_guild_t p = calloc(1, sizeof(struct dc_guild_));
return_if_true(p == NULL, NULL);
p->ref.cleanup = (dc_cleanup_t)dc_guild_free;
p->channels = g_ptr_array_new_with_free_func((GDestroyNotify)dc_unref);
if (p->channels == NULL) {
free(p);
return NULL;
}
return dc_ref(p);
}
dc_guild_t dc_guild_from_json(json_t *j)
{
dc_guild_t g = dc_guild_new();
json_t *val = NULL;
json_t *c = NULL;
size_t idx = 0;
val = json_object_get(j, "name");
goto_if_true(val == NULL || !json_is_string(val), error);
g->name = strdup(json_string_value(val));
val = json_object_get(j, "id");
goto_if_true(val == NULL || !json_is_string(val), error);
g->id = strdup(json_string_value(val));
/* there is a ton of more information here, that we should look
* to add, including "member_count", "owner_id", but for now "channels"
* will do nicely
*/
val = json_object_get(j, "channels");
goto_if_true(val == NULL || !json_is_array(val), error);
json_array_foreach(val, idx, c) {
dc_channel_t chan = dc_channel_from_json(c);
continue_if_true(chan == NULL);
g_ptr_array_add(g->channels, chan);
}
return g;
error:
dc_unref(g);
return NULL;
}
size_t dc_guild_channels(dc_guild_t d)
{
return_if_true(d == NULL || d->channels == NULL, 0);
return d->channels->len;
}
dc_channel_t dc_guild_nth_channel(dc_guild_t d, size_t idx)
{
return_if_true(d == NULL || d->channels == NULL, NULL);
return_if_true(idx >= d->channels->len, NULL);
return g_ptr_array_index(d->channels, idx);
}
dc_channel_t dc_guild_channel_by_name(dc_guild_t g, char const *name)
{
return_if_true(g == NULL || name == NULL, NULL);
size_t i = 0;
for (i = 0; i < g->channels->len; i++) {
dc_channel_t c = g_ptr_array_index(g->channels, i);
if (strcmp(dc_channel_name(c), name) == 0) {
return c;
}
}
return NULL;
}
char const *dc_guild_name(dc_guild_t d)
{
return_if_true(d == NULL, NULL);
return d->name;
}
void dc_guild_set_name(dc_guild_t d, char const *val)
{
return_if_true(d == NULL || val == NULL,);
free(d->name);
d->name = strdup(val);
}
char const *dc_guild_id(dc_guild_t d)
{
return_if_true(d == NULL, NULL);
return d->id;
}
void dc_guild_set_id(dc_guild_t d, char const *val)
{
return_if_true(d == NULL || val == NULL,);
free(d->id);
d->id = strdup(val);
}