]> jfr.im git - irc/quakenet/newserv.git/blobdiff - lua/luacommands.c
LUA: Add servername and servernumeric nickpushers.
[irc/quakenet/newserv.git] / lua / luacommands.c
index fd00c922e6a98b7769a40a2a6ee47cbdf921f5bc..e961a9982855ca914f8727dd628de5d61181ed9f 100644 (file)
@@ -16,6 +16,7 @@
 #include "../localuser/localuserchannel.h"
 #include "../lib/irc_string.h"
 #include "../lib/flags.h"
+#include "../authext/authext.h"
 
 #include "lua.h"
 #include "luabot.h"
@@ -38,8 +39,8 @@ struct lua_pusher nickpusher[MAX_PUSHER];
 struct lua_pusher chanpusher[MAX_PUSHER];
 int nickpushercount, chanpushercount;
 
-INLINE void lua_setuppusher(struct lua_pusher *pusherlist, lua_State *l, int index, struct lua_pusher **lp, int max, int pcount);
-INLINE int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np);
+void lua_setuppusher(struct lua_pusher *pusherlist, lua_State *l, int index, struct lua_pusher **lp, int max, int pcount);
+int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np);
 
 void lua_initnickpusher(void);
 void lua_initchanpusher(void);
@@ -47,6 +48,8 @@ void lua_initchanpusher(void);
 #define lua_setupnickpusher(L2, I2, P2, M2) lua_setuppusher(&nickpusher[0], L2, I2, P2, M2, nickpushercount)
 #define lua_setupchanpusher(L2, I2, P2, M2) lua_setuppusher(&chanpusher[0], L2, I2, P2, M2, chanpushercount)
 
+int lua_cmsg(char *channell, char *message, ...) __attribute__ ((format (printf, 2, 3)));
+
 int lua_cmsg(char *channell, char *message, ...) {
   char buf[512];
   va_list va;
@@ -207,7 +210,7 @@ static int lua_invite(lua_State *ps) {
   if(!cp)
     LUA_RETURN(ps, LUA_FAIL);
 
-  localinvite(lua_nick, cp, np);
+  localinvite(lua_nick, cp->index, np);
 
   LUA_RETURN(ps, LUA_OK);
 }
@@ -258,7 +261,7 @@ static int lua_gline(lua_State *ps) {
     snprintf(mask, sizeof(mask), "*@%s", IPtostr(target->p_ipaddr));
   }
 
-  irc_send("%s GL * +%s %d :%s", mynumeric->content, mask, duration, reason);
+  irc_send("%s GL * +%s %d %jd :%s", mynumeric->content, mask, duration, (intmax_t)getnettime(), reason);
   LUA_RETURN(ps, lua_cmsg(LUA_PUKECHAN, "lua-GLINE: %s (%d users, %d seconds -- %s)", mask, usercount, duration, reason));
 }
 
@@ -368,24 +371,35 @@ static int lua_basepath(lua_State *ps) {
   return 1;
 }
 
