[INC] Additional Functions

Manifest

Ура, не такой как все
Сообщения
181
Реакции
128
Данный пользователь был уличен в использовании бэкдора в приватных плагинах. Крайне не рекомендуется покупать какие либо товары у пользователя.
Поскольку когда-то мной разрабатывался RPG с очень гибким (как пластилин) функционалом. Я начал придумывать как можно горе-серверостроителям облегчить задачу по установке модулей.
Генерация конфигов конечно дело хорошее, но без комментариев трудно разобрать работу параметров, а для этого уже требуется вмешательство юзера, что не даёт нам сгенерировать конфигурацию «слёту» для чего я и придумал интересную ф-ию, а также дополнил своеобразную библиотеку.
C++:
/*
*
*                                        ┌────────┐        ┌───────┐
*                                        /    /\   \        |  ┌────┘
*                                       /   /  \   \        |  |
*                                     /   /____\   \    |  |────┐
*                                      |   ______   |    |  |────┘
*                                     └──┘      └──┘    └──┘
*                                 
*       ┌────────────┐    ┌────────┐    ┌─────  ┌──┐  ┌──┐  ┌───────┐  ┌──────┐  ┌─────┐  ┌──────┐
*       |             |      /      /\   \    |     \ |  |  └──┘  |  ┌────┘  |  ┌───┘  |  ┌──┘  └─┐  ┌─┘
*       |  ┌─┐  ┌─┐  |     /   /  \   \    |  ┌─  \|  |  ┌──┐  |  |       |  └───┐  |  └──┐    |  |
*       |  | |  | |  |    /   /____\   \    |  | \  \  |  |  |  |  |────┐  |  ┌───┘  └───┐ |    |  |
*       |  | └──┘ |  |    |   ______   |    |  |  \    |  |  |    |  |────┘  |  └───┐  ┌───┘ |    |  |
*       └──┘      └──┘    └──┘      └──┘    └──┘   └───┘  └──┘  └──┘       └──────┘  └─────┘    └──┘
*
*
*        Библиотека дополняющая/упрощающая работу с базовым функционалом SourceMod
*        Версия: 0.2
*        Автор: Manifest
*        Контакты: VK id247879676 | HLMod @Manifest | Telegram: @official_manifest
*/

#define TO_STEAM3 0
#define TO_STEAM2 1

methodmap Additional_Funcs
{
    public static bool CopyFile(const char[] szFileCopy, char[] szFileNew)
    {
        if (FileExists(szFileCopy)) {
            char sLine[PLATFORM_MAX_PATH];
            Handle hFileOld = OpenFile(szFileCopy, "r");
            Handle hFileNew = OpenFile(szFileNew, "w");
            while (!IsEndOfFile(hFileOld) && ReadFileLine(hFileOld, sLine, PLATFORM_MAX_PATH)) {
                if (TrimString(sLine))
                {
                    WriteFileLine(hFileNew, sLine);
                }
            }
            delete hFileOld;
            delete hFileNew;
            return true;
        } else {
            ThrowError("[AF] File \"%s\" is not exist!");
        }
        return false;
    }
    
    public static int Comment(const char[] sPath, const char[] sParametr, char[] sComment, bool Recusrsive)
    {
        if (FileExists(sPath))
        {
            char szLabel[256];
            char sLine[PLATFORM_MAX_PATH];
                
            int iTime = GetTime();
            Format(szLabel, sizeof szLabel, "action_%d%d", iTime, GetRandomInt(0, 9));     // the label of the file
            char szPathLabel[PLATFORM_MAX_PATH];
            Format(szPathLabel, sizeof szPathLabel, "addons/sourcemod/%s.txt", szLabel);
                
            Handle hFileEdit = OpenFile(sPath, "r");
            Handle hFileFinish = OpenFile(szPathLabel, "w");

            while (!IsEndOfFile(hFileEdit) && ReadFileLine(hFileEdit, sLine, PLATFORM_MAX_PATH))
            {
                ReplaceString(sLine, sizeof sLine, "\n", ""); // test
                if (StrContains(sLine, sParametr) > 0)
                {
                    Format(sLine, sizeof sLine, "%s // %s", sLine, sComment);
                    WriteFileLine(hFileFinish, sLine);
                    
                    if (!Recusrsive)
                        break;
                } else {
                    WriteFileLine(hFileFinish, sLine);
                }
            }
            
            delete hFileEdit;
            delete hFileFinish;
            
            DeleteFile(sPath); // delete original file
            RenameFile(sPath, szPathLabel); // copy new file
        }
        return true;
    }

    public static int ConvertSteam(int ConvertType, const char[] OriginalSteam, char[] ConvertedSteam, int iLen)
    {
        char szBuffer[64];
        strcopy(szBuffer, sizeof szBuffer, OriginalSteam);
        switch (ConvertType)
        {
            case 0:
            {
                if (StrContains(szBuffer, "STEAM_0:1:") > 0)
                    ReplaceString(szBuffer, sizeof szBuffer, "STEAM_0:1:", "", true);
                else
                    ReplaceString(szBuffer, sizeof szBuffer, "STEAM_0:0:", "", true);
                        
                int iDig = StringToInt(szBuffer);
                iDig = iDig * 2;
                Format(szBuffer, sizeof szBuffer, "[U:1:%d]", iDig);   
            }
            case 1:
            {
                ReplaceString(szBuffer, sizeof szBuffer, "[U:1:", "", true);
                ReplaceString(szBuffer, sizeof szBuffer, "]", "", true);
                
                int iDig = StringToInt(szBuffer) / 2;
                int iMod = StringToInt(szBuffer) % 2;
                Format(szBuffer, sizeof szBuffer, "STEAM_0:%d:%d", iMod, iDig);
            }
            
            default:
            {
                strcopy(ConvertedSteam, iLen, "INVALID_STEAM");
            }
        }
        
        strcopy(ConvertedSteam, iLen, szBuffer);
        return true;
    }
}

// Additional_Funcs.CopyFile(const char[] szFileCopy, char[] szFileNew)
Копирует файл из одной директории в другую

// Additional_Funcs.Comment(const char[] sPath, const char[] sParametr, char[] sComment, bool Recusrsive)
То, ради чего вся библиотека и задумывалась
Позволяет комментировать параметры файлов, причём как первого совпадения, так и рекурсивно (всех попадающих под условия параметров)
TODO:
Смещения: Возможность определить порядок комментирования параметра

// Additional_Funcs.ConvertSteam(int ConvertType, const char[] OriginalSteam, char[] ConvertedSteam, int iLen)
Функция протестировать мне так и не довелось, даже не помню насколько она рабочая
Позволяет конвертировать STEAM3->STEAM2 и наоборот
Алгоритм был взят с PHP скрипта и переписан под Pawn

Библиотека будет дополняться, если увижу интересные предложения😁
 
Сверху Снизу