public static async Task SendFinfoAsync(this ICharacterEntity visualEntity, IFriendHttpClient friendHttpClient, IPacketHttpClient packetHttpClient, ISerializer packetSerializer, bool isConnected) { var friendlist = await friendHttpClient.GetListFriendsAsync(visualEntity.VisualId).ConfigureAwait(false); await Task.WhenAll(friendlist.Select(friend => packetHttpClient.BroadcastPacketAsync(new PostedPacket { Packet = packetSerializer.Serialize(new[] { new FinfoPacket { FriendList = new List <FinfoSubPackets?> { new FinfoSubPackets { CharacterId = visualEntity.VisualId, IsConnected = isConnected } } } }), ReceiverType = ReceiverType.OnlySomeone, SenderCharacter = new Data.WebApi.Character { Id = visualEntity.VisualId, Name = visualEntity.Name ! },
public override async Task ExecuteAsync(MJoinPacket mJoinPacket, ClientSession session) { var target = Broadcaster.Instance.GetCharacter(s => s.VisualId == mJoinPacket.VisualId); var friendList = await _friendHttpClient.GetListFriendsAsync(session.Character.CharacterId).ConfigureAwait(false); if (target != null && friendList.Any(s => s.CharacterId == mJoinPacket.VisualId)) { var miniland = _minilandProvider.GetMiniland(mJoinPacket.VisualId); if (miniland.State == MinilandState.Open) { await session.ChangeMapInstanceAsync(miniland.MapInstanceId, 5, 8).ConfigureAwait(false); } else { if (miniland.State == MinilandState.Private && friendList.Where(w => w.RelationType != CharacterRelationType.Blocked) .Select(s => s.CharacterId) .ToList() .Contains(target.VisualId)) { await session.ChangeMapInstanceAsync(miniland.MapInstanceId, 5, 8).ConfigureAwait(false); return; } await session.SendPacketAsync(new InfoPacket { Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.MINILAND_CLOSED_BY_FRIEND, session.Account.Language) }).ConfigureAwait(false); } } }
public override async Task ExecuteAsync(FdelPacket fdelPacket, ClientSession session) { var list = await _friendHttpClient.GetListFriendsAsync(session.Character.VisualId).ConfigureAwait(false); var idtorem = list.FirstOrDefault(s => s.CharacterId == fdelPacket.CharacterId); if (idtorem != null) { await _friendHttpClient.DeleteFriendAsync(idtorem.CharacterRelationId).ConfigureAwait(false); await session.SendPacketAsync(new InfoPacket { Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.FRIEND_DELETED, session.Account.Language) }).ConfigureAwait(false); var targetCharacter = Broadcaster.Instance.GetCharacter(s => s.VisualId == fdelPacket.CharacterId); await(targetCharacter == null ? Task.CompletedTask : targetCharacter.SendPacketAsync(await targetCharacter.GenerateFinitAsync(_friendHttpClient, _channelHttpClient, _connectedAccountHttpClient).ConfigureAwait(false))).ConfigureAwait(false); await session.Character.SendPacketAsync(await session.Character.GenerateFinitAsync(_friendHttpClient, _channelHttpClient, _connectedAccountHttpClient).ConfigureAwait(false)).ConfigureAwait(false); } else { await session.SendPacketAsync(new InfoPacket { Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.NOT_IN_FRIENDLIST, session.Account.Language) }).ConfigureAwait(false); } }
public override async Task ExecuteAsync(BtkPacket btkPacket, ClientSession session) { var friendlist = await _friendHttpClient.GetListFriendsAsync(session.Character.VisualId).ConfigureAwait(false); if (friendlist.All(s => s.CharacterId != btkPacket.CharacterId)) { _logger.Error(GameLanguage.Instance.GetMessageFromKey(LanguageKey.USER_IS_NOT_A_FRIEND, session.Account.Language)); return; } var message = btkPacket.Message ?? ""; if (message.Length > 60) { message = message.Substring(0, 60); } message = message.Trim(); var receiverSession = Broadcaster.Instance.GetCharacter(s => s.VisualId == btkPacket.CharacterId); if (receiverSession != null) { await receiverSession.SendPacketAsync(session.Character.GenerateTalk(message)).ConfigureAwait(false); return; } var receiver = await _connectedAccountHttpClient.GetCharacterAsync(btkPacket.CharacterId, null).ConfigureAwait(false); if (receiver.Item2 == null) //TODO: Handle 404 in WebApi { await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.FriendOffline }).ConfigureAwait(false); return; } await _packetHttpClient.BroadcastPacketAsync(new PostedPacket { Packet = _packetSerializer.Serialize(new[] { session.Character.GenerateTalk(message) }), ReceiverCharacter = new Character { Id = btkPacket.CharacterId, Name = receiver.Item2.ConnectedCharacter?.Name ?? "" }, SenderCharacter = new Character { Name = session.Character.Name, Id = session.Character.CharacterId }, OriginWorldId = MasterClientListSingleton.Instance.ChannelId, ReceiverType = ReceiverType.OnlySomeone }, receiver.Item2.ChannelId).ConfigureAwait(false); }
public static async Task <FinitPacket> GenerateFinitAsync(this ICharacterEntity visualEntity, IFriendHttpClient friendHttpClient, IChannelHttpClient channelHttpClient, IConnectedAccountHttpClient connectedAccountHttpClient) { //same canal var servers = (await channelHttpClient.GetChannelsAsync().ConfigureAwait(false)) ?.Where(c => c.Type == ServerType.WorldServer).ToList(); var accounts = new List <ConnectedAccount>(); foreach (var server in servers ?? new List <ChannelInfo>()) { accounts.AddRange( await connectedAccountHttpClient.GetConnectedAccountAsync(server).ConfigureAwait(false)); } var subpackets = new List <FinitSubPacket?>(); var friendlist = await friendHttpClient.GetListFriendsAsync(visualEntity.VisualId).ConfigureAwait(false); //TODO add spouselist //var spouseList = _webApiAccess.Get<List<CharacterRelationDto>>(WebApiRoute.Spouse, friendServer.WebApi, visualEntity.VisualId) ?? new List<CharacterRelationDto>(); foreach (var relation in friendlist) { var account = accounts.Find(s => (s.ConnectedCharacter != null) && (s.ConnectedCharacter.Id == relation.CharacterId)); subpackets.Add(new FinitSubPacket { CharacterId = relation.CharacterId, RelationType = relation.RelationType, IsOnline = account != null, CharacterName = relation.CharacterName }); } return(new FinitPacket { SubPackets = subpackets }); }