1 /* +------------------------------------+
\r * | Inspire Internet Relay Chat Daemon |
\r * +------------------------------------+
\r *
\r * InspIRCd: (C) 2002-2007 InspIRCd Development Team
\r * See: http://www.inspircd.org/wiki/index.php/Credits
\r *
\r * This program is free but copyrighted software; see
\r * the file COPYING for details.
\r *
\r * ---------------------------------------------------
\r */
\r\r#include "inspircd.h"
\r#include "users.h"
\r#include "channels.h"
\r#include "modules.h"
\r\r/* $ModDesc: Provides masking of user hostnames in a different way to m_cloaking */
\r\r/** Holds information on a host set by m_hostchange
\r */
\rclass Host : public classbase
\r{
\r public:
\r std::string action;
\r std::string newhost;
\r};
\r\rtypedef std::map<std::string,Host*> hostchanges_t;
\r\rclass ModuleHostChange : public Module
\r{
\r private:
\r hostchanges_t hostchanges;
\r std::string MySuffix;
\r std::string MyPrefix;
\r std::string MySeparator;
\r \r public:
\r ModuleHostChange(InspIRCd* Me)
\r : Module(Me)
\r {
\r OnRehash(NULL,"");
\r }
\r \r virtual ~ModuleHostChange()
\r {
\r for (hostchanges_t::iterator i = hostchanges.begin(); i != hostchanges.end(); i++)
\r {
\r DELETE(i->second);
\r }
\r hostchanges.clear();
\r }
\r\r Priority Prioritize()
\r {
\r return (Priority)ServerInstance->PriorityAfter("m_cloaking.so");
\r }
\r\r void Implements(char* List)
\r {
\r List[I_OnRehash] = List[I_OnUserConnect] = 1;
\r }
\r\r virtual void OnRehash(userrec* user, const std::string ¶meter)
\r {
\r ConfigReader Conf(ServerInstance);
\r MySuffix = Conf.ReadValue("host","suffix",0);
\r MyPrefix = Conf.ReadValue("host","prefix","",0);
\r MySeparator = Conf.ReadValue("host","separator",".",0);
\r for (hostchanges_t::iterator i = hostchanges.begin(); i != hostchanges.end(); i++)
\r {
\r DELETE(i->second);
\r }
\r hostchanges.clear();
\r for (int index = 0; index < Conf.Enumerate("hostchange"); index++)
\r {
\r std::string mask = Conf.ReadValue("hostchange","mask",index);
\r std::string action = Conf.ReadValue("hostchange","action",index);
\r std::string newhost = Conf.ReadValue("hostchange","value",index);
\r Host* x = new Host;
\r x->action = action;
\r x->newhost = newhost;
\r hostchanges[mask] = x;
\r }
\r }
\r \r virtual Version GetVersion()
\r {
\r // returns the version number of the module to be
\r // listed in /MODULES
\r return Version(1,1,0,1,VF_VENDOR,API_VERSION);
\r }
\r \r virtual void OnUserConnect(userrec* user)
\r {
\r for (hostchanges_t::iterator i = hostchanges.begin(); i != hostchanges.end(); i++)
\r {
\r if (ServerInstance->MatchText(std::string(user->ident)+"@"+std::string(user->host),i->first))
\r {
\r Host* h = (Host*)i->second;
\r // host of new user matches a hostchange tag's mask
\r std::string newhost;
\r if (h->action == "set")
\r {
\r newhost = h->newhost;
\r }
\r else if (h->action == "suffix")
\r {
\r newhost = MySuffix;
\r }
\r else if (h->action == "addnick")
\r {
\r // first take their nick and strip out non-dns, leaving just [A-Z0-9\-]
\r std::string complete;
\r std::string old = user->nick;
\r for (unsigned int j = 0; j < old.length(); j++)
\r {
\r if (((old[j] >= 'A') && (old[j] <= 'Z')) ||
\r ((old[j] >= 'a') && (old[j] <= 'z')) ||
\r ((old[j] >= '0') && (old[j] <= '9')) ||
\r (old[j] == '-'))
\r {
\r complete = complete + old[j];
\r }
\r }
\r if (complete.empty())
\r complete = "i-have-a-lame-nick";
\r \r if (!MyPrefix.empty())
\r newhost = MyPrefix + MySeparator + complete;
\r else
\r newhost = complete + MySeparator + MySuffix;
\r }
\r if (!newhost.empty())
\r {
\r user->WriteServ("NOTICE "+std::string(user->nick)+" :Setting your virtual host: " + newhost);
\r if (!user->ChangeDisplayedHost(newhost.c_str()))
\r user->WriteServ("NOTICE "+std::string(user->nick)+" :Could not set your virtual host: " + newhost);
\r return;
\r }
\r }
\r }
\r }
\r};
\r\rMODULE_INIT(ModuleHostChange)
\r