Merge branch 'master' into dev
This commit is contained in:
commit
6cfc0ccf65
@ -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
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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())
|
||||||
})
|
})
|
||||||
|
@ -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" ]))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user