diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 31cd3384e..3c8029062 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -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) diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index 27219e5bd..a40195e60 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -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 [ [...]]" + " || addraw [,...] [[,...]]" + " || del [ [...]]" + " || 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", diff --git a/src/plugins/irc/irc-completion.c b/src/plugins/irc/irc-completion.c index 792770a53..289d3779b 100644 --- a/src/plugins/irc/irc-completion.c +++ b/src/plugins/irc/irc-completion.c @@ -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); diff --git a/src/plugins/irc/irc-join.c b/src/plugins/irc/irc-join.c index 62908fa0e..51197613e 100644 --- a/src/plugins/irc/irc-join.c +++ b/src/plugins/irc/irc-join.c @@ -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); +} diff --git a/src/plugins/irc/irc-join.h b/src/plugins/irc/irc-join.h index ca2a049d6..bdc53d51b 100644 --- a/src/plugins/irc/irc-join.h +++ b/src/plugins/irc/irc-join.h @@ -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 */ diff --git a/tests/unit/plugins/irc/test-irc-join.cpp b/tests/unit/plugins/irc/test-irc-join.cpp index 11f30ad55..09ade47b3 100644 --- a/tests/unit/plugins/irc/test-irc-join.cpp +++ b/tests/unit/plugins/irc/test-irc-join.cpp @@ -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); }