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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user