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:
@@ -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
@@ -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],
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user