X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/3c6fb31a4bb6580e3295fdec5d4687eafb487251..e5847c3ef379e4e5a3c0ecfc5ddd60628f446050:/src/client.c diff --git a/src/client.c b/src/client.c index 7aa5b94..e94e393 100644 --- a/src/client.c +++ b/src/client.c @@ -77,6 +77,7 @@ static rb_bh *lclient_heap = NULL; static rb_bh *pclient_heap = NULL; static rb_bh *user_heap = NULL; static rb_bh *away_heap = NULL; +static rb_bh *metadata_heap = NULL; static char current_uid[IDLEN]; struct Dictionary *nd_dict = NULL; @@ -120,6 +121,7 @@ init_client(void) lclient_heap = rb_bh_create(sizeof(struct LocalUser), LCLIENT_HEAP_SIZE, "lclient_heap"); pclient_heap = rb_bh_create(sizeof(struct PreClient), PCLIENT_HEAP_SIZE, "pclient_heap"); user_heap = rb_bh_create(sizeof(struct User), USER_HEAP_SIZE, "user_heap"); + metadata_heap = rb_bh_create(sizeof(struct MetadataEntry), USER_HEAP_SIZE, "metadata_heap"); away_heap = rb_bh_create(AWAYLEN, AWAY_HEAP_SIZE, "away_heap"); rb_event_addish("check_pings", check_pings, NULL, 30); @@ -1657,8 +1659,10 @@ make_user(struct Client *client_p) { user = (struct User *) rb_bh_alloc(user_heap); user->refcnt = 1; + user->metadata = irc_dictionary_create(irccmp); client_p->user = user; } + return user; } @@ -1744,6 +1748,36 @@ free_away(struct Client *client_p) } } +void +set_metadata(struct Client *client_p, const char *key, const char *value) +{ + struct MetadataEntry *md; + + if(client_p->user != NULL) + { + md = rb_bh_alloc(metadata_heap); + rb_strlcpy(md->key, key, NICKLEN); + rb_strlcpy(md->value, value, TOPICLEN); + + irc_dictionary_add(client_p->user->metadata, key, md); + } +} + +void +delete_metadata(struct Client *client_p, const char *key) +{ + struct MetadataEntry *md; + + if(client_p->user != NULL) + { + md = irc_dictionary_delete(client_p->user->metadata, key); + if (md == NULL) + return; + + rb_free(md); + } +} + void init_uid(void) {