diff --git a/src/command.c b/src/command.c index 9d3443a24..8d926b3ab 100644 --- a/src/command.c +++ b/src/command.c @@ -28,8 +28,8 @@ #include "weechat.h" #include "command.h" -#include "irc/irc.h" #include "config.h" +#include "irc/irc.h" #include "gui/gui.h" @@ -48,6 +48,21 @@ t_weechat_command weechat_commands[] = { "help", N_("display help about commands"), N_("[command]"), N_("command: name of a " WEECHAT_NAME " or IRC command"), 0, 1, weechat_cmd_help, NULL }, + { "server", N_("list, add or remove servers"), + N_("[list] | " + "[[add] servername [-auto | -noauto] hostname [-port port] [-pwd password] [-nicks nick1 " + "[nick2 [nick3]]] [-username username] [-realname realname]] | " + "[del servername]"), + N_("servername: server name, for internal & display use\n" + "hostname: name or IP address of server\n" + "port: port for server (integer)\n" + "password: password for server\n" + "nick1: first nick for server\n" + "nick2: alternate nick for server\n" + "nick3: second alternate nick for server\n" + "username: user name\n" + "realname: real name of user\n"), + 0, MAX_ARGS, weechat_cmd_server, NULL }, { "set", N_("set config parameters"), N_("[option [value]]"), N_("option: name of an option\nvalue: value for option"), 0, 2, weechat_cmd_set, NULL }, @@ -578,6 +593,219 @@ weechat_cmd_help (int argc, char **argv) return 0; } +/* + * weechat_cmd_server: list, add or remove server(s) + */ + +int +weechat_cmd_server (int argc, char **argv) +{ + int i; + t_irc_server server, *ptr_server, *server_found; + + if ((argc == 0) || ((argc == 1) && (strcasecmp (argv[0], "list") == 0))) + { + /* list all servers */ + if (irc_servers) + { + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _("Server: ")); + gui_printf_color (NULL, + COLOR_WIN_CHAT_CHANNEL, + "%s", ptr_server->name); + gui_printf_color (NULL, + COLOR_WIN_CHAT_DARK, + " ["); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + "%s", + (ptr_server->is_connected) ? + _("connected") : _("not connected")); + gui_printf_color (NULL, + COLOR_WIN_CHAT_DARK, + "]\n"); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + " Autoconnect: %s\n", + (ptr_server->autoconnect) ? _("yes") : _("no")); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + " Hostname : %s\n", + ptr_server->address); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Port : %d\n"), + ptr_server->port); + irc_display_prefix (NULL, PREFIX_INFO); + if (ptr_server->password && ptr_server->password[0]) + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Password : (hidden)\n")); + else + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Password : (none)\n")); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Nicks : %s"), + ptr_server->nick1); + gui_printf_color (NULL, + COLOR_WIN_CHAT_DARK, + " / "); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + "%s", ptr_server->nick2); + gui_printf_color (NULL, + COLOR_WIN_CHAT_DARK, + " / "); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + "%s\n", ptr_server->nick3); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Username : %s\n"), + ptr_server->username); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Realname : %s\n"), + ptr_server->realname); + } + } + else + gui_printf (NULL, _("No server.\n")); + } + else + { + if (strcasecmp (argv[0], "del") == 0) + { + if (argc == 1) + { + gui_printf (NULL, + _("%s missing servername for \"/server del\" command\n"), + WEECHAT_ERROR); + return -1; + } + if (argc > 2) + gui_printf (NULL, + _("%s too much arguments for \"/server del\" command, ignoring arguments\n"), + WEECHAT_WARNING); + + /* look for server by name */ + server_found = NULL; + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (strcmp (ptr_server->name, argv[1]) == 0) + { + server_found = ptr_server; + break; + } + } + if (!server_found) + { + gui_printf (NULL, + _("%s server \"%s\" not found for \"/server del\" command\n"), + WEECHAT_ERROR, argv[1]); + return -1; + } + server_free (server_found); + gui_redraw_window (gui_current_window); + } + + /* init server struct */ + server_init (&server); + + /* parse arguments */ + for (i = 0; i < argc; i++) + { + if (argv[i][0] == '-') + { + if (strcasecmp (argv[0], "-auto") == 0) + server.autoconnect = 1; + if (strcasecmp (argv[0], "-noauto") == 0) + server.autoconnect = 0; + if (strcasecmp (argv[0], "-port") == 0) + { + if (i == (argc - 1)) + { + gui_printf (NULL, + _("%s missing port for \"-port\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.port = atoi (argv[i]); + } + if (strcasecmp (argv[0], "-pwd") == 0) + { + if (i == (argc - 1)) + { + gui_printf (NULL, + _("%s missing password for \"-pwd\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.password = strdup (argv[++i]); + } + if (strcasecmp (argv[0], "-nicks") == 0) + { + if (i >= (argc - 3)) + { + gui_printf (NULL, + _("%s missing nick(s) for \"-nicks\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.nick1 = strdup (argv[++i]); + server.nick2 = strdup (argv[++i]); + server.nick3 = strdup (argv[++i]); + } + if (strcasecmp (argv[0], "-username") == 0) + { + if (i == (argc - 1)) + { + gui_printf (NULL, + _("%s missing password for \"-username\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.username = strdup (argv[++i]); + } + if (strcasecmp (argv[0], "-realname") == 0) + { + if (i == (argc - 1)) + { + gui_printf (NULL, + _("%s missing password for \"-realname\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.realname = strdup (argv[++i]); + } + } + else + { + } + } + } + return 0; +} + /* * weechat_cmd_set: set options */ diff --git a/src/command.h b/src/command.h index 5bec6c92e..318fa9c31 100644 --- a/src/command.h +++ b/src/command.h @@ -57,6 +57,7 @@ extern void user_command (t_irc_server *, char *); extern int weechat_cmd_alias(int, char **); extern int weechat_cmd_clear(int, char **); extern int weechat_cmd_help (int, char **); +extern int weechat_cmd_server (int, char **); extern int weechat_cmd_set (int, char **); extern int weechat_cmd_unalias (int, char **); diff --git a/src/config.c b/src/config.c index ad93695b9..7b06a7fa1 100644 --- a/src/config.c +++ b/src/config.c @@ -441,6 +441,10 @@ t_config_option weechat_options_server[] = N_("name associated to IRC server (for display only)"), OPTION_TYPE_STRING, 0, 0, 0, "", NULL, NULL, &(cfg_server.name), NULL }, + { "server_autoconnect", N_("automatically connect to server"), + N_("automatically connect to server when " WEECHAT_NAME " is starting"), + OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE, + NULL, NULL, &(cfg_server.autoconnect), NULL, NULL }, { "server_address", N_("server address or hostname"), N_("IP address or hostname of IRC server"), OPTION_TYPE_STRING, 0, 0, 0, @@ -506,24 +510,6 @@ get_pos_array_values (char **array, char *string) return -1; } -/* - * config_init_server: init server struct - */ - -void -config_init_server () -{ - cfg_server.name = NULL; - cfg_server.address = NULL; - cfg_server.port = -1; - cfg_server.password = NULL; - cfg_server.nick1 = NULL; - cfg_server.nick2 = NULL; - cfg_server.nick3 = NULL; - cfg_server.username = NULL; - cfg_server.realname = NULL; -} - /* * config_allocate_server: allocate a new server */ @@ -556,9 +542,9 @@ config_allocate_server (char *filename, int line_number) return 0; } if (!server_new (cfg_server.name, - cfg_server.address, cfg_server.port, cfg_server.password, - cfg_server.nick1, cfg_server.nick2, cfg_server.nick3, - cfg_server.username, cfg_server.realname)) + cfg_server.autoconnect, cfg_server.address, cfg_server.port, + cfg_server.password, cfg_server.nick1, cfg_server.nick2, + cfg_server.nick3, cfg_server.username, cfg_server.realname)) { server_free_all (); gui_printf (NULL, @@ -566,26 +552,9 @@ config_allocate_server (char *filename, int line_number) WEECHAT_WARNING, filename, line_number); return 0; } - if (cfg_server.name) - free (cfg_server.name); - if (cfg_server.address) - free (cfg_server.address); - if (cfg_server.password) - free (cfg_server.password); - if (cfg_server.nick1) - free (cfg_server.nick1); - if (cfg_server.nick2) - free (cfg_server.nick2); - if (cfg_server.nick3) - free (cfg_server.nick3); - if (cfg_server.username) - free (cfg_server.username); - if (cfg_server.realname) - free (cfg_server.realname); - if (cfg_server.nick) - free (cfg_server.nick); - config_init_server (); + server_destroy (&cfg_server); + server_init (&cfg_server); return 1; } @@ -670,7 +639,7 @@ config_read () } config_default_values (); - config_init_server (); + server_init (&cfg_server); /* read config file */ section = CONFIG_SECTION_NONE; @@ -996,6 +965,7 @@ config_create_default () /* default server is freenode */ fputs ("\n[server]\n", file); fputs ("server_name=freenode\n", file); + fputs ("server_autoconnect=on\n", file); fputs ("server_address=irc.freenode.net\n", file); fputs ("server_port=6667\n", file); fputs ("server_password=\n", file); diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c index b8bacc303..dce3d337e 100644 --- a/src/irc/irc-server.c +++ b/src/irc/irc-server.c @@ -49,6 +49,34 @@ t_irc_message *recv_msgq, *msgq_last_msg; char *unterminated_message = NULL; +/* + * server_init: init server struct with default values + */ + +void +server_init (t_irc_server *server) +{ + server->name = NULL; + server->autoconnect = 0; + server->address = NULL; + server->port = -1; + server->password = NULL; + server->nick1 = NULL; + server->nick2 = NULL; + server->nick3 = NULL; + server->username = NULL; + server->realname = NULL; + server->nick = NULL; + server->is_connected = 0; + server->sock4 = -1; + server->is_away = 0; + server->server_read = -1; + server->server_write = -1; + server->window = NULL; + server->channels = NULL; + server->last_channel = NULL; +} + /* * server_alloc: allocate a new server and add it to the servers queue */ @@ -70,23 +98,7 @@ server_alloc () } /* initialize new server */ - new_server->name = NULL; - new_server->address = NULL; - new_server->password = NULL; - new_server->nick1 = NULL; - new_server->nick2 = NULL; - new_server->nick3 = NULL; - new_server->username = NULL; - new_server->realname = NULL; - new_server->nick = NULL; - new_server->is_connected = 0; - new_server->sock4 = -1; - new_server->is_away = 0; - new_server->server_read = -1; - new_server->server_write = -1; - new_server->window = NULL; - new_server->channels = NULL; - new_server->last_channel = NULL; + server_init (new_server); /* add new server to queue */ new_server->prev_server = last_irc_server; @@ -118,26 +130,12 @@ server_create_window (t_irc_server *server) } /* - * server_free: free a server and remove it from servers queue + * server_destroy: free server data (not struct himself) */ void -server_free (t_irc_server *server) +server_destroy (t_irc_server *server) { - t_irc_server *new_irc_servers; - - /* remove server from queue */ - if (server->prev_server) - { - (server->prev_server)->next_server = server->next_server; - new_irc_servers = irc_servers; - } - else - new_irc_servers = server->next_server; - - if (server->next_server) - (server->next_server)->prev_server = server->prev_server; - /* free data */ if (server->name) free (server->name); @@ -159,8 +157,30 @@ server_free (t_irc_server *server) free (server->nick); if (server->channels) channel_free_all (server); - /* TODO: free weechat window (???) */ - /* (...) */ +} + +/* + * server_free: free a server and remove it from servers queue + */ + +void +server_free (t_irc_server *server) +{ + t_irc_server *new_irc_servers; + + /* remove server from queue */ + if (server->prev_server) + { + (server->prev_server)->next_server = server->next_server; + new_irc_servers = irc_servers; + } + else + new_irc_servers = server->next_server; + + if (server->next_server) + (server->next_server)->prev_server = server->prev_server; + + server_destroy (server); free (server); irc_servers = new_irc_servers; } @@ -182,8 +202,8 @@ server_free_all () */ t_irc_server * -server_new (char *name, char *address, int port, char *password, - char *nick1, char *nick2, char *nick3, +server_new (char *name, int autoconnect, char *address, int port, + char *password, char *nick1, char *nick2, char *nick3, char *username, char *realname) { t_irc_server *new_server; @@ -202,6 +222,7 @@ server_new (char *name, char *address, int port, char *password, if ((new_server = server_alloc ())) { new_server->name = strdup (name); + new_server->autoconnect = autoconnect; new_server->address = strdup (address); new_server->port = port; new_server->password = (password) ? strdup (password) : strdup (""); diff --git a/src/irc/irc.h b/src/irc/irc.h index f1f3698be..b74c8e28f 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -78,6 +78,7 @@ struct t_irc_server { /* user choices */ char *name; /* name of server (only for display) */ + int autoconnect; /* = 1 if auto connect at startup */ char *address; /* address of server (IP or name) */ int port; /* port for server (6667 by default) */ char *password; /* password for server */ @@ -137,12 +138,14 @@ extern t_irc_channel *current_channel; /* server functions (irc-server.c) */ +extern void server_init (t_irc_server *); extern t_irc_server *server_alloc (); extern void server_create_window (t_irc_server *); +extern void server_destroy (t_irc_server *); extern void server_free (t_irc_server *); extern void server_free_all (); -extern t_irc_server *server_new (char *, char *, int, char *, char *, char *, - char *, char *, char *); +extern t_irc_server *server_new (char *, int, char *, int, char *, char *, + char *, char *, char *, char *); extern int server_send (t_irc_server *, char *, int); extern int server_sendf (t_irc_server *, char *, ...); extern void server_recv (t_irc_server *); diff --git a/src/weechat.c b/src/weechat.c index 25f7a34d6..63c01de8a 100644 --- a/src/weechat.c +++ b/src/weechat.c @@ -292,13 +292,16 @@ main (int argc, char *argv[]) gui_printf_color (NULL, COLOR_WIN_CHAT_PREFIX1, "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); - /* connect to all servers */ + /* connect to all servers (with autoconnect flag) */ for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) { - server_create_window (ptr_server); - if (server_connect (ptr_server)) - irc_login (ptr_server); + if (ptr_server->autoconnect) + { + server_create_window (ptr_server); + if (server_connect (ptr_server)) + irc_login (ptr_server); + } } gui_main_loop (); server_disconnect_all (); diff --git a/src/weechat.h b/src/weechat.h index 39cc1489e..dedfcbede 100644 --- a/src/weechat.h +++ b/src/weechat.h @@ -30,7 +30,7 @@ #define N_(string) (string) #define WEECHAT_NAME "WeeChat" -#define WEECHAT_VERSION "0.0.2-pre1" +#define WEECHAT_VERSION "0.0.2-pre2" #define WEECHAT_NAME_AND_VERSION WEECHAT_NAME " " WEECHAT_VERSION #define WEECHAT_COPYRIGHT WEECHAT_NAME " (c) 2003 by Wee Team" diff --git a/weechat/src/command.c b/weechat/src/command.c index 9d3443a24..8d926b3ab 100644 --- a/weechat/src/command.c +++ b/weechat/src/command.c @@ -28,8 +28,8 @@ #include "weechat.h" #include "command.h" -#include "irc/irc.h" #include "config.h" +#include "irc/irc.h" #include "gui/gui.h" @@ -48,6 +48,21 @@ t_weechat_command weechat_commands[] = { "help", N_("display help about commands"), N_("[command]"), N_("command: name of a " WEECHAT_NAME " or IRC command"), 0, 1, weechat_cmd_help, NULL }, + { "server", N_("list, add or remove servers"), + N_("[list] | " + "[[add] servername [-auto | -noauto] hostname [-port port] [-pwd password] [-nicks nick1 " + "[nick2 [nick3]]] [-username username] [-realname realname]] | " + "[del servername]"), + N_("servername: server name, for internal & display use\n" + "hostname: name or IP address of server\n" + "port: port for server (integer)\n" + "password: password for server\n" + "nick1: first nick for server\n" + "nick2: alternate nick for server\n" + "nick3: second alternate nick for server\n" + "username: user name\n" + "realname: real name of user\n"), + 0, MAX_ARGS, weechat_cmd_server, NULL }, { "set", N_("set config parameters"), N_("[option [value]]"), N_("option: name of an option\nvalue: value for option"), 0, 2, weechat_cmd_set, NULL }, @@ -578,6 +593,219 @@ weechat_cmd_help (int argc, char **argv) return 0; } +/* + * weechat_cmd_server: list, add or remove server(s) + */ + +int +weechat_cmd_server (int argc, char **argv) +{ + int i; + t_irc_server server, *ptr_server, *server_found; + + if ((argc == 0) || ((argc == 1) && (strcasecmp (argv[0], "list") == 0))) + { + /* list all servers */ + if (irc_servers) + { + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _("Server: ")); + gui_printf_color (NULL, + COLOR_WIN_CHAT_CHANNEL, + "%s", ptr_server->name); + gui_printf_color (NULL, + COLOR_WIN_CHAT_DARK, + " ["); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + "%s", + (ptr_server->is_connected) ? + _("connected") : _("not connected")); + gui_printf_color (NULL, + COLOR_WIN_CHAT_DARK, + "]\n"); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + " Autoconnect: %s\n", + (ptr_server->autoconnect) ? _("yes") : _("no")); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + " Hostname : %s\n", + ptr_server->address); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Port : %d\n"), + ptr_server->port); + irc_display_prefix (NULL, PREFIX_INFO); + if (ptr_server->password && ptr_server->password[0]) + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Password : (hidden)\n")); + else + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Password : (none)\n")); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Nicks : %s"), + ptr_server->nick1); + gui_printf_color (NULL, + COLOR_WIN_CHAT_DARK, + " / "); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + "%s", ptr_server->nick2); + gui_printf_color (NULL, + COLOR_WIN_CHAT_DARK, + " / "); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + "%s\n", ptr_server->nick3); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Username : %s\n"), + ptr_server->username); + irc_display_prefix (NULL, PREFIX_INFO); + gui_printf_color (NULL, + COLOR_WIN_CHAT, + _(" Realname : %s\n"), + ptr_server->realname); + } + } + else + gui_printf (NULL, _("No server.\n")); + } + else + { + if (strcasecmp (argv[0], "del") == 0) + { + if (argc == 1) + { + gui_printf (NULL, + _("%s missing servername for \"/server del\" command\n"), + WEECHAT_ERROR); + return -1; + } + if (argc > 2) + gui_printf (NULL, + _("%s too much arguments for \"/server del\" command, ignoring arguments\n"), + WEECHAT_WARNING); + + /* look for server by name */ + server_found = NULL; + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (strcmp (ptr_server->name, argv[1]) == 0) + { + server_found = ptr_server; + break; + } + } + if (!server_found) + { + gui_printf (NULL, + _("%s server \"%s\" not found for \"/server del\" command\n"), + WEECHAT_ERROR, argv[1]); + return -1; + } + server_free (server_found); + gui_redraw_window (gui_current_window); + } + + /* init server struct */ + server_init (&server); + + /* parse arguments */ + for (i = 0; i < argc; i++) + { + if (argv[i][0] == '-') + { + if (strcasecmp (argv[0], "-auto") == 0) + server.autoconnect = 1; + if (strcasecmp (argv[0], "-noauto") == 0) + server.autoconnect = 0; + if (strcasecmp (argv[0], "-port") == 0) + { + if (i == (argc - 1)) + { + gui_printf (NULL, + _("%s missing port for \"-port\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.port = atoi (argv[i]); + } + if (strcasecmp (argv[0], "-pwd") == 0) + { + if (i == (argc - 1)) + { + gui_printf (NULL, + _("%s missing password for \"-pwd\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.password = strdup (argv[++i]); + } + if (strcasecmp (argv[0], "-nicks") == 0) + { + if (i >= (argc - 3)) + { + gui_printf (NULL, + _("%s missing nick(s) for \"-nicks\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.nick1 = strdup (argv[++i]); + server.nick2 = strdup (argv[++i]); + server.nick3 = strdup (argv[++i]); + } + if (strcasecmp (argv[0], "-username") == 0) + { + if (i == (argc - 1)) + { + gui_printf (NULL, + _("%s missing password for \"-username\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.username = strdup (argv[++i]); + } + if (strcasecmp (argv[0], "-realname") == 0) + { + if (i == (argc - 1)) + { + gui_printf (NULL, + _("%s missing password for \"-realname\" parameter\n"), + WEECHAT_ERROR); + server_destroy (&server); + return -1; + } + server.realname = strdup (argv[++i]); + } + } + else + { + } + } + } + return 0; +} + /* * weechat_cmd_set: set options */ diff --git a/weechat/src/command.h b/weechat/src/command.h index 5bec6c92e..318fa9c31 100644 --- a/weechat/src/command.h +++ b/weechat/src/command.h @@ -57,6 +57,7 @@ extern void user_command (t_irc_server *, char *); extern int weechat_cmd_alias(int, char **); extern int weechat_cmd_clear(int, char **); extern int weechat_cmd_help (int, char **); +extern int weechat_cmd_server (int, char **); extern int weechat_cmd_set (int, char **); extern int weechat_cmd_unalias (int, char **); diff --git a/weechat/src/config.c b/weechat/src/config.c index ad93695b9..7b06a7fa1 100644 --- a/weechat/src/config.c +++ b/weechat/src/config.c @@ -441,6 +441,10 @@ t_config_option weechat_options_server[] = N_("name associated to IRC server (for display only)"), OPTION_TYPE_STRING, 0, 0, 0, "", NULL, NULL, &(cfg_server.name), NULL }, + { "server_autoconnect", N_("automatically connect to server"), + N_("automatically connect to server when " WEECHAT_NAME " is starting"), + OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE, + NULL, NULL, &(cfg_server.autoconnect), NULL, NULL }, { "server_address", N_("server address or hostname"), N_("IP address or hostname of IRC server"), OPTION_TYPE_STRING, 0, 0, 0, @@ -506,24 +510,6 @@ get_pos_array_values (char **array, char *string) return -1; } -/* - * config_init_server: init server struct - */ - -void -config_init_server () -{ - cfg_server.name = NULL; - cfg_server.address = NULL; - cfg_server.port = -1; - cfg_server.password = NULL; - cfg_server.nick1 = NULL; - cfg_server.nick2 = NULL; - cfg_server.nick3 = NULL; - cfg_server.username = NULL; - cfg_server.realname = NULL; -} - /* * config_allocate_server: allocate a new server */ @@ -556,9 +542,9 @@ config_allocate_server (char *filename, int line_number) return 0; } if (!server_new (cfg_server.name, - cfg_server.address, cfg_server.port, cfg_server.password, - cfg_server.nick1, cfg_server.nick2, cfg_server.nick3, - cfg_server.username, cfg_server.realname)) + cfg_server.autoconnect, cfg_server.address, cfg_server.port, + cfg_server.password, cfg_server.nick1, cfg_server.nick2, + cfg_server.nick3, cfg_server.username, cfg_server.realname)) { server_free_all (); gui_printf (NULL, @@ -566,26 +552,9 @@ config_allocate_server (char *filename, int line_number) WEECHAT_WARNING, filename, line_number); return 0; } - if (cfg_server.name) - free (cfg_server.name); - if (cfg_server.address) - free (cfg_server.address); - if (cfg_server.password) - free (cfg_server.password); - if (cfg_server.nick1) - free (cfg_server.nick1); - if (cfg_server.nick2) - free (cfg_server.nick2); - if (cfg_server.nick3) - free (cfg_server.nick3); - if (cfg_server.username) - free (cfg_server.username); - if (cfg_server.realname) - free (cfg_server.realname); - if (cfg_server.nick) - free (cfg_server.nick); - config_init_server (); + server_destroy (&cfg_server); + server_init (&cfg_server); return 1; } @@ -670,7 +639,7 @@ config_read () } config_default_values (); - config_init_server (); + server_init (&cfg_server); /* read config file */ section = CONFIG_SECTION_NONE; @@ -996,6 +965,7 @@ config_create_default () /* default server is freenode */ fputs ("\n[server]\n", file); fputs ("server_name=freenode\n", file); + fputs ("server_autoconnect=on\n", file); fputs ("server_address=irc.freenode.net\n", file); fputs ("server_port=6667\n", file); fputs ("server_password=\n", file); diff --git a/weechat/src/irc/irc-server.c b/weechat/src/irc/irc-server.c index b8bacc303..dce3d337e 100644 --- a/weechat/src/irc/irc-server.c +++ b/weechat/src/irc/irc-server.c @@ -49,6 +49,34 @@ t_irc_message *recv_msgq, *msgq_last_msg; char *unterminated_message = NULL; +/* + * server_init: init server struct with default values + */ + +void +server_init (t_irc_server *server) +{ + server->name = NULL; + server->autoconnect = 0; + server->address = NULL; + server->port = -1; + server->password = NULL; + server->nick1 = NULL; + server->nick2 = NULL; + server->nick3 = NULL; + server->username = NULL; + server->realname = NULL; + server->nick = NULL; + server->is_connected = 0; + server->sock4 = -1; + server->is_away = 0; + server->server_read = -1; + server->server_write = -1; + server->window = NULL; + server->channels = NULL; + server->last_channel = NULL; +} + /* * server_alloc: allocate a new server and add it to the servers queue */ @@ -70,23 +98,7 @@ server_alloc () } /* initialize new server */ - new_server->name = NULL; - new_server->address = NULL; - new_server->password = NULL; - new_server->nick1 = NULL; - new_server->nick2 = NULL; - new_server->nick3 = NULL; - new_server->username = NULL; - new_server->realname = NULL; - new_server->nick = NULL; - new_server->is_connected = 0; - new_server->sock4 = -1; - new_server->is_away = 0; - new_server->server_read = -1; - new_server->server_write = -1; - new_server->window = NULL; - new_server->channels = NULL; - new_server->last_channel = NULL; + server_init (new_server); /* add new server to queue */ new_server->prev_server = last_irc_server; @@ -118,26 +130,12 @@ server_create_window (t_irc_server *server) } /* - * server_free: free a server and remove it from servers queue + * server_destroy: free server data (not struct himself) */ void -server_free (t_irc_server *server) +server_destroy (t_irc_server *server) { - t_irc_server *new_irc_servers; - - /* remove server from queue */ - if (server->prev_server) - { - (server->prev_server)->next_server = server->next_server; - new_irc_servers = irc_servers; - } - else - new_irc_servers = server->next_server; - - if (server->next_server) - (server->next_server)->prev_server = server->prev_server; - /* free data */ if (server->name) free (server->name); @@ -159,8 +157,30 @@ server_free (t_irc_server *server) free (server->nick); if (server->channels) channel_free_all (server); - /* TODO: free weechat window (???) */ - /* (...) */ +} + +/* + * server_free: free a server and remove it from servers queue + */ + +void +server_free (t_irc_server *server) +{ + t_irc_server *new_irc_servers; + + /* remove server from queue */ + if (server->prev_server) + { + (server->prev_server)->next_server = server->next_server; + new_irc_servers = irc_servers; + } + else + new_irc_servers = server->next_server; + + if (server->next_server) + (server->next_server)->prev_server = server->prev_server; + + server_destroy (server); free (server); irc_servers = new_irc_servers; } @@ -182,8 +202,8 @@ server_free_all () */ t_irc_server * -server_new (char *name, char *address, int port, char *password, - char *nick1, char *nick2, char *nick3, +server_new (char *name, int autoconnect, char *address, int port, + char *password, char *nick1, char *nick2, char *nick3, char *username, char *realname) { t_irc_server *new_server; @@ -202,6 +222,7 @@ server_new (char *name, char *address, int port, char *password, if ((new_server = server_alloc ())) { new_server->name = strdup (name); + new_server->autoconnect = autoconnect; new_server->address = strdup (address); new_server->port = port; new_server->password = (password) ? strdup (password) : strdup (""); diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index f1f3698be..b74c8e28f 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -78,6 +78,7 @@ struct t_irc_server { /* user choices */ char *name; /* name of server (only for display) */ + int autoconnect; /* = 1 if auto connect at startup */ char *address; /* address of server (IP or name) */ int port; /* port for server (6667 by default) */ char *password; /* password for server */ @@ -137,12 +138,14 @@ extern t_irc_channel *current_channel; /* server functions (irc-server.c) */ +extern void server_init (t_irc_server *); extern t_irc_server *server_alloc (); extern void server_create_window (t_irc_server *); +extern void server_destroy (t_irc_server *); extern void server_free (t_irc_server *); extern void server_free_all (); -extern t_irc_server *server_new (char *, char *, int, char *, char *, char *, - char *, char *, char *); +extern t_irc_server *server_new (char *, int, char *, int, char *, char *, + char *, char *, char *, char *); extern int server_send (t_irc_server *, char *, int); extern int server_sendf (t_irc_server *, char *, ...); extern void server_recv (t_irc_server *); diff --git a/weechat/src/weechat.c b/weechat/src/weechat.c index 25f7a34d6..63c01de8a 100644 --- a/weechat/src/weechat.c +++ b/weechat/src/weechat.c @@ -292,13 +292,16 @@ main (int argc, char *argv[]) gui_printf_color (NULL, COLOR_WIN_CHAT_PREFIX1, "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); - /* connect to all servers */ + /* connect to all servers (with autoconnect flag) */ for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) { - server_create_window (ptr_server); - if (server_connect (ptr_server)) - irc_login (ptr_server); + if (ptr_server->autoconnect) + { + server_create_window (ptr_server); + if (server_connect (ptr_server)) + irc_login (ptr_server); + } } gui_main_loop (); server_disconnect_all (); diff --git a/weechat/src/weechat.h b/weechat/src/weechat.h index 39cc1489e..dedfcbede 100644 --- a/weechat/src/weechat.h +++ b/weechat/src/weechat.h @@ -30,7 +30,7 @@ #define N_(string) (string) #define WEECHAT_NAME "WeeChat" -#define WEECHAT_VERSION "0.0.2-pre1" +#define WEECHAT_VERSION "0.0.2-pre2" #define WEECHAT_NAME_AND_VERSION WEECHAT_NAME " " WEECHAT_VERSION #define WEECHAT_COPYRIGHT WEECHAT_NAME " (c) 2003 by Wee Team"