• 0
Sign in to follow this  
Followers 0
coolgamer

[закрыто] Проблема с командой

Question

Кароче я сделал команду ipinfo (получение инфы о IP - адресе) переделав немного инклуд playergeolocation (чтобы показывало инфу о регистрационном айпи а не текущем)

Когда ввожу команду, оно показывает диалог без инфы, а когда пишу команду второй раз, то уже показывает инфу.

и еще в консоле появляется вот это: [12:32:08] sscanf warning: String buffer overflow.

Помогите пэжэ

//
#define GEO_MAX_IP_LENGTH               (16 + 1)
#define GEO_MAX_COUNTRY_CODE_LENGTH     (4 + 1)
#define GEO_MAX_COUNTRY_NAME_LENGTH     (32 + 1)
#define GEO_MAX_REGION_CODE_LENGTH      (6 + 1)
#define GEO_MAX_REGION_NAME_LENGTH      (32 + 1)
#define GEO_MAX_CITY_NAME_LENGTH        (32 + 1)
#define GEO_MAX_DISTRICT_NAME_LENGTH    (64 + 1)
#define GEO_MAX_LAT_LON_LENGTH          (12 + 1)
#define GEO_MAX_TIMEZONE_NAME_LENGTH    (64 + 1)
#define GEO_MAX_PROVIDER_NAME_LENGTH    (32 + 1)
#define GEO_MAX_MOBILE_STATUS_LENGTH    (5 + 1)
#define GEO_MAX_PROXY_LENGTH            (5 + 1)
enum e_PLAYER_GEO_INFO
{
    player_country_code[GEO_MAX_COUNTRY_CODE_LENGTH],
    player_country[GEO_MAX_COUNTRY_NAME_LENGTH],
    player_region_code[GEO_MAX_REGION_CODE_LENGTH],
    player_region[GEO_MAX_REGION_NAME_LENGTH],
    player_district[GEO_MAX_DISTRICT_NAME_LENGTH],
    player_city[GEO_MAX_CITY_NAME_LENGTH],
    player_lat[GEO_MAX_LAT_LON_LENGTH],
    player_lon[GEO_MAX_LAT_LON_LENGTH],
    player_timezone[GEO_MAX_TIMEZONE_NAME_LENGTH],
    player_provider[GEO_MAX_PROVIDER_NAME_LENGTH],
    player_mobile_status[GEO_MAX_MOBILE_STATUS_LENGTH],
    player_proxy[GEO_MAX_PROXY_LENGTH]
};
new
    player_geo_none[e_PLAYER_GEO_INFO] =
    {
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None"
    },
    player_geo[e_PLAYER_GEO_INFO],
    player_geo_ip[GEO_MAX_IP_LENGTH];
    #define GetIpCountryCode(%0)    player_geo[player_country_code]
#define GetIpCountry(%0)          player_geo[player_country]
#define GetIpRegionCode(%0)       player_geo[player_region_code]
#define GetIpRegion(%0)           player_geo[player_region]
#define GetIpCity(%0)             player_geo[player_city]
#define GetIpDistrict(%0)         player_geo[player_district]
#define GetIpLatitude(%0)         player_geo[player_lat]
#define GetIpLongtitude(%0)       player_geo[player_lon]
#define GetIpTimeZone(%0)         player_geo[player_timezone]
#define GetIpProvider(%0)         player_geo[player_provider]
#define GetIpMobileStatus(%0)     player_geo[player_mobile_status]
#define GetIpProxyStatus(%0)      player_geo[player_proxy]
//
#define GEO_IP_INFO_DETECT_URL_PISKA          "ip-api.com/csv/"
#define GEO_IP_INFO_DETECT_URL_FIELDS   "?fields=721887"
#define GEO_MAX_IP_LENGTH               (16 + 1)
CMD:ipinfo(playerid, params[])
{

    if(PlayerInfo[playerid][pAdmin]<5)return 0;
    if(ADuty[playerid]!=228) return SendClientMessage(playerid,COLOR_GREY,NO_DUTY_TEXT);
    new dialog_string[512];
    new
        request[128];


    strcat(request, GEO_IP_INFO_DETECT_URL_PISKA);
    strcat(request, params[0]);
    strcat(request, GEO_IP_INFO_DETECT_URL_FIELDS);

    HTTP(playerid, HTTP_GET, request, "", "p_geo_OnIpInformationRequested");
    


//переделаю потом чтобы показывало инфу о регистрационном айпи
    format(dialog_string, sizeof(dialog_string),
    "{FFFFFF}Проверка IP: {ff9300}%s{FFFFFF}\n\n\
    Страна: {ff9300}%s{FFFFFF}\n\
    Город: {ff9300}%s{FFFFFF}\n\
    Регион: {ff9300}%s{FFFFFF}",
    params[0],
 GetIpCountry(params[0]),
    GetIpCity(params[0]),
    GetIpRegion(params[0]));

    return ShowPlayerDialogEx(playerid, 0, DIALOG_STYLE_MSGBOX, !"Информация об IP-адресе", dialog_string, !"Закрыть", "");
}

