added cmd_unregister and cmd_recover
authorpk910 <philipp@zoelle1.de>
Mon, 12 Sep 2011 02:37:33 +0000 (04:37 +0200)
committerpk910 <philipp@zoelle1.de>
Mon, 12 Sep 2011 02:39:29 +0000 (04:39 +0200)
bot_NeonServ.c
cmd_neonserv_recover.c [new file with mode: 0644]
cmd_neonserv_register.c
cmd_neonserv_unregister.c [new file with mode: 0644]

index 91c699fc6d5634cedddf84034fadd96e8044494d..2526611544861eeb05a588c605f4ce5ee9263c5d 100644 (file)
@@ -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 (file)
index 0000000..931e339
--- /dev/null
@@ -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);
+}
index 0a287f1dbf88c3736f1b634a0c2b407707e71296..24063899c4ea9deb86dfed55156eaccca17ee364 100644 (file)
@@ -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 (file)
index 0000000..83b374e
--- /dev/null
@@ -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);
+}