1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-06 01:33:12 +02:00

irc: add option buffer in command /autojoin sort (closes #1876)

This commit is contained in:
Sébastien Helleu
2023-05-01 17:02:51 +02:00
parent 66d79e2d23
commit b127bed0fc
19 changed files with 307 additions and 87 deletions
+9 -4
View File
@@ -910,6 +910,7 @@ IRC_COMMAND_CALLBACK(autojoin)
struct t_irc_channel *ptr_channel2;
const char *ptr_autojoin;
char *old_autojoin, *autojoin;
enum t_irc_join_sort sort;
int i;
IRC_BUFFER_GET_SERVER_CHANNEL(buffer);
@@ -1025,7 +1026,9 @@ IRC_COMMAND_CALLBACK(autojoin)
/* sort channels */
if (weechat_strcmp (argv[1], "sort") == 0)
{
irc_join_sort_autojoin (ptr_server);
sort = ((argc > 2) && (weechat_strcmp (argv[2], "buffer") == 0)) ?
IRC_JOIN_SORT_BUFFER : IRC_JOIN_SORT_ALPHA;
irc_join_sort_autojoin (ptr_server, sort);
goto end;
}
@@ -6889,7 +6892,7 @@ irc_command_init ()
" || del [<channel1> [<channel2>...]]"
" || apply"
" || join"
" || sort"),
" || sort [buffer]"),
N_(" add: add current channel or a list of channels (with optional "
"keys) to the autojoin option; if you are on the channel and the "
"key is not provided, the key is read in the channel\n"
@@ -6902,6 +6905,7 @@ irc_command_init ()
" apply: set currently joined channels in the autojoin option\n"
" join: join the channels in the autojoin option\n"
" sort: sort alphabetically channels in the autojoin option\n"
" buffer: sort channels by order of buffers in the autojoin option\n"
"\n"
"Examples:\n"
" /autojoin add\n"
@@ -6913,13 +6917,14 @@ irc_command_init ()
" /autojoin del #chan1\n"
" /autojoin apply\n"
" /autojoin join\n"
" /autojoin sort"),
" /autojoin sort\n"
" /autojoin sort buffer"),
"add %(irc_channels)|%*"
" || addraw %(irc_channels) %-"
" || del %(irc_channels_autojoin)|%*"
" || apply"
" || join"
" || sort",
" || sort buffer",
&irc_command_autojoin, NULL, NULL);
weechat_hook_command_run ("/away", &irc_command_run_away, NULL, NULL);
weechat_hook_command (
+85 -18
View File
@@ -59,7 +59,7 @@ irc_join_compare_join_channel (struct t_irc_server *server,
}
/*
* Compares two join channels (no sort, keyed channels first).
* Compares two join channels: no sort, keyed channels first.
*/
int
@@ -97,12 +97,12 @@ irc_join_compare_cb (void *data, struct t_arraylist *arraylist,
}
/*
* Compares two join channels (alphabetic sort, keyed channels first).
* Compares two join channels: alphabetic sort, keyed channels first.
*/
int
irc_join_compare_sort_cb (void *data, struct t_arraylist *arraylist,
void *pointer1, void *pointer2)
irc_join_compare_sort_alpha_cb (void *data, struct t_arraylist *arraylist,
void *pointer1, void *pointer2)
{
struct t_irc_server *server;
struct t_irc_join_channel *ptr_join_chan1, *ptr_join_chan2;
@@ -134,6 +134,59 @@ irc_join_compare_sort_cb (void *data, struct t_arraylist *arraylist,
return rc;
}
/*
* Compares two join channels: buffer sort, then alphabetic,
* keyed channels first.
*/
int
irc_join_compare_sort_buffer_cb (void *data, struct t_arraylist *arraylist,
void *pointer1, void *pointer2)
{
struct t_irc_server *server;
struct t_irc_channel *ptr_channel1, *ptr_channel2;
struct t_irc_join_channel *ptr_join_chan1, *ptr_join_chan2;
int rc, buffer_num1, buffer_num2;
/* make C compiler happy */
(void) arraylist;
server = (struct t_irc_server *)data;
ptr_join_chan1 = (struct t_irc_join_channel *)pointer1;
ptr_join_chan2 = (struct t_irc_join_channel *)pointer2;
/*
* if channel is the same, always consider it's the same, even if the key
* is different
*/
rc = irc_server_strcasecmp (server, ptr_join_chan1->name,
ptr_join_chan2->name);
if (rc == 0)
return 0;
/* channels with a key are first in list */
if (ptr_join_chan1->key && !ptr_join_chan2->key)
return -1;
if (!ptr_join_chan1->key && ptr_join_chan2->key)
return 1;
/* search buffer number for each channel */
ptr_channel1 = irc_channel_search (server, ptr_join_chan1->name);
buffer_num1 = (ptr_channel1 && ptr_channel1->buffer) ?
weechat_buffer_get_integer (ptr_channel1->buffer, "number") : INT_MAX;
ptr_channel2 = irc_channel_search (server, ptr_join_chan2->name);
buffer_num2 = (ptr_channel2 && ptr_channel2->buffer) ?
weechat_buffer_get_integer (ptr_channel2->buffer, "number") : INT_MAX;
if (buffer_num1 < buffer_num2)
return -1;
if (buffer_num1 > buffer_num2)
return 1;
/* same buffer number: fallback on alphabetic sort */
return rc;
}
/*
* Frees a join channel.
*/
@@ -242,19 +295,22 @@ irc_join_arraylist_add (struct t_arraylist *arraylist,
*
* #channel1,#channel2,#channel3 key1,key2
*
* If sort == 1, channels are sorted alphabetically, otherwise in the order
* they are received.
* In all cases, keyed channels are first in list.
* Parameter sort can be (in all cases, keyed channels are first in list):
* IRC_JOIN_SORT_DISABLED: no sort
* IRC_JOIN_SORT_ALPHA: alphabetic sort
* IRC_JOIN_SORT_BUFFER: sort by buffer number, then alphabetic
*/
struct t_arraylist *
irc_join_split (struct t_irc_server *server, const char *join, int sort)
irc_join_split (struct t_irc_server *server, const char *join,
enum t_irc_join_sort sort)
{
struct t_arraylist *arraylist;
char **items, **channels, **keys;
int count_items, count_channels, count_keys, i;
const char *ptr_channels, *ptr_keys;
struct t_irc_join_channel *new_channel;
void *sort_cb;
arraylist = NULL;
items = NULL;
@@ -292,12 +348,22 @@ irc_join_split (struct t_irc_server *server, const char *join, int sort)
0, &count_keys);
}
arraylist = weechat_arraylist_new (
16, 1, 0,
(sort) ? &irc_join_compare_sort_cb : &irc_join_compare_cb,
server,
&irc_join_free_cb,
NULL);
switch (sort)
{
case IRC_JOIN_SORT_ALPHA:
sort_cb = &irc_join_compare_sort_alpha_cb;
break;
case IRC_JOIN_SORT_BUFFER:
sort_cb = &irc_join_compare_sort_buffer_cb;
break;
default:
sort_cb = &irc_join_compare_cb;
break;
}
arraylist = weechat_arraylist_new (16, 1, 0,
sort_cb, server,
&irc_join_free_cb, NULL);
if (!arraylist)
goto end;
@@ -807,12 +873,13 @@ irc_join_save_channels_to_autojoin (struct t_irc_server *server)
*/
char *
irc_join_sort_channels (struct t_irc_server *server, const char *join)
irc_join_sort_channels (struct t_irc_server *server, const char *join,
enum t_irc_join_sort sort)
{
struct t_arraylist *arraylist;
char *new_join;
arraylist = irc_join_split (server, join, 1);
arraylist = irc_join_split (server, join, sort);
if (!arraylist)
return NULL;
@@ -828,7 +895,7 @@ irc_join_sort_channels (struct t_irc_server *server, const char *join)
*/
void
irc_join_sort_autojoin (struct t_irc_server *server)
irc_join_sort_autojoin (struct t_irc_server *server, enum t_irc_join_sort sort)
{
const char *ptr_autojoin;
char *new_autojoin;
@@ -841,7 +908,7 @@ irc_join_sort_autojoin (struct t_irc_server *server)
if (!ptr_autojoin || !ptr_autojoin[0])
return;
new_autojoin = irc_join_sort_channels (server, ptr_autojoin);
new_autojoin = irc_join_sort_channels (server, ptr_autojoin, sort);
if (new_autojoin)
{
weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
+16 -5
View File
@@ -20,17 +20,26 @@
#ifndef WEECHAT_PLUGIN_IRC_JOIN_H
#define WEECHAT_PLUGIN_IRC_JOIN_H
enum t_irc_join_sort
{
IRC_JOIN_SORT_DISABLED = 0, /* no sort */
IRC_JOIN_SORT_ALPHA, /* alphabetic sort */
IRC_JOIN_SORT_BUFFER, /* sort by buffer number, then alpha */
/* number of sort methods */
IRC_JOIN_NUM_SORT,
};
struct t_irc_server;
struct t_irc_join_channel
{
char *name; /* channel name */
char *key; /* channel key */
char *name; /* channel name */
char *key; /* channel key */
};
extern struct t_arraylist *irc_join_split (struct t_irc_server *server,
const char *join,
int sort);
enum t_irc_join_sort sort);
extern char *irc_join_build_string (struct t_arraylist *arraylist);
extern int irc_join_has_channel (struct t_irc_server *server,
const char *join, const char *channel_name);
@@ -58,7 +67,9 @@ extern void irc_join_rename_channel_in_autojoin (struct t_irc_server *server,
const char *new_channel_name);
extern void irc_join_save_channels_to_autojoin (struct t_irc_server *server);
extern char *irc_join_sort_channels (struct t_irc_server *server,
const char *join);
extern void irc_join_sort_autojoin (struct t_irc_server *server);
const char *join,
enum t_irc_join_sort sort);
extern void irc_join_sort_autojoin (struct t_irc_server *server,
enum t_irc_join_sort sort);
#endif /* WEECHAT_PLUGIN_IRC_JOIN_H */