forward p_geo_OnIpInformationRequested(playerid, response_code, data[]);
public p_geo_OnIpInformationRequested(playerid, response_code, data[])
{
    if(response_code == 200)
    {
        sscanf(data, "p<,>s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]",
            player_geo[player_country],
            player_geo[player_country_code],
            player_geo[player_region_code],
            player_geo[player_region],
            player_geo[player_city],
            player_geo[player_district],
            player_geo[player_lat],
            player_geo[player_lon],
            player_geo[player_timezone],
            player_geo[player_provider],
            player_geo[player_mobile_status],
            player_geo[player_proxy]);
    }
    else
    {
        player_geo = player_geo_none;
    }
    return 1;
}

 

Share this post


Link to post

5 answers to this question

  • 1

@coolgamer вывод данных переносите в  p_geo_OnIpInformationRequested 

 

//
#define GEO_MAX_IP_LENGTH               (16 + 1)
#define GEO_MAX_COUNTRY_CODE_LENGTH     (4 + 1)
#define GEO_MAX_COUNTRY_NAME_LENGTH     (32 + 1)
#define GEO_MAX_REGION_CODE_LENGTH      (6 + 1)
#define GEO_MAX_REGION_NAME_LENGTH      (32 + 1)
#define GEO_MAX_CITY_NAME_LENGTH        (32 + 1)
#define GEO_MAX_DISTRICT_NAME_LENGTH    (64 + 1)
#define GEO_MAX_LAT_LON_LENGTH          (12 + 1)
#define GEO_MAX_TIMEZONE_NAME_LENGTH    (64 + 1)
#define GEO_MAX_PROVIDER_NAME_LENGTH    (32 + 1)
#define GEO_MAX_MOBILE_STATUS_LENGTH    (5 + 1)
#define GEO_MAX_PROXY_LENGTH            (5 + 1)
enum e_PLAYER_GEO_INFO
{
    player_country_code[GEO_MAX_COUNTRY_CODE_LENGTH],
    player_country[GEO_MAX_COUNTRY_NAME_LENGTH],
    player_region_code[GEO_MAX_REGION_CODE_LENGTH],
    player_region[GEO_MAX_REGION_NAME_LENGTH],
    player_district[GEO_MAX_DISTRICT_NAME_LENGTH],
    player_city[GEO_MAX_CITY_NAME_LENGTH],
    player_lat[GEO_MAX_LAT_LON_LENGTH],
    player_lon[GEO_MAX_LAT_LON_LENGTH],
    player_timezone[GEO_MAX_TIMEZONE_NAME_LENGTH],
    player_provider[GEO_MAX_PROVIDER_NAME_LENGTH],
    player_mobile_status[GEO_MAX_MOBILE_STATUS_LENGTH],
    player_proxy[GEO_MAX_PROXY_LENGTH]
};
new
    player_geo_none[e_PLAYER_GEO_INFO] =
    {
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None"
    },
    player_geo[e_PLAYER_GEO_INFO],
    player_geo_ip[GEO_MAX_IP_LENGTH];
    #define GetIpCountryCode(%0)    player_geo[player_country_code]
