GameRoom.MessageHandler.cs 5.8 KB

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