Add select (#5003)

This commit is contained in:
moonheart08
2021-10-25 09:23:44 -05:00
committed by GitHub
parent 17e0362e06
commit debd22e19c

View File

@@ -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<string, Token>(inp[11..], new Token(TokenKind.ParentedTo, "parented_to")),
_ when inp.StartsWith("prototyped ") => new Tuple<string, Token>(inp[10..], new Token(TokenKind.Prototyped, "prototyped")),
_ when inp.StartsWith("tagged ") => new Tuple<string, Token>(inp[6..], new Token(TokenKind.Tagged, "tagged")),
_ when inp.StartsWith("select ") => new Tuple<string, Token>(inp[6..], new Token(TokenKind.Select, "select")),
_ when inp.StartsWith("do ") => new Tuple<string, Token>(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<string, IEnumerable<IEntity>>(remainingQuery, entities);
default: