|
@@ -1,7 +1,9 @@
|
|
|
+using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Threading.Tasks;
|
|
|
using MafiaTelegramBot.Game;
|
|
|
+using MafiaTelegramBot.Game.GameRooms;
|
|
|
using MafiaTelegramBot.Models;
|
|
|
using MafiaTelegramBot.Resources;
|
|
|
|
|
@@ -11,19 +13,18 @@ namespace MafiaTelegramBot.Controllers
|
|
|
{
|
|
|
private static readonly Dictionary<string, GameRoom> OpenedGames = new();
|
|
|
|
|
|
- public static async Task<ResultCode> CreateNewGame(Player owner, string roomName, bool extended, string secretPhrase = null)
|
|
|
+ public static async Task<ResultCode> CreateNewGame(Player creator, string roomName, bool isExtended, bool isPrivate)
|
|
|
{
|
|
|
- return await Task.Run(async () =>
|
|
|
+ return await Task.Run( () =>
|
|
|
{
|
|
|
- var gameExists = await Task.Run(() => OpenedGames.ContainsKey(roomName));
|
|
|
- if (gameExists) return ResultCode.GameAlreadyExists;
|
|
|
- if (!await owner.SetRoomKey(secretPhrase ?? roomName)) return ResultCode.UserAlreadyInGame;
|
|
|
- var room = secretPhrase == null
|
|
|
- ? new GameRoom {Owner = owner, RoomName = roomName, IsExtended = extended}
|
|
|
- : new PrivateGameRoom {Owner = owner, RoomName = roomName, IsExtended = extended};
|
|
|
- OpenedGames.Add(secretPhrase ?? roomName, room);
|
|
|
- room.Players.Add(owner.Id, owner);
|
|
|
- RoomEncrypter.CreateShortName(roomName);
|
|
|
+ var roomKey = RoomEncrypter.GetCode(roomName);
|
|
|
+ if (OpenedGames.ContainsKey(roomKey)) return ResultCode.GameAlreadyExists;
|
|
|
+ if (!creator.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
|
|
|
+ GameRoom room = isExtended
|
|
|
+ ? new ExtendedGameRoom {Owner = creator, RoomName = roomName, IsPrivate = isPrivate}
|
|
|
+ : new NormalGameRoom {Owner = creator, RoomName = roomName, IsPrivate = isPrivate};
|
|
|
+ OpenedGames.Add(roomKey, room);
|
|
|
+ room.Players.Add(creator.Id, creator);
|
|
|
return ResultCode.CodeOk;
|
|
|
});
|
|
|
}
|
|
@@ -33,35 +34,31 @@ namespace MafiaTelegramBot.Controllers
|
|
|
return await Task.Run(async () =>
|
|
|
{
|
|
|
if (!OpenedGames.ContainsKey(roomKey)) return ResultCode.RoomDoesNotExist;
|
|
|
+ var roomName = RoomEncrypter.GetName(roomKey);
|
|
|
+ if (!player.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
|
|
|
if (OpenedGames[roomKey].IsFilled()) return ResultCode.RoomIsFilled;
|
|
|
- if (!await player.SetRoomKey(roomKey)) return ResultCode.UserAlreadyInGame;
|
|
|
OpenedGames[roomKey].Players.Add(player.Id, player);
|
|
|
await OpenedGames[roomKey].NotifyPlayersAbout(player.Id, $"{player.NickName} {strings.connected_to_game}");
|
|
|
return ResultCode.CodeOk;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- public static async Task<List<Player>> GetPlayers(string roomKey)
|
|
|
+ public static List<Player> GetPlayers(string roomKey)
|
|
|
{
|
|
|
- return await Task.Run( ()=>
|
|
|
- {
|
|
|
- var room = OpenedGames[roomKey];
|
|
|
- var users = room.Players.Values.ToList();
|
|
|
- return users;
|
|
|
- });
|
|
|
+ return OpenedGames[roomKey].Players.Values.ToList();
|
|
|
}
|
|
|
|
|
|
public static async Task<ResultCode> LeaveFromGame(Player player)
|
|
|
{
|
|
|
return await Task.Run(async () =>
|
|
|
{
|
|
|
- var roomKey = player.GetRoomKey();
|
|
|
+ var roomName = player.GetRoomName();
|
|
|
+ var roomKey = RoomEncrypter.GetCode(roomName);
|
|
|
if (!await player.RemoveGame()) return ResultCode.UserNotInGame;
|
|
|
OpenedGames[roomKey].Players.Remove(player.Id);
|
|
|
await OpenedGames[roomKey].NotifyPlayersAbout(player.Id, $"{player.NickName} {strings.leave_from_game}");
|
|
|
if (OpenedGames[roomKey].Players.Count >= 0) return ResultCode.CodeOk;
|
|
|
- RoomEncrypter.RemoveShortName(OpenedGames[roomKey].RoomName);
|
|
|
- if(OpenedGames[roomKey].IsPrivate) RoomEncrypter.Remove(OpenedGames[roomKey].RoomName);
|
|
|
+ RoomEncrypter.RemoveCode(roomName);
|
|
|
OpenedGames.Remove(roomKey);
|
|
|
return ResultCode.CodeOk;
|
|
|
});
|
|
@@ -78,8 +75,7 @@ namespace MafiaTelegramBot.Controllers
|
|
|
await player.RemoveGame();
|
|
|
await Bot.SendWithMarkdown2(player.ChatId, strings.room_dissolved, Keyboards.MainMenu);
|
|
|
}
|
|
|
- RoomEncrypter.RemoveShortName(OpenedGames[roomKey].RoomName);
|
|
|
- if(OpenedGames[roomKey].IsPrivate) RoomEncrypter.Remove(OpenedGames[roomKey].RoomName);
|
|
|
+ RoomEncrypter.RemoveCode(OpenedGames[roomKey].RoomName);
|
|
|
OpenedGames.Remove(roomKey);
|
|
|
}
|
|
|
});
|
|
@@ -90,27 +86,14 @@ namespace MafiaTelegramBot.Controllers
|
|
|
return await Task.Run(() =>
|
|
|
{
|
|
|
var rooms = OpenedGames.Values.ToList();
|
|
|
- List<GameRoom> publicRooms = new List<GameRoom>();
|
|
|
- int countRooms = 0;
|
|
|
- foreach (var room in rooms)
|
|
|
- {
|
|
|
- if (room.IsPrivate) continue;
|
|
|
- if (room.IsFilled()) continue;
|
|
|
- publicRooms.Add(room);
|
|
|
- countRooms++;
|
|
|
- if (countRooms == 10) break;
|
|
|
- }
|
|
|
- return publicRooms;
|
|
|
+ foreach (var room in rooms.Where(room => room.IsPrivate || room.IsFilled())) rooms.Remove(room);
|
|
|
+ return rooms;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- public static async Task<GameRoom> GetRoom(string roomKey)
|
|
|
+ public static GameRoom GetRoom(string roomKey)
|
|
|
{
|
|
|
- return await Task.Run( ()=>
|
|
|
- {
|
|
|
- var room = OpenedGames[roomKey];
|
|
|
- return room;
|
|
|
- });
|
|
|
+ return OpenedGames[roomKey];
|
|
|
}
|
|
|
}
|
|
|
}
|