removed some doubled checks & added cmd_topic with ADVANCEDTOPIC
authorpk910 <philipp@zoelle1.de>
Fri, 9 Sep 2011 22:13:30 +0000 (00:13 +0200)
committerpk910 <philipp@zoelle1.de>
Sat, 10 Sep 2011 00:23:56 +0000 (02:23 +0200)
DATABASE.txt
bot_NeonServ.c
cmd_neonserv_deop.c
cmd_neonserv_deopall.c
cmd_neonserv_devoice.c
cmd_neonserv_op.c
cmd_neonserv_opall.c
cmd_neonserv_set.c
cmd_neonserv_topic.c [new file with mode: 0644]
cmd_neonserv_voice.c
cmd_neonserv_voiceall.c

index c2688f022210d6df2f588deb2bcb1a086adeea1b..e9d5397f3df1ddc24ad5f34b97fa2a31ada2d8c1 100644 (file)
@@ -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` 
index 9a63e325d3d7dd600a40bcd90de91265b366faba..54a82e6a64d22bfb68978778c7474ed46e632d55 100644 (file)
@@ -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);
     
index 65b42fc4e09d0ae0d97c919966630457a9e1ce55..a0e7d0e6bf4cc6a6669b5e1d9de7f3d3d162ef2c 100644 (file)
@@ -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");
index c6f044c7d009c5c92e9ce919c8f578657d4ef11e..8fe1f8248a82f42bf505d566db6ad3baa0af972f 100644 (file)
@@ -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");
index ccfa8d3384cb42a928a322fd7ea7fe6dc354a714..d1720a87b24a2489c8de9ef64785ae0db2afa5b0 100644 (file)
@@ -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]);
index 316f59f5ab5fa3ae4a12dd7d9d3f6d64922a0c6a..80a81cda5239e581ffc40d5d659834b75337bced 100644 (file)
@@ -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]);
index 0c9c7f77354f36f26d72ea128b862bab5befa470..b187abc95e2d20e5bd7bba59174144f631db2160 100644 (file)
@@ -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;
index 432b3bb5623b49481fdd05d4173fcced0a16e91b..7bba0d0cfa68ecb190adef7147df7840ad2b63e5 100644 (file)
@@ -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 (file)
index 0000000..b9ea65d
--- /dev/null
@@ -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
index a69deb850751f31a50e233bd9840608f18930e25..850326c640bec78abba466f91e1133d16851fa69 100644 (file)
@@ -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]);
index 34d05b1b934aae3d873d9a9cb49b675a9f6f4ea0..a407cb75fbc52a4994aba4bd768c5945a538845e 100644 (file)
@@ -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);