simplified modcmd system
[NeonServV5.git] / src / modcmd.c
index 3f480cda6b8fcac491f15397f4e84f0d632a206a..6b769eac56c6b2017cac2268cd3854d1e907148c 100644 (file)
@@ -35,6 +35,13 @@ struct trigger_callback {
     struct trigger_callback *next;
 };
 
+struct cmd_bot_alias {
+    int botid;
+    char *alias;
+    
+    struct cmd_bot_alias *next;
+};
+
 struct command_check_user_cache {
     struct ClientSocket *client, *textclient;
     struct UserNode *user;
@@ -48,6 +55,7 @@ struct command_check_user_cache {
 static struct cmd_binding **cmd_binds;
 static struct cmd_function *cmd_functions = NULL;
 static struct trigger_callback *trigger_callbacks = NULL;
+static struct cmd_bot_alias *bot_aliases = NULL;
 static struct ClientSocket *tmp_text_client;
 
 static const struct default_language_entry msgtab[] = {
@@ -450,7 +458,7 @@ static void got_privmsg(struct UserNode *user, struct UserNode *target, char *me
 int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, char *channel_access, int global_access, unsigned int flags) {
     struct cmd_function *cmdfunc;
     for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
-        if(cmdfunc->botid == botid && strcmp(cmdfunc->name, name) == 0)
+        if((cmdfunc->botid == botid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, name) == 0)
             return 0;
     }
     cmdfunc = malloc(sizeof(*cmdfunc));
@@ -528,8 +536,22 @@ int bind_cmd_to_function(int botid, char *cmd, struct cmd_function *func) {
 
 int bind_cmd_to_command(int botid, char *cmd, char *func) {
     struct cmd_function *cmdfunc;
+    int fbotid = botid;
+    char *c;
+    if((c = strstr(func, "."))) {
+        *c = '\0';
+        struct cmd_bot_alias *botalias;
+        for(botalias = bot_aliases; botalias; botalias = botalias->next) {
+            if(!stricmp(botalias->alias, func)) {
+                fbotid = botalias->botid;
+                break;
+            }
+        }
+        *c = '.';
+        func = c+1;
+    }
     for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
-        if(cmdfunc->botid == botid && strcmp(cmdfunc->name, func) == 0)
+        if((cmdfunc->botid == fbotid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, func) == 0)
             break;
     }
     if(!cmdfunc) return 0;
@@ -581,8 +603,21 @@ int unbind_cmd(int botid, char *cmd) {
 
 struct cmd_function *find_cmd_function(int botid, char *name) {
     struct cmd_function *cmdfunc;
+    char *c;
+    if((c = strstr(name, "."))) {
+        *c = '\0';
+        struct cmd_bot_alias *botalias;
+        for(botalias = bot_aliases; botalias; botalias = botalias->next) {
+            if(!stricmp(botalias->alias, name)) {
+                botid = botalias->botid;
+                break;
+            }
+        }
+        *c = '.';
+        name = c+1;
+    }
     for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
-        if(cmdfunc->botid == botid && stricmp(cmdfunc->name, name) == 0)
+        if((cmdfunc->botid == botid || cmdfunc->botid == 0) && stricmp(cmdfunc->name, name) == 0)
             break;
     }
     return cmdfunc;
@@ -628,8 +663,15 @@ void free_modcmd() {
         next_cb = cb->next;
         free(next_cb);
     }
+    struct cmd_bot_alias *botalias, *next_botalias;
+    for(botalias = bot_aliases; botalias; botalias = next_botalias) {
+        next_botalias = botalias->next;
+        free(botalias->alias);
+        free(botalias);
+    }
     cmd_functions = NULL;
     trigger_callbacks = NULL;
+    bot_aliases = NULL;
 }
 
 void bind_set_parameters(int botid, char *cmd, char *parameters) {
@@ -706,7 +748,7 @@ void bind_unbound_required_functions(int botid) {
     int i, found;
     struct cmd_binding *cbind;
     for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
-        if(cmdfunc->botid == botid && (cmdfunc->flags & CMDFLAG_REQUIRED)) {
+        if((cmdfunc->flags & CMDFLAG_REQUIRED)) {
             found = 0;
             for(i = 0; i < 27; i++) {
                 for(cbind = cmd_binds[i]; cbind; cbind = cbind->next) {
@@ -726,3 +768,20 @@ void bind_unbound_required_functions(int botid) {
     }
 }
 
+void register_bot_alias(int botid, char *alias) {
+    struct cmd_bot_alias *botalias;
+    for(botalias = bot_aliases; botalias; botalias = botalias->next) {
+        if(!stricmp(botalias->alias, alias))
+            return;
+    }
+    botalias = malloc(sizeof(*botalias));
+    if (!botalias) {
+        perror("malloc() failed");
+        return;
+    }
+    botalias->botid = botid;
+    botalias->alias = strdup(alias);
+    botalias->next = bot_aliases;
+    bot_aliases = botalias;
+}
+