Invite tracker

This commit is contained in:
Joseph Ferano 2022-03-02 23:10:16 +07:00
parent f01fc28a0c
commit 64a288bf21
3 changed files with 76 additions and 0 deletions

View File

@ -58,6 +58,18 @@ stealCommands.RegisterCommands<StealGame>(guild);
hackerBattleBot.add_ComponentInteractionCreated(AsyncEventHandler(HackerBattle.handleButtonEvent)) hackerBattleBot.add_ComponentInteractionCreated(AsyncEventHandler(HackerBattle.handleButtonEvent))
storeBot.add_ComponentInteractionCreated(AsyncEventHandler(Store.handleStoreEvents)) storeBot.add_ComponentInteractionCreated(AsyncEventHandler(Store.handleStoreEvents))
stealBot.add_ComponentInteractionCreated(AsyncEventHandler(Thief.handleStealButton)) 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) = let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) =
async { async {
@ -86,6 +98,11 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser
stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
//let channel = hackerBattleBot.GetChannelAsync(1234uL) |> Async.AwaitTask |> Async.RunSynchronously
//channel.invi
//async { //async {
// let! user = hackerBattleBot.GetUserAsync(GuildEnvironment.botIdHackerBattle) |> Async.AwaitTask // let! user = hackerBattleBot.GetUserAsync(GuildEnvironment.botIdHackerBattle) |> Async.AwaitTask
// if user <> null then // if user <> null then

View File

@ -18,6 +18,7 @@
<Compile Include="GameHelpers.fs" /> <Compile Include="GameHelpers.fs" />
<Compile Include="DbService.fs" /> <Compile Include="DbService.fs" />
<Compile Include="PlayerInteractions.fs" /> <Compile Include="PlayerInteractions.fs" />
<Compile Include="InviteTracker.fs" />
<Compile Include="XP.fs" /> <Compile Include="XP.fs" />
<Compile Include="Embeds.fs" /> <Compile Include="Embeds.fs" />
<Compile Include="Games\SlotMachine.fs" /> <Compile Include="Games\SlotMachine.fs" />

58
Bot/InviteTracker.fs Normal file
View File

@ -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