mirror of
https://github.com/whitechi73/OpenShamrock.git
synced 2024-08-14 13:12:17 +08:00
Shamrock
: 实现联系人服务
Signed-off-by: 白池 <whitechi73@outlook.com>
This commit is contained in:
parent
a528030cbb
commit
c16f9d543c
2
kritor
2
kritor
@ -1 +1 @@
|
|||||||
Subproject commit 505d80b2eec8d5f226ed28390fb15f4ca41b4c70
|
Subproject commit 201e91e73225ce3f1ec098c06a5cf6a717d913e5
|
@ -42,7 +42,7 @@ object AuthInterceptor: ServerInterceptor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getAllTicket(): List<String> {
|
fun getAllTicket(): List<String> {
|
||||||
val result = arrayListOf<String>()
|
val result = arrayListOf<String>()
|
||||||
val activeTicketName = ActiveTicket.name()
|
val activeTicketName = ActiveTicket.name()
|
||||||
var index = 0
|
var index = 0
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
package kritor.service
|
package kritor.service
|
||||||
|
|
||||||
|
import io.grpc.Status
|
||||||
|
import io.grpc.StatusRuntimeException
|
||||||
import io.kritor.AuthCode
|
import io.kritor.AuthCode
|
||||||
import io.kritor.AuthReq
|
import io.kritor.AuthReq
|
||||||
import io.kritor.AuthRsp
|
import io.kritor.AuthRsp
|
||||||
import io.kritor.AuthenticationGrpcKt
|
import io.kritor.AuthenticationGrpcKt
|
||||||
|
import io.kritor.GetAuthStateReq
|
||||||
|
import io.kritor.GetAuthStateRsp
|
||||||
import io.kritor.authRsp
|
import io.kritor.authRsp
|
||||||
|
import io.kritor.getAuthStateRsp
|
||||||
|
import kritor.auth.AuthInterceptor
|
||||||
import moe.fuqiuluo.shamrock.config.ActiveTicket
|
import moe.fuqiuluo.shamrock.config.ActiveTicket
|
||||||
import moe.fuqiuluo.shamrock.config.ShamrockConfig
|
import moe.fuqiuluo.shamrock.config.ShamrockConfig
|
||||||
import qq.service.QQInterfaces
|
import qq.service.QQInterfaces
|
||||||
@ -46,4 +52,15 @@ object Authentication: AuthenticationGrpcKt.AuthenticationCoroutineImplBase() {
|
|||||||
msg = "Invalid ticket"
|
msg = "Invalid ticket"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Grpc("Authentication", "GetAuthState")
|
||||||
|
override suspend fun getAuthState(request: GetAuthStateReq): GetAuthStateRsp {
|
||||||
|
if (request.account != QQInterfaces.app.account) {
|
||||||
|
throw StatusRuntimeException(Status.CANCELLED.withDescription("No such account"))
|
||||||
|
}
|
||||||
|
|
||||||
|
return getAuthStateRsp {
|
||||||
|
isRequiredAuth = AuthInterceptor.getAllTicket().isNotEmpty()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,18 +1,37 @@
|
|||||||
package kritor.service
|
package kritor.service
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import com.tencent.mobileqq.profilecard.api.IProfileCardBlacklistApi
|
||||||
|
import com.tencent.mobileqq.profilecard.api.IProfileProtocolConst.*
|
||||||
|
import com.tencent.mobileqq.profilecard.api.IProfileProtocolService
|
||||||
|
import com.tencent.mobileqq.qroute.QRoute
|
||||||
import io.grpc.Status
|
import io.grpc.Status
|
||||||
import io.grpc.StatusRuntimeException
|
import io.grpc.StatusRuntimeException
|
||||||
import io.kritor.AuthCode
|
|
||||||
import io.kritor.authRsp
|
|
||||||
import io.kritor.contact.ContactServiceGrpcKt
|
import io.kritor.contact.ContactServiceGrpcKt
|
||||||
|
import io.kritor.contact.GetUidRequest
|
||||||
|
import io.kritor.contact.GetUidResponse
|
||||||
|
import io.kritor.contact.GetUinByUidRequest
|
||||||
|
import io.kritor.contact.GetUinByUidResponse
|
||||||
|
import io.kritor.contact.IsBlackListUserRequest
|
||||||
|
import io.kritor.contact.IsBlackListUserResponse
|
||||||
import io.kritor.contact.ProfileCard
|
import io.kritor.contact.ProfileCard
|
||||||
import io.kritor.contact.ProfileCardRequest
|
import io.kritor.contact.ProfileCardRequest
|
||||||
|
import io.kritor.contact.SetProfileCardRequest
|
||||||
|
import io.kritor.contact.SetProfileCardResponse
|
||||||
|
import io.kritor.contact.StrangerExt
|
||||||
|
import io.kritor.contact.StrangerInfo
|
||||||
|
import io.kritor.contact.StrangerInfoRequest
|
||||||
import io.kritor.contact.profileCard
|
import io.kritor.contact.profileCard
|
||||||
import moe.fuqiuluo.shamrock.config.ActiveTicket
|
import io.kritor.contact.strangerInfo
|
||||||
import moe.fuqiuluo.shamrock.config.ShamrockConfig
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||||
|
import kotlinx.coroutines.withTimeoutOrNull
|
||||||
|
import qq.service.QQInterfaces
|
||||||
import qq.service.contact.ContactHelper
|
import qq.service.contact.ContactHelper
|
||||||
|
import kotlin.coroutines.resume
|
||||||
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
|
||||||
object ContactService: ContactServiceGrpcKt.ContactServiceCoroutineImplBase() {
|
object ContactService: ContactServiceGrpcKt.ContactServiceCoroutineImplBase() {
|
||||||
|
@Grpc("ContactService", "GetProfileCard")
|
||||||
override suspend fun getProfileCard(request: ProfileCardRequest): ProfileCard {
|
override suspend fun getProfileCard(request: ProfileCardRequest): ProfileCard {
|
||||||
val uin = if (request.hasUin()) request.uin
|
val uin = if (request.hasUin()) request.uin
|
||||||
else ContactHelper.getUinByUidAsync(request.uid).toLong()
|
else ContactHelper.getUinByUidAsync(request.uid).toLong()
|
||||||
@ -44,4 +63,96 @@ object ContactService: ContactServiceGrpcKt.ContactServiceCoroutineImplBase() {
|
|||||||
.withDescription("logic failed")
|
.withDescription("logic failed")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Grpc("ContactService", "GetStrangerInfo")
|
||||||
|
override suspend fun getStrangerInfo(request: StrangerInfoRequest): StrangerInfo {
|
||||||
|
val userId = request.uin
|
||||||
|
val info = ContactHelper.refreshAndGetProfileCard(userId).onFailure {
|
||||||
|
throw StatusRuntimeException(Status.INTERNAL
|
||||||
|
.withCause(it)
|
||||||
|
.withDescription("Unable to fetch stranger info")
|
||||||
|
)
|
||||||
|
}.getOrThrow()
|
||||||
|
|
||||||
|
return strangerInfo {
|
||||||
|
this.uid = ContactHelper.getUidByUinAsync(userId)
|
||||||
|
this.uin = (info.uin ?: "0").toLong()
|
||||||
|
this.name = info.strNick ?: ""
|
||||||
|
this.level = info.iQQLevel
|
||||||
|
this.loginDay = info.lLoginDays.toInt()
|
||||||
|
this.voteCnt = info.lVoteCount.toInt()
|
||||||
|
this.qid = info.qid ?: ""
|
||||||
|
this.isSchoolVerified = info.schoolVerifiedFlag
|
||||||
|
this.ext = StrangerExt.newBuilder()
|
||||||
|
.setBigVip(info.bBigClubVipOpen == 1.toByte())
|
||||||
|
.setHollywoodVip(info.bHollywoodVipOpen == 1.toByte())
|
||||||
|
.setQqVip(info.bQQVipOpen == 1.toByte())
|
||||||
|
.setSuperVip(info.bSuperQQOpen == 1.toByte())
|
||||||
|
.setVoted(info.bVoted == 1.toByte())
|
||||||
|
.build().toByteString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Grpc("ContactService", "GetUid")
|
||||||
|
override suspend fun getUid(request: GetUidRequest): GetUidResponse {
|
||||||
|
return GetUidResponse.newBuilder().apply {
|
||||||
|
request.uinList.forEach {
|
||||||
|
putUid(it, ContactHelper.getUidByUinAsync(it))
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Grpc("ContactService", "GetUinByUid")
|
||||||
|
override suspend fun getUinByUid(request: GetUinByUidRequest): GetUinByUidResponse {
|
||||||
|
return GetUinByUidResponse.newBuilder().apply {
|
||||||
|
request.uidList.forEach {
|
||||||
|
putUin(it, ContactHelper.getUinByUidAsync(it).toLong())
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Grpc("ContactService", "SetProfileCard")
|
||||||
|
override suspend fun setProfileCard(request: SetProfileCardRequest): SetProfileCardResponse {
|
||||||
|
val bundle = Bundle()
|
||||||
|
val service = QQInterfaces.app
|
||||||
|
.getRuntimeService(IProfileProtocolService::class.java, "all")
|
||||||
|
if (request.hasNickName()) {
|
||||||
|
bundle.putString(KEY_NICK, request.nickName)
|
||||||
|
}
|
||||||
|
if (request.hasCompany()) {
|
||||||
|
bundle.putString(KEY_COMPANY, request.company)
|
||||||
|
}
|
||||||
|
if (request.hasEmail()) {
|
||||||
|
bundle.putString(KEY_EMAIL, request.email)
|
||||||
|
}
|
||||||
|
if (request.hasCollege()) {
|
||||||
|
bundle.putString(KEY_COLLEGE, request.college)
|
||||||
|
}
|
||||||
|
if (request.hasPersonalNote()) {
|
||||||
|
bundle.putString(KEY_PERSONAL_NOTE, request.personalNote)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.hasBirthday()) {
|
||||||
|
bundle.putInt(KEY_BIRTHDAY, request.birthday)
|
||||||
|
}
|
||||||
|
if (request.hasAge()) {
|
||||||
|
bundle.putInt(KEY_AGE, request.age)
|
||||||
|
}
|
||||||
|
|
||||||
|
service.setProfileDetail(bundle)
|
||||||
|
return super.setProfileCard(request)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Grpc("ContactService", "IsBlackListUser")
|
||||||
|
override suspend fun isBlackListUser(request: IsBlackListUserRequest): IsBlackListUserResponse {
|
||||||
|
val blacklistApi = QRoute.api(IProfileCardBlacklistApi::class.java)
|
||||||
|
val isBlack = withTimeoutOrNull(5000) {
|
||||||
|
suspendCancellableCoroutine { continuation ->
|
||||||
|
blacklistApi.isBlackOrBlackedUin(request.uin.toString()) {
|
||||||
|
continuation.resume(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ?: false
|
||||||
|
return IsBlackListUserResponse.newBuilder().setIsBlackListUser(isBlack).build()
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package qq.service.contact
|
||||||
|
|
||||||
|
const val CMD_GET_PROFILE_DETAIL = "OidbSvc.0x480_9_IMCore"
|
||||||
|
const val CMD_SET_PROFILE_DETAIL = "OidbSvc.0x4ff_9_IMCore"
|
||||||
|
const val KET_INTERESTS = "interests"
|
||||||
|
const val KEY_AGE = "age"
|
||||||
|
const val KEY_BIRTHDAY = "birthday"
|
||||||
|
const val KEY_COLLEGE = "college"
|
||||||
|
const val KEY_COMPANY = "company"
|
||||||
|
const val KEY_CONSTELLATION = "key_constellation"
|
||||||
|
const val KEY_EMAIL = "email"
|
||||||
|
const val KEY_HOMETOWN = "hometown"
|
||||||
|
const val KEY_HOMETOWN_DESC = "hometown_desc"
|
||||||
|
const val KEY_LOCATION = "location"
|
||||||
|
const val KEY_LOCATION_DESC = "location_desc"
|
||||||
|
const val KEY_LOCATION_NAME = "location_name"
|
||||||
|
const val KEY_NICK = "nick"
|
||||||
|
const val KEY_PARSE_PROFILE_LOCATION = "parse_profile_location"
|
||||||
|
const val KEY_PERSONAL_NOTE = "personalNote"
|
||||||
|
const val KEY_PROFESSION = "profession"
|
||||||
|
const val KEY_SEX = "sex"
|
||||||
|
const val PARAM_ADD_FRIEND_SOURCE = "addFriendSource"
|
||||||
|
const val PARAM_COME_FROM_TYPE = "comeFromType"
|
||||||
|
const val PARAM_GET_CONTROL = "getControl"
|
||||||
|
const val PARAM_IS_FRIEND = "isFriend"
|
||||||
|
const val PARAM_LOGIN_SIG = "loginSig"
|
||||||
|
const val PARAM_QZONE_FEED_TIMESTAMP = "qZoneFeedTimeStamp"
|
||||||
|
const val PARAM_QZONE_SEED = "qZoneSeed"
|
||||||
|
const val PARAM_REQ_0X5EB = "req0x5ebList"
|
||||||
|
const val PARAM_REQ_EXTEND = "reqExtendFriend"
|
||||||
|
const val PARAM_REQ_MEDAL = "reqMedalWall"
|
||||||
|
const val PARAM_REQ_SERVICES = "reqServiceList"
|
||||||
|
const val PARAM_REQ_TEMPLATE = "reqTemplate"
|
||||||
|
const val PARAM_SEARCH_NAME = "searchName"
|
||||||
|
const val PARAM_SECURE_SIG = "secureSig"
|
||||||
|
const val PARAM_SELF_UIN = "selfUin"
|
||||||
|
const val PARAM_TARGET_UIN = "targetUin"
|
||||||
|
const val PARAM_TROOP_CODE = "troopCode"
|
||||||
|
const val PARAM_TROOP_UIN = "troopUin"
|
Loading…
x
Reference in New Issue
Block a user