Shamrock: Support /set_group_comment_face

This commit is contained in:
whitechi73 2024-01-28 23:45:05 +08:00
parent e07e75747a
commit c97f79335a
4 changed files with 78 additions and 4 deletions

View File

@ -0,0 +1,14 @@
package moe.whitechi73.protobuf.oidb.cmd0x9082
import kotlinx.serialization.Serializable
import kotlinx.serialization.protobuf.ProtoNumber
@Serializable
data class Oidb0x9082(
@ProtoNumber(2) val peer: ULong = ULong.MIN_VALUE,
@ProtoNumber(3) val msgSeq: ULong = ULong.MIN_VALUE,
@ProtoNumber(4) val faceIndex: String = "",
@ProtoNumber(5) val flag: UInt = UInt.MIN_VALUE,
@ProtoNumber(6) val u1: UInt = UInt.MIN_VALUE,
@ProtoNumber(7) val u2: UInt = UInt.MIN_VALUE,
)

View File

@ -0,0 +1,19 @@
package moe.fuqiuluo.qqinterface.servlet
import kotlinx.serialization.encodeToByteArray
import kotlinx.serialization.protobuf.ProtoBuf
import moe.whitechi73.protobuf.oidb.cmd0x9082.Oidb0x9082
internal object ChatSvc: BaseSvc() {
fun setGroupMessageCommentFace(peer: Long, msgSeq: ULong, faceIndex: String, isSet: Boolean) {
val serviceId = if (isSet) 1 else 2
sendOidb("OidbSvcTrpcTcp.0x9082_$serviceId", 36994, serviceId, ProtoBuf.encodeToByteArray(Oidb0x9082(
peer = peer.toULong(),
msgSeq = msgSeq,
faceIndex = faceIndex,
flag = 1u,
u1 = 0u,
u2 = 0u
)))
}
}

View File

@ -0,0 +1,30 @@
package moe.fuqiuluo.shamrock.remote.action.handlers
import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.ChatSvc
import moe.fuqiuluo.qqinterface.servlet.MsgSvc
import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
import moe.fuqiuluo.shamrock.tools.EmptyJsonString
import moe.fuqiuluo.symbols.OneBotHandler
@OneBotHandler("set_group_comment_face")
internal object SetGroupCommentFace: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val groupId = session.getLong("group_id")
val msgId = session.getIntOrNull("msg_id") ?: session.getInt("message_id")
val faceId = session.getInt("face_id")
val isSet = session.getBooleanOrDefault("is_set", true)
return invoke(groupId, msgId, faceId, isSet, session.echo)
}
operator fun invoke(groupId: Long, msgHash: Int, faceIndex: Int, isSet: Boolean, echo: JsonElement = EmptyJsonString): String {
val mapping = MessageHelper.getMsgMappingByHash(msgHash)
?: return error("failed to locate message", echo = echo)
ChatSvc.setGroupMessageCommentFace(groupId, mapping.msgSeq.toULong(), faceIndex.toString(), isSet)
return ok("success", echo = echo)
}
override val requiredParams: Array<String> = arrayOf("group_id", "face_id")
}

View File

@ -1,19 +1,30 @@
package moe.fuqiuluo.shamrock.remote.api package moe.fuqiuluo.shamrock.remote.api
import io.ktor.http.ContentType import io.ktor.http.ContentType
import moe.fuqiuluo.shamrock.helper.LogicException
import io.ktor.server.application.call import io.ktor.server.application.call
import io.ktor.server.response.respondText import io.ktor.server.response.respondText
import io.ktor.server.routing.Routing import io.ktor.server.routing.Routing
import moe.fuqiuluo.shamrock.remote.action.ActionManager
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.handlers.* import moe.fuqiuluo.shamrock.remote.action.handlers.*
import moe.fuqiuluo.shamrock.tools.fetch import moe.fuqiuluo.shamrock.tools.fetchGetOrNull
import moe.fuqiuluo.shamrock.tools.fetchOrNull import moe.fuqiuluo.shamrock.tools.fetchOrNull
import moe.fuqiuluo.shamrock.tools.fetchOrThrow import moe.fuqiuluo.shamrock.tools.fetchOrThrow
import moe.fuqiuluo.shamrock.tools.getOrPost import moe.fuqiuluo.shamrock.tools.getOrPost
fun Routing.troopAction() { fun Routing.troopAction() {
getOrPost("/set_group_comment_face") {
val groupId = fetchOrThrow("group_id").toLong()
val msgId = fetchOrNull("msg_id")?.toIntOrNull() ?: fetchOrThrow("message_id").toInt()
val faceId = fetchOrThrow("face_id").toInt()
val isSet = fetchGetOrNull("is_set") ?: "true"
call.respondText(SetGroupCommentFace(groupId, msgId, faceId, when(isSet) {
"true" -> true
"false" -> false
"1" -> true
"0" -> false
else -> true
}), ContentType.Application.Json)
}
getOrPost("/get_not_joined_group_info") { getOrPost("/get_not_joined_group_info") {
val groupId = fetchOrThrow("group_id") val groupId = fetchOrThrow("group_id")
call.respondText(GetNotJoinedGroupInfo(groupId), ContentType.Application.Json) call.respondText(GetNotJoinedGroupInfo(groupId), ContentType.Application.Json)