Skip to content

Commit

Permalink
Base implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
MSWS committed Feb 5, 2024
1 parent f09b52b commit 72a610c
Show file tree
Hide file tree
Showing 15 changed files with 251 additions and 30 deletions.
34 changes: 34 additions & 0 deletions lang/Jailbreak.English/Generic/GenericCommandNotifications.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using CounterStrikeSharp.API.Modules.Utils;
using Jailbreak.Formatting.Base;
using Jailbreak.Formatting.Core;
using Jailbreak.Formatting.Logistics;
using Jailbreak.Formatting.Objects;
using Jailbreak.Formatting.Views;

namespace Jailbreak.English.Generic;

public class GenericCommandNotifications : IGenericCommandNotifications, ILanguage<Formatting.Languages.English>
{
public static FormatObject PREFIX =
new HiddenFormatObject($" {ChatColors.Darkred}[{ChatColors.LightRed}JB{ChatColors.Darkred}]")
{
// Hide in panorama and center text
Plain = false,
Panorama = false,
Chat = true,
};

public IView PlayerNotFound(string query)
{
return new SimpleView(writer =>
writer
.Line(PREFIX, $"Player '{query}' not found!"));
}

public IView PlayerFoundMultiple(string query)
{
return new SimpleView(writer =>
writer
.Line(PREFIX, $"Multiple players found for '{query}'!"));
}
}
22 changes: 18 additions & 4 deletions mod/Jailbreak.Debug/DebugCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Commands;
using Jailbreak.Debug.Subcommands;
using Jailbreak.Formatting.Views;
using Jailbreak.Public.Behaviors;

namespace Jailbreak.Debug;

// css_debug [subcommand] [args] -> subcommand [args]
public class DebugCommand : IPluginBehavior
{

private readonly Dictionary<string, Executor> commands = new();
private readonly Dictionary<string, Subcommands.AbstractCommand> commands = new();

public DebugCommand()
public DebugCommand(IServiceProvider serviceProvider)
{
commands.Add("markrebel", new MarkRebel());
commands.Add("markrebel", new MarkRebel(serviceProvider));
}

[RequiresPermissions("@css/root")]
Expand All @@ -27,6 +27,20 @@ public void Command_Debug(CCSPlayerController? executor, CommandInfo info)

if (info.ArgCount == 1)
{
foreach (var command in commands)
{
info.ReplyToCommand(command.Key);
}

return;
}

if (!commands.TryGetValue(info.GetArg(1), out var subcommand))
{
info.ReplyToCommand("Invalid subcommand");
return;
}

subcommand.OnCommand(executor, new WrappedInfo(info));
}
}
2 changes: 1 addition & 1 deletion mod/Jailbreak.Debug/DebugServiceExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Jailbreak.Debug;

