Merge branch 'master' into dev

This commit is contained in:
Joseph Ferano 2022-06-10 22:08:12 +07:00
commit 6cfc0ccf65
6 changed files with 67 additions and 24 deletions

View File

@ -122,6 +122,25 @@ let getStoreItems (storeId : string) =
}) })
|> Async.AwaitTask |> Async.AwaitTask
let getAllActiveStoreItems () =
connStr
|> Sql.connect
|> 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 store_item.unlisted = false
"""
|> Sql.executeAsync (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 getStoreItemBySymbol (itemSymbol : string) = let getStoreItemBySymbol (itemSymbol : string) =
connStr connStr
|> Sql.connect |> Sql.connect

View File

@ -1,6 +1,7 @@
module Degenz.Embeds module Degenz.Embeds
open System open System
open DSharpPlus
open Degenz open Degenz
open Degenz.Messaging open Degenz.Messaging
open DSharpPlus.Entities open DSharpPlus.Entities
@ -10,6 +11,7 @@ let shieldGif = "https://s10.gifyu.com/images/Defense-Degenz-V2-min.gif"
let constructButtons (actionId: string) (buttonInfo : string) (player: PlayerData) (items : Inventory) ignoreCooldown = let constructButtons (actionId: string) (buttonInfo : string) (player: PlayerData) (items : Inventory) ignoreCooldown =
items items
|> List.sortBy (fun item -> item.Id)
|> List.map (fun item -> |> List.map (fun item ->
let action = let action =
player.Events player.Events
@ -42,7 +44,13 @@ let pickDefense actionId player isTrainer =
for shield in Inventory.getShields player.Inventory do for shield in Inventory.getShields player.Inventory do
let hours = TimeSpan.FromMinutes(int shield.Cooldown).TotalHours |> int let hours = TimeSpan.FromMinutes(int shield.Cooldown).TotalHours |> int
let against = WeaponClass.getGoodAgainst shield.Class |> snd let against = WeaponClass.getGoodAgainst shield.Class |> snd
embed.AddField(shield.Name, $"Active {hours} hours\nDefeats {against}", true) |> ignore let emoji =
match shield.Id with
| "FIREWALL" -> "<:firewall_shield:971620988649340989>"
| "ENCRYPTION" -> "<:encryption_shield:971620979912605727>"
| "CYPHER" -> "<:cypher_shield:971620965576503326>"
| _ -> ""
embed.AddField($"{emoji} {shield.Name}", $"Active {hours} hours\nDefeats {against}", true) |> ignore
DiscordFollowupMessageBuilder() DiscordFollowupMessageBuilder()
.AddComponents(buttons) .AddComponents(buttons)
@ -58,19 +66,19 @@ let pickHack actionId attacker defender bonus isTrainer =
let ( outcomeMsg , bonusMsg ) = let ( outcomeMsg , bonusMsg ) =
if attacker.Stats.Strength.Amount > defender.Stats.Strength.Amount then if attacker.Stats.Strength.Amount > defender.Stats.Strength.Amount then
"\nYou're stronger so you'll steal more!!!\n" , $"\n**__Potential Bonus:__**\n{bonus} 💰$GBT" "\nYou're **STRONGER** so you'll **HACK MORE!!!** `💰$GBT`\n" , $"\n**__Potential Bonus:__**\n`{bonus} 💰$GBT`"
else else
"\nYou're not stronger than them, you need to eat more!" , "" "\nYou're **NOT STRONGER** than them, you need to **EAT MORE!**" , ""
let stealMsg = let stealMsg =
if not isTrainer if not isTrainer
then $""" then $"""
{defender.Name} has **{defender.Bank} $GBT** we can take from them. **{defender.Name}** has `{defender.Bank} 💰$GBT` we can take from them.
**__Your Strength:__** **__Your Strength:__**
💪 {attacker.Stats.Strength.Amount} `💪 {attacker.Stats.Strength.Amount}`
**__Their Strength:__** **__Their Strength:__**
💪 {defender.Stats.Strength.Amount} `💪 {defender.Stats.Strength.Amount}`
{outcomeMsg}{bonusMsg}""" {outcomeMsg}{bonusMsg}"""
else "" else ""
let embed = let embed =
@ -79,9 +87,20 @@ let pickHack actionId attacker defender bonus isTrainer =
.WithDescription($"{stealMsg}\n\nPick the hack you want to use.") .WithDescription($"{stealMsg}\n\nPick the hack you want to use.")
if not isTrainer then if not isTrainer then
for hack in Inventory.getHacks attacker.Inventory do let hacks = Inventory.getHacks attacker.Inventory |> List.sortBy (fun h -> h.Id)
for hack in hacks do
let amount = if hack.Power > int defender.Bank then int defender.Bank else hack.Power let amount = if hack.Power > int defender.Bank then int defender.Bank else hack.Power
embed.AddField(hack.Name, $"Cooldown {hack.Cooldown} mins\nExtract {amount} $GBT", true) |> ignore let emoji =
match hack.Id with
| "REMOTE" -> "<:remote_access:971621009981571132>"
| "VIRUS" -> "<:virus_hack:971636840580927510>"
| "WORM" -> "<:worm_hack:971636842640310312>"
| _ -> ""
let fieldMsg = $"""
Hack Base: `{hack.Power} 💰$GBT`
Bonus: `{bonus} 💰$GBT`
**Hack Total:** `{amount + bonus} 💰$GBT`"""
embed.AddField($"{emoji} __{hack.Name}__", fieldMsg, true) |> ignore
DiscordFollowupMessageBuilder() DiscordFollowupMessageBuilder()
.AddComponents(buttons) .AddComponents(buttons)
@ -121,7 +140,8 @@ let responseCreatedShield (shield : ShieldItem) =
let eventSuccessfulHack (ctx : IDiscordContext) target prize = let eventSuccessfulHack (ctx : IDiscordContext) target prize =
DiscordMessageBuilder() DiscordMessageBuilder()
.WithContent($"{ctx.GetDiscordMember().Username} successfully hacked <@{target.DiscordId}> and took {prize} GoodBoyTokenz") .WithAllowedMention(UserMention(target.DiscordId))
.WithContent($"**{ctx.GetDiscordMember().Username}** successfully hacked **{target.Name}** and took {prize} $GBT! - <@!{target.DiscordId}>")
let getArsenalEmbed (player : PlayerData) = let getArsenalEmbed (player : PlayerData) =
DiscordFollowupMessageBuilder() DiscordFollowupMessageBuilder()

View File

@ -66,7 +66,7 @@ let checkPlayerHasShieldSlotsAvailable player =
let checkTargetHasFunds target player = let checkTargetHasFunds target player =
match target.Bank <= 0<GBT> with match target.Bank <= 0<GBT> with
| true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim." | true -> Error $"Looks like the poor bastard has no 💰$GBT... pick a different victim."
| false -> Ok player | false -> Ok player
let strengthBonus attacker defender = let strengthBonus attacker defender =
@ -129,13 +129,13 @@ let successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) =
let failedHack (ctx : IDiscordContext) attacker defender (hack : HackItem) = let failedHack (ctx : IDiscordContext) attacker defender (hack : HackItem) =
async { async {
let lostAmount = if hack.Power < int attacker.Bank then hack.Power else int attacker.Bank let lostAmount = if hack.Power < int attacker.Bank then hack.Power else int attacker.Bank
let msg = $"Hack failed! {defender.Name} was able to mount a successful defense! You lost {lostAmount} $GBT!" let msg = $"Hack failed! {defender.Name} was able to mount a successful defense! You lost {lostAmount} 💰$GBT!"
do! sendFollowUpMessage ctx msg do! sendFollowUpMessage ctx msg
do! updateCombatants false attacker defender hack (-lostAmount * 1<GBT>) do! updateCombatants false attacker defender hack (-lostAmount * 1<GBT>)
let builder = DiscordMessageBuilder() let builder = DiscordMessageBuilder()
builder.WithContent($"Hacking attempt failed! <@{defender.DiscordId}> defended hack from {ctx.GetDiscordMember().Username} and took {lostAmount} $GBT from them! ") |> ignore builder.WithContent($"Hacking attempt failed! **{defender.Name}** defended hack from **{ctx.GetDiscordMember().Username}** and took {lostAmount} 💰$GBT from them! <@!{defender.DiscordId}>") |> ignore
let channel = (ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle)) let channel = (ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle))
do! channel.SendMessageAsync(builder) do! channel.SendMessageAsync(builder)
|> Async.AwaitTask |> Async.AwaitTask
@ -223,7 +223,7 @@ let handleDefense (ctx : IDiscordContext) =
} }
do! DbService.addPlayerEvent p.DiscordId defense |> Async.Ignore do! DbService.addPlayerEvent p.DiscordId defense |> Async.Ignore
let builder = DiscordMessageBuilder() let builder = DiscordMessageBuilder()
builder.WithContent($"{ctx.GetDiscordMember().Username} has protected their system!") |> ignore builder.WithContent($"**{ctx.GetDiscordMember().Username}** has protected their system!") |> ignore
let channel = ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle) let channel = ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle)
do! channel.SendMessageAsync(builder) do! channel.SendMessageAsync(builder)
|> Async.AwaitTask |> Async.AwaitTask

View File

@ -105,7 +105,7 @@ let getItemEmbeds owned (items : StoreItem list) =
| Stackable max -> | Stackable max ->
if owned if owned
then embed.AddField($"Owned", $"{count}", true) then embed.AddField($"Owned", $"{count}", true)
else embed.AddField($"Max Allowed", $"{max}", true) else embed.AddField($"Max Allowed", (if max > 1000 then "Unlimited" else string max), true)
|> ignore |> ignore
// let totalOwned = getTotalOwnedOfItem item.Item (items |> List.map (fun i -> i.Item)) |> Option.defaultValue 1 // let totalOwned = getTotalOwnedOfItem item.Item (items |> List.map (fun i -> i.Item)) |> Option.defaultValue 1
// titleText <- $"{totalOwned}x " + titleText // titleText <- $"{totalOwned}x " + titleText
@ -208,10 +208,11 @@ let getSellEmbed (items : Inventory) =
.AsEphemeral(true) .AsEphemeral(true)
let showJpegsEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async { let showJpegsEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async {
let! storeItems = DbService.getAllActiveStoreItems ()
let jpegs = let jpegs =
player.Inventory player.Inventory
|> Inventory.getItemsByType ItemType.Jpeg |> Inventory.getItemsByType ItemType.Jpeg
|> List.map (fun i -> { StoreId = "" ; Item = i ; Stock = 1 ; LimitStock = false ; Available = true ; RequiresInvites = None ; RequiresRole = None }) |> List.choose (fun ii -> storeItems |> List.tryFind (fun si -> si.Item.Id = ii.Id))
match jpegs with match jpegs with
| [] -> do! Messaging.sendFollowUpMessage ctx $"You currently do not own any jpegs or raffle tickets. Go to <#{GuildEnvironment.channelBackAlley}> to buy some" | [] -> do! Messaging.sendFollowUpMessage ctx $"You currently do not own any jpegs or raffle tickets. Go to <#{GuildEnvironment.channelBackAlley}> to buy some"
| jpegs -> | jpegs ->
@ -395,6 +396,9 @@ let handleStoreEvents _ (event : ComponentInteractionCreateEventArgs) =
builder.Content <- $"Incorrect Action identifier {id}" builder.Content <- $"Incorrect Action identifier {id}"
do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask
} }
|> Async.AwaitTask
|> Async.Start
Task.CompletedTask
let sendBackalleyEmbed (ctx : IDiscordContext) = let sendBackalleyEmbed (ctx : IDiscordContext) =
async { async {
@ -447,4 +451,4 @@ type JpegStore() =
// [<SlashCommand("jpegs", "Check jpegs or raffle tickets you own")>] // [<SlashCommand("jpegs", "Check jpegs or raffle tickets you own")>]
// member this.Inventory (ctx : InteractionContext) = // member this.Inventory (ctx : InteractionContext) =
// showJpegsEmbed (DiscordInteractionContext ctx) // showJpegsEmbed (DiscordInteractionContext ctx)

View File

@ -246,7 +246,7 @@ let getInvitedUsersForId (user : DiscordUser) (ctx : IDiscordContext) =
let mutable count = 0 let mutable count = 0
for user in users do for user in users do
count <- count + 1 count <- count + 1
sb.AppendLine($"{count}.) <@{user}>") |> ignore sb.AppendLine($"{count}.) <@!{user}>") |> ignore
let msg = let msg =
let str = let str =
if users.Length > 0 then if users.Length > 0 then
@ -300,7 +300,7 @@ let acceptInvite (guild : DiscordGuild) discordId memberName =
do! match GuildEnvironment.botClientRecruit with do! match GuildEnvironment.botClientRecruit with
| Some recruitBot -> async { | Some recruitBot -> async {
let builder = DiscordMessageBuilder() let builder = DiscordMessageBuilder()
builder.WithContent($"{memberName} was recruited and is now a Degen. <@{player.DiscordId}> just earned {InviteRewardAmount} 💰$GBT for their efforts!") |> ignore builder.WithContent($"{memberName} was recruited and is now a Degen. **{player.Name}** just earned `{InviteRewardAmount} 💰$GBT` for their efforts! - <@!{player.DiscordId}>") |> ignore
let channel = guild.GetChannel(GuildEnvironment.channelEventsHackerBattle) let channel = guild.GetChannel(GuildEnvironment.channelEventsHackerBattle)
do! recruitBot.SendMessageAsync(channel, builder) do! recruitBot.SendMessageAsync(channel, builder)
|> Async.AwaitTask |> Async.AwaitTask
@ -355,9 +355,9 @@ let showWalletStatus (ctx : IDiscordContext) =
try try
match! getWalletAddress player.DiscordId with match! getWalletAddress player.DiscordId with
| Some address -> do! Messaging.sendFollowUpMessage ctx $""" | Some address -> do! Messaging.sendFollowUpMessage ctx $"""
🚀 __Mint Date:__ 31st May, 18:00 UTC 🚀 __Mint Date:__ Mid June
__Status:__ We have successfully received your wallet address: {address}""" __Status:__ We have successfully received your wallet address: {address}"""
| None -> do! Messaging.sendFollowUpMessage ctx "You have no submitted your wallet yet. Type `/submit`, paste your **Solana Wallet Address**, then press enter" | None -> do! Messaging.sendFollowUpMessage ctx "You haven't submitted a wallet yet. Type `/submit`, paste your **Solana Wallet Address**, then press enter"
with ex -> with ex ->
printfn $"{ex.Message}" printfn $"{ex.Message}"
do! Messaging.sendFollowUpMessage ctx "Something went wrong retrieving your wallet address" do! Messaging.sendFollowUpMessage ctx "Something went wrong retrieving your wallet address"
@ -452,7 +452,7 @@ let handleMemberUpdated (client : DiscordClient) (event : GuildMemberUpdateEvent
let handleMessageCreated _ (event : MessageCreateEventArgs) = let handleMessageCreated _ (event : MessageCreateEventArgs) =
task { task {
let bot = GuildEnvironment.botClientRecruit.Value let bot = GuildEnvironment.botClientRecruit.Value
if event.Channel.Id = GuildEnvironment.channelSubmitWallet && event.Author.Id <> bot.CurrentUser.Id then if event.Channel.Id = GuildEnvironment.channelSubmitWallet && event.Author.Id <> bot.CurrentUser.Id then
do! Async.Sleep 100 do! Async.Sleep 100
do! event.Message.DeleteAsync() do! event.Message.DeleteAsync()
@ -492,13 +492,13 @@ let submitAddress (address : string) (ctx : IDiscordContext) =
do! Messaging.sendFollowUpMessage ctx $""" do! Messaging.sendFollowUpMessage ctx $"""
🚀 __Mint Date:__ 31st May 18:00 UTC 🚀 __Mint Date:__ Mid June
{msg} {address} {msg} {address}
Keep an eye on <#{GuildEnvironment.channelAnnouncements}> for updates.""" Keep an eye on <#{GuildEnvironment.channelAnnouncements}> for updates."""
let builder = DiscordMessageBuilder() let builder = DiscordMessageBuilder()
builder.WithContent($"{ctx.GetDiscordMember().Username} submitted their wallet address in <#{GuildEnvironment.channelSubmitWallet}> and confirmed whitelist") |> ignore builder.WithContent($"**{ctx.GetDiscordMember().Username}** submitted their wallet address in <#{GuildEnvironment.channelSubmitWallet}> and confirmed whitelist") |> ignore
let channel = (ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle)) let channel = (ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle))
do! channel.SendMessageAsync(builder) do! channel.SendMessageAsync(builder)
|> Async.AwaitTask |> Async.AwaitTask
@ -508,7 +508,6 @@ Keep an eye on <#{GuildEnvironment.channelAnnouncements}> for updates."""
do! Messaging.sendFollowUpMessage ctx "⚠️ That's not a valid Solana address, please try again" do! Messaging.sendFollowUpMessage ctx "⚠️ That's not a valid Solana address, please try again"
do! Analytics.invalidWalletSubmit (ctx.GetDiscordMember()) do! Analytics.invalidWalletSubmit (ctx.GetDiscordMember())
with ex -> with ex ->
printfn $"{ex.Message}"
do! Messaging.sendFollowUpMessage ctx "⚠️ That's not a valid Solana address, please try again" do! Messaging.sendFollowUpMessage ctx "⚠️ That's not a valid Solana address, please try again"
do! Analytics.invalidWalletSubmit (ctx.GetDiscordMember()) do! Analytics.invalidWalletSubmit (ctx.GetDiscordMember())
}) })

View File

@ -3,6 +3,7 @@
open Npgsql.FSharp open Npgsql.FSharp
open DSharpPlus open DSharpPlus
open DSharpPlus.Entities open DSharpPlus.Entities
open Solnet.Programs
open dotenv.net open dotenv.net
let prodEnv = DotEnv.Read(DotEnvOptions(envFilePaths = [ "./.prod.env" ])) let prodEnv = DotEnv.Read(DotEnvOptions(envFilePaths = [ "./.prod.env" ]))