From 74c3deb62420f6aaf16e6c400367b324b9d50bef Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Wed, 24 Aug 2022 15:49:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=E5=AE=98=E6=96=B9?= =?UTF-8?q?=E4=B8=80=E9=94=AE=E7=AD=BE=E5=88=B0=E5=8A=A0=E5=BF=AB=E7=AD=BE?= =?UTF-8?q?=E5=88=B0=E9=80=9F=E5=BA=A6=EF=BC=88=E5=AE=9E=E9=AA=8C=E6=80=A7?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tieba/post/activities/AboutActivity.kt | 12 ++-- .../tieba/post/api/interfaces/ITiebaApi.kt | 13 ++++ .../api/interfaces/impls/MixedTiebaApiImpl.kt | 9 +++ .../retrofit/interfaces/OfficialTiebaApi.kt | 10 ++- .../post/fragments/PreferencesFragment.kt | 6 ++ .../tieba/post/models/SignDataBean.kt | 4 +- .../tieba/post/utils/AccountUtil.kt | 23 +++++++ .../tieba/post/utils/AppPreferencesUtils.kt | 7 ++ .../huanchengfly/tieba/post/utils/OKSigner.kt | 65 ++++++++++++++++++- app/src/main/res/values/arrays.xml | 5 ++ app/src/main/res/values/strings.xml | 6 +- app/src/main/res/xml/preferences.xml | 11 ++-- 12 files changed, 150 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/AboutActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/AboutActivity.kt index 7012bd5d..c8ba23fc 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/AboutActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/AboutActivity.kt @@ -49,13 +49,13 @@ class AboutActivity : BaseActivity() { } else { clickCount++ } - if (clickCount > 5) { - if (appPreferences.checkCIUpdate) { - toastShort(R.string.toast_ci_version_disabled) - appPreferences.checkCIUpdate = false + if (clickCount >= 7) { + if (appPreferences.showExperimentalFeatures) { + toastShort(R.string.toast_experimental_features_disabled) + appPreferences.showExperimentalFeatures = false } else { - toastShort(R.string.toast_ci_version_enabled) - appPreferences.checkCIUpdate = true + toastShort(R.string.toast_experimental_features_enabled) + appPreferences.showExperimentalFeatures = true } clickCount = 0 } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/ITiebaApi.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/ITiebaApi.kt index 6ee8ef3a..2b801ea7 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/ITiebaApi.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/ITiebaApi.kt @@ -907,4 +907,17 @@ interface ITiebaApi { fun imgPortrait( file: File ): Flow + + /** + * 获取吧列表 + */ + fun getForumListFlow(): Flow + + /** + * 一键签到(官方) + */ + fun mSign( + forumIds: String, + tbs: String + ): Flow } \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/impls/MixedTiebaApiImpl.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/impls/MixedTiebaApiImpl.kt index 543ade21..23393b79 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/impls/MixedTiebaApiImpl.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/impls/MixedTiebaApiImpl.kt @@ -613,4 +613,13 @@ object MixedTiebaApiImpl : ITiebaApi { }.build() ) } + + override fun getForumListFlow(): Flow = + RetrofitTiebaApi.OFFICIAL_TIEBA_API.getForumListFlow() + + override fun mSign( + forumIds: String, + tbs: String + ): Flow = + RetrofitTiebaApi.OFFICIAL_TIEBA_API.mSignFlow(forumIds, tbs) } \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interfaces/OfficialTiebaApi.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interfaces/OfficialTiebaApi.kt index 469fc8f3..7ccedf80 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interfaces/OfficialTiebaApi.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interfaces/OfficialTiebaApi.kt @@ -178,14 +178,18 @@ interface OfficialTiebaApi { @Field("in_live") inLive: Int = 0 ): Flow - @Headers("${Header.FORCE_LOGIN}: ${Header.FORCE_LOGIN_TRUE}") + @Headers( + "${Header.FORCE_LOGIN}: ${Header.FORCE_LOGIN_TRUE}", + "${Header.NO_COMMON_PARAMS}: BDUSS" + ) @POST("/c/f/forum/getforumlist") @FormUrlEncoded fun getForumListFlow( + @Field("BDUSS") bduss: String = AccountUtil.getBduss(BaseApplication.INSTANCE)!!, + @Field("stoken") stoken: String = AccountUtil.getSToken(BaseApplication.INSTANCE)!!, + @Field("user_id") userId: String = AccountUtil.getUid(BaseApplication.INSTANCE)!!, @Field("_client_version") client_version: String = "11.10.8.6", @retrofit2.http.Header(Header.USER_AGENT) user_agent: String = "bdtb for Android $client_version", - @Field("stoken") stoken: String = AccountUtil.getSToken(BaseApplication.INSTANCE)!!, - @Field("user_id") userId: String = AccountUtil.getUid(BaseApplication.INSTANCE)!! ): Flow @Headers("${Header.FORCE_LOGIN}: ${Header.FORCE_LOGIN_TRUE}") diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/PreferencesFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/PreferencesFragment.kt index e336e81e..22fe390f 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/PreferencesFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/PreferencesFragment.kt @@ -50,6 +50,12 @@ class PreferencesFragment : PreferencesFragment() { } private fun refresh() { + val experimentalFeatures = + attachContext.resources.getStringArray(R.array.experimental_features) + experimentalFeatures.forEach { + findPreference(it)?.isVisible = + attachContext.appPreferences.showExperimentalFeatures + } loginInfo = AccountUtil.getLoginInfo(attachContext) val accounts = AccountUtil.allAccounts val usernameList: MutableList = ArrayList() diff --git a/app/src/main/java/com/huanchengfly/tieba/post/models/SignDataBean.kt b/app/src/main/java/com/huanchengfly/tieba/post/models/SignDataBean.kt index 8fc84cea..5f240b7a 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/models/SignDataBean.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/models/SignDataBean.kt @@ -2,6 +2,8 @@ package com.huanchengfly.tieba.post.models data class SignDataBean( val forumName: String, + val forumId: String, val userName: String, - val tbs: String + val tbs: String, + val canUseMSign: Boolean = false ) \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/AccountUtil.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/AccountUtil.kt index c63dd2f8..d6bcb84c 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/AccountUtil.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/AccountUtil.kt @@ -69,6 +69,29 @@ object AccountUtil { } } + fun fetchAccountFlow(account: Account): Flow { + return TiebaApi.getInstance() + .initNickNameFlow( + account.bduss, + account.sToken + ) + .zip( + TiebaApi.getInstance().loginFlow( + account.bduss, + account.sToken + ) + ) { initNickNameBean, loginBean -> + account.apply { + uid = loginBean.user.id + name = loginBean.user.name + nameShow = initNickNameBean.userInfo.nameShow + portrait = loginBean.user.portrait + tbs = loginBean.anti.tbs + saveOrUpdate("uid = ?", loginBean.user.id) + } + } + } + fun fetchAccountFlow( bduss: String, sToken: String, diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt index e8f1d121..3889835a 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt @@ -88,6 +88,11 @@ open class AppPreferencesUtils(context: Context) { key = "oksign_slow_mode" ) + var oksignUseOfficialOksign by DataStoreDelegates.boolean( + defaultValue = false, + key = "oksign_use_official_oksign" + ) + var postOrReplyWarning by DataStoreDelegates.boolean(defaultValue = true) var radius by DataStoreDelegates.int(defaultValue = 8) @@ -101,6 +106,8 @@ open class AppPreferencesUtils(context: Context) { key = "show_both_username_and_nickname" ) + var showExperimentalFeatures by DataStoreDelegates.boolean(defaultValue = false) + var showShortcutInThread by DataStoreDelegates.boolean(defaultValue = true) var showTopForumInNormalList by DataStoreDelegates.boolean( diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/OKSigner.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/OKSigner.kt index 1b0ce56d..af384485 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/OKSigner.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/OKSigner.kt @@ -2,6 +2,7 @@ package com.huanchengfly.tieba.post.utils import android.content.Context import com.huanchengfly.tieba.post.api.TiebaApi +import com.huanchengfly.tieba.post.api.models.MSignBean import com.huanchengfly.tieba.post.api.models.SignResultBean import com.huanchengfly.tieba.post.api.retrofit.ApiResult import com.huanchengfly.tieba.post.api.retrofit.doIfFailure @@ -98,6 +99,7 @@ class SingleAccountSigner( private var position = 0 private var successCount = 0 private var totalCount = 0 + private var mSignCount = 0 var lastFailure: Throwable? = null @@ -113,12 +115,70 @@ class SingleAccountSigner( signData.clear() var userName: String by Delegates.notNull() var tbs: String by Delegates.notNull() - AccountUtil.fetchAccountFlow(context) + AccountUtil.fetchAccountFlow(account) .flatMapConcat { account -> userName = account.name tbs = account.tbs - TiebaApi.getInstance().forumRecommendFlow() + TiebaApi.getInstance().getForumListFlow() } + .flatMapConcat { getForumListBean -> + val useMSign = context.appPreferences.oksignUseOfficialOksign + val mSignLevel = getForumListBean.level.toInt() + signData.addAll(getForumListBean.forumInfo + .filter { it.isSignIn != "1" } + .map { + SignDataBean( + it.forumName, + it.forumId, + userName, + tbs, + it.userLevel.toInt() >= mSignLevel + ) + }) + totalCount = signData.size + mSignCount = 0 + if (useMSign) { + val mSignData = signData.filter { it.canUseMSign } + TiebaApi.getInstance().mSign(mSignData.joinToString(",") { it.forumId }, tbs) + .map { it.info } + } else { + flow { emit(emptyList()) } + } + .onStart { + mProgressListener?.onStart(totalCount) + } + .catch { emit(emptyList()) } + } + .flatMapConcat { mSignInfo -> + val newSignData = if (mSignInfo.isNotEmpty()) { + val mSignInfoMap = mutableMapOf() + mSignInfo.forEach { + mSignInfoMap[it.forumId] = it + } + val signedCount = mSignInfo.filter { it.signed == "1" }.size + successCount += signedCount + signData + .filter { !it.canUseMSign || mSignInfoMap[it.forumId]?.signed != "1" } + } else { + signData.toList() + } + mSignCount = totalCount - newSignData.size + newSignData + .asFlow() + .onEach { + position = signData.indexOf(it) + mProgressListener?.onProgressStart(it, position + mSignCount, signData.size) + } + .onEmpty { + mProgressListener?.onFinish( + successCount == totalCount, + successCount, + totalCount + ) + } + .map { data -> sign(data) } + } + /* .flatMapConcat { forumRecommend -> signData.addAll(forumRecommend.likeForum.filter { it.isSign != "1" } .map { SignDataBean(it.forumName, userName, tbs) }) @@ -137,6 +197,7 @@ class SingleAccountSigner( } .map { data -> sign(data) } } + */ .catch { e -> emit(ApiResult.Failure(e)) } .onCompletion { mProgressListener?.onFinish( diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 779b4e69..6fa45a5c 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -17,6 +17,11 @@ 3 + + oksign_use_official_oksign + checkCIUpdate + + @string/title_image_load_type_smart_origin @string/title_image_load_type_smart_load diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ffb3b9ad..a279a44d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -485,8 +485,8 @@ 错误详情 复制详情 出现了一点小问题(%1$d) - 已启用接收自动构建版本更新(需要 App Center 账号) - 已禁用接收自动构建版本更新(需要 App Center 账号) + 已启用实验性特性 + 已禁用实验性特性 建议使用官方途径发贴 使用本 App 发贴可能会出现发贴失败、被吞等问题,甚至导致账户永久封禁等严重后果。\n我们建议你使用官方途径进行回贴。 使用官方客户端发贴 @@ -557,4 +557,6 @@ 该账号封禁中 申诉 隐藏该提示 + 接收自动构建版本更新 + 需要 App Center 账号且已加入测试,如果你没有,请不要开启此选项! diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 6ff4ba81..959f058e 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -219,8 +219,7 @@ android:icon="@drawable/ic_round_speed" android:key="oksign_use_official_oksign" android:summary="@string/summary_oksign_use_official_oksign" - android:title="@string/title_oksign_use_official_oksign" - app:isPreferenceVisible="false" /> + android:title="@string/title_oksign_use_official_oksign" /> - + android:key="checkCIUpdate" + android:summary="@string/tip_check_ci_update" + android:title="@string/title_check_ci_update" />