]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_nicklock.cpp
d63c7463359a3155892b51220faa8cf8cce215a0
[user/henk/code/inspircd.git] / src / modules / m_nicklock.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *     
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 using namespace std;
18
19 #include <stdio.h>
20 #include <string>
21 #include "users.h"
22 #include "channels.h"
23 #include "modules.h"
24 #include "helperfuncs.h"
25 #include "hashcomp.h"
26 #include "inspircd.h"
27
28 /* $ModDesc: Provides the NICKLOCK command, allows an oper to chage a users nick and lock them to it until they quit */
29
30 extern InspIRCd* ServerInstance;
31
32 class cmd_nicklock : public command_t
33 {
34         char* dummy;
35  public:
36  cmd_nicklock (InspIRCd* Instance) : command_t(Instance,"NICKLOCK", 'o', 2)
37         {
38                 this->source = "m_nicklock.so";
39                 syntax = "<oldnick> <newnick>";
40         }
41
42         void Handle(const char** parameters, int pcnt, userrec *user)
43         {
44                 userrec* source = ServerInstance->FindNick(parameters[0]);
45                 irc::string server;
46                 irc::string me;
47
48                 if (source)
49                 {
50                         if (source->GetExt("nick_locked", dummy))
51                         {
52                                 user->WriteServ("946 %s %s :This user's nickname is already locked.",user->nick,source->nick);
53                                 return;
54                         }
55                         if (ServerInstance->IsNick(parameters[1]))
56                         {
57                                 // give them a lock flag
58                                 ServerInstance->WriteOpers(std::string(user->nick)+" used NICKLOCK to change and hold "+parameters[0]+" to "+parameters[1]);
59                                 if (!source->ForceNickChange(parameters[1]))
60                                 {
61                                         userrec::QuitUser(ServerInstance, source, "Nickname collision");
62                                         return;
63                                 }
64                                 source->Extend("nick_locked", "ON");
65                         }
66                 }
67         }
68 };
69
70 class cmd_nickunlock : public command_t
71 {
72  public:
73  cmd_nickunlock (InspIRCd* Instance) : command_t(Instance,"NICKUNLOCK", 'o', 1)
74         {
75                 this->source = "m_nickunlock.so";
76                 syntax = "<locked-nick>";
77         }
78
79         void Handle (const char** parameters, int pcnt, userrec *user)
80         {
81                 userrec* source = ServerInstance->FindNick(parameters[0]);
82                 if (source)
83                 {
84                         source->Shrink("nick_locked");
85                         user->WriteServ("945 %s %s :Nickname now unlocked.",user->nick,source->nick);
86                         ServerInstance->WriteOpers(std::string(user->nick)+" used NICKUNLOCK on "+parameters[0]);
87                 }
88         }
89 };
90
91
92 class ModuleNickLock : public Module
93 {
94         cmd_nicklock*   cmd1;
95         cmd_nickunlock* cmd2;
96         char* n;
97  public:
98         ModuleNickLock(InspIRCd* Me)
99                 : Module::Module(Me)
100         {
101                 
102                 cmd1 = new cmd_nicklock(ServerInstance);
103                 cmd2 = new cmd_nickunlock(ServerInstance);
104                 ServerInstance->AddCommand(cmd1);
105                 ServerInstance->AddCommand(cmd2);
106         }
107         
108         virtual ~ModuleNickLock()
109         {
110         }
111         
112         virtual Version GetVersion()
113         {
114                 return Version(1,0,0,1,VF_VENDOR);
115         }
116
117         void Implements(char* List)
118         {
119                 List[I_OnUserPreNick] = List[I_OnUserQuit] = List[I_OnCleanup] = 1;
120         }
121
122         virtual int OnUserPreNick(userrec* user, const std::string &newnick)
123         {
124                 if (user->GetExt("nick_locked", n))
125                 {
126                         user->WriteServ("447 %s :You cannot change your nickname (your nick is locked)",user->nick);
127                         return 1;
128                 }
129                 return 0;
130         }
131
132         virtual void OnUserQuit(userrec* user, const std::string &reason)
133         {
134                 user->Shrink("nick_locked");
135         }
136
137         virtual void OnCleanup(int target_type, void* item)
138         {
139                 if(target_type == TYPE_USER)
140                 {
141                         userrec* user = (userrec*)item;
142                         user->Shrink("nick_locked");
143                 }
144         }
145 };
146
147 // stuff down here is the module-factory stuff. For basic modules you can ignore this.
148
149 class ModuleNickLockFactory : public ModuleFactory
150 {
151  public:
152         ModuleNickLockFactory()
153         {
154         }
155         
156         ~ModuleNickLockFactory()
157         {
158         }
159         
160         virtual Module * CreateModule(InspIRCd* Me)
161         {
162                 return new ModuleNickLock(Me);
163         }
164         
165 };
166
167
168 extern "C" void * init_module( void )
169 {
170         return new ModuleNickLockFactory;
171 }
172