summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2023-05-01 17:02:51 +0200
committerSébastien Helleu <flashcode@flashtux.org>2023-05-01 17:02:51 +0200
commitb127bed0fc686be3e00c5709660cda225885fb48 (patch)
tree6777e1caff447007e0993613d2d2fd5fcefb50ee /src
parent66d79e2d23ef121b8929930f30278979f333ef3e (diff)
downloadweechat-b127bed0fc686be3e00c5709660cda225885fb48.zip
irc: add option `buffer` in command `/autojoin sort` (closes #1876)
Diffstat (limited to 'src')
-rw-r--r--src/plugins/irc/irc-command.c13
-rw-r--r--src/plugins/irc/irc-join.c103
-rw-r--r--src/plugins/irc/irc-join.h21
3 files changed, 110 insertions, 27 deletions
diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c
index 4733750b7..2e8f1c06c 100644
--- a/src/plugins/irc/irc-command.c
+++ b/src/plugins/irc/irc-command.c
@@ -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 (
diff --git a/src/plugins/irc/irc-join.c b/src/plugins/irc/irc-join.c
index dd4324eb7..0707cb725 100644
--- a/src/plugins/irc/irc-join.c
+++ b/src/plugins/irc/irc-join.c
@@ -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;
@@ -135,6 +135,59 @@ irc_join_compare_sort_cb (void *data, struct t_arraylist *arraylist,
}
/*
+ * 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],
diff --git a/src/plugins/irc/irc-join.h b/src/plugins/irc/irc-join.h
index 3da75d87f..6fd238a3e 100644
--- a/src/plugins/irc/irc-join.h
+++ b/src/plugins/irc/irc-join.h
@@ -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 */