private async Task ApplyBalanceResults(BalanceTeamsResult balance) { if (!IsNullOrEmpty(balance.Message)) { await SayBattle(balance.Message); } if ((balance.Players != null) && (balance.Players.Count > 0)) { foreach (var p in balance.Players) { UserBattleStatus u; if (Users.TryGetValue(p.Name, out u)) { u.IsSpectator = p.IsSpectator; u.AllyNumber = p.AllyID; } } foreach (var u in Users.Where(x => !balance.Players.Any(y => y.Name == x.Key))) { u.Value.IsSpectator = true; } } if (balance.DeleteBots) { foreach (var b in Bots.Keys) { await server.Broadcast(Users.Keys, new RemoveBot() { Name = b }); } Bots.Clear(); } if ((balance.Bots != null) && (balance.Bots.Count > 0)) { foreach (var p in balance.Bots) { Bots.AddOrUpdate(p.BotName, s => new BotBattleStatus(p.BotName, p.Owner ?? FounderName, p.BotAI) { AllyNumber = p.AllyID }, (s, status) => { status.AllyNumber = p.AllyID; status.owner = p.Owner ?? FounderName; status.aiLib = p.BotAI; status.Name = p.BotName; return(status); }); } } foreach (var u in Users.Values.Select(x => x.ToUpdateBattleStatus()).ToList()) { await server.Broadcast(Users.Keys, u); // send other's status to self } foreach (var u in Bots.Values.Select(x => x.ToUpdateBotStatus()).ToList()) { await server.Broadcast(Users.Keys, u); } }