Catch exceptions when fetching group announcements and log with logger

This commit is contained in:
Him188 2021-07-05 15:03:44 +08:00
parent d2e35772d0
commit cf7b2a14a1
2 changed files with 34 additions and 16 deletions

View File

@ -26,6 +26,7 @@ import net.mamoe.mirai.internal.contact.info.MemberInfoImpl
import net.mamoe.mirai.internal.message.OfflineGroupImage import net.mamoe.mirai.internal.message.OfflineGroupImage
import net.mamoe.mirai.internal.network.context.BdhSession import net.mamoe.mirai.internal.network.context.BdhSession
import net.mamoe.mirai.internal.network.handler.NetworkHandler import net.mamoe.mirai.internal.network.handler.NetworkHandler
import net.mamoe.mirai.internal.network.handler.logger
import net.mamoe.mirai.internal.network.highway.ChannelKind import net.mamoe.mirai.internal.network.highway.ChannelKind
import net.mamoe.mirai.internal.network.highway.Highway import net.mamoe.mirai.internal.network.highway.Highway
import net.mamoe.mirai.internal.network.highway.ResourceKind.GROUP_IMAGE import net.mamoe.mirai.internal.network.highway.ResourceKind.GROUP_IMAGE
@ -41,6 +42,7 @@ import net.mamoe.mirai.internal.network.protocol.packet.list.ProfileService
import net.mamoe.mirai.internal.utils.GroupPkgMsgParsingCache import net.mamoe.mirai.internal.utils.GroupPkgMsgParsingCache
import net.mamoe.mirai.internal.utils.RemoteFileImpl import net.mamoe.mirai.internal.utils.RemoteFileImpl
import net.mamoe.mirai.internal.utils.io.serialization.toByteArray import net.mamoe.mirai.internal.utils.io.serialization.toByteArray
import net.mamoe.mirai.internal.utils.subLogger
import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.* import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
@ -93,7 +95,12 @@ internal class GroupImpl(
} }
}) })
override val announcements: Announcements by lazy { AnnouncementsImpl(this) } override val announcements: Announcements by lazy {
AnnouncementsImpl(
this,
bot.network.logger.subLogger("Group $id")
)
}
val groupPkgMsgParsingCache = GroupPkgMsgParsingCache() val groupPkgMsgParsingCache = GroupPkgMsgParsingCache()

View File

