import { defineComponentMetadata } from '@/components/define' import { componentsTags } from '../types' import { getReleaseContent, getUpdateUrl, showReleaseContent } from './release-content' export const component = defineComponentMetadata({ name: 'notifyNewVersion', displayName: '新版本提示', description: '定期检查脚本本体的更新, 并弹出提示.', tags: [componentsTags.utils], options: { lastUpdateCheck: { displayName: '最后检查更新日期', defaultValue: 0, hidden: true, }, minimumDuration: { displayName: '更新间隔 (ms)', defaultValue: 1000 * 3600 * 24, }, }, entry: async ({ settings: { options } }) => { try { const { Version } = await import('@/core/version') const { monkey } = await import('@/core/ajax') const { meta } = await import('@/core/meta') const { Toast } = await import('@/core/toast') const { isDataSaveMode } = await import('@/core/utils') if (isDataSaveMode()) { return } const now = Number(new Date()) const duration = now - options.lastUpdateCheck if (duration < options.minimumDuration) { // 未到间隔期 return } // 本地调试版不检查 if (!GM_info.scriptUpdateURL) { return } const updateUrl = await getUpdateUrl() const scriptText: string = await monkey({ url: updateUrl, responseType: 'text', }) options.lastUpdateCheck = Number(new Date()) const versionMatch = scriptText.match(/^\/\/ @version\s*([\d.]+)$/m) if (!versionMatch?.[1]) { console.warn('[新版本提示] 未能检测出脚本版本, scriptText.length =', scriptText.length) return } const latestVersion = new Version(versionMatch[1]) const currentVersion = new Version(meta.compilationInfo.version) if (!latestVersion.greaterThan(currentVersion)) { return } const releaseContent = await getReleaseContent(latestVersion.versionString) const toast = Toast.info( /* html */ `新版本 ${latestVersion.versionString} 已发布. 查看详情`, '检查更新', ) const element = await toast.element element.querySelector('.view-details').addEventListener('click', () => { showReleaseContent(releaseContent) }) } catch (error) { console.warn('[新版本提示] 检查更新时发生错误: ', error) } }, })