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 }
|
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) =
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user