From 9403fef320400e0b5ccccfe8be5760c6741134fa Mon Sep 17 00:00:00 2001 From: Wanxp <977741432@qq.com> Date: Mon, 10 Mar 2025 09:02:54 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20#132=20=E5=90=8C=E6=AD=A5=E6=B8=B8?= =?UTF-8?q?=E6=88=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/wanxp/constant/Constsant.ts | 1 + src/org/wanxp/constant/Douban.ts | 4 + src/org/wanxp/constant/DoubanUserState.ts | 11 ++- .../wanxp/douban/component/DoubanSyncModal.ts | 13 ++- .../douban/setting/LoginSettingsHelper.ts | 2 +- .../wanxp/douban/sync/handler/SyncHandler.ts | 2 + .../handler/list/DoubanAbstractListHandler.ts | 2 +- .../list/DoubanGameCollectListHandler.ts | 2 +- .../handler/list/DoubanGameDoListHandler.ts | 2 +- .../handler/list/DoubanGameListHandler.ts | 94 ++++++++++++++++++- .../handler/list/DoubanGameWishListHandler.ts | 2 +- src/org/wanxp/lang/locale/en.ts | 1 + src/org/wanxp/lang/locale/zh-cn.ts | 1 + 13 files changed, 126 insertions(+), 11 deletions(-) diff --git a/src/org/wanxp/constant/Constsant.ts b/src/org/wanxp/constant/Constsant.ts index 088faad..35fceda 100644 --- a/src/org/wanxp/constant/Constsant.ts +++ b/src/org/wanxp/constant/Constsant.ts @@ -233,6 +233,7 @@ export const SyncTypeRecords: { [key in SyncType | string]: string } = { // [SyncType.broadcast]: i18nHelper.getMessage('504104'), // [SyncType.note]: i18nHelper.getMessage('504105'), [SyncType.music]: i18nHelper.getMessage('504106'), + // [SyncType.game]: i18nHelper.getMessage('504108'), } /** diff --git a/src/org/wanxp/constant/Douban.ts b/src/org/wanxp/constant/Douban.ts index a2df574..8a22960 100644 --- a/src/org/wanxp/constant/Douban.ts +++ b/src/org/wanxp/constant/Douban.ts @@ -10,3 +10,7 @@ export const doubanHeaders = { export const doubanSubjectSyncListUrl = function(subjectType:string, userId:string, doType:string, start:number):string { return `https://${subjectType}.douban.com/people/${userId}/${doType}?start=${start}&sort=time&rating=all&filter=all&mode=list`; } + +export const doubanGameSubjectSyncListUrl = function(subjectType:string, userId:string, doType:string, start:number):string { + return `https://douban.com/people/${userId}/games?start=${start}&sort=time&rating=all&filter=all&mode=list${doType != 'all' ? '&action='+doType : ''}`; +} diff --git a/src/org/wanxp/constant/DoubanUserState.ts b/src/org/wanxp/constant/DoubanUserState.ts index 16c598f..a8d7ba9 100644 --- a/src/org/wanxp/constant/DoubanUserState.ts +++ b/src/org/wanxp/constant/DoubanUserState.ts @@ -106,6 +106,15 @@ export const DoubanSubjectStateRecords_BOOK_SYNC: { [key in DoubanSubjectState]: [DoubanSubjectState.collect]: i18nHelper.getMessage('500304'), } +// @ts-ignore +export const DoubanSubjectStateRecords_GAME_SYNC: { [key in DoubanSubjectState]: string } = { + // @ts-ignore + [ALL]: i18nHelper.getMessage('500004'), + [DoubanSubjectState.wish]: i18nHelper.getMessage('500602'), + [DoubanSubjectState.do]: i18nHelper.getMessage('500603'), + [DoubanSubjectState.collect]: i18nHelper.getMessage('500604'), +} + export const DoubanSubjectStateRecords_BROADCAST_SYNC: { [key :string]: string } = { [ALL]: i18nHelper.getMessage('500004'), } @@ -129,7 +138,7 @@ export const DoubanSubjectStateRecords_SYNC: { [key in SyncType]: Record { @@ -251,7 +253,7 @@ ${syncStatus.getHandle() == 0? '...' : i18nHelper.getMessage('110042') + ':' + T config.syncType = value; config.templateFile = this.getDefaultTemplatePath(value); this.openScopeDropdown(scopeSelections, config, disable); - this.showTemplateFileSelectionSetting(templateFile, config, disable); + // this.showTemplateFileSelectionSetting(templateFile, config, disable); }); }).setDisabled(disable); this.openScopeDropdown(scopeSelections, config, disable); @@ -274,6 +276,9 @@ ${syncStatus.getHandle() == 0? '...' : i18nHelper.getMessage('110042') + ':' + T case SyncType.teleplay: result = (settings.teleplayTemplateFile == '' || settings.teleplayTemplateFile == null) ? DEFAULT_SETTINGS.teleplayTemplateFile : settings.teleplayTemplateFile break; + case SyncType.game: + result = (settings.gameTemplateFile == '' || settings.gameTemplateFile == null) ? DEFAULT_SETTINGS.gameTemplateFile : settings.gameTemplateFile + break; } return result; } diff --git a/src/org/wanxp/douban/setting/LoginSettingsHelper.ts b/src/org/wanxp/douban/setting/LoginSettingsHelper.ts index 08f893b..c1a3405 100644 --- a/src/org/wanxp/douban/setting/LoginSettingsHelper.ts +++ b/src/org/wanxp/douban/setting/LoginSettingsHelper.ts @@ -82,7 +82,7 @@ export function constructLoginSettingsUI(containerEl: HTMLElement, manager: Sett 'a', { text: i18nHelper.getMessage('100139'), - href: 'https://obsidian-douban.wanxuping.com/20_howtouse_25_setting_login_douban_cookie.html', + href: 'https://wanxp.github.io/obsidian-douban/20_howtouse_25_setting_login_douban_cookie.html', }, (a) => { a.setAttr('target', '_blank'); diff --git a/src/org/wanxp/douban/sync/handler/SyncHandler.ts b/src/org/wanxp/douban/sync/handler/SyncHandler.ts index 90cbdf3..bc226e3 100644 --- a/src/org/wanxp/douban/sync/handler/SyncHandler.ts +++ b/src/org/wanxp/douban/sync/handler/SyncHandler.ts @@ -10,6 +10,7 @@ import { DoubanBookSyncHandler } from "./DoubanBookSyncHandler"; import {i18nHelper} from "../../../lang/helper"; import {DoubanTeleplaySyncHandler} from "./DoubanTeleplaySyncHandler"; import {SyncConditionType} from "../../../constant/Constsant"; +import {DoubanGameSyncHandler} from "./DoubanGameSyncHandler"; export default class SyncHandler { private app: App; @@ -34,6 +35,7 @@ export default class SyncHandler { // new DoubanNoteSyncHandler(plugin), new DoubanMusicSyncHandler(plugin), new DoubanTeleplaySyncHandler(plugin), + new DoubanGameSyncHandler(plugin), this.defaultSyncHandler ]; } diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanAbstractListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanAbstractListHandler.ts index a56cbba..317c1a1 100644 --- a/src/org/wanxp/douban/sync/handler/list/DoubanAbstractListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanAbstractListHandler.ts @@ -40,7 +40,7 @@ export default abstract class DoubanAbstractListHandler async delay(ms: number) {} - private getUrl(context: HandleContext, start: number) { + protected getUrl(context: HandleContext, start: number) { return doubanSubjectSyncListUrl( this.getSyncTypeDomain(), context.userComponent.getUserId(), diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanGameCollectListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanGameCollectListHandler.ts index 8c3aae4..f946f52 100644 --- a/src/org/wanxp/douban/sync/handler/list/DoubanGameCollectListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanGameCollectListHandler.ts @@ -3,7 +3,7 @@ import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; import {DoubanGameListHandler} from "./DoubanGameListHandler"; -export default class DoubanGameCollectListHandler extends DoubanMovieListHandler{ +export default class DoubanGameCollectListHandler extends DoubanGameListHandler{ getDoType(): string { return DoubanSubjectState.collect; } diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanGameDoListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanGameDoListHandler.ts index 47a6856..f1f5133 100644 --- a/src/org/wanxp/douban/sync/handler/list/DoubanGameDoListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanGameDoListHandler.ts @@ -3,7 +3,7 @@ import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; import {DoubanGameListHandler} from "./DoubanGameListHandler"; -export default class DoubanGameDoListHandler extends DoubanMovieListHandler{ +export default class DoubanGameDoListHandler extends DoubanGameListHandler{ getDoType(): string { return DoubanSubjectState.do; } diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanGameListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanGameListHandler.ts index 33aa2ac..8200385 100644 --- a/src/org/wanxp/douban/sync/handler/list/DoubanGameListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanGameListHandler.ts @@ -1,5 +1,13 @@ import DoubanAbstractListHandler from "./DoubanAbstractListHandler"; -import { SyncType} from "../../../../constant/Constsant"; +import {PAGE_SIZE, SubjectHandledStatus, SyncType} from "../../../../constant/Constsant"; +import {CheerioAPI} from "cheerio"; +import HandleContext from "../../../data/model/HandleContext"; +import {SearchPageTypeOf} from "../../../data/model/SearchPageTypeOf"; +import {SubjectListItem} from "../../../data/model/SubjectListItem"; +import {log} from "../../../../utils/Logutil"; +import {SearchPage} from "../../../data/model/SearchPage"; +import {doubanGameSubjectSyncListUrl, doubanSubjectSyncListUrl} from "../../../../constant/Douban"; +import {ALL, DoubanSubjectState} from "../../../../constant/DoubanUserState"; export abstract class DoubanGameListHandler extends DoubanAbstractListHandler { getSyncType(): SyncType { @@ -8,6 +16,90 @@ export abstract class DoubanGameListHandler extends DoubanAbstractListHandler { abstract getDoType(): string; + protected getUrl(context: HandleContext, start: number) { + return doubanGameSubjectSyncListUrl( + this.getSyncTypeDomain(), + context.userComponent.getUserId(), + this.getDoType(), + start, + ); + } + + parseSubjectFromHtml( + dataHtml: CheerioAPI, + context: HandleContext, + ): SearchPageTypeOf { + const items = dataHtml(".common-item") + .get() + .map((i: any) => { + const item = dataHtml(i); + const linkValue: string = item + .find("div.title > a") + .attr("href"); + const titleValue: string = item + .find("div.title > a") + .text() + .trim(); + const updateDateStr: string = item.find("div.date").text().trim(); + let updateDate = null; + try { + updateDate = new Date(updateDateStr); + }catch (e) { + console.error(e); + log.info("parse date error:" + titleValue); + } + let idPattern = /(\d){5,10}/g; + let ececResult = idPattern.exec(linkValue); + return !ececResult ? null : {id: ececResult[0], url: linkValue, title: titleValue, updateDate: updateDate}; + // return linkValue; + }); + const total = this.getTotal(dataHtml, context); + return new SearchPage( + total, + Math.floor(context.syncOffset / PAGE_SIZE) + 1, + PAGE_SIZE, + null, + items, + ); + } + + private getTotal(dataHtml: CheerioAPI, + context: HandleContext):number { + const countDescs = dataHtml("div.tabs > a") + .get() + .map((i: any) => { + const item = dataHtml(i); + return item.text().trim(); + }); + const {syncConfig} = context; + const {scope} = syncConfig; + const pattern = /(\d+)/g; + + const wishCount = this.getCount(countDescs, '想玩', pattern); + const collectCount = this.getCount(countDescs, '玩过', pattern); + const doCount = this.getCount(countDescs, '在玩', pattern); + + + switch (scope) { + case DoubanSubjectState.wish: + return wishCount; + case DoubanSubjectState.collect: + return collectCount; + case DoubanSubjectState.do: + return doCount; + case ALL: + return wishCount + collectCount + doCount; + } + + + } + + private getCount(countDescs:string[], keyword:string, pattern:RegExp):number { + return countDescs.filter(desc => desc.includes(keyword)).map(desc => { + const result = pattern.exec(desc); + return result ? parseInt(result[0], 10) : 0; + })[0]; + } } diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanGameWishListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanGameWishListHandler.ts index 88c8da0..0e41f91 100644 --- a/src/org/wanxp/douban/sync/handler/list/DoubanGameWishListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanGameWishListHandler.ts @@ -3,7 +3,7 @@ import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; import {DoubanGameListHandler} from "./DoubanGameListHandler"; -export default class DoubanGameWishListHandler extends DoubanMovieListHandler{ +export default class DoubanGameWishListHandler extends DoubanGameListHandler{ getDoType(): string { return DoubanSubjectState.wish; } diff --git a/src/org/wanxp/lang/locale/en.ts b/src/org/wanxp/lang/locale/en.ts index 949fcb4..f7462a3 100644 --- a/src/org/wanxp/lang/locale/en.ts +++ b/src/org/wanxp/lang/locale/en.ts @@ -628,6 +628,7 @@ PS: This file could be delete if you want to. '504104': `My Broadcast`, '504105': `My Note`, '504106': `My Music`, + '504108': `My Game`, '500002': `Sync Status`, diff --git a/src/org/wanxp/lang/locale/zh-cn.ts b/src/org/wanxp/lang/locale/zh-cn.ts index ec219ec..adeea99 100644 --- a/src/org/wanxp/lang/locale/zh-cn.ts +++ b/src/org/wanxp/lang/locale/zh-cn.ts @@ -641,6 +641,7 @@ export default { '504104': `我的广播`, '504105': `我的日记`, '504106': `我的音乐`, + '504108': `我的游戏`, 'ALL': `全部类型`,