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);
                }
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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
            });
        }