void userlist_update_mode (session * sess, char *name, char mode, char sign) { int access; int offset = 0; int level; int pos; char prefix; struct User *user; user = userlist_find (sess, name); if (!user) return; /* remove from binary trees, before we loose track of it */ tree_remove (sess->usertree, user, &pos); tree_remove (sess->usertree_alpha, user, &pos); /* which bit number is affected? */ access = mode_access (sess->server, mode, &prefix); if (sign == '+') { level = TRUE; if (!(user->access & (1 << access))) { offset = 1; user->access |= (1 << access); } } else { level = FALSE; if (user->access & (1 << access)) { offset = -1; user->access &= ~(1 << access); } } /* now what is this users highest prefix? e.g. @ for ops */ user->prefix[0] = get_nick_prefix (sess->server, user->access); /* update the various counts using the CHANGED prefix only */ update_counts (sess, user, prefix, level, offset); /* insert it back into its new place */ tree_insert (sess->usertree_alpha, user); pos = tree_insert (sess->usertree, user); /* let GTK move it too */ fe_userlist_move (sess, user, pos); fe_userlist_numbers (sess); }
void userlist_update_mode (session *sess, const char name[], char mode, char sign) { auto result = std::find_if( sess->usertree.begin(), sess->usertree.end(), [sess, name](const std::unique_ptr<User> &u){ return sess->server->compare(name, u->nick) == 0; }); if (result == sess->usertree.end()) return; User * user = result->get(); /* which bit number is affected? */ char prefix; auto access = mode_access (sess->server, mode, &prefix); bool level = false; int offset = 0; if (sign == '+') { level = true; if (!(user->access & (1 << access))) { offset = 1; user->access |= (1 << access); } } else { level = false; if (user->access & (1 << access)) { offset = -1; user->access &= ~(1 << access); } } /* now what is this users highest prefix? e.g. @ for ops */ user->prefix[0] = get_nick_prefix (sess->server, user->access); /* update the various counts using the CHANGED prefix only */ update_counts (sess, user, prefix, level, offset); int pos = userlist_resort(*sess, user->nick); /* let GTK move it too */ fe_userlist_move (sess, user, pos); fe_userlist_numbers (*sess); }
bool userlist_change(struct session *sess, const std::string & oldname, const std::string & newname) { auto user = std::find_if( sess->usertree.begin(), sess->usertree.end(), [sess, oldname](const std::unique_ptr<User> &u){ return sess->server->compare(oldname, u->nick) == 0; }); if (user == sess->usertree.end()) return false; user->get()->nick = newname; User* user_ref = user->get(); int pos = userlist_resort(*sess, user_ref->nick); fe_userlist_move(sess, user_ref, pos); fe_userlist_numbers(*sess); return true; }
int userlist_change (struct session *sess, char *oldname, char *newname) { struct User *user = userlist_find (sess, oldname); int pos; if (user) { tree_remove (sess->usertree, user, &pos); tree_remove (sess->usertree_alpha, user, &pos); safe_strcpy (user->nick, newname, NICKLEN); tree_insert (sess->usertree_alpha, user); fe_userlist_move (sess, user, tree_insert (sess->usertree, user)); fe_userlist_numbers (sess); return 1; } return 0; }