-/* cmd_neonserv_set.c - NeonServ v5.4
+/* cmd_neonserv_set.c - NeonServ v5.6
* Copyright (C) 2011-2012 Philipp Kreil (pk910)
*
* This program is free software: you can redistribute it and/or modify
#include "cmd_neonserv.h"
-typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
-static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *argument);
-static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
-static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
-static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
-static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static void neonserv_cmd_set_setting(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *argument);
+static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static char* neonserv_cmd_set_backupbot(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
#define NS_VALID_FUNCTION 0x01
#define NS_VALID_STRING 0x02
{"TOYS", "channel_toys", NS_VALID_OPTIONS | NS_HAS_OPT, "3"},
{"DYNLIMIT", "channel_dynlimit", NS_VALID_NUMERIC | NS_VALID_FUNCTION | NS_HAS_OPT, neonserv_cmd_set_dynlimit},
{"NODELETE", "channel_nodelete", NS_VALID_BOOLEAN | NS_VALID_FUNCTION, neonserv_cmd_set_nodelete},
+ {"BACKUPBOT", NULL, NS_VALID_BOOLEAN | NS_VALID_FUNCTION, neonserv_cmd_set_backupbot},
{NULL, NULL, 0, NULL}
};
if(isGodMode(user)) {
event->flags |= CMDFLAG_OPLOG;
} else {
- reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name);
+ reply(textclient, user, "NS_SET_DEFAULTS_OWNER", chan->name);
return;
}
}
query[querypos-2] = '\0';
}
printf_mysql_query("UPDATE `channels` SET %s WHERE `channel_id` = '%d'", query, chan->channel_id);
- reply(getTextBot(), user, "NS_SET_DEFAULTS_DONE", chan->name);
+ reply(textclient, user, "NS_SET_DEFAULTS_DONE", chan->name);
logEvent(event);
} else {
- reply(getTextBot(), user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey);
+ reply(textclient, user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey);
}
} else if(argc && strcmp(argv[0], "help")) {
//find the correct command
while(channel_settings[i].setting) {
if(!stricmp(channel_settings[i].setting, argv[0]) && (!(channel_settings[i].valid & NS_VALID_IF_HALFOP) || with_halfops)) {
//setting found
+ if(!stricmp(channel_settings[i].setting, "BACKUPBOT")) {
+ char setting[128];
+ sprintf(setting, "modules.%s.channel_backup_setting", get_module_name(module_id));
+ if(!get_int_field(setting)) {
+ i++;
+ continue;
+ }
+ }
if(channel_settings[i].valid & NS_VALID_FUNCTION) {
neonserv_cmd_set_function *func = channel_settings[i].parameter;
- func(client, user, chan, event, channel_settings[i].setting, args);
+ func(client, textclient, user, chan, event, channel_settings[i].setting, args);
} else {
- neonserv_cmd_set_setting(client, user, chan, event, i, args);
+ neonserv_cmd_set_setting(client, textclient, user, chan, event, i, args);
}
j = 1;
break;
}
if(j == 0) {
//unknown setting
- reply(getTextBot(), user, "NS_SET_UNKNOWN_SETTING", argv[0]);
+ reply(textclient, user, "NS_SET_UNKNOWN_SETTING", argv[0]);
}
} else {
char query[MAX_QUERY_LEN], *value, *org_value, *tmp, nameBuf[64];
struct Table *table;
char *content[2];
int with_halfops = get_int_field("General.have_halfop");
+ int channel_backup_setting;
i = 0;
j = 0;
while(channel_settings[i].setting) {
i++;
continue;
}
+ if(!stricmp(channel_settings[i].setting, "BACKUPBOT")) {
+ char setting[128];
+ sprintf(setting, "modules.%s.channel_backup_setting", get_module_name(module_id));
+ channel_backup_setting = get_int_field(setting);
+ if(!channel_backup_setting) {
+ i++;
+ j++;
+ continue;
+ }
+ }
if(channel_settings[i].chanfield)
querypos += sprintf(query + querypos, ", `%s`", channel_settings[i].chanfield);
i++;
row = mysql_fetch_row(res);
i = 0;
j = 0;
- reply(getTextBot(), user, "NS_SET_HEADER", chan->name);
+ reply(textclient, user, "NS_SET_HEADER", chan->name);
while(channel_settings[i].setting) {
if((channel_settings[i].valid & NS_VALID_IF_HALFOP) && !with_halfops) {
i++;
continue;
}
+ if(!stricmp(channel_settings[i].setting, "BACKUPBOT") && !channel_backup_setting) {
+ i++;
+ continue;
+ }
if(channel_settings[i].chanfield) {
j++;
org_value = (row[j] ? row[j] : defaults[j]);
} else if(channel_settings[i].valid & NS_VALID_FUNCTION) {
neonserv_cmd_set_function *func = channel_settings[i].parameter;
- org_value = func(client, user, chan, event, NULL, NULL);
+ org_value = func(client, textclient, user, chan, event, NULL, NULL);
} else
org_value = "0";
value = org_value;
}
char **table_lines = table_end(table);
for(i = 0; i < table->entrys; i++) {
- reply(getTextBot(), user, table_lines[i]);
+ reply(textclient, user, "%s", table_lines[i]);
}
table_free(table);
}
}
-static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) {
+static void neonserv_cmd_set_setting(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) {
char *value;
char nameBuf[64];
//get current value
int caccess = atoi(args);
int max = ((valid & NS_VALID_NO501) ? 500 : 501);
if(caccess < 0 || caccess > max) {
- reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess);
+ reply(textclient, user, "NS_INVALID_ACCESS", caccess);
return;
}
int uaccess = getChannelAccess(user, chan);
if(isGodMode(user)) {
event->flags |= CMDFLAG_OPLOG;
} else {
- reply(getTextBot(), user, "NS_SET_CANNOT_SET");
+ reply(textclient, user, "NS_SET_CANNOT_SET");
return;
}
}
if(isGodMode(user)) {
event->flags |= CMDFLAG_OPLOG;
} else {
- reply(getTextBot(), user, "NS_SET_BADLEVEL");
+ reply(textclient, user, "NS_SET_BADLEVEL");
return;
}
}
int options = atoi((char *) channel_settings[setting].parameter);
int coption = atoi(args);
if(coption < 0 || coption >= options) {
- reply(getTextBot(), user, "NS_SET_INVALID_OPTION", coption);
+ reply(textclient, user, "NS_SET_INVALID_OPTION", coption);
int i;
int nameBufPos = 0;
if(valid & NS_HAS_OPT) {
for(i = 0; i < options; i++) {
sprintf(nameBuf, "NS_SET_OPTION_%s_%d", channel_settings[setting].setting, i);
- reply(getTextBot(), user, "\002%d\002 - %s", i, get_language_string(user, nameBuf));
+ reply(textclient, user, "\002%d\002 - %s", i, get_language_string(user, nameBuf));
}
} else {
for(i = 0; i < options; i++) {
}
if(nameBufPos) {
nameBuf[nameBufPos-2] = '\0';
- reply(getTextBot(), user, nameBuf);
+ reply(textclient, user, nameBuf);
}
}
return;
} else if(!strcmp(args, "1") || !stricmp(args, "on") || !stricmp(args, get_language_string(user, "NS_SET_ON"))) {
args = "1";
} else {
- reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", args);
+ reply(textclient, user, "NS_SET_INVALID_BOOLEAN", args);
return;
}
}
sprintf(nameBuf, "NS_SET_OPTION_%s_%s", channel_settings[setting].setting, value);
char *tmp = get_language_string(user, nameBuf);
if(tmp)
- reply(getTextBot(), user, "\002%s\002 %s - %s", channel_settings[setting].setting, value, tmp);
+ reply(textclient, user, "\002%s\002 %s - %s", channel_settings[setting].setting, value, tmp);
else
- reply(getTextBot(), user, "\002%s\002 %s", channel_settings[setting].setting, value);
+ reply(textclient, user, "\002%s\002 %s", channel_settings[setting].setting, value);
} else
- reply(getTextBot(), user, "\002%s\002 %s", channel_settings[setting].setting, value);
+ reply(textclient, user, "\002%s\002 %s", channel_settings[setting].setting, value);
if(channel_settings[setting].valid & NS_HAS_HELP) {
sprintf(nameBuf, "NS_SET_HELP_%s", channel_settings[setting].setting);
- reply(getTextBot(), user, " %s", get_language_string(user, nameBuf));
+ reply(textclient, user, " %s", get_language_string(user, nameBuf));
}
}
-static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
+static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
char *trigger;
//get current trigger
MYSQL_RES *res;
MYSQL_ROW row;
- printf_mysql_query("SELECT `trigger`, `defaulttrigger` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botid` = '%d'", chan->channel_id, client->clientid);
+ if(client->botid)
+ printf_mysql_query("SELECT `trigger`, `defaulttrigger`, `bot_channels`.`id` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chan->channel_id, client->botid);
+ else
+ printf_mysql_query("SELECT `trigger`, `defaulttrigger`, `bot_channels`.`id` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botid` = '%d'", chan->channel_id, client->clientid);
res = mysql_use();
row = mysql_fetch_row(res);
trigger = (row[0] ? row[0] : row[1]);
if(isGodMode(user)) {
event->flags |= CMDFLAG_OPLOG;
} else {
- reply(getTextBot(), user, "NS_SET_TRIGGER_OWNER", chan->name);
+ reply(textclient, user, "NS_SET_TRIGGER_OWNER", chan->name);
return NULL;
}
}
if(strlen(argument) > 15)
argument[15] = '\0';
- printf_mysql_query("UPDATE `bot_channels` SET `trigger` = '%s' WHERE `chanid` = '%d' AND `botid` = '%d'", escape_string(argument), chan->channel_id, client->clientid);
+ printf_mysql_query("UPDATE `bot_channels` SET `trigger` = '%s' WHERE `id` = '%d'", escape_string(argument), row[2]);
trigger = argument;
- changeChannelTrigger(client->botid, chan, trigger);
+ if(client->botid)
+ changeChannelTrigger(client->botid, chan, trigger);
+ else
+ changeBotwiseChannelTrigger(client->botid, client->clientid, chan, trigger);
logEvent(event);
}
if(setting) {
- reply(getTextBot(), user, "\002%s\002 %s", setting, trigger);
+ reply(textclient, user, "\002%s\002 %s", setting, trigger);
}
return trigger;
}
-static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
+static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
char *value;
char valueBuf[MAXLEN];
//get current value
freeModeNode(modenode);
}
if(setting) {
- reply(getTextBot(), user, "\002%s\002 %s", setting, value);
+ reply(textclient, user, "\002%s\002 %s", setting, value);
}
return value;
}
-static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
+static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
char *value;
char tmp[64];
//get current value
logEvent(event);
}
if(setting) {
- reply(getTextBot(), user, "\002%s\002 %s", setting, value);
+ reply(textclient, user, "\002%s\002 %s", setting, value);
}
return value;
}
-static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
+static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
char *value;
//get current value
MYSQL_RES *res;
} else if(!strcmp(argument, "1") || !strcmp(argument, "on") || !strcmp(argument, get_language_string(user, "NS_SET_ON"))) {
argument = "1";
} else {
- reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", argument);
+ reply(textclient, user, "NS_SET_INVALID_BOOLEAN", argument);
return NULL;
}
printf_mysql_query("UPDATE `channels` SET `channel_nodelete` = '%s' WHERE `channel_id` = '%d'", escape_string(argument), chan->channel_id);
logEvent(event);
}
if(setting) {
- reply(getTextBot(), user, "\002%s\002 %s", setting, value);
+ reply(textclient, user, "\002%s\002 %s", setting, value);
}
return value;
}
+static char* neonserv_cmd_set_backupbot(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
+ int backupbot;
+ //get current trigger
+ MYSQL_RES *res;
+ printf_mysql_query("SELECT `botid` FROM `bot_channels` LEFT JOIN `bots` ON `botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chan->channel_id, NEONBACKUP_BOTID);
+ res = mysql_use();
+ if(mysql_fetch_row(res))
+ backupbot = 1;
+ else
+ backupbot = 0;
+ if(argument) {
+ //change the channel setting
+ if(!strcmp(argument, "0") || !strcmp(argument, "off") || !strcmp(argument, get_language_string(user, "NS_SET_OFF"))) {
+ if(backupbot) {
+ module_global_cmd_unregister_neonbackup(chan->name);
+ backupbot = 0;
+ }
+ } else if(!strcmp(argument, "1") || !strcmp(argument, "on") || !strcmp(argument, get_language_string(user, "NS_SET_ON"))) {
+ if(!backupbot) {
+ module_global_cmd_register_neonbackup(chan->name);
+ backupbot = 1;
+ }
+ } else {
+ reply(textclient, user, "NS_SET_INVALID_BOOLEAN", argument);
+ return NULL;
+ }
+ logEvent(event);
+ }
+ if(setting) {
+ reply(textclient, user, "\002%s\002 %s", setting, (backupbot ? "1" : "0"));
+ }
+ return (backupbot ? "1" : "0");
+}
+
#undef MAX_QUERY_LEN