GameRoom.MessageHandler.cs 4.6 KB

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