/// <summary> /// Удаляет матч из памяти. Уведомляет игроков и матчмейкер о конце матча. /// </summary> private void DeleteMatch(int matchId) { Match match = matchStorage.DequeueMatch(matchId); if (match == null) { log.Error($"Матч уже был удалён. {nameof(matchId)} {matchId}"); return; } playersMatchFinishNotifier.Notify(match); match.TearDown(); matchmakerNotifier.MarkMatchAsFinished(matchId); Task.Run(async() => { //todo вынести это в новый класс //задержка нужна для того, чтобы последние udp сообщения дошли до игроков await Task.Delay(10_000); log.Info($"Удаление rudp сообщений для матча {nameof(matchId)} {matchId}."); byteArrayRudpStorage.RemoveMatchMessages(matchId); List <ushort> playersIds = ipAddressesStorage.GetActivePlayersIds(matchId); if (playersIds != null) { foreach (ushort playerId in playersIds) { messageIdFactory.RemovePlayer(matchId, playerId); messagesPackIdFactory.RemovePlayer(matchId, playerId); } } }); }
public void Notify(Match match) { List <ushort> activePlayersIds = ipAddressesStorage.GetActivePlayersIds(match.matchId); if (activePlayersIds == null || activePlayersIds.Count == 0) { log.Info("Список активных игроков пуст. Некого уведомлять о окончании матча."); } else { log.Info(" Старт уведомления игроков про окончание матча"); foreach (ushort playerId in activePlayersIds) { log.Info($"Отправка уведомления о завершении боя игроку {nameof(playerId)} {playerId}"); udpSendUtils.SendShowAchievementsMessage(match.matchId, playerId); } log.Info(" Конец уведомления игроков про окончание матча"); } }
public void SendAll() { List <(int matchId, ushort playerId)> pairs = new List <(int matchId, ushort playerId)>(); //получить пары matchId playerId из хранилища матчей foreach (Match match in matchStorage.GetAllMatches()) { int matchId = match.matchId; List <ushort> players = ipAddressesStorage.GetActivePlayersIds(matchId); if (players != null) { foreach (ushort playersId in players) { pairs.Add((matchId, playersId)); } } } //запросить и отправить сообщения для всех пар foreach (var(matchId, playerId) in pairs) { //messageId, model byte[][] messagesForPlayer = byteArrayRudpStorage.GetMessages(matchId, playerId); if (messagesForPlayer != null) { if (ipAddressesStorage.TryGetIpEndPoint(matchId, playerId, out IPEndPoint ipEndPoint)) { foreach (byte[] data in messagesForPlayer) { udpSendUtils.SendReadyMadeMessage(matchId, playerId, data); } } else { //такого быть не должно. ведь id игрока был получен из списка активных игроков log.Error("ip игрока не найден, хотя он в списке активных игроков."); } } } }