mirror of
https://github.com/weechat/weechat.git
synced 2026-06-30 14:56:39 +02:00
irc: add command /autojoin
This commit is contained in:
+1
-1
@@ -22,7 +22,7 @@ New features::
|
||||
|
||||
* core: search in message tags when tags are displayed with `/debug tags`
|
||||
* core: add support of date and tags in messages displayed in buffers with free content, add function printf_y_date_tags (issue #1746)
|
||||
* irc: add server option "autojoin_record"
|
||||
* irc: add command /autojoin, add server option "autojoin_record"
|
||||
* irc: add IRC message tags in messages displayed (issue #1680)
|
||||
* relay: add `zstd` (https://facebook.github.io/zstd/[Zstandard]) compression in weechat protocol, remove option `compression` from `init` command, rename option relay.network.compression_level to relay.network.compression
|
||||
* trigger: add variables `${tg_tag_irc_xxx}` containing IRC message tags (issue #1680)
|
||||
|
||||
@@ -896,6 +896,104 @@ IRC_COMMAND_CALLBACK(auth)
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for command "/autojoin": configure the server option "autojoin".
|
||||
*/
|
||||
|
||||
IRC_COMMAND_CALLBACK(autojoin)
|
||||
{
|
||||
struct t_irc_channel *ptr_channel2;
|
||||
int i;
|
||||
|
||||
IRC_BUFFER_GET_SERVER_CHANNEL(buffer);
|
||||
IRC_COMMAND_CHECK_SERVER("autojoin", 1, 1);
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) pointer;
|
||||
(void) data;
|
||||
|
||||
WEECHAT_COMMAND_MIN_ARGS(2, "");
|
||||
|
||||
/* add channel(s) */
|
||||
if (weechat_strcasecmp (argv[1], "add") == 0)
|
||||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
/* add current channel */
|
||||
if (!ptr_channel || (ptr_channel->type != IRC_CHANNEL_TYPE_CHANNEL))
|
||||
{
|
||||
weechat_printf (
|
||||
ptr_server->buffer,
|
||||
_("%s%s: \"%s\" command can only be executed in a channel "
|
||||
"buffer"),
|
||||
weechat_prefix ("error"), IRC_PLUGIN_NAME, "autojoin add");
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
irc_join_add_channel_to_autojoin (ptr_server, ptr_channel->name,
|
||||
ptr_channel->key, 1);
|
||||
}
|
||||
for (i = 2; i < argc; i++)
|
||||
{
|
||||
ptr_channel2 = irc_channel_search (ptr_server, argv[i]);
|
||||
if (ptr_channel2)
|
||||
{
|
||||
irc_join_add_channel_to_autojoin (ptr_server,
|
||||
ptr_channel2->name,
|
||||
ptr_channel2->key,
|
||||
1);
|
||||
}
|
||||
else
|
||||
{
|
||||
irc_join_add_channel_to_autojoin (ptr_server, argv[i], NULL, 1);
|
||||
}
|
||||
}
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/* add raw channel(s) */
|
||||
if (weechat_strcasecmp (argv[1], "addraw") == 0)
|
||||
{
|
||||
WEECHAT_COMMAND_MIN_ARGS(3, "addraw");
|
||||
irc_join_add_channels_to_autojoin (ptr_server, argv_eol[2], 1);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/* delete channel(s) */
|
||||
if (weechat_strcasecmp (argv[1], "del") == 0)
|
||||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
/* delete current channel */
|
||||
if (!ptr_channel || (ptr_channel->type != IRC_CHANNEL_TYPE_CHANNEL))
|
||||
{
|
||||
weechat_printf (
|
||||
ptr_server->buffer,
|
||||
_("%s%s: \"%s\" command can only be executed in a channel "
|
||||
"buffer"),
|
||||
weechat_prefix ("error"), IRC_PLUGIN_NAME, "autojoin add");
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
irc_join_remove_channel_from_autojoin (ptr_server,
|
||||
ptr_channel->name,
|
||||
1);
|
||||
}
|
||||
for (i = 2; i < argc; i++)
|
||||
{
|
||||
irc_join_remove_channel_from_autojoin (ptr_server, argv[i], 1);
|
||||
}
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/* save currently joined channels */
|
||||
if (weechat_strcasecmp (argv[1], "save") == 0)
|
||||
{
|
||||
irc_join_save_channels_to_autojoin (ptr_server, 1);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Displays a ctcp action on a channel.
|
||||
*/
|
||||
@@ -2770,7 +2868,7 @@ irc_command_join_server (struct t_irc_server *server, const char *arguments,
|
||||
if (record)
|
||||
{
|
||||
irc_join_add_channel_to_autojoin (server, pos_channel,
|
||||
ptr_key);
|
||||
ptr_key, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4154,7 +4252,8 @@ IRC_COMMAND_CALLBACK(part)
|
||||
{
|
||||
for (i = 0; i < num_channels; i++)
|
||||
{
|
||||
irc_join_remove_channel_from_autojoin (ptr_server, channels[i]);
|
||||
irc_join_remove_channel_from_autojoin (ptr_server,
|
||||
channels[i], 0);
|
||||
}
|
||||
weechat_string_free_split (channels);
|
||||
}
|
||||
@@ -6652,6 +6751,37 @@ irc_command_init ()
|
||||
"ecdsa-nist256p-challenge:\n"
|
||||
" /auth user2 ${weechat_config_dir}/ecdsa2.pem"),
|
||||
NULL, &irc_command_auth, NULL, NULL);
|
||||
weechat_hook_command (
|
||||
"autojoin",
|
||||
N_("configure the \"autojoin\" server option"),
|
||||
N_("add [<channel> [<channel>...]]"
|
||||
" || addraw <channel>[,<channel>...] [<key>[,<key>...]]"
|
||||
" || del [<channel> [<channel>...]]"
|
||||
" || save"),
|
||||
N_(" add: add current channel or a list of channels (with optional "
|
||||
"keys) to the autojoin option; if the channel is joined and the "
|
||||
"key is not provided, the key is read in the channel\n"
|
||||
" addraw: use the IRC raw format (same as /join command): all "
|
||||
"channels separated by commas, optional keys separated by commas\n"
|
||||
" del: delete current channel or a list of channels from the "
|
||||
"autojoin option\n"
|
||||
"channel: channel name (like #test)\n"
|
||||
" key: key for the channel\n"
|
||||
" save: save currently joined channels in the autojoin option\n"
|
||||
"\n"
|
||||
"Examples:\n"
|
||||
" /autojoin add\n"
|
||||
" /autojoin add #test\n"
|
||||
" /autojoin add #chan1 #chan2\n"
|
||||
" /autojoin addraw #chan1,#chan2,#chan3 key1,key2\n"
|
||||
" /autojoin del\n"
|
||||
" /autojoin del #chan1\n"
|
||||
" /autojoin save"),
|
||||
"add %(irc_channels)|%*"
|
||||
" || addraw %(irc_channels) %-"
|
||||
" || del %(irc_channels_autojoin)|%*"
|
||||
" || save",
|
||||
&irc_command_autojoin, NULL, NULL);
|
||||
weechat_hook_command_run ("/away", &irc_command_run_away, NULL, NULL);
|
||||
weechat_hook_command (
|
||||
"ban",
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "irc-completion.h"
|
||||
#include "irc-config.h"
|
||||
#include "irc-ignore.h"
|
||||
#include "irc-join.h"
|
||||
#include "irc-modelist.h"
|
||||
#include "irc-nick.h"
|
||||
#include "irc-notify.h"
|
||||
@@ -634,6 +635,53 @@ irc_completion_channels_cb (const void *pointer, void *data,
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Adds channels automatically joined on the current server
|
||||
* (option "autojoin").
|
||||
*/
|
||||
|
||||
int
|
||||
irc_completion_channels_autojoin_cb (const void *pointer, void *data,
|
||||
const char *completion_item,
|
||||
struct t_gui_buffer *buffer,
|
||||
struct t_gui_completion *completion)
|
||||
{
|
||||
struct t_arraylist *arraylist;
|
||||
struct t_irc_join_channel *ptr_join_chan;
|
||||
int i, size;
|
||||
|
||||
IRC_BUFFER_GET_SERVER(buffer);
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) pointer;
|
||||
(void) data;
|
||||
(void) completion_item;
|
||||
|
||||
if (!ptr_server)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
arraylist = irc_join_split (
|
||||
ptr_server,
|
||||
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_AUTOJOIN));
|
||||
if (!arraylist)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
size = weechat_arraylist_size (arraylist);
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
ptr_join_chan = (struct t_irc_join_channel *)weechat_arraylist_get (
|
||||
arraylist, i);
|
||||
weechat_completion_list_add (completion,
|
||||
ptr_join_chan->name,
|
||||
0,
|
||||
WEECHAT_LIST_POS_END);
|
||||
}
|
||||
|
||||
weechat_arraylist_free (arraylist);
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Adds privates of all servers to completion list.
|
||||
*/
|
||||
@@ -915,6 +963,10 @@ irc_completion_init ()
|
||||
weechat_hook_completion ("irc_channels",
|
||||
N_("channels on all IRC servers"),
|
||||
&irc_completion_channels_cb, NULL, NULL);
|
||||
weechat_hook_completion ("irc_channels_autojoin",
|
||||
N_("channels automatically joined on the current "
|
||||
"server (option \"autojoin\")"),
|
||||
&irc_completion_channels_autojoin_cb, NULL, NULL);
|
||||
weechat_hook_completion ("irc_privates",
|
||||
N_("privates on all IRC servers"),
|
||||
&irc_completion_privates_cb, NULL, NULL);
|
||||
|
||||
+200
-37
@@ -27,6 +27,7 @@
|
||||
#include "../weechat-plugin.h"
|
||||
#include "irc.h"
|
||||
#include "irc-join.h"
|
||||
#include "irc-channel.h"
|
||||
#include "irc-config.h"
|
||||
#include "irc-server.h"
|
||||
|
||||
@@ -40,7 +41,7 @@ irc_join_compare_cb (void *data, struct t_arraylist *arraylist,
|
||||
void *pointer1, void *pointer2)
|
||||
{
|
||||
struct t_irc_server *server;
|
||||
struct t_irc_join_channel *channel1, *channel2;
|
||||
struct t_irc_join_channel *ptr_join_chan1, *ptr_join_chan2;
|
||||
int rc;
|
||||
|
||||
/* make C compiler happy */
|
||||
@@ -48,21 +49,22 @@ irc_join_compare_cb (void *data, struct t_arraylist *arraylist,
|
||||
|
||||
server = (struct t_irc_server *)data;
|
||||
|
||||
channel1 = (struct t_irc_join_channel *)pointer1;
|
||||
channel2 = (struct t_irc_join_channel *)pointer2;
|
||||
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, channel1->name, channel2->name);
|
||||
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 (channel1->key && !channel2->key)
|
||||
if (ptr_join_chan1->key && !ptr_join_chan2->key)
|
||||
return -1;
|
||||
if (!channel1->key && channel2->key)
|
||||
if (!ptr_join_chan1->key && ptr_join_chan2->key)
|
||||
return 1;
|
||||
|
||||
return 1;
|
||||
@@ -75,19 +77,19 @@ irc_join_compare_cb (void *data, struct t_arraylist *arraylist,
|
||||
void
|
||||
irc_join_free_cb (void *data, struct t_arraylist *arraylist, void *pointer)
|
||||
{
|
||||
struct t_irc_join_channel *channel;
|
||||
struct t_irc_join_channel *ptr_join_chan;
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) data;
|
||||
(void) arraylist;
|
||||
|
||||
channel = (struct t_irc_join_channel *)pointer;
|
||||
ptr_join_chan = (struct t_irc_join_channel *)pointer;
|
||||
|
||||
if (channel->name)
|
||||
free (channel->name);
|
||||
if (channel->key)
|
||||
free (channel->key);
|
||||
free (channel);
|
||||
if (ptr_join_chan->name)
|
||||
free (ptr_join_chan->name);
|
||||
if (ptr_join_chan->key)
|
||||
free (ptr_join_chan->key);
|
||||
free (ptr_join_chan);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -180,9 +182,9 @@ end:
|
||||
char *
|
||||
irc_join_build_string (struct t_arraylist *arraylist)
|
||||
{
|
||||
struct t_irc_join_channel *channel;
|
||||
struct t_irc_join_channel *ptr_join_chan;
|
||||
char **channels, **keys, *result;
|
||||
int size, i;
|
||||
int i, size;
|
||||
|
||||
if (!arraylist)
|
||||
return strdup ("");
|
||||
@@ -201,16 +203,16 @@ irc_join_build_string (struct t_arraylist *arraylist)
|
||||
size = weechat_arraylist_size (arraylist);
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
channel = (struct t_irc_join_channel *)weechat_arraylist_get (
|
||||
ptr_join_chan = (struct t_irc_join_channel *)weechat_arraylist_get (
|
||||
arraylist, i);
|
||||
if (*channels[0])
|
||||
weechat_string_dyn_concat (channels, ",", -1);
|
||||
weechat_string_dyn_concat (channels, channel->name, -1);
|
||||
if (channel->key)
|
||||
weechat_string_dyn_concat (channels, ptr_join_chan->name, -1);
|
||||
if (ptr_join_chan->key)
|
||||
{
|
||||
if (*keys[0])
|
||||
weechat_string_dyn_concat (keys, ",", -1);
|
||||
weechat_string_dyn_concat (keys, channel->key, -1);
|
||||
weechat_string_dyn_concat (keys, ptr_join_chan->key, -1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,7 +254,7 @@ irc_join_add_channel (struct t_irc_server *server,
|
||||
const char *channel_name, const char *key)
|
||||
{
|
||||
struct t_arraylist *arraylist;
|
||||
struct t_irc_join_channel *channel;
|
||||
struct t_irc_join_channel *join_chan;
|
||||
char *new_join;
|
||||
|
||||
if (!channel_name)
|
||||
@@ -262,10 +264,10 @@ irc_join_add_channel (struct t_irc_server *server,
|
||||
if (!arraylist)
|
||||
return NULL;
|
||||
|
||||
channel = (struct t_irc_join_channel *)malloc (sizeof (*channel));
|
||||
channel->name = strdup (channel_name);
|
||||
channel->key = (key && key[0]) ? strdup (key) : NULL;
|
||||
weechat_arraylist_add (arraylist, channel);
|
||||
join_chan = (struct t_irc_join_channel *)malloc (sizeof (*join_chan));
|
||||
join_chan->name = strdup (channel_name);
|
||||
join_chan->key = (key && key[0]) ? strdup (key) : NULL;
|
||||
weechat_arraylist_add (arraylist, join_chan);
|
||||
|
||||
new_join = irc_join_build_string (arraylist);
|
||||
|
||||
@@ -274,13 +276,112 @@ irc_join_add_channel (struct t_irc_server *server,
|
||||
return new_join;
|
||||
}
|
||||
|
||||
/*
|
||||
* Adds channels with optional keys to the join string.
|
||||
*
|
||||
* Channels with a key are first in list, so for example:
|
||||
*
|
||||
* join = "#abc,#def,#ghi key_abc,key_def"
|
||||
* join2 = "#xyz,#jkl key_xyz"
|
||||
*
|
||||
* => returned value: "#abc,#def,#xyz,#ghi,#jkl key_abc,key_def,key_xyz"
|
||||
*
|
||||
* Note: result must be freed after use.
|
||||
*/
|
||||
|
||||
char *
|
||||
irc_join_add_channels (struct t_irc_server *server,
|
||||
const char *join, const char *join2)
|
||||
{
|
||||
struct t_arraylist *arraylist, *arraylist2;
|
||||
struct t_irc_join_channel *ptr_join_chan, *join_chan;
|
||||
char *new_join;
|
||||
int i, size;
|
||||
|
||||
arraylist = irc_join_split (server, join);
|
||||
if (!arraylist)
|
||||
return NULL;
|
||||
|
||||
arraylist2 = irc_join_split (server, join2);
|
||||
if (!arraylist2)
|
||||
{
|
||||
weechat_arraylist_free (arraylist);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size = weechat_arraylist_size (arraylist2);
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
ptr_join_chan = (struct t_irc_join_channel *)weechat_arraylist_get (
|
||||
arraylist2, i);
|
||||
join_chan = (struct t_irc_join_channel *)malloc (sizeof (*join_chan));
|
||||
join_chan->name = strdup (ptr_join_chan->name);
|
||||
join_chan->key = (ptr_join_chan->key && ptr_join_chan->key[0]) ?
|
||||
strdup (ptr_join_chan->key) : NULL;
|
||||
weechat_arraylist_add (arraylist, join_chan);
|
||||
}
|
||||
|
||||
new_join = irc_join_build_string (arraylist);
|
||||
|
||||
weechat_arraylist_free (arraylist);
|
||||
weechat_arraylist_free (arraylist2);
|
||||
|
||||
return new_join;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets server autojoin option.
|
||||
*
|
||||
* If verbose == 1, displays a message on the server buffer with old and new
|
||||
* autojoin value.
|
||||
*/
|
||||
|
||||
void
|
||||
irc_join_set_autojoin (struct t_irc_server *server, const char *autojoin,
|
||||
int verbose)
|
||||
{
|
||||
const char *ptr_old_autojoin;
|
||||
char *old_autojoin;
|
||||
|
||||
if (!server)
|
||||
return;
|
||||
|
||||
ptr_old_autojoin = IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN);
|
||||
old_autojoin = (ptr_old_autojoin && ptr_old_autojoin[0]) ?
|
||||
strdup (ptr_old_autojoin) : NULL;
|
||||
|
||||
weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
|
||||
autojoin, 1);
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
if (old_autojoin)
|
||||
{
|
||||
weechat_printf (server->buffer,
|
||||
_("Autojoin changed from \"%s\" to \"%s\""),
|
||||
old_autojoin,
|
||||
autojoin);
|
||||
}
|
||||
else
|
||||
{
|
||||
weechat_printf (server->buffer,
|
||||
_("Autojoin changed from empty value to \"%s\""),
|
||||
autojoin);
|
||||
}
|
||||
}
|
||||
|
||||
if (old_autojoin)
|
||||
free (old_autojoin);
|
||||
}
|
||||
|
||||
/*
|
||||
* Adds a channel with optional key to the autojoin option of a server.
|
||||
*/
|
||||
|
||||
void
|
||||
irc_join_add_channel_to_autojoin (struct t_irc_server *server,
|
||||
const char *channel_name, const char *key)
|
||||
const char *channel_name, const char *key,
|
||||
int verbose)
|
||||
{
|
||||
char *new_autojoin;
|
||||
|
||||
@@ -294,10 +395,28 @@ irc_join_add_channel_to_autojoin (struct t_irc_server *server,
|
||||
key);
|
||||
if (new_autojoin)
|
||||
{
|
||||
weechat_config_option_set (
|
||||
server->options[IRC_SERVER_OPTION_AUTOJOIN],
|
||||
new_autojoin,
|
||||
1);
|
||||
irc_join_set_autojoin (server, new_autojoin, verbose);
|
||||
free (new_autojoin);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Adds channels with optional keys to the autojoin option of a server.
|
||||
*/
|
||||
|
||||
void
|
||||
irc_join_add_channels_to_autojoin (struct t_irc_server *server,
|
||||
const char *join, int verbose)
|
||||
{
|
||||
char *new_autojoin;
|
||||
|
||||
new_autojoin = irc_join_add_channels (
|
||||
server,
|
||||
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN),
|
||||
join);
|
||||
if (new_autojoin)
|
||||
{
|
||||
irc_join_set_autojoin (server, new_autojoin, verbose);
|
||||
free (new_autojoin);
|
||||
}
|
||||
}
|
||||
@@ -320,7 +439,7 @@ irc_join_remove_channel (struct t_irc_server *server,
|
||||
const char *join, const char *channel_name)
|
||||
{
|
||||
struct t_arraylist *arraylist;
|
||||
struct t_irc_join_channel *channel;
|
||||
struct t_irc_join_channel *ptr_join_chan;
|
||||
char *new_join;
|
||||
int i;
|
||||
|
||||
@@ -334,9 +453,9 @@ irc_join_remove_channel (struct t_irc_server *server,
|
||||
i = 0;
|
||||
while (i < weechat_arraylist_size (arraylist))
|
||||
{
|
||||
channel = (struct t_irc_join_channel *)weechat_arraylist_get (
|
||||
ptr_join_chan = (struct t_irc_join_channel *)weechat_arraylist_get (
|
||||
arraylist, i);
|
||||
if (irc_server_strcasecmp (server, channel->name, channel_name) == 0)
|
||||
if (irc_server_strcasecmp (server, ptr_join_chan->name, channel_name) == 0)
|
||||
weechat_arraylist_remove (arraylist, i);
|
||||
else
|
||||
i++;
|
||||
@@ -355,7 +474,8 @@ irc_join_remove_channel (struct t_irc_server *server,
|
||||
|
||||
void
|
||||
irc_join_remove_channel_from_autojoin (struct t_irc_server *server,
|
||||
const char *channel_name)
|
||||
const char *channel_name,
|
||||
int verbose)
|
||||
{
|
||||
char *new_autojoin;
|
||||
|
||||
@@ -368,10 +488,53 @@ irc_join_remove_channel_from_autojoin (struct t_irc_server *server,
|
||||
channel_name);
|
||||
if (new_autojoin)
|
||||
{
|
||||
weechat_config_option_set (
|
||||
server->options[IRC_SERVER_OPTION_AUTOJOIN],
|
||||
new_autojoin,
|
||||
1);
|
||||
irc_join_set_autojoin (server, new_autojoin, verbose);
|
||||
free (new_autojoin);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Saves currently joined channels in the autojoin option of a server.
|
||||
*/
|
||||
|
||||
void
|
||||
irc_join_save_channels_to_autojoin (struct t_irc_server *server, int verbose)
|
||||
{
|
||||
struct t_arraylist *arraylist;
|
||||
struct t_irc_channel *ptr_channel;
|
||||
struct t_irc_join_channel *join_chan;
|
||||
char *new_autojoin;
|
||||
|
||||
if (!server)
|
||||
return;
|
||||
|
||||
arraylist = weechat_arraylist_new (
|
||||
16, 1, 0,
|
||||
&irc_join_compare_cb, server,
|
||||
&irc_join_free_cb, NULL);
|
||||
if (!arraylist)
|
||||
return;
|
||||
|
||||
for (ptr_channel = server->channels; ptr_channel;
|
||||
ptr_channel = ptr_channel->next_channel)
|
||||
{
|
||||
if ((ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)
|
||||
&& !ptr_channel->part)
|
||||
{
|
||||
join_chan = (struct t_irc_join_channel *)malloc (sizeof (*join_chan));
|
||||
join_chan->name = strdup (ptr_channel->name);
|
||||
join_chan->key = (ptr_channel->key && ptr_channel->key[0]) ?
|
||||
strdup (ptr_channel->key) : NULL;
|
||||
weechat_arraylist_add (arraylist, join_chan);
|
||||
}
|
||||
}
|
||||
|
||||
new_autojoin = irc_join_build_string (arraylist);
|
||||
if (new_autojoin)
|
||||
{
|
||||
irc_join_set_autojoin (server, new_autojoin, verbose);
|
||||
free (new_autojoin);
|
||||
}
|
||||
|
||||
weechat_arraylist_free (arraylist);
|
||||
}
|
||||
|
||||
@@ -34,13 +34,20 @@ 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,
|
||||
const char *key);
|
||||
void irc_join_add_channel_to_autojoin (struct t_irc_server *server,
|
||||
const char *channel_name,
|
||||
const char *key);
|
||||
extern char *irc_join_add_channels (struct t_irc_server *server,
|
||||
const char *join, const char *join2);
|
||||
extern void irc_join_add_channel_to_autojoin (struct t_irc_server *server,
|
||||
const char *channel_name,
|
||||
const char *key, int verbose);
|
||||
extern void irc_join_add_channels_to_autojoin (struct t_irc_server *server,
|
||||
const char *join, int verbose);
|
||||
extern char *irc_join_remove_channel (struct t_irc_server *server,
|
||||
const char *join,
|
||||
const char *channel_name);
|
||||
void irc_join_remove_channel_from_autojoin (struct t_irc_server *server,
|
||||
const char *channel_name);
|
||||
extern void irc_join_remove_channel_from_autojoin (struct t_irc_server *server,
|
||||
const char *channel_name,
|
||||
int verbose);
|
||||
extern void irc_join_save_channels_to_autojoin (struct t_irc_server *server,
|
||||
int verbose);
|
||||
|
||||
#endif /* WEECHAT_PLUGIN_IRC_JOIN_H */
|
||||
|
||||
@@ -26,6 +26,7 @@ extern "C"
|
||||
#include "tests/tests.h"
|
||||
#include "src/core/wee-arraylist.h"
|
||||
#include "src/core/wee-config-file.h"
|
||||
#include "src/plugins/irc/irc-channel.h"
|
||||
#include "src/plugins/irc/irc-join.h"
|
||||
#include "src/plugins/irc/irc-server.h"
|
||||
}
|
||||
@@ -43,6 +44,19 @@ extern "C"
|
||||
if (str) \
|
||||
free (str);
|
||||
|
||||
#define WEE_CHECK_ADD_CHANNELS(__result, __join, __join2) \
|
||||
str = irc_join_add_channels (NULL, __join, __join2); \
|
||||
if (__result == NULL) \
|
||||
{ \
|
||||
POINTERS_EQUAL(NULL, str); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
STRCMP_EQUAL(__result, str); \
|
||||
} \
|
||||
if (str) \
|
||||
free (str);
|
||||
|
||||
#define WEE_CHECK_REMOVE_CHANNEL(__result, __join, __channel) \
|
||||
str = irc_join_remove_channel (NULL, __join, __channel); \
|
||||
if (__result == NULL) \
|
||||
@@ -243,6 +257,31 @@ TEST(IrcJoin, AddChannel)
|
||||
WEE_CHECK_ADD_CHANNEL("#abc,#xyz,#def key_abc", "#xyz,#def", "#abc", "key_abc");
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests functions:
|
||||
* irc_join_add_channels
|
||||
*/
|
||||
|
||||
TEST(IrcJoin, AddChannels)
|
||||
{
|
||||
char *str;
|
||||
|
||||
WEE_CHECK_ADD_CHANNELS("", NULL, NULL);
|
||||
WEE_CHECK_ADD_CHANNELS("", "", NULL);
|
||||
WEE_CHECK_ADD_CHANNELS("", "", "");
|
||||
WEE_CHECK_ADD_CHANNELS("", NULL, "");
|
||||
|
||||
WEE_CHECK_ADD_CHANNELS("#abc", NULL, "#abc");
|
||||
WEE_CHECK_ADD_CHANNELS("#abc", "", "#abc");
|
||||
WEE_CHECK_ADD_CHANNELS("#abc key_abc", NULL, "#abc key_abc");
|
||||
WEE_CHECK_ADD_CHANNELS("#ABC key_ABC", NULL, "#ABC key_ABC");
|
||||
|
||||
WEE_CHECK_ADD_CHANNELS("#xyz,#abc", "#xyz", "#abc");
|
||||
WEE_CHECK_ADD_CHANNELS("#abc,#xyz key_abc", "#xyz", "#abc key_abc");
|
||||
|
||||
WEE_CHECK_ADD_CHANNELS("#abc,#xyz,#def key_abc", "#xyz,#def", "#abc key_abc");
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests functions:
|
||||
* irc_join_remove_channel
|
||||
@@ -282,79 +321,118 @@ TEST(IrcJoin, RemoveChannel)
|
||||
/*
|
||||
* Tests functions:
|
||||
* irc_join_add_channel_to_autojoin
|
||||
* irc_join_add_channels_to_autojoin
|
||||
* irc_join_remove_channel_from_autojoin
|
||||
*/
|
||||
|
||||
TEST(IrcJoin, AddRemoveChannelAutojoin)
|
||||
TEST(IrcJoin, AddRemoveChannelsAutojoin)
|
||||
{
|
||||
struct t_irc_server *server;
|
||||
|
||||
server = irc_server_alloc ("my_ircd");
|
||||
CHECK(server);
|
||||
|
||||
irc_join_remove_channel_from_autojoin (server, "#xyz");
|
||||
irc_join_remove_channel_from_autojoin (server, "#xyz", 0);
|
||||
STRCMP_EQUAL(
|
||||
"",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_add_channel_to_autojoin (server, "#xyz", NULL);
|
||||
irc_join_add_channel_to_autojoin (server, "#xyz", NULL, 0);
|
||||
STRCMP_EQUAL(
|
||||
"#xyz",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_add_channel_to_autojoin (server, NULL, NULL);
|
||||
irc_join_add_channel_to_autojoin (server, NULL, NULL, 0);
|
||||
STRCMP_EQUAL(
|
||||
"#xyz",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_add_channel_to_autojoin (server, "#abc", "key_abc");
|
||||
irc_join_add_channel_to_autojoin (server, "#abc", "key_abc", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#abc,#xyz key_abc",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_add_channel_to_autojoin (server, "#def", "key_def");
|
||||
irc_join_add_channel_to_autojoin (server, "#def", "key_def", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#abc,#def,#xyz key_abc,key_def",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_add_channel_to_autojoin (server, "#ghi", NULL);
|
||||
irc_join_add_channel_to_autojoin (server, "#ghi", NULL, 0);
|
||||
STRCMP_EQUAL(
|
||||
"#abc,#def,#xyz,#ghi key_abc,key_def",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_add_channel_to_autojoin (server, "#jkl", "");
|
||||
irc_join_add_channel_to_autojoin (server, "#jkl", "", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#abc,#def,#xyz,#ghi,#jkl key_abc,key_def",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_remove_channel_from_autojoin (server, "#def");
|
||||
irc_join_remove_channel_from_autojoin (server, "#def", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#abc,#xyz,#ghi,#jkl key_abc",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_remove_channel_from_autojoin (server, "#ghi");
|
||||
irc_join_remove_channel_from_autojoin (server, "#ghi", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#abc,#xyz,#jkl key_abc",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_remove_channel_from_autojoin (server, "#abc");
|
||||
irc_join_remove_channel_from_autojoin (server, "#abc", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#xyz,#jkl",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_remove_channel_from_autojoin (server, "#jkl");
|
||||
irc_join_remove_channel_from_autojoin (server, "#jkl", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#xyz",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_remove_channel_from_autojoin (server, "#xyz");
|
||||
irc_join_remove_channel_from_autojoin (server, "#xyz", 0);
|
||||
STRCMP_EQUAL(
|
||||
"",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_remove_channel_from_autojoin (server, NULL);
|
||||
irc_join_remove_channel_from_autojoin (server, NULL, 0);
|
||||
STRCMP_EQUAL(
|
||||
"",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_add_channels_to_autojoin (server, "#abc,#def key_abc", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#abc,#def key_abc",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_join_add_channels_to_autojoin (server, "#xyz,#ghi key_xyz", 0);
|
||||
STRCMP_EQUAL(
|
||||
"#abc,#xyz,#def,#ghi key_abc,key_xyz",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_server_free (server);
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests functions:
|
||||
* irc_join_save_channels_to_autojoin
|
||||
*/
|
||||
|
||||
TEST(IrcJoin, SaveChannelsToAutojoin)
|
||||
{
|
||||
struct t_irc_server *server;
|
||||
struct t_irc_channel *channel;
|
||||
|
||||
server = irc_server_alloc ("my_ircd");
|
||||
CHECK(server);
|
||||
|
||||
irc_channel_new (server, IRC_CHANNEL_TYPE_CHANNEL,
|
||||
"#test1", 0, 0);
|
||||
channel = irc_channel_new (server, IRC_CHANNEL_TYPE_CHANNEL,
|
||||
"#test2", 0, 0);
|
||||
channel->key = strdup ("key2");
|
||||
|
||||
irc_join_save_channels_to_autojoin (server, 0);
|
||||
STRCMP_EQUAL(
|
||||
"#test2,#test1 key2",
|
||||
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
|
||||
|
||||
irc_server_free (server);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user