unsigned int join_count; /* joins within delta */
unsigned int join_delta; /* last ts of join */
+ struct Dictionary *c_metadata;
+
unsigned long bants;
time_t channelts;
char *chname;
unsigned long bants;
};
+struct c_Metadata
+{
+ const char *name;
+ const char *value;
+};
+
#define BANLEN 195
struct Ban
{
extern void do_join_0(struct Client *client_p, struct Client *source_p);
extern int check_channel_name_loc(struct Client *source_p, const char *name);
+extern struct Metadata *channel_metadata_add(struct Channel *target, const char *name, const char *value, int propegate);
+extern void channel_metadata_delete(struct Channel *target, const char *name, int propegate);
+extern struct Metadata *channel_metadata_find(struct Channel *target, const char *name);
+
#endif /* INCLUDED_channel_h */
void
me_metadata(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
{
- struct Client *target_p;
+ if(parv[2][0] == '#')
+ {
+ struct Channel *chptr;
- if((target_p = find_client(parv[2])) == NULL)
- return;
+ if((chptr = find_channel(parv[2])) == NULL)
+ return;
- if(!target_p->user)
- return;
+ if(!strcmp(parv[1], "ADD") && parv[4] != NULL)
+ channel_metadata_add(chptr, parv[3], parv[4], 0);
+ if(!strcmp(parv[1], "DELETE") && parv[3] != NULL)
+ channel_metadata_delete(chptr, parv[3], 0);
+ }
- if(!strcmp(parv[1], "ADD") && parv[4] != NULL)
- user_metadata_add(target_p, parv[3], parv[4], 0);
- if(!strcmp(parv[1], "DELETE") && parv[3] != NULL)
- user_metadata_delete(target_p, parv[3], 0);
-}
\ No newline at end of file
+ else
+ {
+ struct Client *target_p;
+
+ if((target_p = find_client(parv[2])) == NULL)
+ return;
+
+ if(!target_p->user)
+ return;
+
+ if(!strcmp(parv[1], "ADD") && parv[4] != NULL)
+ user_metadata_add(target_p, parv[3], parv[4], 0);
+ if(!strcmp(parv[1], "DELETE") && parv[3] != NULL)
+ user_metadata_delete(target_p, parv[3], 0);
+ }
+}
#include "s_newconf.h"
#include "logger.h"
#include "packet.h"
+#include "irc_dictionary.h"
struct config_channel_entry ConfigChannel;
rb_dlink_list global_channel_list;
allocate_channel(const char *chname)
{
struct Channel *chptr;
+ struct Dictionary *c_metadata;
chptr = rb_bh_alloc(channel_heap);
chptr->chname = rb_strdup(chname);
+
+ c_metadata = irc_dictionary_create(irccmp);
+ chptr->c_metadata = c_metadata;
return (chptr);
}
void
free_channel(struct Channel *chptr)
{
+ /* insert deletion of metadata here! */
rb_free(chptr->chname);
rb_bh_free(channel_heap, chptr);
}
return;
}
+
+/*
+ * channel_metadata_add
+ *
+ * inputs - pointer to channel struct
+ * - name of metadata item you wish to add
+ * - value of metadata item
+ * - 1 if metadata should be propegated, 0 if not
+ * output - none
+ * side effects - metadata is added to the channel in question
+ * - metadata is propegated if propegate is set.
+ */
+struct Metadata *
+channel_metadata_add(struct Channel *target, const char *name, const char *value, int propegate)
+{
+ struct Metadata *md;
+
+ if(irc_dictionary_find(target->c_metadata, name) != NULL)
+ return NULL;
+
+ md = rb_malloc(sizeof(struct Metadata));
+ md->name = rb_strdup(name);
+ md->value = rb_strdup(value);
+
+ irc_dictionary_add(target->c_metadata, md->name, md);
+
+ if(propegate)
+ sendto_match_servs(&me, "*", CAP_ENCAP, NOCAPS, "ENCAP * METADATA ADD %s %s :%s",
+ target->chname, name, value);
+
+ return md;
+}
+
+/*
+ * channel_metadata_delete
+ *
+ * inputs - pointer to channel struct
+ * - name of metadata item you wish to delete
+ * output - none
+ * side effects - metadata is deleted from the channel in question
+ * - deletion is propegated if propegate is set
+ */
+void
+channel_metadata_delete(struct Channel *target, const char *name, int propegate)
+{
+ struct Metadata *md = channel_metadata_find(target, name);
+
+ if(!md)
+ return;
+
+ irc_dictionary_delete(target->c_metadata, md->name);
+
+ rb_free(md);
+
+ if(propegate)
+ sendto_match_servs(&me, "*", CAP_ENCAP, NOCAPS, "ENCAP * METADATA DELETE %s %s",
+ target->chname, name);
+}
+
+/*
+ * channel_metadata_find
+ *
+ * inputs - pointer to channel struct
+ * - name of metadata item you wish to read
+ * output - the requested metadata, if it exists, elsewise null.
+ * side effects -
+ */
+struct Metadata *
+channel_metadata_find(struct Channel *target, const char *name)
+{
+ if(!target)
+ return NULL;
+
+ if(!target->c_metadata)
+ return NULL;
+
+ return irc_dictionary_retrieve(target->c_metadata, name);
+}
DICTIONARY_FOREACH(md, &iter, target_p->user->metadata)
{
- sendto_one(client_p, ":%s ENCAP * METADATA %s %s :%s",
+ sendto_one(client_p, ":%s ENCAP * METADATA ADD %s %s :%s",
use_id(target_p), use_id(target_p), md->name, md->value);
}
}
sendto_one(client_p, "%s", buf);
+ DICTIONARY_FOREACH(md, &iter, chptr->c_metadata)
+ {
+ sendto_one(client_p, ":%s ENCAP * METADATA ADD %s %s :%s",
+ use_id(target_p), use_id(target_p), md->name, md->value);
+ }
+
if(rb_dlink_list_length(&chptr->banlist) > 0)
burst_modes_TS6(client_p, chptr, &chptr->banlist, 'b');