#include "../localuser/localuserchannel.h"
#include "../lib/irc_string.h"
#include "../lib/flags.h"
+#include "../authext/authext.h"
+#include "../glines/glines.h"
#include "lua.h"
#include "luabot.h"
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);
#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;
if(!cp)
LUA_RETURN(ps, LUA_FAIL);
- localinvite(lua_nick, cp, np);
+ localinvite(lua_nick, cp->index, np);
LUA_RETURN(ps, LUA_OK);
}
nick *target;
char mask[512];
int duration, usercount = 0;
- host *hp;
if(!lua_isstring(ps, 1) || !lua_isint(ps, 2) || !lua_isstring(ps, 3))
LUA_RETURN(ps, LUA_FAIL);
if(!target || (IsOper(target) || IsXOper(target) || IsService(target)))
LUA_RETURN(ps, LUA_FAIL);
- hp = target->host;
- if(!hp)
+ if(glinebynick(target, duration, reason, GLINE_SIMULATE, "lua") > 50)
LUA_RETURN(ps, LUA_FAIL);
- usercount = hp->clonecount;
- if(usercount > 10) { /* (decent) trusted host */
- int j;
- nick *np;
-
- usercount = 0;
-
- for (j=0;j<NICKHASHSIZE;j++)
- for (np=nicktable[j];np;np=np->next)
- if (np && (np->host == hp) && (!ircd_strcmp(np->ident, target->ident)))
- usercount++;
-
- if(usercount > 50)
- LUA_RETURN(ps, LUA_FAIL);
-
- snprintf(mask, sizeof(mask), "*%s@%s", target->ident, IPtostr(target->p_ipaddr));
- } else {
- snprintf(mask, sizeof(mask), "*@%s", IPtostr(target->p_ipaddr));
- }
-
- irc_send("%s GL * +%s %d :%s", mynumeric->content, mask, duration, reason);
+ usercount = glinebynick(target, duration, reason, 0, "lua");
LUA_RETURN(ps, lua_cmsg(LUA_PUKECHAN, "lua-GLINE: %s (%d users, %d seconds -- %s)", mask, usercount, duration, reason));
}
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_match(lua_State *ps) {
+ const char *mask, *string;
+
+ if(!lua_isstring(ps, 1) || !lua_isstring(ps, 2))
+ return 0;
+
+ mask = lua_tostring(ps, 1);
+ string = lua_tostring(ps, 2);
+
+ if (!mask || !mask[0] || !string || !string[0])
+ return 0;
+
+ LUA_RETURN(ps, match2strings(mask, string));
+}
+
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 && !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;
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);
lua_register(l, "irc_simplechanmode", lua_simplechanmode);
lua_register(l, "irc_sethost", lua_sethost);
+
+ lua_register(l, "irc_numerictobase64", lua_numerictobase64);
+ lua_register(l, "irc_match", lua_match);
}
/* --- */
#define PUSHER_REALUSERS 11
#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;
PUSH_NICKPUSHER(PUSHER_STRING, ident);
PUSH_NICKPUSHER(PUSHER_HOSTNAME, host);
PUSH_NICKPUSHER(PUSHER_REALNAME, realname);
- PUSH_NICKPUSHER(PUSHER_STRING, authname);
+ PUSH_NICKPUSHER(PUSHER_STRING_INDIRECT, authname);
PUSH_NICKPUSHER(PUSHER_IP, ipnode);
PUSH_NICKPUSHER(PUSHER_LONG, numeric);
PUSH_NICKPUSHER(PUSHER_LONG, timestamp);
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)
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) {
case PUSHER_STRING:
lua_pushstring(l, (char *)offset);
break;
+ case PUSHER_STRING_INDIRECT:
+ lua_pushstring(l, *(char **)offset);
+ break;
case PUSHER_HOSTNAME:
lua_pushstring(l, (*(host **)offset)->name->content);
break;
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);
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;
}
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++;
chanpushercount = i;
chanpusher[i].argtype = 0;
}
+