From a0a4e94e40b3c913fa0762a505a3663fd595597a Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Thu, 31 Mar 2022 15:30:32 +0700 Subject: [PATCH] Make trainer analytics individual events --- Bot/Analytics.fs | 37 ++++++++++++++++++++++--------------- Bot/Games/Trainer.fs | 4 ++-- Bot/InviteTracker.fs | 2 +- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Bot/Analytics.fs b/Bot/Analytics.fs index 17689ee..0273b70 100644 --- a/Bot/Analytics.fs +++ b/Bot/Analytics.fs @@ -5,17 +5,18 @@ open Mixpanel let private mix = MixpanelClient(GuildEnvironment.tokenMixpanel) let private track eventName id data = + let mapObj = data |> List.map (fun e -> ( fst e , snd e |> box) ) let map = - [ "distinct_id" , box id - "guild_id" , box GuildEnvironment.guildId + [ "distinct_id" , box (string id) + "guild_id" , box (string GuildEnvironment.guildId) "env" , box GuildEnvironment.environment ] - mix.TrackAsync(eventName, data @ map |> dict) |> Async.AwaitTask |> Async.Ignore + mix.TrackAsync(eventName, mapObj @ map |> dict) |> Async.AwaitTask |> Async.Ignore let invitedUserEntered inviteCode inviterId inviteeId inviterName inviteeName = let data = [ "user_display_name" , inviterName "invite_code" , inviteCode - "invitee_id" , inviteeId + "invitee_id" , string inviteeId "invitee_name" , inviteeName ] track "Invited User Entered" inviterId data @@ -24,7 +25,7 @@ let invitedUserAccepted inviteCode inviterId inviteeId inviterName inviteeName = let data = [ "user_display_name" , inviterName "invite_code" , inviteCode - "invitee_id" , inviteeId + "invitee_id" , string inviteeId "invitee_name" , inviteeName ] track "Invited User Accepted" inviterId data @@ -33,7 +34,7 @@ let recruitCommand origin id name channelId channelName = let data = [ "user_display_name" , name "origin" , origin - "channel_id" , channelId + "channel_id" , string channelId "channel_name" , channelName ] track "Recruit Command Invoked" id data @@ -42,16 +43,16 @@ let recruitLinkButton inviteCode id name channelId channelName = let data = [ "user_display_name" , name "invite_code" , inviteCode - "channel_id" , channelId + "channel_id" , string channelId "channel_name" , channelName ] - track "Recruited Command Invoked" id data + track "Recruited Link Button Clicked" id data let recruitedCommand totalUsers id name channelId channelName = let data = [ "user_display_name" , name - "total_users_at_the_time" , totalUsers - "channel_id" , channelId + "total_users_at_the_time" , string totalUsers + "channel_id" , string channelId "channel_name" , channelName ] track "Recruited Command Invoked" id data @@ -61,19 +62,25 @@ let whiteListButton availability id name = "user_display_name" , name "availability" , availability ] - track "Recruited Command Invoked" id data + track "Whitelist Button Clicked" id data let whiteListPurchased amount id name = let data = [ "user_display_name" , name - "purchase_amount" , amount + "purchase_amount" , string amount ] - track "Recruited Command Invoked" id data + track "Whitelist Purchased" id data let trainingDojoStep step id name = let data = [ "user_display_name" , name - "step" , step ] - track "Recruited Command Invoked" id data + track ("Training Dojo " + step) id data + +let trainingDojoCompleted alreadyCompleted id name = + let data = [ + "user_display_name" , name + "previously_completed" , string alreadyCompleted + ] + track "Training Dojo Completed" id data diff --git a/Bot/Games/Trainer.fs b/Bot/Games/Trainer.fs index d52a01c..7f7a562 100644 --- a/Bot/Games/Trainer.fs +++ b/Bot/Games/Trainer.fs @@ -187,7 +187,7 @@ type the `/arsenal` command NOW""" do! ctx.GetDiscordMember().GrantRoleAsync(role) |> Async.AwaitTask do! sendFollowUpMessage ctx ($"Your training is now complete. If you want to buy more **HACKS & SHIELDS**, go to the <#{GuildEnvironment.channelArmory}> and type the `/buy-hack` and `/buy-shield` commands!") - do! Analytics.trainingDojoStep "CompletedNoGifts" (ctx.GetDiscordMember().Id) (ctx.GetDiscordMember().Username) + do! Analytics.trainingDojoStep "Completed" (ctx.GetDiscordMember().Id) (ctx.GetDiscordMember().Username) }) let handleArsenal (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async { @@ -242,7 +242,7 @@ let handleArsenal (ctx : IDiscordContext) = PlayerInteractions.executePlayerActi do! Async.Sleep 1000 do! sendFollowUpMessage ctx $"Now get out of there and go hack other Degenz in the <#{GuildEnvironment.channelBattle}> channel!" - do! Analytics.trainingDojoStep "CompletedWithGifts" (ctx.GetDiscordMember().Id) (ctx.GetDiscordMember().Username) + do! Analytics.trainingDojoCompleted false (ctx.GetDiscordMember().Id) (ctx.GetDiscordMember().Username) else let role = ctx.GetGuild().GetRole(GuildEnvironment.roleTrainee) do! ctx.GetDiscordMember().RevokeRoleAsync(role) |> Async.AwaitTask diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs index 1004934..0877886 100644 --- a/Bot/InviteTracker.fs +++ b/Bot/InviteTracker.fs @@ -285,8 +285,8 @@ let private processNewUser (eventArgs : GuildMemberAddEventArgs) = match result with | Some (_,count) -> if invite.Uses > count then - do! Analytics.invitedUserEntered invite.Code invite.Inviter.Id eventArgs.Member.Id invite.Inviter.Username eventArgs.Member.Username do! addInvitedUser eventArgs.Member.Id invite.Code invite.Uses |> Async.Ignore + do! Analytics.invitedUserEntered invite.Code invite.Inviter.Id eventArgs.Member.Id invite.Inviter.Username eventArgs.Member.Username | None -> () } :> Task