Skip to content

Commit 2ec1cdc

Browse files
authored
[Core & Milky] Implement group_nudge Event (#18)
1 parent c3d71d3 commit 2ec1cdc

11 files changed

Lines changed: 342 additions & 2 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 BotGroupNudgeEvent(Int64 groupUin, Int64 operatorUin, Int64 targetUin) : EventBase
4+
{
5+
public Int64 GroupUin { get; } = groupUin;
6+
7+
public Int64 OperatorUin { get; } = operatorUin;
8+
9+
public Int64 TargetUin { get; } = targetUin;
10+
11+
public override string ToEventMessage()
12+
{
13+
return $"{nameof(BotGroupNudgeEvent)}: GroupUin={GroupUin}, OperatorUin={OperatorUin}, TargetUin={TargetUin}";
14+
}
15+
}

Lagrange.Core/Internal/Logic/PushLogic.cs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
using Lagrange.Core.Events.EventArgs;
33
using Lagrange.Core.Internal.Events;
44
using Lagrange.Core.Internal.Events.Message;
5+
using Lagrange.Core.Internal.Packets.Notify;
6+
using Lagrange.Core.Utility.Binary;
7+
using ProtoHelper = Lagrange.Core.Utility.ProtoHelper;
58

69
namespace Lagrange.Core.Internal.Logic;
710

@@ -20,6 +23,34 @@ public async ValueTask Incoming(ProtocolEvent e)
2023
var message = await context.EventContext.GetLogic<MessagingLogic>().Parse(messageEvent.MsgPush.CommonMessage);
2124
context.EventInvoker.PostEvent(new BotMessageEvent(message, messageEvent.Raw));
2225
break;
26+
case Type.Event0x2DC:
27+
var pkgType = (Event0x2DCSubType)messageEvent.MsgPush.CommonMessage.ContentHead.SubType;
28+
switch (pkgType)
29+
{
30+
case Event0x2DCSubType.GroupGreyTipNotice20 when messageEvent.MsgPush.CommonMessage.MessageBody.MsgContent is {} content:
31+
var packet = new BinaryPacket(content);
32+
Int64 groupUin = packet.Read<Int32>(); // group uin
33+
_ = packet.Read<byte>(); // unknown byte
34+
var proto = packet.ReadBytes(Prefix.Int16 | Prefix.LengthOnly);
35+
var greyTip = ProtoHelper.Deserialize<NotifyMessageBody>(proto);
36+
var templates = greyTip.GeneralGrayTip.MsgTemplParam.ToDictionary(x => x.Name, x => x.Value);
37+
38+
if (!templates.TryGetValue("action_str", out var actionStr) && !templates.TryGetValue("alt_str1", out actionStr))
39+
{
40+
actionStr = string.Empty;
41+
}
42+
43+
if (greyTip.GeneralGrayTip.BusiType == 12) // poke
44+
{
45+
context.EventInvoker.PostEvent(new BotGroupNudgeEvent(
46+
groupUin,
47+
uint.Parse(templates["uin_str1"]),
48+
uint.Parse(templates["uin_str2"]))
49+
);
50+
}
51+
break;
52+
}
53+
break;
2354
}
2455
}
2556

