Return existing user code rather than creating a new unique one
This commit is contained in:
parent
ee1881f2d0
commit
7b26bd05cd
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user