]> jfr.im git - irc/quakenet/newserv.git/blobdiff - lua/nterfacer_lua.c
CHANSERV: reduce reason to 15 chars
[irc/quakenet/newserv.git] / lua / nterfacer_lua.c
index 6fe3fb02fa3ed4a93581e66b440313fe51e8af4e..0fdb4629ebb037b628d7594b4dd34ddccae3eca2 100644 (file)
@@ -7,15 +7,16 @@
 
 #include "../lua/lua.h"
 
-#include "../nterface/library.h"
-#include "../nterface/nterfacer.h"
+#include "../nterfacer/library.h"
+#include "../nterfacer/nterfacer.h"
 
-MODULE_VERSION("$Id")
+MODULE_VERSION("");
 
 #define ERR_SCRIPT_NOT_FOUND            0x01
 #define ERR_SCRIPT_ERROR                0x02
 #define ERR_NO_NTERFACER                0x03
 #define ERR_SCRIPT_RETURN_ERROR         0x04
+#define ERR_DATA_INVALID                0x05
 #define ERROR_SCRIPT_ERROR_OFFSET       1000
 
 int handle_scriptcommand(struct rline *li, int argc, char **argv);
@@ -40,8 +41,8 @@ int handle_scriptcommand(struct rline *li, int argc, char **argv) {
   lua_State *l;
   int top;
   int iresult = 0;
-  char *cresult;
-  int ret, i;
+  int ret = 0, i;
+  char *cresult = NULL;
 
   if(!l2)
     return ri_error(li, ERR_SCRIPT_NOT_FOUND, "Script not found.");
@@ -66,20 +67,59 @@ int handle_scriptcommand(struct rline *li, int argc, char **argv) {
     return ret;
   }
 
-  if(!lua_isint(l, -2) || !lua_isstring(l, -1)) {
+  if(!lua_isint(l, -2) || (!lua_isstring(l, -1) && !lua_istable(l, -1))) {
     lua_settop(l, top);
     return ri_error(li, ERR_SCRIPT_RETURN_ERROR, "Script didn't return expected values.");
   }
 
+  if(lua_isstring(l, -1)) {
+    cresult = (char *)lua_tostring(l, -1);
+    if(!lua_lineok(cresult)) {
+      lua_settop(l, top);
+      return ri_error(li, ERR_DATA_INVALID, "Script returned bad data.");
+    }
+  }
+
   iresult = lua_toint(l, -2);
-  cresult = (char *)lua_tostring(l, -1);
   if(iresult) {
-    ret = ri_error(li, iresult + ERROR_SCRIPT_ERROR_OFFSET, "Script error: %s", cresult);
-    lua_settop(l, top);
-    return ret;
+    if(!lua_isstring(l, -1)) {
+      lua_settop(l, top);
+      return ri_error(li, ERR_SCRIPT_RETURN_ERROR, "Script didn't return expected values.");
+    } else {
+      ret = ri_error(li, iresult + ERROR_SCRIPT_ERROR_OFFSET, "Script error: %s", cresult);
+      lua_settop(l, top);
+      return ret;
+    }
+  }
+
+  if(lua_isstring(l, -1)) {
+    ret = ri_append(li, "%s", cresult);
+  } else {
+    lua_pushnil(l);
+
+    while(lua_next(l, -2)) {
+      if(!lua_isstring(l, -1)) {
+        lua_pop(l, 1);
+        lua_settop(l, top);
+        return ri_error(li, ERR_SCRIPT_RETURN_ERROR, "Script didn't return expected values.");
+      } else {
+        cresult = (char *)lua_tostring(l, -1);
+        if(!lua_lineok(cresult)) {
+          lua_pop(l, 1);
+          lua_settop(l, top);
+          return ri_error(li, ERR_DATA_INVALID, "Script returned bad data.");
+        } else {
+          ret = ri_append(li, "%s", cresult);
+        }
+      }
+
+      lua_pop(l, 1);
+
+      if(ret == BF_OVER)
+        break;
+    }
   }
 
-  ret = ri_append(li, "%s", cresult);
   lua_settop(l, top);
 
   if(ret == BF_OVER)