<BoxContainer Orientation="Vertical" MinWidth="200">
<LineEdit Name="PlayerSearch" Access="Public" StyleClasses="actionSearchBox"
HorizontalExpand="true" PlaceHolder="{Loc admin-logs-search-players-placeholder}"/>
+ <Button Name="IncludeNonPlayersButton" Text="{Loc admin-logs-include-non-player}"
+ MinWidth="100" StyleClasses="ButtonSquare" ToggleMode="True" />
<BoxContainer Orientation="Horizontal">
<Button Name="SelectAllPlayersButton" Text="{Loc admin-logs-select-all}"
MinWidth="100" StyleClasses="ButtonSquare" />
SelectAllTypesButton.OnPressed += SelectAllTypes;
SelectNoTypesButton.OnPressed += SelectNoTypes;
+ IncludeNonPlayersButton.OnPressed += IncludeNonPlayers;
SelectAllPlayersButton.OnPressed += SelectAllPlayers;
SelectNoPlayersButton.OnPressed += SelectNoPlayers;
public string Search => LogSearch.Text;
private int ShownLogs { get; set; }
private int TotalLogs { get; set; }
+ public bool IncludeNonPlayerLogs { get; set; }
public HashSet<LogType> SelectedTypes { get; } = new();
UpdateLogs();
}
+ private void IncludeNonPlayers(ButtonEventArgs args)
+ {
+ IncludeNonPlayerLogs = args.Button.Pressed;
+
+ UpdateLogs();
+ }
+
private void SelectAllPlayers(ButtonEventArgs args)
{
SelectedPlayers.Clear();
button.Text.Contains(PlayerSearch.Text, StringComparison.OrdinalIgnoreCase);
}
+ private bool LogMatchesPlayerFilter(AdminLogLabel label)
+ {
+ if (label.Log.Players.Length == 0)
+ return SelectedPlayers.Count == 0 || IncludeNonPlayerLogs;
+
+ return SelectedPlayers.Overlaps(label.Log.Players);
+ }
+
private bool ShouldShowLog(AdminLogLabel label)
{
- return SelectedTypes.Contains(label.Log.Type) &&
- (SelectedPlayers.Count + label.Log.Players.Length == 0 || SelectedPlayers.Overlaps(label.Log.Players)) &&
- SelectedImpacts.Contains(label.Log.Impact) &&
- label.Log.Message.Contains(LogSearch.Text, StringComparison.OrdinalIgnoreCase);
+ // Check log type
+ if (!SelectedTypes.Contains(label.Log.Type))
+ return false;
+
+ // Check players
+ if (!LogMatchesPlayerFilter(label))
+ return false;
+
+ // Check impact
+ if (!SelectedImpacts.Contains(label.Log.Impact))
+ return false;
+
+ // Check search
+ if (!label.Log.Message.Contains(LogSearch.Text, StringComparison.OrdinalIgnoreCase))
+ return false;
+
+ return true;
}
private void TypeButtonPressed(ButtonEventArgs args)
SelectAllTypesButton.OnPressed -= SelectAllTypes;
SelectNoTypesButton.OnPressed -= SelectNoTypes;
+ IncludeNonPlayersButton.OnPressed -= IncludeNonPlayers;
SelectAllPlayersButton.OnPressed -= SelectAllPlayers;
SelectNoPlayersButton.OnPressed -= SelectNoPlayers;
null,
null,
null,
+ LogsControl.SelectedPlayers.Count != 0,
LogsControl.SelectedPlayers.ToArray(),
null,
+ LogsControl.IncludeNonPlayerLogs,
null,
DateOrder.Descending);
query = query.Where(log => log.Date > filter.After);
}
- if (filter.AnyPlayers != null)
+ if (filter.IncludePlayers)
{
- query = query.Where(log => filter.AnyPlayers.Any(filterPlayer => log.Players.Contains(filterPlayer)));
+ if (filter.AnyPlayers != null)
+ {
+ query = query.Where(log =>
+ filter.AnyPlayers.Any(filterPlayer => log.Players.Contains(filterPlayer)) ||
+ log.Players.Length == 0 && filter.IncludeNonPlayers);
+ }
+
+ if (filter.AllPlayers != null)
+ {
+ query = query.Where(log =>
+ filter.AllPlayers.All(filterPlayer => log.Players.Contains(filterPlayer)) ||
+ log.Players.Length == 0 && filter.IncludeNonPlayers);
+ }
}
-
- if (filter.AllPlayers != null)
+ else
{
- query = query.Where(log => filter.AllPlayers.All(filterPlayer => log.Players.Contains(filterPlayer)));
+ query = query.Where(log => log.Players.Length == 0);
}
if (filter.LogsSent != 0)
Impacts = request.Impacts,
Before = request.Before,
After = request.After,
+ IncludePlayers = request.IncludePlayers,
AnyPlayers = request.AnyPlayers,
AllPlayers = request.AllPlayers,
+ IncludeNonPlayers = request.IncludeNonPlayers,
LastLogId = 0,
Limit = _clientBatchSize
};
public DateTime? After { get; set; }
+ public bool IncludePlayers { get; set; } = true;
+
public Guid[]? AnyPlayers { get; set; }
public Guid[]? AllPlayers { get; set; }
+ public bool IncludeNonPlayers { get; set; }
+
public int? LastLogId { get; set; }
public int LogsSent { get; set; }
query = query.Where(log => log.Date > filter.After);
}
- if (filter.AnyPlayers != null)
+ if (filter.IncludePlayers)
{
- query = query.Where(log => log.Players.Any(p => filter.AnyPlayers.Contains(p.PlayerUserId)));
- }
+ if (filter.AnyPlayers != null)
+ {
+ query = query.Where(log =>
+ log.Players.Any(p => filter.AnyPlayers.Contains(p.PlayerUserId)) ||
+ log.Players.Count == 0 && filter.IncludeNonPlayers);
+ }
- if (filter.AllPlayers != null)
+ if (filter.AllPlayers != null)
+ {
+ query = query.Where(log =>
+ log.Players.All(p => filter.AllPlayers.Contains(p.PlayerUserId)) ||
+ log.Players.Count == 0 && filter.IncludeNonPlayers);
+ }
+ }
+ else
{
- query = query.Where(log => log.Players.All(p => filter.AllPlayers.Contains(p.PlayerUserId)));
+ query = query.Where(log => log.Players.Count == 0);
}
if (filter.LastLogId != null)
HashSet<LogImpact>? impacts,
DateTime? before,
DateTime? after,
+ bool includePlayers,
Guid[]? anyPlayers,
Guid[]? allPlayers,
+ bool includeNonPlayers,
int? lastLogId,
DateOrder dateOrder)
{
Impacts = impacts;
Before = before;
After = after;
+ IncludePlayers = includePlayers;
AnyPlayers = anyPlayers is { Length: > 0 } ? anyPlayers : null;
AllPlayers = allPlayers is { Length: > 0 } ? allPlayers : null;
+ IncludeNonPlayers = includeNonPlayers;
LastLogId = lastLogId;
DateOrder = dateOrder;
}
public HashSet<LogImpact>? Impacts { get; set; }
public DateTime? Before { get; set; }
public DateTime? After { get; set; }
+ public bool IncludePlayers { get; set; }
public Guid[]? AnyPlayers { get; set; }
public Guid[]? AllPlayers { get; set; }
+ public bool IncludeNonPlayers { get; set; }
public int? LastLogId { get; set; }
public DateOrder DateOrder { get; set; }
}
# Players
admin-logs-search-players-placeholder = Search Players (OR)
admin-logs-select-none = None
+admin-logs-include-non-player = Include Non-players
# Logs
admin-logs-search-logs-placeholder = Search Logs