]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_nicklock.cpp
None of the modules use an extern InspIRCd* any more
[user/henk/code/inspircd.git] / src / modules / m_nicklock.cpp
index e31fed67596e0fdf9bf8748e0c01d8303b9080ae..16f6aafa62536ab90f57168cc589f69e3af96e9a 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
  *                       E-mail:
  *                <brain@chatspike.net>
  *               <Craig@chatspike.net>
@@ -23,65 +23,86 @@ using namespace std;
 #include "modules.h"
 #include "helperfuncs.h"
 #include "hashcomp.h"
+#include "inspircd.h"
 
 /* $ModDesc: Provides the NICKLOCK command, allows an oper to chage a users nick and lock them to it until they quit */
 
-Server *Srv;
 
-char* dummy = "ON";
-        
-void handle_nicklock(char **parameters, int pcnt, userrec *user)
+
+class cmd_nicklock : public command_t
 {
-       userrec* source = Srv->FindNick(std::string(parameters[0]));
-       if (source)
+       char* dummy;
+ public:
+ cmd_nicklock (InspIRCd* Instance) : command_t(Instance,"NICKLOCK", 'o', 2)
        {
-               if (source->GetExt("nick_locked"))
-               {
-                       WriteServ(user->fd,"946 %s %s :This user's nickname is already locked.",user->nick,source->nick);
-                       return;
-               }
-               if (Srv->IsNick(std::string(parameters[1])))
+               this->source = "m_nicklock.so";
+               syntax = "<oldnick> <newnick>";
+       }
+
+       void Handle(const char** parameters, int pcnt, userrec *user)
+       {
+               userrec* source = ServerInstance->FindNick(parameters[0]);
+               irc::string server;
+               irc::string me;
+
+               if (source)
                {
-                       irc::string server = user->server;
-                       irc::string me = Srv->GetServerName().c_str();
-                       if (server == me)
+                       if (source->GetExt("nick_locked", dummy))
                        {
-                               // give them a lock flag
-                               Srv->SendOpers(std::string(user->nick)+" used NICKLOCK to change and hold "+std::string(parameters[0])+" to "+parameters[1]);
-                               Srv->ChangeUserNick(source,std::string(parameters[1]));
-                               // only attempt to set their lockflag after we know the change succeeded
-                               userrec* s2 = Srv->FindNick(std::string(parameters[1]));
-                               if (s2)
-                                       s2->Extend("nick_locked",dummy);
+                               user->WriteServ("946 %s %s :This user's nickname is already locked.",user->nick,source->nick);
+                               return;
                        }
-                       else
+                       if (ServerInstance->IsNick(parameters[1]))
                        {
-                               WriteServ(user->fd,"947 %s %s :Can't lock the nickname of a non-local user",user->nick,source->nick);
+                               // give them a lock flag
+                               ServerInstance->WriteOpers(std::string(user->nick)+" used NICKLOCK to change and hold "+parameters[0]+" to "+parameters[1]);
+                               if (!source->ForceNickChange(parameters[1]))
+                               {
+                                       userrec::QuitUser(ServerInstance, source, "Nickname collision");
+                                       return;
+                               }
+                               source->Extend("nick_locked", "ON");
                        }
                }
        }
-}
+};
 
-void handle_nickunlock(char **parameters, int pcnt, userrec *user)
+class cmd_nickunlock : public command_t
 {
-       userrec* source = Srv->FindNick(std::string(parameters[0]));
      if (source)
+ public:
cmd_nickunlock (InspIRCd* Instance) : command_t(Instance,"NICKUNLOCK", 'o', 1)
        {
-               source->Shrink("nick_locked");
-               WriteServ(user->fd,"945 %s %s :Nickname now unlocked.",user->nick,source->nick);
-               Srv->SendOpers(std::string(user->nick)+" used NICKUNLOCK on "+std::string(parameters[0]));
+               this->source = "m_nickunlock.so";
+               syntax = "<locked-nick>";
        }
-}
+
+       void Handle (const char** parameters, int pcnt, userrec *user)
+       {
+               userrec* source = ServerInstance->FindNick(parameters[0]);
+               if (source)
+               {
+                       source->Shrink("nick_locked");
+                       user->WriteServ("945 %s %s :Nickname now unlocked.",user->nick,source->nick);
+                       ServerInstance->WriteOpers(std::string(user->nick)+" used NICKUNLOCK on "+parameters[0]);
+               }
+       }
+};
 
 
 class ModuleNickLock : public Module
 {
+       cmd_nicklock*   cmd1;
+       cmd_nickunlock* cmd2;
+       char* n;
  public:
-       ModuleNickLock()
+       ModuleNickLock(InspIRCd* Me)
+               : Module::Module(Me)
        {
-               Srv = new Server;
-               Srv->AddCommand("NICKLOCK",handle_nicklock,'o',2,"m_nicklock.so");
-               Srv->AddCommand("NICKUNLOCK",handle_nickunlock,'o',1,"m_nicklock.so");
+               
+               cmd1 = new cmd_nicklock(ServerInstance);
+               cmd2 = new cmd_nickunlock(ServerInstance);
+               ServerInstance->AddCommand(cmd1);
+               ServerInstance->AddCommand(cmd2);
        }
        
        virtual ~ModuleNickLock()
@@ -93,21 +114,34 @@ class ModuleNickLock : public Module
                return Version(1,0,0,1,VF_VENDOR);
        }
 
-       virtual int OnUserPreNick(userrec* user, std::string newnick)
+       void Implements(char* List)
+       {
+               List[I_OnUserPreNick] = List[I_OnUserQuit] = List[I_OnCleanup] = 1;
+       }
+
+       virtual int OnUserPreNick(userrec* user, const std::string &newnick)
        {
-               if (user->GetExt("nick_locked"))
+               if (user->GetExt("nick_locked", n))
                {
-                       WriteServ(user->fd,"447 %s :You cannot change your nickname (your nick is locked)",user->nick);
+                       user->WriteServ("447 %s :You cannot change your nickname (your nick is locked)",user->nick);
                        return 1;
                }
                return 0;
        }
 
-        virtual void OnUserQuit(userrec* user, std::string reason)
-        {
-                user->Shrink("nick_locked");
-        }
+       virtual void OnUserQuit(userrec* user, const std::string &reason)
+       {
+               user->Shrink("nick_locked");
+       }
 
+       virtual void OnCleanup(int target_type, void* item)
+       {
+               if(target_type == TYPE_USER)
+               {
+                       userrec* user = (userrec*)item;
+                       user->Shrink("nick_locked");
+               }
+       }
 };
 
 // stuff down here is the module-factory stuff. For basic modules you can ignore this.
@@ -123,9 +157,9 @@ class ModuleNickLockFactory : public ModuleFactory
        {
        }
        
-       virtual Module * CreateModule()
+       virtual Module * CreateModule(InspIRCd* Me)
        {
-               return new ModuleNickLock;
+               return new ModuleNickLock(Me);
        }
        
 };