import { i18n, help, repolist, config } from '@/env' export function isLoggedInUser(avatar_url) {//从返回的json判断 const imgElement = document.querySelector('.AppHeader-user button span span img') if (imgElement) { const imgSrc = imgElement.src return imgSrc === avatar_url } else { return false } } export function isLoggedInUser_f() {//NOTE - 比较仓库头像和登录头像中的ID const imgElement = document.querySelector('.AppHeader-user button span span img') const repoImgElement = document.querySelector('#repo-title-component > img') if (imgElement && repoImgElement) { const imgSrc = imgElement.src const repoImgSrc = repoImgElement.src const userIdPattern = /\/u\/(\d+)/ const imgUserIdMatch = imgSrc.match(userIdPattern) const repoUserIdMatch = repoImgSrc.match(userIdPattern) if (imgUserIdMatch && repoUserIdMatch) { const imgUserId = imgUserIdMatch[1] const repoUserId = repoUserIdMatch[1] return imgUserId === repoUserId } } return false } export async function getUserRepos(href, header = {}) { try { const response = await fetch(`${href}`, { headers: header }) if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`) } return await response.json() } catch (error) { console.error('Fetch error:', error) throw error } } export async function getUserAllRepos(href, header = {}, getAll = false, maxPage = 0) { try { let allRepos = [] let page = 1 let perPage = 100 do { const url = getAll ? `${href}?per_page=${perPage}&page=${page}` : href//NOTE - false时,就获取前30个就行了 ,够用了 仓库没那么多,列表太长也不好。 const response = await fetch(url, { headers: header }) if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`) const repos = await response.json() if (repos.length === 0) break allRepos = allRepos.concat(repos) page++ // 如果设定了最大页数并且已经达到了最大页数,结束战斗 if (maxPage !== 0 && page > maxPage) break } while (getAll) return allRepos } catch (error) { console.error('Fetch error:', error) throw error } } export function insertDelBtn(owner, repo, usePageHeadActions, cusClass = 'dialog-show-repo-delete-home', element) { const svgStr = '
' const targetUrl = `https://ossinsight.io/analyze/${owner}/${repo}` const title = `[${repo}]\n ${i18n.translate.deleteRepo}` var el = null if (element) { el = element } else { el = usePageHeadActions ? document.querySelector('.pagehead-actions') : document.querySelector('#responsive-meta-container .d-flex.gap-2.mt-n3.mb-3.flex-wrap') } if (!el) { console.log('github-Active Forks: 没有找到目标元素, 无法添加按钮') return } if (el.querySelector(`#${cusClass}`)) return const buttonHtml = `` if (usePageHeadActions) { el.insertAdjacentHTML('beforeend', `
  • ${buttonHtml}
  • `) } else { el.insertAdjacentHTML('beforeend', buttonHtml) } el.querySelector(`#${cusClass}`).addEventListener('click', function () { showDeleteConfirmations(owner, repo) }) } export function showDeleteConfirmations(owner, repo, count = 3) { const blacklist = ['ChinaGodMan/disk', 'ChinaGodMan/LocalDev', 'ChinaGodMan/Ebackup', 'ChinaGodMan/portable-device', 'ChinaGodMan/UserScripts'] const repoIdentifier = `${owner}/${repo}` if (blacklist.includes(repoIdentifier)) { alert(`[${repoIdentifier}] 在黑名单中`) return } for (let i = 0; i < count; i++) { let confirmed = confirm(`${owner}:\n${i18n.translate.deleteRepo_i}[${repo}]\n${i18n.translate.deleteRepo}\n${i18n.translate.deleteRepo_ask} ${i + 1}/${count})`) if (!confirmed) return } deleteRepository(owner, repo) } export function deleteRepository(owner, repo) { fetch(`https://api.github.com/repos/${owner}/${repo}`, { method: 'DELETE', headers: { 'Authorization': `token ${TOKEN}`, 'Accept': 'application/vnd.github.v3+json' } }) .then(response => { if (response.status === 204) { alert(`"${repo}" ${i18n.translate.deleteRepo_pass}`) location.reload() } else { alert(`"[${repo}]"\n${i18n.translate.deleteRepo_failed} ${i18n.translate.deleteRepo_failed_status}${response.status}`) } }) .catch(error => { alert(`An error occurred: ${error}`) }) } export function fetchReposWithCache(ownerKey, reposApi, headers) { const localData = localStorage.getItem(ownerKey) const currentTime = new Date().getTime() if (localData) { const parsedData = JSON.parse(localData) const localTimeStamp = new Date(parsedData.timeStamp).getTime() if (currentTime - localTimeStamp < help.timeToSeconds(config.DELAY) * 1000) { console.log('本地缓存数据未过期,直接使用本地数据') repolist.insertReposList(parsedData.reposArray, config.USETIP) return } } github.getUserAllRepos(reposApi, headers) .then(data => { const reposArray = data.map(repo => ({ name: repo.name, private: repo.private, html_url: repo.html_url, fork: repo.fork, description: repo.description, stargazers_count: repo.stargazers_count, owner: repo.owner.login, forks_count: repo.forks_count, open_issues_count: repo.open_issues_count, language: repo.language, size: repo.size, created_at: help.systemTime(repo.created_at), updated_at: help.systemTime(repo.updated_at), pushed_at: help.systemTime(repo.pushed_at) })) const timeStamp = new Date().toISOString() const dataToStore = { reposArray: reposArray, timeStamp: timeStamp } localStorage.setItem(ownerKey, JSON.stringify(dataToStore)) repolist.insertReposList(reposArray, config.USETIP) }) .catch(error => console.error('Error fetching data:', error)) }