Skip to content

Commit ff5e4a8

Browse files
committed
[Core & Milky] Implement friend_request event
1 parent 06234c8 commit ff5e4a8

7 files changed

Lines changed: 133 additions & 1 deletion

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace Lagrange.Core.Events.EventArgs;
2+
3+
public class BotFriendRequestEvent(string initiatorUid, long initiatorUin, string message, string source) : EventBase
4+
{
5+
public string InitiatorUid { get; } = initiatorUid;
6+
7+
public long InitiatorUin { get; } = initiatorUin;
8+
9+
public string Message { get; } = message;
10+
11+
public string Source { get; } = source;
12+
13+
public override string ToEventMessage()
14+
{
15+
return $"{nameof(BotFriendRequestEvent)}: RequestId: {InitiatorUid}, " +
16+
$"InitiatorUin: {InitiatorUin}, " +
17+
$"Message: {Message}, " +
18+
$"Source: {Source}";
19+
}
20+
}

Lagrange.Core/Internal/Logic/PushLogic.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System.Text;
21
using Lagrange.Core.Common;
32
using Lagrange.Core.Common.Entity;
43
using Lagrange.Core.Events.EventArgs;
@@ -128,6 +127,25 @@ public async ValueTask Incoming(ProtocolEvent e)
128127
}
129128
break;
130129
}
130+
case Type.Event0x210:
131+
{
132+
var pkgType210 = (Event0x210SubType)messageEvent.MsgPush.CommonMessage.ContentHead.SubType;
133+
switch (pkgType210)
134+
{
135+
case Event0x210SubType.FriendRequestNotice
136+
when messageEvent.MsgPush.CommonMessage.MessageBody.MsgContent is { } content:
137+
var friendRequest = ProtoHelper.Deserialize<FriendRequest>(content.Span);
138+
context.EventInvoker.PostEvent(new BotFriendRequestEvent(
139+
friendRequest.Info!.SourceUid,
140+
messageEvent.MsgPush.CommonMessage.RoutingHead.FromUin,
141+
friendRequest.Info.Message,
142+
friendRequest.Info.Source ?? string.Empty
143+
));
144+
break;
145+
}
146+
147+
break;
148+
}
131149
case Type.Event0x2DC:
132150
{
133151
var pkgType = (Event0x2DCSubType)messageEvent.MsgPush.CommonMessage.ContentHead.SubType;
@@ -213,4 +231,16 @@ private enum Event0x2DCSubType16Field13
213231
GroupTodoNotice = 23,
214232
GroupReactionNotice = 35,
215233
}
234+
235+
private enum Event0x210SubType
236+
{
237+
FriendRequestNotice = 35,
238+
GroupMemberEnterNotice = 38,
239+
FriendDeleteOrPinChangedNotice = 39,
240+
FriendRecallNotice = 138,
241+
ServicePinChanged = 199, // e.g: My computer | QQ Wallet | ...
242+
FriendPokeNotice = 290,
243+
GroupKickNotice = 212,
244+
FriendRecallPoke = 321,
245+
}
216246
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Lagrange.Proto;
2+
3+
namespace Lagrange.Core.Internal.Packets.Notify;
4+
5+
#pragma warning disable CS8618
6+
7+
[ProtoPackable]
8+
internal partial class FriendRequest
9+
{
10+
[ProtoMember(1)] public FriendRequestInfo? Info { get; set; }
11+
}
12+
13+
[ProtoPackable]
14+
internal partial class FriendRequestInfo
15+
{
16+
[ProtoMember(1)] public string TargetUid { get; set; }
17+
18+
[ProtoMember(2)] public string SourceUid { get; set; }
19+
20+
[ProtoMember(5)] public string NewSource { get; set; }
21+
22+
[ProtoMember(10)] public string Message { get; set; }
23+
24+
[ProtoMember(11)] public string? Source { get; set; }
25+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Text.Json.Serialization;
2+
using Lagrange.Milky.Extension;
3+
4+
namespace Lagrange.Milky.Entity.Event;
5+
6+
public class FriendRequestEvent(long time, long selfId, FriendRequestEventData data) : EventBase<FriendRequestEventData>(time, selfId, "friend_request", data) { }
7+
8+
public class FriendRequestEventData(string initiatorUid, long initiatorId, string comment, string via)
9+
{
10+
[JsonPropertyName("initiator_uid")]
11+
public string InitiatorUID { get; } = initiatorUid;
12+
[JsonPropertyName("initiator_id")]
13+
public long InitiatorID { get; } = initiatorId;
14+
[JsonPropertyName("comment")]
15+
public string Comment { get; } = comment;
16+
[JsonPropertyName("via")]
17+
public string Via { get; } = via;
18+
}

Lagrange.Milky/Event/EventService.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public Task StartAsync(CancellationToken token)
3131
_bot.EventInvoker.RegisterEvent<LgrEvents.BotMessageEvent>(HandleMessageEvent);
3232
_bot.EventInvoker.RegisterEvent<LgrEvents.BotGroupNudgeEvent>(HandleGroupNudgeEvent);
3333
_bot.EventInvoker.RegisterEvent<LgrEvents.BotGroupMemberDecreaseEvent>(HandleGroupMemberDecreaseEvent);
34+
_bot.EventInvoker.RegisterEvent<LgrEvents.BotFriendRequestEvent>(HandleFriendRequestEvent);
3435

3536
return Task.CompletedTask;
3637
}
@@ -149,6 +150,32 @@ private void HandleGroupMemberDecreaseEvent(BotContext bot, LgrEvents.BotGroupMe
149150
}
150151
}
151152

