diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs index 98ed36d..d19ef63 100644 --- a/Bot/InviteTracker.fs +++ b/Bot/InviteTracker.fs @@ -40,6 +40,27 @@ let getInvites () = async { |> Map.ofList } +let getInvitesFromUser discordId = async { + let! invites = + connStr + |> Sql.connect + |> Sql.parameters [ "did" , Sql.string (string discordId) ] + |> Sql.query """ + SELECT code, count FROM invite + WHERE inviter = @did + """ + |> Sql.executeAsync (fun read -> { + Code = read.string "code" + Inviter = discordId + 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 @@ -288,21 +309,27 @@ let handleCreateInvite (ctx : IDiscordContext) = let builder = DiscordInteractionResponseBuilder().AsEphemeral(true) do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) - let channel = ctx.GetGuild().Channels.[GuildEnvironment.channelWelcome] - let! invite = channel.CreateInviteAsync(max_age = 0, unique = true) + let user = ctx.GetDiscordMember() - // When a player generates an invite code but it hasn't expired, it generates the same code, creating a duplicate entry - // so catch the exception thrown because the code column is unique - try - let! _ = createInvite (ctx.GetDiscordMember().Id) invite.Code - return () - with ex -> - printfn "%A" ex.Message - () + let! code = + task { + let! invites = getInvitesFromUser user.Id + match invites |> Map.toList with + | [] -> + let channel = ctx.GetGuild().Channels.[GuildEnvironment.channelWelcome] + let! invite = channel.CreateInviteAsync(max_age = 0, unique = true) + + try do! createInvite (ctx.GetDiscordMember().Id) invite.Code |> Async.Ignore + with ex -> printfn "%A" ex.Message + + return invite.Code + | invite::_ -> + return invite |> fst + } let msg = DiscordFollowupMessageBuilder() - .WithContent($"https://discord.gg/{invite.Code}") + .WithContent($"https://discord.gg/{code}") .AsEphemeral(true) do! ctx.FollowUp(msg)