Добро пожаловать на Pawno-Info.Ru - Портал о программировании №1

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям и ответы на все интересующие Вас вопросы. После регистрации Вы сможете создавать темы, публиковать ответы, влиять на репутацию пользователей форума, обмениваться личными сообщениями и многое другое. Это быстро и совершенно бесплатно, так чего же Вы ждете?

Маппинг для сервера

Если вы хотите обновить Ваш сервер новыми доработками - то зайдите в наш раздел. Большой выбор готовых решений от наших пользователей

Моды для сервера

Огромный выбор различных модификаций для Вашего сервера. Пролистайте эти темы! Возможно именно там Вы найдете то, что искали уже давно.

Модификации SA

Хотите разнообразить свою игру в San Andreas? Смелее в наш раздел. Отличный сборник готовых решений. Играйте с удовольствием

Carl_Onfroy

Начинающий
Пользователь
Регистрация
28 Дек 2019
Сообщения
78
Лучшие ответы
2
Репутация
2
Адрес
Tokyo
Добрый день.
Искал в интернете команду /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 и сайт не может это обработать.
 

Вложения

Последнее редактирование:

NeverBoring

Начинающий
Пользователь
Регистрация
26 Ноя 2020
Сообщения
37
Лучшие ответы
2
Репутация
8
Советую информацию хранить в PVar'ах, потом удалять. Так будет оптимизрованее. Ибо не вижу смысла делать целый массив ради одной команды.
 

Carl_Onfroy

Начинающий
Пользователь
Регистрация
28 Дек 2019
Сообщения
78
Лучшие ответы
2
Репутация
2
Адрес
Tokyo
Советую информацию хранить в PVar'ах, потом удалять. Так будет оптимизрованее. Ибо не вижу смысла делать целый массив ради одной команды.
Ну, хорошо. Спасибо. Если так действительно будет лучше то перенесу на PVar. Спасибо.
 

whale

/proger/
Professional
Пользователь
Регистрация
20 Сен 2013
Сообщения
1,144
Лучшие ответы
1
Репутация
462
  • OLD
  • Pawn-разработчик
 

plakapenka

• Помощник •
Support
Пользователь
Регистрация
5 Фев 2012
Сообщения
1,026
Лучшие ответы
5
Репутация
1,066
Адрес
Витебск
Чётко, как раз недавно человек искал в вопросах похожее. Думал уж писать мануал самому))

C++:
sscanf(data, "p<\n>
Не думал что это так работает :eek:
Круто
 

Carl_Onfroy

Начинающий
Пользователь
Регистрация
28 Дек 2019
Сообщения
78
Лучшие ответы
2
Репутация
2
Адрес
Tokyo
C++:
sscanf(data, "p<\n>
Не думал что это так работает :eek:
Круто
Делать в том, что это единственный Api который я нашел, который может ответить просто написанием на новой строке. В иных случаях я получал очень много всего и ( ; ) ( : ) ("") и я не знал как выделить именно нужные слова, поэтому решил пока использовать этот вариант.
 

OKStyle

Адвокат по делам семейным
Команда форума
Administrator
Wiki Team
Регистрация
4 Мар 2011
Сообщения
6,072
Лучшие ответы
96
Репутация
1,808
Возраст
33
Адрес
Оренбург
  • Спасибо от администрации
  • Помощник
  • Pawn-разработчик
  • Писатель
  • Победитель
  • Активный модератор

Carl_Onfroy

Начинающий
Пользователь
Регистрация
28 Дек 2019
Сообщения
78
Лучшие ответы
2
Репутация
2
Адрес
Tokyo
Обновил пост. Изменил API для получения информации, и исправил баг с тем что мод не успевал получить ответ от сайта и сразу показывал диалог.
 
shape1
shape2
shape3
shape4
shape7
shape8
Сверху Снизу