153+
private void HandleFriendRequestEvent(BotContext bot, LgrEvents.BotFriendRequestEvent @event)
154+
{
155+
try
156+
{
157+
_logger.LogBotFriendRequestEvent(
158+
@event.InitiatorUid,
159+
@event.InitiatorUin,
160+
@event.Message,
161+
@event.Source
162+
);
163+
var result = _convert.FriendRequestEvent(@event);
164+
byte[] bytes = JsonUtility.SerializeToUtf8Bytes(result.GetType(), result);
165+
using (_lock.UsingReadLock())
166+
{
167+
foreach (var handler in _handlers)
168+
{
169+
handler(bytes);
170+
}
171+
}
172+
}
173+
catch (Exception e)
174+
{
175+
_logger.LogHandleEventException(nameof(LgrEvents.BotFriendRequestEvent), e);
176+
}
177+
}
178+
152179
public Task StopAsync(CancellationToken token)
153180
{
154181
// TODO: unregister
@@ -190,6 +217,9 @@ public static partial class EventServiceLoggerExtension
190217

191218
[LoggerMessage(EventId = 4, Level = LogLevel.Debug, Message = "BotGroupMemberDecreaseEvent {{ group: {group}, user: {user}, operator: {operator} }}")]
192219
public static partial void LogGroupMemberDecreaseEvent(this ILogger<EventService> logger, long group, long user, long? @operator);
220+
221+
[LoggerMessage(EventId = 5, Level = LogLevel.Debug, Message = "BotFriendRequestEvent {{ request: {request}, user: {user}, message: {message}, source: {source} }}")]
222+
public static partial void LogBotFriendRequestEvent(this ILogger<EventService> logger, string request, long user, string? message, string? source);
193223

194224
[LoggerMessage(EventId = 999, Level = LogLevel.Error, Message = "Handle {event} exception")]
195225
public static partial void LogHandleEventException(this ILogger<EventService> logger, string @event, Exception e);

Lagrange.Milky/Utility/EntityConvert.Event.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,11 @@ public partial class EntityConvert
2929
_bot.BotUin,
3030
new GroupMemberDecreaseEventData(@event.GroupUin, @event.UserUin, @event.OperatorUin == 0 ? null : @event.OperatorUin)
3131
);
32+
33+
public FriendRequestEvent FriendRequestEvent(LgrEventArgs.BotFriendRequestEvent @event) => new(
34+
@event.EventTime.ToUnixTimeSeconds(),
35+
_bot.BotUin,
36+
new FriendRequestEventData(@event.InitiatorUid, @event.InitiatorUin,
37+
@event.Message, @event.Source)
38+
);
3239
}

Lagrange.Milky/Utility/JsonUtility.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ public static partial class JsonUtility
108108
[JsonSerializable(typeof(GroupNudgeEvent))]
109109
// group_member_decrease
110110
[JsonSerializable(typeof(GroupMemberDecreaseEvent))]
111+
// friend_request
112+
[JsonSerializable(typeof(FriendRequestEvent))]
111113
private partial class JsonContext : JsonSerializerContext;
112114

113115
public static string Serialize<T>(T value) where T : class

0 commit comments

Comments
 (0)