AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Plugins (https://forums.alliedmods.net/forumdisplay.php?f=108)
-   -   Uninamer (Unicode name changer) (https://forums.alliedmods.net/showthread.php?t=65455)

red! 01-08-2008 18:01

Uninamer (Unicode name changer)
 
7 Attachment(s)
This plugin checks any connected player for using character values above un_characterthreshold in their names. Everything above a un_characterthreshold of 160 is country-specific/unicode. Brackets and and the standard chars from american keyboards are below value 160 and will therefor be allowed for naming by default.

Install:

Copy the uninamer.smx plugin to your sourcemod/plugins folder and the uninamer.phrases.txt to sourcemod/translations.

Todo:

maybe I could add a ban option instead of just renaming/kicking. If somebody would be interested in additional features, post here.


CVars:

un_enable 1/0: enable/disable uninamer (default 1)
un_punishmode 1/0: 0: rename player, 1: kick player (default 0)
un_defaultname <name>: name to use for un_punishmode=0 (default "bad name")
un_characterthreshold <int>: character value of last character which will be allowed (default 160)
un_maxbadchars <int>: number of bad/unicode character that are allowed for a single name (default 2)
un_mingoodcharsequence<int>: number of good/non-unicode character that need to be in direct sequence (default 0). 0 disables this feature. keep in mind that a players with a name shorter than this constant will also fail the test and will be punished. (may be changed/configurable if needed by anybody)

Changelog:
1.2: added un_mingoodcharsequence
1.1: added a kick-option instead of renaming
1.0.2: implemented full utf-8 support
1.0.1: minor changes on debug output; fixed bug on round-end check
1.0: added cvars un_characterthreshold and un_maxbadchars; added round end checks; added check for name termination char
0.1: Initial release

Greyscale 01-10-2008 21:58

Re: Uninamer (Unicode name changer)
 
PrintToConsole(0, "") will error won't it?

Or does it just print to server console? You should look at PrintToServer()

pRED* 01-11-2008 00:29

Re: Uninamer (Unicode name changer)
 
There's no point in looping the full length of the string.

The last character of the name will be followed by a null terminator which has the integer value 0 or char value '\0'

So you can loop

Code:

while (num = nameBuf[i++])
{
                if (num>160)
                {
                        uni=true;
                }
}

or similar.

r5053 01-11-2008 03:43

Re: Uninamer (Unicode name changer)
 
God idea for a plugin :D i can't tell you how i hate it if there are players with special chars in the name, it's looking like shit in the webinterface of my TF2 stats plugin because it can't display the special chars on the webpage

red! 01-11-2008 18:37

Re: Uninamer (Unicode name changer)
 
Quote:

Originally Posted by pRED* (Post 572751)
There's no point in looping the full length of the string.

The last character of the name will be followed by a null terminator which has the integer value 0 or char value '\0'

So you can loop

Code:

while (num = nameBuf[i++])
{
        if (num>160)
        {
            uni=true;
        }
}

or similar.

thats not a real performance issue thus linear memory access is not that expensive. but i'll look for that. i am planing a next version which is somehow more advanced in its behavior which will include a check for the string terminator. this first pre-release was just something like a feasibility study.

red! 01-12-2008 20:03

Re: Uninamer (Unicode name changer)
 
updated

red! 01-13-2008 07:58

Re: Uninamer (Unicode name changer)
 
Quote:

Originally Posted by Greyscale (Post 572724)
PrintToConsole(0, "") will error won't it?

Or does it just print to server console? You should look at PrintToServer()

it's the server console. but you're right PrintToServer does the same. I'll replace this for better readability of the code.

[email protected] 04-26-2008 09:47

Re: Uninamer (Unicode name changer)
 
A Kick function had nice

Greetz
JaY

sfPlayer 04-26-2008 11:20

Re: Uninamer (Unicode name changer)
 
you are comparing individual characters in an utf-8 encoded string and not real unicode values.

I hacked something together to convert it properly, but it's untested.
PHP Code:

nameCheck(clientSlot) { 
    
decl String:nameBuf[128];
     
    if (
GetClientName(clientSlotnameBufsizeof(nameBuf))) { 
        new 
badcharcount=0;
         
        for (new 
i=0nameBuf[i]; i++) {
            
decl ucValue;
            new 
cc nameBuf[i];
            if (
cc 1<<7) {
                if (
cc 1<<6) { // 2|3|4 byte
                    
if (cc 1<<5) { // 3|4 byte
                        
if (cc 1<<4) { // 4 byte
                            
ucValue cc & (1<<1);
                            
                            for (new 
n=0n<3n++) {
                                
i++;
                                
cc nameBuf[i];
                                if ((
cc 192) == 128) {
                                    
ucValue = (ucValue<<6) | (cc & (1<<1));
                                } else {
                                    
LogError("invalid utf-8 sequence");
                                    return;
                                }
                            }
                        } else { 
// 3 byte
                            
ucValue cc & (1<<1);
                            
                            for (new 
n=0n<2n++) {
                                
i++;
                                
cc nameBuf[i];
                                if ((
cc 192) == 128) {
                                    
ucValue = (ucValue<<6) | (cc & (1<<1));
                                } else {
                                    
LogError("invalid utf-8 sequence");
                                    return;
                                }
                            }
                        }
                    } else { 
// 2 byte
                        
ucValue cc & (1<<1);
                        
                        
i++;
                        
cc nameBuf[i];
                        if ((
cc 192) == 128) {
                            
ucValue = (ucValue<<6) | (cc & (1<<1));
                        } else {
                            
LogError("invalid utf-8 sequence");
                            return;
                        }
                    }
                } else {
                    
LogError("invalid utf-8 sequence");
                    return;
                }
            } else {
                
ucValue cc;
            }
             
            if (
ucValue s_characterThreshold) { 
                
badcharcount++; 
            } 
        } 
        if (
badcharcount s_maxBadChars) {     
            
PrintToServer("[Uninamer] renaming %s (bad chars: %d>%d)"nameBufbadcharcounts_maxBadChars); 
            
LogMessage("renaming %s (bad chars: %d>%d)"nameBufbadcharcounts_maxBadChars); 
            
GetConVarString(s_defaultNamenameBuf128); 
            
ClientCommand(clientSlot"name \"%s\""nameBuf); 
        } 
    } 



red! 04-26-2008 16:49

Re: Uninamer (Unicode name changer)
 
Quote:

Originally Posted by [email protected] (Post 617110)
A Kick function had nice

Greetz
JaY

yes, could do this.

this plugin was a quick hack and deserves closer attention. A kick-feature is a reasonable option for this plugin. and revising the unicode name handling will also be of interest. unfortunately I was a bit short on time the last days ... (changed occupation, moved to a new place, and I am still fighting nature - and my 10 weeks old dog - to get the damned garden to an eligible condition)


All times are GMT -4. The time now is 14:51.

Powered by vBulletin®
Copyright ©2000 - 2019, vBulletin Solutions, Inc.