How to detect port
#1

Hey guys, I am trying to make an Anti Advert, now this is my code:
PHP код:
IsValidIP(ip[])
{
    new 
num1num2num3num4;
    
sscanf(ip"p<.>iiii"num1num2num3num4);
    if(
num1 255 || num2 255 || num3 255 || num4 255) return false;
    if(
num1 || num2 || num3 || 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(playeridtext[])
{
    if(
IsAdvertisement(text))
    {
        
SendClientMessage(playerid0xFFFFFFFF"{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_1count_2tempbool:number_next falsebool:next_number false;
    
strcpy(messagetextsizeof(message));
    for(new 
0strlen(message); j++)
    {
        switch(
message[i])
        {
            case 
'0'..'9':
            {
                if(
next_number)
                {
                    continue;
                }
                
number_next false;
                
strmid(extractmessage[i], 01);
                
strcat(element[count_1], extract);
                
                
count_2 ++;
                if(
count_2 == || message[1] == EOS)
                {
                    
strmid(extractmessage[1], 01);
                    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(playeridtext[])
{
    if(
IsAdvertisement(text))
    {
        
SendClientMessage(playerid0xFFFFFFFF"{FF0000}[ERROR]: {FFFFFF}Your message contains an IP Address (strict detection).");
        return 
0;
    }
    return 
1;
}
// ** FUNCTIONS
stock IsAdvertisement(text[])
{
    new 
message[128], buildexpression[] = "(?:(?: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]?)"startend;
    
strcpy(messagetextsizeof(message));
    for(new 
0strlen(message); j++)
    {
        switch(
message[i])
        {
            case 
'0'..'9':
            {
                continue;
            }
            case 
'.':
            {
                continue;
            }
            default:
            {
                
strdel(messagei1);
                
strins(message"."i);
            }
        }
    }
    
build regex_exbuild(expression);
    
regex_exmatch(messagebuild);
    
regex_exsearch(messagebuildstartend);
    if(
start >= 0)
    {
        return 
1;
    }
    return 
0;

Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)