Sign in to follow this  
Followers 0
Guest

Geolocation

3 posts in this topic

Описание:

Данный код получает информацию о IP-адресе игрока и хранит её на протяжении игровой сессии.



Плюсы реализации:

  • Судя по всему - единственный рабочий вариант, на данный момент.
  • Не нужно использовать include / plugins

И так приступим, вставляем у себя в #define

#define GEO_IP_INFO_DETECT_URL          "ip-api.com/csv/"
#define GEO_IP_INFO_DETECT_URL_FIELDS   "?fields=131793"
 
#define GEO_MAX_IP_LENGTH               16
#define GEO_MAX_COUNTRY_NAME_LENGTH     32
#define GEO_MAX_CITY_NAME_LENGTH        32
#define GEO_MAX_LAT_LON_LENGTH          12
#define GEO_MAX_PROVIDER_NAME_LENGTH    32
#define GEO_MAX_PROXY_LENGTH            6
 
enum e_PLAYER_GEO_INFORMATION
{
    player_ip[GEO_MAX_IP_LENGTH + 1],
    player_country[GEO_MAX_COUNTRY_NAME_LENGTH + 1],
    player_city[GEO_MAX_CITY_NAME_LENGTH + 1],
    player_lat[GEO_MAX_LAT_LON_LENGTH + 1],
    player_lon[GEO_MAX_LAT_LON_LENGTH + 1],
    player_provider[GEO_MAX_PROVIDER_NAME_LENGTH + 1],
    player_proxy[GEO_MAX_PROXY_LENGTH + 1]
};
new
    player_geoInfo[MAX_PLAYERS][e_PLAYER_GEO_INFORMATION];
 
#define GetPlayerCountry(%0)        player_geoInfo[%0][player_country]
#define GetPlayerCity(%0)           player_geoInfo[%0][player_city]
#define GetPlayerLatitude(%0)       player_geoInfo[%0][player_lat]
#define GetPlayerLongtitude(%0)     player_geoInfo[%0][player_lon]
#define GetPlayerProvider(%0)       player_geoInfo[%0][player_provider]
#define GetPlayerProxyStatus(%0)    player_geoInfo[%0][player_proxy]

Теперь в public OnPlayerConnect(playerid)

	GetPlayerIp(playerid, player_geoInfo[playerid][player_ip], GEO_MAX_IP_LENGTH);
 
    new
        request[31 - 2 + GEO_MAX_IP_LENGTH];
 
    strcat(request, GEO_IP_INFO_DETECT_URL);
    strcat(request, player_geoInfo[playerid][player_ip]);
    strcat(request, GEO_IP_INFO_DETECT_URL_FIELDS);
 
    HTTP(playerid, HTTP_GET, request, "", "p_geo_OnInformationRequested");

В конец мода

forward p_geo_OnInformationRequested(playerid, response_code, data[]);
public p_geo_OnInformationRequested(playerid, response_code, data[])
{
    if(response_code == 200)
    {
        sscanf(data, "p<,>s[32]s[32]s[12]s[12]s[32]s[6]",
            player_geoInfo[playerid][player_country],
            player_geoInfo[playerid][player_city],
            player_geoInfo[playerid][player_lat],
            player_geoInfo[playerid][player_lon],
            player_geoInfo[playerid][player_provider],
            player_geoInfo[playerid][player_proxy]);
    }
    else
    {
        strmid(player_geoInfo[playerid][player_country], "Неизвестно", 0, GEO_MAX_COUNTRY_NAME_LENGTH);
        strmid(player_geoInfo[playerid][player_city], "Неизвестно", 0, GEO_MAX_CITY_NAME_LENGTH);
        strmid(player_geoInfo[playerid][player_lat], "Неизвестно", 0, GEO_MAX_LAT_LON_LENGTH);
        strmid(player_geoInfo[playerid][player_lon], "Неизвестно", 0, GEO_MAX_LAT_LON_LENGTH);
        strmid(player_geoInfo[playerid][player_provider], "Неизвестно", 0, GEO_MAX_PROVIDER_NAME_LENGTH);
        strmid(player_geoInfo[playerid][player_proxy], "Неизвестно", 0, GEO_MAX_PROXY_LENGTH);
    }
    return 1;
}

Доступные макросы для использования:

GetPlayerCountry(playerid) - получить название страны, в которой сейчас находится игрок (тип значения - string).
GetPlayerCity(playerid) - получить название города, в котором сейчас находится игрок (тип значения - string).
GetPlayerLatitude(playerid) - получить координаты широты игрока (тип значения - string).
GetPlayerLongtitude(playerid) - получить координаты долготы игрока (тип значения - string).
GetPlayerProvider(playerid) - получить название провайдера игрока (тип значения - string).
GetPlayerProxyStatus(playerid) - получить информацию, использует ли игрок прокси [true/false] (тип значения - string). 

Share this post


Link to post
Share on other sites

Хорошое решение. На форуме также имеется похожее рабочее решение. Оставлю ссылку может кому-нибудь пригодится. 

Ссылка

Edited by Weishaypt

Share this post


Link to post
Share on other sites

вопрос можно .
если за использование впн я хочу игрока автоматом банить ,то
код должен же выгладить вот так не?
public p_geo_OnInformationRequested(playerid, response_code, data[])
{
    if(player_geoInfo[playerid][player_proxy] == true) return BanEx(playerid,"Proxy Use");
}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Раксон Фаркрай
      By Раксон Фаркрай
      Не могу понять как поставить автосалоны RASTAMAN https://pawno-rus.ru/files/file/87-2-avtosalona-bmw-i-mercedes/?
    • nazikUA
      By nazikUA
      Добрый вечер, перевел мод на 0.3.7 и сервер крашит когда я подхожу к какому либо маппингу, можно ли как то это исправить?