mirror of
https://github.com/whitechi73/OpenShamrock.git
synced 2024-08-14 13:12:17 +08:00
Shamrock
: JSON メッセージのクラッシュと QQ ミュージックのカバーを修正
This commit is contained in:
parent
2fdcfe332b
commit
48773cc47c
@ -22,6 +22,7 @@ import moe.fuqiuluo.shamrock.helper.ContactHelper
|
||||
import moe.fuqiuluo.shamrock.helper.Level
|
||||
import moe.fuqiuluo.shamrock.helper.LogCenter
|
||||
import moe.fuqiuluo.shamrock.helper.MessageHelper
|
||||
import moe.fuqiuluo.shamrock.helper.SendMsgException
|
||||
import moe.fuqiuluo.shamrock.tools.EMPTY_BYTE_ARRAY
|
||||
import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher
|
||||
import moe.fuqiuluo.shamrock.xposed.helper.msgService
|
||||
@ -194,8 +195,10 @@ internal object MsgSvc: BaseSvc() {
|
||||
fromId,
|
||||
MessageCallback(peedId, 0)
|
||||
)
|
||||
return if (result.isFailure && retryCnt > 0) {
|
||||
// 可能网络问题出现红色感叹号,重试
|
||||
return if (result.isFailure
|
||||
&& result.exceptionOrNull()?.javaClass == SendMsgException::class.java
|
||||
&& retryCnt > 0) {
|
||||
// 发送失败,可能网络问题出现红色感叹号,重试
|
||||
// 例如 rich media transfer failed
|
||||
delay(100)
|
||||
sendToAio(chatType, peedId, message, fromId, retryCnt - 1)
|
||||
|
@ -22,6 +22,9 @@ import com.tencent.qqnt.kernel.nativeinterface.ReplyElement
|
||||
import com.tencent.qqnt.kernel.nativeinterface.RichMediaFilePathInfo
|
||||
import com.tencent.qqnt.kernel.nativeinterface.TextElement
|
||||
import com.tencent.qqnt.kernel.nativeinterface.VideoElement
|
||||
import kotlinx.serialization.SerializationException
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.JsonElement
|
||||
import kotlinx.serialization.json.JsonObject
|
||||
import kotlinx.serialization.json.JsonPrimitive
|
||||
import moe.fuqiuluo.qqinterface.servlet.CardSvc
|
||||
@ -191,7 +194,20 @@ internal object MessageMaker {
|
||||
): Result<MsgElement> {
|
||||
data.checkAndThrow("data")
|
||||
val jsonStr = data["data"].let {
|
||||
if (it is JsonObject) it.asJsonObject.toString() else it.asString
|
||||
if (it is JsonObject) it.asJsonObject.toString() else {
|
||||
val str = it.asStringOrNull ?: ""
|
||||
// 检查字符串是否是合法json,不然qq会闪退
|
||||
try {
|
||||
val element = Json.decodeFromString<JsonElement>(str)
|
||||
if (element !is JsonObject) {
|
||||
return Result.failure(Exception("不合法的JSON字符串"))
|
||||
}
|
||||
} catch (err: Throwable) {
|
||||
LogCenter.log(err.stackTraceToString(), Level.ERROR)
|
||||
return Result.failure(Exception("不合法的JSON字符串"))
|
||||
}
|
||||
str
|
||||
}
|
||||
}
|
||||
val element = MsgElement()
|
||||
element.elementType = MsgConstant.KELEMTYPEARKSTRUCT
|
||||
|
@ -12,3 +12,4 @@ internal class LogicException(why: String) : InternalMessageMakerError(why)
|
||||
|
||||
internal object ErrorTokenException : InternalMessageMakerError("access_token error")
|
||||
|
||||
internal class SendMsgException(why: String) : InternalMessageMakerError(why)
|
||||
|
@ -86,10 +86,9 @@ internal object MessageHelper {
|
||||
}
|
||||
}
|
||||
if (sendRet?.first != 0) {
|
||||
return Result.failure(Exception(sendRet?.second ?: "发送消息超时"))
|
||||
return Result.failure(SendMsgException(sendRet?.second ?: "发送消息超时"))
|
||||
}
|
||||
return Result.success(sendResultPair)
|
||||
// return sendMessageWithoutMsgId(chatType, peerId, msg, fromId, callback)
|
||||
}
|
||||
|
||||
suspend fun sendMessageWithoutMsgId(
|
||||
|
@ -8,8 +8,10 @@ import moe.fuqiuluo.qqinterface.servlet.ark.ArkMsgSvc
|
||||
import moe.fuqiuluo.shamrock.tools.GlobalClient
|
||||
import moe.fuqiuluo.shamrock.tools.asInt
|
||||
import moe.fuqiuluo.shamrock.tools.asJsonArray
|
||||
import moe.fuqiuluo.shamrock.tools.asJsonArrayOrNull
|
||||
import moe.fuqiuluo.shamrock.tools.asJsonObject
|
||||
import moe.fuqiuluo.shamrock.tools.asString
|
||||
import moe.fuqiuluo.shamrock.tools.asStringOrNull
|
||||
import moe.fuqiuluo.shamrock.utils.MD5
|
||||
|
||||
internal object MusicHelper {
|
||||
@ -53,12 +55,26 @@ internal object MusicHelper {
|
||||
val trackInfo = data["track_info"].asJsonObject
|
||||
val mid = trackInfo["mid"].asString
|
||||
val previewMid = trackInfo["album"].asJsonObject["mid"].asString
|
||||
val singerMid = trackInfo["singer"].asJsonArrayOrNull?.let {
|
||||
it[0].asJsonObject["mid"].asStringOrNull
|
||||
} ?: ""
|
||||
val name = trackInfo["name"].asString
|
||||
val title = trackInfo["title"].asString
|
||||
val singerName = trackInfo["singer"].asJsonArray.first().asJsonObject["name"].asString
|
||||
val vs = trackInfo["vs"].asJsonArrayOrNull?.let {
|
||||
it[0].asStringOrNull
|
||||
} ?: ""
|
||||
val code = MD5.getMd5Hex("${mid}q;z(&l~sdf2!nK".toByteArray()).substring(0 .. 4).uppercase()
|
||||
val playUrl = "http://c6.y.qq.com/rsc/fcgi-bin/fcg_pyq_play.fcg?songid=&songmid=$mid&songtype=1&fromtag=50&uin=&code=$code"
|
||||
val previewUrl = "http://y.gtimg.cn/music/photo_new/T002R180x180M000$previewMid.jpg"
|
||||
val previewUrl = if (vs.isNotEmpty()) {
|
||||
"http://y.gtimg.cn/music/photo_new/T062R150x150M000$vs}.jpg"
|
||||
} else if (previewMid.isNotEmpty()) {
|
||||
"http://y.gtimg.cn/music/photo_new/T002R150x150M000$previewMid.jpg"
|
||||
} else if (singerMid.isNotEmpty()){
|
||||
"http://y.gtimg.cn/music/photo_new/T001R150x150M000$singerMid.jpg"
|
||||
} else {
|
||||
""
|
||||
}
|
||||
val jumpUrl = "https://i.y.qq.com/v8/playsong.html?platform=11&appshare=android_qq&appversion=10030010&hosteuin=oKnlNenz7i-s7c**&songmid=${mid}&type=0&appsongtype=1&_wv=1&source=qq&ADTAG=qfshare"
|
||||
ArkMsgSvc.tryShareMusic(
|
||||
chatType,
|
||||
|
Loading…
x
Reference in New Issue
Block a user