Implement total sold for raffle items
This commit is contained in:
parent
955dca4664
commit
5dcbe1f3ed
@ -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) =
|
||||
|
@ -141,6 +141,7 @@ type StoreItem = {
|
||||
Stock : int
|
||||
LimitStock : bool
|
||||
Available : bool
|
||||
TotalSold : int option
|
||||
RequiresRole : uint64 option
|
||||
RequiresInvites : int option
|
||||
Item : Item
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user