PlayTimeCommands.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using Content.Server.Players.PlayTimeTracking;
  2. using Content.Shared.Administration;
  3. using Content.Shared.Players.PlayTimeTracking;
  4. using Robust.Server.Player;
  5. using Robust.Shared.Console;
  6. namespace Content.Server.Administration.Commands;
  7. [AdminCommand(AdminFlags.Moderator)]
  8. public sealed class PlayTimeAddOverallCommand : IConsoleCommand
  9. {
  10. [Dependency] private readonly IPlayerManager _playerManager = default!;
  11. [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!;
  12. public string Command => "playtime_addoverall";
  13. public string Description => Loc.GetString("cmd-playtime_addoverall-desc");
  14. public string Help => Loc.GetString("cmd-playtime_addoverall-help", ("command", Command));
  15. public async void Execute(IConsoleShell shell, string argStr, string[] args)
  16. {
  17. if (args.Length != 2)
  18. {
  19. shell.WriteError(Loc.GetString("cmd-playtime_addoverall-error-args"));
  20. return;
  21. }
  22. if (!int.TryParse(args[1], out var minutes))
  23. {
  24. shell.WriteError(Loc.GetString("parse-minutes-fail", ("minutes", args[1])));
  25. return;
  26. }
  27. if (!_playerManager.TryGetSessionByUsername(args[0], out var player))
  28. {
  29. shell.WriteError(Loc.GetString("parse-session-fail", ("username", args[0])));
  30. return;
  31. }
  32. _playTimeTracking.AddTimeToOverallPlaytime(player, TimeSpan.FromMinutes(minutes));
  33. var overall = _playTimeTracking.GetOverallPlaytime(player);
  34. shell.WriteLine(Loc.GetString(
  35. "cmd-playtime_addoverall-succeed",
  36. ("username", args[0]),
  37. ("time", overall)));
  38. }
  39. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  40. {
  41. if (args.Length == 1)
  42. return CompletionResult.FromHintOptions(CompletionHelper.SessionNames(),
  43. Loc.GetString("cmd-playtime_addoverall-arg-user"));
  44. if (args.Length == 2)
  45. return CompletionResult.FromHint(Loc.GetString("cmd-playtime_addoverall-arg-minutes"));
  46. return CompletionResult.Empty;
  47. }
  48. }
  49. [AdminCommand(AdminFlags.Moderator)]
  50. public sealed class PlayTimeAddRoleCommand : IConsoleCommand
  51. {
  52. [Dependency] private readonly IPlayerManager _playerManager = default!;
  53. [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!;
  54. public string Command => "playtime_addrole";
  55. public string Description => Loc.GetString("cmd-playtime_addrole-desc");
  56. public string Help => Loc.GetString("cmd-playtime_addrole-help", ("command", Command));
  57. public async void Execute(IConsoleShell shell, string argStr, string[] args)
  58. {
  59. if (args.Length != 3)
  60. {
  61. shell.WriteError(Loc.GetString("cmd-playtime_addrole-error-args"));
  62. return;
  63. }
  64. var userName = args[0];
  65. if (!_playerManager.TryGetSessionByUsername(userName, out var player))
  66. {
  67. shell.WriteError(Loc.GetString("parse-session-fail", ("username", userName)));
  68. return;
  69. }
  70. var role = args[1];
  71. var m = args[2];
  72. if (!int.TryParse(m, out var minutes))
  73. {
  74. shell.WriteError(Loc.GetString("parse-minutes-fail", ("minutes", minutes)));
  75. return;
  76. }
  77. _playTimeTracking.AddTimeToTracker(player, role, TimeSpan.FromMinutes(minutes));
  78. var time = _playTimeTracking.GetPlayTimeForTracker(player, role);
  79. shell.WriteLine(Loc.GetString("cmd-playtime_addrole-succeed",
  80. ("username", userName),
  81. ("role", role),
  82. ("time", time)));
  83. }
  84. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  85. {
  86. if (args.Length == 1)
  87. {
  88. return CompletionResult.FromHintOptions(
  89. CompletionHelper.SessionNames(players: _playerManager),
  90. Loc.GetString("cmd-playtime_addrole-arg-user"));
  91. }
  92. if (args.Length == 2)
  93. {
  94. return CompletionResult.FromHintOptions(
  95. CompletionHelper.PrototypeIDs<PlayTimeTrackerPrototype>(),
  96. Loc.GetString("cmd-playtime_addrole-arg-role"));
  97. }
  98. if (args.Length == 3)
  99. return CompletionResult.FromHint(Loc.GetString("cmd-playtime_addrole-arg-minutes"));
  100. return CompletionResult.Empty;
  101. }
  102. }
  103. [AdminCommand(AdminFlags.Moderator)]
  104. public sealed class PlayTimeGetOverallCommand : IConsoleCommand
  105. {
  106. [Dependency] private readonly IPlayerManager _playerManager = default!;
  107. [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!;
  108. public string Command => "playtime_getoverall";
  109. public string Description => Loc.GetString("cmd-playtime_getoverall-desc");
  110. public string Help => Loc.GetString("cmd-playtime_getoverall-help", ("command", Command));
  111. public async void Execute(IConsoleShell shell, string argStr, string[] args)
  112. {
  113. if (args.Length != 1)
  114. {
  115. shell.WriteError(Loc.GetString("cmd-playtime_getoverall-error-args"));
  116. return;
  117. }
  118. var userName = args[0];
  119. if (!_playerManager.TryGetSessionByUsername(userName, out var player))
  120. {
  121. shell.WriteError(Loc.GetString("parse-session-fail", ("username", userName)));
  122. return;
  123. }
  124. var value = _playTimeTracking.GetOverallPlaytime(player);
  125. shell.WriteLine(Loc.GetString(
  126. "cmd-playtime_getoverall-success",
  127. ("username", userName),
  128. ("time", value)));
  129. }
  130. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  131. {
  132. if (args.Length == 1)
  133. {
  134. return CompletionResult.FromHintOptions(
  135. CompletionHelper.SessionNames(players: _playerManager),
  136. Loc.GetString("cmd-playtime_getoverall-arg-user"));
  137. }
  138. return CompletionResult.Empty;
  139. }
  140. }
  141. [AdminCommand(AdminFlags.Moderator)]
  142. public sealed class PlayTimeGetRoleCommand : IConsoleCommand
  143. {
  144. [Dependency] private readonly IPlayerManager _playerManager = default!;
  145. [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!;
  146. public string Command => "playtime_getrole";
  147. public string Description => Loc.GetString("cmd-playtime_getrole-desc");
  148. public string Help => Loc.GetString("cmd-playtime_getrole-help", ("command", Command));
  149. public async void Execute(IConsoleShell shell, string argStr, string[] args)
  150. {
  151. if (args.Length is not (1 or 2))
  152. {
  153. shell.WriteLine(Loc.GetString("cmd-playtime_getrole-error-args"));
  154. return;
  155. }
  156. var userName = args[0];
  157. if (!_playerManager.TryGetSessionByUsername(userName, out var session))
  158. {
  159. shell.WriteError(Loc.GetString("parse-session-fail", ("username", userName)));
  160. return;
  161. }
  162. if (args.Length == 1)
  163. {
  164. var timers = _playTimeTracking.GetTrackerTimes(session);
  165. if (timers.Count == 0)
  166. {
  167. shell.WriteLine(Loc.GetString("cmd-playtime_getrole-no"));
  168. return;
  169. }
  170. foreach (var (role, time) in timers)
  171. {
  172. shell.WriteLine(Loc.GetString("cmd-playtime_getrole-role", ("role", role), ("time", time)));
  173. }
  174. }
  175. if (args.Length >= 2)
  176. {
  177. if (args[1] == "Overall")
  178. {
  179. var timer = _playTimeTracking.GetOverallPlaytime(session);
  180. shell.WriteLine(Loc.GetString("cmd-playtime_getrole-overall", ("time", timer)));
  181. return;
  182. }
  183. var time = _playTimeTracking.GetPlayTimeForTracker(session, args[1]);
  184. shell.WriteLine(Loc.GetString("cmd-playtime_getrole-succeed", ("username", session.Name),
  185. ("time", time)));
  186. }
  187. }
  188. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  189. {
  190. if (args.Length == 1)
  191. {
  192. return CompletionResult.FromHintOptions(
  193. CompletionHelper.SessionNames(players: _playerManager),
  194. Loc.GetString("cmd-playtime_getrole-arg-user"));
  195. }
  196. if (args.Length == 2)
  197. {
  198. return CompletionResult.FromHintOptions(
  199. CompletionHelper.PrototypeIDs<PlayTimeTrackerPrototype>(),
  200. Loc.GetString("cmd-playtime_getrole-arg-role"));
  201. }
  202. return CompletionResult.Empty;
  203. }
  204. }
  205. /// <summary>
  206. /// Saves the timers for a particular player immediately
  207. /// </summary>
  208. [AdminCommand(AdminFlags.Moderator)]
  209. public sealed class PlayTimeSaveCommand : IConsoleCommand
  210. {
  211. [Dependency] private readonly IPlayerManager _playerManager = default!;
  212. [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!;
  213. public string Command => "playtime_save";
  214. public string Description => Loc.GetString("cmd-playtime_save-desc");
  215. public string Help => Loc.GetString("cmd-playtime_save-help", ("command", Command));
  216. public async void Execute(IConsoleShell shell, string argStr, string[] args)
  217. {
  218. if (args.Length != 1)
  219. {
  220. shell.WriteLine(Loc.GetString("cmd-playtime_save-error-args"));
  221. return;
  222. }
  223. var name = args[0];
  224. if (!_playerManager.TryGetSessionByUsername(name, out var pSession))
  225. {
  226. shell.WriteError(Loc.GetString("parse-session-fail", ("username", name)));
  227. return;
  228. }
  229. _playTimeTracking.SaveSession(pSession);
  230. shell.WriteLine(Loc.GetString("cmd-playtime_save-succeed", ("username", name)));
  231. }
  232. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  233. {
  234. if (args.Length == 1)
  235. {
  236. return CompletionResult.FromHintOptions(
  237. CompletionHelper.SessionNames(players: _playerManager),
  238. Loc.GetString("cmd-playtime_save-arg-user"));
  239. }
  240. return CompletionResult.Empty;
  241. }
  242. }
  243. [AdminCommand(AdminFlags.Debug)]
  244. public sealed class PlayTimeFlushCommand : IConsoleCommand
  245. {
  246. [Dependency] private readonly IPlayerManager _playerManager = default!;
  247. [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!;
  248. public string Command => "playtime_flush";
  249. public string Description => Loc.GetString("cmd-playtime_flush-desc");
  250. public string Help => Loc.GetString("cmd-playtime_flush-help", ("command", Command));
  251. public void Execute(IConsoleShell shell, string argStr, string[] args)
  252. {
  253. if (args.Length is not (0 or 1))
  254. {
  255. shell.WriteError(Loc.GetString("cmd-playtime_flush-error-args"));
  256. return;
  257. }
  258. if (args.Length == 0)
  259. {
  260. _playTimeTracking.FlushAllTrackers();
  261. return;
  262. }
  263. var name = args[0];
  264. if (!_playerManager.TryGetSessionByUsername(name, out var pSession))
  265. {
  266. shell.WriteError(Loc.GetString("parse-session-fail", ("username", name)));
  267. return;
  268. }
  269. _playTimeTracking.FlushTracker(pSession);
  270. }
  271. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  272. {
  273. if (args.Length == 1)
  274. {
  275. return CompletionResult.FromHintOptions(
  276. CompletionHelper.SessionNames(players: _playerManager),
  277. Loc.GetString("cmd-playtime_flush-arg-user"));
  278. }
  279. return CompletionResult.Empty;
  280. }
  281. }