-/* O(n) */
+static int lua_botnick(lua_State *ps) {
+  lua_pushstring(ps, luabotnick->content);
+
+  return 1;
+}
+
+static int lua_numerictobase64(lua_State *ps) {
+  if(!lua_islong(ps, 1))
+    return 0;
+
+  lua_pushstring(ps, longtonumeric(lua_tolong(ps, 1), 5));
+  return 1;
+}
+
 static int lua_getuserbyauth(lua_State *l) {
-  const char *acc;
   nick *np;
-  int i, found = 0;
+  int found = 0;
+  authname *au;
 
   if(!lua_isstring(l, 1))
     return 0;
 
-  acc = lua_tostring(l, 1);
+  au = getauthbyname(lua_tostring(l, 1));
+  if(!au)
+    return 0;
 
-  for(i=0;i<NICKHASHSIZE;i++) {
-    for(np=nicktable[i];np;np=np->next) {
-      if(np && np->authname[0] && !ircd_strcmp(np->authname, acc)) {  
-        lua_pushnumeric(l, np->numeric);
-        found++;
-      }
-    }
+  for(np=au->nicks;np;np=np->nextbyauthname) {
+    lua_pushnumeric(l, np->numeric);
+    found++;
   }
 
   return found;
@@ -844,6 +858,7 @@ void lua_registercommands(lua_State *l) {
   lua_register(l, "chanmsg", lua_chanmsg);
   lua_register(l, "versioninfo", lua_versioninfo);
   lua_register(l, "basepath", lua_basepath);
+  lua_register(l, "botnick", lua_botnick);
 
   lua_register(l, "irc_report", lua_chanmsg);
   lua_register(l, "irc_ctcp", lua_ctcp);
@@ -891,6 +906,8 @@ void lua_registercommands(lua_State *l) {
 
   lua_register(l, "irc_simplechanmode", lua_simplechanmode);
   lua_register(l, "irc_sethost", lua_sethost);
+
+  lua_register(l, "irc_numerictobase64", lua_numerictobase64);
 }
 
 /* --- */
@@ -941,6 +958,9 @@ static int lua_skill(lua_State *ps) {
 #define PUSHER_CHANMODES 12
 #define PUSHER_TIMESTAMP 13
 #define PUSHER_STRING_INDIRECT 14
+#define PUSHER_ACC_ID 15
+#define PUSHER_SERVER_NAME 16
+#define PUSHER_SERVER_NUMERIC 17
 
 void lua_initnickpusher(void) {
   int i = 0;
@@ -959,12 +979,15 @@ void lua_initnickpusher(void) {
   PUSH_NICKPUSHER(PUSHER_LONG, accountts);
   PUSH_NICKPUSHER(PUSHER_UMODES, umodes);
   PUSH_NICKPUSHER_CUSTOM(PUSHER_COUNTRY, "country");
+  PUSH_NICKPUSHER_CUSTOM(PUSHER_ACC_ID, "accountid");
+  PUSH_NICKPUSHER_CUSTOM(PUSHER_SERVER_NAME, "servername");
+  PUSH_NICKPUSHER_CUSTOM(PUSHER_SERVER_NUMERIC, "servernumeric");
 
   nickpushercount = i;
   nickpusher[i].argtype = 0;
 }
 
-INLINE void lua_setuppusher(struct lua_pusher *pusherlist, lua_State *l, int index, struct lua_pusher **lp, int max, int pcount) {
+void lua_setuppusher(struct lua_pusher *pusherlist, lua_State *l, int index, struct lua_pusher **lp, int max, int pcount) {
   int current = 0;
 
   if(max > 0)
@@ -993,7 +1016,7 @@ INLINE void lua_setuppusher(struct lua_pusher *pusherlist, lua_State *l, int ind
   lp[current] = NULL;
 }
 
-INLINE int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np) {
+int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np) {
   int i = 0;
 
   while(*lp) {
@@ -1030,6 +1053,16 @@ INLINE int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np) {
       case PUSHER_CHANMODES:
         lua_pushstring(l, printallmodes(*((channel **)offset)));
         break;
+      case PUSHER_ACC_ID:
+        {
+          nick *tnp = (nick *)np;
+          if(IsAccount(tnp) && tnp->auth) {
+            lua_pushlong(l, tnp->auth->userid);
+          } else {
+            lua_pushnil(l);
+          }
+          break;
+        }
       case PUSHER_REALUSERS:
         {
           channel *cp = *((channel **)offset);
@@ -1040,7 +1073,7 @@ INLINE int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np) {
               continue;
 
             if((np2=getnickbynumeric(cp->users->content[i]))==NULL) {
-              Error("lua", ERR_ERROR, "Found unknown numeric %u on channel %s", cp->users->content[i], cp->index->name->content);
+              Error("lua", ERR_ERROR, "Found unknown numeric %lu on channel %s", cp->users->content[i], cp->index->name->content);
               continue;
             }
 
@@ -1067,6 +1100,12 @@ INLINE int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np) {
           lua_pushint(l, (long)((nick *)offset)->exts[geoipext]);
         }
         break;
+      case PUSHER_SERVER_NAME:
+        lua_pushstring(l, serverlist[homeserver(((nick *)offset)->numeric)].name->content);
+        break;
+      case PUSHER_SERVER_NUMERIC:
+        lua_pushint(l, homeserver(((nick *)offset)->numeric));
+        break;
     }
 
     i++;
@@ -1091,3 +1130,4 @@ void lua_initchanpusher(void) {
   chanpushercount = i;
   chanpusher[i].argtype = 0;
 }
+