forked from EllieBotDevs/elliebot
114 lines
4.2 KiB
C#
114 lines
4.2 KiB
C#
|
#nullable disable
|
|||
|
using EllieBot.Modules.Games.Common.Nunchi;
|
|||
|
using EllieBot.Modules.Games.Services;
|
|||
|
|
|||
|
namespace EllieBot.Modules.Games;
|
|||
|
|
|||
|
public partial class Games
|
|||
|
{
|
|||
|
[Group]
|
|||
|
public partial class NunchiCommands : EllieModule<GamesService>
|
|||
|
{
|
|||
|
private readonly DiscordSocketClient _client;
|
|||
|
|
|||
|
public NunchiCommands(DiscordSocketClient client)
|
|||
|
=> _client = client;
|
|||
|
|
|||
|
[Cmd]
|
|||
|
[RequireContext(ContextType.Guild)]
|
|||
|
public async Task Nunchi()
|
|||
|
{
|
|||
|
var newNunchi = new NunchiGame(ctx.User.Id, ctx.User.ToString());
|
|||
|
NunchiGame nunchi;
|
|||
|
|
|||
|
//if a game was already active
|
|||
|
if ((nunchi = _service.NunchiGames.GetOrAdd(ctx.Guild.Id, newNunchi)) != newNunchi)
|
|||
|
{
|
|||
|
// join it
|
|||
|
// if you failed joining, that means game is running or just ended
|
|||
|
if (!await nunchi.Join(ctx.User.Id, ctx.User.ToString()))
|
|||
|
return;
|
|||
|
|
|||
|
await Response().Error(strs.nunchi_joined(nunchi.ParticipantCount)).SendAsync();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
try { await Response().Confirm(strs.nunchi_created).SendAsync(); }
|
|||
|
catch { }
|
|||
|
|
|||
|
nunchi.OnGameEnded += NunchiOnGameEnded;
|
|||
|
//nunchi.OnGameStarted += Nunchi_OnGameStarted;
|
|||
|
nunchi.OnRoundEnded += Nunchi_OnRoundEnded;
|
|||
|
nunchi.OnUserGuessed += Nunchi_OnUserGuessed;
|
|||
|
nunchi.OnRoundStarted += Nunchi_OnRoundStarted;
|
|||
|
_client.MessageReceived += ClientMessageReceived;
|
|||
|
|
|||
|
var success = await nunchi.Initialize();
|
|||
|
if (!success)
|
|||
|
{
|
|||
|
if (_service.NunchiGames.TryRemove(ctx.Guild.Id, out var game))
|
|||
|
game.Dispose();
|
|||
|
await Response().Confirm(strs.nunchi_failed_to_start).SendAsync();
|
|||
|
}
|
|||
|
|
|||
|
Task ClientMessageReceived(SocketMessage arg)
|
|||
|
{
|
|||
|
_ = Task.Run(async () =>
|
|||
|
{
|
|||
|
if (arg.Channel.Id != ctx.Channel.Id)
|
|||
|
return;
|
|||
|
|
|||
|
if (!int.TryParse(arg.Content, out var number))
|
|||
|
return;
|
|||
|
try
|
|||
|
{
|
|||
|
await nunchi.Input(arg.Author.Id, arg.Author.ToString(), number);
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
}
|
|||
|
});
|
|||
|
return Task.CompletedTask;
|
|||
|
}
|
|||
|
|
|||
|
Task NunchiOnGameEnded(NunchiGame arg1, string arg2)
|
|||
|
{
|
|||
|
if (_service.NunchiGames.TryRemove(ctx.Guild.Id, out var game))
|
|||
|
{
|
|||
|
_client.MessageReceived -= ClientMessageReceived;
|
|||
|
game.Dispose();
|
|||
|
}
|
|||
|
|
|||
|
if (arg2 is null)
|
|||
|
return Response().Confirm(strs.nunchi_ended_no_winner).SendAsync();
|
|||
|
return Response().Confirm(strs.nunchi_ended(Format.Bold(arg2))).SendAsync();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private Task Nunchi_OnRoundStarted(NunchiGame arg, int cur)
|
|||
|
=> Response()
|
|||
|
.Confirm(strs.nunchi_round_started(Format.Bold(arg.ParticipantCount.ToString()),
|
|||
|
Format.Bold(cur.ToString())))
|
|||
|
.SendAsync();
|
|||
|
|
|||
|
private Task Nunchi_OnUserGuessed(NunchiGame arg)
|
|||
|
=> Response().Confirm(strs.nunchi_next_number(Format.Bold(arg.CurrentNumber.ToString()))).SendAsync();
|
|||
|
|
|||
|
private Task Nunchi_OnRoundEnded(NunchiGame arg1, (ulong Id, string Name)? arg2)
|
|||
|
{
|
|||
|
if (arg2.HasValue)
|
|||
|
return Response().Confirm(strs.nunchi_round_ended(Format.Bold(arg2.Value.Name))).SendAsync();
|
|||
|
return Response()
|
|||
|
.Confirm(strs.nunchi_round_ended_boot(
|
|||
|
Format.Bold("\n"
|
|||
|
+ string.Join("\n, ",
|
|||
|
arg1.Participants.Select(x
|
|||
|
=> x.Name)))))
|
|||
|
.SendAsync(); // this won't work if there are too many users
|
|||
|
}
|
|||
|
|
|||
|
private Task Nunchi_OnGameStarted(NunchiGame arg)
|
|||
|
=> Response().Confirm(strs.nunchi_started(Format.Bold(arg.ParticipantCount.ToString()))).SendAsync();
|
|||
|
}
|
|||
|
}
|