Skip to content

Commit cede4ef

Browse files
authored
[Core & Milky] Implement group_member_decrease Event (#23)
1 parent 6359667 commit cede4ef

8 files changed

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

Lagrange.Core/Internal/Context/CacheContext.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ public async Task<List<BotFriendCategory>> GetCategories(bool refresh = false)
9090
}
9191

9292
public string? ResolveCachedUid(long uin) => _uinToUid.GetValueOrDefault(uin);
93+
94+
public long? ResolveCachedUin(string uid) => _uinToUid.FirstOrDefault(kvp => kvp.Value == uid).Key;
9395

9496
/// <summary>
9597
/// Fetches the friends list from the server.

Lagrange.Core/Internal/Logic/PushLogic.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Text;
12
using Lagrange.Core.Common;
23
using Lagrange.Core.Events.EventArgs;
34
using Lagrange.Core.Internal.Events;
@@ -23,6 +24,30 @@ public async ValueTask Incoming(ProtocolEvent e)
2324
var message = await context.EventContext.GetLogic<MessagingLogic>().Parse(messageEvent.MsgPush.CommonMessage);
2425
context.EventInvoker.PostEvent(new BotMessageEvent(message, messageEvent.Raw));
2526
break;
27+
case Type.GroupMemberDecreaseNotice when messageEvent.MsgPush.CommonMessage.MessageBody.MsgContent is { } content:
28+
var decrease = ProtoHelper.Deserialize<GroupChange>(content.Span);
29+
if (decrease.DecreaseType == 3)
30+
{
31+
var op = ProtoHelper.Deserialize<OperatorInfo>(decrease.Operator.AsSpan());
32+
context.EventInvoker.PostEvent(
33+
new BotGroupMemberDecreaseEvent(
34+
decrease.GroupUin,
35+
context.CacheContext.ResolveCachedUin(decrease.MemberUid) ?? 0,
36+
context.CacheContext.ResolveCachedUin(op.Operator.Uid ?? "") ?? 0
37+
)
38+
);
39+
}
40+
else
41+
{
42+
context.EventInvoker.PostEvent(
43+
new BotGroupMemberDecreaseEvent(
44+
decrease.GroupUin,
45+
context.CacheContext.ResolveCachedUin(decrease.MemberUid) ?? 0,
46+
context.CacheContext.ResolveCachedUin(Encoding.UTF8.GetString(decrease.Operator.AsSpan())) ?? 0
47+
)
48+
);
49+
}
50+
break;
2651
case Type.Event0x2DC:
2752
var pkgType = (Event0x2DCSubType)messageEvent.MsgPush.CommonMessage.ContentHead.SubType;
2853
switch (pkgType)
@@ -61,6 +86,8 @@ private enum Type
6186
TempMessage = 141,
6287
Event0x210 = 528, // friend related event
6388
Event0x2DC = 732, // group related event
89+
90+
GroupMemberDecreaseNotice = 34,
6491
}
6592