public static class DebugServiceExtension
{
public static void AddDebugService(this IServiceCollection services)
public static void AddJailbreakDebug(this IServiceCollection services)
{
services.AddPluginBehavior<DebugCommand>();
}
Expand Down
1 change: 1 addition & 0 deletions mod/Jailbreak.Debug/Jailbreak.Debug.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\public\Jailbreak.Formatting\Jailbreak.Formatting.csproj" />
<ProjectReference Include="..\..\public\Jailbreak.Public\Jailbreak.Public.csproj" />
</ItemGroup>

Expand Down
145 changes: 145 additions & 0 deletions mod/Jailbreak.Debug/Subcommands/AbstractCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Commands.Targeting;
using Jailbreak.Formatting.Extensions;
using Jailbreak.Formatting.Views;
using Microsoft.Extensions.DependencyInjection;

namespace Jailbreak.Debug.Subcommands;

public abstract class AbstractCommand
{
protected IServiceProvider services;
private IGenericCommandNotifications lang;

protected AbstractCommand(IServiceProvider services)
{
this.services = services;
lang = services.GetRequiredService<IGenericCommandNotifications>();
}

public abstract void OnCommand(CCSPlayerController? executor, WrappedInfo info);

protected TargetResult? GetTarget(WrappedInfo command, int argIndex = 1,
Func<CCSPlayerController, bool>? predicate = null)
{
return GetTarget(command.info, argIndex + 1, predicate);
}

protected TargetResult? GetVulnerableTarget(WrappedInfo command, int argIndex = 1,
Func<CCSPlayerController, bool>? predicate = null)
{
return GetVulnerableTarget(command.info, argIndex + 1, predicate);
}

protected TargetResult? GetTarget(CommandInfo command, int argIndex = 1,
Func<CCSPlayerController, bool>? predicate = null)
{
var matches = command.GetArgTargetResult(argIndex);

matches.Players = matches.Players.Where(player =>
player is { IsValid: true, Connected: PlayerConnectedState.PlayerConnected }).ToList();
if (predicate != null)
matches.Players = matches.Players.Where(predicate).ToList();

if (!matches.Any())
{
if (command.CallingPlayer != null)
lang.PlayerNotFound(command.GetArg(argIndex)).ToPlayerChat(command.CallingPlayer);
return null;
}

if (matches.Count() > 1 && command.GetArg(argIndex).StartsWith('@'))
return matches;

if (matches.Count() == 1 || !command.GetArg(argIndex).StartsWith('@'))
return matches;

if (command.CallingPlayer != null)
lang.PlayerFoundMultiple(command.GetArg(argIndex)).ToPlayerChat(command.CallingPlayer);
return null;
}

internal TargetResult? GetVulnerableTarget(CommandInfo command, int argIndex = 1,
Func<CCSPlayerController, bool>? predicate = null)
{
return GetTarget(command, argIndex,
(p) => command.CallingPlayer == null ||
command.CallingPlayer.CanTarget(p) && (predicate == null || predicate(p)));
}

internal TargetResult? GetSingleTarget(CommandInfo command, int argIndex = 1)
{
var matches = command.GetArgTargetResult(argIndex);

if (!matches.Any())
{
if (command.CallingPlayer != null)
lang.PlayerNotFound(command.GetArg(argIndex)).ToPlayerChat(command.CallingPlayer);
return null;
}

if (matches.Count() > 1)
{
if (command.CallingPlayer != null)
lang.PlayerFoundMultiple(command.GetArg(argIndex)).ToPlayerChat(command.CallingPlayer);
return null;
}

return matches;
}

internal string GetTargetLabel(CommandInfo info, int argIndex = 1)
{
switch (info.GetArg(argIndex))
{
case "@all":
return "all players";
case "@bots":
return "all bots";
case "@humans":
return "all humans";
case "@alive":
return "alive players";
case "@dead":
return "dead players";
case "@!me":
return "all except self";
case "@me":
return info.CallingPlayer == null ? "Console" : info.CallingPlayer.PlayerName;
case "@ct":
return "all CTs";
case "@t":
return "all Ts";
case "@spec":
return "all spectators";
default:
var player = info.GetArgTargetResult(argIndex).FirstOrDefault();
if (player != null)
return player.PlayerName;
return "unknown";
}
}


internal string GetTargetLabels(CommandInfo info, int argIndex = 1)
{
string label = GetTargetLabel(info, argIndex);
if (label.ToLower().EndsWith("s"))
return label + "'";
return label + "'s";
}
}

public static class CommandExtensions

{
internal static bool CanTarget(this CCSPlayerController controller, CCSPlayerController target)
{
if (!target.IsValid) return false;
if (target.Connected != PlayerConnectedState.PlayerConnected) return false;
if (target.IsBot || target.IsHLTV) return true;
return AdminManager.CanPlayerTarget(controller, target);
}
}
9 changes: 0 additions & 9 deletions mod/Jailbreak.Debug/Subcommands/Executor.cs

This file was deleted.

36 changes: 27 additions & 9 deletions mod/Jailbreak.Debug/Subcommands/MarkRebel.cs
Original file line number Diff line number Diff line change
@@ -1,27 +1,45 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Commands;
using Jailbreak.Formatting.Views;
using Jailbreak.Public.Mod.Rebel;
using Microsoft.Extensions.DependencyInjection;

namespace Jailbreak.Debug.Subcommands;

// css_markrebel [player] <duration>
public class MarkRebel : Executor
public class MarkRebel : AbstractCommand
{

public MarkRebel()
public MarkRebel(IServiceProvider services) : base(services)
{

}

public void HandleExecution(CCSPlayerController? executor, WrappedInfo info)
public override void OnCommand(CCSPlayerController? executor, WrappedInfo info)
{
if (executor == null)
if (info.ArgCount == 1)
{
info.ReplyToCommand("Specify target?");
return;
}

if (info.ArgCount == 1)
var target = GetVulnerableTarget(info);
if (target == null)
return;

var duration = 120;
if(info.ArgCount == 3)
{
if (!int.TryParse(info.GetArg(2), out duration))
{
info.ReplyToCommand("Invalid duration");
return;
}
}

foreach (var player in target.Players)
{
// asdf
services.GetRequiredService<IRebelService>().MarkRebel(player, duration);
}
info.ReplyToCommand($"Marked {target.Players.Count()} players as rebels for {duration} seconds");
}
}
6 changes: 3 additions & 3 deletions mod/Jailbreak.Debug/Subcommands/WrappedInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Jailbreak.Debug.Subcommands;

public class WrappedInfo
{
private readonly CommandInfo info;
public readonly CommandInfo info;

public WrappedInfo(CommandInfo info)
{
Expand All @@ -22,8 +22,8 @@ public WrappedInfo(CommandInfo info)

public string GetCommandString => info.GetCommandString[(info.GetCommandString.IndexOf(' ') + 1)..];

public string ArgByIndex(int index) => info.ArgByIndex(index - 1);
public string GetArg(int index) => info.GetArg(index - 1);
public string ArgByIndex(int index) => info.ArgByIndex(index + 1);
public string GetArg(int index) => info.GetArg(index + 1);

public void ReplyToCommand(string message, bool console = false) => info.ReplyToCommand(message, console);
}
2 changes: 1 addition & 1 deletion mod/Jailbreak.Logs/LogsServiceExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace Jailbreak.Logs;

public static class LogsServiceExtension
{
public static void AddLogsService(this IServiceCollection services)
public static void AddJailbreakLogs(this IServiceCollection services)
{
services.AddPluginBehavior<ILogService, LogsManager>();

Expand Down
2 changes: 1 addition & 1 deletion mod/Jailbreak.Rebel/RebelManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public long GetRebelTimeLeft(CCSPlayerController player)
return 0;
}

public bool MarkRebel(CCSPlayerController player, long time)
public bool MarkRebel(CCSPlayerController player, long time = 120)
{
if (!rebelTimes.ContainsKey(player))
{
Expand Down
4 changes: 4 additions & 0 deletions public/Jailbreak.Formatting/Logistics/LanguageConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ public LanguageConfig(IServiceCollection collection)
_collection = collection;
}

public void WithGenericCommand<TGenericCommand>()
where TGenericCommand : class, ILanguage<TDialect>, IGenericCommandNotifications
=> _collection.AddSingleton<IGenericCommandNotifications, TGenericCommand>();

public void WithRatio<TRatio>()
where TRatio : class, ILanguage<TDialect>, IRatioNotifications
=> _collection.AddSingleton<IRatioNotifications, TRatio>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Jailbreak.Formatting.Base;

namespace Jailbreak.Formatting.Views;

public interface IGenericCommandNotifications
{
public IView PlayerNotFound(string query);
public IView PlayerFoundMultiple(string query);
}
2 changes: 1 addition & 1 deletion public/Jailbreak.Public/Mod/Rebel/IRebelService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ bool IsRebel(CCSPlayerController player)

long GetRebelTimeLeft(CCSPlayerController player);

bool MarkRebel(CCSPlayerController player, long time);
bool MarkRebel(CCSPlayerController player, long time = 120);

void UnmarkRebel(CCSPlayerController player);
}
1 change: 1 addition & 0 deletions src/Jailbreak/Jailbreak.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

<ItemGroup>
<ProjectReference Include="..\..\lang\Jailbreak.English\Jailbreak.English.csproj" />
<ProjectReference Include="..\..\mod\Jailbreak.Debug\Jailbreak.Debug.csproj" />
<ProjectReference Include="..\..\mod\Jailbreak.Teams\Jailbreak.Teams.csproj" />
<ProjectReference Include="..\..\mod\Jailbreak.Warden\Jailbreak.Warden.csproj" />
<ProjectReference Include="..\..\mod\Jailbreak.Rebel\Jailbreak.Rebel.csproj" />
Expand Down
Loading

0 comments on commit 72a610c

Please sign in to comment.