// 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)
{
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();
ServerInstance->Config->CaseMapping = origcasemapname;
national_case_insensitive_map = origcasemap;
+ CheckDuplicateNick();
CheckRehash(casemap);
ServerInstance->ISupport.Build();
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!");
lower, lower, upper, upper);
}
+ charset = codepagetag->getString("charset");
std::swap(allowedchars, newallowedchars);
std::swap(allowedfrontchars, newallowedfrontchars);
std::swap(casemap, newcasemap);
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;