I have blacklist for prefixes.
Code:
admin
админ // russian translation of admin
moder
etc.
I want to check player prefix for this list with rules like
*a*d*m*i*n*, where * is any number of any сharacters
And i wrote this:
(now "[aA].*[dD].*[mM].*[iI].*[nN]" or "а.*д.*м.*и.*н" pattern)
(want "[aA].*[dD].*[mM].*[iI].*[nN]" or "[аА].*[дД].*[мМ].*[иИ].*[нН]" pattern)
PHP Code:
bool VerifyPrefix(const char[] prefix)
{
bool result = true;
char filepath[PLATFORM_MAX_PATH];
BuildPath(Path_SM, filepath, sizeof(filepath), "data/chatcolors_blacklist.txt");
File file = OpenFile(filepath, "r");
if (file) {
char buffer[64], pattern[128], lower, upper;
int i, off, size;
while (!file.EndOfFile() && file.ReadLine(buffer, sizeof(buffer))) {
TrimString(buffer);
// Build pattern
for (i = 0, off = 0; buffer[i]; i++) {
if (i != 0)
off += Format(pattern[off], sizeof(pattern) - off, ".*");
if ((size = GetCharBytes(buffer[i])) != 1) {
off += strcopy(pattern[off], size + 1, buffer[i]); // unsafe
i += size - 1;
}
else {
if (IsCharLower(buffer[i])) {
lower = buffer[i];
upper = CharToUpper(lower);
}
else {
upper = buffer[i];
lower = CharToLower(upper);
}
off += Format(pattern[off], sizeof(pattern) - off, "[%c%c]", lower, upper);
}
}
PrintToServer("[CC] \"%s\" pattern generated \"%s\"", buffer, pattern); // temporary debug output
if (SimpleRegexMatch(prefix, pattern, PCRE_UTF8) > 0) {
PrintToServer("[CC] \"%s\" match \"%s\"", prefix, buffer);
result = false;
break;
}
}
file.Close();
}
return result;
}
I wait for any advice or improving of code.
Also way to do lower/upper case with utf-8 chats (specifically cyrillic).