STonitor

Table of Contents

Installation

There are two ways to install STonitor, you can use the provided Installer for Windows, or you can install it manually. The Installer is not guaranteed to work, and may potentially cause a false-positive in your antivirus software. If you are concerned about this, you can install it manually.

Installer

As of version 2.2.0, STonitor has an installer for Windows. This is the easiest way to install STonitor, although less stable than the manual installation (if you know what you’re doing when performing the manual installation).

Downloading the Installer
  1. Head over to the releases page and grab the latest version. This link also brings you there.

  2. Once you’ve found a proper release, check the assets section near the bottom and download the Installer (STonitor_Setup_X.X.X.exe, the Xs are version numbers).

Running the Installer

Once you have the Installer downloaded, you’ll need to run it. In order to do this, head over to the location where you downloaded the Installer, and double-click it. Windows SmartScreen may pop up, warning you about the Installer being potentially unsafe, this is because the Installer is not signed. You can safely ignore this warning and continue with the installation by clicking More info, then Run Anyway.

Continue through the installation process, and you should be good to go! Once the installation is complete, you can get started on the Setup.

Manual Installation

STonitor’s manual installation is neither streamlined or easy, depending on how experienced you are with things like this, things may go wrong (solutions to some common issues may be available in the FAQ). If you want something easy to install, you can use the Installer or check out Sonitor by MSWS.

Emphasis and warnings aside, the installation instructions below are fairly detailed, as long as you follow them, you should be fine. This installation process is also fairly standard, if you encounter an issue not covered in the FAQ, you’ll likely be able to find a solution fairly fast by Googling it.

Installing Python

STonitor is made using Python, and needs Python to run. If you’ve already installed a 3.X version, great, you can skip this part. If not, follow the steps below:

  1. Download a 3.X version of Python, to do so, head to Python’s official site. Don’t install the version on the Microsoft Store, that commonly causes odd problems.

    Note

    This program was developed on the 3.8.2 version, however the majority of modern v3.X versions should all work fine

  2. Run the installer (may differ depending on Operating System).

    Attention

    Be on the lookout for a checkbox labeled Add to PATH while installing, make sure that it’s checked or you’ll likely run into issues.

  3. Once the installation has been completed, test it. Open up a command prompt window and type python --version.
    • If the version number you installed pops up, it’s installed properly, congrats!

    • If the command is unrecognized, make sure that it’s installed properly AND added to PATH.

    • If the version number is wrong, you may already have a version installed, as long as it’s 3.X, you can use it.

Downloading STonitor

Congrats on installing Python. The next part is fairly straightforward, download the most recent version of STonitor.

  1. Head over to the releases page and grab the latest version. This link also brings you there.

  2. Once you’ve found a proper release, check the assets section near the bottom and download the one labeled Source code (zip).

  3. When the download has finished, extract the ZIP file to your location of choice. This is where the program will reside, so it’s recommended not to leave it in Downloads and rather someplace accessible and memorable.

Installing Requirements

That was easy, wasn’t it? This one’s slightly harder, but still not horrible. We’re going to be installing the packages (requirements) that are needed for STonitor to operate properly.

  1. Open up a command prompt window and navigate to the folder where you installed STonitor. There are multiple ways of doing this, here’s the most common two:
    • This is the fastest way. Open up Windows Explorer to where you extracted STonitor, then click the address bar (the thing at the top that shows where you are) and enter cmd then press enter. This will automatically open up command prompt to the proper location

    • This is another slower way if the first one doesn’t work out. Press Windows + R, and enter cmd in the Run dialog. Press enter and it’ll open Command Prompt, after that, cd (change directory) to where you installed STonitor. To do so, enter cd path/to/stonitor/here, replacing path/to/stonitor/here with the path to STonitor’s install location

  2. Once you’ve opened up a command prompt window and properly navigated to STonitor’s install location (make sure you’re in the root folder, that’s the folder that has the file named requirements.txt), enter the following command: pip install -r requirements.txt. You should see an output and multiple progress bars installing the packages.

    Tip

    If it says command not found, first try to replace pip with pip3. If it still doesn’t work, try to replace it with python -m pip. If it still doesn’t work, go back and make sure you installed Python properly.

    Tip

    If it says that it couldn’t find requirements.txt, make sure you’re in the right folder

  3. Make sure that everything has been properly installed (you should see Successfully installed then a lot of names)

Done

Congrats! You’ve finished the installation portion, now get started on the Setup.

Setup

Now that installation is done, it’s pretty much all a breeze from here on out. This section is a short one, first time setup before you start to use STonitor.

Configure CS:GO AutoExec

