|
@@ -1,10 +1,12 @@
|
|
|
+using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Threading.Tasks;
|
|
|
using MafiaTelegramBot.Commands;
|
|
|
+using MafiaTelegramBot.Commands.CallbackQueries;
|
|
|
+using MafiaTelegramBot.Commands.Messages;
|
|
|
using MafiaTelegramBot.Controllers;
|
|
|
using MafiaTelegramBot.Game.GameRoles;
|
|
|
-using MafiaTelegramBot.Models;
|
|
|
using MafiaTelegramBot.Resources;
|
|
|
using Telegram.Bot.Types;
|
|
|
|
|
@@ -18,57 +20,67 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
|
|
|
private readonly GameRoom _room;
|
|
|
|
|
|
+ private readonly List<UpdateHandler> _commandsList = new()
|
|
|
+ {
|
|
|
+ new ShowProfileMessageHandler(null),
|
|
|
+ new LeaveMessageHandler(null),
|
|
|
+ new RoomSettingsMessageHandler(null),
|
|
|
+ new KickSelectedPlayerCallbackQueryHandler(null),
|
|
|
+ new StartGameMessageHandler(null),
|
|
|
+ new LookPlayersListMessageHandler(null),
|
|
|
+ };
|
|
|
+
|
|
|
public MessageHandler(GameRoom room)
|
|
|
{
|
|
|
_room = room;
|
|
|
}
|
|
|
|
|
|
- public async Task<Message> Handle(Update update)
|
|
|
+ public async Task<Message> Handle(Update update, Player player)
|
|
|
{
|
|
|
var text = update.Message.Text;
|
|
|
- var userId = update.Message.From.Id;
|
|
|
- if (!_room.Players.ContainsKey(userId)) return new Message();
|
|
|
- if(_exitingPlayers.Contains(userId)) await Leave(_room.Players[userId], update.Message.Text);
|
|
|
- else if (text == keyboard.look_players_list) await LookPlayers(_room.Players[userId]);
|
|
|
- else if (text == keyboard.leave) await Leave(_room.Players[userId]);
|
|
|
- else if (text == keyboard.end_turn)
|
|
|
+ if (_room.IsRunning)
|
|
|
{
|
|
|
- if (_room.IsDay && _room.Players[userId].IsSpeaker) _room.Players[userId].CurrentRole.TalkingActionComplete.Set();
|
|
|
- else await _room.PlayersMessageChannel.SendTo(userId, strings.now_is_not_your_turn);
|
|
|
+ if (_exitingPlayers.Contains(player.Info.Id)) return await Leave(player, update.Message.Text);
|
|
|
+ if (text == keyboard.look_players_list) return await LookPlayers(player);
|
|
|
+ if (text == keyboard.leave) return await Leave(player);
|
|
|
+ if (text == keyboard.end_turn)
|
|
|
+ {
|
|
|
+ player.CurrentRole.TalkingActionComplete.Set();
|
|
|
+ player.CurrentRole.TalkingActionComplete.Reset();
|
|
|
+ return update.Message;
|
|
|
+ }
|
|
|
+ if (player.IsSpeaker) return await ForwardMessage(player, text);
|
|
|
+ return await MessageController.SendText(player.Info, strings.now_is_not_your_turn);
|
|
|
}
|
|
|
- else await ForwardMessage(_room.Players[userId], text);
|
|
|
- return update.Message;
|
|
|
+ foreach (var item in _commandsList)
|
|
|
+ if(item.IsMatches(text))
|
|
|
+ if (Activator.CreateInstance(item.GetType(), player) is UpdateHandler handler)
|
|
|
+ if(handler.IsMatches(text)) return await handler.Execute(update);
|
|
|
+ return await ForwardMessage(player, text);
|
|
|
}
|
|
|
|
|
|
- private async Task ForwardMessage(Player player, string message)
|
|
|
+ private async Task<Message> ForwardMessage(Player player, string message)
|
|
|
{
|
|
|
- if(!_room.IsRunning) await _room.PlayersMessageChannel.SendExcept(player.Id, $"{player.NickName}: {message}");
|
|
|
- else
|
|
|
+ if(!_room.IsRunning) return await _room.PlayersMessageChannel.SendExcept(player.Info, $"{player.Info.NickName}: {message}");
|
|
|
+ if (!player.IsAlive) return await _room.PlayersMessageChannel.SendTo(player.Info, strings.you_now_died);
|
|
|
+ if (player.IsBlocked) return await _room.PlayersMessageChannel.SendTo(player.Info, strings.you_blocked);
|
|
|
+ if (!player.IsSpeaker) return await _room.PlayersMessageChannel.SendTo(player.Info, strings.now_you_cant_speak);
|
|
|
+ if (_room.IsDay) return await _room.PlayersMessageChannel.SendExcept(player.Info, $"({player.TurnOrder}) {player.Info.NickName}: {message}");
|
|
|
+ if (player.CurrentRole.ColorRole == 2)
|
|
|
+ await _room.MafiaMessageChannel.SendExcept(player.Info, $"({player.TurnOrder}) {player.Info.NickName}: {message}");
|
|
|
+ if (player.CurrentRole is ParasiteRole role)
|
|
|
+ return await _room.PlayersMessageChannel.SendTo(_room.Players[role.ParentId].Info, $"({player.TurnOrder}) {player.Info.NickName}: {message}");
|
|
|
+ try
|
|
|
{
|
|
|
- if (!player.IsAlive) await _room.PlayersMessageChannel.SendTo(player.Id, strings.you_now_died);
|
|
|
- else if (player.IsBlocked) await _room.PlayersMessageChannel.SendTo(player.Id, strings.you_blocked);
|
|
|
- else if (!player.IsSpeaker) await _room.PlayersMessageChannel.SendTo(player.Id, strings.now_you_cant_speak);
|
|
|
- else if (_room.IsDay) await _room.PlayersMessageChannel.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
|
|
|
- else
|
|
|
- {
|
|
|
- if (player.CurrentRole.ColorRole == 2)
|
|
|
- await _room.MafiaMessageChannel.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
|
|
|
- if (player.GetRole() is Roles.Parasite)
|
|
|
- {
|
|
|
- var parasiteRole = player.CurrentRole as ParasiteRole;
|
|
|
- await _room.PlayersMessageChannel.SendTo(parasiteRole!.ParentId, $"({player.TurnOrder}) {player.NickName}: {message}");
|
|
|
- }
|
|
|
- else if (_room.PlayersRole.ContainsKey(Roles.Parasite)
|
|
|
- && _room.PlayersRole[Roles.Parasite].Count == 1
|
|
|
- && ((ParasiteRole)_room.PlayersRole[Roles.Parasite][0].CurrentRole).ParentId == player.Id)
|
|
|
- {
|
|
|
- await _room.PlayersMessageChannel.SendTo(_room.PlayersRole[Roles.Parasite][0].Id, $"({player.TurnOrder}) {player.NickName}: {message}");
|
|
|
- }
|
|
|
- }
|
|
|
+ if (_room.PlayersRole[Roles.Parasite][0].CurrentRole is ParasiteRole parasite && parasite.ParentId == player.Info.Id)
|
|
|
+ return await _room.PlayersMessageChannel.SendTo(_room.PlayersRole[Roles.Parasite][0].Info,
|
|
|
+ $"({player.TurnOrder}) {player.Info.NickName}: {message}");
|
|
|
}
|
|
|
+ catch (Exception) { }
|
|
|
+ return new Message();
|
|
|
}
|
|
|
|
|
|
- private async Task LookPlayers(Player player)
|
|
|
+ private async Task<Message> LookPlayers(Player player)
|
|
|
{
|
|
|
var players = _room.Players.Values.ToArray();
|
|
|
var nextPlayer = _room._turnOrder.Peek();
|
|
@@ -78,43 +90,38 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
for (var i = 0; i != stopIndex; i = (i+1) % players.Length)
|
|
|
{
|
|
|
i %= players.Length;
|
|
|
- if (stopIndex == -1 && players[i].Id == nextPlayer.Id) stopIndex = i;
|
|
|
+ if (stopIndex == -1 && players[i].Info.Id == nextPlayer.Info.Id) stopIndex = i;
|
|
|
if (stopIndex == -1) continue;
|
|
|
- var role = knownRoles.ContainsKey(players[i].Id)
|
|
|
- ? knownRoles[players[i].Id]
|
|
|
+ var role = knownRoles.ContainsKey(players[i].Info.Id)
|
|
|
+ ? knownRoles[players[i].Info.Id]
|
|
|
: "";
|
|
|
message +=
|
|
|
$"\n{(message == strings.players_list ? strings.next + " - " : "")}" +
|
|
|
$"({players[i].TurnOrder}) " +
|
|
|
- $"{(players[i].Id == player.Id ? strings.you : players[i].NickName)} " +
|
|
|
+ $"{(players[i].Info.Id == player.Info.Id ? strings.you : players[i].Info.NickName)} " +
|
|
|
$"({(players[i].IsAlive ? strings.alive : strings.died)}) " +
|
|
|
$"{role}";
|
|
|
}
|
|
|
- await _room.PlayersMessageChannel.SendTo(player.Id, message);
|
|
|
+ return await _room.PlayersMessageChannel.SendTo(player.Info, message);
|
|
|
}
|
|
|
|
|
|
- private async Task Leave(Player player, string text = "")
|
|
|
+ private async Task<Message> Leave(Player player, string text = "")
|
|
|
{
|
|
|
var roomName = player.GetRoomName();
|
|
|
- if (_room.IsRunning)
|
|
|
+ if (_exitingPlayers.Remove(player.Info.Id))
|
|
|
{
|
|
|
- if (_exitingPlayers.Remove(player.Id))
|
|
|
- {
|
|
|
- if (text == strings.exit)
|
|
|
- {
|
|
|
- var resultCode = await RoomController.LeaveFromGame(player);
|
|
|
- if (resultCode == ResultCode.CodeOk)
|
|
|
- await Bot.SendWithMarkdown2(player.ChatId, $"{strings.you_leave_from_game} _*{roomName}*_",
|
|
|
- player.IsAdmin ? Keyboard.AdminMainMenu : Keyboard.MainMenu);
|
|
|
- else await Utilities.GetResultCodeMessage(resultCode, player.ChatId);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _exitingPlayers.Add(player.Id);
|
|
|
- await _room.PlayersMessageChannel.SendTo(player.ChatId, $"{strings.confirm_exit} ```{strings.exit}``` {strings.to_confirm_exit}");
|
|
|
- }
|
|
|
+ if (text != strings.exit) return new Message();
|
|
|
+ var resultCode = await RoomController.LeaveFromGame(player);
|
|
|
+ if (resultCode == ResultCode.CodeOk)
|
|
|
+ return await MessageController.SendText(player.Info,
|
|
|
+ $"{strings.you_leave_from_game} {roomName}",
|
|
|
+ player.Info.IsAdmin ? Keyboard.AdminMainMenu : Keyboard.MainMenu);
|
|
|
+ return await MessageController.SendText(player.Info,
|
|
|
+ Utilities.GetResultCodeMessage(resultCode));
|
|
|
}
|
|
|
+ _exitingPlayers.Add(player.Info.Id);
|
|
|
+ return await _room.PlayersMessageChannel.SendTo(player.Info,
|
|
|
+ $"{strings.confirm_exit} \"{strings.exit}\" {strings.to_confirm_exit}");
|
|
|
}
|
|
|
}
|
|
|
}
|