Example #1
0
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;
}
Example #2
0
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);

}
Example #3
0
/* 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)++;
	
}
Example #4
0
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;
}
Example #5
0
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);
}
Example #6
0
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;
	}
	
}
Example #7
0
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

}
Example #8
0
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

}