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
|
//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 =
|
||||||
|
@ -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")
|
||||||
|
@ -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) =
|
||||||
|
Loading…
x
Reference in New Issue
Block a user