73 lines
2.8 KiB
Plaintext
73 lines
2.8 KiB
Plaintext
#load "/home/joe/Development/DegenzGame/.paket/load/net6.0/main.group.fsx";;
|
|
|
|
open Npgsql.FSharp
|
|
open DSharpPlus
|
|
open dotenv.net
|
|
|
|
let prodEnv = DotEnv.Read(DotEnvOptions(envFilePaths = [ "./.prod.env" ]))
|
|
let devEnv = DotEnv.Read(DotEnvOptions(envFilePaths = [ "./.dev.env" ]))
|
|
|
|
let ( _ , prodConnStr )= prodEnv.TryGetValue("DATABASE_URL")
|
|
let ( _ , devConnStr )= devEnv.TryGetValue("DATABASE_URL")
|
|
let ( _ , adminBotToken )= prodEnv.TryGetValue("TOKEN_ADMINBOT")
|
|
|
|
let botConfig = DiscordConfiguration()
|
|
botConfig.TokenType <- TokenType.Bot
|
|
botConfig.Intents <- DiscordIntents.All
|
|
botConfig.Token <- adminBotToken
|
|
|
|
printfn "Connecting"
|
|
let bot = new DiscordClient(botConfig)
|
|
bot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
|
|
|
printfn "Getting Guild"
|
|
let prodGuild = 933888229776703559uL
|
|
let guild = bot.GetGuildAsync(prodGuild) |> Async.AwaitTask |> Async.RunSynchronously
|
|
printfn "Getting Members"
|
|
let users = guild.GetAllMembersAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
|
printfn $"Total Members: {users.Count}"
|
|
|
|
let whitelisted =
|
|
users
|
|
|> Seq.filter (fun u -> u.Roles |> Seq.exists (fun role -> role.Name.Contains("Confirmed")))
|
|
|> Seq.toList
|
|
|
|
printfn $"Total Whitelist Confirmed: {whitelisted.Length}"
|
|
|
|
printfn "Getting Wallet Addresses:"
|
|
let walletAddresses =
|
|
prodConnStr
|
|
|> Sql.connect
|
|
|> Sql.query """
|
|
SELECT DISTINCT discord_id, display_name, wallet_address FROM "user" WHERE wallet_address IS NOT NULL;
|
|
"""
|
|
|> Sql.execute (fun reader -> {| Id = reader.string "discord_id" |> uint64 ; Name = reader.string "display_name" ; Wallet = reader.string "wallet_address" |})
|
|
|
|
printfn $"Total Wallet Addresses: {walletAddresses.Length}"
|
|
|
|
let insert did name wallet wl og =
|
|
devConnStr
|
|
|> Sql.connect
|
|
|> Sql.parameters [ "did" , Sql.string (string did) ; "name" , Sql.string name ; "wallet" , Sql.string wallet
|
|
"wl" , Sql.bool wl ; "og" , Sql.bool og ]
|
|
|> Sql.query """
|
|
INSERT INTO crypto(discord_id, display_name, wallet_address, has_wl, has_og) VALUES (@did, @name, @wallet, @wl, @og)
|
|
ON CONFLICT (wallet_address) DO
|
|
UPDATE SET display_name = @name, discord_id = @did , has_wl = @wl , has_og = @og WHERE crypto.wallet_address = @wallet;
|
|
"""
|
|
|> Sql.executeNonQuery
|
|
|
|
printfn "Inserting"
|
|
async {
|
|
for user in whitelisted do
|
|
for wa in walletAddresses do
|
|
if wa.Id = user.Id then
|
|
let hasWL = user.Roles |> Seq.exists (fun role -> role.Name = "Whitelist Confirmed")
|
|
let hasOG = user.Roles |> Seq.exists (fun role -> role.Name = "OG Whitelist Confirmed")
|
|
try
|
|
let _ = insert wa.Id wa.Name wa.Wallet hasWL hasOG
|
|
()
|
|
with ex -> printfn $"{ex.Message}"
|
|
} |> Async.RunSynchronously
|
|
|
|
bot.DisconnectAsync() |> Async.AwaitTask |> Async.RunSynchronously |