♻️ 简化错误处理,迁移painterReq

This commit is contained in:
BTMuli
2026-04-12 21:14:31 +08:00
parent 587363ace4
commit c2ab1c550c
23 changed files with 336 additions and 212 deletions

View File

@@ -74,10 +74,7 @@ async function loadNav(): Promise<void> {
nav.value = resp.data.data.navigator;
if (loadCode.value) loadCode.value = false;
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`加载组件数据失败: ${errMsg}`);
await TGLogger.Error(`[TGameNav][loadNav] 加载组件数据失败:${e}`);
}
@@ -113,10 +110,7 @@ async function tryGetCode(): Promise<void> {
loadCode.value = false;
} catch (e) {
loadCode.value = false;
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取兑换码失败: ${errMsg}`);
await TGLogger.Error(`[TGameNav][tryGetCode] 获取兑换码失败:${e}`);
}

View File

@@ -104,10 +104,7 @@ async function loadImageBuffer(): Promise<void> {
try {
buffer.value = await TGHttps.buffer(imageUrl);
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取图像Buffer失败${errMsg}`);
await TGLogger.Error(`[PaoBirthCard][loadImageBuffer] 获取图像Buffer失败${imageUrl}`);
await TGLogger.Error(`[PaoBirthCard][loadImageBuffer] ${e}`);

View File

