コード例 #1
0
ファイル: FriendController.cs プロジェクト: serodyx/NosCore
        public async Task <LanguageKey> AddFriendAsync([FromBody] FriendShipRequest friendPacket)
        {
            var character = await _connectedAccountHttpClient.GetCharacterAsync(friendPacket.CharacterId, null).ConfigureAwait(false);

            var targetCharacter = await _connectedAccountHttpClient.GetCharacterAsync(friendPacket.FinsPacket?.CharacterId, null).ConfigureAwait(false);

            var friendRequest = _friendRequestHolder.FriendRequestCharacters.Where(s =>
                                                                                   (s.Value.Item2 == character.Item2?.ConnectedCharacter?.Id) &&
                                                                                   (s.Value.Item1 == targetCharacter.Item2?.ConnectedCharacter?.Id)).ToList();

            if ((character.Item2 != null) && (targetCharacter.Item2 != null))
            {
                if (character.Item2.ChannelId != targetCharacter.Item2.ChannelId)
                {
                    throw new ArgumentException();
                }

                var relations = _characterRelationDao.Where(s => s.CharacterId == friendPacket.CharacterId).ToList();
                if (relations.Count(s => s.RelationType == CharacterRelationType.Friend) >= 80)
                {
                    return(LanguageKey.FRIENDLIST_FULL);
                }

                if (relations.Any(s =>
                                  (s.RelationType == CharacterRelationType.Blocked) &&
                                  (s.RelatedCharacterId == friendPacket.FinsPacket !.CharacterId)))
                {
                    return(LanguageKey.BLACKLIST_BLOCKED);
                }

                if (relations.Any(s =>
                                  (s.RelationType == CharacterRelationType.Friend) &&
                                  (s.RelatedCharacterId == friendPacket.FinsPacket !.CharacterId)))
                {
                    return(LanguageKey.ALREADY_FRIEND);
                }

                if (character.Item2.ConnectedCharacter !.FriendRequestBlocked ||
                    targetCharacter.Item2.ConnectedCharacter !.FriendRequestBlocked)
                {
                    return(LanguageKey.FRIEND_REQUEST_BLOCKED);
                }

                if (!friendRequest.Any())
                {
                    _friendRequestHolder.FriendRequestCharacters[Guid.NewGuid()] =
                        new Tuple <long, long>(character.Item2.ConnectedCharacter.Id,
                                               targetCharacter.Item2.ConnectedCharacter.Id);
                    return(LanguageKey.FRIEND_REQUEST_SENT);
                }

                switch (friendPacket.FinsPacket !.Type)
                {
コード例 #2
0
        public override async Task ExecuteAsync(SetGoldCommandPacket goldPacket, ClientSession session)
        {
            var data = new StatData
            {
                ActionType = UpdateStatActionType.UpdateGold,
                Character  = new Character {
                    Name = goldPacket.Name ?? session.Character.Name
                },
                Data = goldPacket.Gold
            };

            var receiver = await _connectedAccountHttpClient.GetCharacterAsync(null, goldPacket.Name ?? session.Character.Name).ConfigureAwait(false);

            if (receiver.Item2 == null) //TODO: Handle 404 in WebApi
            {
                await session.SendPacketAsync(new InfoPacket
                {
                    Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.CANT_FIND_CHARACTER,
                                                                      session.Account.Language)
                }).ConfigureAwait(false);

                return;
            }

            await _statHttpClient.ChangeStatAsync(data, receiver.Item1 !).ConfigureAwait(false);

            await session.SendPacketAsync(session.Character.GenerateGold()).ConfigureAwait(false);
        }
コード例 #3
0
        public override async Task ExecuteAsync(SetReputationPacket setReputationPacket, ClientSession session)
        {
            if ((setReputationPacket.Name == session.Character.Name) || string.IsNullOrEmpty(setReputationPacket.Name))
            {
                await session.Character.SetReputationAsync(setReputationPacket.Reputation).ConfigureAwait(false);

                return;
            }

            var data = new StatData
            {
                ActionType = UpdateStatActionType.UpdateReputation,
                Character  = new Character {
                    Name = setReputationPacket.Name
                },
                Data = setReputationPacket.Reputation
            };

            var receiver = await _connectedAccountHttpClient.GetCharacterAsync(null, setReputationPacket.Name).ConfigureAwait(false);

            if (receiver.Item2 == null) //TODO: Handle 404 in WebApi
            {
                await session.SendPacketAsync(new InfoPacket
                {
                    Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.CANT_FIND_CHARACTER,
                                                                      session.Account.Language)
                }).ConfigureAwait(false);

                return;
            }

            await _statHttpClient.ChangeStatAsync(data, receiver.Item1 !).ConfigureAwait(false);
        }
コード例 #4
0
ファイル: BtkPacketHandler.cs プロジェクト: Price-H16/NosCore
        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);
        }
