• Уважаемые пользователи!
    За решением проблем с работой плагинов, компиляцией, падением сервера и прочими обращайтесь в раздел Помощи!
    Данная тема предназначена для обсуждения плагина, его функционала, принципа работы и предложений.

Разработка Защита ника

93RUS

Участник
Сообщения
15
Реакции
3
Баллы
3
Техническое задание
Добрый день, идея для GameCMS API :
Плагин который будет проверять связку в профиле steam id + ник, и не позволит использовать ник игрока, другим игрокам.
К примеру можно применять для тех кто купил VIP услугу, автоматически защищать их ник от клонов, а те кто зайдут на сервер с ником VIP игрока, менять ник на заданный в настройках плагина, но меняет только визуально, при выходе сервера будет старый ник ( чтобы не получить бан на мониторингах )
Плагин для gamecms api
 

zhorzh78

Администратор
Сообщения
2,980
Решения
17
Реакции
1,184
Баллы
113
93RUS, Что мешает выдать флаг на ник? Или я чего-то не понимаю?
 

93RUS

Участник
Сообщения
15
Реакции
3
Баллы
3
93RUS, Что мешает выдать флаг на ник? Или я чего-то не понимаю?
К примеру у нас услуги выдаются на steam id игрока, который далее привязывается к профилю, вот поэтому было бы не плохо иметь такой плагин, для автоматизации в целом, чтобы потом в ручную не мудрить с паролями на ник:)
 

R4SAS

Участник
Сообщения
13
Реакции
21
Баллы
3
Из дискуссии в ЛС:

Например я в профиле указал:
Ник: HELLO
Steam: STEAM_0:0:123456

Захожу на сервер. API получает ник, смотрит не зарегистрирован ли он кем либо в профиле.

Если он есть в БД, то делаем проверку на стим.
Если STEAM совпадает, то не трогаем, иначе меняем игроку никнейм

  1. человек должен быть зареган на сайте
  2. человек должен иметь заполненный профиль (ник + стим)
  3. человек должен иметь привилегию на сервере где выполняется проверка
  4. стим в профиле должен совпадать с стимом в правах)

  • Для предотвращения зафлуживания БД запросами при смене никнейма, предлагается использовать защиту от частой смены никнейма, например раз в раунд или по временному интервалу.
  • Аналогично для предотвращения зафлуживания частым реконнектом предусмотрено использование стороннего плагина блокирующего вход при частом реконнекте.
  • Проверку скорее всего так же желательно производить не сразу же, а через некоторое время после коннекта.
 

zhorzh78

Администратор
Сообщения
2,980
Решения
17
Реакции
1,184
Баллы
113
человек должен иметь привилегию на сервере где выполняется проверка
Какой человек? Который меняет ник или который имеет ник в профиле? Какую привилегию он должен иметь? "_nick_prefix" - тоже привилегия.
 

R4SAS

Участник
Сообщения
13
Реакции
21
Баллы
3
Тот, который имеет заполненный профиль (nickname + steamid) и привилегии (обычные, внутриигровые по флагам AMXX).
 

zhorzh78

Администратор
Сообщения
2,980
Решения
17
Реакции
1,184
Баллы
113
R4SAS,
C++:
#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#include <gamecms5>
#include <reapi>

new Trie:g_trhNamesData;
new HookChain:g_hcSUIN;
new g_szNames[][] =
{
    "бубубу",
    "мемеме",
    "хрюхрю"
}

public OnAPIPluginLoaded(Handle:sqlTuple)
{
    SQL_ThreadQuery(sqlTuple, "SQL_ThreadQuery_post", "SELECT `users`.`id`, cast(convert(`users`.`nick` using utf8) as binary) as `nick` \
    FROM `users` WHERE (`users`.`nick` != '' AND `users`.`nick` != '---');");
}

public SQL_ThreadQuery_post(failstate, Handle:query, const error[], errornum)
{
    if(SQL_Error(error, errornum, failstate) || !SQL_NumResults(query))
    {
        pause("a");
        return;
    }
 
    g_trhNamesData = TrieCreate();
 
    while(SQL_MoreResults(query))
    {
        static id, szNick[MAX_NAME_LENGTH];
     
        id = SQL_ReadResult(query, SQL_FieldNameToNum(query, "id"));
        SQL_ReadResult(query, SQL_FieldNameToNum(query, "nick"), szNick, charsmax(szNick));

        mysql_escape_string(szNick, charsmax(szNick) * 2);
        TrieSetCell(g_trhNamesData, szNick, id);
             
        SQL_NextRow(query);
    }

    g_hcSUIN = RegisterHookChain(RG_CBasePlayer_SetClientUserInfoName, "CBasePlayer_SetUserInfoName", .post = false);
 
    if(get_playersnum_ex(GetPlayers_ExcludeHLTV | GetPlayers_ExcludeBots))
    {
        for(new i = 1; i <= MaxClients; i++)
            if(is_user_connected(i))
                client_putinserver(i);
    }
}

public client_putinserver(id)
{
    if(!g_hcSUIN)
        return;

    new szName[MAX_NAME_LENGTH];
    get_entvar(id, var_netname, szName, charsmax(szName));
 
    CBasePlayer_SetUserInfoName(id, "", szName);
}

public CBasePlayer_SetUserInfoName(const iClient, infobuffer[], szNewName[])
{
    if(FnBlockUseName(iClient, szNewName))
    {
        if(infobuffer[0] != EOS)
        {
            SetHookChainReturn(ATYPE_INTEGER, false);
            return HC_SUPERCEDE;
        }

        DisableHookChain(g_hcSUIN);
        set_entvar(iClient, var_netname, g_szNames[random(sizeof(g_szNames))]);
        EnableHookChain(g_hcSUIN);
    }

    return HC_CONTINUE;
}

bool:FnBlockUseName(id, szName[])
{
    static iMemberId;
    if(!TrieGetCell(g_trhNamesData, szName, iMemberId))
        return false;

    if(iMemberId == 0)
        return false;
 
    return (cmsapi_is_user_member(id) != iMemberId || !cmsapi_get_admin_ident(id));
}

2 момента.
  • Движок не запрещает использовать одинаковые ники, поэтому в массив попадет только последний из них.
  • Поле Ник в движке по-умолчанию "---", поэтому игрок с таким ником будет проигнорирован.
 
Сверху