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