#define PROTECTTIME 60 /* How long you have to renick if you encroach.. */
void csp_handlenick(int hooknum, void *arg);
+void csp_handlerename(int hooknum, void *arg);
void csp_freenick(int hooknum, void *arg);
void csp_timerfunc (void *arg);
int csp_doclaimnick(void *source, int cargc, char **cargv);
void _init() {
registerhook(HOOK_NICK_NEWNICK, csp_handlenick);
- registerhook(HOOK_NICK_RENAME, csp_handlenick);
+ registerhook(HOOK_NICK_RENAME, csp_handlerename);
registerhook(HOOK_NICK_NEWNICK, csp_freenick);
registerhook(HOOK_NICK_ACCOUNT, csp_freenick);
int i;
deregisterhook(HOOK_NICK_NEWNICK, csp_handlenick);
- deregisterhook(HOOK_NICK_RENAME, csp_handlenick);
+ deregisterhook(HOOK_NICK_RENAME, csp_handlerename);
deregisterhook(HOOK_NICK_NEWNICK, csp_freenick);
deregisterhook(HOOK_NICK_ACCOUNT, csp_freenick);
}
}
+void csp_handlerename(int hooknum, void *arg) {
+ void **harg = (void **)arg;
+ csp_handlenick(hooknum, harg[0]);
+}
+
void csp_handlenick(int hooknum, void *arg) {
nick *np=arg;
reguser *rup;
#define HOOK_SERVER_LINKED 204 /* Argument is number of server */
#define HOOK_NICK_NEWNICK 300 /* Argument is nick* */
-#define HOOK_NICK_RENAME 301 /* Argument is nick* */
+#define HOOK_NICK_RENAME 301 /* Argument is void*[2] (nick *, oldnick) */
#define HOOK_NICK_LOSTNICK 302 /* Argument is nick* */
#define HOOK_NICK_WHOISCHANNELS 303 /* Argument is nick*[2] (sender, target) */
#define HOOK_NICK_ACCOUNT 304 /* Argument is nick* */
nick *np2;
char ipbuf[25];
time_t timestamp=getnettime();
-
+ void *harg[2];
+ char oldnick[NICKLEN+1];
+
if (!np)
return -1;
if (homeserver(np->numeric)!=mylongnum)
return -1;
+ strncpy(oldnick,np->nick,NICKLEN);
+ oldnick[NICKLEN]='\0';
+ harg[0]=(void *)np;
+ harg[1]=(void *)oldnick;
+
if ((np2=getnickbynick(newnick))) {
if (np2==np) {
/* Case only name change */
strncpy(np->nick,newnick,NICKLEN);
np->nick[NICKLEN]='\0';
irc_send("%s N %s %jd",iptobase64(ipbuf, &(np->p_ipaddr), sizeof(ipbuf), 1),np->nick,(intmax_t)np->timestamp);
- triggerhook(HOOK_NICK_RENAME,np);
+ triggerhook(HOOK_NICK_RENAME,harg);
return 0;
} else {
/* Kill other user and drop through */
np->nick[NICKLEN]='\0';
addnicktohash(np);
irc_send("%s N %s %jd",longtonumeric(np->numeric,5),np->nick,(intmax_t)np->timestamp);
- triggerhook(HOOK_NICK_RENAME,np);
+ triggerhook(HOOK_NICK_RENAME,harg);
return 0;
}
--- /dev/null
+require("lib/scheduler")
+
+Memcache = class(function(obj, ip, port, handler)
+ obj.ip = ip
+ obj.port = port
+ obj.handler = handler
+ obj._state = 0
+ obj._sched = Scheduler()
+ obj._connect(obj)
+end)
+
+function Memcache:put(key, value)
+ if self._state ~= 2 then
+ return false
+ end
+
+ self:_send("set", key, "0", "0", #value, "noreply")
+ self:_send(value)
+ return true
+end
+
+function Memcache:delete(key)
+ if self._state ~= 2 then
+ return false
+ end
+
+ self:_send("delete", key, "0", "noreply")
+ return true
+end
+
+function Memcache:flush_all()
+ if self._state ~= 2 then
+ return false
+ end
+
+ self:_send("flush_all", "noreply")
+ return true
+end
+
+function Memcache:_send(...)
+ local data = { ... }
+
+ data = table.concat(data, " ")
+ self:_log("send " .. data)
+ if self._state ~= 2 then
+ self:_log("send in bad state")
+ return
+ end
+
+ socket_write(self._socket, data .. "\r\n")
+end
+
+function Memcache:_event(socket, event, tag, ...)
+ self:_log("socket event: " .. event)
+ if event == "connect" then
+ self._state = 2
+ self.handler("connect")
+ elseif event == "close" then
+ self._state = 0
+ self._socket = nil
+ self.handler("disconnect")
+ self:_schedule_connect()
+ elseif event == "read" then
+ local data = ...
+ self:_log("read: " .. data:gsub("\r\n", "\\r\\n"))
+ end
+end
+
+function Memcache:_connect()
+ self:_log("connect(ip=" .. self.ip .. " port=" .. self.port .. ") state=" .. self._state)
+ if self._state ~= 0 then
+ return
+ end
+
+ self._socket = socket_tcp_connect(self.ip, self.port, function(...) self:_event(...) end, self)
+ if not self._socket then
+ self:_schedule_connect()
+ return
+ end
+ self._state = 1
+ self:_log("connect() state=" .. self._state .. " s ==" .. self._socket)
+end
+
+function Memcache:_schedule_connect()
+ self._sched:add(5, function() self:_connect() end)
+end
+
+function Memcache:_log(data)
+-- chanmsg(data)
+end
+
end
local function socket_ip_connect(fn, address, port, handler, tag)
- local connected, socket = fn(address, port, socket_handler, tag)
+ local connected, socket = fn(address, port, handler, tag)
if connected == nil then
return nil
end
socket_new(socket, handler)
if connected then
- socket_handler(socket, "connect", tag)
+ handler(socket, "connect", tag)
end
return socket
end
local function socket_ip_bind(fn, address, port, handler, tag)
- local socket = fn(address, port, socket_handler, tag)
+ local socket = fn(address, port, handler, tag)
if not socket then
return nil
end
}
void lua_onrename(int hooknum, void *arg) {
- nick *np = (void *)arg;
+ void **harg = (void **)arg;
+ nick *np = harg[0];
+ char *oldnick = harg[1];
if(!np)
return;
- lua_avpcall("irc_onrename", "l", np->numeric);
+ lua_avpcall("irc_onrename", "ls", np->numeric, oldnick);
}
void lua_onquit(int hooknum, void *arg) {
unsigned long userid;
if (cargc==2) { /* rename */
+ char oldnick[NICKLEN+1];
+ void *harg[2];
+
/* Nyklon 1017697578 */
timestamp=strtol(cargv[1],NULL,10);
np=getnickbynumericstr(sender);
Error("nick",ERR_ERROR,"Rename from non-existent sender %s",sender);
return CMD_OK;
}
+
+ strncpy(oldnick,np->nick,NICKLEN);
+ oldnick[NICKLEN]='\0';
+ harg[0]=(void *)np;
+ harg[1]=(void *)oldnick;
+
np2=getnickbynick(cargv[0]);
if (np==np2) {
/* The new and old nickname have the same hash, this means a rename to the same name in
}
strncpy(np->nick,cargv[0],NICKLEN);
np->nick[NICKLEN]='\0';
- triggerhook(HOOK_NICK_RENAME,np);
+ triggerhook(HOOK_NICK_RENAME,harg);
return CMD_OK;
}
if (np2!=NULL) {
strncpy(np->nick,cargv[0],NICKLEN);
np->nick[NICKLEN]='\0';
addnicktohash(np);
- triggerhook(HOOK_NICK_RENAME,np);
+ triggerhook(HOOK_NICK_RENAME,harg);
} else if (cargc>=8) { /* new nick */
/* Jupiler 2 1016645147 ~Jupiler www.iglobal.be +ir moo [FUTURE CRAP HERE] DV74O] BNBd7 :Jupiler */
timestamp=strtol(cargv[2],NULL,10);
if(started) {
deregisterhook(HOOK_NICK_NEWNICK, &rg_nick);
- deregisterhook(HOOK_NICK_RENAME, &rg_nick);
+ deregisterhook(HOOK_NICK_RENAME, &rg_rename);
deregisterhook(HOOK_NICK_LOSTNICK, &rg_lostnick);
deregistercontrolcmd("regexspew", rg_spew);
deregistercontrolcmd("regexglist", rg_glist);
registercontrolhelpcmd("regexrescan", NO_OPER, 1, &rg_rescan, "Usage: regexrescan ?-g?\nRescans the net for missed clients, optionally glining matches (used for debugging).");
registerhook(HOOK_NICK_NEWNICK, &rg_nick);
- registerhook(HOOK_NICK_RENAME, &rg_nick);
+ registerhook(HOOK_NICK_RENAME, &rg_rename);
registerhook(HOOK_NICK_LOSTNICK, &rg_lostnick);
rg_startup();
rg_dogline(gll, np, rp, hostname);
}
+void rg_rename(int hooknum, void *arg) {
+ void **harg = (void **)arg;
+ rg_nick(hooknum, harg[0]);
+}
+
void rg_nick(int hooknum, void *arg) {
nick *np = (nick *)arg;
struct rg_glinelist gll;