Исправить SourceSleuth

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #1
Помогите исправить SourceSleuth под новую серверную часть от этого СБ [ALPHA] Material Admin - рефорк SB++ 1.5.4.7
Нужно чтобы банило по IP за обход бана. И есть ещё небольшой баг, плагин не банит за обход, если бан перманентный.
C-подобный:
public PlVers:__version =
{
    version = 5,
    filevers = "1.5.3",
    date = "11/16/2014",
    time = "20:46:13"
};
new Float:NULL_VECTOR[3];
new String:NULL_STRING[4];
public Extension:__ext_core =
{
    name = "Core",
    file = "core",
    autoload = 0,
    required = 0,
};
new MaxClients;
new Handle:g_hDatabase;
new Handle:g_cVar_actions;
new Handle:g_cVar_banduration;
new Handle:g_cVar_sbprefix;
new Handle:g_cVar_bansAllowed;
new Handle:g_cVar_bantype;
new Handle:g_cVar_bypass;
new Handle:g_hAllowedArray;
new bool:CanUseSourcebans;
public Plugin:myinfo =
{
    name = "SourceSleuth",
    description = "Useful for TF2 servers. Plugin will check for banned ips and ban the player.",
    author = "ecca",
    version = "1.3 fix",
    url = "http://sourcemod.net"
};

/* ERROR! null */
function "NodeBlock" (number 0)
public __ext_core_SetNTVOptional()
{
    MarkNativeAsOptional("GetFeatureStatus");
    MarkNativeAsOptional("RequireFeature");
    MarkNativeAsOptional("AddCommandListener");
    MarkNativeAsOptional("RemoveCommandListener");
    MarkNativeAsOptional("BfWriteBool");
    MarkNativeAsOptional("BfWriteByte");
    MarkNativeAsOptional("BfWriteChar");
    MarkNativeAsOptional("BfWriteShort");
    MarkNativeAsOptional("BfWriteWord");
    MarkNativeAsOptional("BfWriteNum");
    MarkNativeAsOptional("BfWriteFloat");
    MarkNativeAsOptional("BfWriteString");
    MarkNativeAsOptional("BfWriteEntity");
    MarkNativeAsOptional("BfWriteAngle");
    MarkNativeAsOptional("BfWriteCoord");
    MarkNativeAsOptional("BfWriteVecCoord");
    MarkNativeAsOptional("BfWriteVecNormal");
    MarkNativeAsOptional("BfWriteAngles");
    MarkNativeAsOptional("BfReadBool");
    MarkNativeAsOptional("BfReadByte");
    MarkNativeAsOptional("BfReadChar");
    MarkNativeAsOptional("BfReadShort");
    MarkNativeAsOptional("BfReadWord");
    MarkNativeAsOptional("BfReadNum");
    MarkNativeAsOptional("BfReadFloat");
    MarkNativeAsOptional("BfReadString");
    MarkNativeAsOptional("BfReadEntity");
    MarkNativeAsOptional("BfReadAngle");
    MarkNativeAsOptional("BfReadCoord");
    MarkNativeAsOptional("BfReadVecCoord");
    MarkNativeAsOptional("BfReadVecNormal");
    MarkNativeAsOptional("BfReadAngles");
    MarkNativeAsOptional("BfGetNumBytesLeft");
    MarkNativeAsOptional("PbReadInt");
    MarkNativeAsOptional("PbReadFloat");
    MarkNativeAsOptional("PbReadBool");
    MarkNativeAsOptional("PbReadString");
    MarkNativeAsOptional("PbReadColor");
    MarkNativeAsOptional("PbReadAngle");
    MarkNativeAsOptional("PbReadVector");
    MarkNativeAsOptional("PbReadVector2D");
    MarkNativeAsOptional("PbGetRepeatedFieldCount");
    MarkNativeAsOptional("PbReadRepeatedInt");
    MarkNativeAsOptional("PbReadRepeatedFloat");
    MarkNativeAsOptional("PbReadRepeatedBool");
    MarkNativeAsOptional("PbReadRepeatedString");
    MarkNativeAsOptional("PbReadRepeatedColor");
    MarkNativeAsOptional("PbReadRepeatedAngle");
    MarkNativeAsOptional("PbReadRepeatedVector");
    MarkNativeAsOptional("PbReadRepeatedVector2D");
    MarkNativeAsOptional("PbSetInt");
    MarkNativeAsOptional("PbSetFloat");
    MarkNativeAsOptional("PbSetBool");
    MarkNativeAsOptional("PbSetString");
    MarkNativeAsOptional("PbSetColor");
    MarkNativeAsOptional("PbSetAngle");
    MarkNativeAsOptional("PbSetVector");
    MarkNativeAsOptional("PbSetVector2D");
    MarkNativeAsOptional("PbAddInt");
    MarkNativeAsOptional("PbAddFloat");
    MarkNativeAsOptional("PbAddBool");
    MarkNativeAsOptional("PbAddString");
    MarkNativeAsOptional("PbAddColor");
    MarkNativeAsOptional("PbAddAngle");
    MarkNativeAsOptional("PbAddVector");
    MarkNativeAsOptional("PbAddVector2D");
    MarkNativeAsOptional("PbReadMessage");
    MarkNativeAsOptional("PbReadRepeatedMessage");
    MarkNativeAsOptional("PbAddMessage");
    VerifyCoreVersion();
    return 0;
}

