From debd22e19ced6062f7d9b714fcfca4c5e2750d0a Mon Sep 17 00:00:00 2001 From: moonheart08 Date: Mon, 25 Oct 2021 09:23:44 -0500 Subject: [PATCH] Add select (#5003) --- .../Administration/Commands/BQL/BqlParser.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Content.Server/Administration/Commands/BQL/BqlParser.cs b/Content.Server/Administration/Commands/BQL/BqlParser.cs index 1165cd7fe8..a04c91f01a 100644 --- a/Content.Server/Administration/Commands/BQL/BqlParser.cs +++ b/Content.Server/Administration/Commands/BQL/BqlParser.cs @@ -18,6 +18,7 @@ namespace Content.Server.Administration.Commands.BQL ParentedTo, Prototyped, Tagged, + Select, Do, String, } @@ -44,6 +45,7 @@ namespace Content.Server.Administration.Commands.BQL _ when inp.StartsWith("parented_to ") => new Tuple(inp[11..], new Token(TokenKind.ParentedTo, "parented_to")), _ when inp.StartsWith("prototyped ") => new Tuple(inp[10..], new Token(TokenKind.Prototyped, "prototyped")), _ when inp.StartsWith("tagged ") => new Tuple(inp[6..], new Token(TokenKind.Tagged, "tagged")), + _ when inp.StartsWith("select ") => new Tuple(inp[6..], new Token(TokenKind.Select, "select")), _ when inp.StartsWith("do ") => new Tuple(inp[2..], new Token(TokenKind.Do, "do")), _ => ExtractStringToken(inp) }; @@ -152,6 +154,27 @@ namespace Content.Server.Administration.Commands.BQL entities = entities.Where(e => e.Prototype?.ID == nt.Text); break; } + case TokenKind.Select: + { + Token nt; + (remainingQuery, nt) = Token.ExtractOneToken(remainingQuery); + entities = entities.OrderBy(a => Guid.NewGuid()); //Cheeky way of randomizing. + if (int.TryParse(nt.Text, out var x)) + { + entities = entities.Take(x); + } + else if (nt.Text.Last() == '%' && int.TryParse(nt.Text[..^1], out x)) + { + var enumerable = entities.ToArray(); + var amount = (int)Math.Floor(enumerable.Length * (x * 0.01)); + entities = enumerable.Take(amount); + } + else + { + throw new Exception("The value " + nt.Text + " is not a valid number nor a valid percentage."); + } + break; + } case TokenKind.Do: return new Tuple>(remainingQuery, entities); default: