Start reintroducing RPG stuff. Some clean up

This commit is contained in:
Joseph Ferano 2022-04-25 13:13:02 +07:00
parent d5fc7ae229
commit 0d2bfebb2d
6 changed files with 113 additions and 74 deletions

View File

@ -34,36 +34,6 @@ let getPlayerEvents (did : uint64) =
) )
|> Async.AwaitTask |> Async.AwaitTask
let getLastPlayedSlotFromPlayer (did : uint64) = async {
let! events =
connStr
|> Sql.connect
|> Sql.parameters [ "did", Sql.string (string did) ]
|> Sql.query """
SELECT player_event.updated_at FROM player_event
JOIN "user" u on u.id = player_event.user_id
WHERE u.discord_id = @did AND event_type = 'PlayingSlot'
"""
|> Sql.executeAsync (fun read -> read.dateTime "updated_at" )
|> Async.AwaitTask
match events with
| [] -> return None
| es -> return Some (List.head es)
}
let updateSlotPlayedFromPlayer (did : uint64) =
connStr
|> Sql.connect
|> Sql.parameters [ "did", Sql.string (string did) ]
|> Sql.query """
WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did)
UPDATE player_event SET updated_at = now() at time zone 'utc'
FROM usr WHERE usr.id = user_id AND player_event.event_type = 'PlayingSlot';
"""
|> Sql.executeNonQueryAsync
|> Async.AwaitTask
|> Async.Ignore
let updatePlayerStats (player : PlayerData) = let updatePlayerStats (player : PlayerData) =
connStr connStr
|> Sql.connect |> Sql.connect

View File

@ -2,7 +2,6 @@
module Degenz.Types module Degenz.Types
open System open System
open Degenz
[<Measure>] [<Measure>]
type mins type mins
@ -102,6 +101,7 @@ type Item = {
Id : int Id : int
Name : string Name : string
Price : int<GBT> Price : int<GBT>
MaxAllowed : int
Attributes : ItemAttributes Attributes : ItemAttributes
} }

View File

