From 0b17bccd2d7fbef5652168d11d4f0af1f41252d3 Mon Sep 17 00:00:00 2001 From: pk910 Date: Thu, 22 Dec 2011 17:13:52 +0100 Subject: [PATCH] added possibility to change default trigger (even for registered channels) --- database.sql | 2 +- database.upgrade.sql | 6 +++++- src/bot_NeonHelp.c | 11 +++++++++-- src/bot_NeonServ.c | 7 +++++-- src/bot_NeonSpam.c | 11 +++++++++-- src/bots.c | 7 +++++-- src/cmd_global_register.c | 4 +--- src/cmd_global_setbot.c | 3 ++- src/modcmd.c | 21 +++++++++++++++++++++ src/modcmd.h | 2 ++ src/mysqlConn.c | 2 +- 11 files changed, 61 insertions(+), 15 deletions(-) diff --git a/database.sql b/database.sql index 01abde3..db8c41f 100644 --- a/database.sql +++ b/database.sql @@ -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; diff --git a/database.upgrade.sql b/database.upgrade.sql index 84e9aeb..2b11e65 100644 --- a/database.upgrade.sql +++ b/database.upgrade.sql @@ -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 diff --git a/src/bot_NeonHelp.c b/src/bot_NeonHelp.c index 03e9ce9..3473d3c 100644 --- a/src/bot_NeonHelp.c +++ b/src/bot_NeonHelp.c @@ -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() { diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 64ba241..58dced3 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -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() { diff --git a/src/bot_NeonSpam.c b/src/bot_NeonSpam.c index 981fda4..0ba3754 100644 --- a/src/bot_NeonSpam.c +++ b/src/bot_NeonSpam.c @@ -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() { diff --git a/src/bots.c b/src/bots.c index e22b768..9cc84d2 100644 --- a/src/bots.c +++ b/src/bots.c @@ -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() { diff --git a/src/cmd_global_register.c b/src/cmd_global_register.c index 65e15dd..dd94f93 100644 --- a/src/cmd_global_register.c +++ b/src/cmd_global_register.c @@ -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); diff --git a/src/cmd_global_setbot.c b/src/cmd_global_setbot.c index a9fac82..9118a0d 100644 --- a/src/cmd_global_setbot.c +++ b/src/cmd_global_setbot.c @@ -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; diff --git a/src/modcmd.c b/src/modcmd.c index 2c0182b..a23dc7c 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -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) { diff --git a/src/modcmd.h b/src/modcmd.h index 8ced945..2be6f3d 100644 --- a/src/modcmd.h +++ b/src/modcmd.h @@ -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); diff --git a/src/mysqlConn.c b/src/mysqlConn.c index 32a4ea5..dcd99e5 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -16,7 +16,7 @@ */ #include "mysqlConn.h" -#define DATABASE_VERSION "8" +#define DATABASE_VERSION "9" struct used_result { MYSQL_RES *result; -- 2.20.1