if(!l)
return 0;
- ln = (lua_localnick *)malloc(sizeof(lua_localnick));
+ ln = (lua_localnick *)luamalloc(sizeof(lua_localnick));
if(!ln)
return 0;
ln->nick = registerlocaluser(nickname, ident, hostname, realname, account, modes, &lua_localnickhandler);
if(!ln->nick) {
- free(ln);
+ luafree(ln);
return 0;
}
luaL_unref(ps, LUA_REGISTRYINDEX, l->handler);
- free(l);
+ luafree(l);
}
int lua_getlocalnickbynick(nick *np, lua_list **rl, lua_localnick **rln) {
if(!lua_islong(ps, 1))
LUA_RETURN(ps, LUA_FAIL);
+ numeric = lua_tolong(ps, 1);
+
quitm = lua_isstring(ps, 2)?(char *)lua_tostring(ps, 2):"localuser unregistered.";
l = lua_listfromstate(ps);
for(l2=l->nicks;l2;lp=l2,l2=l2->next) {
if(l2->nick->numeric == numeric) {
- lp->next = l2->next;
+ if(lp) {
+ lp->next = l2->next;
+ } else {
+ l->nicks = l2->next;
+ }
+
lua_freelocalnick(ps, l2, quitm);
LUA_RETURN(ps, LUA_OK);
}
break;
case LU_KILLED:
- lua_vlpcall(l, ln, "irc_onkilled", "");
+ p = (char *)args[2];
+ lua_vlpcall(l, ln, "irc_onkilled", "s", p);
strlcpy(ln->nickname, target->nick, sizeof(ln->nickname));
strlcpy(ln->ident, target->ident, sizeof(ln->ident));
ln->reconnect = scheduleoneshot(time(NULL) + 1, &lua_reconnectlocal, ln);
+ break;
+ case LU_INVITE:
+ /* we were invited, check if someone invited us to PUBLICCHAN */
+ np = (nick *)args[0];
+ c = (channel *)args[1];
+
+ if(!c || !np || !c->index || !c->index->name || !c->index->name->content)
+ return;
+
+ lua_vlpcall(l, ln, "irc_oninvite", "Ns", np, c->index->name->content);
break;
}
}
LUA_RETURN(ps, LUA_FAIL);
chan = (char *)lua_tostring(ps, 2);
+ if(chan[0] != '#')
+ LUA_RETURN(ps, LUA_FAIL);
if(!lua_lineok(chan))
LUA_RETURN(ps, LUA_FAIL);
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);
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);
}
LUA_RETURN(ps, LUA_OK);
}
+static int lua_localprivmsg(lua_State *ps) {
+ char *msg;
+ nick *source;
+ nick *target;
+
+ if(!lua_islong(ps, 1) || !lua_islong(ps, 2) || !lua_isstring(ps, 3))
+ LUA_RETURN(ps, LUA_FAIL);
+
+ source = getnickbynumeric(lua_tolong(ps, 1));
+ if(!source)
+ LUA_RETURN(ps, LUA_FAIL);
+
+ target = getnickbynumeric(lua_tolong(ps, 2));
+ if(!target)
+ LUA_RETURN(ps, LUA_FAIL);
+
+ msg = (char *)lua_tostring(ps, 3);
+
+ if(!lua_lineok(msg))
+ LUA_RETURN(ps, LUA_FAIL);
+
+ sendmessagetouser(source, target, "%s", msg);
+
+ LUA_RETURN(ps, LUA_OK);
+}
+
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))
LUA_RETURN(l, LUA_OK);
}
+static int lua_localumodes(lua_State *ps) {
+ nick *np;
+ char *modes;
+ flag_t newmodes = 0;
+
+ if(!lua_islong(ps, 1) || !lua_isstring(ps, 2))
+ LUA_RETURN(ps, LUA_FAIL);
+
+ np = getnickbynumeric(lua_tolong(ps, 1));
+ if(!np)
+ LUA_RETURN(ps, LUA_FAIL);
+
+ modes = (char *)lua_tostring(ps, 2);
+
+ setflags(&newmodes, UMODE_ALL, modes, umodeflags, REJECT_NONE);
+
+ localusersetumodes(np, newmodes);
+ LUA_RETURN(ps, LUA_OK);
+}
+
static int lua_localtopic(lua_State *ps) {
nick *np;
channel *cp;
lua_register(l, "irc_localpart", lua_localpart);
lua_register(l, "irc_localchanmsg", lua_localchanmsg);
lua_register(l, "irc_localnotice", lua_localnotice);
+ lua_register(l, "irc_localprivmsg", lua_localprivmsg);
lua_register(l, "irc_localovmode", lua_localovmode);
lua_register(l, "irc_localtopic", lua_localtopic);
lua_register(l, "irc_localban", lua_localban);
lua_register(l, "irc_localkick", lua_localkick);
+ lua_register(l, "irc_localumodes", lua_localumodes);
}