added possibility to change default trigger (even for registered channels)
authorpk910 <philipp@zoelle1.de>
Thu, 22 Dec 2011 16:13:52 +0000 (17:13 +0100)
committerpk910 <philipp@zoelle1.de>
Thu, 22 Dec 2011 16:14:30 +0000 (17:14 +0100)
database.sql
database.upgrade.sql
src/bot_NeonHelp.c
src/bot_NeonServ.c
src/bot_NeonSpam.c
src/bots.c
src/cmd_global_register.c
src/cmd_global_setbot.c
src/modcmd.c
src/modcmd.h
src/mysqlConn.c

index 01abde3eba806b9cc613daf5bfe3afe0a6386ec5..db8c41f438eb2ae6f276891f479e38e53d631376 100644 (file)
@@ -73,7 +73,7 @@ CREATE TABLE IF NOT EXISTS `bot_channels` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `botid` int(11) NOT NULL,
   `chanid` int(11) NOT NULL,
-  `trigger` varchar(50) NOT NULL DEFAULT '+',
+  `trigger` varchar(50) NULL DEFAULT '+',
   `suspended` tinyint(1) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
index 84e9aeb7c37421edf64f0a375be98db4a7dc2f0b..2b11e65b4d75bdb0c42fc5f2cdddc528ded31faa 100644 (file)
@@ -87,4 +87,8 @@ ALTER TABLE `fundata` ADD INDEX ( `name` );
 ALTER TABLE `bot_binds` ADD `botid` INT( 11 ) NOT NULL AFTER `botclass`;
 ALTER TABLE `bot_binds` ADD INDEX ( `botclass` );
 
