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) {
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); }
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); }
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 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); }
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); }
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); }
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); }
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); } }
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(); }