mirror of
https://github.com/weechat/weechat.git
synced 2026-06-28 22:06:38 +02:00
irc: add option "-noswitch" for command /join (task #12275)
This commit is contained in:
@@ -152,6 +152,7 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
|
||||
struct t_irc_channel *new_channel;
|
||||
struct t_gui_buffer *new_buffer;
|
||||
int i, buffer_created, current_buffer_number, buffer_position, manual_join;
|
||||
int noswitch;
|
||||
char *buffer_name, str_number[32], str_group[32], *channel_name_lower;
|
||||
const char *prefix_modes;
|
||||
|
||||
@@ -265,11 +266,11 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
|
||||
new_channel->topic = NULL;
|
||||
new_channel->modes = NULL;
|
||||
new_channel->limit = 0;
|
||||
if (weechat_hashtable_has_key (server->channel_join_key, channel_name))
|
||||
if (weechat_hashtable_has_key (server->join_channel_key, channel_name))
|
||||
{
|
||||
new_channel->key = strdup (weechat_hashtable_get (server->channel_join_key,
|
||||
new_channel->key = strdup (weechat_hashtable_get (server->join_channel_key,
|
||||
channel_name));
|
||||
weechat_hashtable_remove (server->channel_join_key, channel_name);
|
||||
weechat_hashtable_remove (server->join_channel_key, channel_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -304,6 +305,7 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
|
||||
server->last_channel = new_channel;
|
||||
|
||||
manual_join = 0;
|
||||
noswitch = 0;
|
||||
channel_name_lower = NULL;
|
||||
if (channel_type == IRC_CHANNEL_TYPE_CHANNEL)
|
||||
{
|
||||
@@ -311,8 +313,10 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
|
||||
if (channel_name_lower)
|
||||
{
|
||||
weechat_string_tolower (channel_name_lower);
|
||||
manual_join = weechat_hashtable_has_key (server->manual_joins,
|
||||
manual_join = weechat_hashtable_has_key (server->join_manual,
|
||||
channel_name_lower);
|
||||
noswitch = weechat_hashtable_has_key (server->join_noswitch,
|
||||
channel_name_lower);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,7 +324,8 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
|
||||
{
|
||||
if (channel_type == IRC_CHANNEL_TYPE_CHANNEL)
|
||||
{
|
||||
if ((manual_join && !weechat_config_boolean (irc_config_look_buffer_switch_join))
|
||||
if (noswitch
|
||||
|| (manual_join && !weechat_config_boolean (irc_config_look_buffer_switch_join))
|
||||
|| (!manual_join && !weechat_config_boolean (irc_config_look_buffer_switch_autojoin)))
|
||||
switch_to_channel = 0;
|
||||
}
|
||||
@@ -332,10 +337,12 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
|
||||
}
|
||||
}
|
||||
|
||||
if (manual_join)
|
||||
weechat_hashtable_remove (server->manual_joins, channel_name_lower);
|
||||
if (channel_name_lower)
|
||||
{
|
||||
weechat_hashtable_remove (server->join_manual, channel_name_lower);
|
||||
weechat_hashtable_remove (server->join_noswitch, channel_name_lower);
|
||||
free (channel_name_lower);
|
||||
}
|
||||
|
||||
weechat_hook_signal_send ((channel_type == IRC_CHANNEL_TYPE_CHANNEL) ?
|
||||
"irc_channel_opened" : "irc_pv_opened",
|
||||
@@ -720,7 +727,7 @@ irc_channel_rejoin (struct t_irc_server *server, struct t_irc_channel *channel)
|
||||
(channel->key) ? " " : "",
|
||||
(channel->key) ? channel->key : "");
|
||||
|
||||
irc_command_join_server (server, join_args, 0);
|
||||
irc_command_join_server (server, join_args, 0, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1856,7 +1856,7 @@ irc_command_ison (void *data, struct t_gui_buffer *buffer, int argc,
|
||||
|
||||
void
|
||||
irc_command_join_server (struct t_irc_server *server, const char *arguments,
|
||||
int manual_join)
|
||||
int manual_join, int noswitch)
|
||||
{
|
||||
char *new_args, **channels, **keys, *pos_space, *pos_keys, *pos_channel;
|
||||
int i, num_channels, num_keys, length;
|
||||
@@ -1920,8 +1920,11 @@ irc_command_join_server (struct t_irc_server *server, const char *arguments,
|
||||
ptr_channel = irc_channel_search (server, new_args);
|
||||
if (ptr_channel)
|
||||
{
|
||||
weechat_buffer_set (ptr_channel->buffer,
|
||||
"display", "1");
|
||||
if (!noswitch)
|
||||
{
|
||||
weechat_buffer_set (ptr_channel->buffer,
|
||||
"display", "1");
|
||||
}
|
||||
}
|
||||
}
|
||||
new_args[0] = '\0';
|
||||
@@ -1937,12 +1940,21 @@ irc_command_join_server (struct t_irc_server *server, const char *arguments,
|
||||
strcat (new_args, "#");
|
||||
}
|
||||
strcat (new_args, channels[i]);
|
||||
if (manual_join)
|
||||
if (manual_join || noswitch)
|
||||
{
|
||||
weechat_string_tolower (channels[i]);
|
||||
weechat_hashtable_set (server->manual_joins,
|
||||
channels[i],
|
||||
&time_now);
|
||||
if (manual_join)
|
||||
{
|
||||
weechat_hashtable_set (server->join_manual,
|
||||
channels[i],
|
||||
&time_now);
|
||||
}
|
||||
if (noswitch)
|
||||
{
|
||||
weechat_hashtable_set (server->join_noswitch,
|
||||
channels[i],
|
||||
&time_now);
|
||||
}
|
||||
}
|
||||
if (keys && (i < num_keys))
|
||||
{
|
||||
@@ -1955,7 +1967,7 @@ irc_command_join_server (struct t_irc_server *server, const char *arguments,
|
||||
}
|
||||
else
|
||||
{
|
||||
weechat_hashtable_set (server->channel_join_key,
|
||||
weechat_hashtable_set (server->join_channel_key,
|
||||
pos_channel, keys[i]);
|
||||
}
|
||||
}
|
||||
@@ -1980,33 +1992,57 @@ int
|
||||
irc_command_join (void *data, struct t_gui_buffer *buffer, int argc,
|
||||
char **argv, char **argv_eol)
|
||||
{
|
||||
int i, arg_channels, noswitch;
|
||||
|
||||
IRC_BUFFER_GET_SERVER_CHANNEL(buffer);
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) data;
|
||||
|
||||
if (argc > 1)
|
||||
noswitch = 0;
|
||||
arg_channels = 1;
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
if ((argc >= 4) && (weechat_strcasecmp (argv[1], "-server") == 0))
|
||||
if (weechat_strcasecmp (argv[i], "-server") == 0)
|
||||
{
|
||||
ptr_server = irc_server_search (argv[2]);
|
||||
if (argc <= i + 1)
|
||||
{
|
||||
IRC_COMMAND_TOO_FEW_ARGUMENTS((ptr_server) ? ptr_server->buffer : NULL,
|
||||
"join");
|
||||
}
|
||||
ptr_server = irc_server_search (argv[i + 1]);
|
||||
if (!ptr_server)
|
||||
return WEECHAT_RC_ERROR;
|
||||
irc_command_join_server (ptr_server, argv_eol[3], 1);
|
||||
arg_channels = i + 2;
|
||||
i++;
|
||||
}
|
||||
else if (weechat_strcasecmp (argv[i], "-noswitch") == 0)
|
||||
{
|
||||
noswitch = 1;
|
||||
arg_channels = i + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
IRC_COMMAND_CHECK_SERVER("join", 1);
|
||||
irc_command_join_server (ptr_server, argv_eol[1], 1);
|
||||
arg_channels = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
IRC_COMMAND_CHECK_SERVER("join", 1);
|
||||
|
||||
if (arg_channels < argc)
|
||||
{
|
||||
irc_command_join_server (ptr_server, argv_eol[arg_channels],
|
||||
1, noswitch);
|
||||
}
|
||||
else
|
||||
{
|
||||
IRC_COMMAND_CHECK_SERVER("join", 1);
|
||||
if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)
|
||||
&& !ptr_channel->nicks)
|
||||
{
|
||||
irc_command_join_server (ptr_server, ptr_channel->name, 1);
|
||||
irc_command_join_server (ptr_server, ptr_channel->name,
|
||||
1, noswitch);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -5121,18 +5157,20 @@ irc_command_init ()
|
||||
"%(nicks)|%*", &irc_command_ison, NULL);
|
||||
weechat_hook_command ("join",
|
||||
N_("join a channel"),
|
||||
N_("[-server <server>] [<channel1>[,<channel2>...]] "
|
||||
"[<key1>[,<key2>...]]"),
|
||||
N_(" server: send to this server (internal name)\n"
|
||||
"channel: channel name to join\n"
|
||||
" key: key to join the channel (channels with "
|
||||
N_("[-noswitch] [-server <server>] "
|
||||
"[<channel1>[,<channel2>...]] [<key1>[,<key2>...]]"),
|
||||
N_("-noswitch: do not switch to new buffer\n"
|
||||
" server: send to this server (internal name)\n"
|
||||
" channel: channel name to join\n"
|
||||
" key: key to join the channel (channels with "
|
||||
"a key must be the first in list)\n\n"
|
||||
"Examples:\n"
|
||||
" /join #weechat\n"
|
||||
" /join #protectedchan,#weechat key\n"
|
||||
" /join -server freenode #weechat"),
|
||||
"-server %(irc_servers)"
|
||||
" || %(irc_channels)", &irc_command_join, NULL);
|
||||
" /join -server freenode #weechat\n"
|
||||
" /join -noswitch #weechat"),
|
||||
"%(irc_channels)|-noswitch|-server|%(irc_servers)|%*",
|
||||
&irc_command_join, NULL);
|
||||
weechat_hook_command ("kick",
|
||||
N_("forcibly remove a user from a channel"),
|
||||
N_("[<channel>] <nick> [<reason>]"),
|
||||
|
||||
@@ -55,7 +55,8 @@ extern void irc_command_away_server (struct t_irc_server *server,
|
||||
int reset_unread_marker);
|
||||
extern void irc_command_join_server (struct t_irc_server *server,
|
||||
const char *arguments,
|
||||
int manual_join);
|
||||
int manual_join,
|
||||
int noswitch);
|
||||
extern void irc_command_mode_server (struct t_irc_server *server,
|
||||
struct t_irc_channel *channel,
|
||||
const char *arguments,
|
||||
|
||||
@@ -1343,14 +1343,14 @@ IRC_PROTOCOL_CALLBACK(part)
|
||||
snprintf (join_string, join_length, "%s %s",
|
||||
ptr_channel->name,
|
||||
ptr_channel->key);
|
||||
irc_command_join_server (server, join_string, 1);
|
||||
irc_command_join_server (server, join_string, 1, 1);
|
||||
free (join_string);
|
||||
}
|
||||
else
|
||||
irc_command_join_server (server, ptr_channel->name, 1);
|
||||
irc_command_join_server (server, ptr_channel->name, 1, 1);
|
||||
}
|
||||
else
|
||||
irc_command_join_server (server, ptr_channel->name, 1);
|
||||
irc_command_join_server (server, ptr_channel->name, 1, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -106,7 +106,7 @@ char *irc_server_chanmodes_default = "beI,k,l";
|
||||
const char *irc_server_send_default_tags = NULL; /* default tags when */
|
||||
/* sending a message */
|
||||
|
||||
time_t irc_server_last_check_manual_joins = 0;
|
||||
time_t irc_server_last_check_join_channels = 0;
|
||||
|
||||
|
||||
void irc_server_reconnect (struct t_irc_server *server);
|
||||
@@ -912,16 +912,21 @@ irc_server_alloc (const char *name)
|
||||
new_server->last_redirect = NULL;
|
||||
new_server->notify_list = NULL;
|
||||
new_server->last_notify = NULL;
|
||||
new_server->manual_joins = weechat_hashtable_new (4,
|
||||
WEECHAT_HASHTABLE_STRING,
|
||||
WEECHAT_HASHTABLE_INTEGER,
|
||||
NULL,
|
||||
NULL);
|
||||
new_server->channel_join_key = weechat_hashtable_new (4,
|
||||
new_server->join_manual = weechat_hashtable_new (4,
|
||||
WEECHAT_HASHTABLE_STRING,
|
||||
WEECHAT_HASHTABLE_INTEGER,
|
||||
NULL,
|
||||
NULL);
|
||||
new_server->join_channel_key = weechat_hashtable_new (4,
|
||||
WEECHAT_HASHTABLE_STRING,
|
||||
WEECHAT_HASHTABLE_STRING,
|
||||
NULL,
|
||||
NULL);
|
||||
new_server->join_noswitch = weechat_hashtable_new (4,
|
||||
WEECHAT_HASHTABLE_STRING,
|
||||
WEECHAT_HASHTABLE_STRING,
|
||||
NULL,
|
||||
NULL);
|
||||
new_server->buffer = NULL;
|
||||
new_server->buffer_as_string = NULL;
|
||||
new_server->channels = NULL;
|
||||
@@ -1368,8 +1373,9 @@ irc_server_free_data (struct t_irc_server *server)
|
||||
irc_server_outqueue_free_all (server, i);
|
||||
}
|
||||
irc_notify_free_all (server);
|
||||
weechat_hashtable_free (server->manual_joins);
|
||||
weechat_hashtable_free (server->channel_join_key);
|
||||
weechat_hashtable_free (server->join_manual);
|
||||
weechat_hashtable_free (server->join_channel_key);
|
||||
weechat_hashtable_free (server->join_noswitch);
|
||||
irc_redirect_free_all (server);
|
||||
if (server->channels)
|
||||
irc_channel_free_all (server);
|
||||
@@ -2605,21 +2611,41 @@ irc_server_timer_sasl_cb (void *data, int remaining_calls)
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_server_check_manual_joins_cb: callback called for each manual join of a
|
||||
* server, it will delete old channels in
|
||||
* this hashtable
|
||||
* irc_server_check_join_manual_cb: callback called for each manual join of a
|
||||
* server, it will delete old channels in
|
||||
* this hashtable
|
||||
*/
|
||||
|
||||
void
|
||||
irc_server_check_manual_joins_cb (void *data, struct t_hashtable *hashtable,
|
||||
const void *key, const void *value)
|
||||
irc_server_check_join_manual_cb (void *data, struct t_hashtable *hashtable,
|
||||
const void *key, const void *value)
|
||||
{
|
||||
struct t_irc_server *server;
|
||||
|
||||
server = (struct t_irc_server *)data;
|
||||
if (server)
|
||||
{
|
||||
if (*((int *)value) + 60 < time (NULL))
|
||||
if (*((int *)value) + (60 * 5) < time (NULL))
|
||||
weechat_hashtable_remove (hashtable, key);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_server_check_join_noswitch_cb: callback called for each join without
|
||||
* switch of a server, it will delete old
|
||||
* channels in this hashtable
|
||||
*/
|
||||
|
||||
void
|
||||
irc_server_check_join_noswitch_cb (void *data, struct t_hashtable *hashtable,
|
||||
const void *key, const void *value)
|
||||
{
|
||||
struct t_irc_server *server;
|
||||
|
||||
server = (struct t_irc_server *)data;
|
||||
if (server)
|
||||
{
|
||||
if (*((int *)value) + (60 * 5) < time (NULL))
|
||||
weechat_hashtable_remove (hashtable, key);
|
||||
}
|
||||
}
|
||||
@@ -2738,12 +2764,19 @@ irc_server_timer_cb (void *data, int remaining_calls)
|
||||
ptr_redirect = ptr_next_redirect;
|
||||
}
|
||||
|
||||
/* remove old channels in "manual_joins" (each 60 seconds) */
|
||||
if (current_time > irc_server_last_check_manual_joins + 60)
|
||||
/*
|
||||
* remove old channels in "join_manual" and "join_noswitch"
|
||||
* (every 5 minutes)
|
||||
*/
|
||||
if (current_time > irc_server_last_check_join_channels + (60 * 5))
|
||||
{
|
||||
weechat_hashtable_map (ptr_server->manual_joins,
|
||||
&irc_server_check_manual_joins_cb,
|
||||
weechat_hashtable_map (ptr_server->join_manual,
|
||||
&irc_server_check_join_manual_cb,
|
||||
ptr_server);
|
||||
weechat_hashtable_map (ptr_server->join_noswitch,
|
||||
&irc_server_check_join_noswitch_cb,
|
||||
ptr_server);
|
||||
irc_server_last_check_join_channels = current_time;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2822,10 +2855,13 @@ irc_server_close_connection (struct t_irc_server *server)
|
||||
irc_redirect_free_all (server);
|
||||
|
||||
/* remove all manual joins */
|
||||
weechat_hashtable_remove_all (server->manual_joins);
|
||||
weechat_hashtable_remove_all (server->join_manual);
|
||||
|
||||
/* remove all keys for pending joins */
|
||||
weechat_hashtable_remove_all (server->channel_join_key);
|
||||
weechat_hashtable_remove_all (server->join_channel_key);
|
||||
|
||||
/* remove all keys for joins without switch */
|
||||
weechat_hashtable_remove_all (server->join_noswitch);
|
||||
|
||||
/* server is now disconnected */
|
||||
server->is_connected = 0;
|
||||
@@ -4030,7 +4066,7 @@ irc_server_autojoin_channels (struct t_irc_server *server)
|
||||
/* auto-join when connecting to server for first time */
|
||||
autojoin = IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN);
|
||||
if (!server->disable_autojoin && autojoin && autojoin[0])
|
||||
irc_command_join_server (server, autojoin, 0);
|
||||
irc_command_join_server (server, autojoin, 0, 0);
|
||||
}
|
||||
|
||||
server->disable_autojoin = 0;
|
||||
@@ -4460,8 +4496,9 @@ irc_server_hdata_server_cb (void *data, const char *hdata_name)
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, last_redirect, POINTER, 0, NULL, "irc_redirect");
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, notify_list, POINTER, 0, NULL, "irc_notify");
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, last_notify, POINTER, 0, NULL, "irc_notify");
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, manual_joins, HASHTABLE, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, channel_join_key, HASHTABLE, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, join_manual, HASHTABLE, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, join_channel_key, HASHTABLE, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, join_noswitch, HASHTABLE, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, buffer, POINTER, 0, NULL, "buffer");
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, buffer_as_string, STRING, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_server, channels, POINTER, 0, NULL, "irc_channel");
|
||||
@@ -4982,12 +5019,15 @@ irc_server_print_log ()
|
||||
weechat_log_printf (" last_redirect. . . . : 0x%lx", ptr_server->last_redirect);
|
||||
weechat_log_printf (" notify_list. . . . . : 0x%lx", ptr_server->notify_list);
|
||||
weechat_log_printf (" last_notify. . . . . : 0x%lx", ptr_server->last_notify);
|
||||
weechat_log_printf (" manual_joins . . . . : 0x%lx (hashtable: '%s')",
|
||||
ptr_server->manual_joins,
|
||||
weechat_hashtable_get_string (ptr_server->manual_joins, "keys_values"));
|
||||
weechat_log_printf (" channel_join_key . . : 0x%lx (hashtable: '%s')",
|
||||
ptr_server->channel_join_key,
|
||||
weechat_hashtable_get_string (ptr_server->channel_join_key, "keys_values"));
|
||||
weechat_log_printf (" join_manual. . . . . : 0x%lx (hashtable: '%s')",
|
||||
ptr_server->join_manual,
|
||||
weechat_hashtable_get_string (ptr_server->join_manual, "keys_values"));
|
||||
weechat_log_printf (" join_channel_key . . : 0x%lx (hashtable: '%s')",
|
||||
ptr_server->join_channel_key,
|
||||
weechat_hashtable_get_string (ptr_server->join_channel_key, "keys_values"));
|
||||
weechat_log_printf (" join_noswitch. . . . : 0x%lx (hashtable: '%s')",
|
||||
ptr_server->join_noswitch,
|
||||
weechat_hashtable_get_string (ptr_server->join_noswitch, "keys_values"));
|
||||
weechat_log_printf (" buffer . . . . . . . : 0x%lx", ptr_server->buffer);
|
||||
weechat_log_printf (" buffer_as_string . . : 0x%lx", ptr_server->buffer_as_string);
|
||||
weechat_log_printf (" channels . . . . . . : 0x%lx", ptr_server->channels);
|
||||
|
||||
@@ -197,8 +197,9 @@ struct t_irc_server
|
||||
struct t_irc_redirect *last_redirect; /* last command redirection */
|
||||
struct t_irc_notify *notify_list; /* list of notify */
|
||||
struct t_irc_notify *last_notify; /* last notify */
|
||||
struct t_hashtable *manual_joins; /* manual joins pending */
|
||||
struct t_hashtable *channel_join_key; /* keys pending for joins */
|
||||
struct t_hashtable *join_manual; /* manual joins pending */
|
||||
struct t_hashtable *join_channel_key; /* keys pending for joins */
|
||||
struct t_hashtable *join_noswitch; /* joins w/o switch to buffer */
|
||||
struct t_gui_buffer *buffer; /* GUI buffer allocated for server */
|
||||
char *buffer_as_string; /* used to return buffer info */
|
||||
struct t_irc_channel *channels; /* opened channels on server */
|
||||
|
||||
Reference in New Issue
Block a user