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 }
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 fx =
match modType with
@ -21,7 +21,7 @@ let readItem (reader : RowReader) =
| _ -> Add (int modAmount)
let ( _ , stat ) = StatId.TryParse(targetStat)
{ 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.Description = reader.string "description"
Item.IconUrl = reader.string "icon_url"
@ -66,7 +66,7 @@ let getPlayerInventory (did : uint64) =
JOIN "user" usr on inventory_item.user_id = usr.id
WHERE usr.discord_id = @did;
"""
|> Sql.executeAsync readItem
|> Sql.executeAsync (readItem false)
|> Async.AwaitTask
let addToPlayerInventory (did : uint64) (item : Item) =
@ -116,9 +116,10 @@ let getStoreItems (storeId : string) =
Stock = reader.int "stock"
LimitStock = reader.bool "limit_stock"
Available = reader.bool "available"
TotalSold = None
RequiresInvites = reader.intOrNone "require_invites"
RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64
StoreItem.Item = readItem reader
StoreItem.Item = readItem false reader
})
|> Async.AwaitTask
@ -137,9 +138,38 @@ let getAllActiveStoreItems () =
Stock = reader.int "stock"
LimitStock = reader.bool "limit_stock"
Available = reader.bool "available"
TotalSold = None
RequiresInvites = reader.intOrNone "require_invites"
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
@ -159,9 +189,10 @@ let getStoreItemBySymbol (itemSymbol : string) =
Stock = reader.int "stock"
LimitStock = reader.bool "limit_stock"
Available = reader.bool "available"
TotalSold = None
RequiresInvites = reader.intOrNone "require_invites"
RequiresRole = reader.stringOrNone "require_role" |> Option.map uint64
StoreItem.Item = readItem reader
StoreItem.Item = readItem false reader
})
|> Async.AwaitTask
@ -216,7 +247,7 @@ let getWeapons () =
drop_chance,can_trade,can_consume,attack_power,defense_power,class_name,max_stack,mods
FROM item WHERE category = 'Hack' OR category = 'Shield'
"""
|> Sql.executeAsync readItem
|> Sql.executeAsync (readItem false)
|> Async.AwaitTask
let consumeItem (did : uint64) (item : Item) =

View File

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

View File

@ -125,6 +125,7 @@ let getItemEmbeds owned (items : StoreItem list) =
| _ -> ())
// if item.Item.Type = ItemType.Whitelist then
// 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.Title <- titleText
embed.Description <- item.Item.Description
@ -221,10 +222,13 @@ let showJpegsEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlayerAct
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 {
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
let items' =
match filterBy with