Prechádzať zdrojové kódy

Dissolve room in end of game when owner left in game process

Tigran 4 rokov pred
rodič
commit
5f448f720e

+ 9 - 6
MafiaTelegramBot/Controllers/RoomController.cs

@@ -1,3 +1,4 @@
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
@@ -20,8 +21,8 @@ namespace MafiaTelegramBot.Controllers
                 if (gameExists) return ResultCode.GameAlreadyExists;
                 if (!await owner.SetRoomKey(secretPhrase ?? roomName)) return ResultCode.UserAlreadyInGame;
                 var room = secretPhrase == null
-                    ? new GameRoom {Creator = owner, RoomName = roomName, IsExtended = extended}
-                    : new PrivateGameRoom {Creator = owner, RoomName = roomName, IsExtended = extended};
+                    ? 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);
@@ -60,7 +61,7 @@ namespace MafiaTelegramBot.Controllers
                 if (!await player.RemoveGame()) return ResultCode.UserNotInGame;
                 OpenedGames[roomKey].Players.Remove(player.Id);
                 await OpenedGames[roomKey].NotifyPlayersAbout(player.Id, $"{player.NickName} {strings.connected_to_game}");
-                if (OpenedGames[roomKey].Players.Count != 0) return ResultCode.CodeOk;
+                if (OpenedGames[roomKey].Players.Count >= 0) return ResultCode.CodeOk;
                 RoomEncrypter.RemoveShortName(OpenedGames[roomKey].RoomName);
                 if(OpenedGames[roomKey].IsPrivate) RoomEncrypter.Remove(OpenedGames[roomKey].RoomName);
                 OpenedGames.Remove(roomKey);
@@ -73,14 +74,16 @@ namespace MafiaTelegramBot.Controllers
             await Task.Run(async () =>
             {
                 if (OpenedGames.ContainsKey(roomKey))
+                {
                     foreach (var player in OpenedGames[roomKey].Players.Values)
                     {
                         await player.RemoveGame();
-                        RoomEncrypter.RemoveShortName(OpenedGames[roomKey].RoomName);
-                        if(OpenedGames[roomKey].IsPrivate) RoomEncrypter.Remove(OpenedGames[roomKey].RoomName);
-                        OpenedGames.Remove(roomKey);
                         await Bot.SendWithMarkdown2(player.ChatId, strings.room_dissolved, Keyboards.MainMenu);
                     }
+                    RoomEncrypter.RemoveShortName(OpenedGames[roomKey].RoomName);
+                    if(OpenedGames[roomKey].IsPrivate) RoomEncrypter.Remove(OpenedGames[roomKey].RoomName);
+                    OpenedGames.Remove(roomKey);
+                }
             });
         }
 

+ 15 - 5
MafiaTelegramBot/Game/GameRoom.cs

@@ -1,11 +1,14 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
 using MafiaTelegramBot.DataBase;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
 using MafiaTelegramBot.Extensions;
+using Telegram.Bot.Types.ReplyMarkups;
 
 namespace MafiaTelegramBot.Game
 {
@@ -19,7 +22,7 @@ namespace MafiaTelegramBot.Game
         public bool IsExtended { get; init; }
         public bool TimerEnabled { get; set; } = true;
         public string RoomName { get; init; } = "NoNameRoom";
-        public User Creator { get; init; } = new();
+        public User Owner { get; init; } = new();
 
         private readonly Queue<User> _turnOrder = new();
 
@@ -77,7 +80,14 @@ namespace MafiaTelegramBot.Game
                     player.SetRole(Roles.None);
                     _isRunning = false;
                     _turnOrder.Clear();
-                    await NotifyPlayersAbout(-1, strings.thanks_for_game);
+                    Thread.Sleep(10000);//TODO just for tests
+                    if (!Players.ContainsKey(Owner.Id) || Players.Count == 0) new Task(async() => 
+                        await RoomController.DissolveRoom(IsPrivate ? RoomEncrypter.NameToCode(RoomName) : RoomName)).Start();
+                    else
+                    {
+                        await Bot.SendWithMarkdown2(Owner.ChatId, strings.thanks_for_game, Keyboards.OwnerGameMenu);
+                        await NotifyPlayersAbout(Owner.Id, strings.thanks_for_game, Keyboards.PlayerGameMenu);
+                    }
                 }
             });
         }
@@ -127,7 +137,7 @@ namespace MafiaTelegramBot.Game
             return await Task.Run(() =>
             {
                 var players = Players.Values.ToList();
-                players.Remove(Creator);
+                players.Remove(Owner);
                 return players;
             });
         }
@@ -168,11 +178,11 @@ namespace MafiaTelegramBot.Game
             return Players.Count == MaxPlayers;
         }
 
-        public async Task NotifyPlayersAbout(long ignoredUserId, string message)
+        public async Task NotifyPlayersAbout(long ignoredUserId, string message, IReplyMarkup keyboard = null)
         {
             foreach (var player in Players.Values.Where(player => ignoredUserId != player.Id))
             {
-                await Bot.SendWithMarkdown2(player.ChatId, message);
+                await Bot.SendWithMarkdown2(player.ChatId, message, keyboard);
             }
         }
 

+ 1 - 1
MafiaTelegramBot/Resources/Keyboards.cs

@@ -108,7 +108,7 @@ namespace MafiaTelegramBot.Resources
                 var s = rooms[i].IsExtended ? "Р" : "C";
                 inlineButtons[i] = new InlineKeyboardButton
                 {
-                    Text = $"\\[{s}] {rooms[i].RoomName} ({rooms[i].Players.Values.Count.ToString()}/{rooms[i].MaxPlayers.ToString()})",
+                    Text = $"[{s}] {rooms[i].RoomName} ({rooms[i].Players.Values.Count.ToString()}/{rooms[i].MaxPlayers.ToString()})",
                     CallbackData = $"{Callback.ConnectToSelectedRoom}|{userId}|{RoomEncrypter.FullToShort(rooms[i].RoomName)}"
                 };
             }