By default, CS:GO doesn’t output it’s console anywhere, in order for this program to work, we need to change that. Luckily it’s pretty simple!

  1. Open up a file explorer window and navigate to your CS:GO cfg directory, for most people, it’s at: C:/Program Files (x86)/Steam/steamapps/common/Counter-Strike: Global Offensive/csgo/cfg.

  2. In that folder, open the file named autoexec.cfg (if this file doesn’t exist, that’s fine, create one that’s named that exactly)

  3. Near the end of the file, add this line in: con_logfile output.log

  4. Save the file

  5. Run CS:GO once so that the file gets generated (STonitor checks if it exists before running)

Hint

Make sure you have “Show File Extensions” enabled in Windows Explorer, otherwise you’ll end up with a file named autoexec.cfg.txt which won’t work. This can be enabled in the View tab of Windows Explorer.

Run STonitor

Run STonitor, how this is done depends on how you installed it. If you installed STonitor via the Installer, simply double-click the Desktop Shortcut, or find it in the run menu (the same way you do any other program).

If you performed a manual installation, open a command prompt window to STonitor’s installation location (see the Installation section if you forgot how to do so) and enter python STonitor.py.

The program will open and notify you that there were missing data files and that it created them. This is normal for first time setup. It will also ask you whether you want to open the data folder, enter Y, then press enter.

Fill in Settings

Open the data folder (the program should have automatically opened it for you if you asked it to, if you didn’t, see the FAQ entry on the location of the data folder). Inside this data folder, you’ll find a file named settings.yaml. The majority of parameters will already have a default value set, you can change them as needed to your preferences however. This documentation page tells you what each of the parameters in the file mean. You can open this file in most file editors, Notepad (or Notepad++ for the more advanced) will work perfectly fine.

Fill in the Steam API Key

In settings.yaml you’ll find an empty parameter named steamkey. If you want to use the steam account age (and/or CS:GO playtime) feature, you’ll need to fill this in. A steam API key is what is used to authenticate with Steam in order to retrieve this data. Luckily getting one is a piece of cake, head on over to this steam page and you can easily get one (you will need to login). Once you’ve gotten one, paste it into the file. It should look something like this: steamkey: '31312ANDSAHW1324' (actual steamkey in the example is made up, yours will likely be longer and look different).

All Set

Once you’ve adjusted all of the settings to your liking, STonitor is ready to go. To run it, simply double-click the desktop shortcut (if you used the Installer), or navigate to the folder in Command Prompt and enter python STonitor.py (if you performed a manual installation).

It’s fairly straightforward to use, but if you don’t know how to use it or want a refresher, head on over to Usage.

Using a Batch File (only for manual installation)

If you performed a manual installation and don’t want to have to bother with command prompt everytime, you can also use a batch (.bat) file to run it. Batch files basically run a sequence of command prompt commands automatically when you run it (if you’re on Linux, use bash, it’s fairly similar and you probably already know how to). Using one is fairly easy, follow the below instructions:

  1. Find the location want the Batch file to be. Right click, hover over new, then click Text Document.

  2. Make sure File name extensions is checked in the View tab of Windows Explorer.

  3. When it asks you for a name (this step is important), press Ctrl + A (select all text), and enter STonitor.bat. It doesn’t have to start with STonitor, it can be whatever you like as long as it ends with .bat.

  4. It’ll tell you that changing a file’s extension can make it unusable, it’ll be perfectly fine, click Yes.

  5. Right click the file that it’s created, then click Edit

  6. Paste the following code into the file and save it, replace the path in the example with the full path to where you installed STonitor.

@echo off
cls
title STonitor
cd C:/Users/Username/Desktop/STonitor
python STonitor.py
pause

Hint

You can also move this file to your Home directory (this is usually C:\Users\Username\) so that you can just enter the filename of the bat file in Run (Windows + R) to access it easier. E.g. if your filename is stonitor.bat, you can just enter stonitor in Run for it to open.

Usage

How to use JB Log Analysis

When a new JB log is detected in the console output, STonitor will automatically parse it and output data according to each of it’s sub-features. No manual user input is needed. It’ll generally be in the format:

<header here>
JB Logs (<date and time here (matches filename if saving is enabled)>)
<summary output here>

<sub-feature name>:
<sub-feature output>

Sub-feature name and sub-feature output repeats for every enabled sub-feature that has at least 1 detection.

How to use TTT Log Analysis

When a new TTT log is detected in the console output, STonitor will automatically parse it and output data according to each of it’s sub-features. No manual user input is needed. It’ll generally be in the format:

