Finish embeds and commands for getting raffle winners
This commit is contained in:
parent
31d59d60ef
commit
530b943790
89
Bot/Admin.fs
89
Bot/Admin.fs
@ -26,7 +26,8 @@ let handleGuildDownloadReady _ (event : GuildDownloadCompletedEventArgs) =
|
|||||||
let ( _ , adminRole ) = guild.Roles.TryGetValue(GuildEnvironment.roleAdmin)
|
let ( _ , adminRole ) = guild.Roles.TryGetValue(GuildEnvironment.roleAdmin)
|
||||||
|
|
||||||
let permission = DiscordApplicationCommandPermission(adminRole, true)
|
let permission = DiscordApplicationCommandPermission(adminRole, true)
|
||||||
let commands = commands |> Seq.map (fun com -> DiscordGuildApplicationCommandPermissions(com.Id, [ permission ]))
|
let commands = commands |> Seq.map (fun com ->
|
||||||
|
DiscordGuildApplicationCommandPermissions(com.Id, [ permission ]))
|
||||||
do! guild.BatchEditApplicationCommandPermissionsAsync(commands) |> Async.AwaitTask |> Async.Ignore
|
do! guild.BatchEditApplicationCommandPermissionsAsync(commands) |> Async.AwaitTask |> Async.Ignore
|
||||||
return ()
|
return ()
|
||||||
} :> Task
|
} :> Task
|
||||||
@ -99,6 +100,12 @@ let getCsvFromTotalInvites (users : {| Username : string ; DiscordId : uint64 ;
|
|||||||
|> String.concat "\n"
|
|> String.concat "\n"
|
||||||
|> (+) "Discord Id Num,Username,Total Invites\n"
|
|> (+) "Discord Id Num,Username,Total Invites\n"
|
||||||
|
|
||||||
|
let getCsvFromRaffleTickets (users : {| Id : uint64 ; Name : string ; TicketsOwned : int |} seq) =
|
||||||
|
users
|
||||||
|
|> Seq.map (fun user -> $"{user.Id},{user.Name},{user.TicketsOwned}")
|
||||||
|
|> String.concat "\n"
|
||||||
|
|> (+) "Discord Id Num,Username,Tickets Owned\n"
|
||||||
|
|
||||||
let getUserInvites userIds =
|
let getUserInvites userIds =
|
||||||
GuildEnvironment.connectionString
|
GuildEnvironment.connectionString
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
@ -146,10 +153,80 @@ let getUserInvitesFromReactions (channel : DiscordChannel) (message : string) (c
|
|||||||
dict.Add("users.csv", ms)
|
dict.Add("users.csv", ms)
|
||||||
builder.AddFiles(dict) |> ignore
|
builder.AddFiles(dict) |> ignore
|
||||||
do! ctx.FollowUp(builder)
|
do! ctx.FollowUp(builder)
|
||||||
with ex ->
|
with ex -> printfn $"exception {ex.Message}"
|
||||||
printfn $"exception {ex.Message}"
|
|
||||||
} :> Task
|
} :> Task
|
||||||
|
|
||||||
|
let getRaffleWinners count (ctx : IDiscordContext) =
|
||||||
|
task {
|
||||||
|
do! Messaging.defer ctx
|
||||||
|
let! raffleItems =
|
||||||
|
[ "BACKALLEY1" ; "BACKALLEY2" ; "BACKALLEY3" ]
|
||||||
|
|> List.map DbService.getStoreItems
|
||||||
|
|> Async.Parallel
|
||||||
|
|
||||||
|
let buttons =
|
||||||
|
raffleItems
|
||||||
|
|> Seq.concat
|
||||||
|
|> Seq.map (fun item ->
|
||||||
|
DiscordButtonComponent(ButtonStyle.Primary, $"GetRaffleWinner-{item.Item.Id}-{count}", $"{item.Item.Name}")
|
||||||
|
:> DiscordComponent)
|
||||||
|
|
||||||
|
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
||||||
|
buttons
|
||||||
|
|> Seq.chunkBySize 5
|
||||||
|
|> Seq.iter (fun btns -> builder.AddComponents(btns) |> ignore)
|
||||||
|
builder.Content <- "Click on the respective item"
|
||||||
|
|
||||||
|
do! ctx.FollowUp builder
|
||||||
|
} :> Task
|
||||||
|
|
||||||
|
let pickRaffleWinners (ctx : IDiscordContext) =
|
||||||
|
task {
|
||||||
|
do! Messaging.defer ctx
|
||||||
|
let tokens = ctx.GetInteractionId().Split('-')
|
||||||
|
let itemId = tokens.[1]
|
||||||
|
let count = int tokens.[2]
|
||||||
|
let! winners =
|
||||||
|
DbService.connStr
|
||||||
|
|> Sql.connect
|
||||||
|
|> Sql.parameters [ "iid", Sql.string itemId ; "winner_count" , Sql.int count]
|
||||||
|
|> Sql.query """
|
||||||
|
SELECT discord_id, count(*) AS tickets_owned, display_name
|
||||||
|
FROM "user"
|
||||||
|
INNER JOIN inventory_item ii ON "user".id = ii.user_id
|
||||||
|
WHERE ii.item_id = @iid
|
||||||
|
GROUP BY discord_id, display_name
|
||||||
|
ORDER BY random()
|
||||||
|
LIMIT @winner_count;
|
||||||
|
"""
|
||||||
|
|> Sql.executeAsync (fun read ->
|
||||||
|
{| Id = read.string "discord_id" |> uint64
|
||||||
|
Name = read.string "display_name"
|
||||||
|
TicketsOwned = read.int "tickets_owned"|})
|
||||||
|
|> Async.AwaitTask
|
||||||
|
|
||||||
|
let csv = getCsvFromRaffleTickets winners
|
||||||
|
let builder = DiscordFollowupMessageBuilder().AsEphemeral(true)
|
||||||
|
use ms = new MemoryStream(Text.Encoding.ASCII.GetBytes(csv)) :> Stream
|
||||||
|
let dict = Collections.Generic.Dictionary()
|
||||||
|
dict.Add("users.csv", ms)
|
||||||
|
builder.AddFiles(dict) |> ignore
|
||||||
|
|
||||||
|
do! ctx.FollowUp builder
|
||||||
|
} :> Task
|
||||||
|
|
||||||
|
let handleButtonEvent _ (event : ComponentInteractionCreateEventArgs) =
|
||||||
|
let eventCtx = DiscordEventContext event :> IDiscordContext
|
||||||
|
match event.Id with
|
||||||
|
| id when id.StartsWith("GetRaffleWinner") -> pickRaffleWinners eventCtx
|
||||||
|
| _ ->
|
||||||
|
task {
|
||||||
|
let builder = DiscordInteractionResponseBuilder()
|
||||||
|
builder.IsEphemeral <- true
|
||||||
|
builder.Content <- $"Incorrect Action identifier {eventCtx.GetInteractionId()}"
|
||||||
|
do! eventCtx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask
|
||||||
|
}
|
||||||
|
|
||||||
type AdminBot() =
|
type AdminBot() =
|
||||||
inherit ApplicationCommandModule ()
|
inherit ApplicationCommandModule ()
|
||||||
|
|
||||||
@ -194,4 +271,10 @@ type AdminBot() =
|
|||||||
[<Option("message-id", "The ID of the message with all the reactions")>] messageId : string) =
|
[<Option("message-id", "The ID of the message with all the reactions")>] messageId : string) =
|
||||||
enforceAdmin (DiscordInteractionContext ctx) (getUserInvitesFromReactions channel messageId)
|
enforceAdmin (DiscordInteractionContext ctx) (getUserInvitesFromReactions channel messageId)
|
||||||
|
|
||||||
|
[<SlashCommandPermissions(Permissions.Administrator)>]
|
||||||
|
[<SlashCommand("admin-raffles-winners", "Get N Random Winners")>]
|
||||||
|
member this.GetRaffleWinners (ctx : InteractionContext, [<Option("count", "How many winners to pick")>] count : int64) =
|
||||||
|
enforceAdmin (DiscordInteractionContext ctx) (getRaffleWinners count)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ inviterBot.add_MessageCreated(AsyncEventHandler(InviteTracker.handleMessageCreat
|
|||||||
slotsBot.add_ComponentInteractionCreated(AsyncEventHandler(SlotMachine.handleButton))
|
slotsBot.add_ComponentInteractionCreated(AsyncEventHandler(SlotMachine.handleButton))
|
||||||
slotsBot.add_GuildDownloadCompleted(AsyncEventHandler(SlotMachine.handleGuildDownloadCompleted))
|
slotsBot.add_GuildDownloadCompleted(AsyncEventHandler(SlotMachine.handleGuildDownloadCompleted))
|
||||||
slotsBot.add_MessageCreated(AsyncEventHandler(SlotMachine.handleMessageCreated))
|
slotsBot.add_MessageCreated(AsyncEventHandler(SlotMachine.handleMessageCreated))
|
||||||
|
adminBot.add_ComponentInteractionCreated(AsyncEventHandler(Admin.handleButtonEvent))
|
||||||
|
|
||||||
let asdf _ (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) =
|
let asdf _ (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) =
|
||||||
async {
|
async {
|
||||||
|
@ -8,7 +8,6 @@ open DSharpPlus.EventArgs
|
|||||||
open DSharpPlus.SlashCommands
|
open DSharpPlus.SlashCommands
|
||||||
open Degenz.Messaging
|
open Degenz.Messaging
|
||||||
open Npgsql.FSharp
|
open Npgsql.FSharp
|
||||||
open Solnet.Rpc
|
|
||||||
open Solnet.Wallet
|
open Solnet.Wallet
|
||||||
|
|
||||||
let connStr = GuildEnvironment.connectionString
|
let connStr = GuildEnvironment.connectionString
|
||||||
|
Loading…
x
Reference in New Issue
Block a user