int post_to_pipe(json_item *jlist, const char *rawname, const char *pipe, subuser *from, acetables *g_ape) { USERS *sender = from->user; transpipe *recver = get_pipe_strict(pipe, sender, g_ape); json_item *jlist_copy = NULL; RAW *newraw; if (sender != NULL) { if (recver == NULL) { send_error(sender, "UNKNOWN_PIPE", "109", g_ape); return 0; } json_set_property_objN(jlist, "from", 4, get_json_object_user(sender)); } if (sender != NULL && sender->nsub > 1) { jlist_copy = json_item_copy(jlist, NULL); json_set_property_objN(jlist_copy, "pipe", 4, get_json_object_pipe(recver)); newraw = forge_raw(rawname, jlist_copy); post_raw_restricted(newraw, sender, from, g_ape); } switch(recver->type) { case USER_PIPE: json_set_property_objN(jlist, "pipe", 4, get_json_object_user(sender)); newraw = forge_raw(rawname, jlist); post_raw(newraw, recver->pipe, g_ape); break; case CHANNEL_PIPE: if (((CHANNEL*)recver->pipe)->head != NULL && ((CHANNEL*)recver->pipe)->head->next != NULL) { json_set_property_objN(jlist, "pipe", 4, get_json_object_channel(recver->pipe)); newraw = forge_raw(rawname, jlist); post_raw_channel_restricted(newraw, recver->pipe, sender, g_ape); } break; case CUSTOM_PIPE: json_set_property_objN(jlist, "pipe", 4, get_json_object_user(sender)); post_json_custom(jlist, sender, recver, g_ape); break; default: break; } return 1; }
void join(USERS *user, CHANNEL *chan, acetables *g_ape) { userslist *list, *ulist; CHANLIST *chanl; FIRE_EVENT_NULL(join, user, chan, g_ape); RAW *newraw; json_item *jlist = json_new_object(); if (isonchannel(user, chan)) { return; } list = xmalloc(sizeof(*list)); // TODO is it free ? list->userinfo = user; list->level = 1; list->next = chan->head; chan->head = list; chanl = xmalloc(sizeof(*chanl)); // TODO is it free ? chanl->chaninfo = chan; chanl->next = user->chan_foot; user->chan_foot = chanl; if (chan->interactive) { json_item *user_list = json_new_array(); json_item *uinfo = json_new_object(); json_set_property_objN(uinfo, "user", 4, get_json_object_user(user)); json_set_property_objN(uinfo, "pipe", 4, get_json_object_channel(chan)); newraw = forge_raw(RAW_JOIN, uinfo); post_raw_channel_restricted(newraw, chan, user, g_ape); ulist = chan->head; while (ulist != NULL) { json_item *juser = get_json_object_user(ulist->userinfo); if (ulist->userinfo != user) { //make_link(user, ulist->userinfo); } json_set_property_intN(juser, "level", 5, ulist->level); json_set_element_obj(user_list, juser); ulist = ulist->next; } json_set_property_objN(jlist, "users", 5, user_list); } json_set_property_objN(jlist, "pipe", 4, get_json_object_channel(chan)); newraw = forge_raw(RAW_CHANNEL, jlist); post_raw(newraw, user, g_ape); #if 0 if (user->flags & FLG_AUTOOP) { setlevel(NULL, user, chan, 3); } #endif }
void join(USERS *user, CHANNEL *chan, acetables *g_ape) { userslist *list, *ulist; CHANLIST *chanl; FIRE_EVENT_NULL(join, user, chan, g_ape); RAW *newraw; json *jlist = NULL; char level[8]; if (isonchannel(user, chan)) { return; } list = (userslist *)xmalloc(sizeof(*list)); // is it free ? list->userinfo = user; list->level = 1; list->next = chan->head; chan->head = list; chanl = (CHANLIST *)xmalloc(sizeof(*chanl)); // is it free ? chanl->chaninfo = chan; chanl->next = user->chan_foot; user->chan_foot = chanl; if (chan->interactive) { jlist = NULL; set_json("user", NULL, &jlist); json_attach(jlist, get_json_object_user(user), JSON_OBJECT); set_json("pipe", NULL, &jlist); json_attach(jlist, get_json_object_channel(chan), JSON_OBJECT); newraw = forge_raw(RAW_JOIN, jlist); post_raw_channel_restricted(newraw, chan, user, g_ape); jlist = NULL; set_json("users", NULL, &jlist); ulist = chan->head; while (ulist != NULL) { struct json *juser = NULL; if (ulist->userinfo != user) { //make_link(user, ulist->userinfo); } sprintf(level, "%i", ulist->level); set_json("level", level, &juser); json_concat(juser, get_json_object_user(ulist->userinfo)); json_attach(jlist, juser, JSON_ARRAY); ulist = ulist->next; } } set_json("pipe", NULL, &jlist); json_attach(jlist, get_json_object_channel(chan), JSON_OBJECT); newraw = forge_raw(RAW_CHANNEL, jlist); post_raw(newraw, user, g_ape); #if 0 if (user->flags & FLG_AUTOOP) { setlevel(NULL, user, chan, 3); } #endif }