void userlist_add (struct session *sess, const char name[], const char hostname[], const char account[], const char realname[], const message_tags_data *tags_data) { int prefix_chars; auto acc = nick_access (sess->server, name, prefix_chars); notify_set_online (*sess->server, name + prefix_chars, tags_data); std::unique_ptr<User> user(new User()); user->access = acc; /* assume first char is the highest level nick prefix */ if (prefix_chars) user->prefix[0] = name[0]; /* add it to our linked list */ if (hostname) user->hostname = std::string(hostname); user->nick = (name + prefix_chars); /* is it me? */ if (!sess->server->compare (user->nick, sess->server->nick)) user->me = true; /* extended join info */ if (sess->server->have_extjoin) { if (account && *account) user->account = std::string (account); if (realname && *realname) user->realname = std::string (realname); } User * user_ref = user.get(); auto row = userlist_insertname (sess, std::move(user)); /* duplicate? some broken servers trigger this */ if (row == -1) { return; } sess->total++; /* most ircds don't support multiple modechars in front of the nickname for /NAMES - though they should. */ while (prefix_chars) { update_counts (sess, user_ref, name[0], true, 1); name++; prefix_chars--; } if (user_ref->me) sess->me = user_ref; fe_userlist_insert(sess, user_ref, row, false); fe_userlist_numbers (*sess); }
void userlist_add (struct session *sess, char *name, char *hostname) { struct User *user; int row, prefix_chars; unsigned int acc; acc = nick_access (sess->server, name, &prefix_chars); notify_set_online (sess->server, name + prefix_chars); user = malloc (sizeof (struct User)); memset (user, 0, sizeof (struct User)); user->access = acc; /* assume first char is the highest level nick prefix */ if (prefix_chars) user->prefix[0] = name[0]; /* add it to our linked list */ if (hostname) user->hostname = strdup (hostname); safe_strcpy (user->nick, name + prefix_chars, NICKLEN); /* is it me? */ if (!sess->server->p_cmp (user->nick, sess->server->nick)) user->me = TRUE; row = userlist_insertname (sess, user); /* duplicate? some broken servers trigger this */ if (row == -1) { if (user->hostname) free (user->hostname); free (user); return; } sess->total++; /* most ircds don't support multiple modechars infront of the nickname for /NAMES - though they should. */ while (prefix_chars) { update_counts (sess, user, name[0], TRUE, 1); name++; prefix_chars--; } if (user->me) sess->me = user; fe_userlist_insert (sess, user, row, FALSE); fe_userlist_numbers (sess); }
void userlist_add (struct session *sess, char *name, char *hostname, char *account, char *realname, const message_tags_data *tags_data) { struct User *user; int row, prefix_chars; unsigned int acc; acc = nick_access (sess->server, name, &prefix_chars); notify_set_online (sess->server, name + prefix_chars, tags_data); user = g_new0 (struct User, 1); user->access = acc; /* assume first char is the highest level nick prefix */ if (prefix_chars) user->prefix[0] = name[0]; /* add it to our linked list */ if (hostname) user->hostname = g_strdup (hostname); safe_strcpy (user->nick, name + prefix_chars, NICKLEN); /* is it me? */ if (!sess->server->p_cmp (user->nick, sess->server->nick)) user->me = TRUE; /* extended join info */ if (sess->server->have_extjoin) { if (account && *account) user->account = g_strdup (account); if (realname && *realname) user->realname = g_strdup (realname); } row = userlist_insertname (sess, user); /* duplicate? some broken servers trigger this */ if (row == -1) { g_free (user->hostname); g_free (user->account); g_free (user->realname); g_free (user); return; } sess->total++; /* most ircds don't support multiple modechars in front of the nickname for /NAMES - though they should. */ while (prefix_chars) { update_counts (sess, user, name[0], TRUE, 1); name++; prefix_chars--; } if (user->me) sess->me = user; fe_userlist_insert (sess, user, FALSE); fe_userlist_numbers (sess); }