From af3020ad8a49b25663d713863aef209a4d514291 Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 8 Apr 2005 16:51:44 +0000 Subject: Added m_nicklock module, a module which allows opers to lock a user to a nickname until they quit git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@1013 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_nicklock.cpp | 132 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/modules/m_nicklock.cpp diff --git a/src/modules/m_nicklock.cpp b/src/modules/m_nicklock.cpp new file mode 100644 index 000000000..f6a5749e4 --- /dev/null +++ b/src/modules/m_nicklock.cpp @@ -0,0 +1,132 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * Inspire is copyright (C) 2002-2004 ChatSpike-Dev. + * E-mail: + * + * + * + * Written by Craig Edwards, Craig McLure, and others. + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include +#include +#include "users.h" +#include "channels.h" +#include "modules.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) +{ + userrec* source = Srv->FindNick(std::string(parameters[0])); + if (source) + { + 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]))) + { + if (!strcasecmp(user->server,Srv->GetServerName().c_str())) + { + // 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); + } + else + { + WriteServ(user->fd,"947 %s %s :Can't lock the nickname of a non-local user",user->nick,source->nick); + } + } + } +} + +void handle_nickunlock(char **parameters, int pcnt, userrec *user) +{ + userrec* source = Srv->FindNick(std::string(parameters[0])); + if (source) + { + 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])); + } +} + + +class ModuleNickLock : public Module +{ + public: + ModuleNickLock() + { + Srv = new Server; + Srv->AddCommand("NICKLOCK",handle_nicklock,'o',2,"m_nicklock.so"); + Srv->AddCommand("NICKUNLOCK",handle_nickunlock,'o',1,"m_nicklock.so"); + } + + virtual ~ModuleNickLock() + { + } + + virtual Version GetVersion() + { + return Version(1,0,0,1,VF_VENDOR); + } + + virtual int OnUserPreNick(userrec* user, std::string newnick) + { + if (user->GetExt("nick_locked")) + { + WriteServ(user->fd,"447 %s :You cannot change your nickname (your nick is locked)",user->nick); + return 1; + } + return 0; + } + + virtual void OnUserQuit(userrec* user) + { + user->Shrink("nick_locked"); + } + +}; + +// stuff down here is the module-factory stuff. For basic modules you can ignore this. + +class ModuleNickLockFactory : public ModuleFactory +{ + public: + ModuleNickLockFactory() + { + } + + ~ModuleNickLockFactory() + { + } + + virtual Module * CreateModule() + { + return new ModuleNickLock; + } + +}; + + +extern "C" void * init_module( void ) +{ + return new ModuleNickLockFactory; +} + -- cgit v1.2.3