From 5dcbe1f3ed4cdf0b3c3723fb7335b31ff5b32f9b Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Tue, 14 Jun 2022 21:11:06 +0700 Subject: [PATCH] Implement total sold for raffle items --- Bot/DbService.fs | 45 ++++++++++++++++++++++++++++++++++++++------- Bot/GameTypes.fs | 1 + Bot/Games/Store.fs | 8 ++++++-- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/Bot/DbService.fs b/Bot/DbService.fs index e01c9f4..dbfc027 100644 --- a/Bot/DbService.fs +++ b/Bot/DbService.fs @@ -10,7 +10,7 @@ let connStr = GuildEnvironment.connectionString type StatMod = { mod_type :string ; target_stat : string ; mod_amount : float } NpgsqlConnection.GlobalTypeMapper.MapComposite("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) = diff --git a/Bot/GameTypes.fs b/Bot/GameTypes.fs index 2da086d..30afbce 100644 --- a/Bot/GameTypes.fs +++ b/Bot/GameTypes.fs @@ -141,6 +141,7 @@ type StoreItem = { Stock : int LimitStock : bool Available : bool + TotalSold : int option RequiresRole : uint64 option RequiresInvites : int option Item : Item diff --git a/Bot/Games/Store.fs b/Bot/Games/Store.fs index 6907711..e2abc34 100644 --- a/Bot/Games/Store.fs +++ b/Bot/Games/Store.fs @@ -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