#define GetIpCountry(%0)          player_geo[player_country]
#define GetIpRegionCode(%0)       player_geo[player_region_code]
#define GetIpRegion(%0)           player_geo[player_region]
#define GetIpCity(%0)             player_geo[player_city]
#define GetIpDistrict(%0)         player_geo[player_district]
#define GetIpLatitude(%0)         player_geo[player_lat]
#define GetIpLongtitude(%0)       player_geo[player_lon]
#define GetIpTimeZone(%0)         player_geo[player_timezone]
#define GetIpProvider(%0)         player_geo[player_provider]
#define GetIpMobileStatus(%0)     player_geo[player_mobile_status]
#define GetIpProxyStatus(%0)      player_geo[player_proxy]
//
#define GEO_IP_INFO_DETECT_URL_PISKA          "ip-api.com/csv/"
#define GEO_IP_INFO_DETECT_URL_FIELDS   "?fields=721887"
#define GEO_MAX_IP_LENGTH               (16 + 1)
CMD:ipinfo(playerid, params[])
{

    //if(p_info[playerid][admin]<5)return 0;
    //if(ADuty[playerid]!=228) return SendClientMessage(playerid,COLOR_GREY,NO_DUTY_TEXT);
    //new dialog_string[512];
    new 
        request[128];

    if(sscanf(params, "d",params[0]) ) return 1;
    

    //GetPlayerIp( params[0] , params , 16 ) ;

    strcat(request, GEO_IP_INFO_DETECT_URL_PISKA);
    strcat(request, p_t_info [ params [ 0 ] ] [ p_reg_ip ] );
    strcat(request, GEO_IP_INFO_DETECT_URL_FIELDS);

    print(request);

    HTTP(playerid, HTTP_GET, request, """p_geo_OnIpInformationRequested");
    


//переделаю потом чтобы показывало инфу о регистрационном айпи
    return 1;
}

forward p_geo_OnIpInformationRequested(playerid, response_code, data[]);
public p_geo_OnIpInformationRequested(playerid, response_code, data[])
{
    if(response_code == 200)
    {
        sscanf(data, "p<,>s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]",
            player_geo[player_country],
            player_geo[player_country_code],
            player_geo[player_region_code],
            player_geo[player_region],
            player_geo[player_city],
            player_geo[player_district],
            player_geo[player_lat],
            player_geo[player_lon],
            player_geo[player_timezone],
            player_geo[player_provider],
            player_geo[player_mobile_status],
            player_geo[player_proxy]);
    }
    else
    {
        player_geo = player_geo_none;
    }

    new dialog_string[512];

    format(dialog_string, sizeof(dialog_string),
    "{FFFFFF}Проверка IP: {ff9300}  {FFFFFF}\n\n\
    Страна: {ff9300}%s{FFFFFF}\n\
    Город: {ff9300}%s{FFFFFF}\n\
    Регион: {ff9300}%s{FFFFFF}",
    //params[0],
    player_geo[player_country],
    player_geo[player_city],
    player_geo[player_region]);

    return show_dialog(playerid, 0, DIALOG_STYLE_MSGBOX, !"Информация об IP-адресе", dialog_string, !"Закрыть""");
}

 

Share this post


Link to post
  • 0
16 часов назад, coolgamer сказал:

