Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions Lagrange.Core/Events/EventArgs/BotFriendRequestEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace Lagrange.Core.Events.EventArgs;

public class BotFriendRequestEvent(string initiatorUid, long initiatorUin, string message, string source) : EventBase
{
public string InitiatorUid { get; } = initiatorUid;

public long InitiatorUin { get; } = initiatorUin;

public string Message { get; } = message;

public string Source { get; } = source;

public override string ToEventMessage()
{
return $"{nameof(BotFriendRequestEvent)}: RequestId: {InitiatorUid}, " +
$"InitiatorUin: {InitiatorUin}, " +
$"Message: {Message}, " +
$"Source: {Source}";
}
}
32 changes: 31 additions & 1 deletion Lagrange.Core/Internal/Logic/PushLogic.cs
Comment thread
Szzrain marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System.Text;
using Lagrange.Core.Common;
using Lagrange.Core.Common.Entity;
using Lagrange.Core.Events.EventArgs;
Expand Down Expand Up @@ -128,6 +127,25 @@ public async ValueTask Incoming(ProtocolEvent e)
}
break;
}
case Type.Event0x210:
{
var pkgType210 = (Event0x210SubType)messageEvent.MsgPush.CommonMessage.ContentHead.SubType;
switch (pkgType210)
{
case Event0x210SubType.FriendRequestNotice
when messageEvent.MsgPush.CommonMessage.MessageBody.MsgContent is { } content:
var friendRequest = ProtoHelper.Deserialize<FriendRequest>(content.Span);
context.EventInvoker.PostEvent(new BotFriendRequestEvent(
friendRequest.Info!.SourceUid,
messageEvent.MsgPush.CommonMessage.RoutingHead.FromUin,
friendRequest.Info.Message,
friendRequest.Info.Source ?? string.Empty
));
break;
}

break;
}
case Type.Event0x2DC:
{
var pkgType = (Event0x2DCSubType)messageEvent.MsgPush.CommonMessage.ContentHead.SubType;
Expand Down Expand Up @@ -213,4 +231,16 @@ private enum Event0x2DCSubType16Field13
GroupTodoNotice = 23,
GroupReactionNotice = 35,
}

private enum Event0x210SubType
{
FriendRequestNotice = 35,
GroupMemberEnterNotice = 38,
FriendDeleteOrPinChangedNotice = 39,
FriendRecallNotice = 138,
ServicePinChanged = 199, // e.g: My computer | QQ Wallet | ...
FriendPokeNotice = 290,
GroupKickNotice = 212,
FriendRecallPoke = 321,
}
}
25 changes: 25 additions & 0 deletions Lagrange.Core/Internal/Packets/Notify/FriendRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using Lagrange.Proto;

namespace Lagrange.Core.Internal.Packets.Notify;

#pragma warning disable CS8618

[ProtoPackable]
internal partial class FriendRequest
{
[ProtoMember(1)] public FriendRequestInfo? Info { get; set; }
}

[ProtoPackable]
internal partial class FriendRequestInfo
{
[ProtoMember(1)] public string TargetUid { get; set; }

[ProtoMember(2)] public string SourceUid { get; set; }

[ProtoMember(5)] public string NewSource { get; set; }

[ProtoMember(10)] public string Message { get; set; }

[ProtoMember(11)] public string? Source { get; set; }
}
18 changes: 18 additions & 0 deletions Lagrange.Milky/Entity/Event/FriendRequestEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;
using Lagrange.Milky.Extension;

namespace Lagrange.Milky.Entity.Event;

public class FriendRequestEvent(long time, long selfId, FriendRequestEventData data) : EventBase<FriendRequestEventData>(time, selfId, "friend_request", data) { }

