Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Команда /getip. С показом Страны, Города и Провайдера [DC_CMD]

Carl_Onfroy

Начинающий
Пользователь
Регистрация
28 Дек 2019
Сообщения
80
Лучшие ответы
2
Репутация
5
Добрый день.
Искал в интернете команду /getip как на Arizona RP. Не нашёл.

Моя версия, немного костыльная, но рабочая.

Суть работы:
1. Это всё работает по средству API сайта ipwhois.io
2. При выполнении команды /getip сервер создаёт 2 HTTP запроса на данный ресурс.
3. В 1 запросе мы узнаём информацию о текущем IP игрока. А во 2, уже о регистрационном.
4. После получения всей информации показывается диалог со всей необходимой информацией. ( Прикреплю скрин )


* Переработал систему, исправил баги с неправильным хранением данных, чисто мой косяк
** А именно:
1. Изменил API, работает более корректно.
2. Изменил способ показа информации Администратору (Через таймер, что бы дать запросам собрать информацию)



Ну, сама 'система')
Код:
enum p_GET_IP_INFO // Немного тут изменил
{
    last_ip[16],
    Reg_country[32+1],
    Reg_city[32+1],
    Reg_provider[64+1],
    last_country[32+1],
    last_city[32+1],
    last_provider[64+1]
}
new pGetIPInfo[MAX_PLAYERS][p_GET_IP_INFO];
Код:
CMD:getip(playerid, params[])
{
    if(/*Ваша проверка на Администратора*/) return SCM(playerid, -1, !" У Вас нет доступа к этой команде.");
    if(/*Авторизован ли Администратор*/) return 0;
    if(sscanf(params,"d",params[0])) return SCM(playerid, -1, !"Используйте /getip [ID]");
    if(params[0] == INVALID_PLAYER_ID) return SCM(playerid, -1, !" Игрок не найден!");
    if(pLogin[params[0]] != 1) return SCM(playerid, -1, !" Игрок не найден!");


    new qquery[56+(-2+16)],
        qquery2[56+(-2+16)],
        ip[16];
    GetPlayerIp(params[0], ip, sizeof(ip));
    strmid(pGetIPInfo[params[0]][last_ip], ip, 0, 17, 17);
    format(qquery, sizeof(qquery), "ipwhois.app/csv/%s?objects=country,city,isp", ip);
    HTTP(params[0], HTTP_GET, qquery, "", "p_GetLastInfo");
    format(qquery2, sizeof(qquery2), "ipwhois.app/csv/%s?objects=country,city,isp", pInfo[params[0]][pRegIP]);
    HTTP(params[0], HTTP_GET, qquery2, "", "p_GetRegInfo");
    SetTimerEx("ShowGetIpInformation", 1600, false, "dd", playerid, params[0]);// Тут основное исправление.
    return 1;
}

Код:
// Тут уже показ результатов
forward ShowGetIpInformation(playerid, params);
public ShowGetIpInformation(playerid, params)
{
    new string[409+(-2+14)+(-2+16)+(-2+16)+(-2+29)+(-2+64)+(-2+30)+(-2+21)+(-2+64)+(-2+30)],
        d_head[43+(-2+MAX_PLAYER_NAME)];

    format(d_head, sizeof(d_head), "{FFFFFF}Информация об IP игрока: {3281dd}%s", Name(params));
    format(string, sizeof(string), "\n\
    {FFFFFF}Дата регистрации: \t\t{3281dd}%s\n\
    {FFFFFF}Регистрационный IP: \t\t{3281dd}%s\n\
    {FFFFFF}Текущий IP: \t\t\t{3281dd}%s\n\n\
    {FFFFFF}Страна регистрации: \t\t{3281dd}%s\n\
    {FFFFFF}Город регистрации: \t\t{3281dd}%s\n\
    {FFFFFF}Провайдер при регистрации: \t{3281dd}%s\n\n\
    {FFFFFF}Текущая страна: \t\t{3281dd}%s\n\
    {FFFFFF}Текущий город: \t\t{3281dd}%s\n\
    {FFFFFF}Текущий провайдер: \t\t{3281dd}%s\n", \
        pInfo[params][pRegDate], pInfo[params][pRegIP],
        pGetIPInfo[params][last_ip],
        pGetIPInfo[params][Reg_country],
        pGetIPInfo[params][Reg_city],
        pGetIPInfo[params][Reg_provider],
        pGetIPInfo[params][last_country], pGetIPInfo[params][last_city], pGetIPInfo[params][last_provider]);
    SPD(playerid, dNone, DSM, d_head, string, "Закрыть", "");
    return 1;
}

// Инфа об текущем местоположении
forward p_GetLastInfo(playerid, response_code, data[]);
public p_GetLastInfo(playerid, response_code, data[])
{
    if(response_code == 200) {
        sscanf(data, "p<,>s[32]s[32]s[64]", pGetIPInfo[playerid][last_country], pGetIPInfo[playerid][last_city], pGetIPInfo[playerid][last_provider]);
    }
    else { // Если запрос не удался
        strmid(pGetIPInfo[playerid][last_country], "Unknown", 0, 8, 8);
        strmid(pGetIPInfo[playerid][last_city], "Unknown", 0, 8, 8);
        strmid(pGetIPInfo[playerid][last_provider], "Unknown", 0, 8, 8);
    }
    return 1;
}

// Инфа об местоположении во время регистрации
forward p_GetRegInfo(playerid, response_code, data[]);
public p_GetRegInfo(playerid, response_code, data[])
{
    if(response_code == 200) {
        sscanf(data, "p<,>s[32]s[32]s[64]", pGetIPInfo[playerid][Reg_country], pGetIPInfo[playerid][Reg_city], pGetIPInfo[playerid][Reg_provider]);
    }
    else { // Если запрос не удался
        strmid(pGetIPInfo[playerid][Reg_country], "Unknown", 0, 8, 8);
        strmid(pGetIPInfo[playerid][Reg_city], "Unknown", 0, 8, 8);
        strmid(pGetIPInfo[playerid][Reg_provider], "Unknown", 0, 8, 8);
    }
    return 1;
}


Может реализовано немного неверно, но это работает, можно будет эффективнее проверять игрока на регистрационные данные.
Если что не бейте, недавно занимаюсь..
Может кому нужно будет, переделает под себя.
Ну вроде как все, есть ошибки, замечания - пишите)

P.S: Текущий пишет что Unknown как-раз из-за того что я сижу с 127.0.0.1 и сайт не может это обработать.
 

Вложения

Последнее редактирование:
Сверху Снизу