Esempio n. 1
0
static int mode_user(u_sourceinfo *si, char *s)
{
	u_modes m;
	u_mode_buf_stack stack;

	if (!s || !*s) {
		u_src_num(si, RPL_UMODEIS, u_user_modes(si->u));
		return 0;
	}

	m.ctx = &umodes;
	m.stacker = &u_mode_buf_stacker;
	m.setter = si;
	m.target = si->u;
	m.access = si;
	m.flags = SRC_IS_LOCAL_USER(si) ? 0 : MODE_FORCE_ALL;
	m.stack = &stack;

	u_mode_process(&m, 1, &s);

	if (stack.on != -1) {
		if (IS_LOCAL_USER(si->u)) {
			u_link_f(si->link, ":%U MODE %U %s%s",
			         si->u, si->u, stack.cbuf, stack.dbuf);
		}

		u_sendto_servers(si->link, ":%U MODE %U %s%s",
		                 si->u, si->u, stack.cbuf, stack.dbuf);
	}

	u_log(LG_VERBOSE, "%U now has user mode %s",
	      si->u, u_user_modes(si->u));

	return 0;
}
Esempio n. 2
0
void make_user(u_entity *e)
{
	u_user *u = e->v.u;

	e->flags = ENT_USER;

	e->name = u->nick;
	e->id = u->uid;

	if (IS_LOCAL_USER(u)) {
		e->loc = USER_LOCAL(u)->conn;
		e->link = e->loc;
	} else {
		e->loc = NULL;
		e->link = USER_REMOTE(u)->server->conn;
	}
}
Esempio n. 3
0
static u_chanuser *do_remote_join_chan(u_user *u, u_chan *c)
{
	u_chanuser *cu;

	if (IS_LOCAL_USER(u))
		u_log(LG_WARN, "do_remote_join_chan on local user %U", u);

	if ((cu = u_chan_user_find(c, u))) {
		u_log(LG_WARN, "Already have chanuser %U/%C; ignoring", u, c);
	} else if (!(cu = u_chan_user_add(c, u))) {
		u_log(LG_ERROR, "Could not create chanuser %U/%C", u, c);
		return NULL;
	}

	u_sendto_chan(c, NULL, ST_USERS, ":%H JOIN :%C", u, c);

	return cu;
}