bool:StrEqual(String:str1[], String:str2[], bool:caseSensitive)
{
    return strcmp(str1, str2, caseSensitive) == 0;
}

public OnPluginStart()
{
    LoadTranslations("sourcesleuth.phrases");
    CreateConVar("sm_sourcesleuth_version", "1.3 fix", "SourceSleuth plugin version", 401728, false, 0.0, false, 0.0);
    g_cVar_actions = CreateConVar("sm_sleuth_actions", "3", "Sleuth Ban Type: 1 - Original Length, 2 - Custom Length, 3 - Double Length, 4 - Notify Admins Only", 262144, true, 1.0, true, 4.0);
    g_cVar_banduration = CreateConVar("sm_sleuth_duration", "0", "Required: sm_sleuth_actions 1: Bantime to ban player if we got a match (0 = permanent (defined in minutes) )", 262144, false, 0.0, false, 0.0);
    g_cVar_sbprefix = CreateConVar("sm_sleuth_prefix", "sb", "Prexfix for sourcebans tables: Default sb", 262144, false, 0.0, false, 0.0);
    g_cVar_bansAllowed = CreateConVar("sm_sleuth_bansallowed", "0", "How many active bans are allowed before we act", 262144, false, 0.0, false, 0.0);
    g_cVar_bantype = CreateConVar("sm_sleuth_bantype", "0", "0 - ban all type of lengths, 1 - ban only permanent bans", 262144, true, 0.0, true, 1.0);
    g_cVar_bypass = CreateConVar("sm_sleuth_adminbypass", "0", "0 - Inactivated, 1 - Allow all admins with ban flag to pass the check", 262144, true, 0.0, true, 1.0);
    g_hAllowedArray = CreateArray(256, 0);
    AutoExecConfig(true, "Sm_SourceSleuth", "sourcemod");
    SQL_TConnect(SQL_OnConnect, "sourcebans", any:0);
    RegAdminCmd("sm_sleuth_reloadlist", ReloadListCallBack, 16384, "", "", 0);
    LoadWhiteList();
    return 0;
}

public OnAllPluginsLoaded()
{
    if (LibraryExists("sourcebans"))
    {
        CanUseSourcebans = true;
    }
    return 0;
}

public OnLibraryAdded(String:name[])
{
    if (StrEqual("sourcebans", name, true))
    {
        CanUseSourcebans = true;
    }
    return 0;
}

public OnLibraryRemoved(String:name[])
{
    if (StrEqual("sourcebans", name, true))
    {
        CanUseSourcebans = false;
    }
    return 0;
}

public SQL_OnConnect(Handle:owner, Handle:hndl, String:error[], any:data)
{
    if (hndl)
    {
        g_hDatabase = hndl;
    }
    else
    {
        LogError("SourceSleuth: Database connection error: %s", error);
    }
    return 0;
}

public Action:ReloadListCallBack(client, args)
{
    ClearArray(g_hAllowedArray);
    LoadWhiteList();
    LogMessage("%L reloaded the whitelist", client);
    if (client)
    {
        PrintToChat(client, "[SourceSleuth] WhiteList has been reloaded!");
    }
    return Action:0;
}

