added cmd_reconnect
authorpk910 <philipp@zoelle1.de>
Thu, 22 Dec 2011 10:19:55 +0000 (11:19 +0100)
committerpk910 <philipp@zoelle1.de>
Thu, 22 Dec 2011 10:31:00 +0000 (11:31 +0100)
Makefile.am
src/ClientSocket.c
src/ClientSocket.h
src/HandleInfoHandler.c
src/WHOHandler.c
src/bot_NeonServ.c
src/cmd_global.h
src/cmd_global_reconnect.c [new file with mode: 0644]
src/commands.c

index 40af57ee77c353a592f926d159b40ed8cf379f6d..88f7c773a6c4f2314a447185feada43c8b0c2331 100644 (file)
@@ -123,6 +123,7 @@ neonserv_SOURCES = src/version.c \
       src/cmd_global_setbot.c \
       src/cmd_global_addbot.c \
       src/cmd_global_delbot.c \
+      src/cmd_global_reconnect.c \
       src/cmd_funcmds.c \
       src/ConfigParser.c
 
index 2e2eb1c703fca717a79ab4c87e33f856d7539ef2..9b44e2064cffcfd5ece05e43b4efd1304d104f4f 100644 (file)
@@ -23,6 +23,7 @@
 #include "HandleInfoHandler.h"
 #include "ssl.h"
 #include "ConfigParser.h"