コード例 #5
0
        public async Task <LanguageKey> AddBlacklistAsync([FromBody] BlacklistRequest blacklistRequest)
        {
            var character = await _connectedAccountHttpClient.GetCharacterAsync(blacklistRequest.CharacterId, null).ConfigureAwait(false);

            var targetCharacter = await
                                  _connectedAccountHttpClient.GetCharacterAsync(blacklistRequest.BlInsPacket?.CharacterId, null).ConfigureAwait(false);

            if ((character.Item2 == null) || (targetCharacter.Item2 == null))
            {
                throw new ArgumentException();
            }

            var relations = _characterRelationDao.Where(s => s.CharacterId == blacklistRequest.CharacterId)
                            .ToList();

            if (relations.Any(s =>
                              (s.RelatedCharacterId == blacklistRequest.BlInsPacket?.CharacterId) &&
                              (s.RelationType != CharacterRelationType.Blocked)))
            {
                return(LanguageKey.CANT_BLOCK_FRIEND);
            }

            if (relations.Any(s =>
                              (s.RelatedCharacterId == blacklistRequest.BlInsPacket?.CharacterId) &&
                              (s.RelationType == CharacterRelationType.Blocked)))
            {
                return(LanguageKey.ALREADY_BLACKLISTED);
            }

            var data = new CharacterRelationDto
            {
                CharacterId        = character.Item2.ConnectedCharacter !.Id,
                RelatedCharacterId = targetCharacter.Item2.ConnectedCharacter !.Id,
                RelationType       = CharacterRelationType.Blocked
            };

            await _characterRelationDao.TryInsertOrUpdateAsync(data).ConfigureAwait(false);

            return(LanguageKey.BLACKLIST_ADDED);
        }
コード例 #6
0
        public override async Task ExecuteAsync(KickPacket kickPacket, ClientSession session)
        {
            var receiver = await _connectedAccountHttpClient.GetCharacterAsync(null, kickPacket.Name ?? session.Character.Name).ConfigureAwait(false);

            if (receiver.Item2 == null) //TODO: Handle 404 in WebApi
            {
                await session.SendPacketAsync(new InfoPacket
                {
                    Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.CANT_FIND_CHARACTER,
                                                                      session.Account.Language)
                }).ConfigureAwait(false);

                return;
            }

            await _connectedAccountHttpClient.DisconnectAsync(receiver.Item2.ConnectedCharacter !.Id).ConfigureAwait(false);
        }
コード例 #7
0
ファイル: MailController.cs プロジェクト: serhocanszd/NosCore
        public async Task <bool> DeleteMail(long id, long characterId, bool senderCopy)
        {
            var mail = _parcelHolder[characterId][senderCopy][id];

            _mailDao.Delete(mail.MailDto.MailId);
            if (mail.ItemInstance != null)
            {
                _itemInstanceDao.Delete(mail.ItemInstance.Id);
            }

            _parcelHolder[characterId][senderCopy].TryRemove(id, out var maildata);
            if (maildata == null)
            {
                return(false);
            }
            var receiver = await _connectedAccountHttpClient.GetCharacterAsync(characterId, null).ConfigureAwait(false);

            Notify(1, receiver, maildata);
            return(true);
        }
