void rmchan(CHANNEL *chan, acetables *g_ape) { if (chan->head != NULL) { struct userslist *head = chan->head; chan->flags |= CHANNEL_NONINTERACTIVE; /* Force to be non interactive (don't send LEFT raw) */ chan->flags &= ~CHANNEL_AUTODESTROY; /* Don't destroy it */ while(head != NULL) { struct userslist *thead = head->next; left(head->userinfo, chan, g_ape); head = thead; } } FIRE_EVENT_NULL(rmchan, chan, g_ape); rmallban(chan); hashtbl_erase(g_ape->hLusers, chan->name); clear_properties(&chan->properties); destroy_pipe(chan->pipe, g_ape); free(chan); chan = NULL; }
void deluser(USERS *user, acetables *g_ape) { if (user == NULL) { return; } FIRE_EVENT_NULL(deluser, user, user->istmp, g_ape); left_all(user, g_ape); char *uin = GET_UIN_FROM_USER(user); /* kill all users connections */ clear_subusers(user, g_ape); hashtbl_erase(g_ape->hSessid, user->sessid); if (uin != NULL && GET_USER_TBL(g_ape) != NULL) { hashtbl_erase(GET_USER_TBL(g_ape), uin); } if (uin != NULL && GET_ONLINE_TBL(g_ape) != NULL) { hashtbl_erase(GET_ONLINE_TBL(g_ape), uin); } if (user->istmp == 0) g_ape->nConnected--; if (user->prev == NULL) { g_ape->uHead = user->next; } else { user->prev->next = user->next; } if (user->next != NULL) { user->next->prev = user->prev; } clear_sessions(user); clear_properties(&user->properties); destroy_pipe(user->pipe, g_ape); HOOK_EVENT(deluser, user, g_ape); /* TODO Add Event */ free(user); }
/* Post raw to a subuser */ void post_raw_sub(RAW *raw, subuser *sub, acetables *g_ape) { FIRE_EVENT_NULL(post_raw_sub, raw, sub, g_ape); int add_size = 16; struct _raw_pool_user *pool = (raw->priority == RAW_PRI_LO ? &sub->raw_pools.low : &sub->raw_pools.high); if (++pool->nraw == pool->size) { pool->size += add_size; expend_raw_pool(pool->rawfoot, add_size); } pool->rawfoot->raw = raw; pool->rawfoot = pool->rawfoot->next; (sub->raw_pools.nraw)++; }
void deluser(USERS *user, acetables *g_ape) { if (user == NULL) { return; } FIRE_EVENT_NULL(deluser, user, g_ape); left_all(user, g_ape); /* kill all users connections */ clear_subusers(user); hashtbl_erase(g_ape->hSessid, user->sessid); g_ape->nConnected--; if (user->prev == NULL) { g_ape->uHead = user->next; } else { user->prev->next = user->next; } if (user->next != NULL) { user->next->prev = user->prev; } clear_sessions(user); clear_properties(&user->properties); destroy_pipe(user->pipe, g_ape); free(user); user = NULL; }
void delsubuser(subuser **current, acetables *g_ape) { subuser *del = *current; USERS *user = (*current)->user; FIRE_EVENT_NULL(delsubuser, del, g_ape); ((*current)->user->nsub)--; *current = (*current)->next; destroy_raw_pool(del->raw_pools.low.rawhead); destroy_raw_pool(del->raw_pools.high.rawhead); del->raw_pools.low.rawhead = del->raw_pools.low.rawfoot = NULL; del->raw_pools.high.rawhead = del->raw_pools.high.rawfoot = NULL; del->raw_pools.nraw = 0; del->client->attach = NULL; clear_properties(&del->properties); if (del->state == ALIVE) { del->wait_for_free = 1; do_died(del); } else { free(del); } /* * If this is the last subuser, del the user */ if (user->nsub <= 0) { user->idle = time(NULL) - (TIMEOUT_SEC - USRLEFT_SEC); } HOOK_EVENT(delsubuser, del, g_ape); }
void left(USERS *user, CHANNEL *chan, acetables *g_ape) // Vider la liste chainée de l'user { userslist *list, *prev; CHANLIST *clist, *ctmp; RAW *newraw; json_item *jlist; FIRE_EVENT_NULL(left, user, chan, g_ape); if (!isonchannel(user, chan)) { return; } list = chan->head; prev = NULL; clist = user->chan_foot; ctmp = NULL; while (clist != NULL) { if (clist->chaninfo == chan) { if (ctmp != NULL) { ctmp->next = clist->next; } else { user->chan_foot = clist->next; } free(clist); break; } ctmp = clist; clist = clist->next; } while (list != NULL && list->userinfo != NULL) { if (list->userinfo == user) { if (prev != NULL) { prev->next = list->next; } else { chan->head = list->next; } free(list); list = NULL; if (chan->head != NULL && chan->interactive) { jlist = json_new_object(); json_set_property_objN(jlist, "user", 4, get_json_object_user(user)); json_set_property_objN(jlist, "pipe", 4, get_json_object_channel(chan)); newraw = forge_raw(RAW_LEFT, jlist); post_raw_channel(newraw, chan, g_ape); } else if (chan->head == NULL) { rmchan(chan, g_ape); } break; } prev = list; list = list->next; } }
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 }