]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_codepage.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_codepage.cpp
index 4054c72c1edd7949b9ed1eb847c60332ba480ae1..f299b92fa4b7f843f6dda7b5c050984bd6c10128 100644 (file)
@@ -67,6 +67,9 @@ class ModuleCodepage
        // The IsNick handler which was set before this module was loaded.
        const TR1NS::function<bool(const std::string&)> origisnick;
 
+       // The character set used for the codepage.
+       std::string charset;
+
        template <typename T>
        void RehashHashmap(T& hashmap)
        {
@@ -76,6 +79,21 @@ class ModuleCodepage
                hashmap.swap(newhash);
        }
 
+       void CheckDuplicateNick()
+       {
+               insp::flat_set<std::string, irc::insensitive_swo> duplicates;
+               const UserManager::LocalList& list = ServerInstance->Users.GetLocalUsers();
+               for (UserManager::LocalList::const_iterator iter = list.begin(); iter != list.end(); ++iter)
+               {
+                       LocalUser* user = *iter;
+                       if (user->nick != user->uuid && !duplicates.insert(user->nick).second)
+                       {
+                               user->WriteNumeric(RPL_SAVENICK, user->uuid, "Your nickname is no longer available.");
+                               user->ChangeNick(user->uuid);
+                       }
+               }
+       }
+
        void CheckInvalidNick()
        {
                const UserManager::LocalList& list = ServerInstance->Users.GetLocalUsers();
@@ -115,6 +133,7 @@ class ModuleCodepage
 
                ServerInstance->Config->CaseMapping = origcasemapname;
                national_case_insensitive_map = origcasemap;
+               CheckDuplicateNick();
                CheckRehash(casemap);
 
                ServerInstance->ISupport.Build();
@@ -122,7 +141,9 @@ class ModuleCodepage
 
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
-               const std::string name = ServerInstance->Config->ConfValue("codepage")->getString("name");
+               ConfigTag* codepagetag = ServerInstance->Config->ConfValue("codepage");
+
+               const std::string name = codepagetag->getString("name");
                if (name.empty())
                        throw ModuleException("<codepage:name> is a required field!");
 
@@ -184,6 +205,7 @@ class ModuleCodepage
                                lower, lower, upper, upper);
                }
 
+               charset = codepagetag->getString("charset");
                std::swap(allowedchars, newallowedchars);
                std::swap(allowedfrontchars, newallowedfrontchars);
                std::swap(casemap, newcasemap);
@@ -198,6 +220,12 @@ class ModuleCodepage
                ServerInstance->ISupport.Build();
        }
 
+       void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
+       {
+               if (!charset.empty())
+                       tokens["CHARSET"] = charset;
+       }
+
        Version GetVersion() CXX11_OVERRIDE
        {
                std::stringstream linkdata;