sscanf(data, "p<,>s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]",

 

В одном из аргументов надо поменять величину, подсказку ищите в define

 

Share this post


Link to post
  • 0

@mr1fl ничего не изменилось

Share this post


Link to post
  • 0

@coolgamer В параметрах ссканфа вы указываете слишком большие значения, возьмём ваш код частями:

#define GEO_MAX_IP_LENGTH               (16 + 1)

#define GEO_MAX_IP_LENGTH               (16 + 1// итого 17
#define GEO_MAX_COUNTRY_CODE_LENGTH     (4 + 1)  // итого 5
// и т.д.
enum e_PLAYER_GEO_INFO
{
    player_country_code[GEO_MAX_COUNTRY_CODE_LENGTH], // значит тут макс. размер 5, как раз чему и равно GEO_MAX_COUNTRY_CODE_LENGTH
    // и т.д.
};
// остальной код
        sscanf(data, "p<,>s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]s[64]",
            player_geo[player_country], // а вот тут вы уже пытаетесь записать размер, величиной в 64 символа
            player_geo[player_country_code],
            player_geo[player_region_code],
            player_geo[player_region],
            player_geo[player_city],
            player_geo[player_district],
            player_geo[player_lat],
            player_geo[player_lon],
            player_geo[player_timezone],
            player_geo[player_provider],
            player_geo[player_mobile_status],
            player_geo[player_proxy]);

Вам надо для каждой переменной выставить макс. размер в функции sscanf`a, пользуясь дейфанами, вот так это должно выглядить:

#define GEO_MAX_IP_LENGTH               (16 + 1)
#define GEO_MAX_COUNTRY_CODE_LENGTH     (4 + 1)
#define GEO_MAX_COUNTRY_NAME_LENGTH     (32 + 1)
#define GEO_MAX_REGION_CODE_LENGTH      (6 + 1)
#define GEO_MAX_REGION_NAME_LENGTH      (32 + 1)
#define GEO_MAX_CITY_NAME_LENGTH        (32 + 1)
#define GEO_MAX_DISTRICT_NAME_LENGTH    (64 + 1)
#define GEO_MAX_LAT_LON_LENGTH          (12 + 1)
#define GEO_MAX_TIMEZONE_NAME_LENGTH    (64 + 1)
#define GEO_MAX_PROVIDER_NAME_LENGTH    (32 + 1)
#define GEO_MAX_MOBILE_STATUS_LENGTH    (5 + 1)
#define GEO_MAX_PROXY_LENGTH            (5 + 1)
enum e_PLAYER_GEO_INFO
{
    player_country_code[GEO_MAX_COUNTRY_CODE_LENGTH],
    player_country[GEO_MAX_COUNTRY_NAME_LENGTH],
    player_region_code[GEO_MAX_REGION_CODE_LENGTH],
    player_region[GEO_MAX_REGION_NAME_LENGTH],
    player_district[GEO_MAX_DISTRICT_NAME_LENGTH],
    player_city[GEO_MAX_CITY_NAME_LENGTH],
    player_lat[GEO_MAX_LAT_LON_LENGTH],
    player_lon[GEO_MAX_LAT_LON_LENGTH],
    player_timezone[GEO_MAX_TIMEZONE_NAME_LENGTH],
    player_provider[GEO_MAX_PROVIDER_NAME_LENGTH],
    player_mobile_status[GEO_MAX_MOBILE_STATUS_LENGTH],
    player_proxy[GEO_MAX_PROXY_LENGTH]
};
new
    player_geo_none[e_PLAYER_GEO_INFO] =
    {
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None",
        "None"
    },
    player_geo_ip[GEO_MAX_IP_LENGTH];
    #define GetIpCountryCode(%0)    player_geo[player_country_code]
#define GetIpCountry(%0)          player_geo[player_country]
#define GetIpRegionCode(%0)       player_geo[player_region_code]
#define GetIpRegion(%0)           player_geo[player_region]
#define GetIpCity(%0)             player_geo[player_city]
#define GetIpDistrict(%0)         player_geo[player_district]
#define GetIpLatitude(%0)         player_geo[player_lat]
#define GetIpLongtitude(%0)       player_geo[player_lon]
#define GetIpTimeZone(%0)         player_geo[player_timezone]
#define GetIpProvider(%0)         player_geo[player_provider]
#define GetIpMobileStatus(%0)     player_geo[player_mobile_status]
#define GetIpProxyStatus(%0)      player_geo[player_proxy]
//
#define GEO_IP_INFO_DETECT_URL_PISKA          "ip-api.com/csv/"
#define GEO_IP_INFO_DETECT_URL_FIELDS   "?fields=721887"
#define GEO_MAX_IP_LENGTH               (16 + 1)
CMD:ipinfo(playerid, params[])
{

    if(PlayerInfo[playerid][pAdmin]<5)return 0;
    if(ADuty[playerid]!=228return SendClientMessage(playerid,COLOR_GREY,NO_DUTY_TEXT);
    new dialog_string[512];
    new
        request[128];


    strcat(request, GEO_IP_INFO_DETECT_URL_PISKA);
    strcat(request, params[0]);
    strcat(request, GEO_IP_INFO_DETECT_URL_FIELDS);

    HTTP(playerid, HTTP_GET, request, """p_geo_OnIpInformationRequested");
    


//переделаю потом чтобы показывало инфу о регистрационном айпи
    format(dialog_string, sizeof(dialog_string),
    "{FFFFFF}Проверка IP: {ff9300}%s{FFFFFF}\n\n\
    Страна: {ff9300}%s{FFFFFF}\n\
    Город: {ff9300}%s{FFFFFF}\n\
    Регион: {ff9300}%s{FFFFFF}",
    params[0],
 GetIpCountry(params[0]),
    GetIpCity(params[0]),
    GetIpRegion(params[0]));

    return ShowPlayerDialogEx(playerid, 0, DIALOG_STYLE_MSGBOX, !"Информация об IP-адресе", dialog_string, !"Закрыть""");
}

forward p_geo_OnIpInformationRequested(playerid, response_code, data[]);
public p_geo_OnIpInformationRequested(playerid, response_code, data[])
{
    if(response_code == 200)
    {
        new str_scanf[100];
        format(str_scanf, 100"p<,>s[%d]s[%d]s[%d]s[%d]s[%d]s[%d]s[%d]s[%d]s[%d]s[%d]s[%d]s[%d]",
            GEO_MAX_COUNTRY_NAME_LENGTH,GEO_MAX_COUNTRY_CODE_LENGTH,GEO_MAX_REGION_CODE_LENGTH,
            GEO_MAX_REGION_NAME_LENGTH,GEO_MAX_CITY_NAME_LENGTH,GEO_MAX_DISTRICT_NAME_LENGTH,
            GEO_MAX_LAT_LON_LENGTH,GEO_MAX_LAT_LON_LENGTH,GEO_MAX_TIMEZONE_NAME_LENGTH,
            GEO_MAX_PROVIDER_NAME_LENGTH,GEO_MAX_MOBILE_STATUS_LENGTH,GEO_MAX_PROXY_LENGTH); // для каждоый переменной свой размер
        sscanf(data, str_scanf,player_geo[player_country],player_geo[player_country_code],
            player_geo[player_region_code],player_geo[player_region],
            player_geo[player_city],player_geo[player_district],
            player_geo[player_lat],player_geo[player_lon],
            player_geo[player_timezone],player_geo[player_provider],
            player_geo[player_mobile_status],player_geo[player_proxy]); // вот теперь уже можно записывать
    }
    else
    {
        player_geo = player_geo_none;
    }
    return 1;
}

 

Share this post


Link to post
  • 0

 

@mr1fl Спасибо! Пришлось сделать немного правок, но теперь все работает!

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content