private void OnCommandReceived(ServerCommand command) { switch (command.Type) { case ServerCommandType.JCH: var jch = command.Payload.ToObject <ServerJch>(); if (jch.character.identity == chatManager.OwnCharacterName) { var memberList = new ObservableKeyedList <Character, Channel.Member>(x => x.Character); var newChannel = new Channel(jch.channel, jch.title, memberList); members.Add(newChannel, memberList); joinedChannels.Add(newChannel); SetIsJoined(newChannel, true); return; } break; case ServerCommandType.ICH: case ServerCommandType.CDS: case ServerCommandType.CBU: case ServerCommandType.CKU: case ServerCommandType.COA: case ServerCommandType.COL: case ServerCommandType.COR: case ServerCommandType.CSO: case ServerCommandType.CTU: case ServerCommandType.LCH: case ServerCommandType.RMO: break; case ServerCommandType.FLN: var flnCharacter = command.Value <string>("character"); foreach (var item in joinedChannels.ToList()) { members[item].Remove(characterManager.GetCharacter(flnCharacter)); } return; case ServerCommandType.CHA: publicChannels.Reset(command.Payload.GetValue("channels").Select(x => { var name = x.Value <string>("name"); var item = new ChannelListItem(name, name, x.Value <int>("characters")); item.IsJoined = JoinedChannels.ContainsKey(item.Id); return(item); })); return; case ServerCommandType.ORS: privateChannels.Reset(command.Payload.GetValue("channels").Select(x => { var item = new ChannelListItem(x.Value <string>("name"), x.Value <string>("title"), x.Value <int>("characters")); item.IsJoined = JoinedChannels.ContainsKey(item.Id); return(item); })); return; default: return; } HandleChannelMessage(joinedChannels[command.Value <string>("channel")], command); }