using System; using System.Threading.Tasks; using PhoenixLib.ServiceBus; using WingsAPI.Communication; using WingsAPI.Communication.Mail; using WingsEmu.DTOs.Mails; using WingsEmu.Packets.Enums; using WingsEmu.Packets.Enums.Character; using WingsEmu.Plugins.DistributedGameEvents.PlayerEvents; namespace MailServer.Services { public class NoteService : INoteService { private readonly ICharacterNoteDao _characterNoteDao; private readonly IMessagePublisher _messagePublisher; public NoteService(ICharacterNoteDao characterNoteDao, IMessagePublisher messagePublisher) { _characterNoteDao = characterNoteDao; _messagePublisher = messagePublisher; } public async ValueTask CreateNoteAsync(CreateNoteRequest request) { long senderId = request.SenderId; string senderName = request.SenderName; long receiverId = request.ReceiverId; string receiverName = request.ReceiverName; string title = request.Title; string message = request.Message; string equipmentPackets = request.EquipmentPackets; GenderType senderGender = request.SenderGender; ClassType senderClass = request.SenderClass; HairColorType senderHairColor = request.SenderHairColor; HairStyleType senderHairStyle = request.SenderHairStyle; var newSenderMail = new CharacterNoteDto { Date = DateTime.UtcNow, SenderId = senderId, ReceiverId = receiverId, Title = title, Message = message, EquipmentPackets = equipmentPackets, IsSenderCopy = true, IsOpened = false, SenderGender = senderGender, SenderClass = senderClass, SenderHairColor = senderHairColor, SenderHairStyle = senderHairStyle, SenderName = senderName, ReceiverName = receiverName }; CharacterNoteDto senderMail = await _characterNoteDao.SaveAsync(newSenderMail); var newRecvMail = new CharacterNoteDto { Date = DateTime.UtcNow, SenderId = senderId, ReceiverId = receiverId, Title = title, Message = message, EquipmentPackets = equipmentPackets, IsSenderCopy = false, IsOpened = false, SenderGender = senderGender, SenderClass = senderClass, SenderHairColor = senderHairColor, SenderHairStyle = senderHairStyle, SenderName = senderName, ReceiverName = receiverName }; CharacterNoteDto recvMail; try { recvMail = await _characterNoteDao.SaveAsync(newRecvMail); } catch { return new CreateNoteResponse { Status = RpcResponseType.GENERIC_SERVER_ERROR }; } await _messagePublisher.PublishAsync(new NoteReceivedMessage { SenderNote = senderMail, ReceiverNote = recvMail }); return new CreateNoteResponse { SenderNote = senderMail, ReceiverNote = recvMail, Status = RpcResponseType.SUCCESS }; } public async ValueTask OpenNoteAsync(OpenNoteRequest request) { long noteId = request.NoteId; CharacterNoteDto note = await _characterNoteDao.GetByIdAsync(noteId); if (note == null) { return new BasicRpcResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } if (note.IsSenderCopy) { return new BasicRpcResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } if (note.IsOpened) { return new BasicRpcResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } note.IsOpened = true; try { await _characterNoteDao.SaveAsync(note); } catch { return new BasicRpcResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } return new BasicRpcResponse { ResponseType = RpcResponseType.SUCCESS }; ; } public async ValueTask RemoveNoteAsync(RemoveNoteRequest request) { long noteId = request.NoteId; CharacterNoteDto note = await _characterNoteDao.GetByIdAsync(noteId); if (note == null) { return new BasicRpcResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } try { await _characterNoteDao.DeleteByIdAsync(note.Id); } catch { return new BasicRpcResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } return new BasicRpcResponse { ResponseType = RpcResponseType.SUCCESS }; } } }