コード例 #8
0
        public override async Task ExecuteAsync(GiftPacket giftPacket, ClientSession session)
        {
            var receiver =
                await _connectedAccountHttpClient.GetCharacterAsync(null, giftPacket.CharacterName ?? session.Character.Name).ConfigureAwait(false);

            if (receiver.Item2 == null)
            {
                await session.SendPacketAsync(new InfoPacket
                {
                    Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.CANT_FIND_CHARACTER,
                                                                      session.Account.Language)
                }).ConfigureAwait(false);

                return;
            }

            await _mailHttpClient.SendGiftAsync(session.Character !, receiver.Item2.ConnectedCharacter !.Id, giftPacket.VNum,
                                                giftPacket.Amount, giftPacket.Rare, giftPacket.Upgrade, false).ConfigureAwait(false);

            await session.SendPacketAsync(session.Character.GenerateSay(GameLanguage.Instance.GetMessageFromKey(
                                                                            LanguageKey.GIFT_SENT,
                                                                            session.Account.Language), SayColorType.Yellow)).ConfigureAwait(false);
        }
コード例 #9
0
        public override async Task ExecuteAsync(WhisperPacket whisperPacket, ClientSession session)
        {
            try
            {
                var messageBuilder = new StringBuilder();

                //Todo: review this
                var messageData  = whisperPacket.Message !.Split(' ');
                var receiverName = messageData[whisperPacket.Message.StartsWith("GM ") ? 1 : 0];

                for (var i = messageData[0] == "GM" ? 2 : 1; i < messageData.Length; i++)
                {
                    messageBuilder.Append(messageData[i]).Append(" ");
                }

                var message = new StringBuilder(messageBuilder.ToString().Length > 60
                    ? messageBuilder.ToString().Substring(0, 60) : messageBuilder.ToString());

                await session.SendPacketAsync(session.Character.GenerateSpk(new SpeakPacket
                {
                    SpeakType = SpeakType.Player,
                    Message   = message.ToString()
                })).ConfigureAwait(false);

                var speakPacket = session.Character.GenerateSpk(new SpeakPacket
                {
                    SpeakType = session.Account.Authority >= AuthorityType.GameMaster ? SpeakType.GameMaster
                        : SpeakType.Player,
                    Message = message.ToString()
                });

                var receiverSession =
                    Broadcaster.Instance.GetCharacter(s => s.Name == receiverName);

                var receiver = await _connectedAccountHttpClient.GetCharacterAsync(null, receiverName).ConfigureAwait(false);

                if (receiver.Item2 == null) //TODO: Handle 404 in WebApi
                {
                    await session.SendPacketAsync(session.Character.GenerateSay(
                                                      GameLanguage.Instance.GetMessageFromKey(LanguageKey.CHARACTER_OFFLINE, session.Account.Language),
                                                      SayColorType.Yellow)).ConfigureAwait(false);

                    return;
                }

                var blacklisteds = await _blacklistHttpClient.GetBlackListsAsync(session.Character.VisualId).ConfigureAwait(false);

                if (blacklisteds.Any(s => s.CharacterId == receiver.Item2.ConnectedCharacter?.Id))
                {
                    await session.SendPacketAsync(new SayPacket
                    {
                        Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.BLACKLIST_BLOCKED,
                                                                          session.Account.Language),
                        Type = SayColorType.Yellow
                    }).ConfigureAwait(false);

                    return;
                }

                speakPacket.Message = receiverSession != null ? speakPacket.Message :
                                      $"{speakPacket.Message} <{GameLanguage.Instance.GetMessageFromKey(LanguageKey.CHANNEL, receiver.Item2.Language)}: {MasterClientListSingleton.Instance.ChannelId}>";

                await _packetHttpClient.BroadcastPacketAsync(new PostedPacket
                {
                    Packet            = _packetSerializer.Serialize(new[] { speakPacket }),
                    ReceiverCharacter = new Character {
                        Name = receiverName
                    },
                    SenderCharacter = new Character {
                        Name = session.Character.Name
                    },
                    OriginWorldId = MasterClientListSingleton.Instance.ChannelId,
                    ReceiverType  = ReceiverType.OnlySomeone
                }, receiver.Item2.ChannelId).ConfigureAwait(false);

                await session.SendPacketAsync(session.Character.GenerateSay(
                                                  GameLanguage.Instance.GetMessageFromKey(LanguageKey.SEND_MESSAGE_TO_CHARACTER,
                                                                                          session.Account.Language), SayColorType.Purple)).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                _logger.Error("Whisper failed.", e);
            }
        }
