Shamrock: support /create_guild_role

This commit is contained in:
白池 2024-02-03 16:31:54 +08:00
parent 7bfb9b7b61
commit fb00e5c1ff
8 changed files with 149 additions and 7 deletions

View File

@ -31,12 +31,8 @@ public final class GProRoleCreateInfo {
return "GProRoleCreateInfo{name=" + this.name + ",color=" + this.color + ",bHoist=" + this.bHoist + ",rolePermissions=" + this.rolePermissions + ",}"; return "GProRoleCreateInfo{name=" + this.name + ",color=" + this.color + ",bHoist=" + this.bHoist + ",rolePermissions=" + this.rolePermissions + ",}";
} }
public GProRoleCreateInfo(String str, long j2, boolean z, GProRolePermission gProRolePermission) { public GProRoleCreateInfo(String name, long color, boolean hoist, GProRolePermission permissions) {
this.name = ""; this.name = "";
this.rolePermissions = new GProRolePermission(); this.rolePermissions = new GProRolePermission();
this.name = str;
this.color = j2;
this.bHoist = z;
this.rolePermissions = gProRolePermission;
} }
} }

View File

@ -0,0 +1,5 @@
package com.tencent.qqnt.kernel.nativeinterface;
public interface IGProCreateRoleCallback {
void onCreateRoleResult(int code, String msg, GProSecurityResult result, GProGuildRole role);
}

View File

@ -70,4 +70,7 @@ public interface IKernelGuildService {
void setMemberRoles(long guild, long u1, long u2, long tinyId, ArrayList<Long> addRoles, ArrayList<Long> removeRoles, IGProResultCallback cb); void setMemberRoles(long guild, long u1, long u2, long tinyId, ArrayList<Long> addRoles, ArrayList<Long> removeRoles, IGProResultCallback cb);
void setRoleInfo(long guild, long role, GProRoleCreateInfo info, IGProResultCallback cb);
void createRole(long guildId, GProRoleCreateInfo info, ArrayList<Long> initialUsers, IGProCreateRoleCallback cb);
} }

View File

@ -4,7 +4,9 @@ package moe.fuqiuluo.qqinterface.servlet
import com.tencent.mobileqq.qqguildsdk.api.IGPSService import com.tencent.mobileqq.qqguildsdk.api.IGPSService
import com.tencent.qqnt.kernel.nativeinterface.GProGuildRole import com.tencent.qqnt.kernel.nativeinterface.GProGuildRole
import com.tencent.qqnt.kernel.nativeinterface.GProRoleCreateInfo
import com.tencent.qqnt.kernel.nativeinterface.GProRoleMemberList import com.tencent.qqnt.kernel.nativeinterface.GProRoleMemberList
import com.tencent.qqnt.kernel.nativeinterface.GProRolePermission
import io.ktor.utils.io.ByteReadChannel import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.core.readBytes import io.ktor.utils.io.core.readBytes
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
@ -317,4 +319,52 @@ internal object GProSvc: BaseSvc() {
} }
} }
} }
suspend fun getGuildRolePermission(guildId: ULong, roleId: ULong): Result<GProGuildRole> {
val kernelGProService = NTServiceFetcher.kernelService.wrapperSession.guildService
val role:GProGuildRole = withTimeoutOrNull(5000) {
suspendCancellableCoroutine {
kernelGProService.fetchRoleWithPermission(guildId.toLong(), roleId.toLong(), 1) { code, msg, role, _, _, _ ->
if (code != 0) {
LogCenter.log("getGuildRolePermission failed: $code($msg)", Level.WARN)
it.resume(null)
} else it.resume(role)
}
}
} ?: return Result.failure(Exception("unable to fetch guild role permission"))
return Result.success(role)
}
suspend fun updateGuildRole(guildId: ULong, roleId: ULong, name: String, color: Long): Result<Unit> {
val oldInfo = getGuildRolePermission(guildId, roleId).onFailure {
return Result.failure(it)
}.getOrThrow()
val kernelGProService = NTServiceFetcher.kernelService.wrapperSession.guildService
val info = GProRoleCreateInfo(
name, color, oldInfo.bHoist, oldInfo.rolePermissions
)
kernelGProService.setRoleInfo(guildId.toLong(), roleId.toLong(), info) { code, msg, result ->
if (code != 0) {
LogCenter.log("updateGuildRole failed: $code($msg) => $result", Level.WARN)
}
}
return Result.success(Unit)
}
suspend fun createGuildRole(guildId: ULong, name: String, color: Long, initialUsers: ArrayList<Long>): Result<GProGuildRole> {
val kernelGProService = NTServiceFetcher.kernelService.wrapperSession.guildService
val permission = GProRolePermission(false, arrayListOf())
val info = GProRoleCreateInfo(name, color, false, permission)
val role: GProGuildRole = withTimeoutOrNull(5000) {
suspendCancellableCoroutine {
kernelGProService.createRole(guildId.toLong(), info, initialUsers) { code, msg, result, role ->
if (code != 0) {
LogCenter.log("createGuildRole failed: $code($msg) => $result", Level.WARN)
it.resume(null)
} else it.resume(role)
}
}
} ?: return Result.failure(Exception("unable to create guild role"))
return Result.success(role)
}
} }

View File

