added new multi log system
[NeonServV5.git] / src / modules / global.mod / cmd_global_register.c
index d6ec183bcddb64d7488de60e0904e034f6a24af7..03fa9323f4294f3183a07e4707eea3ceacb7fe58 100644 (file)
@@ -1,4 +1,4 @@
-/* cmd_global_register.c - NeonServ v5.3
+/* cmd_global_register.c - NeonServ v5.6
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -44,14 +44,14 @@ CMD_BIND(global_cmd_register) {
     char *botname = (argc > 2 ? argv[2] : NULL);
     int multibot = 0;
     if(!is_valid_chan(channel)) {
-        reply(getTextBot(), user, "NS_INVALID_CHANNEL_NAME", argv[0]);
+        reply(textclient, user, "NS_INVALID_CHANNEL_NAME", argv[0]);
         return;
     }
     printf_mysql_query("SELECT `botid`, `botclass` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` LEFT JOIN `channels` ON `bot_channels`.`chanid` = `channels`.`channel_id` WHERE `channel_name` = '%s'", escape_string(channel));
     res = mysql_use();
     while ((row = mysql_fetch_row(res)) != NULL) {
         if(atoi(row[1]) == client->botid && (client->botid || client->clientid == atoi(row[0]))) {
-            reply(getTextBot(), user, "NS_REGISTER_ALREADY", argv[0], client->user->nick);
+            reply(textclient, user, "NS_REGISTER_ALREADY", argv[0], client->user->nick);
             return;
         } else
             multibot = 1;
@@ -65,11 +65,11 @@ CMD_BIND(global_cmd_register) {
                 printf_mysql_query("DELETE FROM `donotregister` WHERE `dnr_id` = '%s'", row[3]);
             } else {
                 char expireBuf[MAXLEN];
-                reply(getTextBot(), user, "NS_DNR_SET_EXPIRES", channel, row[0], timeToStr(user, (expire_time - time(0)), 2, expireBuf), row[2]);
+                reply(textclient, user, "NS_DNR_SET_EXPIRES", channel, row[0], timeToStr(user, (expire_time - time(0)), 2, expireBuf), row[2]);
                 return;
             }
         } else {
-            reply(getTextBot(), user, "NS_DNR_SET", channel, row[0], row[2]);
+            reply(textclient, user, "NS_DNR_SET", channel, row[0], row[2]);
             return;
         }
     }
@@ -77,10 +77,10 @@ CMD_BIND(global_cmd_register) {
     if(multibot && argc < 2) {
         //skip all these owner check lines
         multibot = 2;
-        global_cmd_register_async1(client, getTextBot(), user, chan, event, channel, NULL, multibot, botname);
+        global_cmd_register_async1(client, textclient, user, chan, event, channel, NULL, multibot, botname);
         return;
     } else if(argc < 2) {
-        global_cmd_register_async1(client, getTextBot(), user, chan, event, channel, user->auth, multibot, botname);
+        global_cmd_register_async1(client, textclient, user, chan, event, channel, user->auth, multibot, botname);
         return;
     }
     //check own access
@@ -90,17 +90,17 @@ CMD_BIND(global_cmd_register) {
         printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[1]));
         res = mysql_use();
         if ((row = mysql_fetch_row(res)) != NULL) {
-            global_cmd_register_async1(client, getTextBot(), user, chan, event, channel, row[0], multibot, botname);
+            global_cmd_register_async1(client, textclient, user, chan, event, channel, row[0], multibot, botname);
         } else {
             //we need to create a new user...
             //but first lookup the auth to check if it really exists
             struct global_cmd_register_cache *cache = malloc(sizeof(*cache));
             if (!cache) {
-                perror("malloc() failed");
+                printf_log("global", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
                 return;
             }
             cache->client = client;
-            cache->textclient = getTextBot();
+            cache->textclient = textclient;
             cache->user = user;
             cache->chan = chan;
             cache->event = event;
@@ -114,22 +114,22 @@ CMD_BIND(global_cmd_register) {
         struct UserNode *cuser = getUserByNick(argv[1]);
         if(!cuser) {
             cuser = createTempUser(argv[1]);
-                       if(!cuser) {
-                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[1]);
+            if(!cuser) {
+                reply(textclient, user, "NS_USER_UNKNOWN", argv[1]);
                 return;
             }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
-            global_cmd_register_async1(client, getTextBot(), user, chan, event, channel, cuser->auth, multibot, botname);
+            global_cmd_register_async1(client, textclient, user, chan, event, channel, cuser->auth, multibot, botname);
         } else {
             struct global_cmd_register_cache *cache = malloc(sizeof(*cache));
             if (!cache) {
-                perror("malloc() failed");
+                printf_log("global", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
                 return;
             }
             cache->client = client;
-            cache->textclient = getTextBot();
+            cache->textclient = textclient;
             cache->user = user;
             cache->chan = chan;
             cache->event = event;
@@ -196,11 +196,11 @@ static void global_cmd_register_async1(struct ClientSocket *client, struct Clien
                     printf_mysql_query("DELETE FROM `donotregister` WHERE `dnr_id` = '%s'", row[3]);
                 } else {
                     char expireBuf[MAXLEN];
-                    reply(getTextBot(), user, "NS_DNR_SET_EXPIRES", auth, row[0], timeToStr(user, (expire_time - time(0)), 2, expireBuf), row[2]);
+                    reply(textclient, user, "NS_DNR_SET_EXPIRES", auth, row[0], timeToStr(user, (expire_time - time(0)), 2, expireBuf), row[2]);
                     return;
                 }
             } else {
-                reply(getTextBot(), user, "NS_DNR_SET", auth, row[0], row[2]);
+                reply(textclient, user, "NS_DNR_SET", auth, row[0], row[2]);
                 return;
             }
         }
@@ -262,5 +262,52 @@ static void global_cmd_register_async1(struct ClientSocket *client, struct Clien
         reply(textclient, user, "NS_REGISTER_DONE", channel, auth);
     } else
         reply(textclient, user, "NS_REGISTER_DONE_NOAUTH", channel);
+    // NeonBackup SubBlock
+    if(client->botid == NEONSERV_BOTID) {
+        char setting[128];
+        sprintf(setting, "modules.%s.auto_backup_register", get_module_name(module_id));
+        if(get_int_field(setting))
+            module_global_cmd_register_neonbackup(channel);
+    }
     logEvent(event);
 }
+
+void global_cmd_register_neonbackup(char *channel) {
+    MYSQL_RES *res;
+    MYSQL_ROW row, row2;
+    printf_mysql_query("SELECT `botid` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` LEFT JOIN `channels` ON `bot_channels`.`chanid` = `channels`.`channel_id` WHERE `channel_name` = '%s' AND botclass = '%d'", escape_string(channel), NEONBACKUP_BOTID);
+    res = mysql_use();
+    if ((row = mysql_fetch_row(res)) != NULL)
+        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
+        return;
+    printf_mysql_query("SELECT `id`, `max_channels`, `defaulttrigger`, `nick` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1' ORDER BY `register_priority` DESC", NEONBACKUP_BOTID);
+    res = mysql_use();
+    int botid = 0;
+    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]);
+            break;
+        }
+    }
+    if(!botid)
+        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);
+    }
+    printf_mysql_query("INSERT INTO `bot_channels` (`botid`, `chanid`, `trigger`) VALUES ('%d', '%d', NULL)", botid, chanid);
+}
+