More tracking

This commit is contained in:
Joseph Ferano 2022-04-01 12:53:18 +07:00
parent a0a4e94e40
commit ed722ec8c4
4 changed files with 98 additions and 25 deletions

View File

@ -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

View File

@ -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) =

View File

@ -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))
//
[<SlashCommand("buy-hack", "Purchase a hack so you can take money from other Degenz")>]
member _.BuyHack (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext(ctx)) (buy (Inventory.getItemsByType ItemType.Hack))
member _.BuyHack (ctx : InteractionContext) =
enforceChannel (DiscordInteractionContext(ctx)) (buy ItemType.Hack)
[<SlashCommand("buy-shield", "Purchase a hack shield so you can protect your GBT")>]
member this.BuyShield (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext(ctx)) (buy (Inventory.getItemsByType ItemType.Shield))
member this.BuyShield (ctx : InteractionContext) =
enforceChannel (DiscordInteractionContext(ctx)) (buy ItemType.Shield)
// [<SlashCommand("buy-food", "Purchase a food item to help boost your stats")>]
// member this.BuyFood (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext(ctx)) (buy (Inventory.getItemsByType ItemType.Food))

View File

@ -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) =