1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- using MafiaTelegramBot.Game.GameRoles;
- using MafiaTelegramBot.Models;
- using MafiaTelegramBot.Resources;
- using Telegram.Bot.Types;
- using Timer = System.Timers.Timer;
- namespace MafiaTelegramBot.Game.GameRooms
- {
- public partial class GameRoom
- {
- public abstract class Role
- {
- protected readonly GameRoom Room;
- protected readonly Player Player;
- public readonly List<Player> KnownRoles = new();
- protected long NightTargetId = -1;
- public readonly ManualResetEvent DayActionComplete = new(false);
- protected int MessageId = -1;
- public abstract Task NightAction();
- public abstract Task ApplyNightActionResult();
- public abstract Task<Message> SetNightTarget(long userId);
- public abstract Roles RoleKey { get; }
- protected Role(GameRoom room, Player player)
- {
- Room = room;
- Player = player;
- }
- public async Task DayAction()
- {
- await Room.PlayersCh.SendExcept(Player.Id, $"{strings.now_turn} {Player.NickName}");
- await Bot.SendWithMarkdown2(Player.ChatId, strings.your_turn);
- Player.IsSpeaker = true;
- var timer = new Timer(60 * 1000);
- var voteTimer = new Timer(10 * 1000);
- Message message = null;
- timer.Elapsed += async (_, _) =>
- {
- Player.IsSpeaker = false;
- await Bot.SendWithMarkdown2(Player.ChatId, strings.your_turn_ended);
- if (!Room.IsFirstCycle)
- {
- var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).ToList();
- message = await Bot.SendWithMarkdown2(Player.ChatId, strings.put_up_vote, Keyboards.VoteKeyboard(alivePlayers, Player.Id, !Player.IsFirst));
- voteTimer.Elapsed += async (_, _) =>
- {
- await Bot.Get().EditMessageReplyMarkupAsync(Player.ChatId, message.MessageId);
- if (Player.IsFirst)
- await Room.PutUpVote(Player.Id, Player.Id);
- else
- await Room.PlayersCh.SendExcept(Player.Id, $"{Player.NickName} {strings.didnt_put_anyone}");
- DayActionComplete.Set();
- };
- await Bot.SendWithMarkdown2(Player.Id, strings.you_have_one_minute);
- if(Player.IsFirst) await Bot.SendWithMarkdown2(Player.Id, strings.user_not_choose);
- voteTimer.Start();
- }
- if(!voteTimer.Enabled) DayActionComplete.Set();
- };
- timer.AutoReset = false;
- timer.Start();
- DayActionComplete.WaitOne();
- DayActionComplete.Reset();
- timer.Stop();
- voteTimer.Stop();
- if(message!=null) await Bot.Get().DeleteMessageAsync(Player.ChatId, message.MessageId);
- }
- public static Role GetNewRoleInstance(Roles roleKey, GameRoom room, Player player)
- {
- return roleKey switch
- {
- Roles.All => new NoneRole(),
- Roles.Doctor => new DoctorRole(room, player),
- Roles.Mafia => new MafiaRole(room, player),
- Roles.Don => new DonRole(room, player),
- Roles.Cop => new CopRole(room, player),
- Roles.Villager => new VillagerRole(room, player),
- Roles.Hooker => new HookerRole(room, player),
- Roles.None => new NoneRole(room, player),
- _ => throw new ArgumentOutOfRangeException(nameof(roleKey), roleKey, null)
- };
- }
- }
- }
- }
|