<header here>
TTT Logs (#<round number here>)
<summary output here>

<sub-feature name>:
<sub-feature output>

Sub-feature name and sub-feature output repeats for every enabled sub-feature that has at least 1 detection.

How to use Log Saving

If enabled, logs are automatically saved to your computer. If you want to access these logs, open the data folder, then the logs folder. Inside will be numerous text files. TTT text files are stored according to round number (the thing that gets outputted at the start of every log), for example: TTT_123456.txt. JB text files are stored according to the date and time up to milliseconds of the log being parsed (milliseconds are there to prevent overwriting previous logs in case your computer is too fast and your check interval is low), for example: JB_Dec-29-2021_15-19-56_773927.txt.

How to use Steam Account Age Checking

Open up your CS:GO developer console, and type status while you’re in a server. The program will detect it being outputted and automatically parse and retrieve the desired data. This may take a while depending on how many people are cached, how many are on the server, your internet speed, your computer specs, and what not. You will see a header and the words Processing status, this may take a while... fairly quickly however.

Here’s what a full output line looks like, not all players will have everything depending on account privacy settings:

# 228 =(eGO)= MSWS    5 years and 3.05 months    (GPT: 3 months and 10.16 days) (SPT: 31 days 06:49:14 hours)

it’s in the format:

# <player id> <name> <steam age> (GPT: <CS:GO playtime>) (SPT: <server playtime>)

If an account has a ~ infront of the account age, that means that the account is private and the age was guessed.

Attention

There may be a couple issues associated with status parsing.

If the status doesn’t get detected, try run the status command again, this is because if it happens to be outputted as a output.log clear happens, it doesn’t get detected.

Sometimes, if the server is too full, the footer (#end) doesn’t get outputted. This causes the program to freak out and recover by cancelling parsing and flushing logs. If this happens, you can print the footer yourself by entering echo #end in console quickly after issuing status. This tricks the program into thinking the status finished successfully. (You may get 1 or two invalid lines but that’s fine).

How to edit Settings

To edit settings, open the data folder, then edit the settings.yaml file as if it were a text (.txt) file. If you want to know what each option does, go to the Settings page.

Settings

Here’s a list of all of the currently available settings parameters, and what they do

  • output_file: Full path to where the CS:GO output.log file is located, the prefilled value is the default for most people. Default Value: C:/Program Files (x86)/Steam/steamapps/common/Counter-Strike Global Offensive/csgo/output.log

  • steamkey: Your steam API key, needed to use the account age and CS:GO playtime features. Example Value: 12345A789101234FJ32U

  • check_delay: The delay in between the program checking the output.log file for new contents, in seconds. The lower it is the faster you get results but the more resources the program uses.. Default Value: 5

  • clear_output_log: Boolean (true/false) of whether output.log should be cleared once STonitor is done with it, this prevents repeat output (a runtime caching solution is implemented for JB & Status and a round number session solution for TTT in the case that you turn this off). Default Value: true

  • clear_on_start: Boolean (true/false) of whether output.log should be cleared when STonitor starts. Default Value: false

  • clear_on_error: Boolean (true/false) of whether output.log is automatically cleared on error to attempt to fix corrupted log issues. Upside is less crashes, downside is potential lost log.. Default Value: true

  • confirm_exit: Boolean (true/false) of whether the program will ask you to confirm exiting by pressing enter. This may not work in all cases (certain errors at certain locations will bypass this). Default Value: true

  • update_check: Boolean (true/false) of whether the program will check for newer versions on run. Default Value: true

  • constants_check: Boolean (true/false) of whether the program will check for non-expected constants on run. Default Value: true

  • show_disclaimer: Boolean (true/false) of whether the program will show a disclaimer when it starts. Default Value: true

  • header: The header that gets outputted before each program output session/log analysis. In order to create new lines, just press enter to make a new line as you would in any other file. This value must be in single quotes (‘). Example Value: ====================

  • logs:
    • save_logs: Boolean (true/false) of whether logs should be saved to a .txt file for archival purposes. Default Value: true

    • jb:
      • enable: Boolean (true/false) of whether JB log analysis should be enabled. Default Value: true

      • subfeatures: Boolean (true/false) toggles for whether each subfeature in JB log analysis is enabled
        • early_vent: Notifies when a CT breaks vents before any prisoner does. Default Value: true

        • wardenless_kill: Notifies when a CT kills a non-rebelling T without a warden. Default Value: true

        • new_warden_kill: Notifies when a CT kills a non-rebelling T within X seconds of someone becoming warden, X is set in the limits section. Default Value: true

        • st_kill: Notifies when a CT kills an ST. Default Value: true

        • button_grief: Notifies when someone presses a button and players take more than X damage from the world within Y seconds, X and Y are set in limits. Default Value: true

        • nades: Notifies when someone throws a nade/utility (flash, HE, molotov, etc) and players take more than X damage from the world within Y seconds, X and Y are set in limits.. Default Value: true

        • mass_freedamage: Notifies when a CT throws a nade and more than X Ts take damage within Y seconds, X and Y are set in limits. Default Value: true

        • gunplant: Notifies when a T picks up a CT’s weapon before that CT dies. Default Value: true

      • limits: Various configuration values for the sub-features above
        • button: Number of seconds after someone presses a button that the program will be looking for damage from the world. Default Value: 10

        • nade: Number of seconds after someone throws utility that the program will be looking for damage from the world. Default Value: 10

        • warden: Number of seconds after someone becomes warden that the program will be looking for potential freekills. Default Value: 5

        • freeday_delay: Number of seconds after warden passes or gets fired that the program will begin looking for potential freekills. Default Value: 10

        • mass_freedamage: Number of seconds after a CT throws a nade that the program will be looking for Ts taking damage from that person using that nade. Default Value: 5

        • mass_freedamage_threshold: Number of unique players that take damage from a CT’s nade before it’s considered potential mass freedamage. Default Value: 4

        • world_damage_threshold: Minimum amount of damage for someone to take from the world for it to be considered in button grief detection and nade disruption detection. Default Value: 15

        • ignore_warden_button: Boolean (true/false) of whether warden is counted in button grief detection. Default Value: true

        • gunplant_show_time: Boolean (true/false) of whether to show the timestamp when outputting gunplant detection. Default Vaue: true

      • summary_output: Boolean (true/false) to enable various types of actions to be shown in the JB summary output
        • kills: Whether kills are shown in the JB summary output. Default Value: true

        • warden: Whether someone becoming warden is shown in the JB summary output. Default Value: true

        • warden_death: Whether warden dying is shown in the JB summary output. Default Value: true

        • pass_fire: Whether warden passing or being fired is shown in the JB summary output. Default Value: true

        • damage: Whether someone being damaged is shown in the JB summary output. Default Value: false

        • vents: Whether someone breaking vents is shown in the JB summary output. Default Value: false

        • button: Whether someone pressing a button is shown in the JB summary output. Default Value: false

        • drop_weapon: Whether someone dropping a weapon is shown in the JB summary output, note that CTs dying counts as them dropping their weapons (don’t worry, gunplant detection handles this). Default Value: false

        • pickup_weapon: Whether someone picking up a weapon is shown in the JB summary output. Default Value: false

        • world: Whether to show an action if the attacker is the world (game deaths/fall damage deaths). Default Value: true

    • ttt:
      • enable: Boolean (true/false) of whether TTT log analysis should be enabled. Default Value: true

      • subfeatures: Boolean (true/false) toggles for whether each subfeature in TTT log analysis is enabled
        • rdm: Notifies when a player may have RDMed someone. By default, reason will be detected (configurable in limits). Default Value: true

        • mass_rdm: Notifies when a player may have mass RDMed. By default, reason will not be detected (configurable in limits). Default Value: true

        • inno_utility: Notifies when an innocent or detective throws utility and someone gets damaged by it. Default Value: true

        • wallhack_purchase: Notifices when a Traitor purchases wallhack. Default Value: true

      • limits: Various configuration values for the sub-features above
        • rdm_detect_reason: Boolean (true/false) of whether reason is detected for normal RDMs. All reason detection is is going back in logs to check if the victim of an RDM attacked/damaged the attacker/potential RDMer first. If they did, it’s not considered RDM. Default Value: true

        • mass_rdm: Number of RDMs for a player to be considered Mass RDMing. Default Value: 2

        • mass_rdm_detect_reason: Boolean (true/false) of whether reason is detected for mass RDMs. See description of ``rdm_detect_reason`` for how reason detection works. Default Value: false

        • utility_bad_only: Boolean (true/false) of whether only bad damage is counted for inno utility detection. Default Value: false

      • summary_output: Boolean (true/false) to enable various types of actions to be shown in the TTT summary output
        • kills: Whether kills are shown in the TTT summary output. Default Value: true

        • damage: Whether damage is shown in the TTT summary output. Default Value: false

        • id: Whether body IDing is shown in the TTT summary output. Default Value: false

        • dna_scan: Whether Detective DNA scans are shown in the TTT summary output. Default Value: false

        • tase: Whether tasing is shown in the TTT summary output. Default Value: true

        • shop: Whether shop purchases are shown in the TTT summary output. Default Value: false

  • age: Steam account age, CS:GO playtime, and server playtime
    • enable: Boolean (true/false) of whether status/age detection should be enabled. Default Value: true

    • cache: Boolean (true/false) of whether to cache account ages (this significantly minimizes the number of API calls, speeding the program up significantly). Default Value: true

    • subfeatures: Boolean (true/false) toggles for whether each subfeature in TTT log analysis is enabled
      • csgo_playtime: Whether CS:GO playtime for accounts is retrieved (when available). Default Value: true

      • server_playtime: Whether server playtime for accounts is retrieved. Default Value: true

    • private: Configuration options specifically for private accounts
      • enabled: Boolean (true/false) of whether private account age guessing is enabled. This is done by checking the account ages of accounts made immediately after the private account to estimate the age of the private account. Default Value: true

      • tries: Number of tries for private account age detection (number of accounts after private account) to try before giving up. Default Value: 10

  • colours: Settings regarding coloured output of STonitor. Valid colours are black, red, green, yellow, blue, magenta, cyan, and white
    • enable: Boolean (true/false) of whether output should be coloured. Default Value: true

    • time: Colour for outputs related to time. Default Value: cyan

    • name: Colour for player names. Default Value: magenta

    • button_name: Colour for names of buttons. Default Value: yellow

    • weapon_name: Colour for names and types of weapons. Default Value: yellow

    • damage: Colour for damage numbers (points of damage, number of players damaged/killed, etc). Default Value: red

    • role: Colour for player role names. This setting can be set to “automatic”, in which the colour will be based off of their role. This can cause overlap of colours. Default Value: automatic

    • age: Colour for player steam account age in Steam Age output. Default Value: cyan

    • level: Colour for player level in Steam Age output. Default Value: red

    • game_playtime: Colour for playtime of game in Steam Age output. Default Value: yellow

    • server_playtime: Colour for playtime on the server in Steam Age output. Default Value: green

Changed in version 2.1.1: Removed jb/limits/gunplant as new gunplant detection system no longer uses it

Changed in version 1.0.1: Removed min_session_save_interval as session is no longer used

Constants

Constants is another configuration file that’s a bit more complicated. Generally you shouldn’t ever touch anything in here unless instructed to or you know exactly what you’re doing.

  • ttt:
    • regex: Named regex for each type of action listed

    • log_header: Full line of the header indicating the start of TTT logs

    • log_separator: Full line of the footer/separator indicating the end of TTT logs

    • utility_weapon_names: List of weapon names that count as utility

    • wallhack_name: Name of the wallhack item when purchased from the shop

  • jb:
    • regex: Named regex for each type of action listed

    • log_header: List of all 3 lines that indicate the start of JB logs

    • log_separator: List of all 3 lines that indicate the end of JB logs

    • utility_weapon_names: Pairs of utility names and their corresponding weapon names

    • utility_names: Utility names to ignore for gunplant detection

  • age:
    • regex: Named regex for each line in status

    • header: Full line of the header indicating the start of a status output

    • footer: Full line of the footer indicating the end of a status output

    • gameme:
      • playerinfo_url: URL to GameME player info redirect page without a trailing /.

      • game_code: Pairs of IPs and their corresponding game codes on GameME

  • connected_regex: Regex to detect ``Connected to <ip here>`` lines

  • error_threshold: Number of errors the program will attempt to recover from before exiting

  • github_release_latest: URL to latest GitHub releases page for STonitor

Buttons

STonitor has a button configuration YAML file. This can be used to create aliases/nicknames for button names or button IDs in Jailbreak logs, it can also be used to specify that you wish for that button to be ignored in JB log parsing (for things like button griefs), this is mostly used for safe buttons to lower the amount of false positives (like cells opening or buttons similar to that). You can find the file in data/buttons.yaml in STonitor’s directory. There are already some default values filled in.

The file itself is split into two large categories: normal and regex. Normal allows you to specify individual button names or IDs to configure them, and is pretty simple to use. Regex allows you to use RegEx(p) to specify groups of button names, Regex is fairly advanced and it’s not recommended you use it unless you know what you’re doing.

Each configuration regardless of if it’s normal mode or regex mode has two parameters (ignore and alias). A simple example using normal button names is the following:

celldoors:
  ignore: true
  alias: Cell Button

The ignore value in each configuration can be either true or false. true means that that button will be ignored in detection operations (such as button grief detection). false means that it will still be detected (this is the default value).

The alias value is to specify an alias for that specific button. In the example above, celldoors will be replaced with Cell Button when it’s shown in STonitor’s output. null means the name will be unchanged (this is the default value)

If you’re inexperienced with YAML, it’s recommend you add single quotes to the start and end of each value, to avoid you accidentally using formatting characters (ignore and alias are fine, no need to add quotes around them). true, false, and null should not be surrounded with quotes either as they are not literals (unless you want the name of a button to be null for some reason, then surround it with quotes in that case). The above example would become:

'celldoors':
  ignore: true
  alias: 'Cell Button'

Both ignore and alias must be present even if they’re not being used. If you do not fill in one of the required arguments, it will be created with default values. For ignore, the default is false, for alias, the default is null.

Normal

Normal mode is easy, specify the button name that shows in logs (as shown above, celldoors is the button name in that example). If you want to use a Button ID, use the format '#id here', for example: '#12345'. Note that using single quotes IS A MUST in this case, as # is a formatting character in YAML. Here are examples for both methods (ignore and alias are random values in both examples):

Button Name
'celldoors':
  ignore: true
  alias: 'Cell Button'
Button ID
'#123456':
  ignore: false
  alias: 'Some random button'

Regex

Warning

Do not use Regex unless you know exactly what you’re doing

STonitor uses re.fullmatch with the Regex and button name (you can’t use Regex for Button IDs), this means that the Regex must fully match the button name, not just contain a match to the Regex. If you want it to just need to contain the Regex, add .* to the start and end of the regex. It’s recommended to use Regex101 to build your Regex and test if it works properly (make sure to set the flavor to Python).

To use Regex, simply put the regex where Button Name and Button ID would be in normal mode. For example:

'piano_key_\ws?':
  ignore: true
  alias: Piano Key

Note: Precedence

Normal takes precedence over Regex, which means that if something is both a match for a normal config and a regex config, the normal config is the one that will be used.

Both normal and regex are processed in order, which means that if something matches both the first and last value, the config of the first value is the one that will be used.

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

[2.3.0] - 2023-04-07

Added
  • New log types to TTT Summary Output

    • Body IDing

    • Detective DNA Scans

    • Tasing

    • Shop Purchases

  • Automatic checking for updated constants

  • Add detection for wallhack purchases

  • Option to show time for gunplant detection

Changed
  • Added option to clear output.log on program start

  • Cleaned up TTT implementation

  • Ignore gunplant detection in LR/LG

Fixed
  • Outdated default GameME link for eGO

  • Ensured that users can see the FileNotFound error when searching for output.log

  • Various minor errors in the documentation (spelling, old information, etc)

[2.2.0] - 2022-11-04

Added
  • Shows disclaimer on startup

  • Created installer for Windows

Changed
  • Added healthshot to gunplant ignore

  • Updated GitHub update checking URL to new one

  • Moved data folder to native data location (APPDATA, .config)

  • Documentation updated to reference Windows installer

  • The program now asks if you want to open the data folder if it generates it

  • Clarify additional step in manual BAT setup instructions

Fixed
  • Incorrect default colours listed in settings documentation

  • Typo in default button config

  • TTT summary output not showing damage dealt

  • Edge case in which the program would crash if there was a specific issue retrieving account age

  • Broken update checking as a result of repo URL change

[2.1.2] - 2022-05-15

Changed
  • Default colours so that they’re more readable with default Command Prompt

Removed
  • Unused colour playtime

[2.1.1] - 2022-05-15

Added
  • jb_undertale pictionary draw button to default ignore

  • Various entries regarding JB logging in the known bugs documentation page

  • Coloured output to make wall of text easier to understand

  • ST kill detection

  • Summary output for weapon pickup

Changed
  • Better invalid status line logging

  • Version number now shows in ready message

  • Gunplant detection now simply checks if a T picks up a CT’s weapon before that CT dies

Fixed
  • Outdated default GameME link for eGO

  • Space padding incorrect on button grief output

  • Fix odd invalid status line error

  • Typo in documentation index page

Removed
  • Feature list is no longer shown in README

[2.0.1] - 2022-01-20

Fixed
  • Regex not matching status lines when space padded

[2.0.0] - 2022-01-20

Added
  • Clarification on common status issues in documentation

  • Check if output.log exists at runtime

  • Ability to hide world actions from summary output

  • Steam level to status

  • Basic support for new ST role in logs

  • FAQ entry for new GameME detections

  • Known bugs page on documentation

  • Show error message on status error

  • Button ignore & alias file

Changed
  • Output.log now opens in UTF-8 encoding

  • Non-context roles now show as T/CT to avoid confusion

  • Rewrote status parsing code to have less spaghetti

  • Other retrievable options are still retrieved if account is private now

Fixed
  • KeyError on invalid weapon name (MFD Detection)

  • Status getting stuck wo/ #end

  • Multi-parse edge cases causing odd bugs

  • Early vent false positive on some maps

[1.1.2] - 2022-01-01

Fixed
  • Damage regex not triggering if damage was headshot

[1.1.1] - 2021-12-31

Added
  • Ability to retrieve server playtime using GameME

[1.0.1] - 2021-12-31

Added
  • Ability to wipe output.log on error to try to automatically resolve errors arising from corrupted logs

Changed
  • Exempt potential FK/FD during LR and LG instead of just LG

  • TTT now uses caching similar to status and JB

  • Parsed arrays are now cleared as soon as output.log is cleared to minimize unneeded memory usage

Fixed
  • LR detection reporting wrong death

  • IndexError in case of corrupted TTT logs

  • TTT full logs not being parsed if sm_logs was run during the round to retrieve partial log

Deprecated
  • session.json is no longer used, and can be removed

[1.0.0] - 2021-12-30

Initial release, no changes

Known Bugs

Bugs that are currently known about the program, recommended to check this page in latest view for the most up to date information.

Logs Parsing

JB
  • LR/LG detection can be incorrect for any one of the following reasons, there’s no practical way to eliminate all of these issues:
    • If someone does absolutely nothing that gets logged in the entire round, it will break LR/LG detection

    • If someone joins in the middle of the round and runs !ghost

  • If someone gets respawned in the middle of the round, STonitor will ignore all logs about that person from their death point forward. This is an unintentional side-effect of an intentional feature.

TTT

Status Parsing

  • When parsing a very long status, #end doesn’t output properly, this is an issue with CS:GO.

Frequently Asked Questions

I’m getting python or pip is not recognized as an internal or external command

Make sure that it was installed properly, that you checked Add to PATH during the initial installation process, and that you didn’t use the Windows/Microsoft Store version. If you did any any of those, uninstall and reinstall Python, if it still doesn’t work, you can try to email me or contact me on Discord to resolve it. I’d recommend Googling first though as it’s highly likely someone’s already had the exact same issue as you did.

I messed up something in the settings, what should I do?

Delete the settings.yaml file (in the data folder), and it’ll be regenerated with default values. You’ll have to change the settings again to the values you want and fill in the API key again however.

I messed with the constants file, and now the program isn’t parsing lines correctly

Delete the constants.yaml file (in the data folder), and it’ll be regenerated with the proper working default values.

Can I add more GameME server IPs to playtime detection?

Yes, provided that they’re under the same GameME page as the existing entries, you can. To do so, go to constants.yaml (in the data folder), go to age -> gameme -> game_code. You can then add the IP you want in the following format:

{ip here}: {game code here}

Replace {ip here} with the IP address of the server you wish to add, and replace {game code here} with the GameME game code of the specific server you want to add (to get this, go to the GameME page of the server you want to add and look at the URL, it’ll be visible after the domain. For example csgo3 is the gamecode in the URL edgegamersorg.gameme.com/csgo3)

Early Vents keeps showing despite no CT breaking vents

There is a bug that occurs on some JB maps in which when a CT opens cells, it gets counted as breaking a vent or wall. There is a feature that attempts to mitigate this by checking if the last action was the CT pressing a button, but this isn’t foolproof.

Account age output is really slow, what can I do about this?

Unfortunately, account age detection is really slow as it involves a large amount of web requests, and is poorly optimized at the moment. Enabling the cache if it isn’t already is helps a fair bit. Disabling a couple features will be the most noticeable however. GameME (server playtime) takes the longest, as it requires scraping the GameME site, then parsing the HTML (TL;DR it takes a while). Disabling server playtime in the config (age/subfeatures/server_playtime) will speed it up a lot. If you want it slightly faster, you can also disable CS:GO playtime, as it requires an extra API call to Steam (age/subfeatures/csgo_playtime), although this isn’t nearly as slow as GameME.

Why shouldn’t I double click to run STonitor?

This works just fine in most use cases, but if the program crashes or you close it, all output will be instantly gone. You won’t be able to see it again, normally closing is fine as STonitor will ask you confirm closing but not for errors. Whether or not you decide to run STonitor by double-clicking is your choice, but using command prompt really isn’t that inconvenient (if you use a Batch file, it’s actually more convenient!). When using command prompt, the past output still shows until you close the command prompt window.

Deprecated since version 2.2.0: This is no longer the case as of 2.2.0, you can now double click to run STonitor without any issues if you used the Installer.

How was the name STonitor chosen?

Since the idea for STonitor came from MSWS’ Sonitor, I based the name of the program off of that. Sonitor didn’t support TTT while I was planning for STonitor to support it, so I added a T for TTT into the name. It was put after the S so that it was in the order ST, representing Special Treatment for JB. In the end, it’s just me being uncreative and not wanting to come up with a new name.

Where is the data folder?

On versions 2.2.0 and above, all data is in the standard config directory for your operating system, under a subfolder named “STonitor”. On Windows, this is C:\Users\Username\AppData\Roaming\STonitor. On Linux and Mac, this is ~/.config/STonitor.

Note

You can get to the data folder quickly on Windows by opening your File Explorer, clicking the address bar, then entering %APPDATA%\STonitor, and pressing enter.

Deprecated since version 2.2.0: Prior to version 2.2.0, the data folder was in the same directory as the executable. This is no longer the case (see above).

How do I update STonitor?

If you used the Installer, you can just run it again and it’ll update STonitor. If you performed a manual installation, extract the new/updated ZIP file into where you originally installed STonitor and override if prompted.

There may also be additional instructions in the release notes for that version, make sure to look through them (and also the release notes of any versions you skipped). Most commonly, these will be telling you to delete constants.yaml, session.json, or age_cache.json.

How do I downgrade STonitor?

It’s not recommended to downgrade Sonitor, as there may be unfixed bugs, and other issues in previous versions. If you still want to, delete all files not in the data folder and then extract the ZIP file of the older version there. Try to run it, but if you encounter an error than that likely means that the data files aren’t compatible either. You’ll need to delete the data folder as well and re-configure them as if you were installing STonitor anew.

An invalid line keeps crashing STonitor, how can I resolve it?

You can open the output.log file manually and wipe everything in it, then restart STonitor. If it was an issue with some corrupted log/output, this will fix it. It’s also recommended to report it as a bug so that I can fix it within the program and prevent it from happening again.

New in version 1.0.1: STonitor will now automatically wipe output.log on error if the config option clear_on_error is true.

How can I report a bug?

Report a bug on GitHub using the Bug Report issue template, here’s a link to make things easier. You’ll need to have a GitHub account in order to do this. If you’re unsure about any of the fields/sections in the template, feel free to leave it blank. A bug report that isn’t complete is better than no bug report.

How can I suggest a feature?

Suggest a feature on GitHub using the Feature Request issue template, here’s a link to make things easier. You’ll need to have a GitHub account in order to do this.

What’s being worked on right now?

STonitor feature requests, bugs, and other issues are tracked on GitHub, organized into a GitHub Project, you can view current issues categorized into priority there. This is a side project, so progress may be slow.

Where can I contact the developer?

If you came from eGO forums, you can feel free to reply to the thread there. You can also email me at contact[at]blankdvth.com.

About

STonitor is an application that’s designed to help admins (and sometimes players) on eGO servers by automatically analyzing TTT and JB logs to facilitate understanding them. STonitor also comes with a Steam Age feature which’ll list the age of steam accounts connected to any CS:GO server as well as CS:GO playtime (if available). This application may eventually evolve to contain a broader spectrum of features that would be useful.

Important

This program is designed to assist in the analysis and understanding of logs, it cannot replace human discretion and understanding. This program is only able to make sense of the information provided to it (logs) and won’t be able to understand what’s going on in the game if it isn’t in logs. An example would be the program reporting a JB wardenless freekill, the player that was supposedly freekilled is in armory and is thus KOS regardless of if there is a warden or not. The program is unable to tell because location information is unavailable in logs.

If you want to use this program, start with the step-by-step Installation instructions.

Features

The majority of these features and their sub-features can be disabled using the detailed settings file. To understand how to edit this file and what each parameter means, go here.

  • Steam Age
    • Automatically runs when status is typed in the CS:GO console

    • Automatically retrieves and outputs the account age of everyone on the server
      • If an account is private, the age is estimated by getting the ages of accounts created directly after the private account

    • Automatically retrieves and outputs player’s CS:GO playtime if available

    • Automatically retrieves and outputs player’s server playtime if available (using GameME)

  • JB Log Analysis
    • Wardenless Freekill: Notifies you when a CT kills a non-rebelling T without warden alive

    • New Warden Freekill: Notifies you when a CT kills a non-rebelling T within X seconds of a new warden coming on

    • ST Freekill: Notifies you when a CT kills an ST

    • Mass Freedamage: Notifies you when a CT throws an HE grenade or molotov and damages more than X Ts within Y seconds

    • Early Vent: Notifies you when a CT breaks a vent/wall before any T does

      Note

      On certain maps, a player opening cell doors may count as breaking a vent/wall, creating a false-positive

    • Button Grief: Notifies you when someone presses a button and players take damage from the world within X seconds after
      • By default, the warden is not counted in this, it can be toggled off in settings however

      • The damage threshold before a warning is triggered is configurable in settings

      • Buttons can be ignored or renamed using a Button Configuration file

    • Nade Disruption: Notifies you when a prisoner throws utility and players take damage from the world within X seconds
      • The damage threshold before a warning is triggered is configurable in settings

    • Gunplant: Notifies you when a T picks up a CT’s weapon before that CT dies

  • TTT Log Analysis
    • RDM: Notifies you if there may have been a potential RDM
      • The program can attempt to detect reasoning and eliminate reasonable bad kills. This is done by going back through logs to check if the ‘victim’ of the RDM attacked the potential RDMer first.

    • Mass RDM: Notifies you if a player has more than X bad kills in a single round
      • Similarly to RDM detection, Mass RDM detection can also attempt to detect reasoning, however this is disabled by default for Mass RDM

    • Inno Utility: Notifies you when an innocent or detective damages someone with utility

    • Wallhack Purchase: Notifies you when a player buys wallhack

  • Log Summary Output: Creates a customizable summary of each round log, so that if you want to take a quick glance, its not as cluttered

  • Automatic Log Saving: Automatically saves TTT & JB logs on your computer as .txt files, so that you can access them whenever
    • TTT logs are saved in the format: TTT_round-number-here.txt with round-number-here being the TTT round number. E.g. TTT_12345.txt

    • JB logs are saved in the format: JB_datetime-here.txt with datetime-here being the date and time down to the millisecond in which the log was initially processed. E.g. JB_Dec-28-2021_19-28-06_372498.txt

Planned Features

  • Patch of cell opening false-positive for vent detection

  • Button alias file support

Potential Features

  • Admin chat highlighting and storing