Check if the player has an empty hack inventory
This commit is contained in:
		
							parent
							
								
									d329714aef
								
							
						
					
					
						commit
						9924460001
					
				| @ -18,7 +18,7 @@ let getTimeTillCooldownFinishes (timespan : TimeSpan) timestamp = | |||||||
|     else |     else | ||||||
|         $"{timeRemaining.Seconds} seconds" |         $"{timeRemaining.Seconds} seconds" | ||||||
| 
 | 
 | ||||||
| let checkForExistingHack attacker defenderId = | let checkForExistingHack defenderId attacker = | ||||||
|     let updatedAttacks = |     let updatedAttacks = | ||||||
|         attacker.Attacks |         attacker.Attacks | ||||||
|         |> removeExpiredActions (TimeSpan.FromHours(24)) (fun atk -> atk.Timestamp) |         |> removeExpiredActions (TimeSpan.FromHours(24)) (fun atk -> atk.Timestamp) | ||||||
| @ -29,21 +29,26 @@ let checkForExistingHack attacker defenderId = | |||||||
|            let cooldown = getTimeTillCooldownFinishes (TimeSpan.FromHours(24)) attack.Timestamp |            let cooldown = getTimeTillCooldownFinishes (TimeSpan.FromHours(24)) attack.Timestamp | ||||||
|            Error $"You can only hack the same target once every 24 hours, wait {cooldown} to attempt another hack on {attack.Target.Name}." |            Error $"You can only hack the same target once every 24 hours, wait {cooldown} to attempt another hack on {attack.Target.Name}." | ||||||
|        | None -> |        | None -> | ||||||
|            Ok updatedAttacks |            Ok attacker | ||||||
| 
 | 
 | ||||||
| let checkIfHackHasCooldown hack updatedAttacks = | let checkIfHackHasCooldown hack attacker = | ||||||
|     let mostRecentHackAttack = |     let mostRecentHackAttack = | ||||||
|         updatedAttacks |         attacker.Attacks | ||||||
|         |> Array.tryFind (fun a -> a.HackType = hack) |         |> Array.tryFind (fun a -> a.HackType = hack) | ||||||
|         |> function |         |> function | ||||||
|            | Some a -> a.Timestamp |            | Some a -> a.Timestamp | ||||||
|            | None -> DateTime.MinValue |            | None -> DateTime.MinValue | ||||||
|     if DateTime.UtcNow - mostRecentHackAttack > TimeSpan.FromMinutes(5) then |     if DateTime.UtcNow - mostRecentHackAttack > TimeSpan.FromMinutes(5) then | ||||||
|         Ok updatedAttacks |         Ok attacker | ||||||
|     else |     else | ||||||
|        let cooldown = getTimeTillCooldownFinishes (TimeSpan.FromMinutes(5)) mostRecentHackAttack |        let cooldown = getTimeTillCooldownFinishes (TimeSpan.FromMinutes(5)) mostRecentHackAttack | ||||||
|        Error $"{hack} is currently on cooldown, wait {cooldown} to use it again." |        Error $"{hack} is currently on cooldown, wait {cooldown} to use it again." | ||||||
| 
 | 
 | ||||||
|  | let checkIfInventoryIsEmpty attacker = | ||||||
|  |     match attacker.Weapons with | ||||||
|  |     | [||] -> Error $"You currently do not have any Hacks to use against others. Please go to the store and purchase one." | ||||||
|  |     | _ -> Ok attacker | ||||||
|  | 
 | ||||||
| let calculateDamage (hack: int) (shield: int) = | let calculateDamage (hack: int) (shield: int) = | ||||||
|     let hackClass = getClass hack |     let hackClass = getClass hack | ||||||
|     let protectionClass = getClass shield |     let protectionClass = getClass shield | ||||||
| @ -117,8 +122,10 @@ let attack (ctx : InteractionContext) (target : DiscordUser) = | |||||||
|         let! defender = DbService.tryFindPlayer target.Id |         let! defender = DbService.tryFindPlayer target.Id | ||||||
|         match attacker , defender with |         match attacker , defender with | ||||||
|         | Some attacker , Some defender -> |         | Some attacker , Some defender -> | ||||||
|             let existingHack = checkForExistingHack attacker defender.DiscordId |             let hackAttempt = | ||||||
|             match existingHack with |                 checkForExistingHack defender.DiscordId attacker | ||||||
|  |                 |> Result.bind checkIfInventoryIsEmpty | ||||||
|  |             match hackAttempt with | ||||||
|             | Ok _ -> |             | Ok _ -> | ||||||
|                 let embed = Embeds.pickHack "Attack" attacker defender |                 let embed = Embeds.pickHack "Attack" attacker defender | ||||||
|                 do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, embed) |                 do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, embed) | ||||||
| @ -146,7 +153,7 @@ let handleAttack (event : ComponentInteractionCreateEventArgs) = | |||||||
|         // TODO: Do not let player hack themselves |         // TODO: Do not let player hack themselves | ||||||
|         match resultPlayer , resultTarget , true , resultId with |         match resultPlayer , resultTarget , true , resultId with | ||||||
|         | Some attacker , Some defender , true , true -> |         | Some attacker , Some defender , true , true -> | ||||||
|             do! checkForExistingHack attacker defender.DiscordId |             do! checkForExistingHack defender.DiscordId attacker | ||||||
|                 |> Result.bind (checkIfHackHasCooldown hack) |                 |> Result.bind (checkIfHackHasCooldown hack) | ||||||
|                 |> function |                 |> function | ||||||
|                    | Ok _ -> |                    | Ok _ -> | ||||||
|  | |||||||
| @ -7,19 +7,19 @@ open MongoDB.Bson | |||||||
| open MongoDB.Bson.Serialization | open MongoDB.Bson.Serialization | ||||||
| open MongoDB.Driver | open MongoDB.Driver | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| let mongo = MongoClient(Environment.GetEnvironmentVariable("CONN_STRING")) | let mongo = MongoClient(Environment.GetEnvironmentVariable("CONN_STRING")) | ||||||
| let db = mongo.GetDatabase("degenz") | let db = mongo.GetDatabase("degenz") | ||||||
| let players = db.GetCollection<BsonDocument>("players") | let players = db.GetCollection<BsonDocument>("players") | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| let tryFindPlayer (id : uint64) = | let tryFindPlayer (id : uint64) = | ||||||
|     async { |     async { | ||||||
|         let filter = Builders<BsonDocument>.Filter.Eq("Player.DiscordId", id); |         let filter = Builders<BsonDocument>.Filter.Eq("Player.DiscordId", id) | ||||||
|         let! player = players.Find<BsonDocument>(filter).FirstOrDefaultAsync() |> Async.AwaitTask |         let! player = players.FindAsync<BsonDocument>(filter) |> Async.AwaitTask | ||||||
|         return match player with |         match player.FirstOrDefault() with | ||||||
|                | null -> None |         | null -> return None | ||||||
|                | player -> |         | p -> | ||||||
|                     player |             return p | ||||||
|                 .GetValue("Player") |                 .GetValue("Player") | ||||||
|                 .ToBsonDocument() |                 .ToBsonDocument() | ||||||
|                 |> BsonSerializer.Deserialize<Player> |                 |> BsonSerializer.Deserialize<Player> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user