server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/Mail/NoteCreateEventHandler.cs
2026-02-10 18:21:30 +01:00

107 lines
No EOL
3.3 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using PhoenixLib.Logging;
using WingsAPI.Communication;
using WingsAPI.Communication.DbServer.CharacterService;
using WingsAPI.Communication.Mail;
using WingsAPI.Data.Character;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Mails.Events;
using WingsEmu.Game.Networking;
namespace WingsEmu.Plugins.BasicImplementations.Mail;
public class NoteCreateEventHandler : IAsyncEventProcessor<NoteCreateEvent>
{
private readonly ICharacterService _characterService;
private readonly IGameLanguageService _gameLanguage;
private readonly INoteService _noteService;
public NoteCreateEventHandler(INoteService noteService, IGameLanguageService gameLanguage, ICharacterService characterService)
{
_noteService = noteService;
_gameLanguage = gameLanguage;
_characterService = characterService;
}
public async Task HandleAsync(NoteCreateEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
string receiverName = e.ReceiverName;
string title = e.Title;
string message = e.Message;
if (session.PlayerEntity.Name == receiverName)
{
return;
}
if (session.PlayerEntity.LastSentNote.AddSeconds(5) > DateTime.UtcNow)
{
return;
}
DbServerGetCharacterResponse characterResponse = null;
try
{
characterResponse = await _characterService.GetCharacterByName(new DbServerGetCharacterRequestByName
{
CharacterName = receiverName
});
}
catch (Exception ex)
{
Log.Error("[NOTE_CREATE] Unexpected error: ", ex);
}
if (characterResponse?.RpcResponseType != RpcResponseType.SUCCESS)
{
session.SendInfo(_gameLanguage.GetLanguage(GameDialogKey.INFORMATION_MESSAGE_USER_NOT_FOUND, session.UserLanguage));
return;
}
CharacterDTO receiver = characterResponse.CharacterDto;
if (title.Length > 30)
{
title = title.Substring(0, 30);
}
if (message.Length > 200)
{
message = message.Substring(0, 200);
}
session.PlayerEntity.LastSentNote = DateTime.UtcNow;
CreateNoteResponse response = await _noteService.CreateNoteAsync(new CreateNoteRequest
{
ReceiverId = receiver.Id,
ReceiverName = receiverName,
SenderId = session.PlayerEntity.Id,
SenderName = session.PlayerEntity.Name,
EquipmentPackets = session.GenerateEqListForPacket(),
Title = title,
Message = message,
SenderClass = session.PlayerEntity.Class,
SenderGender = session.PlayerEntity.Gender,
SenderHairColor = session.PlayerEntity.HairColor,
SenderHairStyle = session.PlayerEntity.HairStyle
});
if (response.Status != RpcResponseType.SUCCESS)
{
return;
}
await session.EmitEventAsync(new NoteSentEvent
{
NoteId = response.SenderNote.Id,
ReceiverName = receiverName,
Message = message,
Title = title
});
}
}