@@ -53,6 +53,7 @@ import TGNotify from "@utils/TGNotify.js";
import { postDetailRateLimiter } from "@utils/rateLimiter.js";
import { storeToRefs } from "pinia";
import { ref, shallowRef, watch } from "vue";
import TGHttps from "@utils/TGHttps.js";
/** 用于渲染的任务项 */
type ParseMission = {
@@ -197,15 +198,38 @@ async function tryAuto(skip: boolean = false): Promise<void> {
if (likeFind) likeCnt = likeFind.process;
const viewFind = postFilter.find((i) => i.key === "view_post_0");
if (viewFind) viewCnt = viewFind.process;
// 获取帖子列表
await TGLogger.Script("[米游币任务]获取帖子列表");
const listResp = await painterReq.forum.recent(26, 2, 2, undefined, 20);
let listResp: TGApp.BBS.Forum.PostForumResp | undefined;
try {
listResp = await painterReq.forum.recent(26, 2, 2, undefined, 20);
if (listResp.retcode !== 0) {
showSnackbar.error(`[${listResp.retcode}] ${listResp.message}`);
await TGLogger.Script(`获取帖子列表失败: [${listResp.retcode}] ${listResp.message}`, "warn");
await TGLogger.ScriptSep("米游币任务", false);
loadScript.value = false;
loadMission.value = false;
return;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取帖子列表失败:${errMsg}`);
await TGLogger.Script(`获取帖子列表失败`, "error");
await TGLogger.Error(`[tus-mission][tryAuto] ${e}`);
await TGLogger.ScriptSep("米游币任务", false);
loadScript.value = false;
loadMission.value = false;
return;
}
if (!listResp) return;
// 执行操作
const ckShare = {
stoken: props.acCur.cookie.stoken,
stuid: props.acCur.cookie.stuid,
mid: props.acCur.cookie.mid,
};
const ckPost = { ltoken: props.acCur.cookie.ltoken, ltuid: props.acCur.cookie.ltuid };
for (const post of listResp.list) {
for (const post of listResp.data.list) {
if (!isShare) {
await TGLogger.Script(`[米游币任务]正在分享帖子${post.post.post_id}`);
const shareResp = await apiHubReq.post.share(post.post.post_id, ckShare);
@@ -320,7 +344,6 @@ async function autoSign(ck: TGApp.App.Account.Cookie, skip: boolean, ch?: string
}
await TGLogger.Script("[米游币任务]正在执行打卡");
const ckSign = { stoken: ck.stoken, stuid: ck.stuid, mid: ck.mid };
await painterReq.forum.recent(26, 2, 1, undefined, 20, ckSign);
const resp = await apiHubReq.sign(ckSign, 2, ch);
console.log("打卡情况", resp);
if (resp.retcode !== 0) {

View File

@@ -61,10 +61,7 @@ onMounted(async () => {
const viewResp = await Bili.video.view(aid, bvid);
videoData.value = viewResp.data;
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取视频信息失败: ${errMsg}`);
await TGLogger.Error(`[TpVideo][onMounted] 获取视频信息异常: ${url}`);
await TGLogger.Error(`[TpVideo][onMounted] ${e}`);

View File

@@ -161,10 +161,7 @@ async function loadCoverBuffer(): Promise<void> {
try {
coverBuffer.value = await TGHttps.buffer(props.data.insert.vod.cover);
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取图像Buffer失败${errMsg}`);
await TGLogger.Error(
`[TpVod][loadCoverBuffer] 获取图像Buffer失败${props.data.insert.vod.cover}`,

View File

@@ -33,6 +33,8 @@ import useUserStore from "@store/user.js";
import { openUrl } from "@tauri-apps/plugin-opener";
import { storeToRefs } from "pinia";
import { ref, shallowRef, useTemplateRef, watch } from "vue";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
const { cookie } = storeToRefs(useUserStore());
@@ -73,18 +75,34 @@ async function loadMore(refresh: boolean = false): Promise<void> {
return;
}
loading.value = true;
const resp = await painterReq.follow(cookie.value, offset.value);
if ("retcode" in resp) {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
// 获取关注帖子列表
let resp: TGApp.BBS.Post.FollowPostResp | undefined;
try {
resp = await painterReq.follow(cookie.value, offset.value);
if (resp.retcode !== 0) {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
await TGLogger.Warn(`[VpOverlayFollow][loadMore] [${resp.retcode}] ${resp.message}`);
loading.value = false;
return;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取关注帖子失败,${errMsg}`);
await TGLogger.Error(`[VpOverlayFollow][loadMore] 获取关注帖子失败`);
await TGLogger.Error(`[VpOverlayFollow][loadMore] ${e}`);
loading.value = false;
return;
}
offset.value = resp.next_offset;
isLast.value = resp.is_last;
if (refresh) posts.value = resp.list;
else posts.value = posts.value.concat(resp.list);
if (!resp) {
loading.value = false;
return;
}
offset.value = resp.data.next_offset;
isLast.value = resp.data.is_last;
if (refresh) posts.value = resp.data.list;
else posts.value = posts.value.concat(resp.data.list);
loading.value = false;
showSnackbar.success(`成功加载${resp.list.length}条数据`);
showSnackbar.success(`成功加载${resp.data.list.length}条数据`);
if (refresh && listEl.value) {
listEl.value.scrollTo({ top: 0, behavior: "smooth" });
}

View File

@@ -404,10 +404,7 @@ async function loadImageBuffer(): Promise<void> {
try {
buffer.value = await TGHttps.buffer(oriLink.value);
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取图像Buffer失败${errMsg}`);
await TGLogger.Error(`[VpOverlayImage][loadImageBuffer] 获取图像Buffer失败${oriLink.value}`);
await TGLogger.Error(`[VpOverlayImage][loadImageBuffer] ${e}`);

View File

@@ -1,21 +1,21 @@
<template>
<TOverlay v-model="visible">
<div class="tpol-box" v-if="card">
<div v-if="card" class="tpol-box">
<div class="tpol-title">
<span>抽奖详情</span>
<span>{{ timeStatus }}</span>
</div>
<div class="tpol-info">
<TpAvatar @click="toUserProfile(card.creator.uid)" :data="card.creator" position="left" />
<TpAvatar :data="card.creator" position="left" @click="toUserProfile(card.creator.uid)" />
<div>参与方式{{ upWay }}</div>
<div>奖品详情</div>
<div v-for="reward in card.rewards" :key="reward.name" class="tpol-info-reward">
<v-icon size="12" color="var(--tgc-pink-1)">mdi-gift</v-icon>
<v-icon color="var(--tgc-pink-1)" size="12">mdi-gift</v-icon>
<span>{{ reward.name }}</span>
<span>{{ reward.goal }}</span>
</div>
</div>
<div class="tpol-title" v-if="timeStatus === '已开奖'">中奖详情</div>
<div v-if="timeStatus === '已开奖'" class="tpol-title">中奖详情</div>
<template v-if="timeStatus === '已开奖'">
<template v-for="reward in card.rewards" :key="reward.name">
<div class="vpol-reward-title">{{ reward.name }} {{ reward.win }}/{{ reward.goal }}</div>
@@ -24,8 +24,8 @@
v-for="user in reward.users"
:key="user.uid"
:data="user"
position="left"
class="tpolr-user"
position="left"
@click="onUserClick(user)"
/>
</div>
@@ -35,7 +35,7 @@
</div>
</TOverlay>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import TOverlay from "@comp/app/t-overlay.vue";
import showSnackbar from "@comp/func/snackbar.js";
import TpAvatar from "@comp/viewPost/tp-avatar.vue";
@@ -45,6 +45,8 @@ import { openUrl } from "@tauri-apps/plugin-opener";
import { generateShareImg } from "@utils/TGShare.js";
import { stamp2LastTime } from "@utils/toolFunc.js";
import { onUnmounted, ref, shallowRef, watch } from "vue";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
type TpoLotteryProps = { lottery: string | undefined };
type RenderCard = {
@@ -81,13 +83,25 @@ watch(
async function load(): Promise<void> {
if (!props.lottery) return;
if (card.value) return;
const resp = await painterReq.lottery(props.lottery);
if ("retcode" in resp) {
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
let resp: TGApp.BBS.Lottery.Resp | undefined;
try {
resp = await painterReq.lottery(props.lottery);
if (resp.retcode !== 0) {
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
await TGLogger.Warn(`[VpOverlayLottery][load] 获取抽奖数据异常`);
await TGLogger.Warn(`[VpOverlayLottery][load] [${resp.retcode}] ${resp.message}`);
return;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取抽奖数据异常: ${errMsg}`);
await TGLogger.Error(`[VpOverlayLottery][load] 获取抽奖数据异常`);
await TGLogger.Error(`[VpOverlayLottery][load] ${e}`);
return;
}
jsonData.value = resp;
if (resp.status === "Settled") timeStatus.value = "已开奖";
if (!resp) return;
jsonData.value = resp.data.show_lottery;
if (resp.data.show_lottery.status === "Settled") timeStatus.value = "已开奖";
else {
if (timer !== undefined) {
clearInterval(timer);
@@ -95,7 +109,7 @@ async function load(): Promise<void> {
}
timer = setInterval(flushTimeStatus, 1000);
}
card.value = transLotteryCard(resp);
card.value = transLotteryCard(resp.data.show_lottery);
upWay.value = getUpWay(card.value?.upWay);
}

View File

@@ -439,10 +439,7 @@ async function refreshAvatars(
return false;
}
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取战绩数据异常: ${errMsg}`);
await TGLogger.Error(`[Record][refreshRecord] 获取战绩异常`);
await TGLogger.Error(`${e}`);

View File

@@ -436,10 +436,7 @@ async function refresh(): Promise<void> {
}
} catch (e) {
await showLoading.end();
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取战绩数据异常: ${errMsg}`);
await TGLogger.Error(`[Characters][refresh] 获取战绩异常`);
await TGLogger.Error(`${e}`);

View File

@@ -599,10 +599,7 @@ async function loadYatta(): Promise<void> {
try {
yattaData.value = await fetchYattaJson();
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取Yatta数据失败${errMsg}`);
await TGLogger.Error(`[Gacha][loadYatta] 获取Yatta数据失败`);
await TGLogger.Error(`[Gacha][loadYatta] ${e}`);

View File

@@ -163,10 +163,7 @@ async function refreshRecord(): Promise<void> {
return;
}
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取战绩数据异常: ${errMsg}`);
await TGLogger.Error(`[Record][refreshRecord] 获取战绩异常`);
await TGLogger.Error(`${e}`);

View File

@@ -85,7 +85,6 @@ import TusOutput from "@comp/userScripts/tus-output.vue";
import TusSign from "@comp/userScripts/tus-sign.vue";
import apiHubReq from "@req/apiHubReq.js";
import miscReq from "@req/miscReq.js";
import painterReq from "@req/painterReq.js";
import TSUserAccount from "@Sqlm/userAccount.js";
import useUserStore from "@store/user.js";
import { exit } from "@tauri-apps/plugin-process";
@@ -184,7 +183,6 @@ async function tryCkVerify(): Promise<void> {
let challenge: string | undefined = undefined;
while (!flag) {
await showLoading.start("正在验证CK有效性");
await painterReq.forum.recent(26, 2, 1, undefined, 20, ck);
const resp = await apiHubReq.sign(ck, 2, challenge);
await showLoading.update(`[${resp.retcode}] ${resp.message}`);
if (resp.retcode === -100) {

View File

@@ -51,10 +51,7 @@ async function test() {
}
showSnackbar.success("成功获取实时便笺数据");
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取实时便笺失败:${errMsg}`);
await TGLogger.Error(`[PageTest][test] 获取实时便笺失败`);
await TGLogger.Error(`[PageTest][test] ${e}`);

View File

@@ -124,6 +124,9 @@ import { createPost } from "@utils/TGWindow.js";
import { storeToRefs } from "pinia";
import { computed, nextTick, onMounted, ref, shallowRef, watch } from "vue";
import { useRoute, useRouter } from "vue-router";
import TGHttps from "@utils/TGHttps.js";
import useAppStore from "@store/app.js";
import useUserStore from "@store/user.js";
type SortSelect<T extends number = number> = { text: string; value: T; icon: string };
type SortSelectForum = Omit<SortSelect<TGApp.BBS.Post.ForumSortTypeEnum>, "icon">;
@@ -157,6 +160,9 @@ const showUser = ref<boolean>(false);
const bbsStore = useBBSStore();
const { gameList, forumList } = storeToRefs(bbsStore);
const { incognito } = storeToRefs(useAppStore());
const { cookie } = storeToRefs(useUserStore());
const selectedForum = shallowRef<SortSelect>();
const sortGameList = shallowRef<Array<SortSelectGame>>([]);
const postRaw = shallowRef<PostRaw>({ isLast: false, lastId: "", total: 0 });
@@ -167,6 +173,10 @@ const curGame = computed<SortSelectGame | undefined>(() => {
const curForums = computed<Array<SortSelect>>(() => {
return curGame.value?.forum ?? [];
});
const reqCk = computed<TGApp.App.Account.Cookie | undefined>(() => {
if (incognito.value) return undefined;
return cookie.value;
});
onMounted(async () => {
await showLoading.start("正在加载帖子数据");
@@ -253,25 +263,26 @@ function getSortLabel(value: number): string {
async function getCurrentPosts(
loadMore: boolean = false,
forum: number,
): Promise<TGApp.BBS.Forum.PostForumRes> {
): Promise<TGApp.BBS.Forum.PostForumResp> {
const mod20 = postRaw.value.total % 20;
const pageSize = mod20 === 0 ? 20 : 20 - mod20;
if (curSortType.value === 3) {
if (loadMore) {
return await painterReq.forum.hot(forum, curGid.value, postRaw.value.lastId, pageSize);
}
return await painterReq.forum.hot(forum, curGid.value);
}
if (loadMore) {
return await painterReq.forum.recent(
return await painterReq.forum.hot(
forum,
curGid.value,
curSortType.value,
postRaw.value.lastId,
pageSize,
loadMore ? postRaw.value.lastId : undefined,
loadMore ? pageSize : 20,
reqCk.value,
);
}
return await painterReq.forum.recent(forum, curGid.value, curSortType.value);
return await painterReq.forum.recent(
forum,
curGid.value,
curSortType.value,
loadMore ? postRaw.value.lastId : undefined,
loadMore ? pageSize : 20,
reqCk.value,
);
}
async function freshPostData(): Promise<void> {
@@ -293,14 +304,34 @@ async function freshPostData(): Promise<void> {
);
await showLoading.update(`版块:${forumLabel},排序:${sortLabel}`);
document.documentElement.scrollTo({ top: 0, behavior: "smooth" });
const postsGet = await getCurrentPosts(false, selectedForum.value.value);
posts.value = postsGet.list;
// 获取帖子列表
let postsResp: TGApp.BBS.Forum.PostForumResp | undefined;
try {
postsResp = await getCurrentPosts(false, selectedForum.value.value);
if (postsResp.retcode !== 0) {
showSnackbar.error(`[${postsResp.retcode}] ${postsResp.message}`);
await TGLogger.Warn(`[PostForum][freshPostData] 获取帖子列表异常`);
await TGLogger.Warn(`[PostForum][freshPostData] ${postsResp.retcode}-${postsResp.message}`);
await showLoading.end();
isReq.value = false;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取帖子列表异常:${errMsg}`);
await TGLogger.Error(`[PostForum][freshPostData] 获取帖子列表异常`);
await TGLogger.Error(`[PostForum][freshPostData] ${e}`);
await showLoading.end();
isReq.value = false;
}
if (!postsResp) return;
// 处理帖子列表数据
posts.value = postsResp.data.list;
postRaw.value = {
isLast: postsGet.is_last,
lastId: postsGet.last_id,
total: postsGet.list.length,
isLast: postsResp.data.is_last,
lastId: postsResp.data.last_id,
total: postsResp.data.list.length,
};
showSnackbar.success(`刷新成功,共加载 ${postsGet.list.length} 条帖子`);
showSnackbar.success(`刷新成功,共加载 ${postsResp.data.list.length} 条帖子`);
await showLoading.end();
isReq.value = false;
}
@@ -317,17 +348,38 @@ async function loadMore(): Promise<void> {
if (isReq.value) return;
isReq.value = true;
await showLoading.start("正在加载更多帖子数据", `游戏:${curGame.value?.text}`);
const postsGet = await getCurrentPosts(true, selectedForum.value.value);
await showLoading.update(
`版块:${selectedForum.value.text},排序:${getSortLabel(curSortType.value)},数量:${postsGet.list.length}`,
);
posts.value = posts.value.concat(postsGet.list);
// 获取帖子列表
let postsResp: TGApp.BBS.Forum.PostForumResp | undefined;
try {
postsResp = await getCurrentPosts(true, selectedForum.value.value);
if (postsResp.retcode !== 0) {
showSnackbar.error(`[${postsResp.retcode}] ${postsResp.message}`);
await TGLogger.Warn(`[PostForum][loadMore] 获取帖子列表异常`);
await TGLogger.Warn(`[PostForum][loadMore] ${postsResp.retcode}-${postsResp.message}`);
await showLoading.end();
isReq.value = false;
}
await showLoading.update(
`版块:${selectedForum.value.text},排序:${getSortLabel(curSortType.value)},数量:${postsResp.data.list.length}`,
);
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取帖子列表异常:${errMsg}`);
await TGLogger.Error(`[PostForum][loadMore] 获取帖子列表异常`);
await TGLogger.Error(`[PostForum][loadMore] ${e}`);
await showLoading.end();
isReq.value = false;
}
if (!postsResp) return;
// 处理帖子列表数据
posts.value = posts.value.concat(postsResp.data.list);
postRaw.value = {
isLast: postsGet.is_last,
lastId: postsGet.last_id,
total: postRaw.value.total + postsGet.list.length,
isLast: postsResp.data.is_last,
lastId: postsResp.data.last_id,
total: postRaw.value.total + postsResp.data.list.length,
};
showSnackbar.success(`加载成功,共加载 ${postsGet.list.length} 条帖子`);
showSnackbar.success(`加载成功,共加载 ${postsResp.data.list.length} 条帖子`);
await showLoading.end();
isReq.value = false;
}

View File

@@ -15,13 +15,13 @@
</v-tabs>
<v-text-field
v-model="search"
:clearable="true"
:hide-details="true"
append-inner-icon="mdi-magnify"
class="pn-nav-search"
density="compact"
label="请输入帖子 ID 或搜索词"
variant="outlined"
:clearable="true"
@keydown.enter="searchPost()"
@click:append-inner="searchPost()"
/>
@@ -69,6 +69,7 @@ import { createPost } from "@utils/TGWindow.js";
import { storeToRefs } from "pinia";
import { computed, onMounted, reactive, type Ref, ref, shallowRef, watch } from "vue";
import { useRoute } from "vue-router";
import TGHttps from "@utils/TGHttps.js";
type PostData = Record<TGApp.BBS.Post.NewsTypeEnum, Ref<Array<TGApp.BBS.Post.FullData>>>;
type RawItem = { isLast: boolean; name: string; lastId: number };
@@ -134,15 +135,43 @@ async function firstLoad(refresh: boolean = false): Promise<void> {
postData[key] = [];
rawData[key].lastId = 0;
}
// 获取咨讯数据
await showLoading.start(`正在获取${label.value}${rawData[key].name}数据`);
const getData = await painterReq.news(gid, key);
await showLoading.update(`数量:${getData.list.length},是否最后一页:${getData.is_last}`);
rawData[key] = { isLast: getData.is_last, name: rawData[key].name, lastId: getData.list.length };
postData[key] = getData.list;
let getResp: TGApp.BBS.Post.NewsResp | undefined;
try {
getResp = await painterReq.news(gid, key);
if (getResp.retcode !== 0) {
showSnackbar.error(`[${getResp.retcode}] ${getResp.message}`);
await TGLogger.Warn(`[PostNews][firstLoad] 获取咨讯异常`);
await TGLogger.Warn(`[PostNews][firstLoad] [${getResp.retcode}] ${getResp.message}`);
await showLoading.end();
loading.value = false;
return;
}
await showLoading.update(
`数量:${getResp.data.list.length},是否最后一页:${getResp.data.is_last}`,
);
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取${label.value}${rawData[key].name}异常:${errMsg}`);
await TGLogger.Error(`[PostNews][firstLoad] 获取咨讯异常`);
await TGLogger.Error(`[PostNews][firstLoad] ${e}`);
await showLoading.end();
loading.value = false;
return;
}
if (!getResp) return;
// 处理咨讯数据
rawData[key] = {
isLast: getResp.data.is_last,
name: rawData[key].name,
lastId: getResp.data.list.length,
};
postData[key] = getResp.data.list;
await showLoading.end();
await TGLogger.Info(`[News][${gid}][firstLoad] 获取${rawData[key].name}数据成功`);
showSnackbar.success(
`获取${label.value}${rawData[key].name}数据成功,共 ${getData.list.length}`,
`获取${label.value}${rawData[key].name}数据成功,共 ${getResp.data.list.length}`,
);
loading.value = false;
}
@@ -166,11 +195,36 @@ async function loadMore(): Promise<void> {
await showLoading.start(`正在获取${label.value}${rawData[key].name}数据`);
const mod = rawData[key].lastId % 20;
const pageSize = mod === 0 ? 20 : 20 - mod;
const getData = await painterReq.news(gid, key, pageSize, rawData[key].lastId);
await showLoading.update(`数量:${getData.list.length},是否最后一页:${getData.is_last}`);
rawData[key].lastId = rawData[key].lastId + getData.list.length;
rawData[key].isLast = getData.is_last;
postData[key] = postData[key].concat(getData.list);
// 获取咨讯数据
await showLoading.start(`正在获取${label.value}${rawData[key].name}数据`);
let getResp: TGApp.BBS.Post.NewsResp | undefined;
try {
getResp = await painterReq.news(gid, key, pageSize, rawData[key].lastId);
if (getResp.retcode !== 0) {
showSnackbar.error(`[${getResp.retcode}] ${getResp.message}`);
await TGLogger.Warn(`[PostNews][loadMore] 获取咨讯异常`);
await TGLogger.Warn(`[PostNews][loadMore] [${getResp.retcode}] ${getResp.message}`);
await showLoading.end();
loading.value = false;
return;
}
await showLoading.update(
`数量:${getResp.data.list.length},是否最后一页:${getResp.data.is_last}`,
);
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取${label.value}${rawData[key].name}异常:${errMsg}`);
await TGLogger.Error(`[PostNews][loadMore] 获取咨讯异常`);
await TGLogger.Error(`[PostNews][loadMore] ${e}`);
await showLoading.end();
loading.value = false;
return;
}
if (!getResp) return;
// 处理咨讯数据
rawData[key].lastId = rawData[key].lastId + getResp.data.list.length;
rawData[key].isLast = getResp.data.is_last;
postData[key] = postData[key].concat(getResp.data.list);
if (rawData[key].isLast) {
await showLoading.end();
showSnackbar.warn("已经是最后一页了");
@@ -179,7 +233,7 @@ async function loadMore(): Promise<void> {
}
await showLoading.end();
loading.value = false;
showSnackbar.success(`加载成功,共加载 ${getData.list.length}`);
showSnackbar.success(`加载成功,共加载 ${getResp.data.list.length}`);
}
async function searchPost(): Promise<void> {

View File

@@ -46,10 +46,7 @@ async function getMixinKey(): Promise<string> {
try {
navResp = await getNavResp();
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
await TGLogger.Error(`[Bili][GetMixinKey] Nav 请求异常:${errMsg}`);
return "";
}

View File

@@ -1,19 +1,19 @@
/**
* painter 下的请求
* @since Beta v0.9.9
* @since Beta v0.10.0
*/
import bbsEnum from "@enum/bbs.js";
import { getRequestHeader } from "@utils/getRequestHeader.js";
import TGHttp from "@utils/TGHttp.js";
import TGHttps from "@utils/TGHttps.js";
// BBSApiPainterBaseUrl => bapBu
const bapBu: Readonly<string> = "https://bbs-api.miyoushe.com/painter/wapi/";
/**
* 获取 News 列表
* @since Beta v0.7.1
* @since Beta v0.10.0
* @param gid - GID
* @param newsType - 资讯类型: 1 为公告2 为活动3 为资讯
* @param newsType - 资讯类型
* @param pageSize - 返回数量
* @param lastId - 上一次请求的最后一条数据的 id
* @returns News 列表响应数据
@@ -23,23 +23,22 @@ async function getNewsList(
newsType: TGApp.BBS.Post.NewsTypeEnum = bbsEnum.post.newsType.NEWS,
pageSize: number = 20,
lastId: number = 0,
): Promise<TGApp.BBS.Post.NewsRes> {
return (
await TGHttp<TGApp.BBS.Post.NewsResp>(`${bapBu}getNewsList`, {
method: "GET",
headers: { "Content-Type": "application/json" },
query: { gids: gid, page_size: pageSize, type: newsType, last_id: lastId },
})
).data;
): Promise<TGApp.BBS.Post.NewsResp> {
const resp = await TGHttps.get<TGApp.BBS.Post.NewsResp>(`${bapBu}getNewsList`, {
headers: { "Content-Type": "application/json" },
query: { gids: gid, page_size: pageSize, type: newsType, last_id: lastId },
});
return resp.data;
}
/**
* 获取最近版块热门帖子列表
* @since Beta v0.7.9
* @since Beta v0.10.0
* @param forumId - 版块 ID
* @param gid - 社区 ID
* @param pageSize - 每页数量
* @param lastId - 最后 ID
* @param cookie - 请求 CK
* @returns 帖子列表数据
*/
async function getHotForumPostList(
@@ -47,33 +46,27 @@ async function getHotForumPostList(
gid: number,
lastId?: string,
pageSize: number = 20,
): Promise<TGApp.BBS.Forum.PostForumRes> {
type ReqParams = {
forum_id: number;
gids: number;
page_size: number;
is_good: boolean;
last_id?: string;
};
const params: ReqParams = {
cookie?: TGApp.App.Account.Cookie,
): Promise<TGApp.BBS.Forum.PostForumResp> {
const params: TGApp.BBS.Forum.PostForumParams = {
forum_id: forumId,
gids: gid,
page_size: pageSize,
is_good: false,
};
if (lastId) params.last_id = lastId;
return (
await TGHttp<TGApp.BBS.Forum.PostForumResp>(`${bapBu}getHotForumPostList`, {
method: "GET",
query: params,
headers: { cookie: "" },
})
).data;
let header: Record<string, string> = { cookie: "" };
if (cookie) header = getRequestHeader(cookie, "GET", params);
const resp = await TGHttps.get<TGApp.BBS.Forum.PostForumResp>(`${bapBu}getHotForumPostList`, {
query: params,
headers: header,
});
return resp.data;
}
/**
* 获取最近版块帖子列表
* @since Beta v0.9.9
* @since Beta v0.10.0
* @param forumId - 版块 ID
* @param gid - 社区 ID
* @param type - 排序方式: 1-最新回复2-最新发布
@@ -88,17 +81,9 @@ async function getRecentForumPostList(
type: TGApp.BBS.Post.ForumSortTypeEnum = bbsEnum.post.forumSortType.LATEST_REPLY,
lastId?: string,
pageSize: number = 20,
cookie?: Record<string, string>,
): Promise<TGApp.BBS.Forum.PostForumRes> {
type ReqParams = {
forum_id: number;
gids: number;
sort_type: TGApp.BBS.Post.ForumSortTypeEnum;
is_good: boolean;
page_size: number;
last_id?: string;
};
const params: ReqParams = {
cookie?: TGApp.App.Account.Cookie,
): Promise<TGApp.BBS.Forum.PostForumResp> {
const params: TGApp.BBS.Forum.PostForumParams = {
forum_id: forumId,
gids: gid,
sort_type: type,
@@ -108,18 +93,16 @@ async function getRecentForumPostList(
if (lastId) params.last_id = lastId;
let header: Record<string, string> = { cookie: "" };
if (cookie) header = getRequestHeader(cookie, "GET", params);
return (
await TGHttp<TGApp.BBS.Forum.PostForumResp>(`${bapBu}getRecentForumPostList`, {
method: "GET",
query: params,
headers: header,
})
).data;
const resp = await TGHttps.get<TGApp.BBS.Forum.PostForumResp>(`${bapBu}getRecentForumPostList`, {
query: params,
headers: header,
});
return resp.data;
}
/**
* 获取关注动态帖子
* @since Beta v0.7.2
* @since Beta v0.10.0
* @param cookie - 用户 Cookie
* @param offset - 偏移量
* @returns 帖子
@@ -127,42 +110,30 @@ async function getRecentForumPostList(
async function getTimelineList(
cookie: TGApp.App.Account.Cookie,
offset?: number,
): Promise<TGApp.BBS.Response.Base | TGApp.BBS.Post.FollowPostRes> {
): Promise<TGApp.BBS.Post.FollowPostResp> {
let param: Record<string, number> = { gids: 0, size: 20 };
if (offset) param = { ...param, offset };
const ck = { ltoken: cookie.ltoken, ltuid: cookie.ltuid };
const header = getRequestHeader(ck, "GET", param, "X4", true);
const resp = await TGHttp<TGApp.BBS.Response.Base | TGApp.BBS.Post.FollowPostResp>(
`${bapBu}timeline/list`,
{
method: "GET",
headers: header,
query: param,
},
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
const resp = await TGHttps.get<TGApp.BBS.Post.FollowPostResp>(`${bapBu}timeline/list`, {
headers: header,
query: param,
});
return resp.data;
}
/**
* 获取抽奖信息
* @since Beta v0.7.1
* @since Beta v0.10.0
* @param lotteryId - 抽奖 ID
* @returns 抽奖详情
*/
async function lotteryUserShow(
lotteryId: string,
): Promise<TGApp.BBS.Response.Base | TGApp.BBS.Lottery.FullData> {
const resp = await TGHttp<TGApp.BBS.Response.Base | TGApp.BBS.Lottery.Resp>(
`${bapBu}lottery/user/show`,
{
method: "GET",
headers: { "Content-Type": "application/json" },
query: { id: lotteryId },
},
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
return resp.data.show_lottery;
async function lotteryUserShow(lotteryId: string): Promise<TGApp.BBS.Lottery.Resp> {
const resp = await TGHttps.get<TGApp.BBS.Lottery.Resp>(`${bapBu}lottery/user/show`, {
headers: { "Content-Type": "application/json" },
query: { id: lotteryId },
});
return resp.data;
}
const painterReq = {

View File

@@ -15,6 +15,28 @@ declare namespace TGApp.BBS.Forum {
};
};
/**
* 获取版块帖子列表请求参数
* @since Beta v0.10.0
*/
type PostForumParams = {
/** 版块ID */
forum_id: number;
/** 分区ID */
gids: number;
/**
* 排序类型
* @remarks 仅用于获取最近帖子
*/
sort_type?: TGApp.BBS.Post.ForumSortTypeEnum;
/** 页面尺寸 */
page_size: number;
/** 是否精华 */
is_good: boolean;
/** 偏移ID */
last_id?: string;
};
/**
* 获取版块帖子列表返回
* @since Beta v0.7.1

View File

@@ -19,10 +19,7 @@ async function getLrv(): Promise<string> {
const lrResp = await TGHttps.get<TGApp.Plugins.Github.LastestReleaseResp>(LR_API);
return lrResp.data.tag_name.replace("v", "");
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.warn(`获取远程仓库版本异常:${errMsg}`);
await TGLogger.Error(`[Github][getLrv] 获取远程仓库版本异常 ${LR_API}`);
await TGLogger.Error(`[Github][getLrv] ${e}`);

View File

@@ -137,6 +137,21 @@ async function request<T>(
}
}
/**
* 判断是否为 HTTP 错误
* @since Beta v0.10.0
* @param error - 错误对象
* @returns 是否为 HTTP 错误
*/
function isHttpErr(error: unknown): error is TGApp.App.Response.HttpErr {
return (
typeof error === "object" &&
error !== null &&
"message" in error &&
typeof error.message === "string"
);
}
const TGHttps = {
/**
* GET 请求
@@ -184,7 +199,7 @@ const TGHttps = {
return await rawResponse.arrayBuffer();
} catch (error) {
let httpError: TGApp.App.Response.HttpErr;
if (this.isHttpErr(error)) {
if (isHttpErr(error)) {
httpError = error;
} else if (error instanceof Error) {
httpError = createHttpError(error.message, { cause: error });
@@ -210,18 +225,17 @@ const TGHttps = {
): Promise<TGApp.App.Response.Resp<T>> => request<T>(method, url, config),
/**
* 判断是否为 HTTP 错误
* 获取 ErrMsg
* @since Beta v0.10.0
* @param error - 错误对象
* @returns 是否为 HTTP 错误
* @returns 错误信息
*/
isHttpErr: (error: unknown): error is TGApp.App.Response.HttpErr => {
return (
typeof error === "object" &&
error !== null &&
"message" in error &&
typeof error.message === "string"
);
getErrMsg(error: unknown): string {
let res = String(error);
if (isHttpErr(error)) {
res = error.status ? `[${error.status}] ${error.statusText}` : error.message;
}
return res;
},
};

View File

@@ -1,6 +1,6 @@
/**
* 日志工具
* @since Beta v0.7.0
* @since Beta v0.10.0
*/
import { event } from "@tauri-apps/api";
@@ -76,15 +76,18 @@ class Logger {
/**
* 输出日志-脚本
* @since Beta v0.7.0
* @since Beta v0.10.0
* @param message - 日志信息
* @param type - 日志类型
* @returns 无返回值
*/
async Script(message: string): Promise<void> {
async Script(message: string, type: string = "info"): Promise<void> {
const timeNow = timestampToDate(new Date().getTime());
const msg = `[${timeNow}]${message}`;
const msg = `[${type.toUpperCase()}][${timeNow}]${message}`;
await event.emitTo("TeyvatGuide", "userScriptLog", msg);
await info(message);
if (type === "info") await info(message);
if (type === "warn") await warn(message);
if (type === "error") await error(message);
}
/**

View File

@@ -60,10 +60,7 @@ export async function saveImgFile(url: string, fn: string, fmt?: string): Promis
try {
buffer = await TGHttps.buffer(url);
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取图像Buffer失败${errMsg}`);
await TGLogger.Error(`[TGShare][saveImgFile] 获取图像Buffer失败${url}`);
await TGLogger.Error(`${e}`);
@@ -85,10 +82,7 @@ export async function saveImgBlob(url: string): Promise<string> {
try {
buffer = await TGHttps.buffer(url);
} catch (e) {
let errMsg = String(e);
if (TGHttps.isHttpErr(e)) {
errMsg = e.status ? `[${e.status}] ${e.statusText}` : e.message;
}
const errMsg = TGHttps.getErrMsg(e);
await TGLogger.Error(`[TGShare][saveImgBlob] 获取图像Buffer失败: ${url}`);
await TGLogger.Error(`[TGShare][saveImgBlob] ${errMsg}`);
return url;