Improvements to the invite mechanic

This commit is contained in:
Joseph Ferano 2022-03-19 00:08:41 +07:00
parent ea9500bdaa
commit 0f78219635
3 changed files with 39 additions and 8 deletions

View File

@ -91,7 +91,7 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser
//stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously //stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
//inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
let rec loop areBotsRunning = let rec loop areBotsRunning =

View File

@ -7,7 +7,6 @@ open Degenz
open Newtonsoft.Json open Newtonsoft.Json
module Armory = module Armory =
// let weapons : ItemDetails list= []
let weapons : ItemDetails list = let weapons : ItemDetails list =
let file = System.IO.File.ReadAllText("Items.json") let file = System.IO.File.ReadAllText("Items.json")
// let file = System.IO.File.ReadAllText("Bot/Items.json") // let file = System.IO.File.ReadAllText("Bot/Items.json")

View File

@ -61,6 +61,14 @@ let addInvitedUser did code count =
|> Async.Ignore |> Async.Ignore
with _ -> async.Zero () 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 = let removeInvitedUser did =
try try
connStr connStr
@ -72,6 +80,20 @@ let removeInvitedUser did =
|> Async.Ignore |> Async.Ignore
with _ -> async.Zero () 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 = let getInviteAttributions userId =
connStr connStr
|> Sql.connect |> Sql.connect
@ -91,7 +113,7 @@ let getInvitedUsers userId =
|> Sql.query """ |> Sql.query """
WITH invite AS (SELECT id FROM invite WHERE inviter = @did) WITH invite AS (SELECT id FROM invite WHERE inviter = @did)
SELECT discord_id FROM invited_user, invite 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) |> Sql.executeAsync (fun read -> read.string "discord_id" |> uint64)
|> Async.AwaitTask |> Async.AwaitTask
@ -113,7 +135,7 @@ let createGuildInvite (ctx : IDiscordContext) =
let embed = let embed =
DiscordEmbedBuilder() DiscordEmbedBuilder()
.WithDescription($"Copy this link and share it with any Degenz you want to recruit to the Degenz Army.\n\n" + .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}```") $"```https://discord.gg/{invite.Code}```")
.WithImageUrl("https://pbs.twimg.com/profile_banners/1449270642340089856/1640071520/1500x500") .WithImageUrl("https://pbs.twimg.com/profile_banners/1449270642340089856/1640071520/1500x500")
.WithTitle("Your mission") .WithTitle("Your mission")
@ -151,12 +173,14 @@ let getAttributions (ctx : IDiscordContext) userId = task {
let getInvitedUsersForId (ctx : IDiscordContext) = task { let getInvitedUsersForId (ctx : IDiscordContext) = task {
let! users = getInvitedUsers(ctx.GetDiscordMember().Id) let! users = getInvitedUsers(ctx.GetDiscordMember().Id)
let sb = StringBuilder() let sb = StringBuilder()
let mutable count = 0
for user in users do for user in users do
sb.AppendLine($"<@{user}>") |> ignore count <- count + 1
sb.AppendLine($"{count}.) <@{user}>") |> ignore
let msg = let msg =
DiscordInteractionResponseBuilder() DiscordInteractionResponseBuilder()
.AsEphemeral(true) .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) do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg)
} }
@ -169,7 +193,7 @@ let clearInvites (ctx : IDiscordContext) = task {
|> Async.Ignore |> Async.Ignore
} }
let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) = let processNewUser (eventArgs : GuildMemberAddEventArgs) =
task { task {
let! guildInvites = eventArgs.Guild.GetInvitesAsync() let! guildInvites = eventArgs.Guild.GetInvitesAsync()
let! cachedInvites = getInvites() let! cachedInvites = getInvites()
@ -179,12 +203,13 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
| Some (inviter,count) -> | Some (inviter,count) ->
if invite.Uses > count then if invite.Uses > count then
do! addInvitedUser eventArgs.Member.Id invite.Code invite.Uses |> Async.Ignore do! addInvitedUser eventArgs.Member.Id invite.Code invite.Uses |> Async.Ignore
let! _ = acceptInvite eventArgs.Member.Id
let! player = DbService.tryFindPlayer inviter let! player = DbService.tryFindPlayer inviter
match player with match player with
| Some player -> | Some player ->
do! DbService.updatePlayerCurrency (int InviteRewardAmount) player |> Async.Ignore do! DbService.updatePlayerCurrency (int InviteRewardAmount) player |> Async.Ignore
let builder = DiscordMessageBuilder() 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) let channel = eventArgs.Guild.GetChannel(GuildEnvironment.channelEventsHackerBattle)
do! channel.SendMessageAsync(builder) do! channel.SendMessageAsync(builder)
|> Async.AwaitTask |> Async.AwaitTask
@ -193,6 +218,13 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
| None -> () | None -> ()
} :> Task } :> 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 // 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. // rewarding GBT.
//let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) = //let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) =