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