Работа с модулем GeoIP

Работа с модулем GeoIP
GeoIP - модуль AmxModX позволяющий определить ~ местоположение игрока, рассчитать расстояние от одного пункта до другого.
В данном уроки мы будем работать с библиотекой GeoIP и несколькими нативами:
native geoip_country(const ip[], result[], len = 45); ( Признана устаревшей с версии 1.8.3, является аналогом geoip_country_ex )
native geoip_country_ex(const ip[], result[], len, id = -1);
native geoip_city(const ip[], result[], len, id = -1);
native geoip_region_name(const ip[], result[], len, id = -1);
native Float:geoip_latitude(const ip[]);
native Float:geoip_longitude(const ip[]);
Для определения региона и страны необходимо скачать доп. базу данных - Доступно только для пользователейклацк ( Качать City, первый столбец )
Ну а теперь собственно первый пример:
Доступно только для пользователейpublic client_putinserver(id)
{
// native geoip_country(const ip[], result[], len = 45);
// В аргументах видим 3 значения
// Также есть native geoip_country_ex(const ip[], result[], len, id = -1); ( Добавлен в версии 1.8.3-dev либо 1.9.0 , точно не помню )
// В нём имеется 4 аргумента
// 1-ым аргументом мы должны указать ip-адрес игрока
// во 2-ой аргумент будет происходить запись результата
// 3-им результатом мы должны указать размер
public OnShowInfo(id) // Создадим простейшую функцию ( В аргументах передаём индекс игрока )
{
new szCountry[35]; // В данную переменную мы запишем страну
new szIp[23]; // В данную переменную мы запишем ip игрока, для последующего использования в функции geoip_country_ex
get_user_ip(id, szIp, charsmax(szIp),1); // с помощью данной функции мы получим ip и запишем его в переменную, 4-ым аргументом является тип который нам нужен ( 0 - с клиент-портом, 1 - лишь ip , подробнее [URL='https://www.amxmodx.org/api/amxmodx/get_user_ip']тык[/URL] )
if(geoip_country_ex(szIp, szCountry, charsmax(szCountry)) == 0) // создадим вызов и вместе с ним проверку ( Если город не найден, то вернет значение равное 0 , данная проверка актуальна для AmxModX >= 1.8.3 )
{
formatex(szCountry, charsmax(szCountry), "Неопределён"); // Сюда мы запишем страну, если она не определена.
client_print_color(id, 0, "Ваша страна - ^4%s", szCountry); // Выведем её, если у вас версия ранее 1.8.3 , то используйте свой колор-чат
}
}
}
Пример получения города и региона:
Доступно только для пользователей// Закиньте БД с городами в /data/, после этого необходима ПЕРЕЗАГРУЗКА сервера, а не рестарт.
public OnShowInfo(id)
{
new szIp[23], new szRegion[32], new szCity[64];
get_user_ip(id, szIp, charsmax(szIp),1);
if(geoip_city(szIp, szCity, charsmax(szCity)) == 0)
{
formatex(szCity, charsmax(szCity), "Неизвестно");
}
if(geoip_region_name(szIp, szRegion, charsmax(szRegion)) == 0)
{
formatex(szRegion, charsmax(szRegion), "Неизвестно");
}
client_print_color(id, 0, "^1[^4GeoIP^1] [ ^4%s ^1| ^4%s^1 ]", szRegion, szCity);
}
Пример получения расстояния:
Доступно только для пользователейpublic OnShowDistance(id, pid) // В аргументах функции передаём id игрока который открыл меню и который был выбран в меню
{
new szIpo[23], szIpt[23] // Создаём переменные для хранения IP
new szName[35]; // создадим переменную для хранении ника второго игрока
get_user_name(pid, szName, charsmax(szName))
get_user_ip(id, szIpo, charsmax(szIpo), 1) // получаем айпи первого игрока
get_user_ip(pid, szIpt, charsmax(szIpt), 1) // получаем айпи второго игрока
new Float:szLato = geoip_latitude(szIpo) // получаем широту города первого игрока
new Float:szLono = geoip_longitude(szIpo) // Получаем долготу города второго игрока
// Получаем широту, долготу города 2-ого игрока
new Float:szLatt = geoip_latitude(szIpt)
new Float:szLont = geoip_longitude(szIpt)
new Float:szDistance = geoip_distance(szLato, szLono, szLatt, szLont, SYSTEM_METRIC); // создадим переменную в которой будет храниться дистанция и запишем в неё эту дистанцию
client_print_color(id, 0, "Расстояние до игрока %s составляет %.2f", szName, szDistance)
}
В данном уроки мы будем работать с библиотекой GeoIP и несколькими нативами:
native geoip_country(const ip[], result[], len = 45); ( Признана устаревшей с версии 1.8.3, является аналогом geoip_country_ex )
native geoip_country_ex(const ip[], result[], len, id = -1);
native geoip_city(const ip[], result[], len, id = -1);
native geoip_region_name(const ip[], result[], len, id = -1);
native Float:geoip_latitude(const ip[]);
native Float:geoip_longitude(const ip[]);
Для определения региона и страны необходимо скачать доп. базу данных - Доступно только для пользователейклацк ( Качать City, первый столбец )
Ну а теперь собственно первый пример:
Доступно только для пользователейpublic client_putinserver(id)
{
// native geoip_country(const ip[], result[], len = 45);
// В аргументах видим 3 значения
// Также есть native geoip_country_ex(const ip[], result[], len, id = -1); ( Добавлен в версии 1.8.3-dev либо 1.9.0 , точно не помню )
// В нём имеется 4 аргумента
// 1-ым аргументом мы должны указать ip-адрес игрока
// во 2-ой аргумент будет происходить запись результата
// 3-им результатом мы должны указать размер
public OnShowInfo(id) // Создадим простейшую функцию ( В аргументах передаём индекс игрока )
{
new szCountry[35]; // В данную переменную мы запишем страну
new szIp[23]; // В данную переменную мы запишем ip игрока, для последующего использования в функции geoip_country_ex
get_user_ip(id, szIp, charsmax(szIp),1); // с помощью данной функции мы получим ip и запишем его в переменную, 4-ым аргументом является тип который нам нужен ( 0 - с клиент-портом, 1 - лишь ip , подробнее [URL='https://www.amxmodx.org/api/amxmodx/get_user_ip']тык[/URL] )
if(geoip_country_ex(szIp, szCountry, charsmax(szCountry)) == 0) // создадим вызов и вместе с ним проверку ( Если город не найден, то вернет значение равное 0 , данная проверка актуальна для AmxModX >= 1.8.3 )
{
formatex(szCountry, charsmax(szCountry), "Неопределён"); // Сюда мы запишем страну, если она не определена.
client_print_color(id, 0, "Ваша страна - ^4%s", szCountry); // Выведем её, если у вас версия ранее 1.8.3 , то используйте свой колор-чат
}
}
}
Пример получения города и региона:
Доступно только для пользователей// Закиньте БД с городами в /data/, после этого необходима ПЕРЕЗАГРУЗКА сервера, а не рестарт.
public OnShowInfo(id)
{
new szIp[23], new szRegion[32], new szCity[64];
get_user_ip(id, szIp, charsmax(szIp),1);
if(geoip_city(szIp, szCity, charsmax(szCity)) == 0)
{
formatex(szCity, charsmax(szCity), "Неизвестно");
}
if(geoip_region_name(szIp, szRegion, charsmax(szRegion)) == 0)
{
formatex(szRegion, charsmax(szRegion), "Неизвестно");
}
client_print_color(id, 0, "^1[^4GeoIP^1] [ ^4%s ^1| ^4%s^1 ]", szRegion, szCity);
}
Пример получения расстояния:
Доступно только для пользователейpublic OnShowDistance(id, pid) // В аргументах функции передаём id игрока который открыл меню и который был выбран в меню
{
new szIpo[23], szIpt[23] // Создаём переменные для хранения IP
new szName[35]; // создадим переменную для хранении ника второго игрока
get_user_name(pid, szName, charsmax(szName))
get_user_ip(id, szIpo, charsmax(szIpo), 1) // получаем айпи первого игрока
get_user_ip(pid, szIpt, charsmax(szIpt), 1) // получаем айпи второго игрока
new Float:szLato = geoip_latitude(szIpo) // получаем широту города первого игрока
new Float:szLono = geoip_longitude(szIpo) // Получаем долготу города второго игрока
// Получаем широту, долготу города 2-ого игрока
new Float:szLatt = geoip_latitude(szIpt)
new Float:szLont = geoip_longitude(szIpt)
new Float:szDistance = geoip_distance(szLato, szLono, szLatt, szLont, SYSTEM_METRIC); // создадим переменную в которой будет храниться дистанция и запишем в неё эту дистанцию
client_print_color(id, 0, "Расстояние до игрока %s составляет %.2f", szName, szDistance)
}