private async Task Process(JoinBattleSuccess bat)
        {
            Battle battle;

            ExistingBattles.TryGetValue(bat.BattleID, out battle);
            if (battle != null)
            {
                battle.Users.Clear();
                foreach (var battleStatusUpdate in bat.Players)
                {
                    var ubs = new UserBattleStatus(battleStatusUpdate.Name, ExistingUsers.Get(battleStatusUpdate.Name));
                    ubs.UpdateWith(battleStatusUpdate);
                    battle.Users[battleStatusUpdate.Name] = ubs;
                }

                battle.Bots.Clear();
                foreach (var botStatusUpdate in bat.Bots)
                {
                    var ubs = new BotBattleStatus(botStatusUpdate.Name, botStatusUpdate.Owner, botStatusUpdate.AiLib);
                    ubs.UpdateWith(botStatusUpdate);
                    battle.Bots[botStatusUpdate.Name] = ubs;
                    BattleBotAdded(this, ubs);
                }

                MyBattle = battle;
                if (battle.FounderName == UserName)
                {
                    BattleOpened(this, battle);
                }
                BattleJoinSuccess(this, MyBattle);
            }
        }
        public async Task Process(UpdateBotStatus status)
        {
            var bat = MyBattle;

            if (bat != null)
            {
                BotBattleStatus ubs;
                bat.Bots.TryGetValue(status.Name, out ubs);
                if (ubs != null)
                {
                    ubs.UpdateWith(status);
                    BattleBotUpdated(this, ubs);
                }
                else
                {
                    var nubs = new BotBattleStatus(status.Name, status.Owner, status.AiLib);
                    nubs.UpdateWith(status);
                    bat.Bots[status.Name] = nubs;
                    BattleBotAdded(this, nubs);
                }
            }
        }