Implement total sold for raffle items

This commit is contained in:
Joseph Ferano 2022-06-14 21:11:06 +07:00
parent 955dca4664
commit 5dcbe1f3ed
3 changed files with 45 additions and 9 deletions

View File

@ -10,7 +10,7 @@ let connStr = GuildEnvironment.connectionString
type StatMod = { mod_type :string ; target_stat : string ; mod_amount : float } type StatMod = { mod_type :string ; target_stat : string ; mod_amount : float }
NpgsqlConnection.GlobalTypeMapper.MapComposite<StatMod>("stat_mod") |> ignore NpgsqlConnection.GlobalTypeMapper.MapComposite<StatMod>("stat_mod") |> ignore
let readItem (reader : RowReader) = let readItem isRaffle (reader : RowReader) =
let convertStatMod { mod_type = modType ; target_stat = targetStat; mod_amount = modAmount } = let convertStatMod { mod_type = modType ; target_stat = targetStat; mod_amount = modAmount } =
let fx = let fx =
match modType with match modType with
@ -21,7 +21,7 @@ let readItem (reader : RowReader) =
| _ -> Add (int modAmount) | _ -> Add (int modAmount)
let ( _ , stat ) = StatId.TryParse(targetStat) let ( _ , stat ) = StatId.TryParse(targetStat)
{ TargetStat = stat ; Effect = fx } { TargetStat = stat ; Effect = fx }
{ Item.Id = reader.string "id" { Item.Id = if isRaffle then reader.string "raffle_id" else reader.string "id"
Item.Name = reader.string "name" Item.Name = reader.string "name"
Item.Description = reader.string "description" Item.Description = reader.string "description"
Item.IconUrl = reader.string "icon_url" Item.IconUrl = reader.string "icon_url"
@ -66,7 +66,7 @@ let getPlayerInventory (did : uint64) =
JOIN "user" usr on inventory_item.user_id = usr.id JOIN "user" usr on inventory_item.user_id = usr.id
WHERE usr.discord_id = @did; WHERE usr.discord_id = @did;
""" """
|> Sql.executeAsync readItem |> Sql.executeAsync (readItem false)
|> Async.AwaitTask |> Async.AwaitTask
let addToPlayerInventory (did : uint64) (item : Item) = let addToPlayerInventory (did : uint64) (item : Item) =
@ -116,9 +116,10 @@ let getStoreItems (storeId : string) =
Stock = reader.int "stock" Stock = reader.int "stock"
LimitStock = reader.bool "limit_stock" LimitStock = reader.bool "limit_stock"
Available = reader.bool "available" Available = reader.bool "available"
TotalSold = None
RequiresInvites = reader.intOrNone "require_invites" RequiresInvites = reader.intOrNone "require_invites"
RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64 RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64
StoreItem.Item = readItem reader StoreItem.Item = readItem false reader
}) })
|> Async.AwaitTask |> Async.AwaitTask
@ -137,9 +138,38 @@ let getAllActiveStoreItems () =
Stock = reader.int "stock" Stock = reader.int "stock"
LimitStock = reader.bool "limit_stock" LimitStock = reader.bool "limit_stock"
Available = reader.bool "available" Available = reader.bool "available"
TotalSold = None
RequiresInvites = reader.intOrNone "require_invites" RequiresInvites = reader.intOrNone "require_invites"
RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64 RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64
StoreItem.Item = readItem reader StoreItem.Item = readItem false reader
})
|> Async.AwaitTask
let getRafflesWithPurchases storeId =
connStr
|> Sql.connect
|> Sql.parameters [ "sid" , Sql.string storeId ]
|> Sql.query """
WITH raffles AS
(SELECT store_id,stock,available,limit_stock,i.id AS raffle_id,name,description,icon_url,image_url,category,require_role,require_invites,
buy_price,sell_price,rate_limit,expiration,drop_chance,can_trade,can_consume,attack_power,defense_power,class_name,max_stack,mods
FROM store_item
JOIN item i on store_item.item_id = i.id
WHERE store_id = @sid AND store_item.unlisted = false)
SELECT * FROM raffles
INNER JOIN (SELECT item_id, count(*) AS total FROM inventory_item
WHERE item_id = ANY (SELECT raffle_id FROM raffles)
GROUP BY item_id) total_raffles ON total_raffles.item_id = raffle_id;
"""
|> Sql.executeAsync (fun reader -> {
StoreId = reader.string "store_id"
Stock = reader.int "stock"
LimitStock = reader.bool "limit_stock"
Available = reader.bool "available"
TotalSold = Some <| reader.int "total"
RequiresInvites = reader.intOrNone "require_invites"
RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64
StoreItem.Item = readItem true reader
}) })
|> Async.AwaitTask |> Async.AwaitTask
@ -159,9 +189,10 @@ let getStoreItemBySymbol (itemSymbol : string) =
Stock = reader.int "stock" Stock = reader.int "stock"
LimitStock = reader.bool "limit_stock" LimitStock = reader.bool "limit_stock"
Available = reader.bool "available" Available = reader.bool "available"
TotalSold = None
RequiresInvites = reader.intOrNone "require_invites" RequiresInvites = reader.intOrNone "require_invites"
RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64 RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64
StoreItem.Item = readItem reader StoreItem.Item = readItem false reader
}) })
|> Async.AwaitTask |> Async.AwaitTask
@ -216,7 +247,7 @@ let getWeapons () =
drop_chance,can_trade,can_consume,attack_power,defense_power,class_name,max_stack,mods drop_chance,can_trade,can_consume,attack_power,defense_power,class_name,max_stack,mods
FROM item WHERE category = 'Hack' OR category = 'Shield' FROM item WHERE category = 'Hack' OR category = 'Shield'
""" """
|> Sql.executeAsync readItem |> Sql.executeAsync (readItem false)
|> Async.AwaitTask |> Async.AwaitTask
let consumeItem (did : uint64) (item : Item) = let consumeItem (did : uint64) (item : Item) =