@ -30,25 +30,40 @@ import net.mamoe.mirai.internal.contact.GroupImpl
import net.mamoe.mirai.internal.contact.OnlineAnnouncementImpl import net.mamoe.mirai.internal.contact.OnlineAnnouncementImpl
import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.deleteGroupAnnouncement import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.deleteGroupAnnouncement
import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.getGroupAnnouncement import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.getGroupAnnouncement
import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.getRawGroupAnnouncements
import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.sendGroupAnnouncement
import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.toAnnouncement import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.toAnnouncement
import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.toGroupAnnouncement import net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.toGroupAnnouncement
import net.mamoe.mirai.internal.network.psKey import net.mamoe.mirai.internal.network.psKey
import net.mamoe.mirai.internal.network.sKey import net.mamoe.mirai.internal.network.sKey
import net.mamoe.mirai.internal.utils.io.writeResource import net.mamoe.mirai.internal.utils.io.writeResource
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.Either.Companion.onLeft
import net.mamoe.mirai.utils.Either.Companion.rightOrNull import net.mamoe.mirai.utils.Either.Companion.rightOrNull
import java.util.stream.Stream import java.util.stream.Stream
internal class AnnouncementsImpl( internal class AnnouncementsImpl(
private val group: GroupImpl, private val group: GroupImpl,
private val logger: MiraiLogger,
) : Announcements { ) : Announcements {
inline val bot get() = group.bot inline val bot get() = group.bot
private suspend fun getGroupAnnouncementList(i: Int): GroupAnnouncementList? {
return bot.getRawGroupAnnouncements(group.id, i).onLeft {
if (logger.isEnabled) { // createException
logger.warning(
{ "Failed to load announcement for group ${group.id}" },
it.createException()
)
}
}.rightOrNull
}
override suspend fun asFlow(): Flow<OnlineAnnouncement> { override suspend fun asFlow(): Flow<OnlineAnnouncement> {
return flow { return flow {
var i = 1 var i = 1
while (true) { while (true) {
val result = AnnouncementProtocol.getRawGroupAnnouncements(bot, group.id, i++).rightOrNull ?: break val result = getGroupAnnouncementList(i++) ?: break
if (result.inst.isNullOrEmpty() && result.feeds.isNullOrEmpty()) break if (result.inst.isNullOrEmpty() && result.feeds.isNullOrEmpty()) break
@ -62,9 +77,7 @@ internal class AnnouncementsImpl(
return stream { return stream {
var i = 1 var i = 1
while (true) { while (true) {
val result = runBlocking { val result = runBlocking { getGroupAnnouncementList(i++) } ?: break
AnnouncementProtocol.getRawGroupAnnouncements(bot, group.id, i++)
}.rightOrNull ?: break
if (result.inst.isNullOrEmpty() && result.feeds.isNullOrEmpty()) break if (result.inst.isNullOrEmpty() && result.feeds.isNullOrEmpty()) break
@ -87,7 +100,7 @@ internal class AnnouncementsImpl(
val bot = group.bot val bot = group.bot
group.checkBotPermission(MemberPermission.ADMINISTRATOR) { "Only administrator have permission to send group announcement" } group.checkBotPermission(MemberPermission.ADMINISTRATOR) { "Only administrator have permission to send group announcement" }
val image = parameters.image val image = parameters.image
val fid = AnnouncementProtocol.sendGroupAnnouncement(bot, group.id, toGroupAnnouncement(bot.id), image) val fid = bot.sendGroupAnnouncement(group.id, toGroupAnnouncement(bot.id), image)
return OnlineAnnouncementImpl( return OnlineAnnouncementImpl(
group = group, group = group,
@ -148,12 +161,11 @@ internal object AnnouncementProtocol {
@SerialName("new_fid") val fid: String, @SerialName("new_fid") val fid: String,
) : CheckableResponseA(), JsonStruct ) : CheckableResponseA(), JsonStruct
suspend fun sendGroupAnnouncement( suspend fun QQAndroidBot.sendGroupAnnouncement(
bot: Bot,
groupId: Long, groupId: Long,
announcement: GroupAnnouncement, announcement: GroupAnnouncement,
image: AnnouncementImage?, image: AnnouncementImage?,
): String = bot.asQQAndroidBot().run { ): String {
return Mirai.Http.post<String> { return Mirai.Http.post<String> {
url("https://web.qun.qq.com/cgi-bin/announce/add_qun_notice") url("https://web.qun.qq.com/cgi-bin/announce/add_qun_notice")
body = MultiPartFormDataContent(formData { body = MultiPartFormDataContent(formData {
@ -172,15 +184,14 @@ internal object AnnouncementProtocol {
) )
append("format", "json") append("format", "json")
}) })
cookie("uin", "o${bot.id}") cookie("uin", "o$id")
cookie("p_uin", "o${bot.id}") cookie("p_uin", "o$id")
cookie("skey", sKey) cookie("skey", sKey)
cookie("p_skey", psKey("qun.qq.com")) cookie("p_skey", psKey("qun.qq.com"))
}.loadSafelyAs(SendGroupAnnouncementResp.serializer()).checked().fid }.loadSafelyAs(SendGroupAnnouncementResp.serializer()).checked().fid
} }
suspend fun getRawGroupAnnouncements( suspend fun QQAndroidBot.getRawGroupAnnouncements(
bot: QQAndroidBot,
groupId: Long, groupId: Long,
page: Int, page: Int,
amount: Int = 10 amount: Int = 10
@ -189,15 +200,15 @@ internal object AnnouncementProtocol {
url("https://web.qun.qq.com/cgi-bin/announce/list_announce") url("https://web.qun.qq.com/cgi-bin/announce/list_announce")
body = MultiPartFormDataContent(formData { body = MultiPartFormDataContent(formData {
append("qid", groupId) append("qid", groupId)
append("bkn", bot.bkn) append("bkn", bkn)
append("ft", 23) //好像是一个用来识别应用的参数 append("ft", 23) //好像是一个用来识别应用的参数
append("s", if (page == 1) 0 else -(page * amount + 1)) // 第一页这里的参数应该是-1 append("s", if (page == 1) 0 else -(page * amount + 1)) // 第一页这里的参数应该是-1
append("n", amount) append("n", amount)
append("ni", if (page == 1) 1 else 0) append("ni", if (page == 1) 1 else 0)
append("format", "json") append("format", "json")
}) })
cookie("uin", "o${bot.id}") cookie("uin", "o$id")
cookie("skey", bot.sKey) cookie("skey", sKey)
}.loadSafelyAs(GroupAnnouncementList.serializer()) }.loadSafelyAs(GroupAnnouncementList.serializer())
} }