Tidier Chat for Source Engine games (Counter-Strike, TF2, etc)

This plugin simply filters out extraneous chat messages

Tidier Chat for Source Engine games (Counter-Strike, TF2, etc)
Photo by ELLA DON / Unsplash

This plugin simply filters out extraneous chat messages, examples include:

[TF2] (Voice): (Voice) xxx: MEDIC! (Spy!, Incoming, Help!)
[TF2] Change class: *You will respawn as Medic or *You will spawn as Medic
[TF2] Arena max streak: Team BLU reached 3 wins! Teams are now being scrambled.
[TF2] Arena team resize: Team size is increasing/decreasing to 3 to accommodate the current player count.
Server cvar change: Server cvar 'sv_tags' changed to alltalk,increased_maxplayers,payload
Connect: Player xxx has joined the game
Disconnect: Player xxx has left the game
Team change: Player xxx has joined team RED

Convar Settings

sm_tidierchat_on (Default: 1)
Enable/disable the plugin
sm_tidierchat_voice (Default: 1)
Remove voice messages
sm_tidierchat_connect (Default: 0)
Remove connect messages
sm_tidierchat_disconnect (Default: 0)
Remove disconnect messages
sm_tidierchat_class (Default: 1)
Remove class change messages
sm_tidierchat_team (Default: 1)
Remove team join messages
sm_tidierchat_arena_resize (Default: 1)
Remove arena team resize messages
sm_tidierchat_arena_maxstreak (Default: 1)
Remove arena team scramble messages
sm_tidierchat_strange_level (Default: 0)
Remove strange level up messages to other players
sm_tidierchat_cvar (Default: 1)
Remove cvar messages
sm_tidierchat_alltext (Default: 0)
Remove all chat messages from plugins
#pragma semicolon 1
#pragma newdecls required

#include <sourcemod>

#define PLUGIN_VERSION "1.0"

ConVar g_cvEnabled;
ConVar g_cvVoice;
ConVar g_cvConnect;
ConVar g_cvDisconnect;
ConVar g_cvChangeClass;
ConVar g_cvTeam;
ConVar g_cvArenaResize;
ConVar g_cvArenaMaxStreak;
ConVar g_cvStrangeLevel;
ConVar g_cvCvar;
ConVar g_cvAllText;

EngineVersion g_engine = Engine_Unknown;

public Plugin myinfo = 
{
    name = "Tidier Chat",
    author = "Unreal1 & thanks to linux_lover",
    description = "Cleans up the chat area.",
    version = PLUGIN_VERSION,
    url = "https://davidivashenko.com"
};

public void OnPluginStart()
{
    CreateConVar("sm_tidierchat_version", PLUGIN_VERSION, "Tidier Chat Version", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);

    g_cvEnabled = CreateConVar("sm_tidierchat_on", "1", "Enable/disable plugin");
    g_cvVoice = CreateConVar("sm_tidierchat_voice", "1", "Clean up voice messages");
    g_cvConnect = CreateConVar("sm_tidierchat_connect", "0", "Clean up connect messages");
    g_cvDisconnect = CreateConVar("sm_tidierchat_disconnect", "0", "Clean up disconnect messages");
    g_cvChangeClass = CreateConVar("sm_tidierchat_class", "1", "Clean up class change messages");
    g_cvTeam = CreateConVar("sm_tidierchat_team", "1", "Clean up team join messages");
    g_cvArenaResize = CreateConVar("sm_tidierchat_arena_resize", "1", "Clean up arena team resize messages");
    g_cvArenaMaxStreak = CreateConVar("sm_tidierchat_arena_maxstreak", "1", "Clean up arena team scramble messages");
    g_cvStrangeLevel = CreateConVar("sm_tidierchat_strange_level", "0", "Tidy strange level up messages to other players");
    g_cvCvar = CreateConVar("sm_tidierchat_cvar", "1", "Clean up cvar messages");
    g_cvAllText = CreateConVar("sm_tidierchat_alltext", "0", "Clean up all chat messages from plugins");

    g_engine = GetEngineVersion();

    HookEvents();
}

