|
@@ -2,12 +2,11 @@ using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
-using MafiaTelegramBot.Commands;
|
|
|
+using System.Timers;
|
|
|
using MafiaTelegramBot.Controllers;
|
|
|
using MafiaTelegramBot.CustomCollections.Extensions;
|
|
|
using MafiaTelegramBot.DataBase.EntityDao;
|
|
|
using MafiaTelegramBot.Game.GameRoles;
|
|
|
-using MafiaTelegramBot.Models;
|
|
|
using MafiaTelegramBot.Resources;
|
|
|
using Timer = System.Timers.Timer;
|
|
|
|
|
@@ -17,14 +16,16 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
{
|
|
|
public void Start()
|
|
|
{
|
|
|
- new Task(async () =>
|
|
|
+ async void Action()
|
|
|
{
|
|
|
IsRunning = true;
|
|
|
await FirstNight();
|
|
|
await FirstDay();
|
|
|
await GameCycle();
|
|
|
await EndOfGame();
|
|
|
- }).Start();
|
|
|
+ }
|
|
|
+
|
|
|
+ new Task(Action).Start();
|
|
|
}
|
|
|
|
|
|
private async Task FirstDay()
|
|
@@ -40,8 +41,8 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
{
|
|
|
var player = _turnOrder.Dequeue();
|
|
|
if (!player.IsPlaying) continue;
|
|
|
- await PlayersMessageChannel.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
|
|
|
- if (TimerEnabled) await Bot.SendWithMarkdown2(player.ChatId, strings.you_turn_say);
|
|
|
+ await PlayersMessageChannel.Send($"{strings.now_turn} ({player.TurnOrder}) {player.Info.NickName}");
|
|
|
+ if (TimerEnabled) await MessageController.SendText(player.Info, strings.you_turn_say);
|
|
|
await player.CurrentRole.SpeakAction(Constants.DAY_SPEAK_INTERVAL);
|
|
|
if (firstPlayer != null && player.IsPlaying) _turnOrder.Enqueue(player);
|
|
|
else firstPlayer = player;
|
|
@@ -68,10 +69,10 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
var don = Players.Values.FirstOrDefault(player => player.GetRole() is Roles.Don);
|
|
|
var dame = Players.Values.FirstOrDefault(player => player.GetRole() is Roles.Dame);
|
|
|
var message = strings.your_teammates;
|
|
|
- if (don != null) message += $"\n({don.TurnOrder}) {don.NickName} - {roles.Don}";
|
|
|
- if (dame != null) message += $"\n({dame.TurnOrder}) {dame.NickName} - {roles.Dame}";
|
|
|
+ if (don != null) message += $"\n({don.TurnOrder}) {don.Info.NickName} - {roles.Don}";
|
|
|
+ if (dame != null) message += $"\n({dame.TurnOrder}) {dame.Info.NickName} - {roles.Dame}";
|
|
|
message = mafia.Aggregate(message,
|
|
|
- (current, player) => current + $"\n({player.TurnOrder}) {player.NickName}");
|
|
|
+ (current, player) => current + $"\n({player.TurnOrder}) {player.Info.NickName}");
|
|
|
await MafiaMessageChannel.Send(message);
|
|
|
var resetEvent = new ManualResetEvent(false);
|
|
|
var timer = new Timer
|
|
@@ -85,11 +86,11 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
foreach (var player in Players.Values)
|
|
|
{
|
|
|
if (player.GetRole() is not (Roles.Don or Roles.Mafia or Roles.Dame))
|
|
|
- player.CurrentRole.KnownRoles.Add(player.Id, player.GetRoleName());
|
|
|
+ player.CurrentRole.KnownRoles.Add(player.Info.Id, player.GetRoleName());
|
|
|
else
|
|
|
foreach (var p in Players.Values
|
|
|
.Where(p => p.GetRole() is Roles.Don or Roles.Mafia or Roles.Dame))
|
|
|
- player.CurrentRole.KnownRoles.Add(p.Id, p.GetRoleName());
|
|
|
+ player.CurrentRole.KnownRoles.Add(p.Info.Id, p.GetRoleName());
|
|
|
}
|
|
|
|
|
|
resetEvent.WaitOne();
|
|
@@ -127,12 +128,15 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
var discussionTimer = new Timer { AutoReset = false, Interval = Constants.DISCUSSION_INTERVAL };
|
|
|
var discussionEnded = new ManualResetEvent(false);
|
|
|
foreach (var player in Players.Values.Where(player => !player.IsBlocked)) player.IsSpeaker = true;
|
|
|
- discussionTimer.Elapsed += async (_, _) =>
|
|
|
+
|
|
|
+ async void OnDiscussionTimerOnElapsed(object o, ElapsedEventArgs elapsedEventArgs)
|
|
|
{
|
|
|
foreach (var player in Players.Values) player.IsSpeaker = false;
|
|
|
await PlayersMessageChannel.Send(strings.day_discussion_ended);
|
|
|
discussionEnded.Set();
|
|
|
- };
|
|
|
+ }
|
|
|
+
|
|
|
+ discussionTimer.Elapsed += OnDiscussionTimerOnElapsed;
|
|
|
await PlayersMessageChannel.Send(strings.disscution_time);
|
|
|
discussionTimer.Start();
|
|
|
discussionEnded.WaitOne();
|
|
@@ -141,16 +145,16 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
for (var i = 0; i < turnsCount; ++i)
|
|
|
{
|
|
|
var player = _turnOrder.Dequeue();
|
|
|
- if (!Players.ContainsKey(player.Id)) continue;
|
|
|
+ if (!Players.ContainsKey(player.Info.Id)) continue;
|
|
|
if (!player.IsBlocked && player.IsAlive)
|
|
|
{
|
|
|
- await PlayersMessageChannel.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
|
|
|
+ await PlayersMessageChannel.Send($"{strings.now_turn} ({player.TurnOrder}) {player.Info.NickName}");
|
|
|
if (Owner != null)
|
|
|
{
|
|
|
- if (TimerEnabled) await Bot.SendWithMarkdown2(player.ChatId, strings.you_turn_say);
|
|
|
+ if (TimerEnabled) await MessageController.SendText(player.Info, strings.you_turn_say);
|
|
|
await player.CurrentRole.SpeakAction(Constants.DAY_SPEAK_INTERVAL);
|
|
|
}
|
|
|
- if (Players.ContainsKey(player.Id)) await player.CurrentRole.VotingAction(VoteUpList.Count == 0);
|
|
|
+ if (Players.ContainsKey(player.Info.Id)) await player.CurrentRole.VotingAction(VoteUpList.Count == 0);
|
|
|
}
|
|
|
_turnOrder.Enqueue(player);
|
|
|
}
|
|
@@ -169,10 +173,10 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
foreach (var player in Players.Values)
|
|
|
await player.CurrentRole.NightAction();
|
|
|
timer.Elapsed += (_, _) => resetEvent.Set();
|
|
|
- var doctorId = PlayersRole[Roles.Doctor].Count == 1 ? PlayersRole[Roles.Doctor][0].Id : -1;
|
|
|
+ var doctorId = PlayersRole[Roles.Doctor].Count == 1 ? PlayersRole[Roles.Doctor][0].Info.Id : -1;
|
|
|
foreach (var player in Players.Values)
|
|
|
{
|
|
|
- if (doctorId != player.Id) player.CanBeHealed = true;
|
|
|
+ if (doctorId != player.Info.Id) player.CanBeHealed = true;
|
|
|
player.CanBeBlockedNight = true;
|
|
|
player.CanBeBlockedDay = true;
|
|
|
player.IsBlocked = false;
|
|
@@ -187,7 +191,7 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
{
|
|
|
await Task.Run(async () =>
|
|
|
{
|
|
|
- var beforeKill = Players.Values.ToDictionary(p => p.Id, p => p.IsAlive);
|
|
|
+ var beforeKill = Players.Values.ToDictionary(p => p.Info.Id, p => p.IsAlive);
|
|
|
var mafiaNotAgree = "";
|
|
|
var votes = Players.Values.Where(p =>
|
|
|
p.IsAlive && p.CurrentRole.MafiaTargetId != -1 && p.CurrentRole.MafiaTargetId != -2 &&
|
|
@@ -228,7 +232,7 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
else if (players.Count == 1) await players[0].CurrentRole.ApplyNightActionResult();
|
|
|
}
|
|
|
|
|
|
- var afterKill = Players.Values.ToDictionary(p => p.Id, p => p.IsAlive);
|
|
|
+ var afterKill = Players.Values.ToDictionary(p => p.Info.Id, p => p.IsAlive);
|
|
|
var message = strings.city_wakes_up;
|
|
|
if (afterKill.IsEquals(beforeKill)) message += strings.everyone_survived;
|
|
|
else
|
|
@@ -236,13 +240,13 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
if (beforeKill[id] != alive && Players.ContainsKey(id))
|
|
|
{
|
|
|
message += alive
|
|
|
- ? $"\n{Players[id].NickName} {strings.will_be_ressurected}"
|
|
|
- : $"\n{Players[id].NickName} {strings.will_be_killed}";
|
|
|
+ ? $"\n{Players[id].Info.NickName} {strings.will_be_ressurected}"
|
|
|
+ : $"\n{Players[id].Info.NickName} {strings.will_be_killed}";
|
|
|
if (!alive && Players[id].GetRole() is Roles.Don or Roles.Dame or Roles.Mafia
|
|
|
&& PlayersRole.ContainsKey(Roles.Werewolf) &&
|
|
|
PlayersRole[Roles.Werewolf].Count == 1)
|
|
|
await ((WerewolfRole)PlayersRole[Roles.Werewolf][0].CurrentRole).TransformToMafia();
|
|
|
- await PlayersMessageChannel.SendTo(id,
|
|
|
+ await PlayersMessageChannel.SendTo(Players[id].Info,
|
|
|
alive ? strings.you_will_be_ressurected : strings.you_will_be_killed);
|
|
|
}
|
|
|
|
|
@@ -258,21 +262,23 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
{
|
|
|
var contendersCopy = contenders.ToList();
|
|
|
foreach (var contender in contendersCopy.Where(p => !p.IsBlocked))
|
|
|
- if (Players.ContainsKey(contender.Id))
|
|
|
+ if (Players.ContainsKey(contender.Info.Id))
|
|
|
await contender.CurrentRole.DefenceAction();
|
|
|
var votersPlayers = Players.Values.Where(p => p.IsAlive && !p.IsBlocked).ToArray();
|
|
|
foreach (var voter in votersPlayers)
|
|
|
- await voter.CurrentRole.VotingAction(contendersCopy.Where(p => Players.ContainsKey(p.Id)).ToList());
|
|
|
+ await voter.CurrentRole.VotingAction(contendersCopy.Where(p => Players.ContainsKey(p.Info.Id)).ToList());
|
|
|
var timer = new Timer { Interval = Constants.VOTE_KILL_INTERVAL, AutoReset = false };
|
|
|
var resetEvent = new ManualResetEvent(false);
|
|
|
- timer.Elapsed += async (_, _) =>
|
|
|
+
|
|
|
+ async void OnTimerOnElapsed(object o, ElapsedEventArgs elapsedEventArgs)
|
|
|
{
|
|
|
if (Constants.ENABLE_AUTO_VOTING)
|
|
|
- foreach (var voter in votersPlayers.Where(p =>
|
|
|
- !_voteKillList.ContainsKey(p.Id) && Players.ContainsKey(p.Id)))
|
|
|
+ foreach (var voter in votersPlayers.Where(p => !_voteKillList.ContainsKey(p.Info.Id) && Players.ContainsKey(p.Info.Id)))
|
|
|
await voter.CurrentRole.RandomVoting();
|
|
|
resetEvent.Set();
|
|
|
- };
|
|
|
+ }
|
|
|
+
|
|
|
+ timer.Elapsed += OnTimerOnElapsed;
|
|
|
timer.Start();
|
|
|
resetEvent.WaitOne();
|
|
|
});
|
|
@@ -345,16 +351,16 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
foreach (var (playerId, targetId) in _voteKillList)
|
|
|
{
|
|
|
message += Players.ContainsKey(playerId) && Players.ContainsKey(targetId)
|
|
|
- ? $"\n({Players[playerId].TurnOrder}) {Players[playerId].NickName} {strings.vote_to} " +
|
|
|
- $"({Players[targetId].TurnOrder}) {Players[targetId].NickName}"
|
|
|
+ ? $"\n({Players[playerId].TurnOrder}) {Players[playerId].Info.NickName} {strings.vote_to} " +
|
|
|
+ $"({Players[targetId].TurnOrder}) {Players[targetId].Info.NickName}"
|
|
|
: "";
|
|
|
}
|
|
|
|
|
|
if (message == strings.results_of_voting) message = strings.no_one_voted;
|
|
|
await PlayersMessageChannel.Send(message);
|
|
|
|
|
|
- var votes = VoteUpList.Where(p => Players.ContainsKey(p.Id))
|
|
|
- .GroupBy(p => p.Id)
|
|
|
+ var votes = VoteUpList.Where(p => Players.ContainsKey(p.Info.Id))
|
|
|
+ .GroupBy(p => p.Info.Id)
|
|
|
.Select(item => new { id = item.Key, count = item.Count() })
|
|
|
.ToList();
|
|
|
List<Player> result = new();
|
|
@@ -374,9 +380,9 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
if (targetId == 0)
|
|
|
{
|
|
|
if (!toKill)
|
|
|
- await PlayersMessageChannel.SendExcept(playerId,
|
|
|
- $"{Players[playerId].NickName} {strings.skip_vote}");
|
|
|
- await PlayersMessageChannel.EditTo(playerId, messageId, strings.you_skip_vote);
|
|
|
+ await PlayersMessageChannel.SendExcept(Players[playerId].Info,
|
|
|
+ $"{Players[playerId].Info.NickName} {strings.skip_vote}");
|
|
|
+ await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId, strings.you_skip_vote);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -388,16 +394,16 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
{
|
|
|
if (playerId != targetId)
|
|
|
{
|
|
|
- await PlayersMessageChannel.SendExcept(playerId,
|
|
|
- $"{Players[playerId].NickName} {strings.put_up_vote_to} {Players[targetId].NickName}");
|
|
|
- await PlayersMessageChannel.EditTo(playerId, messageId,
|
|
|
- $"{strings.you_vote_player} {Players[targetId].NickName}");
|
|
|
+ await PlayersMessageChannel.SendExcept(Players[playerId].Info,
|
|
|
+ $"{Players[playerId].Info.NickName} {strings.put_up_vote_to} {Players[targetId].Info.NickName}");
|
|
|
+ await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
|
|
|
+ $"{strings.you_vote_player} {Players[targetId].Info.NickName}");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- await PlayersMessageChannel.SendExcept(playerId,
|
|
|
- $"{Players[playerId].NickName} {strings.vote_to_self}");
|
|
|
- await PlayersMessageChannel.EditTo(playerId, messageId, strings.you_vote_to_self);
|
|
|
+ await PlayersMessageChannel.SendExcept(Players[playerId].Info,
|
|
|
+ $"{Players[playerId].Info.NickName} {strings.vote_to_self}");
|
|
|
+ await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId, strings.you_vote_to_self);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -407,17 +413,17 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
if (messageId != -1)
|
|
|
{
|
|
|
if (playerId != targetId)
|
|
|
- await PlayersMessageChannel.EditTo(playerId, messageId,
|
|
|
- $"{strings.you_vote_to_kill} {Players[targetId].NickName}");
|
|
|
+ await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
|
|
|
+ $"{strings.you_vote_to_kill} {Players[targetId].Info.NickName}");
|
|
|
else
|
|
|
- await PlayersMessageChannel.EditTo(playerId, messageId,
|
|
|
+ await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
|
|
|
strings.you_vote_to_kill_self);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- else await PlayersMessageChannel.SendTo(playerId, strings.this_player_left_from_game);
|
|
|
+ else await PlayersMessageChannel.SendTo(Players[playerId].Info, strings.this_player_left_from_game);
|
|
|
}
|
|
|
|
|
|
private async Task EndOfGame()
|
|
@@ -436,12 +442,12 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
await PlayersMessageChannel.Send(strings.thanks_for_game, Keyboard.PlayerGameMenu);
|
|
|
await r.RunContinueVote();
|
|
|
}
|
|
|
- else if (!Players.ContainsKey(Owner.Id))
|
|
|
+ else if (!Players.ContainsKey(Owner.Info.Id))
|
|
|
await RoomController.DissolveRoom(RoomEncrypter.GetCode(RoomName));
|
|
|
else
|
|
|
{
|
|
|
- await PlayersMessageChannel.SendTo(Owner.ChatId, strings.thanks_for_game, Keyboard.OwnerGameMenu);
|
|
|
- await PlayersMessageChannel.SendExcept(Owner.Id, strings.thanks_for_game, Keyboard.PlayerGameMenu);
|
|
|
+ await PlayersMessageChannel.SendTo(Owner.Info, strings.thanks_for_game, Keyboard.OwnerGameMenu);
|
|
|
+ await PlayersMessageChannel.SendExcept(Owner.Info, strings.thanks_for_game, Keyboard.PlayerGameMenu);
|
|
|
if (Players.Count <= Constants.MEMORY_CLEANER_PLAYERS_COUNT) StartTimer();
|
|
|
}
|
|
|
await UserDao.DataBase.SaveChangesAsync();
|
|
@@ -452,7 +458,7 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
{
|
|
|
foreach (var player in Players.Values)
|
|
|
{
|
|
|
- await Bot.SendWithMarkdown2(player.ChatId, strings.game_ended_with_draw);
|
|
|
+ await MessageController.SendText(player.Info, strings.game_ended_with_draw);
|
|
|
player.Statistics[Roles.All].Games--;
|
|
|
player.Statistics[player.GetRole()].Games--;
|
|
|
player.ResetState();
|
|
@@ -486,19 +492,19 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
|
|
|
var villagerTeam = Players.Values
|
|
|
.Where(p => p.CurrentRole.ColorRole == 1 && p.GetRole() != Roles.Lawyer)
|
|
|
- .Select(p => p.Id).ToList();
|
|
|
+ .Select(p => p.Info.Id).ToList();
|
|
|
var mafiaTeam = Players.Values
|
|
|
.Where(p => p.CurrentRole.ColorRole == 2 || p.GetRole() == Roles.Lawyer)
|
|
|
- .Select(p => p.Id).ToList();
|
|
|
+ .Select(p => p.Info.Id).ToList();
|
|
|
|
|
|
foreach (var player in Players.Values)
|
|
|
{
|
|
|
- rolesMessage += $"\n({player.TurnOrder}) {player.NickName} - {player.GetRoleName()}";
|
|
|
+ rolesMessage += $"\n({player.TurnOrder}) {player.Info.NickName} - {player.GetRoleName()}";
|
|
|
if (IsRanking) await SumRankingPoints(player, mafiaWins);
|
|
|
if (mafiaWins)
|
|
|
{
|
|
|
- await Bot.SendWithMarkdown2(player.ChatId, strings.mafia_won + additionalResult);
|
|
|
- await Bot.SendStickerAsync(player.ChatId, Stickers.Sticker["MafiaWins"]);
|
|
|
+ await MessageController.SendText(player.Info, strings.mafia_won + additionalResult);
|
|
|
+ await MessageController.SendSticker(player.Info, Stickers.Sticker["MafiaWins"]);
|
|
|
if (player.CurrentRole.ColorRole == 2 || player.CurrentRole.RoleKey == Roles.Lawyer)
|
|
|
{
|
|
|
player.Statistics[Roles.All].Wins++;
|
|
@@ -517,8 +523,8 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- await Bot.SendWithMarkdown2(player.ChatId, strings.villagers_won + additionalResult);
|
|
|
- await Bot.SendStickerAsync(player.ChatId, Stickers.Sticker["VillagerWins"]);
|
|
|
+ await MessageController.SendText(player.Info, strings.villagers_won + additionalResult);
|
|
|
+ await MessageController.SendSticker(player.Info, Stickers.Sticker["VillagerWins"]);
|
|
|
if (player.CurrentRole.ColorRole == 1 && player.GetRole() != Roles.Lawyer)
|
|
|
{
|
|
|
player.Statistics[Roles.All].Wins++;
|