@ -103,30 +103,6 @@ let reel1 = getReel (fun s -> s.reel1Count)
let reel2 = getReel (fun s -> s.reel2Count) let reel2 = getReel (fun s -> s.reel2Count)
let reel3 = getReel (fun s -> s.reel3Count) let reel3 = getReel (fun s -> s.reel3Count)
let slots =
[| "https://s7.gifyu.com/images/aneye.png"
"https://s7.gifyu.com/images/anonmask.png"
"https://s7.gifyu.com/images/circuitboard.png"
"https://s7.gifyu.com/images/obey.png"
"https://s7.gifyu.com/images/oldtv.png"
"https://s7.gifyu.com/images/pills.png"
"https://s7.gifyu.com/images/pizza0d47578733961746.png"
"https://s7.gifyu.com/images/ramen0515f00869e1f4eb.png"
"https://s7.gifyu.com/images/rat69609f842a0eb9f5.png"
"https://s7.gifyu.com/images/alcohol.png"
"https://s7.gifyu.com/images/bigbrother.png"
"https://s7.gifyu.com/images/sushi.png" |]
// [| "https://s7.gifyu.com/images/A-bottle-of-pills0a3006d0170e08df.png"
// "https://s7.gifyu.com/images/an-eyec362d8152ae2382b.png"
// "https://s7.gifyu.com/images/anon-face-mask6c7624821c89fc08.png"
// "https://s7.gifyu.com/images/a-piece-of-sushi77071d30f60a89c6.png"
// "https://s7.gifyu.com/images/Circuit-board89056017b80f1d13.png"
// "https://s7.gifyu.com/images/OBEYf2a8234109836c03.png"
// "https://s7.gifyu.com/images/old-tv-screendc6bc9d4b6c1fd65.png"
// "https://s7.gifyu.com/images/pizza030ffc00ff50da0e.png"
// "https://s7.gifyu.com/images/ramen08336d448018c98f.png"
// "https://s7.gifyu.com/images/rat14f65f54f0d75036.png" |]
let slotEmojiNames = let slotEmojiNames =
[| "sushi" [| "sushi"
"bigbrother" "bigbrother"
@ -172,6 +148,36 @@ let resetJackpot amount =
|> Sql.executeNonQueryAsync |> Sql.executeNonQueryAsync
|> Async.AwaitTask |> Async.AwaitTask
let getLastPlayedSlotFromPlayer (did : uint64) = async {
let! events =
GuildEnvironment.connectionString
|> Sql.connect
|> Sql.parameters [ "did", Sql.string (string did) ]
|> Sql.query """
SELECT player_event.updated_at FROM player_event
JOIN "user" u on u.id = player_event.user_id
WHERE u.discord_id = @did AND event_type = 'PlayingSlot'
"""
|> Sql.executeAsync (fun read -> read.dateTime "updated_at" )
|> Async.AwaitTask
match events with
| [] -> return None
| es -> return Some (List.head es)
}
let updateSlotPlayedFromPlayer (did : uint64) =
GuildEnvironment.connectionString
|> Sql.connect
|> Sql.parameters [ "did", Sql.string (string did) ]
|> Sql.query """
WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did)
UPDATE player_event SET updated_at = now() at time zone 'utc'
FROM usr WHERE usr.id = user_id AND player_event.event_type = 'PlayingSlot';
"""
|> Sql.executeNonQueryAsync
|> Async.AwaitTask
|> Async.Ignore
let handlePrizeTable (ctx : IDiscordContext) = let handlePrizeTable (ctx : IDiscordContext) =
task { task {
do! Messaging.defer ctx do! Messaging.defer ctx
@ -321,10 +327,10 @@ let spin multiplier (ctx : IDiscordContext) =
} }
PlayerInteractions.executePlayerAction ctx (fun player -> async { PlayerInteractions.executePlayerAction ctx (fun player -> async {
if player.Bank >= playAmount then if player.Bank >= playAmount then
match! DbService.getLastPlayedSlotFromPlayer player.DiscordId with match! getLastPlayedSlotFromPlayer player.DiscordId with
| Some timestamp -> | Some timestamp ->
if DateTime.UtcNow - timestamp > TimeSpan.FromSeconds(8) then if DateTime.UtcNow - timestamp > TimeSpan.FromSeconds(8) then
do! DbService.updateSlotPlayedFromPlayer player.DiscordId do! updateSlotPlayedFromPlayer player.DiscordId
do! execute player do! execute player
else else
do! Messaging.sendFollowUpMessage ctx "Wait till you finish the current spin!" do! Messaging.sendFollowUpMessage ctx "Wait till you finish the current spin!"

View File

@ -182,6 +182,57 @@ let handleStoreEvents (_ : DiscordClient) (event : ComponentInteractionCreateEve
do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask
} }
let showInventoryEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async {
let embeds , buttons =
player.Inventory
|> List.map (fun item ->
let embed = DiscordEmbedBuilder()
match item with
| Hack hack ->
embed.AddField($"$GBT Reward |", string hack.Power, true)
.AddField("Cooldown |", $"{TimeSpan.FromMinutes(int hack.Cooldown).Minutes} minutes", true)
.WithColor(DiscordColor.Red)
.WithThumbnail(Embeds.getItemIcon item.Id)
|> ignore
| Shield shield ->
embed.AddField($"Strong against |", WeaponClass.getGoodAgainst shield.Class |> snd |> string, true)
// .AddField($"Defensive Strength |", string item.Power, true)
.AddField("Active For |", $"{TimeSpan.FromMinutes(int shield.Cooldown).Hours} hours", true)
.WithColor(DiscordColor.SapGreen)
.WithThumbnail(Embeds.getItemIcon item.Id)
|> ignore
| Food food ->
embed.AddField($"Stat |", $"{food.TargetStat}", true)
.WithColor(DiscordColor.Azure)
.AddField($"Amount |", $"+{food.BoostAmount}", true) |> ignore
| Accessory accessory ->
embed.AddField($"Stat |", $"{accessory.TargetStat}", true)
.WithColor(DiscordColor.Goldenrod) |> ignore
if accessory.FloorBoost > 0 then
embed.AddField($"Min Boost |", $"+{accessory.FloorBoost}", true) |> ignore
if accessory.CeilBoost > 0 then
embed.AddField($"Max Boost |", $"+{accessory.CeilBoost}", true) |> ignore
embed
.AddField("Price 💰", (if item.Price = 0<GBT> then "Free" else $"{item.Price} $GBT"), true)
.WithTitle($"{item.Name}")
|> ignore
let button =
// if playerInventory |> List.exists (fun i -> i.Id = item.Id)
// then DiscordButtonComponent(WeaponClass.getClassButtonColor item, $"Buy-{item.Id}", $"Own {item.Name}", true)
// else DiscordButtonComponent(WeaponClass.getClassButtonColor item, $"Buy-{item.Id}", $"Buy {item.Name}")
DiscordButtonComponent(WeaponClass.getClassButtonColor item, $"Sell-{item.Id}", $"Sell {item.Name}")
( embed.Build() , button :> DiscordComponent ))
|> List.unzip
let builder =
DiscordFollowupMessageBuilder()
.AddEmbeds(embeds)
// .AddComponents(buttons)
.AsEphemeral(true)
do! ctx.FollowUp builder |> Async.AwaitTask
})
type Store() = type Store() =
inherit ApplicationCommandModule () inherit ApplicationCommandModule ()
@ -194,21 +245,22 @@ type Store() =
do! Messaging.sendSimpleResponse ctx msg do! Messaging.sendSimpleResponse ctx msg
} }
// let checkChannel (ctx : IDiscordContext) (storeFn : IDiscordContext -> Task) =
let checkChannel (ctx : IDiscordContext) = let checkChannel (ctx : IDiscordContext) =
match ctx.GetChannel().Id with match ctx.GetChannel().Id with
// | id when id = GuildEnvironment.channelBackAlley -> buy (Inventory.getItemsByType ItemType.Hack) ctx | id when id = GuildEnvironment.channelBackAlley -> buy ItemType.Hack ctx
| id when id = GuildEnvironment.channelArmory -> buy 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.channelMarket -> buy ItemType.Food ctx
// | id when id = GuildEnvironment.channelAccessoryShop -> buy (Inventory.getItemsByType ItemType.Accessory) ctx | id when id = GuildEnvironment.channelAccessoryShop -> buy ItemType.Accessory ctx
| _ -> | _ ->
task { task {
let msg = $"This channel doesn't have any items to sell" let msg = $"This channel doesn't have any items to sell. Try <#{GuildEnvironment.channelArmory}>"
do! Messaging.sendSimpleResponse ctx msg do! Messaging.sendSimpleResponse ctx msg
} }
// [<SlashCommand("buy-item", "Purchase an item")>] [<SlashCommand("buy-item", "Purchase an item")>]
// member _.BuyItem (ctx : InteractionContext) = checkChannel (DiscordInteractionContext(ctx)) member _.BuyItem (ctx : InteractionContext) = checkChannel (DiscordInteractionContext ctx)
//
[<SlashCommand("buy-hack", "Purchase a hack so you can take money from other Degenz")>] [<SlashCommand("buy-hack", "Purchase a hack so you can take money from other Degenz")>]
member _.BuyHack (ctx : InteractionContext) = member _.BuyHack (ctx : InteractionContext) =
enforceChannel (DiscordInteractionContext(ctx)) (buy ItemType.Hack) enforceChannel (DiscordInteractionContext(ctx)) (buy ItemType.Hack)
@ -217,9 +269,6 @@ type Store() =
member this.BuyShield (ctx : InteractionContext) = member this.BuyShield (ctx : InteractionContext) =
enforceChannel (DiscordInteractionContext(ctx)) (buy ItemType.Shield) 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))
//
[<SlashCommand("sell-hack", "Sell a hack for GoodBoyTokenz")>] [<SlashCommand("sell-hack", "Sell a hack for GoodBoyTokenz")>]
member this.SellHack (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext(ctx)) (sell "Hacks" (Inventory.getItemsByType ItemType.Hack)) member this.SellHack (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext(ctx)) (sell "Hacks" (Inventory.getItemsByType ItemType.Hack))
@ -228,9 +277,9 @@ type Store() =
[<SlashCommand("consume", "Consume a food item")>] [<SlashCommand("consume", "Consume a food item")>]
member this.Consume (ctx : InteractionContext) = member this.Consume (ctx : InteractionContext) =
enforceChannel (DiscordInteractionContext(ctx)) (sell "Shields" (Inventory.getItemsByType ItemType.Food)) enforceChannel (DiscordInteractionContext ctx) (sell "Shields" (Inventory.getItemsByType ItemType.Food))
// [<SlashCommand("inventory", "Check your inventory")>] [<SlashCommand("inventory", "Check your inventory")>]
// member this.Inventory (ctx : InteractionContext) = member this.Inventory (ctx : InteractionContext) =
// enforceChannel (DiscordInteractionContext(ctx)) (sell "Shields" (Inventory.getItemsByType ItemType)) showInventoryEmbed (DiscordInteractionContext ctx)

