e7b056342f
Added computer event listeners
37 lines
2.3 KiB
C#
37 lines
2.3 KiB
C#
using Discord.WebSocket;
|
|
using MinecraftDiscordBot.Commands;
|
|
using MinecraftDiscordBot.Models;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace MinecraftDiscordBot.Services;
|
|
|
|
internal class PlayerDetectorService : CommandRouter {
|
|
private readonly ITaskWaitSource _taskSource;
|
|
public PlayerDetectorService(ITaskWaitSource taskSource) => _taskSource = taskSource;
|
|
|
|
public override string HelpTextPrefix => "!pd ";
|
|
public override Task<ResponseType> FallbackHandler(SocketUserMessage message, string method, string[] parameters, CancellationToken ct)
|
|
=> throw new ReplyException($"The player detector cannot do '{method}'!");
|
|
|
|
private Task<T> Method<T>(string methodName, Func<string, T> parser, CancellationToken ct, Dictionary<string, object>? parameters = null)
|
|
=> RootCommandService.Method(_taskSource, methodName, parser, ct, parameters);
|
|
|
|
public Task<string[]> GetOnlinePlayers(CancellationToken ct) => Method("getonline", RootCommandService.Deserialize<string[]>(), ct);
|
|
public async Task<PlayerPosition> GetPlayerPosition(string username, CancellationToken ct)
|
|
=> (await FindPlayer(username, ct)) ?? throw new ReplyException($"User '{username}' is not online!");
|
|
private Task<PlayerPosition?> FindPlayer(string username, CancellationToken ct) => Method("whereis", i => JsonConvert.DeserializeObject<PlayerPosition?>(i), ct, new() {
|
|
["username"] = username
|
|
});
|
|
|
|
[CommandHandler("getonline", HelpText ="Get a list of online players.")]
|
|
public async Task<ResponseType> HandleOnlinePlayers(SocketUserMessage message, string[] parameters, CancellationToken ct)
|
|
=> ResponseType.AsString($"The following players are currently online:\n{string.Join("\n", await GetOnlinePlayers(ct))}");
|
|
[CommandHandler("whereis", HelpText = "Find a player in the world.")]
|
|
public async Task<ResponseType> HandleFindPlayers(SocketUserMessage message, string[] parameters, CancellationToken ct) {
|
|
if (parameters is not { Length: 1 }) throw new ReplyException($"Give me only one username!");
|
|
var username = parameters[0];
|
|
var player = await FindPlayer(username, ct);
|
|
if (player is null) throw new ReplyException($"{username} is currently offline!");
|
|
return ResponseType.AsString($"{username} is at coordinates {player.X} {player.Y} {player.Z} in dimension {player.Dimension}.");
|
|
}
|
|
} |