6693
private enum Event0x2DCSubType
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 GroupChange
9+
{
10+
[ProtoMember(1)] public uint GroupUin { get; set; }
11+
12+
[ProtoMember(2)] public uint Flag { get; set; }
13+
14+
[ProtoMember(3)] public string MemberUid { get; set; }
15+
16+
[ProtoMember(4)] public uint DecreaseType { get; set; } // 131 Kick 130 Exit
17+
18+
[ProtoMember(5)] public byte[]? Operator { get; set; }
19+
20+
[ProtoMember(6)] public uint IncreaseType { get; set; }
21+
22+
[ProtoMember(7)] public byte[]? Field7 { get; set; }
23+
}
24+
25+
[ProtoPackable]
26+
internal partial class OperatorInfo
27+
{
28+
[ProtoMember(1)] public OperatorField1 Operator { get; set; }
29+
}
30+
31+
[ProtoPackable]
32+
internal partial class OperatorField1
33+
{
34+
[ProtoMember(1)] public string? Uid { get; set; }
35+
36+
[ProtoMember(2)] public uint Field2 { get; set; }
37+
38+
[ProtoMember(3)] public byte[]? Field3 { get; set; }
39+
40+
[ProtoMember(4)] public uint Field4 { get; set; }
41+
42+
[ProtoMember(5)] public byte[]? Field5 { get; set; }
43+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace Lagrange.Milky.Entity.Event;
4+
5+
public class GroupMemberDecreaseEvent(long time, long selfId, GroupMemberDecreaseEventData data) : EventBase<GroupMemberDecreaseEventData>(time, selfId, "group_member_decrease", data) { }
6+
7+
public class GroupMemberDecreaseEventData(long groupId, long userId, long? operatorId)
8+
{
9+
[JsonPropertyName("group_id")]
10+
public long GroupId { get; } = groupId;
11+
[JsonPropertyName("user_id")]
12+
public long UserId { get; } = userId;
13+
[JsonPropertyName("operator_id")]
14+
public long? OperatorId { get; } = operatorId;
15+
}

Lagrange.Milky/Event/EventService.cs

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

3435
return Task.CompletedTask;
3536
}
@@ -122,6 +123,31 @@ private void HandleGroupNudgeEvent(BotContext bot, LgrEvents.BotGroupNudgeEvent
122123
_logger.LogHandleEventException(nameof(LgrEvents.BotGroupNudgeEvent), e);
123124
}
124125
}
126+
127+
private void HandleGroupMemberDecreaseEvent(BotContext bot, LgrEvents.BotGroupMemberDecreaseEvent @event)
128+
{
129+
try
130+
{
131+
_logger.LogGroupMemberDecreaseEvent(
132+
@event.GroupUin,
133+
@event.UserUin,
134+
@event.OperatorUin
135+
);
136+
var result = _convert.GroupMemberDecreaseEvent(@event);
137+
byte[] bytes = JsonUtility.SerializeToUtf8Bytes(result.GetType(), result);
138+
using (_lock.UsingReadLock())
139+
{
140+
foreach (var handler in _handlers)
141+
{
142+
handler(bytes);
143+
}
144+
}
145+
}
146+
catch (Exception e)
147+
{
148+
_logger.LogHandleEventException(nameof(LgrEvents.BotGroupMemberDecreaseEvent), e);
149+
}
150+
}
125151

126152
public Task StopAsync(CancellationToken token)
127153
{
@@ -161,6 +187,9 @@ public static partial class EventServiceLoggerExtension
161187

162188
[LoggerMessage(EventId = 3, Level = LogLevel.Debug, Message = "BotGroupNudgeEvent {{ group: {group}, sender: {sender} target: {target} }}")]
163189
public static partial void LogGroupNudgeEvent(this ILogger<EventService> logger, long group, long sender, long target);
190+
191+
[LoggerMessage(EventId = 4, Level = LogLevel.Debug, Message = "BotGroupMemberDecreaseEvent {{ group: {group}, user: {user}, operator: {operator} }}")]
192+
public static partial void LogGroupMemberDecreaseEvent(this ILogger<EventService> logger, long group, long user, long? @operator);
164193

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

Lagrange.Milky/Utility/EntityConvert.Event.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,10 @@ public partial class EntityConvert
2323
_bot.BotUin,
2424
new GroupNudgeEventData(@event.GroupUin, @event.OperatorUin, @event.TargetUin)
2525
);
26+
27+
public GroupMemberDecreaseEvent GroupMemberDecreaseEvent(LgrEventArgs.BotGroupMemberDecreaseEvent @event) => new(
28+
@event.EventTime.ToUnixTimeSeconds(),
29+
_bot.BotUin,
30+
new GroupMemberDecreaseEventData(@event.GroupUin, @event.UserUin, @event.OperatorUin == 0 ? null : @event.OperatorUin)
31+
);
2632
}

Lagrange.Milky/Utility/JsonUtility.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ public static partial class JsonUtility
106106
[JsonSerializable(typeof(MessageReceiveEvent))]
107107
// group_nudge
108108
[JsonSerializable(typeof(GroupNudgeEvent))]
109+
// group_member_decrease
110+
[JsonSerializable(typeof(GroupMemberDecreaseEvent))]
109111
private partial class JsonContext : JsonSerializerContext;
110112

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

0 commit comments

Comments
 (0)