コード例 #10
0
ファイル: FriendService.cs プロジェクト: erencino55/NosCore
        public async Task <LanguageKey> AddFriendAsync(long characterId, long secondCharacterId, FinsPacketType friendsPacketType)
        {
            var character = await _connectedAccountHttpClient.GetCharacterAsync(characterId, null).ConfigureAwait(false);

            var targetCharacter = await _connectedAccountHttpClient.GetCharacterAsync(secondCharacterId, null).ConfigureAwait(false);

            var friendRequest = _friendRequestHolder.FriendRequestCharacters.Where(s =>
                                                                                   (s.Value.Item2 == character.Item2?.ConnectedCharacter?.Id) &&
                                                                                   (s.Value.Item1 == targetCharacter.Item2?.ConnectedCharacter?.Id)).ToList();

            if ((character.Item2 != null) && (targetCharacter.Item2 != null))
            {
                if (character.Item2.ChannelId != targetCharacter.Item2.ChannelId)
                {
                    throw new ArgumentException();
                }

                var relations = _characterRelationDao.Where(s => s.CharacterId == characterId)?.ToList() ?? new List <CharacterRelationDto>();
                if (relations.Count(s => s.RelationType == CharacterRelationType.Friend) >= 80)
                {
                    return(LanguageKey.FRIENDLIST_FULL);
                }

                if (relations.Any(s =>
                                  (s.RelationType == CharacterRelationType.Blocked) &&
                                  (s.RelatedCharacterId == secondCharacterId)))
                {
                    return(LanguageKey.BLACKLIST_BLOCKED);
                }

                if (relations.Any(s =>
                                  (s.RelationType == CharacterRelationType.Friend) &&
                                  (s.RelatedCharacterId == secondCharacterId)))
                {
                    return(LanguageKey.ALREADY_FRIEND);
                }

                if (character.Item2.ConnectedCharacter !.FriendRequestBlocked ||
                    targetCharacter.Item2.ConnectedCharacter !.FriendRequestBlocked)
                {
                    return(LanguageKey.FRIEND_REQUEST_BLOCKED);
                }

                if (!friendRequest.Any())
                {
                    _friendRequestHolder.FriendRequestCharacters[Guid.NewGuid()] =
                        new Tuple <long, long>(character.Item2.ConnectedCharacter.Id,
                                               targetCharacter.Item2.ConnectedCharacter.Id);
                    return(LanguageKey.FRIEND_REQUEST_SENT);
                }

                switch (friendsPacketType)
                {
                case FinsPacketType.Accepted:
                    var data = new CharacterRelationDto
                    {
                        CharacterId        = character.Item2.ConnectedCharacter.Id,
                        RelatedCharacterId = targetCharacter.Item2.ConnectedCharacter.Id,
                        RelationType       = CharacterRelationType.Friend
                    };

                    await _characterRelationDao.TryInsertOrUpdateAsync(data).ConfigureAwait(false);

                    var data2 = new CharacterRelationDto
                    {
                        CharacterId        = targetCharacter.Item2.ConnectedCharacter.Id,
                        RelatedCharacterId = character.Item2.ConnectedCharacter.Id,
                        RelationType       = CharacterRelationType.Friend
                    };

                    await _characterRelationDao.TryInsertOrUpdateAsync(data2).ConfigureAwait(false);

                    _friendRequestHolder.FriendRequestCharacters.TryRemove(friendRequest.First().Key, out _);
                    return(LanguageKey.FRIEND_ADDED);

                case FinsPacketType.Rejected:
                    _friendRequestHolder.FriendRequestCharacters.TryRemove(friendRequest.First().Key, out _);
                    return(LanguageKey.FRIEND_REJECTED);

                default:
                    _logger.Error(LogLanguage.Instance.GetMessageFromKey(LogLanguageKey.INVITETYPE_UNKNOWN));
                    _friendRequestHolder.FriendRequestCharacters.TryRemove(friendRequest.First().Key, out _);
                    throw new ArgumentException();
                }
            }

            _friendRequestHolder.FriendRequestCharacters.TryRemove(friendRequest.First().Key, out _);
            throw new ArgumentException();
        }