From cbe6ef12f3808f863e2143def86c696b46716b1e Mon Sep 17 00:00:00 2001 From: pk910 Date: Tue, 18 Oct 2011 22:27:29 +0200 Subject: [PATCH] added basic NeonSpam code (no functions) --- Makefile.am | 1 + src/bot_NeonServ.c | 50 +------------------ src/bot_NeonServ.h | 2 - src/bot_NeonSpam.c | 117 +++++++++++++++++++++++++++++++++++++++++++++ src/bot_NeonSpam.h | 27 +++++++++++ src/bots.c | 63 ++++++++++++++++++++++++ src/bots.h | 7 +++ src/cmd_neonserv.h | 1 + 8 files changed, 218 insertions(+), 50 deletions(-) create mode 100644 src/bot_NeonSpam.c create mode 100644 src/bot_NeonSpam.h diff --git a/Makefile.am b/Makefile.am index f437aea..ad6a87d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -30,6 +30,7 @@ neonserv_SOURCES = src/version.c \ src/DBHelper.c \ src/bots.c \ src/bot_NeonServ.c \ + src/bot_NeonSpam.c \ src/cmd_neonserv_access.c \ src/cmd_neonserv_addban.c \ src/cmd_neonserv_addtimeban.c \ diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 5336737..2f449e7 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -340,24 +340,9 @@ cmd_neonserv_calc.c #include "event_neonserv_invite.c" #include "event_neonserv_topic.c" + struct ClientSocket *getBotForChannel(struct ChanNode *chan) { - struct ClientSocket *bot, *use_bot = NULL, *second_bot = NULL, *third_bot = NULL; - struct ChanUser *chanuser; - for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { - if(bot->botid != BOTID) continue; - if((chanuser = getChanUser(bot->user, chan)) != NULL) { - if((chanuser->flags & CHANUSERFLAG_OPPED)) { - use_bot = bot; - if(bot->flags & SOCKET_FLAG_PREFERRED) break; - } else if(bot->flags & SOCKET_FLAG_PREFERRED) - second_bot = bot; - else - third_bot = bot; - } - } - if(!use_bot) use_bot = second_bot; - if(!use_bot) use_bot = third_bot; - return use_bot; + return getChannelBot(chan, BOTID); } static void neonserv_bot_ready(struct ClientSocket *client) { @@ -424,37 +409,6 @@ static void start_bots() { } } } - - //load all timed bans - printf_mysql_query("SELECT `ban_id`, `ban_timeout` FROM `bans` WHERE `ban_timeout` > 0"); - res = mysql_use(); - char nameBuf[20]; - while ((row = mysql_fetch_row(res)) != NULL) { - if(atol(row[1]) - time(0) > 0) { - sprintf(nameBuf, "ban_%s", row[0]); - timeq_add_name(nameBuf, atol(row[1]) - time(0), channel_ban_timeout, strdup(row[0])); - } else { - //timed out - printf_mysql_query("DELETE FROM `bans` WHERE `ban_id` = '%s'", row[0]); - } - } -} - -TIMEQ_CALLBACK(channel_ban_timeout) { - char *str_banid = data; - MYSQL_RES *res; - MYSQL_ROW row; - printf_mysql_query("SELECT `ban_mask`, `channel_name` FROM `bans` LEFT JOIN `channels` ON `ban_channel` = `channel_id` WHERE `ban_id` = '%s'", str_banid); - res = mysql_use(); - struct ChanNode *chan; - if((row = mysql_fetch_row(res)) != NULL && (chan = getChanByName(row[1])) != NULL) { - struct ClientSocket *use_bot = getBotForChannel(chan); - if(use_bot) { - putsock(use_bot, "MODE %s -b %s", chan->name, row[0]); - } - printf_mysql_query("DELETE FROM `bans` WHERE `ban_id` = '%s'", str_banid); - } - free(str_banid); } void init_NeonServ() { diff --git a/src/bot_NeonServ.h b/src/bot_NeonServ.h index 1148f66..3dee8c8 100644 --- a/src/bot_NeonServ.h +++ b/src/bot_NeonServ.h @@ -18,7 +18,6 @@ #define _bot_NeonServ_h #include "main.h" -#include "timeq.h" struct ChanNode; @@ -26,7 +25,6 @@ void init_NeonServ(); void loop_NeonServ(); void free_NeonServ(); -TIMEQ_CALLBACK(channel_ban_timeout); struct ClientSocket *getBotForChannel(struct ChanNode *chan); #endif \ No newline at end of file diff --git a/src/bot_NeonSpam.c b/src/bot_NeonSpam.c new file mode 100644 index 0000000..19d9876 --- /dev/null +++ b/src/bot_NeonSpam.c @@ -0,0 +1,117 @@ +/* bot_NeonSpam.c - NeonServ v5.1 + * 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 . + */ + +#include "bot_NeonSpam.h" +#include "cmd_neonserv.h" + +#define BOTID 2 + +static const struct default_language_entry msgtab[] = { + {NULL, NULL} +}; + +//EVENTS +//#include "event_neonspam_join.c" + +static void neonspam_bot_ready(struct ClientSocket *client) { + MYSQL_RES *res; + MYSQL_ROW row; + + printf_mysql_query("SELECT `automodes` FROM `bots` WHERE `id` = '%d'", client->clientid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + putsock(client, "MODE %s +%s", client->user->nick, row[0]); + } + + printf_mysql_query("SELECT `channel_name`, `channel_key` FROM `bot_channels` LEFT JOIN `channels` ON `chanid` = `channel_id` WHERE `botid` = '%d' AND `suspended` = '0'", client->clientid); + res = mysql_use(); + + while ((row = mysql_fetch_row(res)) != NULL) { + putsock(client, "JOIN %s %s", row[0], row[1]); + } +} + +static void neonspam_trigger_callback(struct ChanNode *chan, char *trigger) { + MYSQL_RES *res; + MYSQL_ROW row; + loadChannelSettings(chan); + printf_mysql_query("SELECT `trigger` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chan->channel_id, BOTID); + res = mysql_use(); + row = mysql_fetch_row(res); + strcpy(trigger, (strlen(row[0]) ? row[0] : "~")); +} + +static void start_bots() { + struct UserNode *user; + struct ClientSocket *client; + MYSQL_RES *res, *res2; + MYSQL_ROW row; + + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + res = mysql_use(); + + while ((row = mysql_fetch_row(res)) != NULL) { + + user = addUser(row[0]); + strcpy(user->ident, row[1]); + strcpy(user->realname, row[2]); + user->flags |= USERFLAG_ISBOT; + client = create_socket(row[3], atoi(row[4]), row[5], user); + client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); + client->botid = BOTID; + client->clientid = atoi(row[7]); + connect_socket(client); + printf_mysql_query("SELECT `command`, `function`, `parameters`, `global_access`, `chan_access` FROM `bot_binds` WHERE `botclass` = '%d'", client->botid); + res2 = mysql_use(); + while ((row = mysql_fetch_row(res2)) != NULL) { + if(bind_cmd_to_command(BOTID, row[0], row[1])) { + if(row[2] && strcmp(row[2], "")) { + bind_set_parameters(BOTID, row[0], row[2]); + } + if(row[3]) { + bind_set_global_access(BOTID, row[0], atoi(row[3])); + } + if(row[4]) { + bind_set_channel_access(BOTID, row[0], row[4]); + } + } + } + } + +} + +void init_NeonSpam() { + start_bots(); + + //register events + bind_bot_ready(neonspam_bot_ready); + //bind_join(neonspam_event_join); + + set_trigger_callback(BOTID, neonspam_trigger_callback); + + register_default_language_table(msgtab); +} + +void loop_NeonSpam() { + +} + +void free_NeonSpam() { + +} + +#undef BOTID diff --git a/src/bot_NeonSpam.h b/src/bot_NeonSpam.h new file mode 100644 index 0000000..e350439 --- /dev/null +++ b/src/bot_NeonSpam.h @@ -0,0 +1,27 @@ +/* bot_NeonSpam.h - NeonServ v5.1 + * 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 . + */ + +#ifndef _bot_NeonSpam_h +#define _bot_NeonSpam_h + +#include "main.h" + +void init_NeonSpam(); +void loop_NeonSpam(); +void free_NeonSpam(); + +#endif \ No newline at end of file diff --git a/src/bots.c b/src/bots.c index 43096d4..6f64c5e 100644 --- a/src/bots.c +++ b/src/bots.c @@ -16,17 +16,80 @@ */ #include "bots.h" +#include "timeq.h" +#include "mysqlConn.h" +#include "ClientSocket.h" +#include "UserNode.h" +#include "ChanNode.h" +#include "ChanUser.h" #include "bot_NeonServ.h" +#include "bot_NeonSpam.h" void init_bots() { init_NeonServ(); + init_NeonSpam(); + + MYSQL_RES *res; + MYSQL_ROW row; + //load all timed bans + printf_mysql_query("SELECT `ban_id`, `ban_timeout` FROM `bans` WHERE `ban_timeout` > 0"); + res = mysql_use(); + char nameBuf[20]; + while ((row = mysql_fetch_row(res)) != NULL) { + if(atol(row[1]) - time(0) > 0) { + sprintf(nameBuf, "ban_%s", row[0]); + timeq_add_name(nameBuf, atol(row[1]) - time(0), channel_ban_timeout, strdup(row[0])); + } else { + //timed out + printf_mysql_query("DELETE FROM `bans` WHERE `ban_id` = '%s'", row[0]); + } + } } void loop_bots() { loop_NeonServ(); + loop_NeonSpam(); } void free_bots() { free_NeonServ(); + free_NeonSpam(); +} + +struct ClientSocket *getChannelBot(struct ChanNode *chan, int botid) { + struct ClientSocket *bot, *use_bot = NULL, *second_bot = NULL, *third_bot = NULL; + struct ChanUser *chanuser; + for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { + if(botid && bot->botid != botid) continue; + if((chanuser = getChanUser(bot->user, chan)) != NULL) { + if((chanuser->flags & CHANUSERFLAG_OPPED)) { + use_bot = bot; + if(bot->flags & SOCKET_FLAG_PREFERRED) break; + } else if(bot->flags & SOCKET_FLAG_PREFERRED) + second_bot = bot; + else + third_bot = bot; + } + } + if(!use_bot) use_bot = second_bot; + if(!use_bot) use_bot = third_bot; + return use_bot; +} + +TIMEQ_CALLBACK(channel_ban_timeout) { + char *str_banid = data; + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `ban_mask`, `channel_name` FROM `bans` LEFT JOIN `channels` ON `ban_channel` = `channel_id` WHERE `ban_id` = '%s'", str_banid); + res = mysql_use(); + struct ChanNode *chan; + if((row = mysql_fetch_row(res)) != NULL && (chan = getChanByName(row[1])) != NULL) { + struct ClientSocket *use_bot = getChannelBot(chan, 0); + if(use_bot) { + putsock(use_bot, "MODE %s -b %s", chan->name, row[0]); + } + printf_mysql_query("DELETE FROM `bans` WHERE `ban_id` = '%s'", str_banid); + } + free(str_banid); } diff --git a/src/bots.h b/src/bots.h index debf219..c0dcd29 100644 --- a/src/bots.h +++ b/src/bots.h @@ -18,9 +18,16 @@ #define _bots_h #include "main.h" +#include "timeq.h" + +struct ChanNode; +struct ClientSocket; void init_bots(); void loop_bots(); void free_bots(); +struct ClientSocket *getChannelBot(struct ChanNode *chan, int botid); +TIMEQ_CALLBACK(channel_ban_timeout); + #endif \ No newline at end of file diff --git a/src/cmd_neonserv.h b/src/cmd_neonserv.h index 5042cbb..f833ba4 100644 --- a/src/cmd_neonserv.h +++ b/src/cmd_neonserv.h @@ -35,6 +35,7 @@ #include "timeq.h" #include "version.h" #include "EventLogger.h" +#include "bots.h" #include "bot_NeonServ.h" CMD_BIND(neonserv_cmd_access); -- 2.20.1