ApplyRolesChangeQuery.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using MafiaTelegramBot.Controllers;
  5. using MafiaTelegramBot.Game.GameRooms;
  6. using MafiaTelegramBot.Resources;
  7. using Telegram.Bot.Types;
  8. namespace MafiaTelegramBot.Models.Inlines
  9. {
  10. public class ApplyRolesChangeQuery : Query
  11. {
  12. protected override Callback Name => Callback.ApplyRolesChange;
  13. private ExtendedGameRoom _room;
  14. protected override async Task<Message> Execute(Update update)
  15. {
  16. var data = update.CallbackQuery.Data.Split('|');
  17. var roomKey = data[2];
  18. _room = (ExtendedGameRoom) RoomController.GetRoom(roomKey);
  19. if(_room == null)
  20. await Bot.EditMessageAsync(ChatId, update.CallbackQuery.Message.MessageId, strings.room_does_not_exists);
  21. var roleQuery = Enum.Parse<Roles>(data[3]);
  22. if(roleQuery is Roles.Villager or Roles.Mafia) MafiaVillager(roleQuery, data[4]);
  23. else SwitchRole(roleQuery);
  24. var message = $"{strings.current_enabled_roles}";
  25. foreach (var (role, count) in _room.CustomRoomSettings)
  26. message += $"\n| {roles.ResourceManager.GetString(role.ToString())} ({count}) |";
  27. return await Bot.EditMessageAsync(ChatId, update.CallbackQuery.Message.MessageId, message, Keyboard.ChangeRolesKeyboard(UserId, roomKey, _room));
  28. }
  29. private void MafiaVillager(Roles role, string action)
  30. {
  31. switch (action)
  32. {
  33. case "+":
  34. if (role is Roles.Mafia)
  35. {
  36. var blackRolesCount = _room.CustomRoomSettings.Count(pair => pair.Key
  37. is Roles.Dame or Roles.Don or Roles.Werewolf or Roles.Lawyer);
  38. if (_room.CustomRoomSettings.ContainsKey(Roles.Mafia))
  39. blackRolesCount += _room.CustomRoomSettings[Roles.Mafia];
  40. if (blackRolesCount < _room.Max[_room.Players.Count])
  41. {
  42. if(!_room.CustomRoomSettings.ContainsKey(role)) _room.CustomRoomSettings.Add(role, 1);
  43. else _room.CustomRoomSettings[role]++;
  44. }
  45. }
  46. else
  47. {
  48. if(!_room.CustomRoomSettings.ContainsKey(role)) _room.CustomRoomSettings.Add(role, 1);
  49. else if (_room.CustomRoomSettings[role] < _room.MaxPlayers) _room.CustomRoomSettings[role]++;
  50. }
  51. break;
  52. case "-":
  53. if (_room.CustomRoomSettings.ContainsKey(role))
  54. {
  55. if (_room.CustomRoomSettings[role] > 1) _room.CustomRoomSettings[role]--;
  56. else _room.CustomRoomSettings.Remove(role);
  57. }
  58. break;
  59. }
  60. }
  61. private void SwitchRole(Roles role)
  62. {
  63. if (_room.CustomRoomSettings.ContainsKey(role)) _room.CustomRoomSettings.Remove(role);
  64. else
  65. {
  66. switch (role)
  67. {
  68. case Roles.Don:
  69. _room.CustomRoomSettings.Remove(Roles.Dame);
  70. break;
  71. case Roles.Dame:
  72. _room.CustomRoomSettings.Remove(Roles.Don);
  73. break;
  74. case Roles.Cop:
  75. _room.CustomRoomSettings.Remove(Roles.Journalist);
  76. _room.CustomRoomSettings.Remove(Roles.Detective);
  77. break;
  78. case Roles.Journalist:
  79. _room.CustomRoomSettings.Remove(Roles.Cop);
  80. _room.CustomRoomSettings.Remove(Roles.Detective);
  81. break;
  82. case Roles.Detective:
  83. _room.CustomRoomSettings.Remove(Roles.Cop);
  84. _room.CustomRoomSettings.Remove(Roles.Journalist);
  85. break;
  86. case Roles.Doctor:
  87. _room.CustomRoomSettings.Remove(Roles.Necromancer);
  88. break;
  89. case Roles.Necromancer:
  90. _room.CustomRoomSettings.Remove(Roles.Doctor);
  91. break;
  92. }
  93. if (role is Roles.Dame or Roles.Don or Roles.Werewolf or Roles.Lawyer)
  94. {
  95. var blackRolesCount = _room.CustomRoomSettings.Count(pair => pair.Key
  96. is Roles.Dame or Roles.Don or Roles.Werewolf or Roles.Lawyer);
  97. if (_room.CustomRoomSettings.ContainsKey(Roles.Mafia)) blackRolesCount += _room.CustomRoomSettings[Roles.Mafia];
  98. if (blackRolesCount < _room.Max[_room.Players.Count])
  99. {
  100. if (role is Roles.Werewolf)
  101. {
  102. if(_room.CustomRoomSettings.Keys.Any(k => k
  103. is Roles.Dame or Roles.Don or Roles.Mafia)) _room.CustomRoomSettings.Add(role, 1);
  104. }
  105. else _room.CustomRoomSettings.Add(role, 1);
  106. }
  107. }
  108. else _room.CustomRoomSettings.Add(role, 1);
  109. }
  110. }
  111. }
  112. }