// 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();
{
LocalUser* user = *iter;
if (user->nick != user->uuid && !ServerInstance->IsNick(user->nick))
+ {
+ user->WriteNumeric(RPL_SAVENICK, user->uuid, "Your nickname is no longer valid.");
user->ChangeNick(user->uuid);
+ }
}
}
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!");
unsigned char begin = tag->getUInt("begin", tag->getUInt("index", 0), 1, UCHAR_MAX);
if (!begin)
throw ModuleException("<cpchars> tag without index or begin specified at " + tag->getTagLocation());
-
+
unsigned char end = tag->getUInt("end", begin, 1, UCHAR_MAX);
if (begin > end)
throw ModuleException("<cpchars:begin> must be lower than <cpchars:end> at " + tag->getTagLocation());
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;
if (casemap[i] != i)
linkdata << static_cast<unsigned char>(i) << casemap[i] << ',';
- return Version("Provides support for custom 8-bit codepages", VF_COMMON | VF_VENDOR, linkdata.str());
+ return Version("Allows the server administrator to define what characters are allowed in nicknames and how characters should be compared in a case insensitive way.", VF_COMMON | VF_VENDOR, linkdata.str());
}
};
MODULE_INIT(ModuleCodepage)