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

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

93RUS

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

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

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

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

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

  • Для предотвращения зафлуживания БД запросами при смене никнейма, предлагается использовать защиту от частой смены никнейма, например раз в раунд или по временному интервалу.
  • Аналогично для предотвращения зафлуживания частым реконнектом предусмотрено использование стороннего плагина блокирующего вход при частом реконнекте.
  • Проверку скорее всего так же желательно производить не сразу же, а через некоторое время после коннекта.
 
человек должен иметь привилегию на сервере где выполняется проверка
Какой человек? Который меняет ник или который имеет ник в профиле? Какую привилегию он должен иметь? "_nick_prefix" - тоже привилегия.
 
Тот, который имеет заполненный профиль (nickname + steamid) и привилегии (обычные, внутриигровые по флагам AMXX).
 
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 момента.
  • Движок не запрещает использовать одинаковые ники, поэтому в массив попадет только последний из них.
  • Поле Ник в движке по-умолчанию "---", поэтому игрок с таким ником будет проигнорирован.
 
Назад
Сверху