+#include "version.h"
 
 struct socket_list {
     struct ClientSocket *data;
@@ -186,7 +187,8 @@ int connect_socket(struct ClientSocket *client) {
     if(client->flags & SOCKET_FLAG_SSL) {
         ssl_connect(client);
         client->flags |= SOCKET_FLAG_HAVE_SSL;
-    }
+    } else
+        client->flags &= ~SOCKET_FLAG_HAVE_SSL;
     
     //send the IRC Headers
     char sendBuf[512];
@@ -241,8 +243,8 @@ int connect_socket(struct ClientSocket *client) {
     if(client->flags & SOCKET_FLAG_SSL) {
         ssl_connect(client);
         client->flags |= SOCKET_FLAG_HAVE_SSL;
-    }
-
+    } else
+        client->flags &= ~SOCKET_FLAG_HAVE_SSL;
 
     //send the IRC Headers
     char sendBuf[512];
@@ -263,8 +265,13 @@ int connect_socket(struct ClientSocket *client) {
 
 int close_socket(struct ClientSocket *client) {
     if(client == NULL) return 0;
-    if((client->flags & SOCKET_FLAG_CONNECTED))
+    if((client->flags & SOCKET_FLAG_CONNECTED)) {
+        char quitbuf[MAXLEN];
+        int quitlen = sprintf(quitbuf, "QUIT :[NeonServ %s.%d] disconnect requested.\n", NEONSERV_VERSION, patchlevel);
+        write_socket_force(client, quitbuf, quitlen);
         close(client->sock);
+        bot_disconnect(client);
+    }
     if(client->flags & SOCKET_FLAG_HAVE_SSL)
         ssl_disconnect(client);
     struct ClientSocket *sock, *last_sock = NULL;
@@ -293,6 +300,27 @@ int close_socket(struct ClientSocket *client) {
     return 1;
 }
 
+int disconnect_socket(struct ClientSocket *client) {
+    if(client == NULL) return 0;
+    if((client->flags & SOCKET_FLAG_CONNECTED)) {
+        char quitbuf[MAXLEN];
+        int quitlen = sprintf(quitbuf, "QUIT :[NeonServ %s.%d] disconnect requested.\n", NEONSERV_VERSION, patchlevel);
+        write_socket_force(client, quitbuf, quitlen);
+        close(client->sock);
+        bot_disconnect(client);
+    }
+    if(client->flags & SOCKET_FLAG_HAVE_SSL)
+        ssl_disconnect(client);
+    if(client->queue)
+        queue_destroy(client);
+    if(client->whoqueue_first)
+        clear_whoqueue(client);
+    if(client->handleinfo_first)
+        clear_handleinfoqueue(client);
+    client->flags &= ~(SOCKET_FLAG_CONNECTED | SOCKET_FLAG_READY | SOCKET_FLAG_RECONNECT);
+    return 1;
+}
+
 int write_socket_force(struct ClientSocket *client, char* msg, int len) {
     printf("[send %d] %s", len, msg);
     if(!(client->flags & SOCKET_FLAG_HAVE_SSL) || ssl_write(client, msg, len) == -2) {
@@ -369,6 +397,10 @@ void socket_loop(int timeout_seconds) {
                 close(sock->sock);
                 if(sock->flags & SOCKET_FLAG_HAVE_SSL)
                     ssl_disconnect(sock);
+                if(sock->whoqueue_first)
+                    clear_whoqueue(sock);
+                if(sock->handleinfo_first)
+                    clear_handleinfoqueue(sock);
             } else {
                 sock->traffic_in += bytes;
                 int used = parse_lines(sock, sock->buffer, sock->bufferpos);
index 7ede0c325e79b46e9c3302ef50887c7d14f96a37..13e499cf0c98268dc6754d36c5af30290318a6e8 100644 (file)
@@ -69,6 +69,7 @@ struct ClientSocket {
 struct ClientSocket* create_socket(char *host, int port, char *bindto, char *pass, char *nick, char *ident, char *realname);
 int connect_socket(struct ClientSocket *client);
 int close_socket(struct ClientSocket *client);
+int disconnect_socket(struct ClientSocket *client);
 int write_socket_force(struct ClientSocket *client, char* msg, int len);
 int write_socket(struct ClientSocket *client, char* msg, int len);
 void socket_loop(int timeout_seconds);
index 8a135cdb16c8453b2d87d0f09b2c1c8fb409b587..040c9e501106d4a1377fa56403ce590e4a34f8e8 100644 (file)
@@ -69,6 +69,7 @@ void clear_handleinfoqueue(struct ClientSocket *client) {
         free(entry);
     }
     client->handleinfo_last = NULL;
+    client->handleinfo_first = NULL;
 }
 
 void lookup_authname(char *auth, authlookup_callback_t callback, void *data) {
index a21f560414ec7ad962a2fb75e76ff43f01ee95cb..b0c3513e0ae93a6a56628a206a48d26f5d1beba0 100644 (file)
@@ -75,6 +75,7 @@ void clear_whoqueue(struct ClientSocket *client) {
         free(entry);
     }
     client->whoqueue_last = NULL;
+    client->whoqueue_first = NULL;
 }
 
 void get_userlist(struct ChanNode *chan, userlist_callback_t callback, void *data) {
index 0421fdd6754010e683f04abfac4b80eab3d38b2c..2dacd9cf7a4d44b10ade081e471c12355f476b60 100644 (file)
@@ -360,6 +360,7 @@ static const struct default_language_entry msgtab[] = {
     {"NS_ADDBOT_DONE", "Added %s with BotID $b%d$b."}, /* {ARGS: "NeonServ", 2} */
     {"NS_DELBOT_NOT_FOUND", "Bot with BotID / nick $b%s$b not found."}, /* {ARGS: "NeonServ"} */
     {"NS_DELBOT_DONE", "Bot deleted."},
+    {"NS_RECONNECT_DONE", "Reconnected bot."},
     {NULL, NULL}
 };
 
index 98dc94ef4c85b4c8f2cfb86b57aff16720f80c84..30e39e3e78d89496fdfdac6b487b4c201da932a8 100644 (file)
@@ -50,6 +50,7 @@ CMD_BIND(global_cmd_motd);
 CMD_BIND(global_cmd_netinfo);
 CMD_BIND(global_cmd_notice);
 CMD_BIND(global_cmd_raw);
+CMD_BIND(global_cmd_reconnect);
 CMD_BIND(global_cmd_register);
 CMD_BIND(global_cmd_reload);
 CMD_BIND(global_cmd_restart);
diff --git a/src/cmd_global_reconnect.c b/src/cmd_global_reconnect.c
new file mode 100644 (file)
index 0000000..6313ff7
--- /dev/null
@@ -0,0 +1,49 @@
+/* cmd_global_reconnect.c - NeonServ v5.2
+ * Copyright (C) 2011  Philipp Kreil (pk910)
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License 
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. 
+ */
+
+#include "cmd_global.h"
+
+/*
+* argv[0]  nick/botid
+*/
+
+CMD_BIND(global_cmd_reconnect) {
+    int botid;
+    if(argc) {
+        MYSQL_RES *res;
+        MYSQL_ROW row;
+        printf_mysql_query("SELECT `id` FROM `bots` WHERE `nick` = '%s' OR `id` = '%s'", escape_string(argv[0]), escape_string(argv[0]));
+        res = mysql_use();
+        if((row = mysql_fetch_row(res)) == NULL) {
+            reply(getTextBot(), user, "NS_DELBOT_NOT_FOUND", argv[0]);
+            return;
+        }
+        botid = atoi(row[0]);
+        for(client = getBots(0, NULL); client; client = getBots(0, client)) {
+            if(client->clientid == botid) {
+                disconnect_socket(client);
+                connect_socket(client);
+                break;
+            }
+        }
+    } else {
+        disconnect_socket(client);
+        connect_socket(client);
+    }
+    reply(getTextBot(), user, "NS_RECONNECT_DONE");
+    logEvent(event);
+}
index 7963b070f3aa343e5cba203634afd11ed07c2bb5..cfa0f380b59ee49bbce9e4949eccbcee853d8683 100644 (file)
@@ -54,6 +54,7 @@ void register_commands() {
     OPER_COMMAND("setbot",       global_cmd_setbot,    1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED);
     OPER_COMMAND("addbot",       global_cmd_addbot,    2,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED);
     OPER_COMMAND("delbot",       global_cmd_delbot,    1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED);
+    OPER_COMMAND("reconnect",    global_cmd_reconnect, 0,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
     #undef OPER_COMMAND
     
     //NeonServ Commands