mirror of
https://github.com/weechat/weechat.git
synced 2026-07-09 03:03:12 +02:00
irc: add option "sort" in command /autojoin
This commit is contained in:
@@ -995,6 +995,13 @@ IRC_COMMAND_CALLBACK(autojoin)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* sort channels */
|
||||
if (weechat_strcasecmp (argv[1], "sort") == 0)
|
||||
{
|
||||
irc_join_sort_autojoin (ptr_server);
|
||||
goto end;
|
||||
}
|
||||
|
||||
end:
|
||||
ptr_autojoin = IRC_SERVER_OPTION_STRING(ptr_server,
|
||||
IRC_SERVER_OPTION_AUTOJOIN);
|
||||
@@ -6784,7 +6791,8 @@ irc_command_init ()
|
||||
N_("add [<channel1> [<channel2>...]]"
|
||||
" || addraw <channel1>[,<channel2>...] [<key1>[,<key2>...]]"
|
||||
" || del [<channel1> [<channel2>...]]"
|
||||
" || save"),
|
||||
" || save"
|
||||
" || sort"),
|
||||
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"
|
||||
@@ -6795,6 +6803,7 @@ irc_command_init ()
|
||||
"channel: channel name\n"
|
||||
" key: key for the channel\n"
|
||||
" save: save currently joined channels in the autojoin option\n"
|
||||
" sort: sort alphabetically channels in the autojoin option\n"
|
||||
"\n"
|
||||
"Examples:\n"
|
||||
" /autojoin add\n"
|
||||
@@ -6803,11 +6812,13 @@ irc_command_init ()
|
||||
" /autojoin addraw #chan1,#chan2,#chan3 key1,key2\n"
|
||||
" /autojoin del\n"
|
||||
" /autojoin del #chan1\n"
|
||||
" /autojoin save"),
|
||||
" /autojoin save\n"
|
||||
" /autojoin sort"),
|
||||
"add %(irc_channels)|%*"
|
||||
" || addraw %(irc_channels) %-"
|
||||
" || del %(irc_channels_autojoin)|%*"
|
||||
" || save",
|
||||
" || save"
|
||||
" || sort",
|
||||
&irc_command_autojoin, NULL, NULL);
|
||||
weechat_hook_command_run ("/away", &irc_command_run_away, NULL, NULL);
|
||||
weechat_hook_command (
|
||||
|
||||
@@ -662,7 +662,8 @@ irc_completion_channels_autojoin_cb (const void *pointer, void *data,
|
||||
|
||||
arraylist = irc_join_split (
|
||||
ptr_server,
|
||||
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_AUTOJOIN));
|
||||
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_AUTOJOIN),
|
||||
0);
|
||||
if (!arraylist)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
|
||||
+102
-8
@@ -33,7 +33,7 @@
|
||||
|
||||
|
||||
/*
|
||||
* Compares two join channels.
|
||||
* Compares two join channels (no sort, keyed channels first).
|
||||
*/
|
||||
|
||||
int
|
||||
@@ -70,6 +70,44 @@ irc_join_compare_cb (void *data, struct t_arraylist *arraylist,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
struct t_irc_server *server;
|
||||
struct t_irc_join_channel *ptr_join_chan1, *ptr_join_chan2;
|
||||
int rc;
|
||||
|
||||
/* 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;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Frees a join channel.
|
||||
*/
|
||||
@@ -122,10 +160,14 @@ irc_join_arraylist_add (struct t_arraylist *arraylist,
|
||||
* command (channels with key first in list), for example:
|
||||
*
|
||||
* #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.
|
||||
*/
|
||||
|
||||
struct t_arraylist *
|
||||
irc_join_split (struct t_irc_server *server, const char *join)
|
||||
irc_join_split (struct t_irc_server *server, const char *join, int sort)
|
||||
{
|
||||
struct t_arraylist *arraylist;
|
||||
char **items, **channels, **keys;
|
||||
@@ -171,8 +213,10 @@ irc_join_split (struct t_irc_server *server, const char *join)
|
||||
|
||||
arraylist = weechat_arraylist_new (
|
||||
16, 1, 0,
|
||||
&irc_join_compare_cb, server,
|
||||
&irc_join_free_cb, NULL);
|
||||
(sort) ? &irc_join_compare_sort_cb : &irc_join_compare_cb,
|
||||
server,
|
||||
&irc_join_free_cb,
|
||||
NULL);
|
||||
if (!arraylist)
|
||||
goto end;
|
||||
|
||||
@@ -282,7 +326,7 @@ irc_join_add_channel (struct t_irc_server *server,
|
||||
if (!channel_name)
|
||||
return NULL;
|
||||
|
||||
arraylist = irc_join_split (server, join);
|
||||
arraylist = irc_join_split (server, join, 0);
|
||||
if (!arraylist)
|
||||
return NULL;
|
||||
|
||||
@@ -320,11 +364,11 @@ irc_join_add_channels (struct t_irc_server *server,
|
||||
char *new_join;
|
||||
int i, size;
|
||||
|
||||
arraylist = irc_join_split (server, join);
|
||||
arraylist = irc_join_split (server, join, 0);
|
||||
if (!arraylist)
|
||||
return NULL;
|
||||
|
||||
arraylist2 = irc_join_split (server, join2);
|
||||
arraylist2 = irc_join_split (server, join2, 0);
|
||||
if (!arraylist2)
|
||||
{
|
||||
weechat_arraylist_free (arraylist);
|
||||
@@ -424,7 +468,7 @@ irc_join_remove_channel (struct t_irc_server *server,
|
||||
if (!channel_name)
|
||||
return NULL;
|
||||
|
||||
arraylist = irc_join_split (server, join);
|
||||
arraylist = irc_join_split (server, join, 0);
|
||||
if (!arraylist)
|
||||
return NULL;
|
||||
|
||||
@@ -517,3 +561,53 @@ irc_join_save_channels_to_autojoin (struct t_irc_server *server)
|
||||
|
||||
weechat_arraylist_free (arraylist);
|
||||
}
|
||||
|
||||
/*
|
||||
* Sorts channels.
|
||||
*/
|
||||
|
||||
char *
|
||||
irc_join_sort_channels (struct t_irc_server *server, const char *join)
|
||||
{
|
||||
struct t_arraylist *arraylist;
|
||||
char *new_join;
|
||||
|
||||
arraylist = irc_join_split (server, join, 1);
|
||||
if (!arraylist)
|
||||
return NULL;
|
||||
|
||||
new_join = irc_join_build_string (arraylist);
|
||||
|
||||
weechat_arraylist_free (arraylist);
|
||||
|
||||
return new_join;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sorts channels in autojoin option of a server.
|
||||
*/
|
||||
|
||||
void
|
||||
irc_join_sort_autojoin (struct t_irc_server *server)
|
||||
{
|
||||
const char *ptr_autojoin;
|
||||
char *new_autojoin;
|
||||
|
||||
if (!server)
|
||||
return;
|
||||
|
||||
ptr_autojoin = IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN);
|
||||
|
||||
if (!ptr_autojoin || !ptr_autojoin[0])
|
||||
return;
|
||||
|
||||
new_autojoin = irc_join_sort_channels (
|
||||
server,
|
||||
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN));
|
||||
if (new_autojoin)
|
||||
{
|
||||
weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
|
||||
new_autojoin, 1);
|
||||
free (new_autojoin);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,8 @@ struct t_irc_join_channel
|
||||
};
|
||||
|
||||
extern struct t_arraylist *irc_join_split (struct t_irc_server *server,
|
||||
const char *join);
|
||||
const char *join,
|
||||
int sort);
|
||||
extern char *irc_join_build_string (struct t_arraylist *arraylist);
|
||||
extern char *irc_join_add_channel (struct t_irc_server *server,
|
||||
const char *join, const char *channel_name,
|
||||
@@ -47,5 +48,8 @@ extern char *irc_join_remove_channel (struct t_irc_server *server,
|
||||
extern void irc_join_remove_channel_from_autojoin (struct t_irc_server *server,
|
||||
const char *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);
|
||||
|
||||
#endif /* WEECHAT_PLUGIN_IRC_JOIN_H */
|
||||
|
||||
Reference in New Issue
Block a user