How to detect port
#1

Hey guys, I am trying to make an Anti Advert, now this is my code:
PHP код:
IsValidIP(ip[])
{
    new 
num1, num2, num3, num4;
    
sscanf(ip, "p<.>iiii", num1, num2, num3, num4);
    if(
num1 > 255 || num2 > 255 || num3 > 255 || num4 > 255) return false;
    if(
num1 < 0 || num2 < 0 || num3 < 0 || num4 < 0) return false;
    return 
true;
} 
How can I detect the port ? (:XXXX)
Reply
#2

That's obviously going to fail, it isn't that simple as you could simply put characters in between and it won't detect an "IP". Detecting the port isn't necessary, however.

Here's a function I have, it could probably be improved, but it's just fine how it is (note that it's strict). Regex seems to be a lot slower either way.

PHP код:
// ** INCLUDES
#include <a_samp>
#include <sscanf>
// ** DEFINES
// *** FUNCTIONS
#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)
#define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
// ** MAIN
main()
{
    print(
"Loaded \"anti_advert.amx\".");
}
// ** CALLBACKS
public OnGameModeInit()
{    
    return 
1;
}
public 
OnGameModeExit()
{
    return 
1;
}
public 
OnPlayerText(playerid, text[])
{
    if(
IsAdvertisement(text))
    {
        
SendClientMessage(playerid, 0xFFFFFFFF, "{FF0000}[ERROR]: {FFFFFF}Your message contains an IP Address (strict detection).");
        return 
0;
    }
    return 
1;
}
// ** FUNCTIONS
stock IsAdvertisement(text[])
{
    new 
message[128], extract[2], element[4][4], count_1, count_2, temp, bool:number_next = false, bool:next_number = false;
    
strcpy(message, text, sizeof(message));
    for(new 
i = 0, j = strlen(message); i < j; i ++)
    {
        switch(
message[i])
        {
            case 
'0'..'9':
            {
                if(
next_number)
                {
                    continue;
                }
                
number_next = false;
                
strmid(extract, message[i], 0, 1);
                
strcat(element[count_1], extract);
                
                
count_2 ++;
                if(
count_2 == 3 || message[i + 1] == EOS)
                {
                    
strmid(extract, message[i + 1], 0, 1);
                    if(
IsNumeric(extract))
                    {
                        
element[0][0] = EOS;
                        
element[1][0] = EOS;
                        
element[2][0] = EOS;
                        
element[3][0] = EOS;
                        
count_1 = 0;
                        
count_2 = 0;
                        
next_number = true;
                        continue;
                    }
                    
temp = strval(element[count_1]);
                    if(
count_1 == 0)
                    {
                        if(
temp <= 255)
                        {
                            
count_1 ++;
                            
count_2 = 0;
                        }
                        else
                        {
                            
element[count_1][0] = EOS;
                            
count_2 = 0;
                            
next_number = true;
                        }
                    }
                    else
                    {
                        if(
temp <= 255)
                        {
                            
count_1 ++;
                            
count_2 = 0;
                        }
                        else
                        {
                            
element[0][0] = EOS;
                            
element[1][0] = EOS;
                            
element[2][0] = EOS;
                            
element[3][0] = EOS;
                            
count_1 = 0;
                            
count_2 = 0;
                            
next_number = true;
                        }
                    }
                }
                if(
count_1 == 4)
                {
                    return 
1;
                }
            }
            default:
            {
                
next_number = false;
                if(
number_next)
                {
                    continue;
                }
                if(!
isnull(element[count_1]))
                {
                    
temp = strval(element[count_1]);
                    if(
count_1 == 0)
                    {
                        if(
temp <= 255)
                        {
                            
count_1 ++;
                            
count_2 = 0;
                            
number_next = true;
                        }
                        else
                        {
                            
element[count_1][0] = EOS;
                            
count_2 = 0;
                        }
                    }
                    else
                    {
                        if(
temp <= 255)
                        {
                            
count_1 ++;
                            
count_2 = 0;
                            
number_next = true;
                        }
                        else
                        {
                            
element[0][0] = EOS;
                            
element[1][0] = EOS;
                            
element[2][0] = EOS;
                            
element[3][0] = EOS;
                            
count_1 = 0;
                            
count_2 = 0;
                        }
                    }
                    if(
count_1 == 4)
                    {
                        return 
1;
                    }
                }
            }
        }
    }
    return 
0;
}
stock IsNumeric(const string[])
{
    return !
sscanf(string, "{d}");
} 
Regex (also strict):

PHP код:
// ** INCLUDES
#include <a_samp>
#include <regex>
// ** DEFINES
// *** FUNCTIONS
#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)
// ** MAIN
main()
{
    print(
"Loaded \"anti_advert_regex.amx\".");
}
// ** CALLBACKS
public OnGameModeInit()
{    
    return 
1;
}
public 
OnGameModeExit()
{
    return 
1;
}
public 
OnPlayerText(playerid, text[])
{
    if(
IsAdvertisement(text))
    {
        
SendClientMessage(playerid, 0xFFFFFFFF, "{FF0000}[ERROR]: {FFFFFF}Your message contains an IP Address (strict detection).");
        return 
0;
    }
    return 
1;
}
// ** FUNCTIONS
stock IsAdvertisement(text[])
{
    new 
message[128], build, expression[] = "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.+){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)", start, end;
    
strcpy(message, text, sizeof(message));
    for(new 
i = 0, j = strlen(message); i < j; i ++)
    {
        switch(
message[i])
        {
            case 
'0'..'9':
            {
                continue;
            }
            case 
'.':
            {
                continue;
            }
            default:
            {
                
strdel(message, i, i + 1);
                
strins(message, ".", i);
            }
        }
    }
    
build = regex_exbuild(expression);
    
regex_exmatch(message, build);
    
regex_exsearch(message, build, start, end);
    if(
start >= 0)
    {
        return 
1;
    }
    return 
0;
} 
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)