From 594bd1c6ce7a27d00d57d5db2b8eae2f0b876821 Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 12 Sep 2011 04:37:33 +0200 Subject: [PATCH] added cmd_unregister and cmd_recover --- bot_NeonServ.c | 12 ++++++--- cmd_neonserv_recover.c | 57 +++++++++++++++++++++++++++++++++++++++ cmd_neonserv_register.c | 11 ++++++-- cmd_neonserv_unregister.c | 30 +++++++++++++++++++++ 4 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 cmd_neonserv_recover.c create mode 100644 cmd_neonserv_unregister.c diff --git a/bot_NeonServ.c b/bot_NeonServ.c index 91c699f..2526611 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -161,6 +161,9 @@ static const struct default_language_entry msgtab[] = { {"NS_REGISTER_FULL", "the bot can not join more channels."}, {"NS_REGISTER_DISCONNECTED", "%s has been registered with a Bot, that is currently NOT connected. The Bot should join the channel, when it reconnects to the IRC-Network."}, {"NS_REGISTER_DONE", "\002%s\002 is now registered to \002%s\002."}, + {"NS_UNREGISTER_NOT_REGISTERED", "\002%s\002 is not registered with %s."}, + {"NS_UNREGISTER_DONE", "\002%s\002 unregistered."}, + {"NS_RECOVER_DONE", "\002%s\002 has been recovered."}, {NULL, NULL} }; @@ -223,7 +226,8 @@ INCLUDE ALL CMD's HERE //#include "cmd_neonserv_unbind.c" //#include "cmd_neonserv_modcmd.c" #include "cmd_neonserv_register.c" -//#include "cmd_neonserv_unregister.c" +#include "cmd_neonserv_unregister.c" +#include "cmd_neonserv_recover.c" //#include "cmd_neonserv_allowregister.c" //#include "cmd_neonserv_noregister.c" //#include "cmd_neonserv_god.c" @@ -334,7 +338,7 @@ void init_NeonServ() { register_command(BOTID, "opall", neonserv_cmd_opall, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_canop", 0); register_command(BOTID, "deopall", neonserv_cmd_deopall, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_canop", 0); register_command(BOTID, "voiceall", neonserv_cmd_voiceall, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_canvoice", 0); - register_command(BOTID, "devoiceall", neonserv_cmd_devoiceall, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_canvoice", 0); + register_command(BOTID, "devoiceall", neonserv_cmd_devoiceall,0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_canvoice", 0); register_command(BOTID, "set", neonserv_cmd_set, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_setters", 0); register_command(BOTID, "kick", neonserv_cmd_kick, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_cankick", 0); register_command(BOTID, "kickban", neonserv_cmd_kickban, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_cankick,#channel_canban", 0); @@ -345,10 +349,12 @@ void init_NeonServ() { register_command(BOTID, "delban", neonserv_cmd_delban, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_staticban", 0); register_command(BOTID, "netinfo", neonserv_cmd_netinfo, 0, 0, NULL, 0); register_command(BOTID, "topic", neonserv_cmd_topic, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_changetopic", 0); - register_command(BOTID, "chanservsync", neonserv_cmd_chanservsync, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "500", 0); + register_command(BOTID, "chanservsync", neonserv_cmd_chanservsync, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH,"500", 0); register_command(BOTID, "trace", neonserv_cmd_trace, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, NULL, 400); register_command(BOTID, "register", neonserv_cmd_register, 2, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM, NULL, 100); + register_command(BOTID, "unregister", neonserv_cmd_unregister,2, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM, NULL, 100); + register_command(BOTID, "recover", neonserv_cmd_recover, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM, NULL, 100); start_bots(); bind_bot_ready(neonserv_bot_ready); diff --git a/cmd_neonserv_recover.c b/cmd_neonserv_recover.c new file mode 100644 index 0000000..931e339 --- /dev/null +++ b/cmd_neonserv_recover.c @@ -0,0 +1,57 @@ + +/* +* argv[0] - channel +*/ +static CMD_BIND(neonserv_cmd_recover) { + MYSQL_RES *res; + MYSQL_ROW row, row2; + char *channel = argv[0]; + if(!is_valid_chan(channel)) { + reply(getTextBot(), user, "NS_INVALID_CHANNEL_NAME", argv[0]); + return; + } + printf_mysql_query("SELECT `botid`, `bot_channels`.`id` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chan->channel_id, client->botid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + reply(getTextBot(), user, "NS_REGISTER_ALREADY", argv[0], client->user->nick); + return; + } + int chanid; + printf_mysql_query("SELECT `channel_id` FROM `channels` WHERE `channel_name` = '%s'", escape_string(channel)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + chanid = atoi(row[0]); + } else { + reply(getTextBot(), user, "NS_UNREGISTER_NOT_REGISTERED", argv[0], client->user->nick); + return; + } + printf_mysql_query("SELECT `botid`, `max_channels`, `defaulttrigger` FROM `bots` WHERE `botclass` = '%d' ORDER BY `register_priority` DESC", client->botid); + res = mysql_use(); + int botid = 0; + char *bottrigger; + while ((row = mysql_fetch_row(res)) != NULL) { + //check channel count + printf_mysql_query("SELECT COUNT(*) FROM `bot_channels` WHERE `botid` = '%s'", row[0]); + row2 = mysql_fetch_row(mysql_use()); + if(atoi(row2[0]) < atoi(row[1])) { + botid = atoi(row[0]); + bottrigger = row[2]; + break; + } + } + if(!botid) { + reply(getTextBot(), user, "NS_REGISTER_FULL"); + return; + } + struct ClientSocket *bot; + for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { + if(bot->clientid == botid) + break; + } + if(bot) { + putsock(bot, "JOIN %s", channel); + } else + reply(getTextBot(), user, "NS_REGISTER_DISCONNECTED"); + printf_mysql_query("INSERT INTO `bot_channels` (`botid`, `chanid`, `trigger`) VALUES ('%d', '%d', '%s')", botid, chanid, bottrigger); + reply(getTextBot(), user, "NS_RECOVER_DONE", channel); +} diff --git a/cmd_neonserv_register.c b/cmd_neonserv_register.c index 0a287f1..2406389 100644 --- a/cmd_neonserv_register.c +++ b/cmd_neonserv_register.c @@ -111,7 +111,13 @@ static void neonserv_cmd_register_async1(struct ClientSocket *client, struct Cli //we've got a valid auth now... MYSQL_RES *res; MYSQL_ROW row, row2; - int userid; + int userid, adminid; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) + adminid = atoi(row[0]); + else + adminid = 0; printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { @@ -143,8 +149,9 @@ static void neonserv_cmd_register_async1(struct ClientSocket *client, struct Cli res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { chanid = atoi(row[0]); + printf_mysql_query("UPDATE `channels` SET `channel_registered` = UNIX_TIMESTAMP(), `channel_registrator` = '%d' WHERE `channel_id` = '%d'", adminid, chanid); } else { - printf_mysql_query("INSERT INTO `channels` (`channel_name`) VALUES ('%s')", escape_string(channel)); + printf_mysql_query("INSERT INTO `channels` (`channel_name`, `channel_registered`, `channel_registrator`) VALUES ('%s', UNIX_TIMESTAMP(), '%d')", escape_string(channel), adminid); chanid = (int) mysql_insert_id(mysql_conn); } struct ClientSocket *bot; diff --git a/cmd_neonserv_unregister.c b/cmd_neonserv_unregister.c new file mode 100644 index 0000000..83b374e --- /dev/null +++ b/cmd_neonserv_unregister.c @@ -0,0 +1,30 @@ + +/* +* argv[0] - channel +*/ +static CMD_BIND(neonserv_cmd_unregister) { + MYSQL_RES *res; + MYSQL_ROW row; + char *channel = argv[0]; + if(!is_valid_chan(channel)) { + reply(getTextBot(), user, "NS_INVALID_CHANNEL_NAME", argv[0]); + return; + } + printf_mysql_query("SELECT `botid`, `bot_channels`.`id` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chan->channel_id, client->botid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL) { + reply(getTextBot(), user, "NS_UNREGISTER_NOT_REGISTERED", argv[0], client->user->nick); + return; + } + int botid = atoi(row[0]); + struct ClientSocket *bot; + for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { + if(bot->clientid == botid) + break; + } + if(bot) { + putsock(bot, "PART %s :Channel unregistered.", channel); + } + printf_mysql_query("DELETE FROM `bot_channels` WHERE `id` = '%s'", row[1]); + reply(getTextBot(), user, "NS_UNREGISTER_DONE", channel); +} -- 2.20.1