From 64a288bf217f8d19ac7674f7bdbf6a7bf52aa016 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Wed, 2 Mar 2022 23:10:16 +0700 Subject: [PATCH] Invite tracker --- Bot/Bot.fs | 17 +++++++++++++ Bot/Bot.fsproj | 1 + Bot/InviteTracker.fs | 58 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 Bot/InviteTracker.fs diff --git a/Bot/Bot.fs b/Bot/Bot.fs index 93ae670..3d820a4 100644 --- a/Bot/Bot.fs +++ b/Bot/Bot.fs @@ -58,6 +58,18 @@ stealCommands.RegisterCommands(guild); hackerBattleBot.add_ComponentInteractionCreated(AsyncEventHandler(HackerBattle.handleButtonEvent)) storeBot.add_ComponentInteractionCreated(AsyncEventHandler(Store.handleStoreEvents)) stealBot.add_ComponentInteractionCreated(AsyncEventHandler(Thief.handleStealButton)) +hackerBattleBot.add_InviteCreated((fun client args -> + task { + do! InviteTracker.createInvite args.Invite.Inviter.Id args.Invite.Code |> Async.Ignore + })) +hackerBattleBot.add_GuildMemberAdded(AsyncEventHandler(fun client ea -> + task { + let! guildInvites = ea.Guild.GetInvitesAsync() + let! cachedInvites = InviteTracker.getInvites() + for invite in guildInvites do + if invite.Uses < (snd cachedInvites.[invite.Code]) then + do! InviteTracker.addInvitedUser ea.Member.Id invite.Code |> Async.Ignore + })) let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) = async { @@ -86,6 +98,11 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously +//let channel = hackerBattleBot.GetChannelAsync(1234uL) |> Async.AwaitTask |> Async.RunSynchronously +//channel.invi + + + //async { // let! user = hackerBattleBot.GetUserAsync(GuildEnvironment.botIdHackerBattle) |> Async.AwaitTask // if user <> null then diff --git a/Bot/Bot.fsproj b/Bot/Bot.fsproj index d7929c4..e99922e 100644 --- a/Bot/Bot.fsproj +++ b/Bot/Bot.fsproj @@ -18,6 +18,7 @@ + diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs new file mode 100644 index 0000000..7a6412e --- /dev/null +++ b/Bot/InviteTracker.fs @@ -0,0 +1,58 @@ +module Degenz.InviteTracker + + +open System +open Npgsql.FSharp + +let connStr = GuildEnvironment.connectionString + +type Invite = { + Code : string + Inviter : uint64 + Count : int +} + +let getInvites () = async { + let! invites = + connStr + |> Sql.connect + |> Sql.query "SELECT code, inviter, count FROM invite" + |> Sql.executeAsync (fun read -> { + Code = read.string "code" + Inviter = read.string "inviter" |> uint64 + Count = read.int "count" + }) + |> Async.AwaitTask + return + invites + |> List.map (fun inv -> (inv.Code , (inv.Inviter , inv.Count))) + |> Map.ofList +} + +let createInvite inviter code = + connStr + |> Sql.connect + |> Sql.parameters [ "code" , Sql.string code ; "inviter" , Sql.string (string inviter) ] + |> Sql.query "INSERT INTO invite (code, inviter) VALUES (@code, @inviter)" + |> Sql.executeNonQueryAsync + |> Async.AwaitTask + +let addInvitedUser did code = + connStr + |> Sql.connect + |> Sql.executeTransactionAsync [ + """ + WITH invite AS (SELECT id FROM invite WHERE code = @code) + INSERT INTO invited_user (discord_id, invite_id) SELECT @discord_id, invite.id FROM invite; + """ , [ [ "@discord_id" , Sql.string (string did) ] ; [ "@code" , Sql.string code ] ] + "UPDATE invite SET count = count + 1 WHERE code = @code" , [ [ "@code" , Sql.string code ] ] + ] + |> Async.AwaitTask + +let getInviteAttributions user = + connStr + |> Sql.connect + |> Sql.parameters [ "did" , Sql.string (string user.DiscordId) ] + |> Sql.query "SELECT sum(count) AS total FROM invite WHERE inviter = @did" + |> Sql.executeAsync (fun read -> read.int "total") + |> Async.AwaitTask