void HookEvents()
{
    // Mod-independent hooks  
    HookEvent("player_connect_client", Event_PlayerConnect, EventHookMode_Pre);
    HookEvent("player_disconnect", Event_PlayerDisconnect, EventHookMode_Pre);
    HookEvent("player_team", Event_PlayerTeam, EventHookMode_Pre);
    HookEvent("server_cvar", Event_Cvar, EventHookMode_Pre);
    HookUserMessage(GetUserMessageId("TextMsg"), UserMsg_TextMsg, true);

    // Game-dependent hooks
    switch (g_engine)
    {
        case Engine_TF2:
        {
            HookUserMessage(GetUserMessageId("VoiceSubtitle"), UserMsg_VoiceSubtitle, true);
            HookEvent("arena_match_maxstreak", Event_MaxStreak, EventHookMode_Pre);
        }
        case Engine_CSGO:
        {
            HookEvent("player_connect_full", Event_PlayerConnect, EventHookMode_Pre);
        }
        // Add more game-specific hooks here if needed
    }
}

Action Event_PlayerConnect(Event event, const char[] name, bool dontBroadcast)
{
    if (g_cvEnabled.BoolValue && g_cvConnect.BoolValue)
    {
        event.BroadcastDisabled = true;
    }
    
    return Plugin_Continue;
}

Action Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast)
{
    if (g_cvEnabled.BoolValue && g_cvDisconnect.BoolValue)
    {
        event.BroadcastDisabled = true;
    }
    
    return Plugin_Continue;
}

Action Event_PlayerTeam(Event event, const char[] name, bool dontBroadcast)
{
    if (g_engine == Engine_CSGO)
    {
        dontBroadcast = true;
    }

    if (g_cvEnabled.BoolValue && g_cvTeam.BoolValue)
    {
        if (!event.GetBool("silent"))
        {
            event.BroadcastDisabled = true;
        }
    }
    
    return Plugin_Continue;
}

Action Event_MaxStreak(Event event, const char[] name, bool dontBroadcast)
{
    if (g_cvEnabled.BoolValue && g_cvArenaMaxStreak.BoolValue)
    {
        event.BroadcastDisabled = true;
    }
    
    return Plugin_Continue;
}

Action Event_Cvar(Event event, const char[] name, bool dontBroadcast)
{
    if (g_cvEnabled.BoolValue && g_cvCvar.BoolValue)
    {
        event.BroadcastDisabled = true;
    }
    
    return Plugin_Continue;
}

Action UserMsg_VoiceSubtitle(UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init)
{
    if (g_cvEnabled.BoolValue && g_cvVoice.BoolValue)
    {
        return Plugin_Handled;
    }
    
    return Plugin_Continue;
}

Action UserMsg_TextMsg(UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init)
{
    if (g_cvEnabled.BoolValue)
    {
        if (g_cvAllText.BoolValue) return Plugin_Handled;

        if (g_engine == Engine_TF2)
        {
            char message[32];
            msg.ReadByte();
            msg.ReadString(message, sizeof(message));

            if (g_cvChangeClass.BoolValue && (strcmp(message, "#game_respawn_as") == 0 || strcmp(message, "#game_spawn_as") == 0))
            {
                return Plugin_Handled;
            }

            if (g_cvArenaResize.BoolValue && strncmp(message, "#TF_Arena_TeamSize", 18) == 0)
            {
                return Plugin_Handled;
            }
			
			if (g_cvStrangeLevel.BoolValue && strcmp(message, "#TF_HUD_Event_KillEater_Leveled_Chat") == 0)
            {
                return Plugin_Handled;
            }
        }
    }
    
    return Plugin_Continue;
}
[Any] Tidier Chat - AlliedModders
[Any] Tidier Chat Plugins