Skip to content

Commit a55157a

Browse files
authored
[Core & Milky] Implement group_invitation event (#40)
1 parent ba8fe02 commit a55157a

8 files changed

Lines changed: 159 additions & 0 deletions

File tree

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace Lagrange.Core.Events.EventArgs;
2+
3+
public class BotGroupInviteSelfEvent(long invitationSeq, long initiatorUin, long groupUin) : EventBase
4+
{
5+
public long InvitationSeq { get; } = invitationSeq;
6+
7+
public long InitiatorUin { get; } = initiatorUin;
8+
9+
public long GroupUin { get; } = groupUin;
10+
11+
public override string ToEventMessage()
12+
{
13+
return $"{nameof(BotGroupInviteSelfEvent)}: InvitationSeq: {InvitationSeq}, InitiatorUin: {InitiatorUin}, GroupUin: {GroupUin}";
14+
}
15+
}

Lagrange.Core/Internal/Logic/PushLogic.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
using System.Text.Json;
2+
using System.Web;
13
using Lagrange.Core.Common;
24
using Lagrange.Core.Common.Entity;
35
using Lagrange.Core.Events.EventArgs;
46
using Lagrange.Core.Internal.Events;
57
using Lagrange.Core.Internal.Events.Message;
68
using Lagrange.Core.Internal.Events.System;
79
using Lagrange.Core.Internal.Packets.Notify;
10+
using Lagrange.Core.Message.Entities;
811
using Lagrange.Core.Utility.Binary;
912
using ProtoHelper = Lagrange.Core.Utility.ProtoHelper;
1013

@@ -24,6 +27,23 @@ public async ValueTask Incoming(ProtocolEvent e)
2427
case Type.TempMessage:
2528
{
2629
var message = await context.EventContext.GetLogic<MessagingLogic>().Parse(messageEvent.MsgPush.CommonMessage);
30+
if (message.Entities[0] is LightAppEntity {AppName: "com.tencent.qun.invite"} || message.Entities[0] is LightAppEntity {AppName: "com.tencent.tuwen.lua"})
31+
{
32+
var app = (LightAppEntity)message.Entities[0];
33+
using var document = JsonDocument.Parse(app.Payload);
34+
var root = document.RootElement;
35+
36+
string url = root.GetProperty("meta").GetProperty("news").GetProperty("jumpUrl").GetString() ?? throw new Exception("sb tx! Is this 'com.tencent.qun.invite' or 'com.tencent.tuwen.lua'?");
37+
var query = HttpUtility.ParseQueryString(new Uri(url).Query);
38+
long groupUin = uint.Parse(query["groupcode"] ?? throw new Exception("sb tx! Is this '/group/invite_join'?"));
39+
long sequence = long.Parse(query["msgseq"] ?? throw new Exception("sb tx! Is this '/group/invite_join'?"));
40+
context.EventInvoker.PostEvent(new BotGroupInviteSelfEvent(
41+
sequence,
42+
message.Contact.Uin,
43+
groupUin
44+
));
45+
break;
46+
}
2747
context.EventInvoker.PostEvent(new BotMessageEvent(message, messageEvent.Raw));
2848
break;
2949
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using System.Text;
2+
using System.Text.Json.Nodes;
3+
using Lagrange.Core.Internal.Packets.Message;
4+
using Lagrange.Core.Utility.Binary;
5+
using Lagrange.Core.Utility.Compression;
6+
7+
namespace Lagrange.Core.Message.Entities;
8+
9+
public class LightAppEntity : IMessageEntity
10+
{
11+
public string AppName { get; set; } = string.Empty;
12+
13+
public string Payload { get; set; } = string.Empty;
14+
15+
public LightAppEntity() { }
16+
17+
public LightAppEntity(string payload)
18+
{
19+
Payload = payload;
20+
string? app = JsonNode.Parse(payload)?["app"]?.ToString();
21+
if (app != null) AppName = app;
22+
}
23+
24+
Elem[] IMessageEntity.Build()
25+
{
26+
using var payload = new BinaryPacket();
27+
payload.Write<byte>(0x01);
28+
payload.Write(ZCompression.ZCompress(Encoding.UTF8.GetBytes(Payload)));
29+
30+
return new Elem[]
31+
{
32+
new()
33+
{
34+
LightAppElem = new LightAppElem
35+
{
36+
BytesData = payload.ToArray()
37+
}
38+
}
39+
};
40+
}
41+
42+
IMessageEntity? IMessageEntity.Parse(List<Elem> elems, Elem target)
43+
{
44+
if (target.LightAppElem is { } lightApp)
45+
{
46+
var payload = ZCompression.ZDecompress(lightApp.BytesData.Span.Slice(1), false);
47+
string json = Encoding.UTF8.GetString(payload);
48+
string? app = JsonNode.Parse(json)?["app"]?.ToString();
49+
50+
if (app != null)
51+
{
52+
return new LightAppEntity
53+
{
54+
AppName = app,
55+
Payload = json
56+
};
57+
}
58+
}
59+
60+
return null;
61+
}
62+
63+
public string ToPreviewString()
64+
{
65+
return $"[{nameof(LightAppEntity)}: {AppName}]";
66+
}
67+
}
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+
3+
namespace Lagrange.Milky.Entity.Event;
4+
5+
6+
public class GroupInvitationEvent(long time, long selfId, GroupInvitationEventData data) : EventBase<GroupInvitationEventData>(time, selfId, "group_invitation", data) { }
7+
8+
public class GroupInvitationEventData(long invitationSeq, long initiatorId, long groupId)
9+
{
10+
[JsonPropertyName("invitation_seq")]
11+
public long InvitationSeq { get; } = invitationSeq;
12+
13+
[JsonPropertyName("initiator_id")]
14+
public long InitiatorID { get; } = initiatorId;
15+
16+
[JsonPropertyName("group_id")]
17+
public long GroupID { get; } = groupId;
18+
}

Lagrange.Milky/Event/EventService.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public Task StartAsync(CancellationToken token)
3232
_bot.EventInvoker.RegisterEvent<LgrEvents.BotGroupNudgeEvent>(HandleGroupNudgeEvent);
3333
_bot.EventInvoker.RegisterEvent<LgrEvents.BotGroupMemberDecreaseEvent>(HandleGroupMemberDecreaseEvent);
3434
_bot.EventInvoker.RegisterEvent<LgrEvents.BotFriendRequestEvent>(HandleFriendRequestEvent);
35+
_bot.EventInvoker.RegisterEvent<LgrEvents.BotGroupInviteSelfEvent>(HandleGroupInvitationEvent);
3536

3637
return Task.CompletedTask;
3738
}
@@ -175,6 +176,31 @@ private void HandleFriendRequestEvent(BotContext bot, LgrEvents.BotFriendRequest
175176
_logger.LogHandleEventException(nameof(LgrEvents.BotFriendRequestEvent), e);
176177
}
177178
}
179+
180+
private void HandleGroupInvitationEvent(BotContext bot, LgrEvents.BotGroupInviteSelfEvent @event)
181+
{
182+
try
183+
{
184+
_logger.LogGroupInvitationEvent(
185+
@event.InvitationSeq,
186+
@event.InitiatorUin,
187+
@event.GroupUin
188+
);
189+
var result = _convert.GroupInvitationEvent(@event);
190+
byte[] bytes = JsonUtility.SerializeToUtf8Bytes(result.GetType(), result);
191+
using (_lock.UsingReadLock())
192+
{
193+
foreach (var handler in _handlers)
194+
{
195+
handler(bytes);
196+
}
197+
}
198+
}
199+
catch (Exception e)
200+
{
201+
_logger.LogHandleEventException(nameof(LgrEvents.BotGroupInviteSelfEvent), e);
202+
}
203+
}
178204