View File

@ -34,9 +34,9 @@ let channelWhitelist = getId "CHANNEL_WHITELIST"
//let channelTosserTed = getId "CHANNEL_TOSSERTED" //let channelTosserTed = getId "CHANNEL_TOSSERTED"
let channelShelters = getId "CHANNEL_SHELTERS" let channelShelters = getId "CHANNEL_SHELTERS"
let channelSlots = getId "CHANNEL_SLOTS" let channelSlots = getId "CHANNEL_SLOTS"
//let channelBackAlley = getId "CHANNEL_BACKALLEY" let channelBackAlley = getId "CHANNEL_BACKALLEY"
//let channelMarket = getId "CHANNEL_MARKET" let channelMarket = getId "CHANNEL_MARKET"
//let channelAccessoryShop = getId "CHANNEL_ACCESSORIES" let channelAccessoryShop = getId "CHANNEL_ACCESSORIES"
//let channelThievery = getId "CHANNEL_THIEVERY" //let channelThievery = getId "CHANNEL_THIEVERY"
let botIdHackerBattle = getId "BOT_HACKER_BATTLE" let botIdHackerBattle = getId "BOT_HACKER_BATTLE"

View File

@ -10,6 +10,7 @@
"Id": 0, "Id": 0,
"Name": "Virus", "Name": "Virus",
"Price": 250, "Price": 250,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : true, "CanSell" : true,
@ -32,6 +33,7 @@
"Id": 1, "Id": 1,
"Name": "Remote Access", "Name": "Remote Access",
"Price": 250, "Price": 250,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : true, "CanSell" : true,
@ -54,6 +56,7 @@
"Id": 2, "Id": 2,
"Name": "Worm", "Name": "Worm",
"Price": 250, "Price": 250,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : true, "CanSell" : true,
@ -75,6 +78,7 @@
"Id": 6, "Id": 6,
"Name": "Firewall", "Name": "Firewall",
"Price": 100, "Price": 100,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : true, "CanSell" : true,
@ -96,6 +100,7 @@
"Id": 7, "Id": 7,
"Name": "Encryption", "Name": "Encryption",
"Price": 100, "Price": 100,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : true, "CanSell" : true,
@ -117,6 +122,7 @@
"Id": 8, "Id": 8,
"Name": "Cypher", "Name": "Cypher",
"Price": 100, "Price": 100,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : true, "CanSell" : true,
@ -138,6 +144,7 @@
"Id": 12, "Id": 12,
"Name": "Protein Powder", "Name": "Protein Powder",
"Price": 50, "Price": 50,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : false, "CanSell" : false,
@ -159,6 +166,7 @@
"Id": 13, "Id": 13,
"Name": "Toro Loco", "Name": "Toro Loco",
"Price": 50, "Price": 50,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : false, "CanSell" : false,
@ -180,6 +188,7 @@
"Id": 14, "Id": 14,
"Name": "Oldports Cigs", "Name": "Oldports Cigs",
"Price": 50, "Price": 50,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : false, "CanSell" : false,
@ -201,6 +210,7 @@
"Id": 15, "Id": 15,
"Name": "Moon Pie", "Name": "Moon Pie",
"Price": 50, "Price": 50,
"MaxAllowed": 1,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
"CanSell" : false, "CanSell" : false,
@ -222,6 +232,7 @@
"Item": { "Item": {
"Id": 20, "Id": 20,
"Name": "Kettlebell", "Name": "Kettlebell",
"MaxAllowed": 1,
"Price": 250, "Price": 250,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
@ -244,6 +255,7 @@
"Item": { "Item": {
"Id": 21, "Id": 21,
"Name": "Headphones", "Name": "Headphones",
"MaxAllowed": 1,
"Price": 250, "Price": 250,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
@ -266,6 +278,7 @@
"Item": { "Item": {
"Id": 22, "Id": 22,
"Name": "Rolox Watch", "Name": "Rolox Watch",
"MaxAllowed": 1,
"Price": 250, "Price": 250,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,
@ -288,6 +301,7 @@
"Item": { "Item": {
"Id": 23, "Id": 23,
"Name": "Buddha Keychain", "Name": "Buddha Keychain",
"MaxAllowed": 1,
"Price": 250, "Price": 250,
"Attributes": { "Attributes": {
"CanBuy" : true, "CanBuy" : true,