public OnClientPostAdminCheck(client)
{
    new var1;
    if (CanUseSourcebans && !IsFakeClient(client))
    {
        new String:steamid[32];
        GetClientAuthString(client, steamid, 32, true);
        new var2;
        if (GetConVarBool(g_cVar_bypass) && CheckCommandAccess(client, "sleuth_admin", 8, false))
        {
            return 0;
        }
        if (FindStringInArray(g_hAllowedArray, steamid) == -1)
        {
            decl String:IP[32];
            decl String:Prefix[64];
            decl String:query[1024];
            GetClientIP(client, IP, 32, true);
            GetConVarString(g_cVar_sbprefix, Prefix, 64);
            if (GetConVarInt(g_cVar_bantype))
            {
                FormatEx(query, 1024, "SELECT * FROM %s_bans WHERE ip='%s' AND RemoveType IS NULL AND length='0'", Prefix, IP);
            }
            else
            {
                FormatEx(query, 1024, "SELECT * FROM %s_bans WHERE ip='%s' AND RemoveType IS NULL AND ends > %d", Prefix, IP, GetTime({0,0}));
            }
            new Handle:datapack = CreateDataPack();
            WritePackCell(datapack, GetClientUserId(client));
            WritePackString(datapack, steamid);
            WritePackString(datapack, IP);
            ResetPack(datapack, false);
            SQL_TQuery(g_hDatabase, SQL_CheckHim, query, datapack, DBPriority:1);
        }
    }
    return 0;
}

public SQL_CheckHim(Handle:owner, Handle:hndl, String:error[], any:datapack)
{
    decl client;
    decl String:steamid[32];
    decl String:IP[32];
    decl String:Reason[256];
    decl String:text[256];
    if (datapack)
    {
        client = GetClientOfUserId(ReadPackCell(datapack));
        ReadPackString(datapack, steamid, 32);
        ReadPackString(datapack, IP, 32);
        CloseHandle(datapack);
    }
    if (!hndl)
    {
        LogError("SourceSleuth: Database query error: %s", error);
    }
    if (SQL_FetchRow(hndl))
    {
        new TotalBans = SQL_GetRowCount(hndl);
        if (GetConVarInt(g_cVar_bansAllowed) < TotalBans)
        {
            new time;
            switch (GetConVarInt(g_cVar_actions))
            {
                case 1:
                {
                    time = SQL_FetchInt(hndl, 6, 0) * 60;
                    FormatEx(Reason, 255, "[SourceSleuth] %t", "sourcesleuth_banreason");
                }
                case 2:
                {
                    time = GetConVarInt(g_cVar_banduration);
                    FormatEx(Reason, 255, "[SourceSleuth] %t", "sourcesleuth_banreason");
                }
                case 3:
                {
                    time = SQL_FetchInt(hndl, 6, 0) / 60 * 2;
                    FormatEx(Reason, 255, "[SourceSleuth] %t", "sourcesleuth_banreason");
                }
                case 4:
                {
                    FormatEx(text, 255, "[SourceSleuth] %t", "sourcesleuth_admintext", client, steamid, IP);
                    PrintToAdmins("%s", text);
                }
                default:
                {
                }
            }
            ServerCommand("sm_banip \"%s\" %i \"%s\"", IP, time, Reason);
            KickClient(client, Reason);
        }
    }
    return 0;
}

PrintToAdmins(String:format[])
{
    new String:g_Buffer[256];
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (CheckCommandAccess(i, "sm_sourcesleuth_printtoadmins", 8, false) && IsClientInGame(i))
        {
            VFormat(g_Buffer, 256, format, 2);
            PrintToChat(i, "%s", g_Buffer);
        }
        i++;
    }
    return 0;
}

public LoadWhiteList()
{
    decl String:path[256];
    decl String:line[256];
    BuildPath(PathType:0, path, 256, "configs/sourcesleuth_whitelist.cfg");
    new Handle:fileHandle = OpenFile(path, "r");
    while (!IsEndOfFile(fileHandle) && ReadFileLine(fileHandle, line, 256))
    {
        ReplaceString(line, 256, "\n", "", false);
        PushArrayString(g_hAllowedArray, line);
    }
    CloseHandle(fileHandle);
    return 0;
}
 

XaH JoB

Участник
Сообщения
55
Реакции
19
Вроде, от SB++ должен подойти, они там свой реализовывали.
 

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #3
Вроде, от SB++ должен подойти, они там свой реализовывали.
Мне именно под новую серверную нужно, тк там другие команды. Ну и я не видел, чтобы там можно было менять тип бана за обход.
 

XaH JoB

Участник
Сообщения
55
Реакции
19
Мне именно под новую серверную нужно, тк там другие команды. Ну и я не видел, чтобы там можно было менять тип бана за обход.
Ты про плагин materialadmin ? Если да, то нужно просить автора этого плагина.
 

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #5
Ты про плагин materialadmin ? Если да, то нужно просить автора этого плагина.
Тот кто написал плагин, больше не занимается им, если он и будет это делать, то скорее всего платно, а у меня сейчас с деньгами не особо; просить человека, который занимается непосредственно разработкой данного СБ и всем, что с ним связано, как-то не хочется, ибо ему и так забот хватает. В комплекте с тем плагином идёт описание, но так как я не разбираюсь в написании плагинов, для меня это как иностранный язык :biggrin:
@Серый™ , может подскажете, что и где заменить, для правильной работы плагина? :ab:
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,377
@Meowmurmur, проверяй, префикс берёт из конфига плагина materialadmin.
 