179205
public Task StopAsync(CancellationToken token)
180206
{
@@ -220,6 +246,9 @@ public static partial class EventServiceLoggerExtension
220246

221247
[LoggerMessage(EventId = 5, Level = LogLevel.Debug, Message = "BotFriendRequestEvent {{ request: {request}, user: {user}, message: {message}, source: {source} }}")]
222248
public static partial void LogBotFriendRequestEvent(this ILogger<EventService> logger, string request, long user, string? message, string? source);
249+
250+
[LoggerMessage(EventId = 6, Level = LogLevel.Debug, Message = "BotGroupInviteEvent {{ request: {request}, user: {user}, group: {group} }}")]
251+
public static partial void LogGroupInvitationEvent(this ILogger<EventService> logger, long request, long user, long group);
223252

224253
[LoggerMessage(EventId = 999, Level = LogLevel.Error, Message = "Handle {event} exception")]
225254
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
@@ -36,4 +36,11 @@ public partial class EntityConvert
3636
new FriendRequestEventData(@event.InitiatorUid, @event.InitiatorUin,
3737
@event.Message, @event.Source)
3838
);
39+
40+
public GroupInvitationEvent GroupInvitationEvent(LgrEventArgs.BotGroupInviteSelfEvent @event) => new(
41+
@event.EventTime.ToUnixTimeSeconds(),
42+
_bot.BotUin,
43+
new GroupInvitationEventData(@event.InvitationSeq,
44+
@event.InitiatorUin, @event.GroupUin)
45+
);
3946
}

Lagrange.Milky/Utility/EntityConvert.Segment.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public async Task<MessageChain> FakeSegmentsAsync(IReadOnlyList<IOutgoingSegment
7171
(int)video.VideoLength
7272
),
7373
MultiMsgEntity multiMsg => new ForwardIncomingSegment(multiMsg.ResId!),
74+
LightAppEntity lightApp => new LightAppIncomingSegment(lightApp.AppName, lightApp.Payload),
7475
// ? => new MarketFaceSegment(...),
7576
// ? => new LightAppSegment(...),
7677
// ? => new XmlSegment(...),

Lagrange.Milky/Utility/JsonUtility.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ public static partial class JsonUtility
110110
[JsonSerializable(typeof(GroupMemberDecreaseEvent))]
111111
// friend_request
112112
[JsonSerializable(typeof(FriendRequestEvent))]
113+
// group_invitation
114+
[JsonSerializable(typeof(GroupInvitationEvent))]
113115
private partial class JsonContext : JsonSerializerContext;
114116

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

0 commit comments

Comments
 (0)