diff --git a/Bot/Admin.fs b/Bot/Admin.fs new file mode 100644 index 0000000..05fabf3 --- /dev/null +++ b/Bot/Admin.fs @@ -0,0 +1,24 @@ +module Degenz.Admin + +open System.Threading.Tasks +open DSharpPlus.Entities +open DSharpPlus.SlashCommands +open Degenz.Messaging + +type AdminBot() = + inherit ApplicationCommandModule () + + let enforceAdmin (ctx : IDiscordContext) (adminFn : IDiscordContext -> Task) = + let isAdmin = Seq.exists (fun (role : DiscordRole) -> role.Id = GuildEnvironment.roleAdmin) (ctx.GetDiscordMember().Roles) + if isAdmin then + adminFn ctx + else + Messaging.sendSimpleResponse ctx $"You are not admin" |> Async.StartAsTask :> Task + + [] + member this.GetAttributions (ctx : InteractionContext, [] user : DiscordUser) = + enforceAdmin (DiscordInteractionContext ctx) (InviteTracker.getAttributions user.Id) + + [] + member this.SetStock (ctx : InteractionContext, [] amount : int64) = + enforceAdmin (DiscordInteractionContext ctx) (InviteTracker.setWhitelistStock (int amount)) diff --git a/Bot/Bot.fs b/Bot/Bot.fs index 0c3b50e..73c4c58 100644 --- a/Bot/Bot.fs +++ b/Bot/Bot.fs @@ -16,6 +16,7 @@ let hackerBattleConfig = DiscordConfiguration() let storeConfig = DiscordConfiguration() let stealConfig = DiscordConfiguration() let inviterConfig = DiscordConfiguration() +let adminConfig = DiscordConfiguration() //let slotMachineConfig = DiscordConfiguration() //hackerBattleConfig.MinimumLogLevel <- Microsoft.Extensions.Logging.LogLevel.Trace //storeConfig.MinimumLogLevel <- Microsoft.Extensions.Logging.LogLevel.Trace @@ -32,16 +33,21 @@ stealConfig.Intents <- DiscordIntents.All inviterConfig.TokenType <- TokenType.Bot inviterConfig.Intents <- DiscordIntents.All +adminConfig.TokenType <- TokenType.Bot +adminConfig.Intents <- DiscordIntents.All + hackerBattleConfig.Token <- GuildEnvironment.tokenHackerBattle storeConfig.Token <- GuildEnvironment.tokenStore stealConfig.Token <- GuildEnvironment.tokenSteal inviterConfig.Token <- GuildEnvironment.tokenInviter +adminConfig.Token <- GuildEnvironment.tokenAdmin //slotMachineConfig.Token <- Environment.GetEnvironmentVariable("BOT_SLOT_MACHINE") let hackerBattleBot = new DiscordClient(hackerBattleConfig) let storeBot = new DiscordClient(storeConfig) let stealBot = new DiscordClient(stealConfig) let inviterBot = new DiscordClient(inviterConfig) +let adminBot = new DiscordClient(adminConfig) //let slotMachineBot = new DiscordClient(slotMachineConfig) //let clients = [| hackerBattleBot ; storeBot ; slotMachineBot |] @@ -49,12 +55,14 @@ let hackerCommands = hackerBattleBot.UseSlashCommands() let storeCommands = storeBot.UseSlashCommands() let stealCommands = stealBot.UseSlashCommands() let inviterCommands = inviterBot.UseSlashCommands() +let adminCommands = adminBot.UseSlashCommands() //let sc3 = slotMachineBot.UseSlashCommands() hackerCommands.RegisterCommands(guild); storeCommands.RegisterCommands(guild); stealCommands.RegisterCommands(guild); inviterCommands.RegisterCommands(guild); +adminCommands.RegisterCommands(guild); //hackerCommands.RegisterCommands(guild); //sc3.RegisterCommands(guild); @@ -95,6 +103,7 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously GuildEnvironment.botClientRecruit <- Some inviterBot +adminBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously //stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously let rec loop areBotsRunning = diff --git a/Bot/Bot.fsproj b/Bot/Bot.fsproj index 23254fe..e7fe963 100644 --- a/Bot/Bot.fsproj +++ b/Bot/Bot.fsproj @@ -28,6 +28,7 @@ + diff --git a/Bot/DbService.fs b/Bot/DbService.fs index b45bb1a..1f0ccde 100644 --- a/Bot/DbService.fs +++ b/Bot/DbService.fs @@ -259,3 +259,18 @@ let updateWhitelistStock () = async { return true with _ -> return false } + +let setWhitelistStock amount = async { + try + do! connStr + |> Sql.connect + |> Sql.parameters [ ( "amount" , Sql.int amount ) ] + |> Sql.query """ + UPDATE item SET stock = @amount WHERE symbol = 'WHITELIST' + """ + |> Sql.executeNonQueryAsync + |> Async.AwaitTask + |> Async.Ignore + return true + with _ -> return false +} diff --git a/Bot/GuildEnvironment.fs b/Bot/GuildEnvironment.fs index 1f0fbb6..6b0d217 100644 --- a/Bot/GuildEnvironment.fs +++ b/Bot/GuildEnvironment.fs @@ -22,6 +22,7 @@ let tokenSteal = getVar "TOKEN_STEAL" let tokenHackerBattle = getVar "TOKEN_HACKER_BATTLE" let tokenStore = getVar "TOKEN_STORE" let tokenInviter = getVar "TOKEN_INVITER" +let tokenAdmin = getVar "TOKEN_ADMINBOT" let tokenMixpanel = getVar "TOKEN_MIXPANEL" let channelEventsHackerBattle = getId "CHANNEL_EVENTS_HACKER_BATTLE" let channelTraining = getId "CHANNEL_TRAINING" @@ -44,6 +45,7 @@ let roleTrainee = getId "ROLE_TRAINEE" let roleHacker = getId "ROLE_HACKER" let rolePrisoner = getId "ROLE_PRISONER" let roleWhitelist = getId "ROLE_WHITELIST" +let roleAdmin = getId "ROLE_ADMIN" let mutable botUserHackerBattle : DiscordUser option = None let mutable botUserArmory : DiscordUser option = None diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs index d595569..02356f8 100644 --- a/Bot/InviteTracker.fs +++ b/Bot/InviteTracker.fs @@ -232,14 +232,15 @@ let private listServerInvites (ctx : IDiscordContext) = task { do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg) } -let private getAttributions (ctx : IDiscordContext) userId = task { - let! total = getInviteAttributions(userId) - let msg = - DiscordInteractionResponseBuilder() - .AsEphemeral(true) - .WithContent($"<@{userId}> has invited {total} people") - do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg) -} +let getAttributions userId (ctx : IDiscordContext) = + task { + let! total = getInviteAttributions(userId) + let msg = + DiscordInteractionResponseBuilder() + .AsEphemeral(true) + .WithContent($"<@{userId}> has invited {total} people") + do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg) + } :> Task let private getInvitedUsersForId (ctx : IDiscordContext) = task { let! users = getInvitedUsers (ctx.GetDiscordMember().Id) @@ -581,6 +582,16 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) = do! processNewUser eventArgs } :> Task +let rec setWhitelistStock amount (ctx : IDiscordContext) = + task { + do! Messaging.defer ctx + let! result = DbService.setWhitelistStock amount + if result then + do! Messaging.sendFollowUpMessage ctx $"Set Whitelist stock to {amount}" + else + do! Messaging.sendFollowUpMessage ctx $"Error setting WL to {amount}, make sure it's greater than 0" + } :> Task + type Inviter() = inherit ApplicationCommandModule () @@ -596,10 +607,6 @@ type Inviter() = member this.ListServerInvites (ctx : InteractionContext) = listServerInvites (DiscordInteractionContext ctx) -// [] - member this.getAttributions (ctx : InteractionContext, [] user : DiscordUser) = - getAttributions (DiscordInteractionContext ctx) user.Id - // [] member this.ClearInvites (ctx : InteractionContext) = clearInvites (DiscordInteractionContext ctx)