59 lines
3.2 KiB
Forth
59 lines
3.2 KiB
Forth
module Degenz.PlayerInteractions
|
|
|
|
open System.Threading.Tasks
|
|
open DSharpPlus
|
|
open DSharpPlus.Entities
|
|
open Degenz.Messaging
|
|
open Degenz.DbService
|
|
|
|
let executePlayerAction (ctx : IDiscordContext) (dispatch : PlayerData -> Async<unit>) =
|
|
async {
|
|
let builder = DiscordInteractionResponseBuilder().AsEphemeral(true)
|
|
do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask
|
|
let! playerResult = tryFindPlayer GuildEnvironment.pgDb (ctx.GetDiscordMember().Id)
|
|
match playerResult with
|
|
| Some player -> do! dispatch player
|
|
| None -> do! Messaging.sendFollowUpMessage ctx "You are currently not a hacker, first use the /redpill command to become one"
|
|
} |> Async.StartAsTask :> Task
|
|
|
|
let executePlayerActionWithTarget (targetPlayer : DiscordUser) (ctx : IDiscordContext) (dispatch : PlayerData -> PlayerData -> Async<unit>) =
|
|
async {
|
|
let builder = DiscordInteractionResponseBuilder()
|
|
builder.IsEphemeral <- true
|
|
builder.Content <- "Content"
|
|
do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask
|
|
let! players =
|
|
[ tryFindPlayer GuildEnvironment.pgDb (ctx.GetDiscordMember().Id)
|
|
tryFindPlayer GuildEnvironment.pgDb targetPlayer.Id ]
|
|
|> Async.Parallel
|
|
match players.[0] , players.[1] with
|
|
| Some player , Some target -> do! dispatch player target
|
|
| None , _ -> do! Messaging.sendFollowUpMessage ctx "You are currently not a hacker, first use the /redpill command to become one"
|
|
| _ , None ->
|
|
if targetPlayer.IsBot
|
|
then do! Messaging.sendFollowUpMessage ctx $"{targetPlayer.Username} is a bot, pick a real human to hack"
|
|
else do! Messaging.sendFollowUpMessage ctx "Your target is not connected to the network, they must join first by using the /redpill command"
|
|
} |> Async.StartAsTask :> Task
|
|
|
|
let executePlayerActionWithTargetId defer (targetId : uint64) (ctx : IDiscordContext) (dispatch : PlayerData -> PlayerData -> Async<unit>) =
|
|
async {
|
|
let builder = DiscordInteractionResponseBuilder()
|
|
builder.IsEphemeral <- true
|
|
builder.Content <- "Content"
|
|
if defer then
|
|
do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask
|
|
let! players =
|
|
[ tryFindPlayer GuildEnvironment.pgDb (ctx.GetDiscordMember().Id)
|
|
tryFindPlayer GuildEnvironment.pgDb targetId ]
|
|
|> Async.Parallel
|
|
match players.[0] , players.[1] with
|
|
| Some player , Some target -> do! dispatch player target
|
|
| None , _ -> do! Messaging.sendFollowUpMessage ctx "You are currently not a hacker, first use the /redpill command to become one"
|
|
| _ , None -> do! Messaging.sendFollowUpMessage ctx "Your target is not connected to the network, they must join first by using the /redpill command"
|
|
} |> Async.StartAsTask :> Task
|
|
|
|
let handleResultWithResponse ctx fn (player : Result<PlayerData, string>) =
|
|
match player with
|
|
| Ok p -> fn p
|
|
| Error e -> async { do! Messaging.sendFollowUpMessage ctx e }
|