GameRoom.MessageHandler.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using MafiaTelegramBot.Commands;
  5. using MafiaTelegramBot.Controllers;
  6. using MafiaTelegramBot.Game.GameRoles;
  7. using MafiaTelegramBot.Models;
  8. using MafiaTelegramBot.Resources;
  9. using Telegram.Bot.Types;
  10. namespace MafiaTelegramBot.Game.GameRooms
  11. {
  12. public partial class GameRoom
  13. {
  14. public class MessageHandler
  15. {
  16. private readonly List<long> _exitingPlayers = new();
  17. private readonly GameRoom _room;
  18. public MessageHandler(GameRoom room)
  19. {
  20. _room = room;
  21. }
  22. public async Task<Message> Handle(Update update)
  23. {
  24. var text = update.Message.Text;
  25. var userId = update.Message.From.Id;
  26. if (!_room.Players.ContainsKey(userId)) return new Message();
  27. if(_exitingPlayers.Contains(userId)) await Leave(_room.Players[userId], update.Message.Text);
  28. else if (text == keyboard.look_players_list) await LookPlayers(_room.Players[userId]);
  29. else if (text == keyboard.leave) await Leave(_room.Players[userId]);
  30. else if (text == keyboard.end_turn)
  31. {
  32. if (_room.IsDay && _room.Players[userId].IsSpeaker) _room.Players[userId].CurrentRole.TalkingActionComplete.Set();
  33. else await _room.PlayersMessageChannel.SendTo(userId, strings.now_is_not_your_turn);
  34. }
  35. else await ForwardMessage(_room.Players[userId], text);
  36. return update.Message;
  37. }
  38. private async Task ForwardMessage(Player player, string message)
  39. {
  40. if(!_room.IsRunning) await _room.PlayersMessageChannel.SendExcept(player.Id, $"{player.NickName}: {message}");
  41. else
  42. {
  43. if (!player.IsAlive) await _room.PlayersMessageChannel.SendTo(player.Id, strings.you_now_died);
  44. else if (player.IsBlocked) await _room.PlayersMessageChannel.SendTo(player.Id, strings.you_blocked);
  45. else if (!player.IsSpeaker) await _room.PlayersMessageChannel.SendTo(player.Id, strings.now_you_cant_speak);
  46. else if (_room.IsDay) await _room.PlayersMessageChannel.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
  47. else
  48. {
  49. if (player.CurrentRole.ColorRole == 2)
  50. await _room.MafiaMessageChannel.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
  51. if (player.GetRole() is Roles.Parasite)
  52. {
  53. var parasiteRole = player.CurrentRole as ParasiteRole;
  54. await _room.PlayersMessageChannel.SendTo(parasiteRole!.ParentId, $"({player.TurnOrder}) {player.NickName}: {message}");
  55. }
  56. else if (_room.PlayersRole.ContainsKey(Roles.Parasite)
  57. && _room.PlayersRole[Roles.Parasite].Count == 1
  58. && ((ParasiteRole)_room.PlayersRole[Roles.Parasite][0].CurrentRole).ParentId == player.Id)
  59. {
  60. await _room.PlayersMessageChannel.SendTo(_room.PlayersRole[Roles.Parasite][0].Id, $"({player.TurnOrder}) {player.NickName}: {message}");
  61. }
  62. }
  63. }
  64. }
  65. private async Task LookPlayers(Player player)
  66. {
  67. var players = _room.Players.Values.ToArray();
  68. var nextPlayer = _room._turnOrder.Peek();
  69. var knownRoles = player.CurrentRole.KnownRoles;
  70. var message = strings.players_list;
  71. var stopIndex = -1;
  72. for (var i = 0; i != stopIndex; i = (i+1) % players.Length)
  73. {
  74. i %= players.Length;
  75. if (stopIndex == -1 && players[i].Id == nextPlayer.Id) stopIndex = i;
  76. if (stopIndex == -1) continue;
  77. var role = knownRoles.ContainsKey(players[i].Id)
  78. ? knownRoles[players[i].Id]
  79. : "";
  80. message +=
  81. $"\n{(message == strings.players_list ? strings.next + " - " : "")}" +
  82. $"({players[i].TurnOrder}) " +
  83. $"{(players[i].Id == player.Id ? strings.you : players[i].NickName)} " +
  84. $"({(players[i].IsAlive ? strings.alive : strings.died)}) " +
  85. $"{role}";
  86. }
  87. await _room.PlayersMessageChannel.SendTo(player.Id, message);
  88. }
  89. private async Task Leave(Player player, string text = "")
  90. {
  91. var roomName = player.GetRoomName();
  92. if (_room.IsRunning)
  93. {
  94. if (_exitingPlayers.Remove(player.Id))
  95. {
  96. if (text == strings.exit)
  97. {
  98. var resultCode = await RoomController.LeaveFromGame(player);
  99. if (resultCode == ResultCode.CodeOk)
  100. await Bot.SendWithMarkdown2(player.ChatId, $"{strings.you_leave_from_game} _*{roomName}*_",
  101. player.IsAdmin ? Keyboard.AdminMainMenu : Keyboard.MainMenu);
  102. else await Utilities.GetResultCodeMessage(resultCode, player.ChatId);
  103. }
  104. }
  105. else
  106. {
  107. _exitingPlayers.Add(player.Id);
  108. await _room.PlayersMessageChannel.SendTo(player.ChatId, $"{strings.confirm_exit} ```{strings.exit}``` {strings.to_confirm_exit}");
  109. }
  110. }
  111. }
  112. }
  113. }
  114. }