- std::vector<User*> purge;
- std::vector<User*>::iterator iter;
- purge.clear();
- for (iter=ServerInstance->Users->local_users.begin();iter!=ServerInstance->Users->local_users.end();++iter)
- {
- if (!ServerInstance->IsNick((*iter)->nick.c_str(), ServerInstance->Config->Limits.NickMax))
- purge.push_back(*iter);
- }
- for (iter=purge.begin();iter!=purge.end();++iter)
- {
- ServerInstance->Users->QuitUser((*iter), message);
- }
- }
- virtual ~ModuleNationalChars()
+ // The OnGarbageCollect() method in m_watch rebuilds the hashmap used by it
+ Module* mod = ServerInstance->Modules->Find("m_watch.so");
+ if (mod)
+ mod->OnGarbageCollect();
+ }
+
+ public:
+ ModuleNationalChars()
+ : rememberer(ServerInstance->IsNick), lowermap_rememberer(national_case_insensitive_map)
+ {
+ memcpy(prev_map, national_case_insensitive_map, sizeof(prev_map));
+ }
+
+ void init() CXX11_OVERRIDE
+ {
+ memcpy(m_lower, rfc_case_insensitive_map, 256);
+ national_case_insensitive_map = m_lower;
+
+ ServerInstance->IsNick = &myhandler;
+ }
+
+ void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
+ {
+ tokens["CASEMAPPING"] = casemapping;
+ }
+
+ void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
+ {
+ ConfigTag* tag = ServerInstance->Config->ConfValue("nationalchars");
+ charset = tag->getString("file");
+ casemapping = tag->getString("casemapping", charset);
+ if(charset[0] != '/')
+ charset.insert(0, "../locales/");
+ unsigned char * tables[8] = { m_additional, m_additionalMB, m_additionalUp, m_lower, m_upper, m_additionalUtf8, m_additionalUtf8range, m_additionalUtf8interval };
+ loadtables(charset, tables, 8, 5);
+ forcequit = tag->getBool("forcequit");
+ CheckForceQuit("National character set changed");
+ CheckRehash();
+ }
+
+ void CheckForceQuit(const char * message)
+ {
+ if (!forcequit)
+ return;
+
+ const UserManager::LocalList& list = ServerInstance->Users.GetLocalUsers();
+ for (UserManager::LocalList::const_iterator iter = list.begin(); iter != list.end(); ++iter)