koishi-plugin-kkk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -0
- package/LICENSE +674 -0
- package/README.md +98 -0
- package/assets/web/assets/CronEditor-CYgFpX-g.js +1 -0
- package/assets/web/assets/DesktopLayout-iI43ij11.js +1 -0
- package/assets/web/assets/MobileLayout-CziU8MCR.js +1 -0
- package/assets/web/assets/ThemeSwitch-DFohhwd9.js +1 -0
- package/assets/web/assets/index-BRROK0vh.js +47 -0
- package/assets/web/assets/index-Dj-StEiS.css +2 -0
- package/assets/web/assets/separator-CxcFlCzz.js +1 -0
- package/assets/web/favicon.svg +1 -0
- package/assets/web/icons.svg +24 -0
- package/assets/web/index.html +15 -0
- package/assets/webui.html +115 -0
- package/client/index.ts +63 -0
- package/config/default_config/app.yaml +64 -0
- package/config/default_config/bilibili.yaml +116 -0
- package/config/default_config/config.json +157 -0
- package/config/default_config/cookies.yaml +11 -0
- package/config/default_config/douyin.yaml +99 -0
- package/config/default_config/kuaishou.yaml +8 -0
- package/config/default_config/pushlist.yaml +37 -0
- package/config/default_config/request.yaml +22 -0
- package/config/default_config/upload.yaml +50 -0
- package/config/default_config/xiaohongshu.yaml +23 -0
- package/dist/index.js +1 -0
- package/lib/compat/axios.js +23 -0
- package/lib/compat/cron.js +77 -0
- package/lib/compat/esm.js +15 -0
- package/lib/compat/express.js +23 -0
- package/lib/compat/heroui.js +12 -0
- package/lib/compat/lodash.js +33 -0
- package/lib/compat/logger.js +118 -0
- package/lib/compat/node-karin.js +1053 -0
- package/lib/compat/phosphor-icons.js +27 -0
- package/lib/compat/qqcard.js +256 -0
- package/lib/compat/root.js +44 -0
- package/lib/compat/runtime.js +87 -0
- package/lib/compat/segment.js +167 -0
- package/lib/compat/sqlite3.js +117 -0
- package/lib/compat/start.js +7 -0
- package/lib/compat/syncConfig.js +65 -0
- package/lib/compat/template-react.js +30 -0
- package/lib/compat/text.js +65 -0
- package/lib/compat/yaml.js +13 -0
- package/lib/configBridge.js +91 -0
- package/lib/index.js +775 -0
- package/lib/karin/app.js +34 -0
- package/lib/karin/apps/__ready.js +9 -0
- package/lib/karin/apps/admin.js +136 -0
- package/lib/karin/apps/help.js +233 -0
- package/lib/karin/apps/push.js +291 -0
- package/lib/karin/apps/qrlogin.js +176 -0
- package/lib/karin/apps/statistics.js +209 -0
- package/lib/karin/apps/testPush.js +247 -0
- package/lib/karin/apps/tools.js +473 -0
- package/lib/karin/apps/update.js +252 -0
- package/lib/karin/index.js +37 -0
- package/lib/karin/module/db/bilibili.js +831 -0
- package/lib/karin/module/db/douyin.js +918 -0
- package/lib/karin/module/db/index.js +165 -0
- package/lib/karin/module/db/migration.js +199 -0
- package/lib/karin/module/db/statistics.js +559 -0
- package/lib/karin/module/index.js +94 -0
- package/lib/karin/module/server/constants/routes.js +48 -0
- package/lib/karin/module/server/controllers/bots.js +230 -0
- package/lib/karin/module/server/controllers/config.js +75 -0
- package/lib/karin/module/server/controllers/video.js +208 -0
- package/lib/karin/module/server/index.js +26 -0
- package/lib/karin/module/server/middlewares/auth.js +133 -0
- package/lib/karin/module/server/routes/amagi.js +57 -0
- package/lib/karin/module/server/routes/api.js +40 -0
- package/lib/karin/module/server/routes/index.js +97 -0
- package/lib/karin/module/server/routes/ssr.js +16 -0
- package/lib/karin/module/server/routes/static.js +43 -0
- package/lib/karin/module/utils/Base.js +403 -0
- package/lib/karin/module/utils/CardParser.js +487 -0
- package/lib/karin/module/utils/Common.js +418 -0
- package/lib/karin/module/utils/Config.js +434 -0
- package/lib/karin/module/utils/EmojiReaction.js +242 -0
- package/lib/karin/module/utils/ErrorHandler/handler.js +114 -0
- package/lib/karin/module/utils/ErrorHandler/index.js +55 -0
- package/lib/karin/module/utils/ErrorHandler/render.js +182 -0
- package/lib/karin/module/utils/ErrorHandler/sender.js +206 -0
- package/lib/karin/module/utils/ErrorHandler/strategy.js +41 -0
- package/lib/karin/module/utils/ErrorHandler/types.js +2 -0
- package/lib/karin/module/utils/ErrorHandler/utils.js +108 -0
- package/lib/karin/module/utils/FFmpeg.js +298 -0
- package/lib/karin/module/utils/ImageHelper.js +91 -0
- package/lib/karin/module/utils/ImageSlice.js +429 -0
- package/lib/karin/module/utils/MotionPhoto.js +250 -0
- package/lib/karin/module/utils/Network/Downloader.js +413 -0
- package/lib/karin/module/utils/Network/ImageDownloader.js +250 -0
- package/lib/karin/module/utils/Network/Network.js +332 -0
- package/lib/karin/module/utils/Network/ThrottleStream.js +71 -0
- package/lib/karin/module/utils/Network/constants.js +129 -0
- package/lib/karin/module/utils/Network/helpers.js +174 -0
- package/lib/karin/module/utils/Network/index.js +34 -0
- package/lib/karin/module/utils/Network/types.js +12 -0
- package/lib/karin/module/utils/Networks.js +17 -0
- package/lib/karin/module/utils/ParseLock.js +34 -0
- package/lib/karin/module/utils/ParseOverride.js +88 -0
- package/lib/karin/module/utils/QqCardResolve.js +114 -0
- package/lib/karin/module/utils/QqPanel.js +879 -0
- package/lib/karin/module/utils/Render/coverTheme.js +256 -0
- package/lib/karin/module/utils/Render/index.js +582 -0
- package/lib/karin/module/utils/amagiClient.js +338 -0
- package/lib/karin/module/utils/avatar.js +201 -0
- package/lib/karin/module/utils/bot.js +141 -0
- package/lib/karin/module/utils/build-metadata.js +50 -0
- package/lib/karin/module/utils/changelog.js +166 -0
- package/lib/karin/module/utils/index.js +26 -0
- package/lib/karin/module/utils/loginSession.js +259 -0
- package/lib/karin/module/utils/parseTip.js +93 -0
- package/lib/karin/module/utils/runtime-report.js +140 -0
- package/lib/karin/module/utils/semver.js +72 -0
- package/lib/karin/module/utils/statisticsAggregate.js +415 -0
- package/lib/karin/platform/bilibili/bilibili.js +1805 -0
- package/lib/karin/platform/bilibili/comments.js +294 -0
- package/lib/karin/platform/bilibili/danmaku.js +555 -0
- package/lib/karin/platform/bilibili/dynamic-text.js +827 -0
- package/lib/karin/platform/bilibili/genParams.js +37 -0
- package/lib/karin/platform/bilibili/getID.js +159 -0
- package/lib/karin/platform/bilibili/index.js +24 -0
- package/lib/karin/platform/bilibili/live-status.js +40 -0
- package/lib/karin/platform/bilibili/login.js +132 -0
- package/lib/karin/platform/bilibili/push.js +1397 -0
- package/lib/karin/platform/bilibili/riskControl.js +133 -0
- package/lib/karin/platform/bilibili/search.js +299 -0
- package/lib/karin/platform/common/danmaku-types.js +12 -0
- package/lib/karin/platform/douyin/comments.js +310 -0
- package/lib/karin/platform/douyin/danmaku.js +893 -0
- package/lib/karin/platform/douyin/douyin.js +1145 -0
- package/lib/karin/platform/douyin/getID.js +94 -0
- package/lib/karin/platform/douyin/index.js +24 -0
- package/lib/karin/platform/douyin/login.js +230 -0
- package/lib/karin/platform/douyin/push/favorite.js +75 -0
- package/lib/karin/platform/douyin/push/index.js +21 -0
- package/lib/karin/platform/douyin/push/live.js +69 -0
- package/lib/karin/platform/douyin/push/post.js +60 -0
- package/lib/karin/platform/douyin/push/recommend.js +74 -0
- package/lib/karin/platform/douyin/push/render.js +621 -0
- package/lib/karin/platform/douyin/push/types.js +2 -0
- package/lib/karin/platform/douyin/push.js +1128 -0
- package/lib/karin/platform/douyin/types.js +13 -0
- package/lib/karin/platform/douyin/videoQuality.js +222 -0
- package/lib/karin/platform/douyin/workType.js +182 -0
- package/lib/karin/platform/index.js +20 -0
- package/lib/karin/platform/kuaishou/comments.js +91 -0
- package/lib/karin/platform/kuaishou/getID.js +43 -0
- package/lib/karin/platform/kuaishou/getdata.js +41 -0
- package/lib/karin/platform/kuaishou/index.js +20 -0
- package/lib/karin/platform/kuaishou/kuaishou.js +122 -0
- package/lib/karin/platform/xiaohongshu/comments.js +162 -0
- package/lib/karin/platform/xiaohongshu/getID.js +129 -0
- package/lib/karin/platform/xiaohongshu/index.js +18 -0
- package/lib/karin/platform/xiaohongshu/xiaohongshu.js +643 -0
- package/lib/karin/root.js +73 -0
- package/lib/karin/setup.js +99 -0
- package/lib/karin/types/config/amagi.js +2 -0
- package/lib/karin/types/config/app.js +2 -0
- package/lib/karin/types/config/bilibili.js +2 -0
- package/lib/karin/types/config/cookies.js +2 -0
- package/lib/karin/types/config/douyin.js +2 -0
- package/lib/karin/types/config/index.js +2 -0
- package/lib/karin/types/config/kuaishou.js +2 -0
- package/lib/karin/types/config/pushlist.js +2 -0
- package/lib/karin/types/config/request.js +2 -0
- package/lib/karin/types/config/upload.js +2 -0
- package/lib/karin/types/config/xiaohongshu.js +2 -0
- package/lib/karin/types/datatypes.js +2 -0
- package/lib/karin/types/index.js +18 -0
- package/lib/karin/types/netrorks/NetworksConfigType.js +2 -0
- package/lib/karin/types/netrorks/index.js +17 -0
- package/lib/karin/web.config.js +49 -0
- package/lib/ktr/registry.js +82 -0
- package/lib/ktr/template/_preview/components/PreviewInfoCard.js +10 -0
- package/lib/ktr/template/_preview/components/PreviewLayout.js +10 -0
- package/lib/ktr/template/_preview/components/PreviewVideoCard.js +8 -0
- package/lib/ktr/template/_preview/render.js +142 -0
- package/lib/ktr/template/_preview/types.js +2 -0
- package/lib/ktr/template/_preview/utils/status.js +31 -0
- package/lib/ktr/template/_preview/utils/time.js +12 -0
- package/lib/ktr/template/bilibili/bangumi/components/bangumi.js +127 -0
- package/lib/ktr/template/bilibili/bangumi/components/types.js +2 -0
- package/lib/ktr/template/bilibili/bangumi/index.js +12 -0
- package/lib/ktr/template/bilibili/comment/components/Comment.js +193 -0
- package/lib/ktr/template/bilibili/comment/components/types.js +2 -0
- package/lib/ktr/template/bilibili/comment/index.js +10 -0
- package/lib/ktr/template/bilibili/components/Icons.js +66 -0
- package/lib/ktr/template/bilibili/components/shared.js +93 -0
- package/lib/ktr/template/bilibili/components/types.js +2 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/DYNAMIC_TYPE_ARTICLE.js +66 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/types.js +2 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/index.js +10 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/DYNAMIC_TYPE_AV.js +87 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/types.js +2 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/index.js +10 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/DYNAMIC_TYPE_DRAW.js +93 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/types.js +2 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/index.js +10 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/DYNAMIC_TYPE_FORWARD.js +132 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/types.js +2 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/index.js +10 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/DYNAMIC_TYPE_LIVE_RCMD.js +84 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/types.js +2 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/index.js +10 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/DYNAMIC_TYPE_WORD.js +38 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/types.js +2 -0
- package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/index.js +10 -0
- package/lib/ktr/template/bilibili/dynamic/components/AdditionalCard.js +59 -0
- package/lib/ktr/template/bilibili/dynamic/components/CommonComponents.js +30 -0
- package/lib/ktr/template/bilibili/dynamic/types.js +2 -0
- package/lib/ktr/template/bilibili/qrcodeImg/components/qrcodeImg.js +48 -0
- package/lib/ktr/template/bilibili/qrcodeImg/components/types.js +3 -0
- package/lib/ktr/template/bilibili/qrcodeImg/index.js +10 -0
- package/lib/ktr/template/bilibili/userlist/components/UserList.js +53 -0
- package/lib/ktr/template/bilibili/userlist/components/types.js +3 -0
- package/lib/ktr/template/bilibili/userlist/index.js +13 -0
- package/lib/ktr/template/bilibili/videoInfo/components/types.js +2 -0
- package/lib/ktr/template/bilibili/videoInfo/components/videoInfo.js +62 -0
- package/lib/ktr/template/bilibili/videoInfo/index.js +10 -0
- package/lib/ktr/template/components/AmbientCover.js +36 -0
- package/lib/ktr/template/components/DefaultLayout.js +33 -0
- package/lib/ktr/template/components/GlowImage.js +276 -0
- package/lib/ktr/template/components/QRCodeWithAvatar.js +34 -0
- package/lib/ktr/template/components/RolldownLogo.js +6 -0
- package/lib/ktr/template/components/ViteLogo.js +6 -0
- package/lib/ktr/template/components/iconRegistry.js +173 -0
- package/lib/ktr/template/douyin/article-work/components/ArticleWork.js +99 -0
- package/lib/ktr/template/douyin/article-work/components/types.js +3 -0
- package/lib/ktr/template/douyin/article-work/index.js +10 -0
- package/lib/ktr/template/douyin/comment/components/Comment.js +189 -0
- package/lib/ktr/template/douyin/comment/components/types.js +2 -0
- package/lib/ktr/template/douyin/comment/index.js +10 -0
- package/lib/ktr/template/douyin/components/Icons.js +29 -0
- package/lib/ktr/template/douyin/components/types.js +3 -0
- package/lib/ktr/template/douyin/dynamic/components/Dynamic.js +90 -0
- package/lib/ktr/template/douyin/dynamic/components/types.js +3 -0
- package/lib/ktr/template/douyin/dynamic/index.js +10 -0
- package/lib/ktr/template/douyin/favorite-list/components/FavoriteList.js +30 -0
- package/lib/ktr/template/douyin/favorite-list/components/types.js +3 -0
- package/lib/ktr/template/douyin/favorite-list/index.js +10 -0
- package/lib/ktr/template/douyin/image-work/components/ImageWork.js +136 -0
- package/lib/ktr/template/douyin/image-work/components/types.js +2 -0
- package/lib/ktr/template/douyin/image-work/index.js +10 -0
- package/lib/ktr/template/douyin/live/components/Live.js +51 -0
- package/lib/ktr/template/douyin/live/components/types.js +3 -0
- package/lib/ktr/template/douyin/live/index.js +10 -0
- package/lib/ktr/template/douyin/musicinfo/components/MusicInfo.js +60 -0
- package/lib/ktr/template/douyin/musicinfo/components/types.js +3 -0
- package/lib/ktr/template/douyin/musicinfo/index.js +10 -0
- package/lib/ktr/template/douyin/qrcodeImg/components/qrcodeImg.js +39 -0
- package/lib/ktr/template/douyin/qrcodeImg/components/types.js +3 -0
- package/lib/ktr/template/douyin/qrcodeImg/index.js +9 -0
- package/lib/ktr/template/douyin/recommend-list/components/RecommendList.js +30 -0
- package/lib/ktr/template/douyin/recommend-list/components/types.js +3 -0
- package/lib/ktr/template/douyin/recommend-list/index.js +10 -0
- package/lib/ktr/template/douyin/user_profile/components/UserVideoList.js +54 -0
- package/lib/ktr/template/douyin/user_profile/components/types.js +3 -0
- package/lib/ktr/template/douyin/user_profile/index.js +9 -0
- package/lib/ktr/template/douyin/userlist/components/UserList.js +50 -0
- package/lib/ktr/template/douyin/userlist/components/types.js +3 -0
- package/lib/ktr/template/douyin/userlist/index.js +13 -0
- package/lib/ktr/template/douyin/video-work/components/VideoWork.js +127 -0
- package/lib/ktr/template/douyin/video-work/components/types.js +2 -0
- package/lib/ktr/template/douyin/video-work/index.js +10 -0
- package/lib/ktr/template/kuaishou/comment/components/Comment.js +88 -0
- package/lib/ktr/template/kuaishou/comment/components/types.js +2 -0
- package/lib/ktr/template/kuaishou/comment/index.js +10 -0
- package/lib/ktr/template/other/changelog/components/changelog.js +117 -0
- package/lib/ktr/template/other/changelog/components/types.js +3 -0
- package/lib/ktr/template/other/changelog/index.js +9 -0
- package/lib/ktr/template/other/handlerError/components/errorTitles.js +227 -0
- package/lib/ktr/template/other/handlerError/components/handlerError.js +392 -0
- package/lib/ktr/template/other/handlerError/components/stackHighlight.js +109 -0
- package/lib/ktr/template/other/handlerError/components/types.js +2 -0
- package/lib/ktr/template/other/handlerError/index.js +9 -0
- package/lib/ktr/template/other/help/components/Help.js +79 -0
- package/lib/ktr/template/other/help/components/types.js +3 -0
- package/lib/ktr/template/other/help/index.js +12 -0
- package/lib/ktr/template/other/live-photo-tip/components/LivePhotoTip.js +80 -0
- package/lib/ktr/template/other/live-photo-tip/components/types.js +3 -0
- package/lib/ktr/template/other/live-photo-tip/index.js +9 -0
- package/lib/ktr/template/other/qrlogin/components/qrlogin.js +58 -0
- package/lib/ktr/template/other/qrlogin/components/types.js +3 -0
- package/lib/ktr/template/other/qrlogin/index.js +9 -0
- package/lib/ktr/template/other/runtime/components/runtime.js +101 -0
- package/lib/ktr/template/other/runtime/components/types.js +3 -0
- package/lib/ktr/template/other/runtime/index.js +9 -0
- package/lib/ktr/template/other/version_warning/components/VersionWarning.js +38 -0
- package/lib/ktr/template/other/version_warning/components/types.js +3 -0
- package/lib/ktr/template/other/version_warning/index.js +9 -0
- package/lib/ktr/template/statistics/components/BoxplotGuide.js +17 -0
- package/lib/ktr/template/statistics/components/ChartCard.js +15 -0
- package/lib/ktr/template/statistics/components/KpiCard.js +14 -0
- package/lib/ktr/template/statistics/components/PlatformTable.js +20 -0
- package/lib/ktr/template/statistics/components/RankList.js +61 -0
- package/lib/ktr/template/statistics/components/SSRChart.js +22 -0
- package/lib/ktr/template/statistics/components/chartPresets.js +630 -0
- package/lib/ktr/template/statistics/components/chartTheme.js +226 -0
- package/lib/ktr/template/statistics/components/format.js +38 -0
- package/lib/ktr/template/statistics/components/types.js +9 -0
- package/lib/ktr/template/statistics/global/components/GlobalStatistics.js +246 -0
- package/lib/ktr/template/statistics/global/components/types.js +3 -0
- package/lib/ktr/template/statistics/global/index.js +9 -0
- package/lib/ktr/template/statistics/group/components/GroupStatistics.js +181 -0
- package/lib/ktr/template/statistics/group/components/types.js +3 -0
- package/lib/ktr/template/statistics/group/index.js +9 -0
- package/lib/ktr/template/types/ctx.js +2 -0
- package/lib/ktr/template/xiaohongshu/comment/components/Comment.js +99 -0
- package/lib/ktr/template/xiaohongshu/comment/components/types.js +3 -0
- package/lib/ktr/template/xiaohongshu/comment/index.js +9 -0
- package/lib/ktr/template/xiaohongshu/noteInfo/components/noteInfo.js +93 -0
- package/lib/ktr/template/xiaohongshu/noteInfo/components/types.js +2 -0
- package/lib/ktr/template/xiaohongshu/noteInfo/index.js +9 -0
- package/lib/ktr/utils/QRCodeAvatar.js +99 -0
- package/lib/ktr/utils/QRcode.js +56 -0
- package/lib/ktr/utils/avatarProxy.js +45 -0
- package/lib/ktr/utils/cn.js +11 -0
- package/lib/ktr/utils/theme.js +12 -0
- package/lib/qqFields.json +75 -0
- package/lib/qqOptions.js +44 -0
- package/lib/richtext/index.js +25 -0
- package/lib/richtext/parse/index.js +232 -0
- package/lib/richtext/react/cn.js +11 -0
- package/lib/richtext/react/index.js +221 -0
- package/lib/richtext/types.js +2 -0
- package/lib/schema.js +352 -0
- package/lib/webui.js +341 -0
- package/package.json +88 -0
- package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_BV.svg +1 -0
- package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_GOODS.svg +1 -0
- package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_LOTTERY.svg +1 -0
- package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_VIEW_PICTURE.svg +1 -0
- package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_VOTE.svg +1 -0
- package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_WEB.svg +1 -0
- package/resources/image/bilibili/bilibili-dark.png +0 -0
- package/resources/image/bilibili/bilibili-light.png +0 -0
- package/resources/image/bilibili/bilibili.png +0 -0
- package/resources/image/bilibili/id-dark.svg +1 -0
- package/resources/image/bilibili/id-light.svg +1 -0
- package/resources/image/bilibili/level/lv0.svg +1 -0
- package/resources/image/bilibili/level/lv1.svg +1 -0
- package/resources/image/bilibili/level/lv2.svg +1 -0
- package/resources/image/bilibili/level/lv3.svg +1 -0
- package/resources/image/bilibili/level/lv4.svg +1 -0
- package/resources/image/bilibili/level/lv5.svg +1 -0
- package/resources/image/bilibili/level/lv6.svg +1 -0
- package/resources/image/bilibili/level/lv7.svg +1 -0
- package/resources/image/bilibili/like-dark.svg +6 -0
- package/resources/image/bilibili/like-light.svg +6 -0
- package/resources/image/bilibili/play.svg +28 -0
- package/resources/image/bilibili/res-local1.png +0 -0
- package/resources/image/bilibili/up_pb.svg +1 -0
- package/resources/image/bilibili//347/233/264/346/222/255/344/270/255.png +0 -0
- package/resources/image/douyin/douyin.png +0 -0
- package/resources/image/douyin/dylogo-dark.svg +23 -0
- package/resources/image/douyin/dylogo-light.svg +38 -0
- package/resources/image/douyin/search-dark.svg +1 -0
- package/resources/image/douyin/search-light.svg +3 -0
- package/resources/image/douyin//346/212/226/351/237/263-/347/233/264/346/222/255/344/270/255.png +0 -0
- package/resources/image/frame-logo.png +0 -0
- package/resources/image/kuaishou/logo.png +0 -0
- package/resources/image/other/handlerError/Milky.png +0 -0
- package/resources/image/other/handlerError/chronocat.svg +43 -0
- package/resources/image/other/handlerError/conwechat.webp +0 -0
- package/resources/image/other/handlerError/gocq-http.webp +0 -0
- package/resources/image/other/handlerError/lagrange.webp +0 -0
- package/resources/image/other/handlerError/llonebot.webp +0 -0
- package/resources/image/other/handlerError/napcat.webp +0 -0
- package/resources/image/other/handlerError/onebot.png +0 -0
- package/resources/image/other/handlerError/satori.png +0 -0
- package/resources/image/xiaohongshu/logo.png +0 -0
- package/resources/template/style.css +23708 -0
- package/resources/vite.svg +130 -0
- package/scripts/build.mjs +129 -0
- package/scripts/check-schema.cjs +55 -0
- package/scripts/deploy.mjs +78 -0
- package/scripts/make-demo-placeholders.mjs +112 -0
- package/scripts/patch-deps.mjs +46 -0
- package/scripts/patch-webui.mjs +112 -0
- package/scripts/smoke-commands.cjs +39 -0
- package/scripts/smoke-config.cjs +122 -0
- package/scripts/smoke-douyin.cjs +170 -0
- package/scripts/smoke-koishi-commands.cjs +210 -0
- package/scripts/smoke-login.cjs +110 -0
- package/scripts/smoke-parse.cjs +54 -0
- package/scripts/smoke-push-mock.cjs +114 -0
- package/scripts/smoke-push.cjs +104 -0
- package/scripts/smoke-qq.cjs +147 -0
- package/scripts/smoke-qqcard.cjs +108 -0
- package/scripts/smoke-qqpanel.cjs +205 -0
- package/scripts/smoke-render.cjs +106 -0
- package/scripts/smoke-server.cjs +94 -0
- package/src/compat/axios.ts +5 -0
- package/src/compat/cron.ts +86 -0
- package/src/compat/esm.ts +13 -0
- package/src/compat/express.ts +5 -0
- package/src/compat/heroui.tsx +53 -0
- package/src/compat/lodash.ts +32 -0
- package/src/compat/logger.ts +121 -0
- package/src/compat/node-karin.ts +1064 -0
- package/src/compat/phosphor-icons.tsx +25 -0
- package/src/compat/qqcard.ts +251 -0
- package/src/compat/root.ts +44 -0
- package/src/compat/runtime.ts +120 -0
- package/src/compat/segment.ts +161 -0
- package/src/compat/sqlite3.ts +123 -0
- package/src/compat/start.ts +3 -0
- package/src/compat/syncConfig.ts +64 -0
- package/src/compat/template-react.ts +54 -0
- package/src/compat/text.ts +58 -0
- package/src/compat/yaml.ts +6 -0
- package/src/configBridge.ts +94 -0
- package/src/index.ts +769 -0
- package/src/karin/app.ts +1 -0
- package/src/karin/apps/__ready.ts +14 -0
- package/src/karin/apps/admin.ts +127 -0
- package/src/karin/apps/help.ts +228 -0
- package/src/karin/apps/push.ts +327 -0
- package/src/karin/apps/qrlogin.ts +160 -0
- package/src/karin/apps/statistics.ts +203 -0
- package/src/karin/apps/testPush.ts +226 -0
- package/src/karin/apps/tools.ts +510 -0
- package/src/karin/apps/update.ts +239 -0
- package/src/karin/index.ts +9 -0
- package/src/karin/module/db/bilibili.ts +1089 -0
- package/src/karin/module/db/douyin.ts +1218 -0
- package/src/karin/module/db/index.ts +159 -0
- package/src/karin/module/db/migration.ts +249 -0
- package/src/karin/module/db/statistics.ts +817 -0
- package/src/karin/module/index.ts +37 -0
- package/src/karin/module/server/constants/routes.ts +53 -0
- package/src/karin/module/server/controllers/bots.ts +289 -0
- package/src/karin/module/server/controllers/config.ts +85 -0
- package/src/karin/module/server/controllers/video.ts +212 -0
- package/src/karin/module/server/index.ts +11 -0
- package/src/karin/module/server/middlewares/auth.ts +147 -0
- package/src/karin/module/server/routes/amagi.ts +57 -0
- package/src/karin/module/server/routes/api.ts +42 -0
- package/src/karin/module/server/routes/index.ts +68 -0
- package/src/karin/module/server/routes/ssr.ts +14 -0
- package/src/karin/module/server/routes/static.ts +43 -0
- package/src/karin/module/utils/Base.ts +497 -0
- package/src/karin/module/utils/CardParser.ts +503 -0
- package/src/karin/module/utils/Common.ts +448 -0
- package/src/karin/module/utils/Config.ts +443 -0
- package/src/karin/module/utils/EmojiReaction.ts +268 -0
- package/src/karin/module/utils/ErrorHandler/handler.ts +124 -0
- package/src/karin/module/utils/ErrorHandler/index.ts +48 -0
- package/src/karin/module/utils/ErrorHandler/render.ts +180 -0
- package/src/karin/module/utils/ErrorHandler/sender.ts +192 -0
- package/src/karin/module/utils/ErrorHandler/strategy.ts +41 -0
- package/src/karin/module/utils/ErrorHandler/types.ts +122 -0
- package/src/karin/module/utils/ErrorHandler/utils.ts +108 -0
- package/src/karin/module/utils/FFmpeg.ts +357 -0
- package/src/karin/module/utils/ImageHelper.ts +90 -0
- package/src/karin/module/utils/ImageSlice.ts +383 -0
- package/src/karin/module/utils/MotionPhoto.ts +297 -0
- package/src/karin/module/utils/Network/Downloader.ts +481 -0
- package/src/karin/module/utils/Network/ImageDownloader.ts +291 -0
- package/src/karin/module/utils/Network/Network.ts +344 -0
- package/src/karin/module/utils/Network/ThrottleStream.ts +76 -0
- package/src/karin/module/utils/Network/constants.ts +135 -0
- package/src/karin/module/utils/Network/helpers.ts +183 -0
- package/src/karin/module/utils/Network/index.ts +28 -0
- package/src/karin/module/utils/Network/types.ts +46 -0
- package/src/karin/module/utils/Networks.ts +20 -0
- package/src/karin/module/utils/ParseLock.ts +33 -0
- package/src/karin/module/utils/ParseOverride.ts +128 -0
- package/src/karin/module/utils/QqCardResolve.ts +116 -0
- package/src/karin/module/utils/QqPanel.ts +880 -0
- package/src/karin/module/utils/Render/coverTheme.ts +294 -0
- package/src/karin/module/utils/Render/index.ts +574 -0
- package/src/karin/module/utils/amagiClient.ts +368 -0
- package/src/karin/module/utils/avatar.ts +220 -0
- package/src/karin/module/utils/bot.ts +115 -0
- package/src/karin/module/utils/build-metadata.ts +60 -0
- package/src/karin/module/utils/changelog.ts +175 -0
- package/src/karin/module/utils/index.ts +10 -0
- package/src/karin/module/utils/loginSession.ts +291 -0
- package/src/karin/module/utils/parseTip.ts +59 -0
- package/src/karin/module/utils/runtime-report.ts +142 -0
- package/src/karin/module/utils/semver.ts +60 -0
- package/src/karin/module/utils/statisticsAggregate.ts +507 -0
- package/src/karin/platform/bilibili/bilibili.ts +2004 -0
- package/src/karin/platform/bilibili/comments.ts +397 -0
- package/src/karin/platform/bilibili/danmaku.ts +653 -0
- package/src/karin/platform/bilibili/dynamic-text.ts +926 -0
- package/src/karin/platform/bilibili/genParams.ts +30 -0
- package/src/karin/platform/bilibili/getID.ts +163 -0
- package/src/karin/platform/bilibili/index.ts +8 -0
- package/src/karin/platform/bilibili/live-status.ts +36 -0
- package/src/karin/platform/bilibili/login.ts +130 -0
- package/src/karin/platform/bilibili/push.ts +1615 -0
- package/src/karin/platform/bilibili/riskControl.ts +114 -0
- package/src/karin/platform/bilibili/search.ts +305 -0
- package/src/karin/platform/common/danmaku-types.ts +18 -0
- package/src/karin/platform/douyin/comments.ts +404 -0
- package/src/karin/platform/douyin/danmaku.ts +1187 -0
- package/src/karin/platform/douyin/douyin.ts +1244 -0
- package/src/karin/platform/douyin/getID.ts +101 -0
- package/src/karin/platform/douyin/index.ts +8 -0
- package/src/karin/platform/douyin/login.ts +251 -0
- package/src/karin/platform/douyin/push/favorite.ts +97 -0
- package/src/karin/platform/douyin/push/index.ts +5 -0
- package/src/karin/platform/douyin/push/live.ts +86 -0
- package/src/karin/platform/douyin/push/post.ts +75 -0
- package/src/karin/platform/douyin/push/recommend.ts +96 -0
- package/src/karin/platform/douyin/push/render.ts +768 -0
- package/src/karin/platform/douyin/push/types.ts +41 -0
- package/src/karin/platform/douyin/push.ts +1241 -0
- package/src/karin/platform/douyin/types.ts +151 -0
- package/src/karin/platform/douyin/videoQuality.ts +234 -0
- package/src/karin/platform/douyin/workType.ts +238 -0
- package/src/karin/platform/index.ts +4 -0
- package/src/karin/platform/kuaishou/comments.ts +114 -0
- package/src/karin/platform/kuaishou/getID.ts +48 -0
- package/src/karin/platform/kuaishou/getdata.ts +78 -0
- package/src/karin/platform/kuaishou/index.ts +4 -0
- package/src/karin/platform/kuaishou/kuaishou.ts +130 -0
- package/src/karin/platform/xiaohongshu/comments.ts +227 -0
- package/src/karin/platform/xiaohongshu/getID.ts +127 -0
- package/src/karin/platform/xiaohongshu/index.ts +2 -0
- package/src/karin/platform/xiaohongshu/xiaohongshu.ts +733 -0
- package/src/karin/root.ts +78 -0
- package/src/karin/setup.ts +77 -0
- package/src/karin/types/config/amagi.ts +46 -0
- package/src/karin/types/config/app.ts +129 -0
- package/src/karin/types/config/bilibili.ts +121 -0
- package/src/karin/types/config/cookies.ts +11 -0
- package/src/karin/types/config/douyin.ts +93 -0
- package/src/karin/types/config/index.ts +41 -0
- package/src/karin/types/config/kuaishou.ts +10 -0
- package/src/karin/types/config/pushlist.ts +55 -0
- package/src/karin/types/config/request.ts +27 -0
- package/src/karin/types/config/upload.ts +49 -0
- package/src/karin/types/config/xiaohongshu.ts +24 -0
- package/src/karin/types/datatypes.ts +42 -0
- package/src/karin/types/index.ts +4 -0
- package/src/karin/types/netrorks/NetworksConfigType.ts +61 -0
- package/src/karin/types/netrorks/index.ts +1 -0
- package/src/karin/web.config.ts +48 -0
- package/src/ktr/registry.ts +55 -0
- package/src/ktr/template/_preview/components/PreviewInfoCard.tsx +33 -0
- package/src/ktr/template/_preview/components/PreviewLayout.tsx +65 -0
- package/src/ktr/template/_preview/components/PreviewVideoCard.tsx +22 -0
- package/src/ktr/template/_preview/render.ts +158 -0
- package/src/ktr/template/_preview/types.ts +15 -0
- package/src/ktr/template/_preview/utils/status.ts +29 -0
- package/src/ktr/template/_preview/utils/time.ts +8 -0
- package/src/ktr/template/bilibili/bangumi/components/bangumi.tsx +462 -0
- package/src/ktr/template/bilibili/bangumi/components/types.ts +36 -0
- package/src/ktr/template/bilibili/bangumi/index.tsx +9 -0
- package/src/ktr/template/bilibili/comment/components/Comment.tsx +657 -0
- package/src/ktr/template/bilibili/comment/components/types.ts +26 -0
- package/src/ktr/template/bilibili/comment/index.tsx +11 -0
- package/src/ktr/template/bilibili/components/Icons.tsx +209 -0
- package/src/ktr/template/bilibili/components/shared.tsx +162 -0
- package/src/ktr/template/bilibili/components/types.ts +388 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/DYNAMIC_TYPE_ARTICLE.tsx +251 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/types.ts +67 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/index.tsx +12 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/DYNAMIC_TYPE_AV.tsx +238 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/types.ts +39 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/index.tsx +12 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/DYNAMIC_TYPE_DRAW.tsx +205 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/types.ts +20 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/index.tsx +11 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/DYNAMIC_TYPE_FORWARD.tsx +348 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/types.ts +16 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/index.tsx +12 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/DYNAMIC_TYPE_LIVE_RCMD.tsx +264 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/types.ts +32 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/index.tsx +12 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/DYNAMIC_TYPE_WORD.tsx +68 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/types.ts +14 -0
- package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/index.tsx +12 -0
- package/src/ktr/template/bilibili/dynamic/components/AdditionalCard.tsx +165 -0
- package/src/ktr/template/bilibili/dynamic/components/CommonComponents.tsx +142 -0
- package/src/ktr/template/bilibili/dynamic/types.ts +382 -0
- package/src/ktr/template/bilibili/qrcodeImg/components/qrcodeImg.tsx +179 -0
- package/src/ktr/template/bilibili/qrcodeImg/components/types.ts +9 -0
- package/src/ktr/template/bilibili/qrcodeImg/index.tsx +12 -0
- package/src/ktr/template/bilibili/userlist/components/UserList.tsx +246 -0
- package/src/ktr/template/bilibili/userlist/components/types.ts +35 -0
- package/src/ktr/template/bilibili/userlist/index.tsx +11 -0
- package/src/ktr/template/bilibili/videoInfo/components/types.ts +28 -0
- package/src/ktr/template/bilibili/videoInfo/components/videoInfo.tsx +217 -0
- package/src/ktr/template/bilibili/videoInfo/index.tsx +12 -0
- package/src/ktr/template/components/AmbientCover.tsx +50 -0
- package/src/ktr/template/components/DefaultLayout.tsx +166 -0
- package/src/ktr/template/components/GlowImage.tsx +572 -0
- package/src/ktr/template/components/QRCodeWithAvatar.tsx +52 -0
- package/src/ktr/template/components/RolldownLogo.tsx +110 -0
- package/src/ktr/template/components/ViteLogo.tsx +134 -0
- package/src/ktr/template/components/iconRegistry.ts +294 -0
- package/src/ktr/template/douyin/article-work/components/ArticleWork.tsx +301 -0
- package/src/ktr/template/douyin/article-work/components/types.ts +53 -0
- package/src/ktr/template/douyin/article-work/index.tsx +12 -0
- package/src/ktr/template/douyin/comment/components/Comment.tsx +612 -0
- package/src/ktr/template/douyin/comment/components/types.ts +85 -0
- package/src/ktr/template/douyin/comment/index.tsx +11 -0
- package/src/ktr/template/douyin/components/Icons.tsx +75 -0
- package/src/ktr/template/douyin/components/types.ts +83 -0
- package/src/ktr/template/douyin/dynamic/components/Dynamic.tsx +283 -0
- package/src/ktr/template/douyin/dynamic/components/types.ts +46 -0
- package/src/ktr/template/douyin/dynamic/index.tsx +11 -0
- package/src/ktr/template/douyin/favorite-list/components/FavoriteList.tsx +201 -0
- package/src/ktr/template/douyin/favorite-list/components/types.ts +38 -0
- package/src/ktr/template/douyin/favorite-list/index.tsx +12 -0
- package/src/ktr/template/douyin/image-work/components/ImageWork.tsx +437 -0
- package/src/ktr/template/douyin/image-work/components/types.ts +78 -0
- package/src/ktr/template/douyin/image-work/index.tsx +11 -0
- package/src/ktr/template/douyin/live/components/Live.tsx +229 -0
- package/src/ktr/template/douyin/live/components/types.ts +47 -0
- package/src/ktr/template/douyin/live/index.tsx +11 -0
- package/src/ktr/template/douyin/musicinfo/components/MusicInfo.tsx +187 -0
- package/src/ktr/template/douyin/musicinfo/components/types.ts +31 -0
- package/src/ktr/template/douyin/musicinfo/index.tsx +11 -0
- package/src/ktr/template/douyin/qrcodeImg/components/qrcodeImg.tsx +170 -0
- package/src/ktr/template/douyin/qrcodeImg/components/types.ts +9 -0
- package/src/ktr/template/douyin/qrcodeImg/index.tsx +9 -0
- package/src/ktr/template/douyin/recommend-list/components/RecommendList.tsx +201 -0
- package/src/ktr/template/douyin/recommend-list/components/types.ts +37 -0
- package/src/ktr/template/douyin/recommend-list/index.tsx +12 -0
- package/src/ktr/template/douyin/user_profile/components/UserVideoList.tsx +225 -0
- package/src/ktr/template/douyin/user_profile/components/types.ts +71 -0
- package/src/ktr/template/douyin/user_profile/index.tsx +9 -0
- package/src/ktr/template/douyin/userlist/components/UserList.tsx +229 -0
- package/src/ktr/template/douyin/userlist/components/types.ts +35 -0
- package/src/ktr/template/douyin/userlist/index.tsx +11 -0
- package/src/ktr/template/douyin/video-work/components/VideoWork.tsx +398 -0
- package/src/ktr/template/douyin/video-work/components/types.ts +80 -0
- package/src/ktr/template/douyin/video-work/index.tsx +11 -0
- package/src/ktr/template/font.css +6071 -0
- package/src/ktr/template/global.d.ts +69 -0
- package/src/ktr/template/kuaishou/comment/components/Comment.tsx +207 -0
- package/src/ktr/template/kuaishou/comment/components/types.ts +47 -0
- package/src/ktr/template/kuaishou/comment/index.tsx +11 -0
- package/src/ktr/template/other/changelog/components/changelog.tsx +411 -0
- package/src/ktr/template/other/changelog/components/types.ts +21 -0
- package/src/ktr/template/other/changelog/index.tsx +9 -0
- package/src/ktr/template/other/handlerError/components/errorTitles.ts +224 -0
- package/src/ktr/template/other/handlerError/components/handlerError.tsx +1076 -0
- package/src/ktr/template/other/handlerError/components/stackHighlight.ts +127 -0
- package/src/ktr/template/other/handlerError/components/types.ts +124 -0
- package/src/ktr/template/other/handlerError/index.tsx +9 -0
- package/src/ktr/template/other/help/components/Help.tsx +249 -0
- package/src/ktr/template/other/help/components/types.ts +47 -0
- package/src/ktr/template/other/help/index.tsx +9 -0
- package/src/ktr/template/other/live-photo-tip/components/LivePhotoTip.tsx +295 -0
- package/src/ktr/template/other/live-photo-tip/components/types.ts +8 -0
- package/src/ktr/template/other/live-photo-tip/index.tsx +9 -0
- package/src/ktr/template/other/qrlogin/components/qrlogin.tsx +295 -0
- package/src/ktr/template/other/qrlogin/components/types.ts +11 -0
- package/src/ktr/template/other/qrlogin/index.tsx +9 -0
- package/src/ktr/template/other/runtime/components/runtime.tsx +347 -0
- package/src/ktr/template/other/runtime/components/types.ts +75 -0
- package/src/ktr/template/other/runtime/index.tsx +9 -0
- package/src/ktr/template/other/version_warning/components/VersionWarning.tsx +392 -0
- package/src/ktr/template/other/version_warning/components/types.ts +8 -0
- package/src/ktr/template/other/version_warning/index.tsx +9 -0
- package/src/ktr/template/statistics/components/BoxplotGuide.tsx +57 -0
- package/src/ktr/template/statistics/components/ChartCard.tsx +40 -0
- package/src/ktr/template/statistics/components/KpiCard.tsx +39 -0
- package/src/ktr/template/statistics/components/PlatformTable.tsx +83 -0
- package/src/ktr/template/statistics/components/RankList.tsx +127 -0
- package/src/ktr/template/statistics/components/SSRChart.tsx +41 -0
- package/src/ktr/template/statistics/components/chartPresets.ts +700 -0
- package/src/ktr/template/statistics/components/chartTheme.ts +234 -0
- package/src/ktr/template/statistics/components/format.ts +33 -0
- package/src/ktr/template/statistics/components/types.ts +92 -0
- package/src/ktr/template/statistics/global/components/GlobalStatistics.tsx +597 -0
- package/src/ktr/template/statistics/global/components/types.ts +138 -0
- package/src/ktr/template/statistics/global/index.tsx +9 -0
- package/src/ktr/template/statistics/group/components/GroupStatistics.tsx +468 -0
- package/src/ktr/template/statistics/group/components/types.ts +113 -0
- package/src/ktr/template/statistics/group/index.tsx +9 -0
- package/src/ktr/template/style.css +65 -0
- package/src/ktr/template/types/ctx.ts +42 -0
- package/src/ktr/template/xiaohongshu/comment/components/Comment.tsx +264 -0
- package/src/ktr/template/xiaohongshu/comment/components/types.ts +119 -0
- package/src/ktr/template/xiaohongshu/comment/index.tsx +9 -0
- package/src/ktr/template/xiaohongshu/noteInfo/components/noteInfo.tsx +271 -0
- package/src/ktr/template/xiaohongshu/noteInfo/components/types.ts +66 -0
- package/src/ktr/template/xiaohongshu/noteInfo/index.tsx +9 -0
- package/src/ktr/utils/QRCodeAvatar.ts +102 -0
- package/src/ktr/utils/QRcode.ts +65 -0
- package/src/ktr/utils/avatarProxy.ts +42 -0
- package/src/ktr/utils/cn.ts +6 -0
- package/src/ktr/utils/theme.ts +10 -0
- package/src/qqFields.json +75 -0
- package/src/qqOptions.ts +64 -0
- package/src/richtext/index.ts +9 -0
- package/src/richtext/parse/index.ts +271 -0
- package/src/richtext/react/cn.ts +6 -0
- package/src/richtext/react/index.tsx +582 -0
- package/src/richtext/types.ts +320 -0
- package/src/schema.ts +372 -0
- package/src/webui.ts +352 -0
|
@@ -0,0 +1,831 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BilibiliDBBase = void 0;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const amagi_1 = require("@ikenxuan/amagi");
|
|
10
|
+
const node_karin_1 = require("../../../compat/node-karin.js");
|
|
11
|
+
const root_1 = require("../../../compat/root.js");
|
|
12
|
+
const sqlite3_1 = __importDefault(require("../../../compat/sqlite3.js"));
|
|
13
|
+
const utils_1 = require("../../module/utils");
|
|
14
|
+
const Config_1 = require("../../module/utils/Config");
|
|
15
|
+
/** 数据库操作类 */
|
|
16
|
+
class BilibiliDBBase {
|
|
17
|
+
db;
|
|
18
|
+
dbPath;
|
|
19
|
+
constructor() {
|
|
20
|
+
this.dbPath = node_path_1.default.join(`${root_1.karinPathBase}/${utils_1.Root.pluginName}/data`, 'bilibili.db');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 初始化数据库
|
|
24
|
+
*/
|
|
25
|
+
async init() {
|
|
26
|
+
try {
|
|
27
|
+
node_karin_1.logger.debug(node_karin_1.logger.green('--------------------------[BilibiliDB] 开始初始化数据库--------------------------'));
|
|
28
|
+
node_karin_1.logger.debug('[BilibiliDB] 正在连接数据库...');
|
|
29
|
+
// 创建数据库连接
|
|
30
|
+
await node_fs_1.default.promises.mkdir(node_path_1.default.dirname(this.dbPath), { recursive: true });
|
|
31
|
+
this.db = new sqlite3_1.default.Database(this.dbPath);
|
|
32
|
+
// 创建表结构
|
|
33
|
+
await this.createTables();
|
|
34
|
+
node_karin_1.logger.debug('[BilibiliDB] 数据库模型同步成功');
|
|
35
|
+
node_karin_1.logger.debug('[BilibiliDB] 正在同步配置订阅...');
|
|
36
|
+
node_karin_1.logger.debug('[BilibiliDB] 配置项数量:', Config_1.Config.pushlist.bilibili?.length || 0);
|
|
37
|
+
await this.syncConfigSubscriptions(Config_1.Config.pushlist.bilibili);
|
|
38
|
+
node_karin_1.logger.debug('[BilibiliDB] 配置订阅同步成功');
|
|
39
|
+
node_karin_1.logger.debug(node_karin_1.logger.green('--------------------------[BilibiliDB] 初始化数据库完成--------------------------'));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
node_karin_1.logger.error('[BilibiliDB] 数据库初始化失败:', error);
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 创建数据库表结构
|
|
49
|
+
*/
|
|
50
|
+
async createTables() {
|
|
51
|
+
const queries = [
|
|
52
|
+
// 创建机器人表
|
|
53
|
+
`CREATE TABLE IF NOT EXISTS Bots (
|
|
54
|
+
id TEXT PRIMARY KEY,
|
|
55
|
+
createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
56
|
+
updatedAt TEXT DEFAULT CURRENT_TIMESTAMP
|
|
57
|
+
)`,
|
|
58
|
+
// 创建群组表
|
|
59
|
+
`CREATE TABLE IF NOT EXISTS Groups (
|
|
60
|
+
id TEXT NOT NULL,
|
|
61
|
+
botId TEXT NOT NULL,
|
|
62
|
+
createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
63
|
+
updatedAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
64
|
+
PRIMARY KEY (id, botId),
|
|
65
|
+
FOREIGN KEY (botId) REFERENCES Bots(id)
|
|
66
|
+
)`,
|
|
67
|
+
// 创建B站用户表
|
|
68
|
+
`CREATE TABLE IF NOT EXISTS BilibiliUsers (
|
|
69
|
+
host_mid INTEGER PRIMARY KEY,
|
|
70
|
+
remark TEXT,
|
|
71
|
+
filterMode TEXT DEFAULT 'blacklist',
|
|
72
|
+
createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
73
|
+
updatedAt TEXT DEFAULT CURRENT_TIMESTAMP
|
|
74
|
+
)`,
|
|
75
|
+
// 创建群组用户订阅关系表
|
|
76
|
+
`CREATE TABLE IF NOT EXISTS GroupUserSubscriptions (
|
|
77
|
+
groupId TEXT,
|
|
78
|
+
host_mid INTEGER,
|
|
79
|
+
createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
80
|
+
updatedAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
81
|
+
PRIMARY KEY (groupId, host_mid),
|
|
82
|
+
FOREIGN KEY (groupId) REFERENCES Groups(id),
|
|
83
|
+
FOREIGN KEY (host_mid) REFERENCES BilibiliUsers(host_mid)
|
|
84
|
+
)`,
|
|
85
|
+
// 创建动态缓存表
|
|
86
|
+
`CREATE TABLE IF NOT EXISTS DynamicCaches (
|
|
87
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
88
|
+
dynamic_id TEXT NOT NULL,
|
|
89
|
+
host_mid INTEGER NOT NULL,
|
|
90
|
+
groupId TEXT NOT NULL,
|
|
91
|
+
dynamic_type TEXT,
|
|
92
|
+
createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
93
|
+
updatedAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
94
|
+
FOREIGN KEY (host_mid) REFERENCES BilibiliUsers(host_mid),
|
|
95
|
+
FOREIGN KEY (groupId) REFERENCES Groups(id),
|
|
96
|
+
UNIQUE(dynamic_id, host_mid, groupId)
|
|
97
|
+
)`,
|
|
98
|
+
// 创建过滤词表
|
|
99
|
+
`CREATE TABLE IF NOT EXISTS FilterWords (
|
|
100
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
101
|
+
host_mid INTEGER NOT NULL,
|
|
102
|
+
word TEXT NOT NULL,
|
|
103
|
+
createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
104
|
+
updatedAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
105
|
+
FOREIGN KEY (host_mid) REFERENCES BilibiliUsers(host_mid),
|
|
106
|
+
UNIQUE(host_mid, word)
|
|
107
|
+
)`,
|
|
108
|
+
// 创建过滤标签表
|
|
109
|
+
`CREATE TABLE IF NOT EXISTS FilterTags (
|
|
110
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
111
|
+
host_mid INTEGER NOT NULL,
|
|
112
|
+
tag TEXT NOT NULL,
|
|
113
|
+
createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
114
|
+
updatedAt TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
115
|
+
FOREIGN KEY (host_mid) REFERENCES BilibiliUsers(host_mid),
|
|
116
|
+
UNIQUE(host_mid, tag)
|
|
117
|
+
)`
|
|
118
|
+
];
|
|
119
|
+
for (const query of queries) {
|
|
120
|
+
await this.runQuery(query);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 执行SQL查询
|
|
125
|
+
*/
|
|
126
|
+
runQuery(sql, params = []) {
|
|
127
|
+
return new Promise((resolve, reject) => {
|
|
128
|
+
this.db.run(sql, params, function (err) {
|
|
129
|
+
if (err) {
|
|
130
|
+
reject(err);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
resolve({ lastID: this.lastID, changes: this.changes });
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 执行SQL查询并获取单个结果
|
|
140
|
+
*/
|
|
141
|
+
getQuery(sql, params = []) {
|
|
142
|
+
return new Promise((resolve, reject) => {
|
|
143
|
+
this.db.get(sql, params, (err, row) => {
|
|
144
|
+
if (err) {
|
|
145
|
+
reject(err);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
resolve(row);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 执行SQL查询并获取所有结果
|
|
155
|
+
*/
|
|
156
|
+
allQuery(sql, params = []) {
|
|
157
|
+
return new Promise((resolve, reject) => {
|
|
158
|
+
this.db.all(sql, params, (err, rows) => {
|
|
159
|
+
if (err) {
|
|
160
|
+
reject(err);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
resolve(rows);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 获取或创建机器人记录
|
|
170
|
+
* @param botId 机器人ID
|
|
171
|
+
*/
|
|
172
|
+
async getOrCreateBot(botId) {
|
|
173
|
+
let bot = await this.getQuery('SELECT * FROM Bots WHERE id = ?', [botId]);
|
|
174
|
+
if (!bot) {
|
|
175
|
+
const now = new Date().toISOString();
|
|
176
|
+
await this.runQuery('INSERT INTO Bots (id, createdAt, updatedAt) VALUES (?, ?, ?)', [botId, now, now]);
|
|
177
|
+
bot = { id: botId, createdAt: now, updatedAt: now };
|
|
178
|
+
}
|
|
179
|
+
return bot;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* 获取或创建群组记录
|
|
183
|
+
* @param groupId 群组ID
|
|
184
|
+
* @param botId 机器人ID
|
|
185
|
+
*/
|
|
186
|
+
async getOrCreateGroup(groupId, botId) {
|
|
187
|
+
await this.getOrCreateBot(botId);
|
|
188
|
+
let group = await this.getQuery('SELECT * FROM Groups WHERE id = ? AND botId = ?', [groupId, botId]);
|
|
189
|
+
if (!group) {
|
|
190
|
+
const now = new Date().toISOString();
|
|
191
|
+
await this.runQuery('INSERT INTO Groups (id, botId, createdAt, updatedAt) VALUES (?, ?, ?, ?)', [groupId, botId, now, now]);
|
|
192
|
+
group = { id: groupId, botId, createdAt: now, updatedAt: now };
|
|
193
|
+
}
|
|
194
|
+
return group;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 获取B站用户记录
|
|
198
|
+
* @param host_mid B站用户UID
|
|
199
|
+
* @returns 返回用户信息,如果不存在则返回null
|
|
200
|
+
*/
|
|
201
|
+
async getBilibiliUser(host_mid) {
|
|
202
|
+
const user = await this.getQuery('SELECT * FROM BilibiliUsers WHERE host_mid = ?', [host_mid]);
|
|
203
|
+
return user || null;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 获取或创建B站用户记录
|
|
207
|
+
* @param host_mid B站用户UID
|
|
208
|
+
* @param remark UP主昵称
|
|
209
|
+
*/
|
|
210
|
+
async getOrCreateBilibiliUser(host_mid, remark = '') {
|
|
211
|
+
let user = await this.getQuery('SELECT * FROM BilibiliUsers WHERE host_mid = ?', [host_mid]);
|
|
212
|
+
if (!user) {
|
|
213
|
+
const now = new Date().toISOString();
|
|
214
|
+
await this.runQuery('INSERT INTO BilibiliUsers (host_mid, remark, filterMode, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?)', [
|
|
215
|
+
host_mid,
|
|
216
|
+
remark,
|
|
217
|
+
'blacklist',
|
|
218
|
+
now,
|
|
219
|
+
now
|
|
220
|
+
]);
|
|
221
|
+
user = {
|
|
222
|
+
host_mid,
|
|
223
|
+
remark,
|
|
224
|
+
filterMode: 'blacklist',
|
|
225
|
+
createdAt: now,
|
|
226
|
+
updatedAt: now
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// 如果提供了新的remark,更新用户记录
|
|
231
|
+
if (remark && user.remark !== remark) {
|
|
232
|
+
const now = new Date().toISOString();
|
|
233
|
+
await this.runQuery('UPDATE BilibiliUsers SET remark = ?, updatedAt = ? WHERE host_mid = ?', [remark, now, host_mid]);
|
|
234
|
+
user.remark = remark;
|
|
235
|
+
user.updatedAt = now;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return user;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* 订阅B站用户
|
|
242
|
+
* @param groupId 群组ID
|
|
243
|
+
* @param botId 机器人ID
|
|
244
|
+
* @param host_mid B站用户UID
|
|
245
|
+
* @param remark UP主昵称
|
|
246
|
+
*/
|
|
247
|
+
async subscribeBilibiliUser(groupId, botId, host_mid, remark = '') {
|
|
248
|
+
await this.getOrCreateGroup(groupId, botId);
|
|
249
|
+
await this.getOrCreateBilibiliUser(host_mid, remark);
|
|
250
|
+
let subscription = await this.getQuery('SELECT * FROM GroupUserSubscriptions WHERE groupId = ? AND host_mid = ?', [groupId, host_mid]);
|
|
251
|
+
if (!subscription) {
|
|
252
|
+
const now = new Date().toISOString();
|
|
253
|
+
await this.runQuery('INSERT INTO GroupUserSubscriptions (groupId, host_mid, createdAt, updatedAt) VALUES (?, ?, ?, ?)', [
|
|
254
|
+
groupId,
|
|
255
|
+
host_mid,
|
|
256
|
+
now,
|
|
257
|
+
now
|
|
258
|
+
]);
|
|
259
|
+
subscription = { groupId, host_mid, createdAt: now, updatedAt: now };
|
|
260
|
+
}
|
|
261
|
+
return subscription;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 取消订阅B站用户
|
|
265
|
+
* @param groupId 群组ID
|
|
266
|
+
* @param host_mid B站用户UID
|
|
267
|
+
*/
|
|
268
|
+
async unsubscribeBilibiliUser(groupId, host_mid) {
|
|
269
|
+
const result = await this.runQuery('DELETE FROM GroupUserSubscriptions WHERE groupId = ? AND host_mid = ?', [groupId, host_mid]);
|
|
270
|
+
// 清除相关的动态缓存
|
|
271
|
+
await this.runQuery('DELETE FROM DynamicCaches WHERE groupId = ? AND host_mid = ?', [groupId, host_mid]);
|
|
272
|
+
// 检查该用户是否还有其他群组订阅
|
|
273
|
+
const remainingSubscriptions = await this.getQuery('SELECT COUNT(*) as count FROM GroupUserSubscriptions WHERE host_mid = ?', [host_mid]);
|
|
274
|
+
// 如果没有任何群组订阅该用户,删除用户记录及相关数据
|
|
275
|
+
if (remainingSubscriptions && remainingSubscriptions.count === 0) {
|
|
276
|
+
node_karin_1.logger.info(`[BilibiliDB] 用户 ${host_mid} 已无任何群组订阅,清理相关数据`);
|
|
277
|
+
// 删除用户记录
|
|
278
|
+
await this.runQuery('DELETE FROM BilibiliUsers WHERE host_mid = ?', [host_mid]);
|
|
279
|
+
// 删除过滤词
|
|
280
|
+
await this.runQuery('DELETE FROM FilterWords WHERE host_mid = ?', [host_mid]);
|
|
281
|
+
// 删除过滤标签
|
|
282
|
+
await this.runQuery('DELETE FROM FilterTags WHERE host_mid = ?', [host_mid]);
|
|
283
|
+
// 删除所有相关的动态缓存(所有群组的)
|
|
284
|
+
await this.runQuery('DELETE FROM DynamicCaches WHERE host_mid = ?', [host_mid]);
|
|
285
|
+
}
|
|
286
|
+
return result.changes > 0;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* 添加动态缓存
|
|
290
|
+
* @param dynamic_id 动态ID
|
|
291
|
+
* @param host_mid B站用户UID
|
|
292
|
+
* @param groupId 群组ID
|
|
293
|
+
* @param dynamic_type 动态类型
|
|
294
|
+
*/
|
|
295
|
+
async addDynamicCache(dynamic_id, host_mid, groupId, dynamic_type) {
|
|
296
|
+
let cache = await this.getQuery('SELECT * FROM DynamicCaches WHERE dynamic_id = ? AND host_mid = ? AND groupId = ?', [
|
|
297
|
+
dynamic_id,
|
|
298
|
+
host_mid,
|
|
299
|
+
groupId
|
|
300
|
+
]);
|
|
301
|
+
if (!cache) {
|
|
302
|
+
const now = new Date().toISOString();
|
|
303
|
+
const result = await this.runQuery('INSERT INTO DynamicCaches (dynamic_id, host_mid, groupId, dynamic_type, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?, ?)', [dynamic_id, host_mid, groupId, dynamic_type, now, now]);
|
|
304
|
+
cache = {
|
|
305
|
+
id: result.lastID,
|
|
306
|
+
dynamic_id,
|
|
307
|
+
host_mid,
|
|
308
|
+
groupId,
|
|
309
|
+
dynamic_type,
|
|
310
|
+
createdAt: now,
|
|
311
|
+
updatedAt: now
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
return cache;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* 检查动态是否已推送
|
|
318
|
+
* @param dynamic_id 动态ID
|
|
319
|
+
* @param host_mid B站用户UID
|
|
320
|
+
* @param groupId 群组ID
|
|
321
|
+
*/
|
|
322
|
+
async isDynamicPushed(dynamic_id, host_mid, groupId) {
|
|
323
|
+
const result = await this.getQuery('SELECT COUNT(*) as count FROM DynamicCaches WHERE dynamic_id = ? AND host_mid = ? AND groupId = ?', [dynamic_id, host_mid, groupId]);
|
|
324
|
+
return (result?.count || 0) > 0;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* 获取机器人管理的所有群组
|
|
328
|
+
* @param botId 机器人ID
|
|
329
|
+
*/
|
|
330
|
+
async getBotGroups(botId) {
|
|
331
|
+
return await this.allQuery('SELECT * FROM Groups WHERE botId = ?', [botId]);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* 更新群组的机器人ID
|
|
335
|
+
* @param groupId 群组ID
|
|
336
|
+
* @param oldBotId 旧的机器人ID
|
|
337
|
+
* @param newBotId 新的机器人ID
|
|
338
|
+
*/
|
|
339
|
+
async updateGroupBotId(groupId, oldBotId, newBotId) {
|
|
340
|
+
await this.getOrCreateBot(newBotId);
|
|
341
|
+
const now = new Date().toISOString();
|
|
342
|
+
await this.runQuery('UPDATE Groups SET botId = ?, updatedAt = ? WHERE id = ? AND botId = ?', [newBotId, now, groupId, oldBotId]);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* 获取群组订阅的所有B站用户
|
|
346
|
+
* @param groupId 群组ID
|
|
347
|
+
*/
|
|
348
|
+
async getGroupSubscriptions(groupId) {
|
|
349
|
+
const subscriptions = await this.allQuery(`SELECT
|
|
350
|
+
gus.groupId, gus.host_mid, gus.createdAt, gus.updatedAt,
|
|
351
|
+
bu.remark, bu.filterMode,
|
|
352
|
+
bu.createdAt as bu_createdAt, bu.updatedAt as bu_updatedAt
|
|
353
|
+
FROM GroupUserSubscriptions gus
|
|
354
|
+
LEFT JOIN BilibiliUsers bu ON gus.host_mid = bu.host_mid
|
|
355
|
+
WHERE gus.groupId = ?`, [groupId]);
|
|
356
|
+
return subscriptions.map((sub) => ({
|
|
357
|
+
groupId: sub.groupId,
|
|
358
|
+
host_mid: sub.host_mid,
|
|
359
|
+
createdAt: sub.createdAt,
|
|
360
|
+
updatedAt: sub.updatedAt,
|
|
361
|
+
bilibiliUser: {
|
|
362
|
+
host_mid: sub.host_mid,
|
|
363
|
+
remark: sub.remark,
|
|
364
|
+
filterMode: sub.filterMode,
|
|
365
|
+
createdAt: sub.bu_createdAt,
|
|
366
|
+
updatedAt: sub.bu_updatedAt
|
|
367
|
+
}
|
|
368
|
+
}));
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* 获取B站用户的所有订阅群组
|
|
372
|
+
* @param host_mid B站用户UID
|
|
373
|
+
*/
|
|
374
|
+
async getUserSubscribedGroups(host_mid) {
|
|
375
|
+
return await this.allQuery(`SELECT g.* FROM Groups g
|
|
376
|
+
INNER JOIN GroupUserSubscriptions gus ON g.id = gus.groupId
|
|
377
|
+
WHERE gus.host_mid = ?`, [host_mid]);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* 获取群组的动态缓存
|
|
381
|
+
* @param groupId 群组ID
|
|
382
|
+
* @param host_mid 可选的B站用户UID过滤
|
|
383
|
+
*/
|
|
384
|
+
async getGroupDynamicCache(groupId, host_mid) {
|
|
385
|
+
let sql = 'SELECT * FROM DynamicCaches WHERE groupId = ?';
|
|
386
|
+
const params = [groupId];
|
|
387
|
+
if (host_mid) {
|
|
388
|
+
sql += ' AND host_mid = ?';
|
|
389
|
+
params.push(host_mid);
|
|
390
|
+
}
|
|
391
|
+
sql += ' ORDER BY createdAt DESC';
|
|
392
|
+
return await this.allQuery(sql, params);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* 检查群组是否已订阅B站用户
|
|
396
|
+
* @param host_mid B站用户UID
|
|
397
|
+
* @param groupId 群组ID
|
|
398
|
+
*/
|
|
399
|
+
async isSubscribed(host_mid, groupId) {
|
|
400
|
+
const result = await this.getQuery('SELECT COUNT(*) as count FROM GroupUserSubscriptions WHERE host_mid = ? AND groupId = ?', [host_mid, groupId]);
|
|
401
|
+
return (result?.count || 0) > 0;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* 批量同步配置文件中的订阅到数据库
|
|
405
|
+
* @param configItems 配置文件中的订阅项
|
|
406
|
+
*/
|
|
407
|
+
async syncConfigSubscriptions(configItems) {
|
|
408
|
+
// 1. 收集配置文件中的所有订阅关系
|
|
409
|
+
const configSubscriptions = new Map();
|
|
410
|
+
// 初始化每个群组的订阅UP集合
|
|
411
|
+
for (const item of configItems) {
|
|
412
|
+
const host_mid = item.host_mid;
|
|
413
|
+
const remark = item.remark ?? '';
|
|
414
|
+
// 创建或更新B站用户记录
|
|
415
|
+
await this.getOrCreateBilibiliUser(host_mid, remark);
|
|
416
|
+
// 处理该UP主的所有群组订阅
|
|
417
|
+
for (const groupWithBot of item.group_id) {
|
|
418
|
+
const [groupId, botId] = groupWithBot.split(':');
|
|
419
|
+
if (!groupId || !botId)
|
|
420
|
+
continue;
|
|
421
|
+
// 确保群组存在
|
|
422
|
+
await this.getOrCreateGroup(groupId, botId);
|
|
423
|
+
// 记录配置文件中的订阅关系
|
|
424
|
+
if (!configSubscriptions.has(groupId)) {
|
|
425
|
+
configSubscriptions.set(groupId, new Set());
|
|
426
|
+
}
|
|
427
|
+
configSubscriptions.get(groupId)?.add(host_mid);
|
|
428
|
+
// 检查是否已订阅
|
|
429
|
+
const isSubscribed = await this.isSubscribed(host_mid, groupId);
|
|
430
|
+
// 如果未订阅,创建订阅关系
|
|
431
|
+
if (!isSubscribed) {
|
|
432
|
+
await this.subscribeBilibiliUser(groupId, botId, host_mid, remark);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// 2. 获取数据库中的所有订阅关系,并与配置文件比较,删除不在配置文件中的订阅
|
|
437
|
+
// 获取所有群组
|
|
438
|
+
const allGroups = await this.allQuery('SELECT * FROM Groups');
|
|
439
|
+
for (const group of allGroups) {
|
|
440
|
+
const groupId = group.id;
|
|
441
|
+
const configUps = configSubscriptions.get(groupId) ?? new Set();
|
|
442
|
+
// 获取该群组在数据库中的所有订阅
|
|
443
|
+
const dbSubscriptions = await this.getGroupSubscriptions(groupId);
|
|
444
|
+
// 找出需要删除的订阅(在数据库中存在但配置文件中不存在)
|
|
445
|
+
for (const subscription of dbSubscriptions) {
|
|
446
|
+
const host_mid = subscription.host_mid;
|
|
447
|
+
if (!configUps.has(host_mid)) {
|
|
448
|
+
// 删除订阅关系
|
|
449
|
+
await this.unsubscribeBilibiliUser(groupId, host_mid);
|
|
450
|
+
node_karin_1.logger.mark(`已删除群组 ${groupId} 对UP主 ${host_mid} 的订阅`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// 3. 清理不再被任何群组订阅的UP主记录及其过滤词和过滤标签
|
|
455
|
+
// 获取所有B站用户
|
|
456
|
+
const allUsers = await this.allQuery('SELECT * FROM BilibiliUsers');
|
|
457
|
+
for (const user of allUsers) {
|
|
458
|
+
const host_mid = user.host_mid;
|
|
459
|
+
// 检查该UP主是否还有群组订阅
|
|
460
|
+
const subscribedGroups = await this.getUserSubscribedGroups(host_mid);
|
|
461
|
+
if (subscribedGroups.length === 0) {
|
|
462
|
+
// 删除该UP主的过滤词和过滤标签
|
|
463
|
+
await this.runQuery('DELETE FROM FilterWords WHERE host_mid = ?', [host_mid]);
|
|
464
|
+
await this.runQuery('DELETE FROM FilterTags WHERE host_mid = ?', [host_mid]);
|
|
465
|
+
// 删除该UP主记录
|
|
466
|
+
await this.runQuery('DELETE FROM BilibiliUsers WHERE host_mid = ?', [host_mid]);
|
|
467
|
+
node_karin_1.logger.mark(`已删除UP主 ${host_mid} 的记录及相关过滤设置(不再被任何群组订阅)`);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* 更新用户的过滤模式
|
|
473
|
+
* @param host_mid B站用户UID
|
|
474
|
+
* @param filterMode 过滤模式
|
|
475
|
+
*/
|
|
476
|
+
async updateFilterMode(host_mid, filterMode) {
|
|
477
|
+
const user = await this.getOrCreateBilibiliUser(host_mid);
|
|
478
|
+
const now = new Date().toISOString();
|
|
479
|
+
await this.runQuery('UPDATE BilibiliUsers SET filterMode = ?, updatedAt = ? WHERE host_mid = ?', [filterMode, now, host_mid]);
|
|
480
|
+
return { ...user, filterMode, updatedAt: now };
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* 添加过滤词
|
|
484
|
+
* @param host_mid B站用户UID
|
|
485
|
+
* @param word 过滤词
|
|
486
|
+
*/
|
|
487
|
+
async addFilterWord(host_mid, word) {
|
|
488
|
+
await this.getOrCreateBilibiliUser(host_mid);
|
|
489
|
+
let filterWord = await this.getQuery('SELECT * FROM FilterWords WHERE host_mid = ? AND word = ?', [host_mid, word]);
|
|
490
|
+
if (!filterWord) {
|
|
491
|
+
const now = new Date().toISOString();
|
|
492
|
+
const result = await this.runQuery('INSERT INTO FilterWords (host_mid, word, createdAt, updatedAt) VALUES (?, ?, ?, ?)', [
|
|
493
|
+
host_mid,
|
|
494
|
+
word,
|
|
495
|
+
now,
|
|
496
|
+
now
|
|
497
|
+
]);
|
|
498
|
+
filterWord = {
|
|
499
|
+
id: result.lastID,
|
|
500
|
+
host_mid,
|
|
501
|
+
word,
|
|
502
|
+
createdAt: now,
|
|
503
|
+
updatedAt: now
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
return filterWord;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* 删除过滤词
|
|
510
|
+
* @param host_mid B站用户UID
|
|
511
|
+
* @param word 过滤词
|
|
512
|
+
*/
|
|
513
|
+
async removeFilterWord(host_mid, word) {
|
|
514
|
+
const result = await this.runQuery('DELETE FROM FilterWords WHERE host_mid = ? AND word = ?', [host_mid, word]);
|
|
515
|
+
return result.changes > 0;
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* 添加过滤标签
|
|
519
|
+
* @param host_mid B站用户UID
|
|
520
|
+
* @param tag 过滤标签
|
|
521
|
+
*/
|
|
522
|
+
async addFilterTag(host_mid, tag) {
|
|
523
|
+
await this.getOrCreateBilibiliUser(host_mid);
|
|
524
|
+
let filterTag = await this.getQuery('SELECT * FROM FilterTags WHERE host_mid = ? AND tag = ?', [host_mid, tag]);
|
|
525
|
+
if (!filterTag) {
|
|
526
|
+
const now = new Date().toISOString();
|
|
527
|
+
const result = await this.runQuery('INSERT INTO FilterTags (host_mid, tag, createdAt, updatedAt) VALUES (?, ?, ?, ?)', [
|
|
528
|
+
host_mid,
|
|
529
|
+
tag,
|
|
530
|
+
now,
|
|
531
|
+
now
|
|
532
|
+
]);
|
|
533
|
+
filterTag = {
|
|
534
|
+
id: result.lastID,
|
|
535
|
+
host_mid,
|
|
536
|
+
tag,
|
|
537
|
+
createdAt: now,
|
|
538
|
+
updatedAt: now
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
return filterTag;
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* 删除过滤标签
|
|
545
|
+
* @param host_mid B站用户UID
|
|
546
|
+
* @param tag 过滤标签
|
|
547
|
+
*/
|
|
548
|
+
async removeFilterTag(host_mid, tag) {
|
|
549
|
+
const result = await this.runQuery('DELETE FROM FilterTags WHERE host_mid = ? AND tag = ?', [host_mid, tag]);
|
|
550
|
+
return result.changes > 0;
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* 获取用户的所有过滤词
|
|
554
|
+
* @param host_mid B站用户UID
|
|
555
|
+
*/
|
|
556
|
+
async getFilterWords(host_mid) {
|
|
557
|
+
const filterWords = await this.allQuery('SELECT * FROM FilterWords WHERE host_mid = ?', [host_mid]);
|
|
558
|
+
return filterWords.map((word) => word.word);
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* 获取用户的所有过滤标签
|
|
562
|
+
* @param host_mid B站用户UID
|
|
563
|
+
*/
|
|
564
|
+
async getFilterTags(host_mid) {
|
|
565
|
+
const filterTags = await this.allQuery('SELECT * FROM FilterTags WHERE host_mid = ?', [host_mid]);
|
|
566
|
+
return filterTags.map((tag) => tag.tag);
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* 获取用户的过滤配置
|
|
570
|
+
* @param host_mid B站用户UID
|
|
571
|
+
*/
|
|
572
|
+
async getFilterConfig(host_mid) {
|
|
573
|
+
const user = await this.getOrCreateBilibiliUser(host_mid);
|
|
574
|
+
const filterWords = await this.getFilterWords(host_mid);
|
|
575
|
+
const filterTags = await this.getFilterTags(host_mid);
|
|
576
|
+
return {
|
|
577
|
+
filterMode: user.filterMode,
|
|
578
|
+
filterWords,
|
|
579
|
+
filterTags
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* 从动态中提取文本内容和标签
|
|
584
|
+
* @param dynamicData 动态数据
|
|
585
|
+
* @returns 提取的文本内容和标签
|
|
586
|
+
*/
|
|
587
|
+
async extractTextAndTags(dynamicData) {
|
|
588
|
+
let text = '';
|
|
589
|
+
const tags = [];
|
|
590
|
+
// 如果没有模块数据,返回空结果
|
|
591
|
+
if (!dynamicData || !dynamicData.modules || !dynamicData.modules.module_dynamic) {
|
|
592
|
+
return { text, tags };
|
|
593
|
+
}
|
|
594
|
+
const moduleDynamic = dynamicData.modules.module_dynamic;
|
|
595
|
+
// 提取直播标题和分区
|
|
596
|
+
if (moduleDynamic.major && moduleDynamic.major.live_rcmd) {
|
|
597
|
+
const content = JSON.parse(moduleDynamic.major.live_rcmd.content);
|
|
598
|
+
text += content.live_play_info.title + ' ';
|
|
599
|
+
tags.push(content.live_play_info.area_name);
|
|
600
|
+
}
|
|
601
|
+
// 提取描述文本
|
|
602
|
+
if (moduleDynamic.desc && moduleDynamic.desc.text) {
|
|
603
|
+
text += moduleDynamic.desc.text + ' ';
|
|
604
|
+
}
|
|
605
|
+
// 提取视频标题
|
|
606
|
+
if (moduleDynamic.major && moduleDynamic.major.archive && moduleDynamic.major.archive.title) {
|
|
607
|
+
text += moduleDynamic.major.archive.title + ' ';
|
|
608
|
+
}
|
|
609
|
+
// 提取标签
|
|
610
|
+
// 主动态
|
|
611
|
+
if (moduleDynamic.desc && moduleDynamic.desc.rich_text_nodes) {
|
|
612
|
+
for (const node of moduleDynamic.desc.rich_text_nodes) {
|
|
613
|
+
if (node.type !== 'RICH_TEXT_NODE_TYPE_TEXT') {
|
|
614
|
+
tags.push(node.orig_text);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
// 若为转发动态,再检查子动态
|
|
619
|
+
if (dynamicData.type === amagi_1.DynamicType.FORWARD && 'orig' in dynamicData) {
|
|
620
|
+
if (dynamicData.orig.type === amagi_1.DynamicType.AV) {
|
|
621
|
+
text += dynamicData.orig.modules.module_dynamic.major.archive.title + '';
|
|
622
|
+
}
|
|
623
|
+
else {
|
|
624
|
+
node_karin_1.logger.debug(`提取子动态文本和tag:https://t.bilibili.com/${dynamicData.id_str}`);
|
|
625
|
+
try {
|
|
626
|
+
text += dynamicData.orig.modules.module_dynamic.major.opus.summary.text + ' ';
|
|
627
|
+
for (const node of dynamicData.orig.modules.module_dynamic.major.opus.summary.rich_text_nodes) {
|
|
628
|
+
tags.push(node.orig_text);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
catch (error) {
|
|
632
|
+
node_karin_1.logger.error(`提取子动态文本和tag失败:${error}`);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
return { text: text.trim(), tags };
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* 检查内容是否应该被过滤
|
|
640
|
+
* @param PushItem 推送项
|
|
641
|
+
* @param tags 额外的标签列表
|
|
642
|
+
*/
|
|
643
|
+
async shouldFilter(PushItem, extraTags = []) {
|
|
644
|
+
// 获取用户的过滤配置
|
|
645
|
+
const { filterMode, filterWords, filterTags } = await this.getFilterConfig(PushItem.host_mid);
|
|
646
|
+
node_karin_1.logger.debug(`
|
|
647
|
+
获取用户${PushItem.remark}(${PushItem.host_mid})的过滤配置:
|
|
648
|
+
过滤模式:${filterMode}
|
|
649
|
+
过滤词:${filterWords}
|
|
650
|
+
过滤标签:${filterTags}
|
|
651
|
+
`);
|
|
652
|
+
// 提取主动态的文本和标签
|
|
653
|
+
const { text: mainText, tags: mainTags } = await this.extractTextAndTags(PushItem.Dynamic_Data);
|
|
654
|
+
node_karin_1.logger.debug(`
|
|
655
|
+
提取主动态的文本和标签:
|
|
656
|
+
文本:${mainText}
|
|
657
|
+
标签:[${mainTags.join('][')}]
|
|
658
|
+
`);
|
|
659
|
+
// 合并所有标签
|
|
660
|
+
let allTags = [...mainTags, ...extraTags];
|
|
661
|
+
let allText = mainText;
|
|
662
|
+
// 如果是转发动态,还需要检查原动态
|
|
663
|
+
if (PushItem.Dynamic_Data.type === amagi_1.DynamicType.FORWARD && 'orig' in PushItem.Dynamic_Data) {
|
|
664
|
+
const { text: origText, tags: origTags } = await this.extractTextAndTags(PushItem.Dynamic_Data.orig);
|
|
665
|
+
allText += ' ' + origText;
|
|
666
|
+
allTags = [...allTags, ...origTags];
|
|
667
|
+
}
|
|
668
|
+
// 检查内容中是否包含过滤词
|
|
669
|
+
const hasFilterWord = filterWords.some((word) => allText.includes(word));
|
|
670
|
+
// 检查标签中是否包含过滤标签
|
|
671
|
+
const hasFilterTag = filterTags.some((filterTag) => allTags.some((tag) => tag.includes(filterTag)));
|
|
672
|
+
node_karin_1.logger.debug(`
|
|
673
|
+
UP主UID:${PushItem.host_mid}
|
|
674
|
+
检查内容:${allText}
|
|
675
|
+
检查标签:${allTags.join(', ')}
|
|
676
|
+
命中词:[${filterWords.join('], [')}]
|
|
677
|
+
命中标签:[${filterTags.join('], [')}]
|
|
678
|
+
过滤模式:${filterMode}
|
|
679
|
+
是否过滤:${hasFilterWord || hasFilterTag ? node_karin_1.logger.red(`${hasFilterWord || hasFilterTag}`) : node_karin_1.logger.green(`${hasFilterWord || hasFilterTag}`)}
|
|
680
|
+
动态地址:${node_karin_1.logger.green(`https://t.bilibili.com/${PushItem.Dynamic_Data.id_str}`)}
|
|
681
|
+
动态类型:${PushItem.dynamic_type}
|
|
682
|
+
`);
|
|
683
|
+
// 根据过滤模式决定是否过滤
|
|
684
|
+
if (filterMode === 'blacklist') {
|
|
685
|
+
// 黑名单模式:如果包含过滤词或过滤标签,则过滤
|
|
686
|
+
if (hasFilterWord || hasFilterTag) {
|
|
687
|
+
node_karin_1.logger.warn(`
|
|
688
|
+
动态内容命中黑名单规则,已过滤该动态不再推送
|
|
689
|
+
动态地址:${node_karin_1.logger.yellow(`https://t.bilibili.com/${PushItem.Dynamic_Data.id_str}`)}
|
|
690
|
+
命中的黑名单词:[${filterWords.join('], [')}]
|
|
691
|
+
命中的黑名单标签:[${filterTags.join('], [')}]
|
|
692
|
+
`);
|
|
693
|
+
return true;
|
|
694
|
+
}
|
|
695
|
+
return false;
|
|
696
|
+
}
|
|
697
|
+
else {
|
|
698
|
+
// 白名单模式:如果不包含任何白名单词或白名单标签,则过滤
|
|
699
|
+
// 注意:如果白名单为空,则不过滤任何内容
|
|
700
|
+
if (filterWords.length === 0 && filterTags.length === 0) {
|
|
701
|
+
return false;
|
|
702
|
+
}
|
|
703
|
+
if (hasFilterWord || hasFilterTag) {
|
|
704
|
+
return false; // 不过滤
|
|
705
|
+
}
|
|
706
|
+
node_karin_1.logger.warn(`
|
|
707
|
+
动态内容未命中白名单规则,已过滤该动态不再推送
|
|
708
|
+
动态地址:${node_karin_1.logger.yellow(`https://t.bilibili.com/${PushItem.Dynamic_Data.id_str}`)}
|
|
709
|
+
当前白名单词:[${filterWords.join('], [')}]
|
|
710
|
+
当前白名单标签:[${filterTags.join('], [')}]
|
|
711
|
+
`);
|
|
712
|
+
return true; // 过滤
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* 清理旧的动态缓存记录
|
|
717
|
+
* @param days 保留最近几天的记录
|
|
718
|
+
* @returns 删除的记录数量
|
|
719
|
+
*/
|
|
720
|
+
async cleanOldDynamicCache(days = 7) {
|
|
721
|
+
const cutoffDate = new Date();
|
|
722
|
+
cutoffDate.setDate(cutoffDate.getDate() - days);
|
|
723
|
+
const cutoffDateStr = cutoffDate.toISOString();
|
|
724
|
+
const result = await this.runQuery('DELETE FROM DynamicCaches WHERE createdAt < ?', [cutoffDateStr]);
|
|
725
|
+
return result.changes ?? 0;
|
|
726
|
+
}
|
|
727
|
+
/** 为了向后兼容,保留groupRepository和dynamicCacheRepository属性 */
|
|
728
|
+
get groupRepository() {
|
|
729
|
+
return {
|
|
730
|
+
find: async (options) => {
|
|
731
|
+
if (options?.where?.botId) {
|
|
732
|
+
return await this.getBotGroups(options.where.botId);
|
|
733
|
+
}
|
|
734
|
+
return await this.allQuery('SELECT * FROM Groups');
|
|
735
|
+
}
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
get dynamicCacheRepository() {
|
|
739
|
+
return {
|
|
740
|
+
find: async (options = {}) => {
|
|
741
|
+
const { where = {}, order, take, relations } = options;
|
|
742
|
+
let sql = 'SELECT * FROM DynamicCaches';
|
|
743
|
+
const params = [];
|
|
744
|
+
// 构建WHERE条件
|
|
745
|
+
const conditions = [];
|
|
746
|
+
if (where.groupId) {
|
|
747
|
+
conditions.push('groupId = ?');
|
|
748
|
+
params.push(where.groupId);
|
|
749
|
+
}
|
|
750
|
+
if (where.host_mid) {
|
|
751
|
+
conditions.push('host_mid = ?');
|
|
752
|
+
params.push(where.host_mid);
|
|
753
|
+
}
|
|
754
|
+
if (where.dynamic_id) {
|
|
755
|
+
conditions.push('dynamic_id = ?');
|
|
756
|
+
params.push(where.dynamic_id);
|
|
757
|
+
}
|
|
758
|
+
if (conditions.length > 0) {
|
|
759
|
+
sql += ' WHERE ' + conditions.join(' AND ');
|
|
760
|
+
}
|
|
761
|
+
// 构建ORDER BY
|
|
762
|
+
if (order) {
|
|
763
|
+
const orderClauses = [];
|
|
764
|
+
const allowedFields = ['id', 'dynamic_id', 'host_mid', 'groupId', 'dynamic_type', 'createdAt', 'updatedAt'];
|
|
765
|
+
const allowedDirections = ['ASC', 'DESC'];
|
|
766
|
+
for (const [field, direction] of Object.entries(order)) {
|
|
767
|
+
// 验证字段名和排序方向,防止SQL注入
|
|
768
|
+
if (allowedFields.includes(field) && allowedDirections.includes(direction)) {
|
|
769
|
+
orderClauses.push(`${field} ${direction}`);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
if (orderClauses.length > 0) {
|
|
773
|
+
sql += ' ORDER BY ' + orderClauses.join(', ');
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
// 构建LIMIT
|
|
777
|
+
if (take) {
|
|
778
|
+
sql += ' LIMIT ?';
|
|
779
|
+
params.push(take.toString());
|
|
780
|
+
}
|
|
781
|
+
const caches = await this.allQuery(sql, params);
|
|
782
|
+
// 如果需要关联bilibiliUser数据
|
|
783
|
+
if (relations && relations.includes('bilibiliUser')) {
|
|
784
|
+
const result = [];
|
|
785
|
+
for (const cache of caches) {
|
|
786
|
+
const bilibiliUser = await this.getQuery('SELECT * FROM BilibiliUsers WHERE host_mid = ?', [cache.host_mid]);
|
|
787
|
+
result.push({
|
|
788
|
+
...cache,
|
|
789
|
+
bilibiliUser,
|
|
790
|
+
createdAt: new Date(cache.createdAt), // 转换为Date对象
|
|
791
|
+
updatedAt: new Date(cache.updatedAt)
|
|
792
|
+
});
|
|
793
|
+
}
|
|
794
|
+
return result;
|
|
795
|
+
}
|
|
796
|
+
// 转换日期字符串为Date对象
|
|
797
|
+
return caches.map((cache) => ({
|
|
798
|
+
...cache,
|
|
799
|
+
createdAt: new Date(cache.createdAt),
|
|
800
|
+
updatedAt: new Date(cache.updatedAt)
|
|
801
|
+
}));
|
|
802
|
+
},
|
|
803
|
+
delete: async (conditions) => {
|
|
804
|
+
const { groupId, host_mid, dynamic_id } = conditions;
|
|
805
|
+
// 优先处理 dynamic_id + groupId 的精确删除(单条记录)
|
|
806
|
+
if (dynamic_id && groupId) {
|
|
807
|
+
const result = await this.runQuery('DELETE FROM DynamicCaches WHERE dynamic_id = ? AND groupId = ?', [dynamic_id, groupId]);
|
|
808
|
+
return { affected: result.changes };
|
|
809
|
+
}
|
|
810
|
+
if (groupId && host_mid) {
|
|
811
|
+
const result = await this.runQuery('DELETE FROM DynamicCaches WHERE groupId = ? AND host_mid = ?', [groupId, host_mid]);
|
|
812
|
+
return { affected: result.changes };
|
|
813
|
+
}
|
|
814
|
+
if (groupId) {
|
|
815
|
+
const result = await this.runQuery('DELETE FROM DynamicCaches WHERE groupId = ?', [groupId]);
|
|
816
|
+
return { affected: result.changes };
|
|
817
|
+
}
|
|
818
|
+
if (host_mid) {
|
|
819
|
+
const result = await this.runQuery('DELETE FROM DynamicCaches WHERE host_mid = ?', [host_mid]);
|
|
820
|
+
return { affected: result.changes };
|
|
821
|
+
}
|
|
822
|
+
if (dynamic_id) {
|
|
823
|
+
const result = await this.runQuery('DELETE FROM DynamicCaches WHERE dynamic_id = ?', [dynamic_id]);
|
|
824
|
+
return { affected: result.changes };
|
|
825
|
+
}
|
|
826
|
+
return { affected: 0 };
|
|
827
|
+
}
|
|
828
|
+
};
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
exports.BilibiliDBBase = BilibiliDBBase;
|