Read PlayerEvents from DB and check if achievement exists
This commit is contained in:
parent
31de79f1b6
commit
25654c9b8c
@ -100,7 +100,8 @@ module Arsenal =
|
|||||||
let actionFormat (actions : PlayerEvent array) =
|
let actionFormat (actions : PlayerEvent array) =
|
||||||
match actions with
|
match actions with
|
||||||
| [||] -> "None"
|
| [||] -> "None"
|
||||||
| _ -> actions
|
| acts ->
|
||||||
|
acts
|
||||||
|> Array.map (fun act ->
|
|> Array.map (fun act ->
|
||||||
match act.Type with
|
match act.Type with
|
||||||
| Hacking h ->
|
| Hacking h ->
|
||||||
@ -112,7 +113,7 @@ module Arsenal =
|
|||||||
let cooldown = Messaging.getTimeText true (System.TimeSpan.FromMinutes(int act.Cooldown)) act.Timestamp
|
let cooldown = Messaging.getTimeText true (System.TimeSpan.FromMinutes(int act.Cooldown)) act.Timestamp
|
||||||
$"{item.Name} Shield active for {cooldown}"
|
$"{item.Name} Shield active for {cooldown}"
|
||||||
| _ -> "")
|
| _ -> "")
|
||||||
|> Array.filter (System.String.IsNullOrWhiteSpace)
|
|> Array.filter (System.String.IsNullOrWhiteSpace >> not)
|
||||||
|> String.concat "\n"
|
|> String.concat "\n"
|
||||||
|
|
||||||
let statusFormat p =
|
let statusFormat p =
|
||||||
|
@ -144,9 +144,7 @@ let handleHack (ctx : IDiscordContext) =
|
|||||||
|
|
||||||
let sb = StringBuilder("Here, ")
|
let sb = StringBuilder("Here, ")
|
||||||
|
|
||||||
// TODO DB:
|
let! isFirstTrainer = DbService.checkHasAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
|
||||||
// let isFirstTrainer = player.Achievements |> Seq.contains trainerAchievement |> not
|
|
||||||
let isFirstTrainer = true
|
|
||||||
if isFirstTrainer then
|
if isFirstTrainer then
|
||||||
do! DbService.addAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
|
do! DbService.addAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
|
||||||
|> Async.Ignore
|
|> Async.Ignore
|
||||||
@ -180,9 +178,9 @@ let handleArsenal (ctx : IDiscordContext) =
|
|||||||
|> Async.Ignore
|
|> Async.Ignore
|
||||||
let embed = Embeds.getArsenalEmbed updatedPlayer
|
let embed = Embeds.getArsenalEmbed updatedPlayer
|
||||||
do! ctx.FollowUp(embed) |> Async.AwaitTask
|
do! ctx.FollowUp(embed) |> Async.AwaitTask
|
||||||
// TODO DB:
|
|
||||||
// if not (player.Achievements |> Array.contains trainerAchievement) then
|
let! isFirstTrainer = DbService.checkHasAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
|
||||||
if true then
|
if isFirstTrainer then
|
||||||
do! Async.Sleep 3000
|
do! Async.Sleep 3000
|
||||||
let rewards = [ $"{defaultHack.Name} Hack" ; $"{defaultShield.Name} Shield" ]
|
let rewards = [ $"{defaultHack.Name} Hack" ; $"{defaultShield.Name} Shield" ]
|
||||||
let embed = Embeds.getAchievementEmbed rewards "You completed the Training Dojo and collected loot." trainerAchievement
|
let embed = Embeds.getAchievementEmbed rewards "You completed the Training Dojo and collected loot." trainerAchievement
|
||||||
|
@ -28,33 +28,57 @@ let mapBack user : PlayerData =
|
|||||||
Bank = user.Bank
|
Bank = user.Bank
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let getPlayerEvents connStr (player : PlayerData) =
|
||||||
|
connStr
|
||||||
|
|> Sql.connect
|
||||||
|
|> Sql.parameters [ "did", Sql.string (string player.DiscordId) ]
|
||||||
|
|> Sql.query """
|
||||||
|
WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did)
|
||||||
|
SELECT event_type, success, is_instigator, item_id, cooldown, adversary_id, adversary_name, created_at
|
||||||
|
FROM player_event ,usr WHERE user_id = usr.id;
|
||||||
|
"""
|
||||||
|
|> Sql.executeAsync (fun read ->
|
||||||
|
match read.string "event_type" with
|
||||||
|
| "Hacking" ->
|
||||||
|
Hacking {
|
||||||
|
IsInstigator = read.bool "is_instigator"
|
||||||
|
Success = read.bool "success"
|
||||||
|
Adversary = { Id = read.string "adversary_id" |> uint64 ; Name = read.string "adversary_name" }
|
||||||
|
HackId = read.int "item_id"
|
||||||
|
}
|
||||||
|
| "Shielding" -> Shielding (read.int "item_id")
|
||||||
|
| "Stealing" -> Stealing ( read.bool "is_instigator" , { Id = read.string "adversary_id" |> uint64 ; Name = read.string "adversary_name" } )
|
||||||
|
| _ -> Imprison
|
||||||
|
|> fun t ->
|
||||||
|
let date = read.dateTimeOrNone "created_at" |> Option.defaultValue DateTime.UtcNow
|
||||||
|
{ Type = t ; Cooldown = read.int "cooldown" * 1<mins> ; Timestamp = date }
|
||||||
|
)
|
||||||
|
|> Async.AwaitTask
|
||||||
|
|
||||||
let tryFindPlayer connStr (discordId : uint64) =
|
let tryFindPlayer connStr (discordId : uint64) =
|
||||||
async {
|
async {
|
||||||
try
|
let! user =
|
||||||
let! user =
|
connStr
|
||||||
connStr
|
|> Sql.connect
|
||||||
|> Sql.connect
|
|> Sql.parameters [ "did", Sql.string (string discordId) ]
|
||||||
|> Sql.query """
|
|> Sql.query """
|
||||||
SELECT discord_id, display_name, gbt, strength, inventory
|
SELECT discord_id, display_name, gbt, strength, inventory FROM "user" WHERE discord_id = @did
|
||||||
FROM "user" WHERE discord_id = @did")
|
"""
|
||||||
"""
|
|> Sql.executeAsync (fun read ->
|
||||||
|> Sql.parameters [ "did", Sql.string (string discordId) ]
|
{
|
||||||
|> Sql.executeAsync (fun read ->
|
DiscordId = read.string "discord_id" |> uint64
|
||||||
{
|
Name = read.string "display_name"
|
||||||
DiscordId = read.string "discord_id" |> uint64
|
Bank = read.int "gbt" * 1<GBT>
|
||||||
Name = read.string "display_name"
|
Strength = read.int "strength"
|
||||||
Bank = read.int "gbt" * 1<GBT>
|
Inventory = read.intArray "inventory"
|
||||||
Strength = read.int "strength"
|
})
|
||||||
Inventory = read.intArray "inventory"
|
|> Async.AwaitTask
|
||||||
})
|
match List.tryHead user with
|
||||||
|> Async.AwaitTask
|
| None -> return None
|
||||||
|
| Some u ->
|
||||||
match List.tryHead user with
|
let player = mapBack u
|
||||||
| None -> return None
|
let! events = getPlayerEvents connStr player
|
||||||
| Some u -> return Some (mapBack u)
|
return Some { player with Events = events |> List.toArray }
|
||||||
with e ->
|
|
||||||
printfn $"{e.Message}"
|
|
||||||
return None
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let updatePlayer connStr (player : PlayerData) =
|
let updatePlayer connStr (player : PlayerData) =
|
||||||
@ -68,7 +92,7 @@ let updatePlayer connStr (player : PlayerData) =
|
|||||||
]
|
]
|
||||||
|> Sql.query """
|
|> Sql.query """
|
||||||
UPDATE "user" SET gbt = @gbt, strength = @str, inventory = @inv
|
UPDATE "user" SET gbt = @gbt, strength = @str, inventory = @inv
|
||||||
WHERE discord_id = @did")
|
WHERE discord_id = @did
|
||||||
"""
|
"""
|
||||||
|> Sql.executeNonQueryAsync
|
|> Sql.executeNonQueryAsync
|
||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
@ -76,15 +100,34 @@ let updatePlayer connStr (player : PlayerData) =
|
|||||||
let addAchievement connStr (did : uint64) (achievement : string) =
|
let addAchievement connStr (did : uint64) (achievement : string) =
|
||||||
connStr
|
connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
|
|> Sql.parameters
|
||||||
|
[ ( "did" , Sql.string (string did) )
|
||||||
|
( "symbol", Sql.string achievement ) ]
|
||||||
|> Sql.query """
|
|> Sql.query """
|
||||||
WITH ach AS (INSERT INTO achievement (symbol) VALUES (@symbol) RETURNING id),
|
WITH ach AS (INSERT INTO achievement (symbol) VALUES (@symbol) RETURNING id),
|
||||||
usr AS (SELECT id FROM "user" WHERE discord_id = @did)
|
usr AS (SELECT id FROM "user" WHERE discord_id = @did)
|
||||||
INSERT INTO user_achievements_achievement (user_id, achievement_id) SELECT usr.id, ach.id FROM usr, ach")
|
INSERT INTO user_achievements_achievement (user_id, achievement_id) SELECT usr.id, ach.id FROM usr, ach
|
||||||
"""
|
"""
|
||||||
|> Sql.parameters [ ( "did" , Sql.string (string did) ) ; ( "achievement", Sql.string achievement ) ]
|
|
||||||
|> Sql.executeNonQueryAsync
|
|> Sql.executeNonQueryAsync
|
||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
|
|
||||||
|
let checkHasAchievement connStr (did : uint64) (achievement : string) = async {
|
||||||
|
let! result =
|
||||||
|
connStr
|
||||||
|
|> Sql.connect
|
||||||
|
|> Sql.parameters
|
||||||
|
[ ( "did" , Sql.string (string did) )
|
||||||
|
( "symbol", Sql.string achievement ) ]
|
||||||
|
|> Sql.query """
|
||||||
|
WITH ach AS (SELECT id FROM achievement WHERE symbol = @symbol),
|
||||||
|
usr AS (SELECT id FROM "user" WHERE discord_id = @did)
|
||||||
|
SELECT achievement_id FROM user_achievements_achievement, ach, usr WHERE user_id = usr.id and achievement_id = ach.id;
|
||||||
|
"""
|
||||||
|
|> Sql.executeAsync (fun read -> read.int "achievement_id")
|
||||||
|
|> Async.AwaitTask
|
||||||
|
return List.isEmpty result |> not
|
||||||
|
}
|
||||||
|
|
||||||
let addPlayerEvent connStr (did : uint64) (playerEvent : PlayerEvent) =
|
let addPlayerEvent connStr (did : uint64) (playerEvent : PlayerEvent) =
|
||||||
let sqlParams , query =
|
let sqlParams , query =
|
||||||
match playerEvent.Type with
|
match playerEvent.Type with
|
||||||
@ -135,7 +178,7 @@ let addPlayerEvent connStr (did : uint64) (playerEvent : PlayerEvent) =
|
|||||||
"""
|
"""
|
||||||
WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did)
|
WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did)
|
||||||
INSERT INTO player_event (event_type, cooldown, user_id)
|
INSERT INTO player_event (event_type, cooldown, user_id)
|
||||||
SELECT 'Stealing', @cooldown, usr.id FROM usr
|
SELECT 'Imprison', @cooldown, usr.id FROM usr
|
||||||
"""
|
"""
|
||||||
connStr
|
connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
|
@ -122,10 +122,10 @@ module Types =
|
|||||||
Inventory : Item array
|
Inventory : Item array
|
||||||
Events : PlayerEvent array
|
Events : PlayerEvent array
|
||||||
Traits : PlayerTraits
|
Traits : PlayerTraits
|
||||||
// Achievements : string array
|
|
||||||
// XP : int
|
|
||||||
Bank : int<GBT>
|
Bank : int<GBT>
|
||||||
}
|
}
|
||||||
|
// Achievements : string array
|
||||||
|
// XP : int
|
||||||
with member this.basicPlayer = { Id = this.DiscordId ; Name = this.Name }
|
with member this.basicPlayer = { Id = this.DiscordId ; Name = this.Name }
|
||||||
static member empty =
|
static member empty =
|
||||||
{ DiscordId = 0uL
|
{ DiscordId = 0uL
|
||||||
|
Loading…
x
Reference in New Issue
Block a user