Определение плагина по консольным командам

Nova

Simple Project
Сообщения
262
Реакции
28
Можно ли узнать название плагина по консольным командам, принадлежащим ему? Если да, то как?
 

Nova

Simple Project
Сообщения
262
Реакции
28
Либо гуглить эту команду, либо смотреть исходники плагинов
Ты, видимо, не понял, что я имею ввиду.
Допустим, есть плагин plugin1.smx, у него несть команда sm_cmd. А я знаю эту команду, но не знаю название плагина. И поэтому хочу его узнать, используя известную мне команду (sm_cmd), принадлежащую плагину. К тому же название плагина можно поменять, а консольная команда не изменится.
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
sm cmds Номер_Плагина
Номер плагина можно узнать командой sm plugins list
Напиши команду в теме, может кто подскажет?
 

Nova

Simple Project
Сообщения
262
Реакции
28
sm cmds Номер_Плагина
Номер плагина можно узнать командой sm plugins list
Напиши команду в теме, может кто подскажет?
Да не в команде дело. Команда может быть любая, абсолютно. Суть в том, чтобы через неё получить название плагина, которому она принадлежит.
 
Последнее редактирование:

Kailo

Участник
Сообщения
194
Реакции
896
Правильного и простого способа сделать это нет!
Создатели sourcemod не предоставили такого функционала, хотя по факту это очень просто и достаточно дописать пару строк, чтобы итератор команд (GetCommandIterator, ReadCommandIterator) еще дополнительно возвращал Handle плагина зарегистрировавшего команду. Но добавили они эти функции только лишь из личных нужд, чтобы реализовать команду sm_help и в текущем виде им этого достаточно.
Что же остается: изменения SM или написание расширения мы отвергам и нам остается лишь один возможный способ - костыли.
Команда "sm cmds" позволяет вывести список команд созданных конкретным плагином, это мы и используем.
Производим итерацию по плагинам с помощью (GetPluginIterator, ReadPlugin, MorePlugins)
Получем имя плагина (GetPluginFilename), вызываем вывод списка его команд через ServerCommandEx вида "sm cmds <plugin_name>", получив результат выведенного командой.
Предварительно требуется изучить вид выводимого командой и написать парсер вывода, что бы получать имена команд, которые мы можем сравнить с нашей командой, при совпадении прекращаем итерацию и берем Handle текущего плагина в итерации, это и есть искомый.
 
Последнее редактирование:

Nova

Simple Project
Сообщения
262
Реакции
28
Получилось. Может кому пригодиться.
PHP:
public OnPluginStart()
{
    RegAdminCmd("sm_find", Command_FIND, 2, "Find plugin(s) by command");
}

public Action:Command_FIND(client, args)
{
    new Handle:hPluginIter = GetPluginIterator();
    decl String:sPluginFilename[256];
    decl String:sBuffer[10240];
    decl String:sCmdArg[128];
    GetCmdArg(1, sCmdArg, sizeof(sCmdArg));
 
    if (args)
    {
        if (CommandExists(sCmdArg))
        {
            while (MorePlugins(hPluginIter))
            {
                GetPluginFilename(ReadPlugin(hPluginIter), sPluginFilename, sizeof(sPluginFilename));
                ServerCommandEx(sBuffer, sizeof(sBuffer), "sm cmds %s", sPluginFilename);
             
                if (StrContains(sBuffer, sCmdArg, true) != -1)
                {
                    Format(sPluginFilename, sizeof(sPluginFilename), "%s", sPluginFilename);
                    break;
                }
                else
                {
                    sBuffer[0] = '\0';
                }
            }
        }
        else
        {
            sBuffer[0] = '\0';
            ReplyToCommand(client, "[SM] Command \"%s\" not found.", sCmdArg);
        }
    }
    else if (args != 1)
    {
        ReplyToCommand(client, "[SM] Usage: sm_find <command>");
        return Plugin_Handled;
    }
 
    if (sBuffer[0] != '\0')
    {
        new Handle:hPluginFlename = FindPluginByFile(sPluginFilename);
        decl String:sPluginName[256];
        GetPluginInfo(hPluginFlename, PlInfo_Name, sPluginName, sizeof(sPluginName));
        ReplyToCommand(client, "[SM] Command by plugin %s (%s).", sPluginName, sPluginFilename);
    }
 
    CloseHandle(hPluginIter);
    return Plugin_Handled;
}
 

Nova

Simple Project
Сообщения
262
Реакции
28
А чего раньше это не скинули? :mda:
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
раньше не видел
или видел, но забыл
а тут недавно наткнулся на сам плагин и этот пост увидел снова
есть ещё плагин, который позволяет выгружать плагины, которые находятся по их командам, вот только не помню где именно видел
 
Сверху Снизу