1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-29 06:16:40 +02:00

irc: generate alternate nicks dynamically when all nicks are already in use (task #12209)

This commit is contained in:
Sebastien Helleu
2012-08-22 19:28:19 +02:00
parent 7aaac8d698
commit 7f3d7e5f29
20 changed files with 197 additions and 109 deletions
+99
View File
@@ -485,6 +485,100 @@ irc_server_get_nick_index (struct t_irc_server *server)
return -1;
}
/*
* irc_server_get_alternate_nick: get an alternate nick when the nick is
* already used on server
* We first try all declared nicks, then we
* build nicks by adding "_", until length of 9.
* If all nicks are still used, build 99
* alternate nicks by using number at the end.
* Example: nicks = "abcde,fghi,jkl"
* Nicks tried: abcde
* fghi
* jkl
* abcde_
* abcde__
* abcde___
* abcde____
* abcde___1
* abcde___2
* ...
* abcde__99
* Return NULL if no more alternate nick is
* available
*/
const char *
irc_server_get_alternate_nick (struct t_irc_server *server)
{
static char nick[64];
char str_number[64];
int nick_index, length_nick, length_number;
nick[0] = '\0';
/* we are still trying nicks from option "nicks" */
if (server->nick_alternate_number < 0)
{
nick_index = irc_server_get_nick_index (server);
if (nick_index < 0)
nick_index = 0;
else
{
nick_index = (nick_index + 1) % server->nicks_count;
/* stop loop if first nick tried was not in the list of nicks */
if ((nick_index == 0) && (server->nick_first_tried < 0))
server->nick_first_tried = 0;
}
if (nick_index != server->nick_first_tried)
{
snprintf (nick, sizeof (nick),
"%s", server->nicks_array[nick_index]);
return nick;
}
/*
* we have tried all nicks in list, then use main nick
* and we will add "_" and then number if needed
*/
server->nick_alternate_number = 0;
snprintf (nick, sizeof (nick), "%s", server->nicks_array[0]);
}
else
snprintf (nick, sizeof (nick), "%s", server->nick);
/* if length is < 9, just add a "_" */
if (strlen (nick) < 9)
{
strcat (nick, "_");
return nick;
}
server->nick_alternate_number++;
/* number is max 99 */
if (server->nick_alternate_number > 99)
return NULL;
/* be sure the nick has 9 chars max */
nick[9] = '\0';
/* generate number */
snprintf (str_number, sizeof (str_number),
"%d", server->nick_alternate_number);
/* copy number in nick */
length_nick = strlen (nick);
length_number = strlen (str_number);
if (length_number > length_nick)
return NULL;
memcpy (nick + length_nick - length_number, str_number, length_number);
/* return alternate nick */
return nick;
}
/*
* irc_server_get_isupport_value: return value of an item in "isupport" (copy
* of IRC message 005)
@@ -782,6 +876,7 @@ irc_server_alloc (const char *name)
new_server->nicks_count = 0;
new_server->nicks_array = NULL;
new_server->nick_first_tried = 0;
new_server->nick_alternate_number = -1;
new_server->nick = NULL;
new_server->nick_modes = NULL;
new_server->isupport = NULL;
@@ -2811,6 +2906,8 @@ irc_server_login (struct t_irc_server *server)
else
server->nick_first_tried = irc_server_get_nick_index (server);
server->nick_alternate_number = -1;
if (irc_server_sasl_enabled (server) || (capabilities && capabilities[0]))
{
irc_server_sendf (server, 0, NULL, "CAP LS");
@@ -4290,6 +4387,7 @@ irc_server_hdata_server_cb (void *data, const char *hdata_name)
WEECHAT_HDATA_VAR(struct t_irc_server, nicks_count, INTEGER, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, nicks_array, STRING, "nicks_count", NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, nick_first_tried, INTEGER, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, nick_alternate_number, INTEGER, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, nick, STRING, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, nick_modes, STRING, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, isupport, STRING, NULL, NULL);
@@ -4800,6 +4898,7 @@ irc_server_print_log ()
weechat_log_printf (" nicks_count. . . . . : %d", ptr_server->nicks_count);
weechat_log_printf (" nicks_array. . . . . : 0x%lx", ptr_server->nicks_array);
weechat_log_printf (" nick_first_tried . . : %d", ptr_server->nick_first_tried);
weechat_log_printf (" nick_alternate_number: %d", ptr_server->nick_alternate_number);
weechat_log_printf (" nick . . . . . . . . : '%s'", ptr_server->nick);
weechat_log_printf (" nick_modes . . . . . : '%s'", ptr_server->nick_modes);
weechat_log_printf (" isupport . . . . . . : '%s'", ptr_server->isupport);