1
0
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:
Sébastien Helleu
2022-03-06 20:30:33 +01:00
parent c1e65e8edd
commit 9cfdb4a324
6 changed files with 489 additions and 59 deletions
+1 -1
View File
@@ -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)
+132 -2
View File
@@ -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",
+52
View File
@@ -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
View File
@@ -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);
}
+12 -5
View File
@@ -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 */
+92 -14
View File
@@ -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);
}