135 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
#pragma semicolon 1
 | 
						|
#include <sourcemod>
 | 
						|
 | 
						|
Database g_hDatabase;
 | 
						|
 | 
						|
public Plugin myinfo ={
 | 
						|
    name = "List SourceMod Command",
 | 
						|
    author = "jenzur",
 | 
						|
    description = "Lists SourceMod commands accessible to the client in a menu. just stolen from darthninja",
 | 
						|
    version = "1.0",
 | 
						|
    url = "https://forums.alliedmods.net/showthread.php?p=1524781"
 | 
						|
}; 
 | 
						|
 | 
						|
public void OnMapStart()
 | 
						|
{
 | 
						|
    if (!g_hDatabase)
 | 
						|
    {
 | 
						|
        Database.Connect(SQL_OnDatabaseConnect, "racetimercss");
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        Command_listcmd();
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public void OnPluginStart()
 | 
						|
{
 | 
						|
    if (!g_hDatabase)
 | 
						|
    {
 | 
						|
        Database.Connect(SQL_OnDatabaseConnect, "racetimercss");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public void SQL_OnDatabaseConnect(Database db, const char[] error, any data)
 | 
						|
{
 | 
						|
    if(!db || strlen(error))
 | 
						|
    {
 | 
						|
        LogError("Database error: %s", error);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    g_hDatabase = db;
 | 
						|
    Command_listcmd();
 | 
						|
}
 | 
						|
 | 
						|
public void Command_listcmd()
 | 
						|
{
 | 
						|
	decl String:Command[64];
 | 
						|
	decl String:Description[255];
 | 
						|
	new Handle:hIterator = GetCommandIterator();
 | 
						|
 | 
						|
	new iFlags;
 | 
						|
	decl String:strFlags[64];
 | 
						|
 | 
						|
	/* Start printing the commands to the client */
 | 
						|
	while (ReadCommandIterator(hIterator, Command, sizeof(Command), iFlags, Description, sizeof(Description)))
 | 
						|
    {
 | 
						|
        Format(strFlags, sizeof(strFlags), "");
 | 
						|
        
 | 
						|
        //This still may not be the best way to do this
 | 
						|
        if (iFlags & ADMFLAG_RESERVATION)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_RESERVATION");
 | 
						|
        if (iFlags & ADMFLAG_GENERIC)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_GENERIC");
 | 
						|
        if (iFlags & ADMFLAG_KICK)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_KICK");
 | 
						|
        if (iFlags & ADMFLAG_BAN)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_BAN");
 | 
						|
        if (iFlags & ADMFLAG_UNBAN)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_UNBAN");
 | 
						|
        if (iFlags & ADMFLAG_SLAY)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_SLAY");
 | 
						|
        if (iFlags & ADMFLAG_CHANGEMAP)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CHANGEMAP");
 | 
						|
        if (iFlags & ADMFLAG_CONVARS)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CONVARS");
 | 
						|
        if (iFlags & ADMFLAG_CONFIG)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CONFIG");
 | 
						|
        if (iFlags & ADMFLAG_CHAT)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CHAT");
 | 
						|
        if (iFlags & ADMFLAG_VOTE)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_VOTE");
 | 
						|
        if (iFlags & ADMFLAG_PASSWORD)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_PASSWORD");
 | 
						|
        if (iFlags & ADMFLAG_RCON)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_RCON");
 | 
						|
        if (iFlags & ADMFLAG_CHEATS)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CHEATS");
 | 
						|
        if (iFlags & ADMFLAG_ROOT)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_ROOT");
 | 
						|
        if (iFlags & ADMFLAG_CUSTOM1)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CUSTOM1");
 | 
						|
        if (iFlags & ADMFLAG_CUSTOM2)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CUSTOM2");
 | 
						|
        if (iFlags & ADMFLAG_CUSTOM3)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CUSTOM3");
 | 
						|
        if (iFlags & ADMFLAG_CUSTOM4)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CUSTOM4");
 | 
						|
        if (iFlags & ADMFLAG_CUSTOM5)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CUSTOM5");
 | 
						|
        if (iFlags & ADMFLAG_CUSTOM6)
 | 
						|
            StrCat(strFlags, sizeof(strFlags), "ADMFLAG_CUSTOM6");
 | 
						|
        if (iFlags == 0)
 | 
						|
            Format(strFlags, sizeof(strFlags), "No flag registered");
 | 
						|
 | 
						|
        if (StrEqual(Description, "", false))
 | 
						|
            Format(Description, sizeof(Description), "No description found");
 | 
						|
        //PrintToChatAll("Command: %s Description: %s strFlags: %s", Command, Description, strFlags);
 | 
						|
        char sQuery[2048];
 | 
						|
        int size2 = 2 * strlen(Description) + 1;
 | 
						|
        char[] sEscapedDescription = new char[size2 + 1];
 | 
						|
 | 
						|
        g_hDatabase.Escape(Description, sEscapedDescription, size2 + 1);
 | 
						|
        Format(sQuery, sizeof(sQuery), "INSERT INTO `ze_commands_info` (`command`, `description`, `flag`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `description` = '%s', `flag` = '%s'", Command, sEscapedDescription, strFlags, sEscapedDescription, strFlags);
 | 
						|
 | 
						|
        DataPack hDataPack = new DataPack();
 | 
						|
        hDataPack.WriteString(sQuery);
 | 
						|
        g_hDatabase.Query(SQL_OnQueryCompleted, sQuery, hDataPack, DBPrio_Low);
 | 
						|
    }
 | 
						|
	CloseHandle(hIterator);
 | 
						|
}
 | 
						|
 | 
						|
public void SQL_OnQueryCompleted(Database db, DBResultSet results, const char[] error, DataPack data)
 | 
						|
{
 | 
						|
    if (!db || strlen(error))
 | 
						|
    {
 | 
						|
        char sQuery[2048];
 | 
						|
        ResetPack(data);
 | 
						|
        data.ReadString(sQuery, sizeof(sQuery));
 | 
						|
        LogError("Query error 3: %s", error); 
 | 
						|
        LogError("actual query: %s", sQuery);
 | 
						|
    }
 | 
						|
    delete results;
 | 
						|
    delete data;
 | 
						|
}
 |