LethalAnalytics
Allows mod creators to see how their mods are used, easily catch errors, and learn about their audience. Supports Google Analytics!
Last updated | 6 months ago |
Total downloads | 328 |
Total rating | 2 |
Categories | Mods Tools Libraries BepInEx Client-side Server-side |
Dependency string | RB007-LethalAnalytics-1.0.1 |
Dependants | 0 other packages depend on this package |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2100AinaVT-LethalConfig
Provides an in-game config menu for players to edit their configs, and an API for other mods to use and customize their entries.
Preferred version: 1.4.2README
LethalAnalytics
Allows mod creators to see how their mods are used, easily catch errors, and learn about their audience.
This is a mod library or dependency. If you're playing with this mod installed, check out its LethalConfig for more info.
Dependencies
Required | Name | Version |
---|---|---|
✅ | LethalConfig | 1.4.2 |
✅ | BepInExPack | 5.4.2100 |
Overview
Supported Analytics Sites:
- Google Analytics (GA4) [Free]
-
- User & new user charts supported
- Location (city) map & charts supported
- Events (with dimensions and metrics) supported
- Engagement time charts supported
- Screen resolution chart supported
-
More coming soon (upon request)
Usage
Setting up
First, reference the LethalAnalytics.dll
file (downloaded from Thunderstore or Github) from your project.
In order to access the LethalAnalytics API, use the LethalAnalytics
namespace:
using LethalAnalytics;
Also include LethalAnalytics as a BepInDependency
of your mod so that BepInEx can work its dependency graphing magic (and properly load LethalAnalytics):
[BepInPlugin(modGUID, modName, modVersion)]
[BepInDependency("net.RB007.LethalAnalytics")] <--- (right here)
public class YourHopefullyErrorFreeModOrSmth : BaseUnityPlugin { ... }
If uploading your mod to Thunderstore, make sure to include LethalAnalytics in your manifest.json
file.
Creating a GA session
Reference the static AnalyticsManager
class and call the registerGASession(...)
method to connect your mod to Google Analytics (GA4):
GASession gaSession = AnalyticsManager.registerGASession("net.YourUsername.YourMod", "Your Mod Name", "1.0.0", "Your mod desc. that explains what data you will collect and WHY you're collecting it.", "G-YOURMEASUREMENTID");
See Creating a GA4 property if you need a MEASUREMENT ID
.
If needed, you can register multiple GA sessions (and still send events to each, separately).
Please be careful about changing your modId
, modName
, and modVersion
. This can cause issues with session creation and user consent settings.
Here's some documentation about its parameters:
Parameter | Type | Description |
---|---|---|
modId | string | A unique static ID for your mod (ex. net.RB007.LethalMod). This should NEVER change. It's used to send user update events and check if a user is new. |
modName | string | The name of your mod. This should also NEVER change (unless the public name of your mod somehow changes). Must only contain chars A-z, 0-9, and spaces (no special chars). This is the name users will see inside the LethalAnalytics config. |
modVersion | string | Your mod's version (ex. 1.0.0). This will be displayed in your GA4 reports and is used to send user update events. This should change when your mod version changes. |
modDesc | string | A short description for your mod. Please explain what data/events you wish to collect AND WHY you'll be collecting them. NEVER collect PII or otherwise private info. Please be transparent and respect user privacy. Make the Lethal Company modding community proud! |
measurementId | string | Your GA4 measurement ID (ex. G-RB007ONKOFI). Check that this is correct. Be careful about sharing it and feel free to hide/obfuscate it in your code if desired. |
screenTitle | string (optional) | The title name to send when a session is created for GA4 (default: MainMenu). |
renewScreenTitle | string (optional) | The title name to send when a session is continued for GA4 (default: InGame). |
sendSystemInfo | bool (optional) | Whether to send the user's CPU and GPU type along with the GA4 session_start event (as event params). OS info and screen res. will be sent regardless. |
sessionLengthMins | int (optional) | How long a GA4 user session is set to last in minutes (default: 30). By default, sessions are re-created if they timeout (as long as the game is still open). Only change this if you know what you're doing. |
By default, every instance of GASession
sends a few user events:
Event Name | Description |
---|---|
session_start | This event is sent as soon as the registerGASession(...) method is called for each user. It starts each user's session. |
page_visit | This event is sent as soon as the registerGASession(...) method is called for each user. Includes some basic version info (and their CPU (type) and GPU (type) if enabled). |
first_visit | This event is sent as soon as registerGASession(...) method is called for each user (for the first time). It's what lets you know if a user ran your mod for the first time. |
update | This event is sent as soon as each user reaches Lethal Company's main menu (and they just updated your mod). It's what lets you know if a user recently updated your mod (and to what version). |
session_end | This event is sent as soon as each user quits Lethal Company (through the main menu). It ends each user's session. |
Sending GA events
In order to send GA events, you'll need an instance of a GASession
. It's recommended that you store the previously shown GASession instance in an internal static variable. That way, you can safely access it throughout your mod assembly.
internal static GASession gaSession = AnalyticsManager.registerGASession(...);
Then, call the sendGAEvent(...)
method, from your GASession
instance, to send custom GA events to your property.
gaSession.sendGAEvent("category", "name", new Dictionary<string, string>() { ["event_param"] = "event_value" });
Please be careful about sending events too quickly and keep event params minimal. Your mod shouldn't dramatically affect a user's networking.
Here's some documentation about its parameters:
Parameter | Type | Description |
---|---|---|
event_category | string | The category/type for the event (ex. client, state, event, etc.). |
event_name | string | The name of the event (ex. jeb_attack, host, emote, etc.). Check https://support.google.com/analytics/answer/13316687 for help. Do not use reserved prefixes or event names (type: web). |
event_params | Dictionary<string, string> | A dictionary of string key/value pairs that are sent as GA4 event parameters. Check https://support.google.com/analytics/answer/13316687 for help. Do not use reserved prefixes or parameter names (type: web). |
isEngaged | bool (optional) | Whether the event should send user engagement time with it (and prolong the current session). It's recommended to keep this set to true. |
And here's an example of it in action (in the wild 😲):
[HarmonyPatch(typeof(GrabbableObject))]
public class ItemPatch
{
[HarmonyPatch("OnBroughtToShip")]
[HarmonyPostfix]
public static void patchCollect(ref Item ___itemProperties, ref int ___scrapValue)
{
YourModClass.gaSession.sendGAEvent("event", "collect", new Dictionary<string, string>() { ["item_name"] = ___itemProperties.itemName, ["scrap_value"] = ___scrapValue.ToString(), ["elapsed"] = StartOfRound.Instance.timeSinceRoundStarted.ToString() });
}
}
The event logs when a user brings a new scrap item to the ship and sends its name, value, and the time since the ship landed, to the GA property.
Creating a README note
[!IMPORTANT] When using LethalAnalytics, it's extremely recommended that you include some sort of README notice for your mod.
See Telemetrics for an example (below). It's always important to be transparent and respect user privacy. Users should know what events are being collected and why.
Creating a GA4 property
- Navigate to
https://analytics.google.com/
-->Create
-->Property
. - Enter your
property name
andtime zone
-->Next
.
- Select an industry (ex.
Games
) and business size (ex.Small
) -->Next
.
- Select (at least)
Examine user behavior
-->Create
.
- Choose the
Web
platform. --> Enter yourmodId
(ex. net.YourUsername.YourMod) as theURL
and type your mod name as theStream name
(verify thatEnhanced measurement
is on).
- Select your newly-created
web stream
--> Copy theMEASUREMENT ID
.
- That's it. You're all set! Use your
MEASUREMENT ID
when registering a GA session above. Once your users run your mod, they'll show up in yourRealtime
(and normal) reports with any sent events.
[!TIP] Generally, it's best to keep your MEASUREMENT ID safe. Anyone with it can send data to your property (Google does a decent job at removing bots/spam, though). Feel free to hide/obfuscate it in your code.
Telemetrics
Unless turned off in the config, LethalAnalytics may upload small amounts of Lethal Company and LAs user data. This helps me understand what features are used the most and what I can improve.
What's collected?
- OS, LC, and LethalAnalytics version data
- Your CPU (type), GPU (type), and screen resolution
- The names of mods that use LAs, the amount of events sent (but not their contents), and a few game events
- Your language and region (ex. en-US, Chicago)
[!IMPORTANT] Your Steam username is NOT sent (to keep things anon.).
This section doesn't include analytics/telemetrics data collected by other mods. Consult each mod README and their config description for more info.
Issues and Contributions
Please follow the available issue templates when submitting requests. Use the discussions tab when wanting to chat. Pull requests (to the dev
branch) and other user contributions are encouraged and always welcome.
Licencing
Read the LICENSE file for more information. The Contributor Agreement can be found there too. By downloading or contributing to this repo, you agree to the terms stated in the LICENSE file.
Copyright (C) 2024 RoosterBooster007
[!IMPORTANT] Please include the above copyright notice when distributing or modifying any code.