Вложения

  • SourceSleuth.smx
    7.8 КБ · Просмотры: 54
  • SourceSleuth.sp
    6 КБ · Просмотры: 96

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #7
@Meowmurmur, проверяй, префикс берёт из конфига плагина materialadmin.
При загрузке плагина выдало такое
[SM] Loaded plugin SourceSleuth.smx successfully.
Unknown command "sm_sleuth_prefix"
В логах ошибок нету, а банить всё равно не хочет. И ещё вопрос, что нужно изменить, чтобы банило по IP? :ab:
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,377
@Meowmurmur, в конфиге убери "sm_sleuth_prefix", возможности банить по ип через натив нету.
Но можешь сделать так:
PHP:
MABanPlayer(0, client, time, Reason);
замени на это
PHP:
char sIP[MAX_IP_LENGTH];
GetClientIP(client, sIP, sizeof(sIP));
ServerCommand("sm_addban %s %d %s", sIP, time, Reason);
 

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #9
@Meowmurmur, в конфиге убери "sm_sleuth_prefix", возможности банить по ип через натив нету.
Но можешь сделать так:
PHP:
MABanPlayer(0, client, time, Reason);
замени на это
PHP:
char sIP[MAX_IP_LENGTH];
GetClientIP(client, sIP, sizeof(sIP));
ServerCommand("sm_addban %s %d %s", sIP, time, Reason);
// C:\Users\Admin\Desktop\sourcemod-1.8.0-git5963-linux\addons\sourcemod\scripti
ng\SourceSleuth.sp(168) : error 017: undefined symbol "MAX_IP_LENGTH"
// C:\Users\Admin\Desktop\sourcemod-1.8.0-git5963-linux\addons\sourcemod\scripti
ng\SourceSleuth.sp(168) : error 009: invalid array size (negative, zero or out o
f bounds)
// C:\Users\Admin\Desktop\sourcemod-1.8.0-git5963-linux\addons\sourcemod\scripti
ng\SourceSleuth.sp(168) : error 036: empty statement
// C:\Users\Admin\Desktop\sourcemod-1.8.0-git5963-linux\addons\sourcemod\scripti
ng\SourceSleuth.sp(168) : fatal error 190: too many error messages on one line
 

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #11
Вроде и работает, но всё равно как-то не так. В той версии, что не хочет работать с materialadmin, вроде проверяется наличие айпишника в банах, если он есть, то человека банит (декомпилятор походу не идеально декомпилировал). А сейчас при наличии моего айпишника в каком-то бане, меня спокойно пускает на сервер.
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,377
@Meowmurmur, я брал версию с форума, а не твой декомпель.

сделай так
ServerCommand("sm_addban %s %d %s", IP, time, Reason);

а это удали
char sIP[MAX_IP_LENGTH];
GetClientIP(client, sIP, sizeof(sIP));
 

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #13
@Meowmurmur, я брал версию с форума, а не твой декомпель.

сделай так
ServerCommand("sm_addban %s %d %s", IP, time, Reason);

а это удали
char sIP[MAX_IP_LENGTH];
GetClientIP(client, sIP, sizeof(sIP));
Теперь вроде работает. А можно как-то сделать, чтобы оно при бане не записывало стим айди и ник? Или так не сделать?
 
Последнее редактирование:

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #15
@Meowmurmur, ну можешь перед
ServerCommand("sm_addban %s %d %s", IP, time, Reason);
написать
KickClient(client, Reason);

Ну ты и извращенец.
Ну что уж поделать, если я привык к банам от SourceSleuth, когда в деталях бана только IP и причина бана :biggrin:
Спасибо огромное за помощь.:ab:
 

kilroy

:clown:
Сообщения
1,065
Реакции
606
  • Команда форума
  • #17
@Meowmurmur, поделишься той кашей, что вы тут наварили?) мне тоже нужно)
Конечно) Если что, тут сделан бан по IP :biggrin: (если тебе именно он нужен). Если по стим айди, то пробуй из этого поста (его я не тестил на работоспособность).
 

Вложения

  • SourceSleuth.sp
    6.2 КБ · Просмотры: 103

wayLANder

Где AlmazON?
Сообщения
1,742
Реакции
577
@Meowmurmur, да не,мне там просто одна штучка интересна, хочу под свои нужды адаптировать, спасибо)
 
Сверху Снизу