Improvements to the invite mechanic
This commit is contained in:
parent
ea9500bdaa
commit
0f78219635
@ -91,7 +91,7 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser
|
||||
|
||||
//stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
||||
|
||||
//inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
||||
inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
||||
|
||||
|
||||
let rec loop areBotsRunning =
|
||||
|
@ -7,7 +7,6 @@ open Degenz
|
||||
open Newtonsoft.Json
|
||||
|
||||
module Armory =
|
||||
// let weapons : ItemDetails list= []
|
||||
let weapons : ItemDetails list =
|
||||
let file = System.IO.File.ReadAllText("Items.json")
|
||||
// let file = System.IO.File.ReadAllText("Bot/Items.json")
|
||||
|
@ -61,6 +61,14 @@ let addInvitedUser did code count =
|
||||
|> Async.Ignore
|
||||
with _ -> async.Zero ()
|
||||
|
||||
let acceptInvite did =
|
||||
connStr
|
||||
|> Sql.connect
|
||||
|> Sql.parameters [ "did" , Sql.string (string did) ]
|
||||
|> Sql.query "UPDATE invited_user SET accepted = true WHERE discord_id = @did"
|
||||
|> Sql.executeNonQueryAsync
|
||||
|> Async.AwaitTask
|
||||
|
||||
let removeInvitedUser did =
|
||||
try
|
||||
connStr
|
||||
@ -72,6 +80,20 @@ let removeInvitedUser did =
|
||||
|> Async.Ignore
|
||||
with _ -> async.Zero ()
|
||||
|
||||
let checkUserInvited userId = async {
|
||||
let! result =
|
||||
connStr
|
||||
|> Sql.connect
|
||||
|> Sql.parameters [ "did" , Sql.string (string userId) ]
|
||||
|> Sql.query """
|
||||
SELECT id FROM invited_user WHERE discord_id = @did
|
||||
"""
|
||||
|> Sql.executeAsync (fun read -> read.int "id")
|
||||
|> Async.AwaitTask
|
||||
|
||||
return List.isEmpty result |> not
|
||||
}
|
||||
|
||||
let getInviteAttributions userId =
|
||||
connStr
|
||||
|> Sql.connect
|
||||
@ -91,7 +113,7 @@ let getInvitedUsers userId =
|
||||
|> Sql.query """
|
||||
WITH invite AS (SELECT id FROM invite WHERE inviter = @did)
|
||||
SELECT discord_id FROM invited_user, invite
|
||||
WHERE invite.id = invited_user.invite_id AND invited_user.accepted = true;
|
||||
WHERE invite.id = invited_user.invite_id;
|
||||
"""
|
||||
|> Sql.executeAsync (fun read -> read.string "discord_id" |> uint64)
|
||||
|> Async.AwaitTask
|
||||
@ -113,7 +135,7 @@ let createGuildInvite (ctx : IDiscordContext) =
|
||||
let embed =
|
||||
DiscordEmbedBuilder()
|
||||
.WithDescription($"Copy this link and share it with any Degenz you want to recruit to the Degenz Army.\n\n" +
|
||||
"**YOUR REWARD:** Recruit `10` people and gain access to Beautopia©" +
|
||||
"**YOUR REWARD:** Eartn 10 💰$GBT for every person you recruit that comes into the server" +
|
||||
$"```https://discord.gg/{invite.Code}```")
|
||||
.WithImageUrl("https://pbs.twimg.com/profile_banners/1449270642340089856/1640071520/1500x500")
|
||||
.WithTitle("Your mission")
|
||||
@ -151,12 +173,14 @@ let getAttributions (ctx : IDiscordContext) userId = task {
|
||||
let getInvitedUsersForId (ctx : IDiscordContext) = task {
|
||||
let! users = getInvitedUsers(ctx.GetDiscordMember().Id)
|
||||
let sb = StringBuilder()
|
||||
let mutable count = 0
|
||||
for user in users do
|
||||
sb.AppendLine($"<@{user}>") |> ignore
|
||||
count <- count + 1
|
||||
sb.AppendLine($"{count}.) <@{user}>") |> ignore
|
||||
let msg =
|
||||
DiscordInteractionResponseBuilder()
|
||||
.AsEphemeral(true)
|
||||
.WithContent($"<@{ctx.GetDiscordMember().Id}> has invited the following people:\n{sb}")
|
||||
.WithContent($"**Total Earned:** `{users.Length * InviteRewardAmount} 💰$GBT `\n\n**Last 10 users recruited:**\n{sb}")
|
||||
do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg)
|
||||
}
|
||||
|
||||
@ -169,7 +193,7 @@ let clearInvites (ctx : IDiscordContext) = task {
|
||||
|> Async.Ignore
|
||||
}
|
||||
|
||||
let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
|
||||
let processNewUser (eventArgs : GuildMemberAddEventArgs) =
|
||||
task {
|
||||
let! guildInvites = eventArgs.Guild.GetInvitesAsync()
|
||||
let! cachedInvites = getInvites()
|
||||
@ -179,12 +203,13 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
|
||||
| Some (inviter,count) ->
|
||||
if invite.Uses > count then
|
||||
do! addInvitedUser eventArgs.Member.Id invite.Code invite.Uses |> Async.Ignore
|
||||
let! _ = acceptInvite eventArgs.Member.Id
|
||||
let! player = DbService.tryFindPlayer inviter
|
||||
match player with
|
||||
| Some player ->
|
||||
do! DbService.updatePlayerCurrency (int InviteRewardAmount) player |> Async.Ignore
|
||||
let builder = DiscordMessageBuilder()
|
||||
builder.WithContent($"{eventArgs.Member.DisplayName} was invited to the server. <@{player.DiscordId}> just earned {InviteRewardAmount} 💰$GBT!") |> ignore
|
||||
builder.WithContent($"{eventArgs.Member.DisplayName} was recruited to the server. <@{player.DiscordId}> just earned {InviteRewardAmount} 💰$GBT for their efforts!") |> ignore
|
||||
let channel = eventArgs.Guild.GetChannel(GuildEnvironment.channelEventsHackerBattle)
|
||||
do! channel.SendMessageAsync(builder)
|
||||
|> Async.AwaitTask
|
||||
@ -193,6 +218,13 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
|
||||
| None -> ()
|
||||
} :> Task
|
||||
|
||||
let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
|
||||
task {
|
||||
let! exists = checkUserInvited eventArgs.Member.Id
|
||||
if not exists then
|
||||
do! processNewUser eventArgs
|
||||
} :> Task
|
||||
|
||||
// If we do it like this then there's an obvious exploit where the user can come and go as many times and it will keep
|
||||
// rewarding GBT.
|
||||
//let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) =
|
||||
|
Loading…
x
Reference in New Issue
Block a user