-
Notifications
You must be signed in to change notification settings - Fork 426
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Logging] Implement Player Event Logging system #2833
Conversation
Please do not merge this. I will merge it after it's had review, testing, feedback and related branches are ready to go |
Looks good being I already tested a lot of this functionality. Just curious how the repositories for |
Answered in DM; think this was a misunderstanding |
88178dc
to
d1b9f02
Compare
…player event logs
d1b9f02
to
c9ba95f
Compare
* Plumbing * Batch processing in world * Cleanup * Cleanup * Update player_event_logs.cpp * Add player zoning event * Use generics * Comments * Add events * Add more events * AA_GAIN, AA_PURCHASE, FORAGE_SUCCESS, FORAGE_FAILURE * FISH_SUCCESS, FISH_FAILURE, ITEM_DESTROY * Add charges to ITEM_DESTROY * WENT_ONLINE, WENT_OFFLINE * LEVEL_GAIN, LEVEL_LOSS * LOOT_ITEM * MERCHANT_PURCHASE * MERCHANT_SELL * SKILL_UP * Add events * Add more events * TASK_ACCEPT, TASK_COMPLETE, and TASK_UPDATE * GROUNDSPAWN_PICKUP * SAY * REZ_ACCEPTED * COMBINE_FAILURE and COMBINE_SUCCESS * DROPPED_ITEM * DEATH * SPLIT_MONEY * TRADER_PURCHASE and TRADER_SELL * DISCOVER_ITEM * Convert GM_COMMAND to use new macro * Convert ZONING event to use macro * Revert some code changes * Revert "Revert some code changes" This reverts commit d53682f. * Add cereal generation support to repositories * TRADE * Formatting * Cleanup * Relocate discord_manager to discord folder * Discord sending plumbing * Rename UCS's Database class to UCSDatabase to be more specific and not collide with base Database class for repository usage * More discord sending plumbing * More discord message formatting work * More discord formatting work * Discord formatting of events * Format WENT_ONLINE, WENT_OFFLINE * Add merchant purchase event * Handle Discord MERCHANT_SELL formatter * Update player_event_discord_formatter.cpp * Tweaks * Implement retention truncation * Put mutex locking on batch queue, put processor on its own thread * Process on initial bootup * Implement optional QS processing, implement keepalive from world to QS * Reload player event settings when logs are reloaded in game * Set settings defaults * Update player_event_logs.cpp * Update player_event_logs.cpp * Set retention days on boot * Update player_event_logs.cpp * Player Handin Event Testing. Testing player handin stuff. * Cleanup. * Finish NPC Handin. * set a reference to the client inside of the trade object as well for plugins to process * Fix for windows _inline * Bump to cpp20 default, ignore excessive warnings on windows * Bump FMT to 6.1.2 for cpp20 compat and swap fmt::join for Strings::Join * Windows compile fixes * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Create 2022_12_19_player_events_tables.sql * [Formatters] Work on Discord Formatters * Handin money. * Format header * [Formatters] Work on Discord Formatters * Format * Format * [Formatters] More Formatter work, need to test further. * [Formatters] More Work on Formatters. * Add missing #endif * [Formatters] Work on Formatters, fix Bot formatting in ^create help * NPC Handin Discord Formatter * Update player_event_logs.cpp * Discover Item Discord Formatter * Dropped Item Discord Formatter * Split Money Discord Formatter * Trader Discord Formatters * Cleanup. * Trade Event Discord Formatter Groundwork * SAY don't record GM commands * GM_Command don't record #help * Update player_event_logs.cpp * Fill in more event data * Post rebase fixes * Post rebase fix * Discord formatting adjustments * Add event deprecation or unimplemented tag support * Trade events * Add return money and sanity checks. * Update schema * Update ucs.cpp * Update client.cpp * Update 2022_12_19_player_events_tables.sql * Implement archive single line * Replace hackers table and functions with PossibleHack player event * Replace very old eventlog table since the same events are covered by player event logs * Update bot_command.cpp * Record NPC kill events ALL / Named / Raid * Add BatchEventProcessIntervalSeconds rule * Naming * Update CMakeLists.txt * Update database_schema.h * Remove logging function and methods * DB version * Cleanup SendPlayerHandinEvent --------- Co-authored-by: Kinglykrab <kinglykrab@gmail.com> Co-authored-by: Aeadoin <109764533+Aeadoin@users.noreply.github.com>
Player Event Logging
For the longest time, player audit logging or event logging of any type has been sub-par. It is difficult to triage when a player lost an item because we have no adequate out of the box logging. It is difficult to know get visibility into player activity to understand how things are being used or misused
Goals
Features
structs
which are serialized into JSON when the event reaches the databaseDeprecates
hackers
table is now deprecated. These are now their ownPOSSIBLE_HACK
events since all of this was player contextual logging to begin witheventlog
table is now deprecated. All events covered in here are also covered in the player event logging system and far moreTable Schema(s)
player_event_logs
Indexes
player_event_log_settings
Currently Handled Events
These are the events currently supported at the time of this writing. It's very likely more will be added later on and you can find the most recent events in ./common/player_events.h
Credits
The system was designed by Akkadius and co-designed by Kinglykrab. Aead and Kinglykrab also helped with the implementation of several events and many Discord formatters. Thank you both for your help <3
Quest Hand-In Events
In order to capture player hand-ins, you will need special plugin capture code that is included in PEQ Quest PR https://github.com/ProjectEQ/projecteqquests/pull/1372/files
Hand-ins may need further work to capture other code paths
Player Event Log Explorer (Spire)
A system like this is best served when it can be seen as to what you can do with it with the right tooling. Here is examples of key explorer features. The release of this will likely shortly trail when the server feature is released.
Rich Data Viewing
Spire translates event data into viewable NPC, Item, Spell etc. cards to have contextual insight into the events and what they contain.
Event Raw
Any event you can see the richly formatted event or you can inspect the raw event data
Flexible Filtering
You can filter by event type, zone_id, character_id which are top level filters always available and indexed regardless of event type
Advanced Event Data Filtering
You can filter by JSON event data
You can even filter by deeply nested data. For example if you're trying to search for a certain item that was traded by doing a nested wildcard search
Developer Docs
Where's the Code?
Most of the code managing player events is located @
How Do I Add a New Event?
First you need an event defined. You do that in player_events.h in both
EventType
andEventName
You'll also need a struct representing the event data that you want to exist in the database, that is also defined in player_events.h
It is important to implement the cereal serialization fields because that is what is used to automatically handle transporting the data from zone to world and ultimately into JSON format in the database. Much of this is handled automatically for the developer.
You will also need to find the place in the code that you would like to record the event. There are two convenient macros that wrap a lot of other logic to keep things performant
For the message to properly show up in Discord, it will need a proper formatter to format the event data in a visually pleasing way.
Implement a formatter in ./common/player_event_discord_formatter.cpp that looks similar to
You can copy other formatter signatures fairly easy to understand what is happening. This will need to be hooked up in the formatter switch in
PlayerEventLogs::GetDiscordPayloadFromEvent
in common/events/player_event_logs.cppExample Diff
Below are two example of an event being implemented / added. These only contain what is required to add events, not format Discord messages
More Complex
Simpler
Default Event Settings
Default event settings are defined in
PlayerEventLogs::SetSettingsDefaults
This determines if the event is enabled by default and sets the defaults before it gets injected into the operators database automatically on next code update.