--- version: 8
\ No newline at end of file
+-- version: 8
+
+ALTER TABLE `bot_channels` CHANGE `trigger` `trigger` VARCHAR( 50 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT '+';
+
+-- version: 9
index 03e9ce9c7be0f931b29920409ab35d089e3ef8a1..3473d3c09f536c2b57ea8477d7c31ce2af4c3ee0 100644 (file)
@@ -53,10 +53,17 @@ static void neonhelp_trigger_callback(int clientid, struct ChanNode *chan, char
     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);
+    if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) {
+        strcpy(trigger, "!");
+        return;
+    }
+    printf_mysql_query("SELECT `trigger`, `defaulttrigger` 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] : "!"));
+    if(row[0] && *row[0])
+        strcpy(trigger, row[0]);
+    else
+        strcpy(trigger, ((row[1] && *row[1]) ? row[1] : "!"));
 }
 
 static void start_bots() {
index 64ba2419b9f4e21852247584821c82feb43afea1..58dced3a3a428d8d302f9892c9e8a7b0a9167b92 100644 (file)
@@ -419,10 +419,13 @@ static void neonserv_trigger_callback(int clientid, struct ChanNode *chan, char
         strcpy(trigger, "+");
         return;
     }
-    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);
+    printf_mysql_query("SELECT `trigger`, `defaulttrigger` 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, ((row && strlen(row[0])) ? row[0] : "+"));
+    if(row[0] && *row[0])
+        strcpy(trigger, row[0]);
+    else
+        strcpy(trigger, ((row[1] && *row[1]) ? row[1] : "~"));
 }
 
 static void start_bots() {
index 981fda4851db8bec26757c6c6dd9d132d7adc773..0ba375471c89636e32289115e84a670026d17c66 100644 (file)
@@ -136,10 +136,17 @@ static void neonspam_trigger_callback(int clientid, struct ChanNode *chan, char
     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);
+    if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) {
+        strcpy(trigger, "~");
+        return;
+    }
+    printf_mysql_query("SELECT `trigger`, `defaulttrigger` 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, ((row && strlen(row[0])) ? row[0] : "~"));
+    if(row[0] && *row[0])
+        strcpy(trigger, row[0]);
+    else
+        strcpy(trigger, ((row[1] && *row[1]) ? row[1] : "~"));
 }
 
 static void start_bots() {
index e22b768bde400c72a3c0fd090d2ed04bc52bf7b8..9cc84d259f430fd881fde5f126220ccd2bbf45be 100644 (file)
@@ -83,10 +83,13 @@ static void zero_bots_trigger_callback(int clientid, struct ChanNode *chan, char
         strcpy(trigger, "+");
         return;
     }
-    printf_mysql_query("SELECT `trigger` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '0' AND `botid` = '%d'", chan->channel_id, clientid);
+    printf_mysql_query("SELECT `trigger`, `defaulttrigger` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '0' AND `botid` = '%d'", chan->channel_id, clientid);
     res = mysql_use();
     row = mysql_fetch_row(res);
-    strcpy(trigger, (strlen(row[0]) ? row[0] : "+"));
+    if(row[0] && *row[0])
+        strcpy(trigger, row[0]);
+    else
+        strcpy(trigger, ((row[1] && *row[1]) ? row[1] : "+"));
 }
 
 void init_bots() {
index 65e15dd79a25aa3d9eb7d3e44cf2e76dd217be6d..dd94f93c988860f75699ec13d4eccd00f85fdbd8 100644 (file)
@@ -212,14 +212,12 @@ static void global_cmd_register_async1(struct ClientSocket *client, struct Clien
     printf_mysql_query("SELECT `id`, `max_channels`, `defaulttrigger`, `nick` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1' 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]) && (!botname || !stricmp(botname, row[3]))) {
             botid = atoi(row[0]);
-            bottrigger = row[2];
             break;
         }
     }
@@ -246,7 +244,7 @@ static void global_cmd_register_async1(struct ClientSocket *client, struct Clien
         putsock(bot, "JOIN %s", channel);
     } else
         reply(textclient, user, "NS_REGISTER_DISCONNECTED", channel);
-    printf_mysql_query("INSERT INTO `bot_channels` (`botid`, `chanid`, `trigger`) VALUES ('%d', '%d', '%s')", botid, chanid, bottrigger);
+    printf_mysql_query("INSERT INTO `bot_channels` (`botid`, `chanid`, `trigger`) VALUES ('%d', '%d', NULL)", botid, chanid);
     if(multibot != 2) {
         if(multibot) {
             printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = 499 WHERE `chanuser_cid` = '%d' AND `chanuser_access` = '500'", chanid);
index a9fac8232e8ec9a7e3247bcfb3955c527821cf79..9118a0d520a8e695cd2226c45590d7e674e6379c 100644 (file)
@@ -70,7 +70,7 @@ CMD_BIND(global_cmd_setbot) {
         else if(!stricmp(argv[1], "prefered")) log_event = global_cmd_setbot_prefered(user, row, value);
         else if(!stricmp(argv[1], "maxchan")) log_event = global_cmd_setbot_maxchan(user, row, value);
         else if(!stricmp(argv[1], "priority")) log_event = global_cmd_setbot_priority(user, row, value);
-        else if(!stricmp(argv[1], "trigger")) log_event = global_cmd_setbot_nick(user, row, value);
+        else if(!stricmp(argv[1], "trigger")) log_event = global_cmd_setbot_trigger(user, row, value);
         else {
             reply(getTextBot(), user, "NS_SETBOT_SETTING", argv[1]);
         }
@@ -509,6 +509,7 @@ static int global_cmd_setbot_trigger(struct UserNode *user, MYSQL_ROW bot, char
             return 0;
         }
         printf_mysql_query("UPDATE `bots` SET `defaulttrigger` = '%s' WHERE `id` = '%s'", escape_string(value), bot[15]);
+        flush_trigger_cache(atoi(bot[5]), atoi(bot[15]));
         reply(getTextBot(), user, "NS_SETBOT_TRIGGER_NOTE");
         val = value;
         ret = 1;
index 2c0182bbd894741afbfa3d7e7841de18c14d7828..a23dc7c0b1177391f00764a3b744b40a389a2f91 100644 (file)
@@ -614,6 +614,27 @@ int set_trigger_callback(int botid, trigger_callback_t *func) {
     return 1;
 }
 
+int flush_trigger_cache(int botid, int clientid) {
+    struct ChanNode *chan;
+    struct trigger_cache *trigger, *last;
+    for(chan = getAllChans(NULL); chan; chan = getAllChans(chan)) {
+        last = NULL;
+        for(trigger = chan->trigger; trigger; trigger = trigger->next) {
+            if(trigger->botid == botid && (botid || trigger->clientid == clientid)) {
+                if(last)
+                    last->next = trigger->next;
+                else
+                    chan->trigger = trigger->next;
+                free(trigger->trigger);
+                free(trigger);
+                break;
+            } else
+                last = trigger;
+        }
+    }
+    return 1;
+}
+
 int changeBotwiseChannelTrigger(int botid, int clientid, struct ChanNode *chan, char *new_trigger) {
     struct trigger_cache *trigger;
     for(trigger = chan->trigger; trigger; trigger = trigger->next) {
index 8ced9459e580ef68f4779590f75f0d36a568a0c0..2be6f3d5e42a6d9ff80e3d27625228b9e858e916 100644 (file)
@@ -91,6 +91,8 @@ struct ClientSocket* get_botwise_prefered_bot(int botid, int clientid);
 int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, char *channel_access, int global_access, unsigned int flags);
 int set_trigger_callback(int botid, trigger_callback_t *func);
 
+int flush_trigger_cache(int botid, int clientid);
+
 #define changeChannelTrigger(BOTID,CHAN,NEW) changeBotwiseChannelTrigger(BOTID, 0, CHAN, NEW)
 int changeBotwiseChannelTrigger(int botid, int clientid, struct ChanNode *chan, char *new_trigger);
 
index 32a4ea5835c5ca194c6b56edc8e8752b4e642713..dcd99e5d39a48d9ba5516522c0d4e507bebbb105 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #include "mysqlConn.h"
-#define DATABASE_VERSION "8"
+#define DATABASE_VERSION "9"
 
 struct used_result {
     MYSQL_RES *result;