X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/0f402ca493cf3e63e2b8f195e7b8c4c9887a8643..40814391c7b017da05d4daa2895093e5099801c7:/lua/lualocal.c diff --git a/lua/lualocal.c b/lua/lualocal.c index 505b8fbc..2d519e55 100644 --- a/lua/lualocal.c +++ b/lua/lualocal.c @@ -13,13 +13,14 @@ void lua_localnickhandler(nick *target, int type, void **args); void lua_reconnectlocal(void *arg); -static int lua_registerlocaluser(lua_State *ps) { +static int lua_registerlocaluserid(lua_State *ps) { lua_list *l; lua_localnick *ln; char *nickname, *ident, *hostname, *realname, *account; flag_t modes = 0; + long userid; - if(!lua_isstring(ps, 1) || !lua_isstring(ps, 2) || !lua_isstring(ps, 3) || !lua_isstring(ps, 4) || !lua_isstring(ps, 5) || !lua_isstring(ps, 6) || !lua_isfunction(ps, 7)) + if(!lua_isstring(ps, 1) || !lua_isstring(ps, 2) || !lua_isstring(ps, 3) || !lua_isstring(ps, 4) || !lua_isstring(ps, 5) || !lua_isstring(ps, 7) || !lua_isfunction(ps, 8)) return 0; nickname = (char *)lua_tostring(ps, 1); @@ -27,8 +28,13 @@ static int lua_registerlocaluser(lua_State *ps) { hostname = (char *)lua_tostring(ps, 3); realname = (char *)lua_tostring(ps, 4); account = (char *)lua_tostring(ps, 5); + if(lua_islong(ps, 6)) { + userid = lua_tolong(ps, 6); + } else { + userid = 0; + } - setflags(&modes, UMODE_ALL, (char *)lua_tostring(ps, 6), umodeflags, REJECT_NONE); + setflags(&modes, UMODE_ALL, (char *)lua_tostring(ps, 7), umodeflags, REJECT_NONE); if(!lua_lineok(nickname) || !lua_lineok(ident) || !lua_lineok(hostname) || !lua_lineok(realname) || !lua_lineok(account)) return 0; @@ -37,15 +43,15 @@ static int lua_registerlocaluser(lua_State *ps) { if(!l) return 0; - ln = (lua_localnick *)malloc(sizeof(lua_localnick)); + ln = (lua_localnick *)luamalloc(sizeof(lua_localnick)); if(!ln) return 0; ln->reconnect = NULL; - ln->nick = registerlocaluser(nickname, ident, hostname, realname, account, modes, &lua_localnickhandler); + ln->nick = registerlocaluserflags(nickname, ident, hostname, realname, account, userid, 0, modes, &lua_localnickhandler); if(!ln->nick) { - free(ln); + luafree(ln); return 0; } @@ -67,7 +73,7 @@ void lua_freelocalnick(lua_State *ps, lua_localnick *l, char *quitm) { luaL_unref(ps, LUA_REGISTRYINDEX, l->handler); - free(l); + luafree(l); } int lua_getlocalnickbynick(nick *np, lua_list **rl, lua_localnick **rln) { @@ -101,7 +107,7 @@ static int lua_deregisterlocaluser(lua_State *ps) { l = lua_listfromstate(ps); for(l2=l->nicks;l2;lp=l2,l2=l2->next) { - if(l2->nick->numeric == numeric) { + if(l2->nick && l2->nick->numeric == numeric) { if(lp) { lp->next = l2->next; } else { @@ -119,7 +125,9 @@ static int lua_deregisterlocaluser(lua_State *ps) { void lua_deregisternicks(lua_list *l) { struct lua_localnick *ln, *pn; - for(ln=l->nicks;ln;ln=pn) { + ln = l->nicks; + l->nicks = NULL; + for(;ln;ln=pn) { pn = ln->next; lua_freelocalnick(l->l, ln, "Script unloaded."); @@ -151,6 +159,17 @@ void lua_localnickhandler(nick *target, int type, void **args) { break; + case LU_PRIVNOTICE: + np = (nick *)args[0]; + p = (char *)args[1]; + + if(!np || !p) + return; + + lua_vlpcall(l, ln, "irc_onnotice", "Ns", np, p); + + break; + case LU_CHANMSG: np = (nick *)args[0]; c = (channel *)args[1]; @@ -163,8 +182,7 @@ void lua_localnickhandler(nick *target, int type, void **args) { break; case LU_KILLED: - p = (char *)args[2]; - lua_vlpcall(l, ln, "irc_onkilled", "s", p); + lua_vlpcall(l, ln, "irc_onkilled", ""); strlcpy(ln->nickname, target->nick, sizeof(ln->nickname)); strlcpy(ln->ident, target->ident, sizeof(ln->ident)); @@ -183,7 +201,7 @@ void lua_localnickhandler(nick *target, int type, void **args) { np = (nick *)args[0]; c = (channel *)args[1]; - if(!c || !np || !c->index || !c->index->name || !c->index->name->content) + if(!c || !np || !c->index || !c->index->name) return; lua_vlpcall(l, ln, "irc_oninvite", "Ns", np, c->index->name->content); @@ -239,7 +257,7 @@ static int lua_localjoin(lua_State *ps) { static int lua_localpart(lua_State *ps) { nick *source; channel *target; - char *chan; + char *chan, *reason; if(!lua_islong(ps, 1) || !lua_isstring(ps, 2)) LUA_RETURN(ps, LUA_FAIL); @@ -252,10 +270,18 @@ static int lua_localpart(lua_State *ps) { if(!lua_lineok(chan)) LUA_RETURN(ps, LUA_FAIL); - + + if(lua_isstring(ps, 3)) { + reason = (char *)lua_tostring(ps, 3); + if(!lua_lineok(reason)) + LUA_RETURN(ps, LUA_FAIL); + } else { + reason = NULL; + } + target = findchannel(chan); if(target) { - localpartchannel(source, target); + localpartchannel(source, target, reason); } else { LUA_RETURN(ps, LUA_FAIL); } @@ -344,7 +370,7 @@ static int lua_localprivmsg(lua_State *ps) { static int lua_localovmode(lua_State *l) { nick *source; channel *chan; - int state = 0, add, realmode, ignoring = 0; + int state = 0, add = 0, realmode = 0, ignoring = 0; modechanges changes; if(!lua_islong(l, 1) || !lua_isstring(l, 2) || !lua_istable(l, 3)) @@ -520,8 +546,108 @@ static int lua_localkick(lua_State *ps) { LUA_RETURN(ps, LUA_OK); } +static int lua_localrename(lua_State *ps) { + nick *np; + char *changeto; + + if(!lua_islong(ps, 1) || !lua_isstring(ps, 2) ) + LUA_RETURN(ps, LUA_FAIL); + + np = getnickbynumeric(lua_tolong(ps, 1)); + changeto = (char *)lua_tostring(ps, 2); + + if(!lua_lineok(changeto)) + LUA_RETURN(ps, LUA_FAIL); + + renamelocaluser(np, changeto); + + LUA_RETURN(ps, LUA_OK); +} + +static int lua_localwallusers(lua_State *ps) { + char *msg; + nick *source; + char senderstr[6]; + + if(!lua_islong(ps, 1) || !lua_isstring(ps, 2)) + LUA_RETURN(ps, LUA_FAIL); + + source = getnickbynumeric(lua_tolong(ps, 1)); + if(!source) + LUA_RETURN(ps, LUA_FAIL); + + msg = (char *)lua_tostring(ps, 2); + + if(!lua_lineok(msg)) + LUA_RETURN(ps, LUA_FAIL); + + longtonumeric2(source->numeric,5,senderstr); + irc_send("%s WU :%s", senderstr, msg); + + LUA_RETURN(ps, LUA_OK); +} + +static int lua_localwallops(lua_State *ps) { + char *msg; + nick *source; + char senderstr[6]; + + if(!lua_islong(ps, 1) || !lua_isstring(ps, 2)) + LUA_RETURN(ps, LUA_FAIL); + + source = getnickbynumeric(lua_tolong(ps, 1)); + if(!source) + LUA_RETURN(ps, LUA_FAIL); + + msg = (char *)lua_tostring(ps, 2); + + if(!lua_lineok(msg)) + LUA_RETURN(ps, LUA_FAIL); + + longtonumeric2(source->numeric,5,senderstr); + irc_send("%s WA :%s", senderstr, msg); + + LUA_RETURN(ps, LUA_OK); +} + +static int lua_localsimplechanmode(lua_State *ps) { + nick *source; + 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 | CHANMODE_MODNOAUTH | CHANMODE_SINGLETARG; + modechanges changes; + + if(!lua_islong(ps, 1) || !lua_isstring(ps, 2) || !lua_isstring(ps, 3)) + LUA_RETURN(ps, LUA_FAIL); + + source = getnickbynumeric(lua_tolong(ps, 1)); + if(!source) + LUA_RETURN(ps, LUA_FAIL); + + cp = findchannel((char *)lua_tostring(ps, 2)); + if(!cp) + LUA_RETURN(ps, LUA_FAIL); + + modes = (char *)lua_tostring(ps, 3); + if(!modes) + LUA_RETURN(ps, LUA_FAIL); + + if(setflags(&add, permitted, modes, cmodeflags, REJECT_DISALLOWED|REJECT_UNKNOWN) != REJECT_NONE) + LUA_RETURN(ps, LUA_FAIL); + + if(setflags(&del, permitted, modes, cmodeflags, REJECT_DISALLOWED|REJECT_UNKNOWN) != REJECT_NONE) + LUA_RETURN(ps, LUA_FAIL); + + localsetmodeinit(&changes, cp, source); + localdosetmode_simple(&changes, add, ~del); + localsetmodeflush(&changes, 1); + + LUA_RETURN(ps, LUA_OK); +} + void lua_registerlocalcommands(lua_State *l) { - lua_register(l, "irc_localregisteruser", lua_registerlocaluser); + lua_register(l, "irc_localregisteruserid", lua_registerlocaluserid); lua_register(l, "irc_localderegisteruser", lua_deregisterlocaluser); lua_register(l, "irc_localjoin", lua_localjoin); lua_register(l, "irc_localpart", lua_localpart); @@ -535,5 +661,12 @@ void lua_registerlocalcommands(lua_State *l) { lua_register(l, "irc_localban", lua_localban); lua_register(l, "irc_localkick", lua_localkick); lua_register(l, "irc_localumodes", lua_localumodes); + + lua_register(l, "irc_localrename", lua_localrename); + + lua_register(l, "irc_localwallusers", lua_localwallusers); + lua_register(l, "irc_localwallops", lua_localwallops); + + lua_register(l, "irc_localsimplechanmode", lua_localsimplechanmode); }