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
|
|> 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 =
|
let createInvite inviter code =
|
||||||
connStr
|
connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
@ -288,21 +309,27 @@ let handleCreateInvite (ctx : IDiscordContext) =
|
|||||||
let builder = DiscordInteractionResponseBuilder().AsEphemeral(true)
|
let builder = DiscordInteractionResponseBuilder().AsEphemeral(true)
|
||||||
do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder)
|
do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder)
|
||||||
|
|
||||||
let channel = ctx.GetGuild().Channels.[GuildEnvironment.channelWelcome]
|
let user = ctx.GetDiscordMember()
|
||||||
let! invite = channel.CreateInviteAsync(max_age = 0, unique = true)
|
|
||||||
|
|
||||||
// When a player generates an invite code but it hasn't expired, it generates the same code, creating a duplicate entry
|
let! code =
|
||||||
// so catch the exception thrown because the code column is unique
|
task {
|
||||||
try
|
let! invites = getInvitesFromUser user.Id
|
||||||
let! _ = createInvite (ctx.GetDiscordMember().Id) invite.Code
|
match invites |> Map.toList with
|
||||||
return ()
|
| [] ->
|
||||||
with ex ->
|
let channel = ctx.GetGuild().Channels.[GuildEnvironment.channelWelcome]
|
||||||
printfn "%A" ex.Message
|
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 =
|
let msg =
|
||||||
DiscordFollowupMessageBuilder()
|
DiscordFollowupMessageBuilder()
|
||||||
.WithContent($"https://discord.gg/{invite.Code}")
|
.WithContent($"https://discord.gg/{code}")
|
||||||
.AsEphemeral(true)
|
.AsEphemeral(true)
|
||||||
|
|
||||||
do! ctx.FollowUp(msg)
|
do! ctx.FollowUp(msg)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user