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
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) =
connStr
|> Sql.connect

View File

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

View File

@ -103,30 +103,6 @@ let reel1 = getReel (fun s -> s.reel1Count)
let reel2 = getReel (fun s -> s.reel2Count)
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 =
[| "sushi"
"bigbrother"
@ -172,6 +148,36 @@ let resetJackpot amount =
|> Sql.executeNonQueryAsync
|> 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) =
task {
do! Messaging.defer ctx
@ -321,10 +327,10 @@ let spin multiplier (ctx : IDiscordContext) =
}
PlayerInteractions.executePlayerAction ctx (fun player -> async {
if player.Bank >= playAmount then
match! DbService.getLastPlayedSlotFromPlayer player.DiscordId with
match! getLastPlayedSlotFromPlayer player.DiscordId with
| Some timestamp ->
if DateTime.UtcNow - timestamp > TimeSpan.FromSeconds(8) then
do! DbService.updateSlotPlayedFromPlayer player.DiscordId
do! updateSlotPlayedFromPlayer player.DiscordId
do! execute player
else
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
}
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() =
inherit ApplicationCommandModule ()
@ -194,21 +245,22 @@ type Store() =
do! Messaging.sendSimpleResponse ctx msg
}
// let checkChannel (ctx : IDiscordContext) (storeFn : IDiscordContext -> Task) =
let checkChannel (ctx : IDiscordContext) =
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.channelMarket -> buy (Inventory.getItemsByType ItemType.Food) ctx
// | id when id = GuildEnvironment.channelAccessoryShop -> buy (Inventory.getItemsByType ItemType.Accessory) ctx
| id when id = GuildEnvironment.channelMarket -> buy ItemType.Food ctx
| id when id = GuildEnvironment.channelAccessoryShop -> buy ItemType.Accessory ctx
| _ ->
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
}
// [<SlashCommand("buy-item", "Purchase an item")>]
// member _.BuyItem (ctx : InteractionContext) = checkChannel (DiscordInteractionContext(ctx))
//
[<SlashCommand("buy-item", "Purchase an item")>]
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 ItemType.Hack)
@ -217,9 +269,6 @@ type Store() =
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))
//
[<SlashCommand("sell-hack", "Sell a hack for GoodBoyTokenz")>]
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")>]
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")>]
// member this.Inventory (ctx : InteractionContext) =
// enforceChannel (DiscordInteractionContext(ctx)) (sell "Shields" (Inventory.getItemsByType ItemType))
[<SlashCommand("inventory", "Check your inventory")>]
member this.Inventory (ctx : InteractionContext) =
showInventoryEmbed (DiscordInteractionContext ctx)

View File

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

View File

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