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; }
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; } }
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; }