@@ -28,5 +59,24 @@ private enum Type
2859
PrivateMessage = 166,
2960
GroupMessage = 82,
3061
TempMessage = 141,
62+
Event0x210 = 528, // friend related event
63+
Event0x2DC = 732, // group related event
64+
}
65+
66+
private enum Event0x2DCSubType
67+
{
68+
GroupMuteNotice = 12,
69+
SubType16 = 16,
70+
GroupRecallNotice = 17,
71+
GroupGreyTipNotice21 = 21,
72+
GroupGreyTipNotice20 = 20,
73+
}
74+
75+
private enum Event0x2DCSubType16Field13
76+
{
77+
GroupMemberSpecialTitleNotice = 6,
78+
GroupNameChangeNotice = 12,
79+
GroupTodoNotice = 23,
80+
GroupReactionNotice = 35,
3181
}
32-
}
82+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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 EssenceMessage
9+
{
10+
[ProtoMember(1)] public long GroupUin;
11+
12+
[ProtoMember(2)] public long MsgSequence;
13+
14+
[ProtoMember(3)] public uint Random;
15+
16+
[ProtoMember(4)] public uint SetFlag; // set 1 remove 2
17+
18+
[ProtoMember(5)] public uint MemberUin;
19+
20+
[ProtoMember(6)] public uint OperatorUin;
21+
22+
[ProtoMember(7)] public uint TimeStamp;
23+
24+
[ProtoMember(8)] public uint MsgSequence2; // removed 0
25+
26+
[ProtoMember(9)] public string OperatorNickName;
27+
28+
[ProtoMember(10)] public string MemberNickName;
29+
30+
[ProtoMember(11)] public uint SetFlag2;
31+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 GroupReactionData0
9+
{
10+
[ProtoMember(1)] public GroupReactionData1 Data { get; set; }
11+
}
12+
13+
[ProtoPackable]
14+
internal partial class GroupReactionData1
15+
{
16+
[ProtoMember(1)] public GroupReactionData2 Data { get; set; }
17+
}
18+
19+
[ProtoPackable]
20+
internal partial class GroupReactionData2
21+
{
22+
[ProtoMember(2)] public GroupReactionTarget Target { get; set; }
23+
24+
[ProtoMember(3)] public GroupReactionData3 Data { get; set; }
25+
}
26+
27+
[ProtoPackable]
28+
internal partial class GroupReactionTarget
29+
{
30+
[ProtoMember(1)] public long Sequence { get; set; }
31+
}
32+
33+
[ProtoPackable]
34+
internal partial class GroupReactionData3
35+
{
36+
[ProtoMember(1)] public string Code { get; set; }
37+
38+
[ProtoMember(3)] public uint Count { get; set; }
39+
40+
[ProtoMember(4)] public string OperatorUid { get; set; }
41+
42+
[ProtoMember(5)] public uint Type { get; set; } // 1 Add 2 Remove
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 GroupRecall
9+
{
10+
[ProtoMember(1)] public string? OperatorUid { get; set; }
11+
12+
[ProtoMember(3)] public List<RecallMessage> RecallMessages { get; set; }
13+
14+
[ProtoMember(5)] public byte[] UserDef { get; set; }
15+
16+
[ProtoMember(6)] public int GroupType { get; set; }
17+
18+
[ProtoMember(7)] public int OpType { get; set; }
19+
20+
[ProtoMember(9)] public GroupRecallTipInfo? TipInfo { get; set; }
21+
}
22+
23+
[ProtoPackable]
24+
internal partial class RecallMessage
25+
{
26+
[ProtoMember(1)] public uint Sequence { get; set; }
27+
28+
[ProtoMember(2)] public uint Time { get; set; }
29+
30+
[ProtoMember(3)] public uint Random { get; set; }
31+
32+
[ProtoMember(4)] public uint Type { get; set; }
33+
34+
[ProtoMember(5)] public uint Flag { get; set; }
35+
36+
[ProtoMember(6)] public string AuthorUid { get; set; }
37+
}
38+
39+
[ProtoPackable]
40+
internal partial class GroupRecallTipInfo
41+
{
42+
[ProtoMember(2)] public string Tip { get; set; }
43+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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 GroupRecallNudge
9+
{
10+
[ProtoMember(1)] public string OperatorUid { get; set; }
11+
12+
[ProtoMember(3)] public long GroupUin { get; set; }
13+
14+
[ProtoMember(4)] public ulong BusiId { get; set; }
15+
16+
[ProtoMember(5)] public ulong TipsSeqId { get; set; }
17+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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 NotifyMessageBody
9+
{
10+
[ProtoMember(1)] public uint Type { get; set; }
11+
12+
[ProtoMember(4)] public long GroupUin { get; set; }
13+
14+
[ProtoMember(5)] public byte[]? EventParam { get; set; }
15+
16+
[ProtoMember(11)] public GroupRecall Recall { get; set; }
17+
18+
[ProtoMember(13)] public uint? Field13 { get; set; }
19+
20+
[ProtoMember(21)] public string OperatorUid { get; set; }
21+
22+
[ProtoMember(26)] public GeneralGrayTipInfo GeneralGrayTip { get; set; }
23+
24+
[ProtoMember(33)] public EssenceMessage EssenceMessage;
25+
26+
[ProtoMember(37)] public long MsgSequence { get; set; }
27+
28+
[ProtoMember(39)] public uint Field39 { get; set; }
29+
30+
[ProtoMember(40)] public GroupRecallNudge GroupRecallNudge { get; set; }
31+
32+
[ProtoMember(44)] public GroupReactionData0 Reaction { get; set; }
33+
34+
[ProtoMember(50)] public ulong TipsSeqId { get; set; }
35+
}
36+
37+
[ProtoPackable]
38+
internal partial class GeneralGrayTipInfo
39+
{
40+
[ProtoMember(1)] public ulong BusiType { get; set; }
41+
42+
[ProtoMember(2)] public ulong BusiId { get; set; }
43+
44+
[ProtoMember(3)] public uint CtrlFlag { get; set; }
45+
46+
[ProtoMember(4)] public uint C2CType { get; set; }
47+
48+
[ProtoMember(5)] public uint ServiceType { get; set; }
49+
50+
[ProtoMember(6)] public ulong TemplId { get; set; }
51+
52+
[ProtoMember(7)] public List<TemplParam> MsgTemplParam { get; set; }
53+
54+
[ProtoMember(8)] public string Content { get; set; }
55+
56+
[ProtoMember(10)] public ulong TipsSeqId { get; set; }
57+
58+
[ProtoMember(100)] public GrayTipMsgInfo MsgInfo { get; set; }
59+
}
60+
61+
[ProtoPackable]
62+
internal partial class GrayTipMsgInfo
63+
{
64+
[ProtoMember(6)] public ulong Sequence { get; set; }
65+
}
66+
67+
[ProtoPackable]
68+
internal partial class TemplParam
69+
{
70+
[ProtoMember(1)] public string Name { get; set; }
71+
72+
[ProtoMember(2)] public string Value { get; set; }
73+
}
74+
75+
[ProtoPackable]
76+
internal partial class FriendRecallPokeInfo
77+
{
78+
[ProtoMember(1)] public string SelfUid { get; set; }
79+
80+
[ProtoMember(2)] public string PeerUid { get; set; }
81+
82+
[ProtoMember(3)] public string OperatorUid { get; set; }
83+
84+
[ProtoMember(4)] public ulong BusiId { get; set; }
85+
86+
[ProtoMember(5)] public ulong TipsSeqId { get; set; }
87+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace Lagrange.Milky.Entity.Event;
4+
5+
public class GroupNudgeEvent(long time, long selfId, GroupNudgeEventData data) : EventBase<GroupNudgeEventData>(time, selfId, "group_nudge", data) { }
6+
7+
public class GroupNudgeEventData(Int64 groupID, Int64 sender_id, Int64 receiver_id)
8+
{
9+
[JsonPropertyName("group_id")]
10+
public Int64 GroupID { get; } = groupID;
11+
12+
[JsonPropertyName("sender_id")]
13+
public Int64 SenderID { get; } = sender_id;
14+
15+
[JsonPropertyName("receiver_id")]
16+
public Int64 ReceiverID { get; } = receiver_id;
17+
}

Lagrange.Milky/Event/EventService.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public Task StartAsync(CancellationToken token)
2929
{
3030
_bot.EventInvoker.RegisterEvent<LgrEvents.BotOfflineEvent>(HandleOfflineEvent);
3131
_bot.EventInvoker.RegisterEvent<LgrEvents.BotMessageEvent>(HandleMessageEvent);
32+
_bot.EventInvoker.RegisterEvent<LgrEvents.BotGroupNudgeEvent>(HandleGroupNudgeEvent);
3233

3334
return Task.CompletedTask;
3435
}
@@ -96,6 +97,31 @@ private void HandleMessageEvent(BotContext bot, LgrEvents.BotMessageEvent @event
9697
_logger.LogHandleEventException(nameof(LgrEvents.BotMessageEvent), e);
9798
}
9899
}
100+
101+
private void HandleGroupNudgeEvent(BotContext bot, LgrEvents.BotGroupNudgeEvent @event)
102+
{
103+
try
104+
{
105+
_logger.LogGroupNudgeEvent(
106+
@event.GroupUin,
107+
@event.OperatorUin,
108+
@event.TargetUin
109+
);
110+
var result = _convert.GroupNudgeEvent(@event);
111+
byte[] bytes = JsonUtility.SerializeToUtf8Bytes(result.GetType(), result);
112+
using (_lock.UsingReadLock())
113+
{
114+
foreach (var handler in _handlers)
115+
{
116+
handler(bytes);
117+
}
118+
}
119+
}
120+
catch (Exception e)
121+
{
122+
_logger.LogHandleEventException(nameof(LgrEvents.BotGroupNudgeEvent), e);
123+
}
124+
}
99125

100126
public Task StopAsync(CancellationToken token)
101127
{
@@ -132,6 +158,9 @@ public static partial class EventServiceLoggerExtension
132158

133159
[LoggerMessage(EventId = 2, Level = LogLevel.Debug, Message = "BotMessageEvent {{ {type} {sender} {entities} }}")]
134160
public static partial void LogPrivateMessage(this ILogger<EventService> logger, MessageType type, long sender, string entities);
161+
162+
[LoggerMessage(EventId = 3, Level = LogLevel.Debug, Message = "BotGroupNudgeEvent {{ group: {group}, sender: {sender} target: {target} }}")]
163+
public static partial void LogGroupNudgeEvent(this ILogger<EventService> logger, long group, long sender, long target);
135164

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

Lagrange.Milky/Utility/EntityConvert.Event.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,10 @@ public partial class EntityConvert
1717
_bot.BotUin,
1818
MessageBase(@event.Message)
1919
);
20-
}
20+
21+
public GroupNudgeEvent GroupNudgeEvent(LgrEventArgs.BotGroupNudgeEvent @event) => new(
22+
@event.EventTime.ToUnixTimeSeconds(),
23+
_bot.BotUin,
24+
new GroupNudgeEventData(@event.GroupUin, @event.OperatorUin, @event.TargetUin)
25+
);
26+
}

0 commit comments

Comments
 (0)