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
#include "HandleInfoHandler.h"
#include "ssl.h"
#include "ConfigParser.h"
+#include "version.h"
struct socket_list {
struct ClientSocket *data;
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];
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];
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;
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) {
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);
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);
free(entry);
}
client->handleinfo_last = NULL;
+ client->handleinfo_first = NULL;
}
void lookup_authname(char *auth, authlookup_callback_t callback, void *data) {
free(entry);
}
client->whoqueue_last = NULL;
+ client->whoqueue_first = NULL;
}
void get_userlist(struct ChanNode *chan, userlist_callback_t callback, void *data) {
{"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}
};
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);
--- /dev/null
+/* 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);
+}
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