]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/chanserv_protect.c
A4STATS: remove E style escapes and switch to createtable for indices
[irc/quakenet/newserv.git] / chanserv / chanserv_protect.c
index b727f4196c5158a750781ee1fe6c86f25a5d8df1..d42237d28ae92cdebefdfdc7e040f80652a3ab9d 100644 (file)
@@ -2,26 +2,31 @@
  * Nick protection system for the chanserv
  */
 
+#include <stdio.h>
 #include "chanserv.h"
 #include "../core/schedule.h"
 #include "../localuser/localuser.h"
+#include "../lib/irc_string.h"
+#include "../lib/version.h"
 
+MODULE_VERSION(QVERSION)
 
 #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);
   
-  chanservaddcommand("claimnick", QCMD_HELPER, 0, csp_doclaimnick, "Reclaims your nickname if it has been stolen.","");
+  chanservaddcommand("claimnick", QCMD_STAFF, 0, csp_doclaimnick, "Reclaims your nickname if it has been stolen.","");
 }
 
 void _fini() {
@@ -29,7 +34,7 @@ void _fini() {
   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);
@@ -48,9 +53,15 @@ void _fini() {
       }
 }
 
+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;
+  char userhostbuf[USERLEN+HOSTLEN+2];
 
   /* Check that it's a protected nick */
   if (!(rup=findreguserbynick(np->nick)) || !UIsProtect(rup))
@@ -70,6 +81,12 @@ void csp_handlenick(int hooknum, void *arg) {
     rup->stealcount=0;
     return;
   }
+  
+  if (rup->lastuserhost) {
+    sprintf(userhostbuf,"%s@%s",np->ident,np->host->name->content);
+    if (!ircd_strcmp(userhostbuf, rup->lastuserhost->content))
+      return;
+  }
 
   if (IsOper(np) || homeserver(np->numeric)==mylongnum)
     return;