Skip to content

Commit c016b82

Browse files
authored
[core] 修复群公告查询已阅读人员列表只能获取前 50 个的问题 (#2530)
1 parent 28b1032 commit c016b82

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

mirai-core/src/commonMain/kotlin/contact/announcement/AnnouncementsImpl.kt

+30-5
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,27 @@ internal abstract class CommonAnnouncementsImpl(
148148

149149
override suspend fun members(fid: String, confirmed: Boolean): List<NormalMember> {
150150
group.checkBotPermission(MemberPermission.ADMINISTRATOR) { "Only administrator have permission see announcement confirmed detail" }
151-
val detail = bot.getReadDetail(groupId = group.id, fid = fid, read = confirmed)
152-
return detail.users.mapNotNull { user -> group[user.uin] }
151+
val flow = flow<NormalMember> {
152+
var offset = 0
153+
while (true) {
154+
val detail = bot.getReadDetail(
155+
groupId = group.id,
156+
fid = fid,
157+
read = confirmed,
158+
offset = offset,
159+
limit = 50
160+
)
161+
if (detail.users.isEmpty()) break
162+
for (user in detail.users) {
163+
val member = group[user.uin] ?: continue
164+
emit(member)
165+
}
166+
offset += detail.users.size
167+
val target = if (confirmed) detail.readTotal else detail.unreadTotal
168+
if (offset == target) break
169+
}
170+
}
171+
return flow.toList()
153172
}
154173

155174
override suspend fun remind(fid: String) {
@@ -318,12 +337,18 @@ internal object AnnouncementProtocol {
318337
private fun <T> CgiData.loadData(serializer: KSerializer<T>): T =
319338
defaultJson.decodeFromJsonElement(serializer, this.data)
320339

321-
suspend fun QQAndroidBot.getReadDetail(groupId: Long, fid: String, read: Boolean): GroupAnnouncementReadDetail {
340+
suspend fun QQAndroidBot.getReadDetail(
341+
groupId: Long,
342+
fid: String,
343+
read: Boolean,
344+
offset: Int,
345+
limit: Int
346+
): GroupAnnouncementReadDetail {
322347
val cgi = bot.components[HttpClientProvider].getHttpClient().post {
323348
url("https://qun.qq.com/cgi-bin/qunapp/announce_unread")
324349
parameter("gc", groupId)
325-
parameter("start", 0)
326-
parameter("num", 3000)
350+
parameter("start", offset)
351+
parameter("num", limit)
327352
parameter("feed_id", fid)
328353
parameter("type", if (read) 1 else 0)
329354
parameter("bkn", client.wLoginSigInfo.bkn)

0 commit comments

Comments
 (0)