From 92458cdb1c936fbf64163178d6ea9c080c77c6da Mon Sep 17 00:00:00 2001 From: pk910 Date: Sat, 10 Sep 2011 00:13:30 +0200 Subject: [PATCH] removed some doubled checks & added cmd_topic with ADVANCEDTOPIC --- DATABASE.txt | 3 + bot_NeonServ.c | 7 ++- cmd_neonserv_deop.c | 5 -- cmd_neonserv_deopall.c | 5 -- cmd_neonserv_devoice.c | 5 -- cmd_neonserv_op.c | 5 -- cmd_neonserv_opall.c | 5 -- cmd_neonserv_set.c | 5 +- cmd_neonserv_topic.c | 123 ++++++++++++++++++++++++++++++++++++++++ cmd_neonserv_voice.c | 5 -- cmd_neonserv_voiceall.c | 5 -- 11 files changed, 134 insertions(+), 39 deletions(-) create mode 100644 cmd_neonserv_topic.c diff --git a/DATABASE.txt b/DATABASE.txt index c2688f0..e9d5397 100644 --- a/DATABASE.txt +++ b/DATABASE.txt @@ -31,3 +31,6 @@ ALTER TABLE `bot_binds` ADD `chan_access` VARCHAR( 256 ) NULL DEFAULT NULL AFTER ALTER TABLE `bot_binds` CHANGE `global_access` `global_access` INT( 3 ) NULL ALTER TABLE `bans` CHANGE `ban_owner` `ban_owner` INT( 11 ) NOT NULL + +ALTER TABLE `channels` ADD `channel_exttopic` TINYINT( 1 ) NOT NULL AFTER `channel_topicmask` , +ADD `channel_exttopic_topic` VARCHAR( 512 ) NOT NULL AFTER `channel_exttopic` diff --git a/bot_NeonServ.c b/bot_NeonServ.c index 9a63e32..54a82e6 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -148,7 +148,9 @@ static const struct default_language_entry msgtab[] = { {"NS_NETINFO_CODE_VALUE", "%s lines c code (view it at http://git.pk910.de/?p=NeonServV5.git;a=summary)"}, {"NS_NETINFO_COMPILER", "Compiler:"}, {"NS_NETINFO_COMPILER_VALUE", "%s (%s)"}, - + {"NS_EXTTOPIC_INVALID_ID", "ADVANCEDTOPIC is enabled and \002%s\002 is an invalid TOPIC ID. Valid topic id's are: 1-9"}, + {"NS_EXTTOPIC_TOPICID", "Topic %d: %s"}, + {"NS_TOPIC_DONE", "Topic is now '%s'."}, {NULL, NULL} }; @@ -193,7 +195,7 @@ INCLUDE ALL CMD's HERE #include "cmd_neonserv_delban.c" #include "cmd_neonserv_bans.c" //#include "cmd_neonserv_open.c" -//#include "cmd_neonserv_topic.c" +#include "cmd_neonserv_topic.c" //#include "cmd_neonserv_mode.c" //#include "cmd_neonserv_invite.c" //#include "cmd_neonserv_info.c" @@ -334,6 +336,7 @@ void init_NeonServ() { register_command(BOTID, "bans", neonserv_cmd_bans, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "1", 0); 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, "trace", neonserv_cmd_trace, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, NULL, 400); diff --git a/cmd_neonserv_deop.c b/cmd_neonserv_deop.c index 65b42fc..a0e7d0e 100644 --- a/cmd_neonserv_deop.c +++ b/cmd_neonserv_deop.c @@ -13,11 +13,6 @@ struct neonserv_cmd_deop_cache { }; static CMD_BIND(neonserv_cmd_deop) { - check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canop", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } struct neonserv_cmd_deop_cache *cache = malloc(sizeof(*cache)); if (!cache) { perror("malloc() failed"); diff --git a/cmd_neonserv_deopall.c b/cmd_neonserv_deopall.c index c6f044c..8fe1f82 100644 --- a/cmd_neonserv_deopall.c +++ b/cmd_neonserv_deopall.c @@ -13,11 +13,6 @@ struct neonserv_cmd_deopall_cache { }; static CMD_BIND(neonserv_cmd_deopall) { - check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canop", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } struct neonserv_cmd_deopall_cache *cache = malloc(sizeof(*cache)); if (!cache) { perror("malloc() failed"); diff --git a/cmd_neonserv_devoice.c b/cmd_neonserv_devoice.c index ccfa8d3..d1720a8 100644 --- a/cmd_neonserv_devoice.c +++ b/cmd_neonserv_devoice.c @@ -8,11 +8,6 @@ static CMD_BIND(neonserv_cmd_devoice) { struct UserNode *cuser; struct ChanUser *chanuser; struct ModeBuffer *modeBuf; - check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canvoice", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } modeBuf = initModeBuffer(client, chan); for(i = 0; i < argc; i++) { cuser = searchUserByNick(argv[i]); diff --git a/cmd_neonserv_op.c b/cmd_neonserv_op.c index 316f59f..80a81cd 100644 --- a/cmd_neonserv_op.c +++ b/cmd_neonserv_op.c @@ -8,11 +8,6 @@ static CMD_BIND(neonserv_cmd_op) { struct UserNode *cuser; struct ChanUser *chanuser; struct ModeBuffer *modeBuf; - check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canop", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } modeBuf = initModeBuffer(client, chan); for(i = 0; i < argc; i++) { cuser = searchUserByNick(argv[i]); diff --git a/cmd_neonserv_opall.c b/cmd_neonserv_opall.c index 0c9c7f7..b187abc 100644 --- a/cmd_neonserv_opall.c +++ b/cmd_neonserv_opall.c @@ -9,11 +9,6 @@ static CMD_BIND(neonserv_cmd_opall) { char *nickmask = NULL; struct ChanUser *chanuser; struct ModeBuffer *modeBuf; - check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canop", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } if(!argc || strcmp(argv[0], "FORCE")) { reply(getTextBot(), user, "NS_OPALL_SECURITY", chan->name); return; diff --git a/cmd_neonserv_set.c b/cmd_neonserv_set.c index 432b3bb..7bba0d0 100644 --- a/cmd_neonserv_set.c +++ b/cmd_neonserv_set.c @@ -26,6 +26,7 @@ static const struct { {"TRIGGER", NULL, NS_VALID_FUNCTION, neonserv_cmd_set_trigger}, {"DEFAULTTOPIC", "channel_defaulttopic", NS_VALID_STRING, NULL}, {"TOPICMASK", "channel_topicmask", NS_VALID_STRING, NULL}, + {"ADVANCEDTOPIC", "channel_exttopic", NS_VALID_BOOLEAN | NS_HAS_OPT, NULL}, {"GREETING", "channel_greeting", NS_VALID_STRING, NULL}, {"USERGREETING", "channel_usergreeting", NS_VALID_STRING, NULL}, {"USERINFO", "channel_userinfo", NS_VALID_ACCESS, NULL}, @@ -264,9 +265,9 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod args = nameBuf; } if(valid & NS_VALID_BOOLEAN) { - if(!strcmp(args, "0") || !strcmp(args, "off") || !strcmp(args, get_language_string(user, "NS_SET_OFF"))) { + if(!strcmp(args, "0") || !stricmp(args, "off") || !stricmp(args, get_language_string(user, "NS_SET_OFF"))) { args = "0"; - } else if(!strcmp(args, "0") || !strcmp(args, "off") || !strcmp(args, get_language_string(user, "NS_SET_OFF"))) { + } 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); diff --git a/cmd_neonserv_topic.c b/cmd_neonserv_topic.c new file mode 100644 index 0000000..b9ea65d --- /dev/null +++ b/cmd_neonserv_topic.c @@ -0,0 +1,123 @@ + +/* +* ADVANCEDTOPIC enabled +* argv[0] topic id +* argv[1-*] topic +* +* ADVANCEDTOPIC disabled +* argv[0-*] topic +*/ + +#define ADVANCEDTOPIC_MAXID 9 + +static CMD_BIND(neonserv_cmd_topic) { + check_mysql(); + MYSQL_RES *res; + MYSQL_ROW row, default_row = NULL; + int advanced_topic, i; + char *newtopic; + char *a,*b; + + printf_mysql_query("SELECT `channel_exttopic`, `channel_exttopic_topic`, `channel_topicmask`, `channel_enftopic`, `channel_topicsnarf`, `channel_defaulttopic` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id); + res = mysql_use(); + row = mysql_fetch_row(res); + if(!row[0] || !row[3] || !row[4]) { + printf_mysql_query("SELECT `channel_exttopic`, `channel_enftopic`, `channel_topicsnarf` FROM `channels` WHERE `channel_name` = 'defaults'"); + default_row = mysql_fetch_row(mysql_use()); + } + + if(row[0] == NULL) { + advanced_topic = atoi(default_row[0]); + } else + advanced_topic = atoi(row[0]); + if(argc == 0) { + //default topic! + putsock(client, "TOPIC %s :%s", chan->name, row[5]); + reply(getTextBot(), user, "NS_TOPIC_DONE", row[5]); + return; + } + int uaccess = getChannelAccess(user, chan, 1); + if(uaccess >= atoi((row[3] ? row[3] : default_row[1]))) { + //just set the topic + newtopic = merge_argv(argv, 0, argc); + if(uaccess >= atoi((row[4] ? row[4] : default_row[2]))) { + //set the default topic + printf_mysql_query("UPDATE `channels` SET `channel_defaulttopic` = '%s' WHERE `channel_id` = '%d'", escape_string(newtopic), chan->channel_id); + } + putsock(client, "TOPIC %s :%s", chan->name, newtopic); + reply(getTextBot(), user, "NS_TOPIC_DONE", newtopic); + return; + } + if(advanced_topic) { + char *advtopics[ADVANCEDTOPIC_MAXID]; + int topic_id = 0; + topic_id = atoi(argv[0]); + if(!topic_id || topic_id > ADVANCEDTOPIC_MAXID) { + reply(getTextBot(), user, "NS_EXTTOPIC_INVALID_ID", argv[0]); + return; + } + //parse topics + i = 0; + b = row[1]; + while((a = strstr(b, "\n")) != NULL) { + *a = '\0'; + if(i == ADVANCEDTOPIC_MAXID-1) break; + advtopics[i++] = b; + b = a+1; + } + advtopics[i++] = b; + for(;i < ADVANCEDTOPIC_MAXID;i++) + advtopics[i] = ""; + if(argc < 2) { + //just show the topic with this id + reply(getTextBot(), user, "NS_EXTTOPIC_TOPICID", topic_id, advtopics[topic_id-1]); + return; + } + newtopic = merge_argv(argv, 1, argc); + advtopics[topic_id-1] = newtopic; + char topiclist[MAXLEN*2]; + topiclist[0] = '\0'; + int topiclistpos = 0; + for(i = 0; i < ADVANCEDTOPIC_MAXID; i++) { + if(topiclistpos + strlen(advtopics[i]) + 2 >= MAXLEN) break; + topiclistpos += sprintf(topiclist+topiclistpos, (i ? "\n%s" : "%s"), advtopics[i]); + } + printf_mysql_query("UPDATE `channels` SET `channel_exttopic_topic` = '%s' WHERE `channel_id` = '%d'", escape_string(topiclist), chan->channel_id); + //now build the new topic and set it... + topiclistpos = 0; + b = row[2]; + while((a = strstr(b, "%")) != NULL) { + *a = '\0'; + if(isdigit(a[1]) && a[1] - 48 > 0) { + topiclistpos += sprintf(topiclist + topiclistpos, "%s%s", b, advtopics[a[1] - 49]); + b = a+2; + } else { + topiclistpos += sprintf(topiclist + topiclistpos, "%s%%", b); + b = a+1; + } + } + topiclistpos += sprintf(topiclist + topiclistpos, "%s", b); + if(topiclistpos > MAXLEN) + topiclist[MAXLEN] = '\0'; + putsock(client, "TOPIC %s :%s", chan->name, topiclist); + reply(getTextBot(), user, "NS_TOPIC_DONE", topiclist); + } else { + newtopic = merge_argv(argv, 0, argc); + char topiclist[MAXLEN*2]; + topiclist[0] = '\0'; + int topiclistpos = 0; + b = row[2]; + while((a = strstr(b, "*")) != NULL) { + *a = '\0'; + topiclistpos += sprintf(topiclist + topiclistpos, "%s%s", b, newtopic); + b = a+1; + } + topiclistpos += sprintf(topiclist + topiclistpos, "%s", b); + if(topiclistpos > MAXLEN) + topiclist[MAXLEN] = '\0'; + putsock(client, "TOPIC %s :%s", chan->name, topiclist); + reply(getTextBot(), user, "NS_TOPIC_DONE", topiclist); + } +} + +#undef ADVANCEDTOPIC_MAXID \ No newline at end of file diff --git a/cmd_neonserv_voice.c b/cmd_neonserv_voice.c index a69deb8..850326c 100644 --- a/cmd_neonserv_voice.c +++ b/cmd_neonserv_voice.c @@ -8,11 +8,6 @@ static CMD_BIND(neonserv_cmd_voice) { struct UserNode *cuser; struct ChanUser *chanuser; struct ModeBuffer *modeBuf; - check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canvoice", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } modeBuf = initModeBuffer(client, chan); for(i = 0; i < argc; i++) { cuser = searchUserByNick(argv[i]); diff --git a/cmd_neonserv_voiceall.c b/cmd_neonserv_voiceall.c index 34d05b1..a407cb7 100644 --- a/cmd_neonserv_voiceall.c +++ b/cmd_neonserv_voiceall.c @@ -8,11 +8,6 @@ static CMD_BIND(neonserv_cmd_voiceall) { char *nickmask = NULL; struct ChanUser *chanuser; struct ModeBuffer *modeBuf; - check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canvoice", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } if(argc > 0) nickmask = argv[0]; modeBuf = initModeBuffer(client, chan); -- 2.20.1