WIP stock
This commit is contained in:
parent
d95264743b
commit
d99b7d6f2f
@ -108,6 +108,18 @@ let getStoreItems (channelId : uint64) =
|
||||
})
|
||||
|> Async.AwaitTask
|
||||
|
||||
let decrementItemStock (item : Item) =
|
||||
connStr
|
||||
|> Sql.connect
|
||||
|> Sql.parameters [ ( "iid" , Sql.int item.Id) ]
|
||||
|> Sql.query """
|
||||
UPDATE store_item SET stock = GREATEST(stock - 1, 0)
|
||||
WHERE store_item.item_id = @iid
|
||||
"""
|
||||
|> Sql.executeNonQueryAsync
|
||||
|> Async.AwaitTask
|
||||
|> Async.Ignore
|
||||
|
||||
let getWeapons () =
|
||||
connStr
|
||||
|> Sql.connect
|
||||
|
@ -4,7 +4,6 @@ open System
|
||||
open DSharpPlus
|
||||
open DSharpPlus.Entities
|
||||
open Degenz
|
||||
open Newtonsoft.Json
|
||||
|
||||
module Inventory =
|
||||
let getItemsByType itemType inventory =
|
||||
|
@ -63,9 +63,12 @@ let getBuyItemsEmbed (playerInventory : Inventory) (storeInventory : StoreItem l
|
||||
let buttons =
|
||||
storeInventory
|
||||
|> List.map (fun item ->
|
||||
if playerInventory |> List.exists (fun i -> i.Id = item.Item.Id)
|
||||
then DiscordButtonComponent(WeaponClass.getClassButtonColor item.Item, $"Buy-{item.Item.Id}", $"Own {item.Item.Name}", true)
|
||||
else DiscordButtonComponent(WeaponClass.getClassButtonColor item.Item, $"Buy-{item.Item.Id}", $"Buy {item.Item.Name}")
|
||||
let owned = playerInventory |> List.exists (fun i -> i.Id = item.Item.Id)
|
||||
let inStock = item.Available && (item.Stock > 0 || item.LimitStock = false)
|
||||
match owned , inStock with
|
||||
| false , true -> DiscordButtonComponent(WeaponClass.getClassButtonColor item.Item, $"Buy-{item.Item.Id}", $"Buy {item.Item.Name}")
|
||||
| false , false -> DiscordButtonComponent(WeaponClass.getClassButtonColor item.Item, $"Buy-{item.Item.Id}", $"{item.Item.Name} (Out of Stock)", true)
|
||||
| true , _ -> DiscordButtonComponent(WeaponClass.getClassButtonColor item.Item, $"Buy-{item.Item.Id}", $"Own {item.Item.Name}", true)
|
||||
:> DiscordComponent)
|
||||
|
||||
let builder =
|
||||
@ -101,6 +104,11 @@ let getSellEmbed (items : Inventory) =
|
||||
.AddComponents(buttons)
|
||||
.AsEphemeral(true)
|
||||
|
||||
let checkHasStock (item : StoreItem) player =
|
||||
if item.Stock > 0 || item.LimitStock = false
|
||||
then Ok player
|
||||
else Error $"{item.Item.Name} is out of stock! Check back later to purchase"
|
||||
|
||||
let checkHasSufficientFunds (item : Item) player =
|
||||
match item.Attributes with
|
||||
| CanBuy price ->
|
||||
@ -176,16 +184,17 @@ let purchaseItemEmbed (item : Item) =
|
||||
let handleBuyItem (ctx : IDiscordContext) itemId =
|
||||
executePlayerAction ctx (fun player -> async {
|
||||
let! storeInventory = DbService.getStoreItems (ctx.GetChannel().Id)
|
||||
// let item = storeInventory |> Inventory.findItemById itemId |> fun i -> { Item = i ; Stock = 1 ; LimitStock = false ; Available = true }
|
||||
let storeItem = storeInventory |> List.find (fun si -> si.Item.Id = itemId)
|
||||
let item = storeInventory |> List.map (fun i -> i.Item) |> Inventory.findItemById itemId
|
||||
do! player
|
||||
|> checkHasSufficientFunds item
|
||||
>>= checkHasStock storeItem
|
||||
>>= checkDoesntExceedStackCap item
|
||||
|> handleResultWithResponse ctx (fun player -> async {
|
||||
let price = match item.Attributes with CanBuy price -> price | _ -> 0<GBT>
|
||||
do! DbService.updatePlayerCurrency -price player |> Async.Ignore
|
||||
do! DbService.addToPlayerInventory player.DiscordId item |> Async.Ignore
|
||||
// do! ctx.FollowUp $"Successfully purchased {item.Name}! You now have {player.Bank - price} 💰$GBT remaining"
|
||||
do! DbService.decrementItemStock item
|
||||
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
||||
builder.AddEmbed(purchaseItemEmbed (item)) |> ignore
|
||||
do! ctx.FollowUp builder |> Async.AwaitTask
|
||||
|
Loading…
x
Reference in New Issue
Block a user