X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/4c64f7ed3cc65178aee2eaafd7ef1d10c4b66da1..5ec20d224f8f4d79c9cb9e5b8546c4a638a35943:/lua/luacommands.c diff --git a/lua/luacommands.c b/lua/luacommands.c index 195f179b..205bafc4 100644 --- a/lua/luacommands.c +++ b/lua/luacommands.c @@ -38,8 +38,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 +47,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; @@ -258,23 +260,23 @@ 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)); } -static int lua_getchaninfo(lua_State *ps) { +static int lua_fastgetchaninfo(lua_State *ps) { + static struct lua_pusher *ourpusher[MAX_PUSHER]; channel *cp; if(!lua_isstring(ps, 1)) return 0; cp = findchannel((char *)lua_tostring(ps, 1)); - if(!cp) + if(!cp || cp->index->channel != cp) return 0; - LUA_PUSHCHAN(ps, cp); - - return 1; + lua_setupchanpusher(ps, 2, ourpusher, MAX_PUSHER); + return lua_usepusher(ps, ourpusher, cp->index); } static int lua_opchan(lua_State *ps) { @@ -368,6 +370,12 @@ static int lua_basepath(lua_State *ps) { return 1; } +static int lua_botnick(lua_State *ps) { + lua_pushstring(ps, luabotnick->content); + + return 1; +} + /* O(n) */ static int lua_getuserbyauth(lua_State *l) { const char *acc; @@ -381,8 +389,8 @@ static int lua_getuserbyauth(lua_State *l) { for(i=0;inext) { - if(np && np->authname && !ircd_strcmp(np->authname, acc)) { - LUA_PUSHNICK(l, np); + if(np && np->authname[0] && !ircd_strcmp(np->authname, acc)) { + lua_pushnumeric(l, np->numeric); found++; } } @@ -526,7 +534,7 @@ static int lua_gethostusers(lua_State *l) { count = np->host->clonecount; do { - LUA_PUSHNICK(l, np); + lua_pushnumeric(l, np->numeric); np = np->nextbyhost; } while(np); @@ -691,21 +699,8 @@ static int lua_getusermodes(lua_State *l) { return 1; } -static int lua_getnickbynick(lua_State *l) { - nick *np; - - if(!lua_isstring(l, 1)) - return 0; - - np = getnickbynick(lua_tostring(l, 1)); - if(!np) - return 0; - - LUA_PUSHNICK(l, np); - return 1; -} - -static int lua_getnickbynumeric(lua_State *l) { +static int lua_fastgetnickbynumeric(lua_State *l) { + static struct lua_pusher *ourpusher[MAX_PUSHER]; nick *np; if(!lua_islong(l, 1)) @@ -715,18 +710,18 @@ static int lua_getnickbynumeric(lua_State *l) { if(!np) return 0; - LUA_PUSHNICK(l, np); - return 1; + lua_setupnickpusher(l, 2, ourpusher, MAX_PUSHER); + return lua_usepusher(l, ourpusher, np); } -static int lua_fastgetnickbynumeric(lua_State *l) { +static int lua_fastgetnickbynick(lua_State *l) { static struct lua_pusher *ourpusher[MAX_PUSHER]; nick *np; - if(!lua_islong(l, 1)) + if(!lua_isstring(l, 1)) return 0; - np = getnickbynumeric(lua_tolong(l, 1)); + np = getnickbynick((char *)lua_tostring(l, 1)); if(!np) return 0; @@ -787,7 +782,7 @@ static int lua_simplechanmode(lua_State *ps) { channel *cp; char *modes; flag_t add = 0, del = ~add; - flag_t permitted = CHANMODE_NOEXTMSG | CHANMODE_TOPICLIMIT | CHANMODE_SECRET | CHANMODE_PRIVATE | CHANMODE_INVITEONLY | CHANMODE_MODERATE | CHANMODE_NOCOLOUR | CHANMODE_NOCTCP | CHANMODE_REGONLY | CHANMODE_DELJOINS | CHANMODE_NOQUITMSG | CHANMODE_NONOTICE; + flag_t permitted = CHANMODE_NOEXTMSG | CHANMODE_TOPICLIMIT | CHANMODE_SECRET | CHANMODE_PRIVATE | CHANMODE_INVITEONLY | CHANMODE_MODERATE | CHANMODE_NOCOLOUR | CHANMODE_NOCTCP | CHANMODE_REGONLY | CHANMODE_DELJOINS | CHANMODE_NOQUITMSG | CHANMODE_NONOTICE | CHANMODE_MODNOAUTH | CHANMODE_SINGLETARG; modechanges changes; if(!lua_isstring(ps, 1) || !lua_isstring(ps, 2)) @@ -835,6 +830,21 @@ static int lua_sethost(lua_State *ps) { LUA_RETURN(ps, LUA_OK); } +static int lua_getvisiblehostmask(lua_State *l) { + nick *np; + char buf[HOSTLEN+USERLEN+NICKLEN+REALLEN+10]; + + if(!lua_islong(l, 1)) + return 0; + + np = getnickbynumeric(lua_tolong(l, 1)); + if(!np) + return 0; + + lua_pushstring(l, visiblehostmask(np, buf)); + return 1; +} + void lua_registercommands(lua_State *l) { lua_register(l, "irc_smsg", lua_smsg); lua_register(l, "irc_skill", lua_skill); @@ -842,6 +852,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); @@ -849,7 +860,6 @@ void lua_registercommands(lua_State *l) { lua_register(l, "irc_kick", lua_kick); lua_register(l, "irc_invite", lua_invite); lua_register(l, "irc_gline", lua_gline); - lua_register(l, "irc_getchaninfo", lua_getchaninfo); lua_register(l, "irc_counthost", lua_counthost); lua_register(l, "irc_getuserbyauth", lua_getuserbyauth); lua_register(l, "irc_notice", lua_noticecmd); @@ -862,8 +872,6 @@ void lua_registercommands(lua_State *l) { lua_register(l, "irc_deopchan", lua_deopchan); lua_register(l, "irc_topic", lua_topic); - lua_register(l, "irc_getnickbynick", lua_getnickbynick); - lua_register(l, "irc_getnickbynumeric", lua_getnickbynumeric); lua_register(l, "irc_getfirstnick", lua_getfirstnick); lua_register(l, "irc_getnextnick", lua_getnextnick); @@ -885,6 +893,10 @@ void lua_registercommands(lua_State *l) { lua_register(l, "irc_nickonchan", lua_nickonchan); lua_register(l, "irc_fastgetnickbynumeric", lua_fastgetnickbynumeric); + lua_register(l, "irc_fastgetnickbynick", lua_fastgetnickbynick); + lua_register(l, "irc_fastgetchaninfo", lua_fastgetchaninfo); + + lua_register(l, "irc_getvisiblehostmask", lua_getvisiblehostmask); lua_register(l, "irc_simplechanmode", lua_simplechanmode); lua_register(l, "irc_sethost", lua_sethost); @@ -934,6 +946,10 @@ static int lua_skill(lua_State *ps) { #define PUSHER_TOPIC 8 #define PUSHER_UMODES 9 #define PUSHER_COUNTRY 10 +#define PUSHER_REALUSERS 11 +#define PUSHER_CHANMODES 12 +#define PUSHER_TIMESTAMP 13 +#define PUSHER_STRING_INDIRECT 14 void lua_initnickpusher(void) { int i = 0; @@ -945,7 +961,7 @@ void lua_initnickpusher(void) { 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); @@ -957,7 +973,7 @@ void lua_initnickpusher(void) { 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) @@ -986,7 +1002,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) { @@ -996,6 +1012,9 @@ INLINE int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np) { 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; @@ -1008,12 +1027,38 @@ INLINE int lua_usepusher(lua_State *l, struct lua_pusher **lp, void *np) { case PUSHER_LONG: lua_pushlong(l, *((long *)offset)); break; + case PUSHER_TIMESTAMP: + lua_pushlong(l, (*((channel **)offset))->timestamp); + break; case PUSHER_IP: lua_pushstring(l, IPtostr((*((patricia_node_t **)offset))->prefix->sin)); break; case PUSHER_TOTALUSERS: lua_pushint(l, (*((channel **)offset))->users->totalusers); break; + case PUSHER_CHANMODES: + lua_pushstring(l, printallmodes(*((channel **)offset))); + break; + case PUSHER_REALUSERS: + { + channel *cp = *((channel **)offset); + nick *np2; + int i, currentusers = countuniquehosts(cp); + for(i=0;iusers->hashsize;i++) { + if(cp->users->content[i]==nouser) + continue; + + if((np2=getnickbynumeric(cp->users->content[i]))==NULL) { + Error("lua", ERR_ERROR, "Found unknown numeric %lu on channel %s", cp->users->content[i], cp->index->name->content); + continue; + } + + if (IsXOper(np2) || IsService(np2)) + currentusers--; + } + lua_pushint(l, currentusers); + } + break; case PUSHER_UMODES: lua_pushstring(l, printflags(*((flag_t *)offset), umodeflags)); break; @@ -1048,6 +1093,9 @@ void lua_initchanpusher(void) { PUSH_CHANPUSHER(PUSHER_SSTRING, name, "name"); PUSH_CHANPUSHER(PUSHER_TOTALUSERS, channel, "totalusers"); PUSH_CHANPUSHER(PUSHER_TOPIC, channel, "topic"); + PUSH_CHANPUSHER(PUSHER_REALUSERS, channel, "realusers"); + PUSH_CHANPUSHER(PUSHER_TIMESTAMP, channel, "timestamp"); + PUSH_CHANPUSHER(PUSHER_CHANMODES, channel, "modes"); chanpushercount = i; chanpusher[i].argtype = 0;