View File

@ -141,6 +141,7 @@ type StoreItem = {
Stock : int Stock : int
LimitStock : bool LimitStock : bool
Available : bool Available : bool
TotalSold : int option
RequiresRole : uint64 option RequiresRole : uint64 option
RequiresInvites : int option RequiresInvites : int option
Item : Item Item : Item

View File

@ -125,6 +125,7 @@ let getItemEmbeds owned (items : StoreItem list) =
| _ -> ()) | _ -> ())
// if item.Item.Type = ItemType.Whitelist then // if item.Item.Type = ItemType.Whitelist then
// embed.AddField("Mint Allowance", (if item.Item.Id = "WHITEOG" then 2 else 1) |> string, true) |> ignore // embed.AddField("Mint Allowance", (if item.Item.Id = "WHITEOG" then 2 else 1) |> string, true) |> ignore
item.TotalSold |> Option.iter (fun total -> embed.AddField("Total Sold", string total) |> ignore)
embed.Color <- WeaponClass.getClassEmbedColor item.Item embed.Color <- WeaponClass.getClassEmbedColor item.Item
embed.Title <- titleText embed.Title <- titleText
embed.Description <- item.Item.Description embed.Description <- item.Item.Description
@ -221,10 +222,13 @@ let showJpegsEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlayerAct
do! ctx.FollowUp builder |> Async.AwaitTask do! ctx.FollowUp builder |> Async.AwaitTask
}) })
let buy storeId (filterBy : ItemType option) (ctx : IDiscordContext) = let buy (storeId : string) (filterBy : ItemType option) (ctx : IDiscordContext) =
executePlayerAction ctx (fun player -> async { executePlayerAction ctx (fun player -> async {
try try
let! items = DbService.getStoreItems storeId let! items =
if storeId.StartsWith("BACKALLEY")
then DbService.getRafflesWithPurchases storeId
else DbService.getStoreItems storeId
if items.Length > 0 then if items.Length > 0 then
let items' = let items' =
match filterBy with match filterBy with