X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/3509b442ae56c07f78db2070da696d8a8ba12de2..efe18ab74e250b0e0a65e8c5fc42220ba091be04:/lua/luacommands.c diff --git a/lua/luacommands.c b/lua/luacommands.c index 84b6e960..2ed3b2b8 100644 --- a/lua/luacommands.c +++ b/lua/luacommands.c @@ -17,6 +17,10 @@ #include "../lib/irc_string.h" #include "../lib/flags.h" #include "../authext/authext.h" +#include "../glines/glines.h" +#include "../trusts/trusts.h" +#include "../bans/bans.h" +#include "../core/modules.h" #include "lua.h" #include "luabot.h" @@ -210,17 +214,16 @@ 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); } static int lua_gline(lua_State *ps) { + glineinfo *info; const char *reason; nick *target; - char mask[512]; - int duration, usercount = 0; - host *hp; + int duration; if(!lua_isstring(ps, 1) || !lua_isint(ps, 2) || !lua_isstring(ps, 3)) LUA_RETURN(ps, LUA_FAIL); @@ -237,32 +240,11 @@ static int lua_gline(lua_State *ps) { 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;jnext) - 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 %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)); + info = glinebynickex(target, duration, reason, 0, "lua"); + LUA_RETURN(ps, lua_cmsg(LUA_PUKECHAN, "lua-GLINE: %s (%d users, %d seconds -- %s)", info->mask, info->hits, duration, reason)); } static int lua_fastgetchaninfo(lua_State *ps) { @@ -365,6 +347,110 @@ static int lua_versioninfo(lua_State *ps) { return 5; } +static int lua_nickmatchban(lua_State *ps) { + const char *chanban_str; + long numeric; + chanban *cb; + nick *np; + + if(!lua_islong(ps, 1) || !lua_isstring(ps, 2)) + return 0; + + numeric = lua_tolong(ps, 1); + chanban_str = lua_tostring(ps, 2); + + np = getnickbynumeric(numeric); + if(!np) + return 0; + + cb = makeban(chanban_str); + if(!cb) + return 0; + + lua_pushboolean(ps, nickmatchban(np, cb, 1)); + + freechanban(cb); + + return 1; +} + +static int lua_nickbanned(lua_State *ps) { + const char *channel_str; + long numeric; + channel *cp; + nick *np; + + if(!lua_islong(ps, 1) || !lua_isstring(ps, 2)) + return 0; + + numeric = lua_tolong(ps, 1); + channel_str = lua_tostring(ps, 2); + + np = getnickbynumeric(numeric); + if(!np) + return 0; + + cp = findchannel((char *)channel_str); + if(!cp) + return 0; + + lua_pushboolean(ps, nickbanned(np, cp, 1)); + + return 1; +} + +static int lua_suggestbanmask(lua_State *ps) { + nick *np; + glinebuf gb; + gline *gl; + long numeric; + int i = 1; + + if (!lua_islong(ps, 1)) + return 0; + + numeric = lua_tolong(ps, 1); + + np = getnickbynumeric(numeric); + if (!np) + return 0; + + glinebufinit(&gb, 0); + glinebufaddbynick(&gb, np, 0, "Auto", "None", time(NULL), time(NULL), time(NULL)); + + lua_newtable(ps); + + for (gl = gb.glines; gl; gl = gl->next) { + if (gl->host && gl->host->content) { + char *mask = glinetostring(gl); + LUA_APUSHSTRING(ps, i, mask); + i++; + } + } + + glinebufabort(&gb); + + return 1; +} + +static int lua_nickistrusted(lua_State *ps) { + long numeric; + nick *np; + + if(!lua_islong(ps, 1)) + return 0; + + numeric = lua_tolong(ps, 1); + + np = getnickbynumeric(numeric); + if(!np) + return 0; + + lua_pushboolean(ps, istrusted(np)); + + return 1; +} + static int lua_basepath(lua_State *ps) { lua_pushfstring(ps, "%s/", cpath->content); @@ -377,6 +463,30 @@ static int lua_botnick(lua_State *ps) { 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_pushboolean(ps, match2strings(mask, string)); + return 1; +} + static int lua_getuserbyauth(lua_State *l) { nick *np; int found = 0; @@ -898,6 +1008,14 @@ 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); + lua_register(l, "ircmatch", lua_match); + + lua_register(l, "irc_nickmatchban", lua_nickmatchban); + lua_register(l, "irc_nickistrusted", lua_nickistrusted); + lua_register(l, "irc_nickbanned", lua_nickbanned); + lua_register(l, "irc_suggestbanmask", lua_suggestbanmask); } /* --- */ @@ -948,6 +1066,10 @@ 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 +#define PUSHER_IS_SERVICE 18 void lua_initnickpusher(void) { int i = 0; @@ -966,6 +1088,10 @@ 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"); + PUSH_NICKPUSHER_CUSTOM(PUSHER_IS_SERVICE, "isservice"); nickpushercount = i; nickpusher[i].argtype = 0; @@ -1037,6 +1163,16 @@ 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); @@ -1074,6 +1210,15 @@ 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; + case PUSHER_IS_SERVICE: + lua_pushboolean(l, NickOnServiceServer((nick *)offset)); + break; } i++; @@ -1098,3 +1243,4 @@ void lua_initchanpusher(void) { chanpushercount = i; chanpusher[i].argtype = 0; } +