public class FriendRequestEventData(string initiatorUid, long initiatorId, string comment, string via)
{
[JsonPropertyName("initiator_uid")]
public string InitiatorUID { get; } = initiatorUid;
[JsonPropertyName("initiator_id")]
public long InitiatorID { get; } = initiatorId;
[JsonPropertyName("comment")]
public string Comment { get; } = comment;
[JsonPropertyName("via")]
public string Via { get; } = via;
}
30 changes: 30 additions & 0 deletions Lagrange.Milky/Event/EventService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public Task StartAsync(CancellationToken token)
_bot.EventInvoker.RegisterEvent<LgrEvents.BotMessageEvent>(HandleMessageEvent);
_bot.EventInvoker.RegisterEvent<LgrEvents.BotGroupNudgeEvent>(HandleGroupNudgeEvent);
_bot.EventInvoker.RegisterEvent<LgrEvents.BotGroupMemberDecreaseEvent>(HandleGroupMemberDecreaseEvent);
_bot.EventInvoker.RegisterEvent<LgrEvents.BotFriendRequestEvent>(HandleFriendRequestEvent);

return Task.CompletedTask;
}
Expand Down Expand Up @@ -149,6 +150,32 @@ private void HandleGroupMemberDecreaseEvent(BotContext bot, LgrEvents.BotGroupMe
}
}

private void HandleFriendRequestEvent(BotContext bot, LgrEvents.BotFriendRequestEvent @event)
{
try
{
_logger.LogBotFriendRequestEvent(
@event.InitiatorUid,
@event.InitiatorUin,
@event.Message,
@event.Source
);
var result = _convert.FriendRequestEvent(@event);
byte[] bytes = JsonUtility.SerializeToUtf8Bytes(result.GetType(), result);
using (_lock.UsingReadLock())
{
foreach (var handler in _handlers)
{
handler(bytes);
}
}
}
catch (Exception e)
{
_logger.LogHandleEventException(nameof(LgrEvents.BotFriendRequestEvent), e);
}
}

public Task StopAsync(CancellationToken token)
{
// TODO: unregister
Expand Down Expand Up @@ -190,6 +217,9 @@ public static partial class EventServiceLoggerExtension

[LoggerMessage(EventId = 4, Level = LogLevel.Debug, Message = "BotGroupMemberDecreaseEvent {{ group: {group}, user: {user}, operator: {operator} }}")]
public static partial void LogGroupMemberDecreaseEvent(this ILogger<EventService> logger, long group, long user, long? @operator);

[LoggerMessage(EventId = 5, Level = LogLevel.Debug, Message = "BotFriendRequestEvent {{ request: {request}, user: {user}, message: {message}, source: {source} }}")]
public static partial void LogBotFriendRequestEvent(this ILogger<EventService> logger, string request, long user, string? message, string? source);

[LoggerMessage(EventId = 999, Level = LogLevel.Error, Message = "Handle {event} exception")]
public static partial void LogHandleEventException(this ILogger<EventService> logger, string @event, Exception e);
Expand Down
7 changes: 7 additions & 0 deletions Lagrange.Milky/Utility/EntityConvert.Event.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,11 @@ public partial class EntityConvert
_bot.BotUin,
new GroupMemberDecreaseEventData(@event.GroupUin, @event.UserUin, @event.OperatorUin == 0 ? null : @event.OperatorUin)
);

public FriendRequestEvent FriendRequestEvent(LgrEventArgs.BotFriendRequestEvent @event) => new(
@event.EventTime.ToUnixTimeSeconds(),
_bot.BotUin,
new FriendRequestEventData(@event.InitiatorUid, @event.InitiatorUin,
@event.Message, @event.Source)
);
}
2 changes: 2 additions & 0 deletions Lagrange.Milky/Utility/JsonUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ public static partial class JsonUtility
[JsonSerializable(typeof(GroupNudgeEvent))]
// group_member_decrease
[JsonSerializable(typeof(GroupMemberDecreaseEvent))]
// friend_request
[JsonSerializable(typeof(FriendRequestEvent))]
private partial class JsonContext : JsonSerializerContext;

public static string Serialize<T>(T value) where T : class
Expand Down
Loading