@ -0,0 +1,42 @@
@file:Suppress("UNCHECKED_CAST")
package moe.fuqiuluo.shamrock.remote.action.handlers
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.GProSvc
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
import moe.fuqiuluo.shamrock.tools.EmptyJsonString
import moe.fuqiuluo.shamrock.tools.asString
import moe.fuqiuluo.symbols.OneBotHandler
@OneBotHandler("create_guild_role")
internal object CreateGuildRole: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val guildId = session.getString("guild_id").toULong()
val name = session.getString("name")
val color = session.getLong("color")
val initialUsers = session.getArray("initial_users").map {
it.asString.toULong()
}
return invoke(guildId, color, name, initialUsers, session.echo)
}
suspend operator fun invoke(guildId: ULong, color: Long, name: String, initialUsers: List<ULong>, echo: JsonElement = EmptyJsonString): String {
val result = GProSvc.createGuildRole(guildId, name, color, initialUsers as ArrayList<Long>).onFailure {
return error(it.message ?: "Unknown error", echo)
}.getOrThrow()
return ok(data = CreateGuildRoleResult(
result.roleId.toULong()
), echo = echo)
}
override val requiredParams: Array<String> = arrayOf("guild_id", "color", "name", "initial_users")
@Serializable
data class CreateGuildRoleResult(
@SerialName("role_id") val roleId: ULong
)
}

View File

@ -24,11 +24,11 @@ internal object GetGuildRoles: IActionHandler() {
return ok(GetGuildRolesResult(result.map { return ok(GetGuildRolesResult(result.map {
GuildRole( GuildRole(
color = it.color, color = it.color,
disabled = it.count <= 0, disabled = it.bHoist,
independent = it.isChannelRole, independent = it.isChannelRole,
maxCount = it.memberLimit, maxCount = it.memberLimit,
memberCount = it.count, memberCount = it.count,
owned = it.bHoist, owned = it.isNotSort,
roleId = it.roleId, roleId = it.roleId,
roleName = it.name, roleName = it.name,
permission = it.rolePermissions.permissionList.map { permission = it.rolePermissions.permissionList.map {

View File

@ -0,0 +1,28 @@
package moe.fuqiuluo.shamrock.remote.action.handlers
import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.GProSvc
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("update_guild_role")
internal object UpdateGuildRole: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val guildId = session.getString("guild_id").toULong()
val roleId = session.getString("role_id").toULong()
val name = session.getString("name")
val color = session.getLong("color")
return invoke(guildId, roleId, name, color, session.echo)
}
suspend operator fun invoke(guildId: ULong, roleId: ULong, name: String, color: Long, echo: JsonElement = EmptyJsonString): String {
val result = GProSvc.updateGuildRole(guildId, roleId, name, color).onFailure {
return error(it.message ?: "Unknown error", echo)
}
return ok("success", echo = echo)
}
override val requiredParams: Array<String> = arrayOf("role_id", "guild_id", "name", "color")
}

View File

@ -8,6 +8,7 @@ import io.ktor.server.routing.get
import io.ktor.server.routing.post import io.ktor.server.routing.post
import io.ktor.server.routing.route import io.ktor.server.routing.route
import moe.fuqiuluo.shamrock.helper.MessageHelper import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.remote.action.handlers.CreateGuildRole
import moe.fuqiuluo.shamrock.remote.action.handlers.DeleteGuildRole import moe.fuqiuluo.shamrock.remote.action.handlers.DeleteGuildRole
import moe.fuqiuluo.shamrock.remote.action.handlers.GetGProChannelList import moe.fuqiuluo.shamrock.remote.action.handlers.GetGProChannelList
import moe.fuqiuluo.shamrock.remote.action.handlers.GetGuildFeeds import moe.fuqiuluo.shamrock.remote.action.handlers.GetGuildFeeds
@ -20,6 +21,7 @@ import moe.fuqiuluo.shamrock.remote.action.handlers.GetGuildServiceProfile
import moe.fuqiuluo.shamrock.remote.action.handlers.SendGuildMessage import moe.fuqiuluo.shamrock.remote.action.handlers.SendGuildMessage
import moe.fuqiuluo.shamrock.remote.action.handlers.SendMessage import moe.fuqiuluo.shamrock.remote.action.handlers.SendMessage
import moe.fuqiuluo.shamrock.remote.action.handlers.SetGuildMemberRole import moe.fuqiuluo.shamrock.remote.action.handlers.SetGuildMemberRole
import moe.fuqiuluo.shamrock.remote.action.handlers.UpdateGuildRole
import moe.fuqiuluo.shamrock.tools.fetchGetOrNull import moe.fuqiuluo.shamrock.tools.fetchGetOrNull
import moe.fuqiuluo.shamrock.tools.fetchGetOrThrow import moe.fuqiuluo.shamrock.tools.fetchGetOrThrow
import moe.fuqiuluo.shamrock.tools.fetchOrNull import moe.fuqiuluo.shamrock.tools.fetchOrNull
@ -150,4 +152,20 @@ fun Routing.guildAction() {
ContentType.Application.Json ContentType.Application.Json
) )
} }
getOrPost("/update_guild_role") {
val guildId = fetchOrThrow("guild_id").toULong()
val roleId = fetchOrThrow("role_id").toULong()
val name = fetchOrThrow("name")
val color = fetchOrThrow("color").toLong()
call.respondText(UpdateGuildRole(guildId, roleId, name, color), ContentType.Application.Json)
}
getOrPost("/create_guild_role") {
val guildId = fetchOrThrow("guild_id").toULong()
val name = fetchOrThrow("name")
val color = fetchOrThrow("color").toLong()
val initialUsers = fetchOrThrow("initial_users").split(",").map { it.toULong() }
call.respondText(CreateGuildRole(guildId, color, name, initialUsers), ContentType.Application.Json)
}
} }