Generalize DB calls for Jackpot and Whitelist
This commit is contained in:
parent
00f3633b2e
commit
5a7af39717
@ -151,7 +151,7 @@ type AdminBot() =
|
|||||||
[<SlashCommandPermissions(Permissions.Administrator)>]
|
[<SlashCommandPermissions(Permissions.Administrator)>]
|
||||||
[<SlashCommand("admin-whitelist-stock", "Set whitelist stock", false)>]
|
[<SlashCommand("admin-whitelist-stock", "Set whitelist stock", false)>]
|
||||||
member this.SetStock (ctx : InteractionContext, [<Option("amount", "Set the amount of WL available for purchase")>] amount : int64) =
|
member this.SetStock (ctx : InteractionContext, [<Option("amount", "Set the amount of WL available for purchase")>] amount : int64) =
|
||||||
enforceAdmin (DiscordInteractionContext ctx) (InviteTracker.setCurrentWhitelistStock (int amount))
|
enforceAdmin (DiscordInteractionContext ctx) (InviteTracker.setCurrentWhitelistStock (int amount * 1<GBT>))
|
||||||
|
|
||||||
[<SlashCommandPermissions(Permissions.Administrator)>]
|
[<SlashCommandPermissions(Permissions.Administrator)>]
|
||||||
[<SlashCommand("admin-send-embed", "Set whitelist stock", false)>]
|
[<SlashCommand("admin-send-embed", "Set whitelist stock", false)>]
|
||||||
|
@ -79,6 +79,16 @@ let addToPlayerInventory (did : uint64) (item : Item) =
|
|||||||
|> Sql.executeNonQueryAsync
|
|> Sql.executeNonQueryAsync
|
||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
|
|
||||||
|
let removeFromPlayerInventory (did : uint64) (item : Item) =
|
||||||
|
connStr
|
||||||
|
|> Sql.connect
|
||||||
|
|> Sql.parameters [ ( "@did" , Sql.string (string did) ) ; ( "iid" , Sql.string item.Id )]
|
||||||
|
|> Sql.query """
|
||||||
|
DELETE FROM inventory_item WHERE item_id = @iid AND user_id = @did
|
||||||
|
"""
|
||||||
|
|> Sql.executeNonQueryAsync
|
||||||
|
|> Async.AwaitTask
|
||||||
|
|
||||||
let getStoreSymbol (storeId : string) =
|
let getStoreSymbol (storeId : string) =
|
||||||
connStr
|
connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
@ -109,8 +119,29 @@ let getStoreItems (storeId : string) =
|
|||||||
})
|
})
|
||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
|
|
||||||
let decrementItemStock (item : Item) =
|
let getStoreItemBySymbol (itemSymbol : string) =
|
||||||
connStr
|
connStr
|
||||||
|
|> Sql.connect
|
||||||
|
|> Sql.parameters [ "iid", Sql.string itemSymbol ]
|
||||||
|
|> Sql.query """
|
||||||
|
SELECT store_id,stock,available,limit_stock,i.id,name,description,icon_url,image_url,category,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 item_id = @iid;
|
||||||
|
"""
|
||||||
|
|> Sql.executeRowAsync (fun reader -> {
|
||||||
|
StoreId = reader.string "store_id"
|
||||||
|
Stock = reader.int "stock"
|
||||||
|
LimitStock = reader.bool "limit_stock"
|
||||||
|
Available = reader.bool "available"
|
||||||
|
StoreItem.Item = readItem reader
|
||||||
|
})
|
||||||
|
|> Async.AwaitTask
|
||||||
|
|
||||||
|
let decrementItemStock (item : Item) = async {
|
||||||
|
try
|
||||||
|
do! connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
|> Sql.parameters [ ( "iid" , Sql.string item.Id) ]
|
|> Sql.parameters [ ( "iid" , Sql.string item.Id) ]
|
||||||
|> Sql.query """
|
|> Sql.query """
|
||||||
@ -120,7 +151,39 @@ let decrementItemStock (item : Item) =
|
|||||||
|> Sql.executeNonQueryAsync
|
|> Sql.executeNonQueryAsync
|
||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
|> Async.Ignore
|
|> Async.Ignore
|
||||||
|
return true
|
||||||
|
with _ -> return false
|
||||||
|
}
|
||||||
|
|
||||||
|
let incrementItemStock (amount : int<GBT>) symbol =
|
||||||
|
connStr
|
||||||
|
|> Sql.connect
|
||||||
|
|> Sql.parameters [ ( "iid" , Sql.string symbol) ]
|
||||||
|
|> Sql.parameters [ ( "amount" , Sql.int (int amount)) ]
|
||||||
|
|> Sql.query """
|
||||||
|
UPDATE store_item SET stock = stock + @amount
|
||||||
|
WHERE store_item.item_id = @iid
|
||||||
|
"""
|
||||||
|
|> Sql.executeNonQueryAsync
|
||||||
|
|> Async.AwaitTask
|
||||||
|
|> Async.Ignore
|
||||||
|
|
||||||
|
let setItemStock (amount : int<GBT>) symbol = async {
|
||||||
|
try
|
||||||
|
do! connStr
|
||||||
|
|> Sql.connect
|
||||||
|
|> Sql.parameters [ ( "amount" , Sql.int (int amount) ) ]
|
||||||
|
|> Sql.parameters [ ( "iid" , Sql.string symbol ) ]
|
||||||
|
|> Sql.query """
|
||||||
|
UPDATE store_item SET stock = @amount
|
||||||
|
WHERE store_item.item_id = (SELECT id FROM item WHERE id = @iid)
|
||||||
|
"""
|
||||||
|
|> Sql.executeNonQueryAsync
|
||||||
|
|> Async.AwaitTask
|
||||||
|
|> Async.Ignore
|
||||||
|
return true
|
||||||
|
with _ -> return false
|
||||||
|
}
|
||||||
let getWeapons () =
|
let getWeapons () =
|
||||||
connStr
|
connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
@ -234,11 +297,11 @@ let tryFindPlayer (discordId : uint64) = async {
|
|||||||
return None
|
return None
|
||||||
}
|
}
|
||||||
|
|
||||||
let updatePlayerCurrency (addAmount : int<GBT>) (player : PlayerData) =
|
let updatePlayerCurrency (addAmount : int<GBT>) (did : uint64) =
|
||||||
connStr
|
connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
|> Sql.parameters [
|
|> Sql.parameters [
|
||||||
"did", Sql.string (string player.DiscordId)
|
"did", Sql.string (string did)
|
||||||
"gbt", Sql.int (int addAmount)
|
"gbt", Sql.int (int addAmount)
|
||||||
] |> Sql.query """
|
] |> Sql.query """
|
||||||
UPDATE "user" SET gbt = gbt + GREATEST(gbt + @gbt, 0) WHERE discord_id = @did;
|
UPDATE "user" SET gbt = gbt + GREATEST(gbt + @gbt, 0) WHERE discord_id = @did;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
namespace Degenz
|
namespace Degenz
|
||||||
|
|
||||||
open System
|
open System
|
||||||
open System.Threading
|
|
||||||
open DSharpPlus
|
open DSharpPlus
|
||||||
open DSharpPlus.Entities
|
open DSharpPlus.Entities
|
||||||
open Degenz
|
open Degenz
|
||||||
@ -18,6 +17,8 @@ module Inventory =
|
|||||||
|
|
||||||
let findItemById id (inventory : Inventory) = inventory |> List.find (fun item -> item.Id = id)
|
let findItemById id (inventory : Inventory) = inventory |> List.find (fun item -> item.Id = id)
|
||||||
|
|
||||||
|
let getBuyPrice item = match item.Attributes with CanBuy price -> price | _ -> 0<GBT>
|
||||||
|
|
||||||
let getHackItem item =
|
let getHackItem item =
|
||||||
match item.Type , item.Attributes with
|
match item.Type , item.Attributes with
|
||||||
| ItemType.Hack , CanBuy buyPrice & CanSell _ & CanAttack power & CanRateLimit cooldown & CanClass ``class``->
|
| ItemType.Hack , CanBuy buyPrice & CanSell _ & CanAttack power & CanRateLimit cooldown & CanClass ``class``->
|
||||||
|
@ -125,38 +125,6 @@ let sleepTime = 1500
|
|||||||
let mutable guildEmojis : Map<string, DiscordEmoji> option = None
|
let mutable guildEmojis : Map<string, DiscordEmoji> option = None
|
||||||
let mutable anyEmoji : DiscordEmoji option = None
|
let mutable anyEmoji : DiscordEmoji option = None
|
||||||
|
|
||||||
let getJackpotAmount () =
|
|
||||||
GuildEnvironment.connectionString
|
|
||||||
|> Sql.connect
|
|
||||||
|> Sql.query """
|
|
||||||
SELECT stock FROM store_item
|
|
||||||
WHERE store_item.item_id = (SELECT id FROM item WHERE id = 'JACKPOT')
|
|
||||||
"""
|
|
||||||
|> Sql.executeRowAsync (fun read -> (read.int "stock") * 1<GBT>)
|
|
||||||
|> Async.AwaitTask
|
|
||||||
|
|
||||||
let incrementJackpot amount =
|
|
||||||
GuildEnvironment.connectionString
|
|
||||||
|> Sql.connect
|
|
||||||
|> Sql.parameters [ ( "amount" , Sql.int (int amount) ) ]
|
|
||||||
|> Sql.query """
|
|
||||||
UPDATE store_item SET stock = stock + @amount
|
|
||||||
WHERE store_item.item_id = (SELECT id FROM item WHERE id = 'JACKPOT')
|
|
||||||
"""
|
|
||||||
|> Sql.executeNonQueryAsync
|
|
||||||
|> Async.AwaitTask
|
|
||||||
|
|
||||||
let resetJackpot amount =
|
|
||||||
GuildEnvironment.connectionString
|
|
||||||
|> Sql.connect
|
|
||||||
|> Sql.parameters [ ( "amount" , Sql.int (int amount) ) ]
|
|
||||||
|> Sql.query """
|
|
||||||
UPDATE store_item SET stock = @amount
|
|
||||||
WHERE store_item.item_id = (SELECT id FROM item WHERE symbol = 'JACKPOT')
|
|
||||||
"""
|
|
||||||
|> Sql.executeNonQueryAsync
|
|
||||||
|> Async.AwaitTask
|
|
||||||
|
|
||||||
let getLastPlayedSlotFromPlayer (did : uint64) = async {
|
let getLastPlayedSlotFromPlayer (did : uint64) = async {
|
||||||
let! events =
|
let! events =
|
||||||
GuildEnvironment.connectionString
|
GuildEnvironment.connectionString
|
||||||
@ -205,10 +173,10 @@ let handlePrizeTable (ctx : IDiscordContext) =
|
|||||||
else
|
else
|
||||||
$"{acc}\n{line} | {prizeTxt}"
|
$"{acc}\n{line} | {prizeTxt}"
|
||||||
(i + 1) , text
|
(i + 1) , text
|
||||||
let! jackpot = getJackpotAmount ()
|
let! jackpot = DbService.getStoreItemBySymbol "WHITELIST"
|
||||||
let _ , rows = Array.fold folder (0, "") prizeTable
|
let _ , rows = Array.fold folder (0, "") prizeTable
|
||||||
embed.Color <- DiscordColor.Green
|
embed.Color <- DiscordColor.Green
|
||||||
embed.Title <- $"CURRENT JACKPOT: `{jackpot} 💰 $GBT`"
|
embed.Title <- $"CURRENT JACKPOT: `{jackpot.Stock} 💰 $GBT`"
|
||||||
embed.Description <- embed.Description + $"\n\n**PRIZE TABLE **\n{rows}\n\n**ANY SAME 3** | **100** $GBT"
|
embed.Description <- embed.Description + $"\n\n**PRIZE TABLE **\n{rows}\n\n**ANY SAME 3** | **100** $GBT"
|
||||||
do! ctx.FollowUp(DiscordFollowupMessageBuilder().AsEphemeral().AddEmbed(embed))
|
do! ctx.FollowUp(DiscordFollowupMessageBuilder().AsEphemeral().AddEmbed(embed))
|
||||||
do! Analytics.prizeTableViewed (ctx.GetDiscordMember())
|
do! Analytics.prizeTableViewed (ctx.GetDiscordMember())
|
||||||
@ -247,8 +215,8 @@ let spin multiplier (ctx : IDiscordContext) =
|
|||||||
| 1 -> PlayPricex1
|
| 1 -> PlayPricex1
|
||||||
| 2 -> PlayPricex2
|
| 2 -> PlayPricex2
|
||||||
| _ -> PlayPricex3
|
| _ -> PlayPricex3
|
||||||
let execute player = async {
|
let execute (player : PlayerData) = async {
|
||||||
do! DbService.updatePlayerCurrency -playAmount player |> Async.Ignore
|
do! DbService.updatePlayerCurrency -playAmount player.DiscordId |> Async.Ignore
|
||||||
let random = System.Random(System.Guid.NewGuid().GetHashCode())
|
let random = System.Random(System.Guid.NewGuid().GetHashCode())
|
||||||
let results = [| reel1.[random.Next(0, reel1.Length)] ; reel2.[random.Next(0, reel2.Length)] ; reel3.[random.Next(0, reel3.Length)] |]
|
let results = [| reel1.[random.Next(0, reel1.Length)] ; reel2.[random.Next(0, reel2.Length)] ; reel3.[random.Next(0, reel3.Length)] |]
|
||||||
|
|
||||||
@ -288,7 +256,7 @@ let spin multiplier (ctx : IDiscordContext) =
|
|||||||
match prize with
|
match prize with
|
||||||
| Some (Money amount) ->
|
| Some (Money amount) ->
|
||||||
let prizeWithMultiplier = amount * multiplier
|
let prizeWithMultiplier = amount * multiplier
|
||||||
do! DbService.updatePlayerCurrency prizeWithMultiplier player |> Async.Ignore
|
do! DbService.updatePlayerCurrency prizeWithMultiplier player.DiscordId |> Async.Ignore
|
||||||
embed.Color <- DiscordColor.Green
|
embed.Color <- DiscordColor.Green
|
||||||
embed.Description <- $"You WIN `💰` **{prizeWithMultiplier}** GBT 🎉"
|
embed.Description <- $"You WIN `💰` **{prizeWithMultiplier}** GBT 🎉"
|
||||||
embed.AddField("Bet", $"{playAmount}", true) |> ignore
|
embed.AddField("Bet", $"{playAmount}", true) |> ignore
|
||||||
@ -298,17 +266,17 @@ let spin multiplier (ctx : IDiscordContext) =
|
|||||||
// do! incrementJackpot multiplier |> Async.Ignore
|
// do! incrementJackpot multiplier |> Async.Ignore
|
||||||
return "WON" , prizeWithMultiplier
|
return "WON" , prizeWithMultiplier
|
||||||
| Some (Jackpot) ->
|
| Some (Jackpot) ->
|
||||||
let! jackpot = getJackpotAmount ()
|
let! jackpot = DbService.getStoreItemBySymbol "JACKPOT"
|
||||||
embed.Color <- DiscordColor.Green
|
embed.Color <- DiscordColor.Green
|
||||||
embed.Description <- $"🎉🎉 YOU HIT THE JACKPOT 🎉🎉"
|
embed.Description <- $"🎉🎉 YOU HIT THE JACKPOT 🎉🎉"
|
||||||
embed.AddField("Bet", $"{playAmount}", true) |> ignore
|
embed.AddField("Bet", $"{playAmount}", true) |> ignore
|
||||||
embed.AddField("Prize", $"{jackpot}", true) |> ignore
|
embed.AddField("Prize", $"{jackpot}", true) |> ignore
|
||||||
addGBTField embed jackpot
|
addGBTField embed (Inventory.getBuyPrice jackpot.Item)
|
||||||
do! DbService.updatePlayerCurrency jackpot player |> Async.Ignore
|
do! DbService.updatePlayerCurrency (Inventory.getBuyPrice jackpot.Item) player.DiscordId |> Async.Ignore
|
||||||
do! resetJackpot BaseJackpotAmount |> Async.Ignore
|
do! DbService.setItemStock BaseJackpotAmount "JACKPOT" |> Async.Ignore
|
||||||
return "JACKPOT" , jackpot
|
return "JACKPOT" , Inventory.getBuyPrice jackpot.Item
|
||||||
| None ->
|
| None ->
|
||||||
do! incrementJackpot 1 |> Async.Ignore
|
do! DbService.incrementItemStock 1<GBT> "JACKPOT" |> Async.Ignore
|
||||||
embed.Description <- $"You LOST `💰` **{playAmount}** $GBT 😭"
|
embed.Description <- $"You LOST `💰` **{playAmount}** $GBT 😭"
|
||||||
embed.Color <- DiscordColor.Red
|
embed.Color <- DiscordColor.Red
|
||||||
embed.AddField("Bet", $"{playAmount}", true) |> ignore
|
embed.AddField("Bet", $"{playAmount}", true) |> ignore
|
||||||
@ -367,7 +335,7 @@ let handleButton (_ : DiscordClient) (event : ComponentInteractionCreateEventArg
|
|||||||
|
|
||||||
let handleGuildDownloadCompleted (_ : DiscordClient) (event : GuildDownloadCompletedEventArgs) =
|
let handleGuildDownloadCompleted (_ : DiscordClient) (event : GuildDownloadCompletedEventArgs) =
|
||||||
task {
|
task {
|
||||||
let ( result , guild ) = event.Guilds.TryGetValue(GuildEnvironment.guildId)
|
let ( _ , guild ) = event.Guilds.TryGetValue(GuildEnvironment.guildId)
|
||||||
guildEmojis <-
|
guildEmojis <-
|
||||||
guild.Emojis
|
guild.Emojis
|
||||||
|> Seq.map (fun kvp -> kvp.Value) |> Seq.toArray
|
|> Seq.map (fun kvp -> kvp.Value) |> Seq.toArray
|
||||||
@ -393,8 +361,8 @@ let sendEmbed (jackpotNumChannel : DiscordChannel) slotsChannel (message : Disco
|
|||||||
embed.Title <- "Degenz Slot Machine"
|
embed.Title <- "Degenz Slot Machine"
|
||||||
embed.ImageUrl <- "https://s7.gifyu.com/images/ezgif.com-gif-maker-268ecb6e4d28bd55a0.gif"
|
embed.ImageUrl <- "https://s7.gifyu.com/images/ezgif.com-gif-maker-268ecb6e4d28bd55a0.gif"
|
||||||
embed.Description <- "Try Your Hand at a Game of SLOTS!\nEvery Spin Adds to The JACKPOT!\nGood luck Degenz ✊"
|
embed.Description <- "Try Your Hand at a Game of SLOTS!\nEvery Spin Adds to The JACKPOT!\nGood luck Degenz ✊"
|
||||||
let! jackpot = getJackpotAmount ()
|
let! jackpot = DbService.getStoreItemBySymbol "JACKPOT"
|
||||||
embed.Title <- $"CURRENT JACKPOT: `{jackpot} 💰 $GBT`"
|
embed.Title <- $"CURRENT JACKPOT: `{jackpot.Stock} 💰 $GBT`"
|
||||||
|
|
||||||
// Update Jackpot channel
|
// Update Jackpot channel
|
||||||
// try
|
// try
|
||||||
|
@ -10,6 +10,43 @@ open Degenz
|
|||||||
open Degenz.Messaging
|
open Degenz.Messaging
|
||||||
open Degenz.PlayerInteractions
|
open Degenz.PlayerInteractions
|
||||||
|
|
||||||
|
let checkHasStock (item : StoreItem) player =
|
||||||
|
if item.Stock > 0 || item.LimitStock = false
|
||||||
|
then Ok player
|
||||||
|
else Error $"{item.Item.Name} is out of stock! Check back later to purchase"
|
||||||
|
|
||||||
|
let checkHasSufficientFunds (item : Item) player =
|
||||||
|
match item.Attributes with
|
||||||
|
| CanBuy price ->
|
||||||
|
if player.Bank - price >= 0<GBT>
|
||||||
|
then Ok player
|
||||||
|
else Error $"You do not have sufficient funds to buy this item! Current balance: {player.Bank} GBT"
|
||||||
|
| _ -> Error $"{item.Name} item cannot be bought"
|
||||||
|
|
||||||
|
let checkDoesntExceedStackCap (item : Item) player =
|
||||||
|
let itemCount =
|
||||||
|
player.Inventory
|
||||||
|
|> List.countBy (fun i -> i.Id)
|
||||||
|
|> List.tryFind (fst >> ((=) item.Id))
|
||||||
|
|> Option.map snd
|
||||||
|
match item.Attributes , itemCount with
|
||||||
|
| CanStack max , Some count ->
|
||||||
|
if count >= max
|
||||||
|
then Error $"You own the maximum allowed amount {item.Name}!"
|
||||||
|
else Ok player
|
||||||
|
| _ , Some _ -> Error $"You already own this item"
|
||||||
|
| _ -> Ok player
|
||||||
|
|
||||||
|
let checkSoldItemAlready (item : Item) player =
|
||||||
|
if player.Inventory |> List.exists (fun i -> item.Id = i.Id)
|
||||||
|
then Ok player
|
||||||
|
else Error $"{item.Name} not found in your inventory! Looks like you sold it already."
|
||||||
|
|
||||||
|
let checkHasItemsInArsenal itemType items player =
|
||||||
|
if List.isEmpty items |> not
|
||||||
|
then Ok player
|
||||||
|
else Error $"You currently have no {itemType} in your arsenal to sell!"
|
||||||
|
|
||||||
let getItemEmbeds owned (items : StoreItem list) =
|
let getItemEmbeds owned (items : StoreItem list) =
|
||||||
items
|
items
|
||||||
|> List.countBy (fun item -> item.Item.Id)
|
|> List.countBy (fun item -> item.Item.Id)
|
||||||
@ -80,6 +117,19 @@ let getBuyItemsEmbed storeId (playerInventory : Inventory) (storeInventory : Sto
|
|||||||
|> List.iter (fun btns -> builder.AddComponents(btns) |> ignore)
|
|> List.iter (fun btns -> builder.AddComponents(btns) |> ignore)
|
||||||
builder
|
builder
|
||||||
|
|
||||||
|
let purchaseItemEmbed (item : Item) =
|
||||||
|
let embed = DiscordEmbedBuilder()
|
||||||
|
embed.ImageUrl <- item.IconUrl
|
||||||
|
embed.Title <- $"Purchased {item.Name}"
|
||||||
|
match item.Type with
|
||||||
|
| ItemType.Jpeg ->
|
||||||
|
if item.Id.Contains "RAFFLE" then
|
||||||
|
embed.Description <- $"Congratulations! You are in the draw for the {item.Name}. The winner will be announced shortly"
|
||||||
|
embed.ImageUrl <- item.Description
|
||||||
|
else
|
||||||
|
embed.Description <- $"Congratulations! You own the rights to the {item.Name} NFT. Please create a ticket in the support channel and we will transfer to your wallet"
|
||||||
|
| _ -> embed.Description <- $"Purchased {item.Name}"
|
||||||
|
embed
|
||||||
|
|
||||||
let getSellEmbed (items : Inventory) =
|
let getSellEmbed (items : Inventory) =
|
||||||
let embeds , buttons =
|
let embeds , buttons =
|
||||||
@ -104,42 +154,15 @@ let getSellEmbed (items : Inventory) =
|
|||||||
.AddComponents(buttons)
|
.AddComponents(buttons)
|
||||||
.AsEphemeral(true)
|
.AsEphemeral(true)
|
||||||
|
|
||||||
let checkHasStock (item : StoreItem) player =
|
let showJpegsEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async {
|
||||||
if item.Stock > 0 || item.LimitStock = false
|
let jpegs =
|
||||||
then Ok player
|
|
||||||
else Error $"{item.Item.Name} is out of stock! Check back later to purchase"
|
|
||||||
|
|
||||||
let checkHasSufficientFunds (item : Item) player =
|
|
||||||
match item.Attributes with
|
|
||||||
| CanBuy price ->
|
|
||||||
if player.Bank - price >= 0<GBT>
|
|
||||||
then Ok player
|
|
||||||
else Error $"You do not have sufficient funds to buy this item! Current balance: {player.Bank} GBT"
|
|
||||||
| _ -> Error $"{item.Name} item cannot be bought"
|
|
||||||
|
|
||||||
let checkDoesntExceedStackCap (item : Item) player =
|
|
||||||
let itemCount =
|
|
||||||
player.Inventory
|
player.Inventory
|
||||||
|> List.countBy (fun i -> i.Id)
|
|> Inventory.getItemsByType ItemType.Jpeg
|
||||||
|> List.tryFind (fst >> ((=) item.Id))
|
|> List.map (fun i -> { StoreId = "BACKALLEY" ; Item = i ; Stock = 1 ; LimitStock = false ; Available = true })
|
||||||
|> Option.map snd
|
let embeds = getItemEmbeds true jpegs
|
||||||
match item.Attributes , itemCount with
|
let builder = DiscordFollowupMessageBuilder().AddEmbeds(embeds).AsEphemeral(true)
|
||||||
| CanStack max , Some count ->
|
do! ctx.FollowUp builder |> Async.AwaitTask
|
||||||
if count >= max
|
})
|
||||||
then Error $"You own the maximum allowed amount {item.Name}!"
|
|
||||||
else Ok player
|
|
||||||
| _ , Some _ -> Error $"You already own this item"
|
|
||||||
| _ -> Ok player
|
|
||||||
|
|
||||||
let checkSoldItemAlready (item : Item) player =
|
|
||||||
if player.Inventory |> List.exists (fun i -> item.Id = i.Id)
|
|
||||||
then Ok player
|
|
||||||
else Error $"{item.Name} not found in your inventory! Looks like you sold it already."
|
|
||||||
|
|
||||||
let checkHasItemsInArsenal itemType items player =
|
|
||||||
if List.isEmpty items |> not
|
|
||||||
then Ok player
|
|
||||||
else Error $"You currently have no {itemType} in your arsenal to sell!"
|
|
||||||
|
|
||||||
let buy storeId (filterBy : ItemType option) (ctx : IDiscordContext) =
|
let buy storeId (filterBy : ItemType option) (ctx : IDiscordContext) =
|
||||||
executePlayerAction ctx (fun player -> async {
|
executePlayerAction ctx (fun player -> async {
|
||||||
@ -168,20 +191,6 @@ let sell itemType getItems (ctx : IDiscordContext) =
|
|||||||
do! Analytics.buyItemCommand (ctx.GetDiscordMember()) itemType
|
do! Analytics.buyItemCommand (ctx.GetDiscordMember()) itemType
|
||||||
})
|
})
|
||||||
|
|
||||||
let purchaseItemEmbed (item : Item) =
|
|
||||||
let embed = DiscordEmbedBuilder()
|
|
||||||
embed.ImageUrl <- item.IconUrl
|
|
||||||
embed.Title <- $"Purchased {item.Name}"
|
|
||||||
match item.Type with
|
|
||||||
| ItemType.Jpeg ->
|
|
||||||
if item.Id.Contains "RAFFLE" then
|
|
||||||
embed.Description <- $"Congratulations! You are in the draw for the {item.Name}. The winner will be announced shortly"
|
|
||||||
embed.ImageUrl <- item.Description
|
|
||||||
else
|
|
||||||
embed.Description <- $"Congratulations! You own the rights to the {item.Name} NFT. Please create a ticket in the support channel and we will transfer to your wallet"
|
|
||||||
| _ -> embed.Description <- $"Purchased {item.Name}"
|
|
||||||
embed
|
|
||||||
|
|
||||||
// TODO: When you buy a shield, prompt the user to activate it
|
// TODO: When you buy a shield, prompt the user to activate it
|
||||||
let handleBuyItem (ctx : IDiscordContext) itemId =
|
let handleBuyItem (ctx : IDiscordContext) itemId =
|
||||||
executePlayerAction ctx (fun player -> async {
|
executePlayerAction ctx (fun player -> async {
|
||||||
@ -195,9 +204,10 @@ let handleBuyItem (ctx : IDiscordContext) itemId =
|
|||||||
>>= checkDoesntExceedStackCap item
|
>>= checkDoesntExceedStackCap item
|
||||||
|> handleResultWithResponse ctx (fun player -> async {
|
|> handleResultWithResponse ctx (fun player -> async {
|
||||||
let price = match item.Attributes with CanBuy price -> price | _ -> 0<GBT>
|
let price = match item.Attributes with CanBuy price -> price | _ -> 0<GBT>
|
||||||
do! DbService.updatePlayerCurrency -price player |> Async.Ignore
|
do! DbService.updatePlayerCurrency -price player.DiscordId |> Async.Ignore
|
||||||
do! DbService.addToPlayerInventory player.DiscordId item |> Async.Ignore
|
do! DbService.addToPlayerInventory player.DiscordId item |> Async.Ignore
|
||||||
do! DbService.decrementItemStock item
|
if storeItem.LimitStock = true && storeItem.Stock > 0 then
|
||||||
|
do! DbService.decrementItemStock item |> Async.Ignore
|
||||||
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
||||||
builder.AddEmbed(purchaseItemEmbed (item)) |> ignore
|
builder.AddEmbed(purchaseItemEmbed (item)) |> ignore
|
||||||
do! ctx.FollowUp builder |> Async.AwaitTask
|
do! ctx.FollowUp builder |> Async.AwaitTask
|
||||||
@ -214,15 +224,11 @@ let handleSell (ctx : IDiscordContext) itemId =
|
|||||||
|> handleResultWithResponse ctx (fun player -> async {
|
|> handleResultWithResponse ctx (fun player -> async {
|
||||||
match item.Attributes with
|
match item.Attributes with
|
||||||
| CanSell price ->
|
| CanSell price ->
|
||||||
let updatedPlayer = {
|
|
||||||
player with
|
|
||||||
Bank = player.Bank + price
|
|
||||||
Inventory = player.Inventory |> List.filter (fun i -> i.Id <> itemId)
|
|
||||||
}
|
|
||||||
do!
|
do!
|
||||||
[ DbService.updatePlayer updatedPlayer |> Async.Ignore
|
[ DbService.updatePlayerCurrency price player.DiscordId |> Async.Ignore
|
||||||
DbService.removeShieldEvent updatedPlayer.DiscordId itemId |> Async.Ignore
|
DbService.removeFromPlayerInventory player.DiscordId item |> Async.Ignore
|
||||||
sendFollowUpMessage ctx $"Sold {item.Name} for {price}! Current Balance: {updatedPlayer.Bank}"
|
DbService.removeShieldEvent player.DiscordId itemId |> Async.Ignore
|
||||||
|
sendFollowUpMessage ctx $"Sold {item.Name} for {price}! New Balance: {player.Bank + price}"
|
||||||
Analytics.sellWeaponButton (ctx.GetDiscordMember()) item price ]
|
Analytics.sellWeaponButton (ctx.GetDiscordMember()) item price ]
|
||||||
|> Async.Parallel
|
|> Async.Parallel
|
||||||
|> Async.Ignore
|
|> Async.Ignore
|
||||||
@ -252,16 +258,6 @@ let handleConsume (ctx : IDiscordContext) itemId = PlayerInteractions.executePla
|
|||||||
do! ctx.FollowUp builder |> Async.AwaitTask
|
do! ctx.FollowUp builder |> Async.AwaitTask
|
||||||
})
|
})
|
||||||
|
|
||||||
let showJpegsEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async {
|
|
||||||
let jpegs =
|
|
||||||
player.Inventory
|
|
||||||
|> Inventory.getItemsByType ItemType.Jpeg
|
|
||||||
|> List.map (fun i -> { StoreId = "BACKALLEY" ; Item = i ; Stock = 1 ; LimitStock = false ; Available = true })
|
|
||||||
let embeds = getItemEmbeds true jpegs
|
|
||||||
let builder = DiscordFollowupMessageBuilder().AddEmbeds(embeds).AsEphemeral(true)
|
|
||||||
do! ctx.FollowUp builder |> Async.AwaitTask
|
|
||||||
})
|
|
||||||
|
|
||||||
let showStats (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async {
|
let showStats (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async {
|
||||||
let embed = DiscordEmbedBuilder()
|
let embed = DiscordEmbedBuilder()
|
||||||
PlayerStats.stats
|
PlayerStats.stats
|
||||||
|
@ -178,48 +178,6 @@ let getInvitedUserCount userId =
|
|||||||
|> Sql.executeRowAsync (fun read -> read.int "count")
|
|> Sql.executeRowAsync (fun read -> read.int "count")
|
||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
|
|
||||||
let getWhitelistItem () =
|
|
||||||
connStr
|
|
||||||
|> Sql.connect
|
|
||||||
|> Sql.query """
|
|
||||||
SELECT stock, buy_price FROM store_item
|
|
||||||
JOIN item i on store_item.item_id = i.id
|
|
||||||
WHERE i.id = 'WHITELIST'
|
|
||||||
"""
|
|
||||||
|> Sql.executeRowAsync (fun read -> {| Stock = read.int "stock" ; Price = (read.int "buy_price") * 1<GBT> |})
|
|
||||||
|> Async.AwaitTask
|
|
||||||
|
|
||||||
let updateWhitelistStock () = async {
|
|
||||||
try
|
|
||||||
do! connStr
|
|
||||||
|> Sql.connect
|
|
||||||
|> Sql.query """
|
|
||||||
UPDATE store_item SET stock = GREATEST(stock - 1, 0)
|
|
||||||
WHERE store_item.item_id = (SELECT id FROM item WHERE id = 'WHITELIST')
|
|
||||||
"""
|
|
||||||
|> Sql.executeNonQueryAsync
|
|
||||||
|> Async.AwaitTask
|
|
||||||
|> Async.Ignore
|
|
||||||
return true
|
|
||||||
with _ -> return false
|
|
||||||
}
|
|
||||||
|
|
||||||
let setWhitelistStock amount = async {
|
|
||||||
try
|
|
||||||
do! connStr
|
|
||||||
|> Sql.connect
|
|
||||||
|> Sql.parameters [ ( "amount" , Sql.int amount ) ]
|
|
||||||
|> Sql.query """
|
|
||||||
UPDATE store_item SET stock = @amount
|
|
||||||
WHERE store_item.item_id = (SELECT id FROM item WHERE id = 'WHITELIST')
|
|
||||||
"""
|
|
||||||
|> Sql.executeNonQueryAsync
|
|
||||||
|> Async.AwaitTask
|
|
||||||
|> Async.Ignore
|
|
||||||
return true
|
|
||||||
with _ -> return false
|
|
||||||
}
|
|
||||||
|
|
||||||
let guildInviteEmbed =
|
let guildInviteEmbed =
|
||||||
let rewardMsg =
|
let rewardMsg =
|
||||||
$"**Your Mission:**\nCLICK THE BUTTON below, then share your **UNIQUE LINK** with any Degenz you want to invite into the Server.\n\n" +
|
$"**Your Mission:**\nCLICK THE BUTTON below, then share your **UNIQUE LINK** with any Degenz you want to invite into the Server.\n\n" +
|
||||||
@ -343,7 +301,7 @@ let acceptInvite (ctx : IDiscordContext) (invitedPlayer : PlayerData) =
|
|||||||
let! player = DbService.tryFindPlayer invite.Inviter
|
let! player = DbService.tryFindPlayer invite.Inviter
|
||||||
match player with
|
match player with
|
||||||
| Some player ->
|
| Some player ->
|
||||||
do! DbService.updatePlayerCurrency InviteRewardAmount player |> Async.Ignore
|
do! DbService.updatePlayerCurrency InviteRewardAmount player.DiscordId |> Async.Ignore
|
||||||
do! match GuildEnvironment.botClientRecruit with
|
do! match GuildEnvironment.botClientRecruit with
|
||||||
| Some recruitBot -> async {
|
| Some recruitBot -> async {
|
||||||
let builder = DiscordMessageBuilder()
|
let builder = DiscordMessageBuilder()
|
||||||
@ -473,8 +431,9 @@ let handleGimmeWhitelist (ctx : IDiscordContext) =
|
|||||||
|
|
||||||
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
||||||
|
|
||||||
let! wlItem = getWhitelistItem ()
|
let! wlItem = DbService.getStoreItemBySymbol "WHITELIST"
|
||||||
let! availability = tryGrantWhitelist ctx wlItem.Stock wlItem.Price
|
let wlPrice = Inventory.getBuyPrice wlItem.Item
|
||||||
|
let! availability = tryGrantWhitelist ctx wlItem.Stock wlPrice
|
||||||
match availability with
|
match availability with
|
||||||
| NotAHacker -> whitelistEmbed.Description <- notAHackerMsg
|
| NotAHacker -> whitelistEmbed.Description <- notAHackerMsg
|
||||||
| NotInGame -> whitelistEmbed.Description <- notInGameMsg
|
| NotInGame -> whitelistEmbed.Description <- notInGameMsg
|
||||||
@ -485,11 +444,11 @@ let handleGimmeWhitelist (ctx : IDiscordContext) =
|
|||||||
whitelistEmbed.Description <- alreadyWhitelistedMsg
|
whitelistEmbed.Description <- alreadyWhitelistedMsg
|
||||||
| NotEnoughStock -> whitelistEmbed.Description <- "Oh no! We do not have any whitelist spots available for now. Check back later or go bother Kitty and ask him why the fuck you can't whitelist"
|
| NotEnoughStock -> whitelistEmbed.Description <- "Oh no! We do not have any whitelist spots available for now. Check back later or go bother Kitty and ask him why the fuck you can't whitelist"
|
||||||
| NotEnoughGBT total ->
|
| NotEnoughGBT total ->
|
||||||
includeInfo wlItem.Stock wlItem.Price
|
includeInfo wlItem.Stock wlPrice
|
||||||
builder.AddComponents([ buyBtn ; recruitBtn ]) |> ignore
|
builder.AddComponents([ buyBtn ; recruitBtn ]) |> ignore
|
||||||
whitelistEmbed.Description <- notEnoughMoneyMsg wlItem.Price total
|
whitelistEmbed.Description <- notEnoughMoneyMsg wlPrice total
|
||||||
| Granted _ ->
|
| Granted _ ->
|
||||||
includeInfo wlItem.Stock wlItem.Price
|
includeInfo wlItem.Stock wlPrice
|
||||||
whitelistEmbed.Color <- DiscordColor.Green
|
whitelistEmbed.Color <- DiscordColor.Green
|
||||||
whitelistEmbed.Color <- DiscordColor.Green
|
whitelistEmbed.Color <- DiscordColor.Green
|
||||||
builder.AddComponents([ buyActiveBtn ]) |> ignore
|
builder.AddComponents([ buyActiveBtn ]) |> ignore
|
||||||
@ -522,9 +481,10 @@ let handleBuyWhitelist (ctx : IDiscordContext) =
|
|||||||
let builder = DiscordInteractionResponseBuilder().AsEphemeral(true)
|
let builder = DiscordInteractionResponseBuilder().AsEphemeral(true)
|
||||||
do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder)
|
do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder)
|
||||||
|
|
||||||
let! wlItem = getWhitelistItem ()
|
let! wlItem = DbService.getStoreItemBySymbol "WHITELIST"
|
||||||
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
||||||
match! tryGrantWhitelist ctx wlItem.Stock wlItem.Price with
|
let wlPrice = Inventory.getBuyPrice wlItem.Item
|
||||||
|
match! tryGrantWhitelist ctx wlItem.Stock wlPrice with
|
||||||
| NotAHacker ->
|
| NotAHacker ->
|
||||||
builder.Content <- $"You are somehow not a hacker anymore, what exactly are you doing?"
|
builder.Content <- $"You are somehow not a hacker anymore, what exactly are you doing?"
|
||||||
do! ctx.FollowUp(builder)
|
do! ctx.FollowUp(builder)
|
||||||
@ -541,7 +501,7 @@ let handleBuyWhitelist (ctx : IDiscordContext) =
|
|||||||
builder.Content <- $"We just ran out of stock, tough shit"
|
builder.Content <- $"We just ran out of stock, tough shit"
|
||||||
do! ctx.FollowUp(builder)
|
do! ctx.FollowUp(builder)
|
||||||
| Granted player ->
|
| Granted player ->
|
||||||
match! updateWhitelistStock () with
|
match! DbService.decrementItemStock wlItem.Item with
|
||||||
| true ->
|
| true ->
|
||||||
let embed = DiscordEmbedBuilder()
|
let embed = DiscordEmbedBuilder()
|
||||||
embed.Description <- buyWhitelistMsg
|
embed.Description <- buyWhitelistMsg
|
||||||
@ -551,7 +511,7 @@ let handleBuyWhitelist (ctx : IDiscordContext) =
|
|||||||
builder.AddComponents [ recruitBtn ] |> ignore
|
builder.AddComponents [ recruitBtn ] |> ignore
|
||||||
let role = ctx.GetGuild().GetRole(GuildEnvironment.roleWhitelist)
|
let role = ctx.GetGuild().GetRole(GuildEnvironment.roleWhitelist)
|
||||||
do! ctx.GetDiscordMember().GrantRoleAsync(role)
|
do! ctx.GetDiscordMember().GrantRoleAsync(role)
|
||||||
let! _ = DbService.updatePlayerCurrency -wlItem.Price player
|
let! _ = DbService.updatePlayerCurrency -wlPrice player.DiscordId
|
||||||
builder.AddEmbed(embed) |> ignore
|
builder.AddEmbed(embed) |> ignore
|
||||||
do! ctx.FollowUp(builder)
|
do! ctx.FollowUp(builder)
|
||||||
|
|
||||||
@ -563,7 +523,7 @@ let handleBuyWhitelist (ctx : IDiscordContext) =
|
|||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
|> Async.Ignore
|
|> Async.Ignore
|
||||||
let user = ctx.GetDiscordMember()
|
let user = ctx.GetDiscordMember()
|
||||||
do! Analytics.whiteListPurchased wlItem.Price wlItem.Stock user.Id user.Username
|
do! Analytics.whiteListPurchased wlPrice wlItem.Stock user.Id user.Username
|
||||||
| false ->
|
| false ->
|
||||||
let embed = DiscordEmbedBuilder()
|
let embed = DiscordEmbedBuilder()
|
||||||
embed.Description <- "Oh no! Looks like the last Whitelist spot was taken. Don't worry you weren't charged..."
|
embed.Description <- "Oh no! Looks like the last Whitelist spot was taken. Don't worry you weren't charged..."
|
||||||
@ -633,7 +593,7 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
|
|||||||
let setCurrentWhitelistStock amount (ctx : IDiscordContext) =
|
let setCurrentWhitelistStock amount (ctx : IDiscordContext) =
|
||||||
task {
|
task {
|
||||||
do! Messaging.defer ctx
|
do! Messaging.defer ctx
|
||||||
let! result = setWhitelistStock amount
|
let! result = DbService.setItemStock amount "WHITELIST"
|
||||||
if result then
|
if result then
|
||||||
do! Messaging.sendFollowUpMessage ctx $"Set Whitelist stock to {amount}"
|
do! Messaging.sendFollowUpMessage ctx $"Set Whitelist stock to {amount}"
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user