]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_nicklock.cpp
In the grand tradition of huge fucking commits:
[user/henk/code/inspircd.git] / src / modules / m_nicklock.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
6  * See: http://www.inspircd.org/wiki/index.php/Credits
7  *
8  * This program is free but copyrighted software; see
9  *            the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 #include "inspircd.h"
15
16 /* $ModDesc: Provides the NICKLOCK command, allows an oper to chage a users nick and lock them to it until they quit */
17
18 /** Handle /NICKLOCK
19  */
20 class cmd_nicklock : public Command
21 {
22         char* dummy;
23  public:
24         cmd_nicklock (InspIRCd* Instance) : Command(Instance,"NICKLOCK", 'o', 2)
25         {
26                 this->source = "m_nicklock.so";
27                 syntax = "<oldnick> <newnick>";
28                 TRANSLATE3(TR_NICK, TR_TEXT, TR_END);
29         }
30
31         CmdResult Handle(const char** parameters, int pcnt, User *user)
32         {
33                 User* source = ServerInstance->FindNick(parameters[0]);
34                 irc::string server;
35                 irc::string me;
36
37                 // check user exists
38                 if (!source)
39                 {
40                         return CMD_FAILURE;
41                 }
42
43                 // check if user is locked
44                 if (source->GetExt("nick_locked", dummy))
45                 {
46                         user->WriteServ("946 %s %s :This user's nickname is already locked.",user->nick,source->nick);
47                         return CMD_FAILURE;
48                 }
49
50                 // check nick is valid
51                 if (!ServerInstance->IsNick(parameters[1]))
52                 {
53                         return CMD_FAILURE;
54                 }
55
56                 // let others know
57                 ServerInstance->WriteOpers(std::string(user->nick)+" used NICKLOCK to change and hold "+parameters[0]+" to "+parameters[1]);
58
59                 if (!source->ForceNickChange(parameters[1]))
60                 {
61                         // ugh, nickchange failed for some reason -- possibly existing nick?
62                         User::QuitUser(ServerInstance, source, "Nickname collision");
63                 }
64
65                 // give them a lock flag
66                 source->Extend("nick_locked", "ON");
67
68                 /* route */
69                 return CMD_SUCCESS;
70         }
71 };
72
73 /** Handle /NICKUNLOCK
74  */
75 class cmd_nickunlock : public Command
76 {
77  public:
78         cmd_nickunlock (InspIRCd* Instance) : Command(Instance,"NICKUNLOCK", 'o', 1)
79         {
80                 this->source = "m_nicklock.so";
81                 syntax = "<locked-nick>";
82         }
83
84         CmdResult Handle (const char** parameters, int pcnt, User *user)
85         {
86                 User* source = ServerInstance->FindNick(parameters[0]);
87                 if (source)
88                 {
89                         source->Shrink("nick_locked");
90                         user->WriteServ("945 %s %s :Nickname now unlocked.",user->nick,source->nick);
91                         ServerInstance->WriteOpers(std::string(user->nick)+" used NICKUNLOCK on "+parameters[0]);
92                         return CMD_SUCCESS;
93                 }
94
95                 return CMD_FAILURE;
96         }
97 };
98
99
100 class ModuleNickLock : public Module
101 {
102         cmd_nicklock*   cmd1;
103         cmd_nickunlock* cmd2;
104         char* n;
105  public:
106         ModuleNickLock(InspIRCd* Me)
107                 : Module(Me)
108         {
109                 
110                 cmd1 = new cmd_nicklock(ServerInstance);
111                 cmd2 = new cmd_nickunlock(ServerInstance);
112                 ServerInstance->AddCommand(cmd1);
113                 ServerInstance->AddCommand(cmd2);
114         }
115         
116         virtual ~ModuleNickLock()
117         {
118         }
119         
120         virtual Version GetVersion()
121         {
122                 return Version(1, 1, 0, 1, VF_COMMON | VF_VENDOR, API_VERSION);
123         }
124
125         void Implements(char* List)
126         {
127                 List[I_OnUserPreNick] = List[I_OnUserQuit] = List[I_OnCleanup] = 1;
128         }
129
130         virtual int OnUserPreNick(User* user, const std::string &newnick)
131         {
132                 if (isdigit(newnick[0])) /* allow a switch to a UID */
133                         return 0;
134
135                 if (user->GetExt("nick_locked", n))
136                 {
137                         user->WriteServ("447 %s :You cannot change your nickname (your nick is locked)",user->nick);
138                         return 1;
139                 }
140                 return 0;
141         }
142
143         virtual void OnUserQuit(User* user, const std::string &reason, const std::string &oper_message)
144         {
145                 user->Shrink("nick_locked");
146         }
147
148         virtual void OnCleanup(int target_type, void* item)
149         {
150                 if(target_type == TYPE_USER)
151                 {
152                         User* user = (User*)item;
153                         user->Shrink("nick_locked");
154                 }
155         }
156 };
157
158 MODULE_INIT(ModuleNickLock)