fixed small unbind problem with these temporarily added commands
[NeonServV5.git] / src / modcmd.c
index 3f51761a0f30bbf5e3e47abdc3b82027fcffe0ba..3f480cda6b8fcac491f15397f4e84f0d632a206a 100644 (file)
@@ -103,7 +103,7 @@ static char* get_channel_trigger(int botid, struct ChanNode *chan) {
         return 0;
     }
     trigger->botid = botid;
-    trigger->trigger = strdup(triggerStr);
+    trigger->trigger = (triggerStr[0] ? strdup(triggerStr) : NULL);
     trigger->next = chan->trigger;
     chan->trigger = trigger;
     return trigger->trigger;
@@ -291,8 +291,8 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u
         printf_mysql_query("SELECT `channel_pubcmd` FROM `channels` WHERE `channel_name` = '%s'", escape_string(sent_chan->name));
         res = mysql_use();
         if ((row = mysql_fetch_row(res)) != NULL) {
-            uaccess = getChannelAccess(user, sent_chan, 1);
-            if(row[0] && uaccess < atoi(row[0])) { //NOTE: HARDCODED DEFAULT: pubcmd = 0
+            uaccess = getChannelAccess(user, sent_chan);
+            if(row[0] && uaccess < atoi(row[0]) && !isGodMode(user)) { //NOTE: HARDCODED DEFAULT: pubcmd = 0
                 reply(tmp_text_client, user, "MODCMD_PUBCMD", sent_chan->name);
                 return;
             }
@@ -351,7 +351,7 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u
                 chan->flags |= CHANFLAG_CHAN_REGISTERED;
                 chan->channel_id = atoi(row[0]);
                 if((sent_chan && sent_chan == chan) || access_count || minaccess) {
-                    uaccess = getChannelAccess(user, chan, 0);
+                    uaccess = getChannelAccess(user, chan);
                     if(uaccess < minaccess && isGodMode(user)) {
                         eventflags |= CMDFLAG_OPLOG;
                     } else if(uaccess < minaccess) {
@@ -422,7 +422,7 @@ static void got_chanmsg(struct UserNode *user, struct ChanNode *chan, char *mess
         if(isUserOnChan(client->user, chan) && (client->flags & SOCKET_FLAG_PREFERRED) && !FD_ISSET(client->botid, &fds)) {
             FD_SET(client->botid, &fds);
             trigger = get_channel_trigger(client->botid, chan);
-            if(stricmplen(message, trigger, strlen(trigger)) == 0) {
+            if(trigger && stricmplen(message, trigger, strlen(trigger)) == 0) {
                 handle_command(client, user, chan, message + strlen(trigger));
             }
         }
@@ -431,7 +431,7 @@ static void got_chanmsg(struct UserNode *user, struct ChanNode *chan, char *mess
         if(isUserOnChan(client->user, chan) && !FD_ISSET(client->botid, &fds)) {
             FD_SET(client->botid, &fds);
             trigger = get_channel_trigger(client->botid, chan);
-            if(stricmplen(message, trigger, strlen(trigger)) == 0) {
+            if(trigger && stricmplen(message, trigger, strlen(trigger)) == 0) {
                 handle_command(client, user, chan, message + strlen(trigger));
             }
         }
@@ -701,3 +701,28 @@ struct cmd_binding *find_cmd_binding(int botid, char *cmd) {
     return NULL;
 }
 
+void bind_unbound_required_functions(int botid) {
+    struct cmd_function *cmdfunc;
+    int i, found;
+    struct cmd_binding *cbind;
+    for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
+        if(cmdfunc->botid == botid && (cmdfunc->flags & CMDFLAG_REQUIRED)) {
+            found = 0;
+            for(i = 0; i < 27; i++) {
+                for(cbind = cmd_binds[i]; cbind; cbind = cbind->next) {
+                    if(cbind->botid == botid && cbind->func == cmdfunc) {
+                        found = 1;
+                        break;
+                    }
+                }
+                if(found)
+                    break;
+            }
+            if(!found && bind_cmd_to_function(botid, cmdfunc->name, cmdfunc)) {
+                cbind = find_cmd_binding(botid, cmdfunc->name);
+                cbind->flags |= CMDFLAG_TEMPONARY_BIND;
+            }
+        }
+    }
+}
+