From ed722ec8c4903eb5a3a94b39ff19622e7cc828fa Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Fri, 1 Apr 2022 12:53:18 +0700 Subject: [PATCH] More tracking --- Bot/Analytics.fs | 81 ++++++++++++++++++++++++++++++++++----- Bot/Games/HackerBattle.fs | 16 ++++---- Bot/Games/Store.fs | 20 +++++++--- Bot/InviteTracker.fs | 6 +-- 4 files changed, 98 insertions(+), 25 deletions(-) diff --git a/Bot/Analytics.fs b/Bot/Analytics.fs index 0273b70..91902ca 100644 --- a/Bot/Analytics.fs +++ b/Bot/Analytics.fs @@ -1,5 +1,6 @@ module Degenz.Analytics +open DSharpPlus.Entities open Mixpanel let private mix = MixpanelClient(GuildEnvironment.tokenMixpanel) @@ -30,30 +31,30 @@ let invitedUserAccepted inviteCode inviterId inviteeId inviterName inviteeName = ] track "Invited User Accepted" inviterId data -let recruitCommand origin id name channelId channelName = +let recruitCommand origin id name (channel : DiscordChannel) = let data = [ "user_display_name" , name "origin" , origin - "channel_id" , string channelId - "channel_name" , channelName + "channel_id" , string channel.Id + "channel_name" , channel.Name ] track "Recruit Command Invoked" id data -let recruitLinkButton inviteCode id name channelId channelName = +let recruitLinkButton inviteCode id name (channel : DiscordChannel) = let data = [ "user_display_name" , name "invite_code" , inviteCode - "channel_id" , string channelId - "channel_name" , channelName + "channel_id" , string channel.Id + "channel_name" , channel.Name ] track "Recruited Link Button Clicked" id data -let recruitedCommand totalUsers id name channelId channelName = +let recruitedCommand totalUsers id name (channel : DiscordChannel) = let data = [ "user_display_name" , name "total_users_at_the_time" , string totalUsers - "channel_id" , string channelId - "channel_name" , channelName + "channel_id" , string channel.Id + "channel_name" , channel.Name ] track "Recruited Command Invoked" id data @@ -84,3 +85,65 @@ let trainingDojoCompleted alreadyCompleted id name = ] track "Training Dojo Completed" id data +let arsenalCommand (discordMember : DiscordMember) = + let data = [ + "user_display_name" , discordMember.Username + ] + track "Arsenal Command Invoked" discordMember.Id data + +let buyWeaponCommand (discordMember : DiscordMember) weaponType = + let data = [ + "user_display_name" , discordMember.Username + "weapon_type" , string weaponType + ] + track "Buy Weapon Command Invoked" discordMember.Id data + +let sellWeaponCommand (discordMember : DiscordMember) weaponType = + let data = [ + "user_display_name" , discordMember.Username + "weapon_type" , string weaponType + ] + track "Sell Weapon Command Invoked" discordMember.Id data + +let buyWeaponButton (discordMember : DiscordMember) (weapon : ItemDetails) = + let data = [ + "user_display_name" , discordMember.Username + "weapon_name" , weapon.Name + "weapon_price" , string weapon.Price + ] + track "Buy Weapon Button Clicked" discordMember.Id data + +let sellWeaponButton (discordMember : DiscordMember) (weapon : ItemDetails) = + let data = [ + "user_display_name" , discordMember.Username + "weapon_name" , weapon.Name + "weapon_price" , string weapon.Price + ] + track "Sell Weapon Button Clicked" discordMember.Id data + +let hackCommand id name = + let data = [ + "user_display_name" , name + ] + track "Hack Command Invoked" id data + +let shieldCommand id name = + let data = [ + "user_display_name" , name + ] + track "Hack Command Invoked" id data + +let hackedTarget (discordMember : DiscordMember) hackName success = + let data = [ + "user_display_name" , discordMember.Username + "hack_name" , hackName + "was_successful" , string success + ] + track "Hack Button Clicked" discordMember.Id data + +let shieldActivated (discordMember : DiscordMember) shieldName = + let data = [ + "user_display_name" , discordMember.Username + "shield_name" , shieldName + ] + track "Shield Button Clicked" discordMember.Id data diff --git a/Bot/Games/HackerBattle.fs b/Bot/Games/HackerBattle.fs index 3be1264..69a8c37 100644 --- a/Bot/Games/HackerBattle.fs +++ b/Bot/Games/HackerBattle.fs @@ -171,11 +171,13 @@ let handleAttack (ctx : IDiscordContext) = >>= checkTargetHasFunds defender >>= checkWeaponHasCooldown hack.Item |> function - | Ok atkr -> - runHackerBattle defender hack - |> function - | false -> successfulHack ctx atkr defender hack - | true -> failedHack ctx attacker defender hack + | Ok atkr -> async { + let result = runHackerBattle defender hack + match result with + | false -> do! successfulHack ctx atkr defender hack + | true -> do! failedHack ctx attacker defender hack + do! Analytics.hackedTarget (ctx.GetDiscordMember()) hack.Item.Name (not result) + } | Error msg -> Messaging.sendFollowUpMessage ctx msg | _ -> do! Messaging.sendFollowUpMessage ctx "Error occurred processing attack" }) @@ -231,8 +233,8 @@ let arsenal (ctx : IDiscordContext) = builder.AddEmbed(embed) |> ignore builder.IsEphemeral <- true do! ctx.FollowUp(builder) |> Async.AwaitTask - do! DbService.updatePlayer updatedPlayer - |> Async.Ignore + do! DbService.updatePlayer updatedPlayer |> Async.Ignore + do! Analytics.arsenalCommand (ctx.GetDiscordMember()) }) let handleButtonEvent (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) = diff --git a/Bot/Games/Store.fs b/Bot/Games/Store.fs index eac30da..eb35ed5 100644 --- a/Bot/Games/Store.fs +++ b/Bot/Games/Store.fs @@ -110,10 +110,13 @@ let checkHasItemsInArsenal itemType items player = then Ok player else Error $"You currently have no {itemType} in your arsenal to sell!" -let buy getItems (ctx : IDiscordContext) = +let buy itemType (ctx : IDiscordContext) = executePlayerAction ctx (fun player -> async { - let itemStore = getBuyItemsEmbed (getItems player.Inventory) (getItems Armory.weapons) + let playerItems = Inventory.getItemsByType itemType player.Inventory + let armoryItems = Inventory.getItemsByType itemType Armory.weapons + let itemStore = getBuyItemsEmbed playerItems armoryItems do! ctx.FollowUp itemStore |> Async.AwaitTask + do! Analytics.buyWeaponCommand (ctx.GetDiscordMember()) itemType }) let sell itemType getItems (ctx : IDiscordContext) = @@ -123,6 +126,7 @@ let sell itemType getItems (ctx : IDiscordContext) = | Ok _ -> let itemStore = getSellEmbed items do! ctx.FollowUp(itemStore) |> Async.AwaitTask | Error e -> do! sendFollowUpMessage ctx e + do! Analytics.sellWeaponCommand (ctx.GetDiscordMember()) itemType }) // TODO: When you buy a shield, prompt the user to activate it @@ -137,6 +141,7 @@ let handleBuyItem (ctx : IDiscordContext) itemId = let p = { player with Bank = newBalance ; Inventory = item::player.Inventory } do! DbService.updatePlayer p |> Async.Ignore do! sendFollowUpMessage ctx $"Successfully purchased {item.Name}! You now have {newBalance} 💰$GBT remaining" + do! Analytics.buyWeaponButton (ctx.GetDiscordMember()) item }) }) @@ -155,7 +160,8 @@ let handleSell (ctx : IDiscordContext) itemId = do! [ DbService.updatePlayer updatedPlayer |> Async.Ignore DbService.removeShieldEvent updatedPlayer.DiscordId itemId |> Async.Ignore - sendFollowUpMessage ctx $"Sold {item.Name} for {item.Price}! Current Balance: {updatedPlayer.Bank}" ] + sendFollowUpMessage ctx $"Sold {item.Name} for {item.Price}! Current Balance: {updatedPlayer.Bank}" + Analytics.sellWeaponButton (ctx.GetDiscordMember()) item ] |> Async.Parallel |> Async.Ignore }) @@ -203,7 +209,7 @@ type Store() = let checkChannel (ctx : IDiscordContext) = match ctx.GetChannel().Id with // | id when id = GuildEnvironment.channelBackAlley -> buy (Inventory.getItemsByType ItemType.Hack) ctx - | id when id = GuildEnvironment.channelArmory -> buy (Inventory.getItemsByType ItemType.Shield) ctx + | id when id = GuildEnvironment.channelArmory -> buy ItemType.Shield ctx // | id when id = GuildEnvironment.channelMarket -> buy (Inventory.getItemsByType ItemType.Food) ctx // | id when id = GuildEnvironment.channelAccessoryShop -> buy (Inventory.getItemsByType ItemType.Accessory) ctx | _ -> @@ -216,10 +222,12 @@ type Store() = // member _.BuyItem (ctx : InteractionContext) = checkChannel (DiscordInteractionContext(ctx)) // [] - member _.BuyHack (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext(ctx)) (buy (Inventory.getItemsByType ItemType.Hack)) + member _.BuyHack (ctx : InteractionContext) = + enforceChannel (DiscordInteractionContext(ctx)) (buy ItemType.Hack) [] - member this.BuyShield (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext(ctx)) (buy (Inventory.getItemsByType ItemType.Shield)) + member this.BuyShield (ctx : InteractionContext) = + enforceChannel (DiscordInteractionContext(ctx)) (buy ItemType.Shield) // [] // member this.BuyFood (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext(ctx)) (buy (Inventory.getItemsByType ItemType.Food)) diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs index 0877886..d21c6e2 100644 --- a/Bot/InviteTracker.fs +++ b/Bot/InviteTracker.fs @@ -216,7 +216,7 @@ let private showInviteMessage (ctx : IDiscordContext) origin = You must **COMPLETE YOUR TRAINING FIRST!** Then you can `/recruit`... Go to <#{GuildEnvironment.channelTraining}> now to become a **HACKER**! """ - do! Analytics.recruitCommand origin player.DiscordId (ctx.GetDiscordMember().Username) (ctx.GetChannel().Id) (ctx.GetChannel().Name) + do! Analytics.recruitCommand origin player.DiscordId (ctx.GetDiscordMember().Username) (ctx.GetChannel()) | None -> do! sendFollowUpMessage ctx $"You're not in the game! Go to <#{GuildEnvironment.channelShelters}> NOW to get assigned a private bunk, and **JOIN THE GAME!**" } :> Task @@ -262,7 +262,7 @@ let private getInvitedUsersForId (ctx : IDiscordContext) = task { do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg) let user = ctx.GetDiscordMember() let channel = ctx.GetChannel() - do! Analytics.recruitedCommand total user.Id user.Username channel.Id channel.Name + do! Analytics.recruitedCommand total user.Id user.Username channel } let clearInvites (ctx : IDiscordContext) = task { @@ -542,7 +542,7 @@ let handleCreateInvite (ctx : IDiscordContext) = .AsEphemeral(true) do! ctx.FollowUp(msg) - do! Analytics.recruitLinkButton code user.Id user.Username (ctx.GetChannel().Id) (ctx.GetChannel().Name) + do! Analytics.recruitLinkButton code user.Id user.Username (ctx.GetChannel()) } :> Task let handleButtonEvent (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) =