]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_nicklock.cpp
All commands now return results CMD_FAILURE or CMD_SUCCESS
[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
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
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         CmdResult 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 CMD_FAILURE;
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 CMD_FAILURE;
63                                 }
64                                 source->Extend("nick_locked", "ON");
65
66                                 return CMD_SUCCESS;
67                         }
68
69                         return CMD_FAILURE;
70                 }
71
72                 return CMD_FAILURE;
73         }
74 };
75
76 class cmd_nickunlock : public command_t
77 {
78  public:
79  cmd_nickunlock (InspIRCd* Instance) : command_t(Instance,"NICKUNLOCK", 'o', 1)
80         {
81                 this->source = "m_nickunlock.so";
82                 syntax = "<locked-nick>";
83         }
84
85         CmdResult Handle (const char** parameters, int pcnt, userrec *user)
86         {
87                 userrec* source = ServerInstance->FindNick(parameters[0]);
88                 if (source)
89                 {
90                         source->Shrink("nick_locked");
91                         user->WriteServ("945 %s %s :Nickname now unlocked.",user->nick,source->nick);
92                         ServerInstance->WriteOpers(std::string(user->nick)+" used NICKUNLOCK on "+parameters[0]);
93                         return CMD_SUCCESS;
94                 }
95
96                 return CMD_FAILURE;
97         }
98 };
99
100
101 class ModuleNickLock : public Module
102 {
103         cmd_nicklock*   cmd1;
104         cmd_nickunlock* cmd2;
105         char* n;
106  public:
107         ModuleNickLock(InspIRCd* Me)
108                 : Module::Module(Me)
109         {
110                 
111                 cmd1 = new cmd_nicklock(ServerInstance);
112                 cmd2 = new cmd_nickunlock(ServerInstance);
113                 ServerInstance->AddCommand(cmd1);
114                 ServerInstance->AddCommand(cmd2);
115         }
116         
117         virtual ~ModuleNickLock()
118         {
119         }
120         
121         virtual Version GetVersion()
122         {
123                 return Version(1,0,0,1,VF_VENDOR);
124         }
125
126         void Implements(char* List)
127         {
128                 List[I_OnUserPreNick] = List[I_OnUserQuit] = List[I_OnCleanup] = 1;
129         }
130
131         virtual int OnUserPreNick(userrec* user, const std::string &newnick)
132         {
133                 if (user->GetExt("nick_locked", n))
134                 {
135                         user->WriteServ("447 %s :You cannot change your nickname (your nick is locked)",user->nick);
136                         return 1;
137                 }
138                 return 0;
139         }
140
141         virtual void OnUserQuit(userrec* user, const std::string &reason)
142         {
143                 user->Shrink("nick_locked");
144         }
145
146         virtual void OnCleanup(int target_type, void* item)
147         {
148                 if(target_type == TYPE_USER)
149                 {
150                         userrec* user = (userrec*)item;
151                         user->Shrink("nick_locked");
152                 }
153         }
154 };
155
156 // stuff down here is the module-factory stuff. For basic modules you can ignore this.
157
158 class ModuleNickLockFactory : public ModuleFactory
159 {
160  public:
161         ModuleNickLockFactory()
162         {
163         }
164         
165         ~ModuleNickLockFactory()
166         {
167         }
168         
169         virtual Module * CreateModule(InspIRCd* Me)
170         {
171                 return new ModuleNickLock(Me);
172         }
173         
174 };
175
176
177 extern "C" void * init_module( void )
178 {
179         return new ModuleNickLockFactory;
180 }
181