🏠 Home 

GreasyFork Brugerudgivet scriptdatavisualisering

brugeChart.jsIndhentning og visualisering af brugerscriptdata,Og generer et diagram på brugerens personlige hjemmeside for at vise den detaljerede installationsstatus nedenfor.

  1. // ==UserScript==
  2. // @name GreasyFork User-published script data visualization
  3. // @description useChart.jsObtaining and visualizing user script data,And generate a chart on the user’s personal homepage to display the detailed installation
  4. // @name:zh-CN GreasyFork 用户发布的脚本数据可视化
  5. // @description:zh-CN 使用Chart.js获取和可视化获取用户脚本数据,并在用户个人主页生成一个图表在下方显示详细安装情况
  6. // @name:ar GreasyFork تصور البيانات النصية التي ينشرها المستخدم
  7. // @description:ar يستخدمChart.jsالحصول على بيانات البرنامج النصي للمستخدم وتصورها,وقم بإنشاء مخطط على الصفحة الرئيسية الشخصية للمستخدم لعرض حالة التثبيت التفصيلية أدناه.
  8. // @name:bg GreasyFork Визуализация на данни от скрипт, публикуван от потребителя
  9. // @description:bg използванеChart.jsПолучаване и визуализиране на потребителски скриптови данни,И генерирайте диаграма на личната начална страница на потребителя, за да покажете подробното състояние на инсталацията по-долу.
  10. // @name:cs GreasyFork Uživatelsky publikovaná vizualizace dat skriptu
  11. // @description:cs použitíChart.jsZískávání a vizualizace dat uživatelských skriptů,A vygenerujte graf na osobní domovské stránce uživatele, který zobrazí podrobný stav instalace níže.
  12. // @name:da GreasyFork Brugerudgivet scriptdatavisualisering
  13. // @description:da brugeChart.jsIndhentning og visualisering af brugerscriptdata,Og generer et diagram på brugerens personlige hjemmeside for at vise den detaljerede installationsstatus nedenfor.
  14. // @name:de GreasyFork Vom Benutzer veröffentlichte Skriptdatenvisualisierung
  15. // @description:de verwendenChart.jsAbrufen und Visualisieren von Benutzerskriptdaten,Und erstellen Sie auf der persönlichen Homepage des Benutzers ein Diagramm, um unten den detaillierten Installationsstatus anzuzeigen.
  16. // @name:el GreasyFork Οπτικοποίηση δεδομένων σεναρίου δημοσιευμένων από χρήστη
  17. // @description:el χρήσηChart.jsΛήψη και οπτικοποίηση δεδομένων σεναρίου χρήστη,Και δημιουργήστε ένα γράφημα στην προσωπική αρχική σελίδα του χρήστη για να εμφανίσετε τη λεπτομερή κατάσταση εγκατάστασης παρακάτω.
  18. // @name:en GreasyFork User-published script data visualization
  19. // @description:en useChart.jsObtaining and visualizing user script data,And generate a chart on the user’s personal homepage to display the detailed installation status below.
  20. // @name:eo GreasyFork Vidigo de datumoj eldonitaj de uzantoj
  21. // @description:eo uziChart.jsAkiro kaj bildigo de uzantaj skriptodatenoj,Kaj generu diagramon sur la persona hejmpaĝo de la uzanto por montri la detalan instalan staton sube.
  22. // @name:es GreasyFork Visualización de datos de script publicados por el usuario
  23. // @description:es usarChart.jsObtención y visualización de datos de script de usuario,Y genere un gráfico en la página de inicio personal del usuario para mostrar el estado de instalación detallado a continuación.
  24. // @name:fi GreasyFork Käyttäjän julkaisema komentosarjatietojen visualisointi
  25. // @description:fi käyttääChart.jsKäyttäjän komentosarjatietojen hankkiminen ja visualisointi,Ja luo kaavio käyttäjän henkilökohtaiselle kotisivulle nähdäksesi yksityiskohtaisen asennuksen tilan alla.
  26. // @name:fr GreasyFork Visualisation des données de script publié par l’utilisateur
  27. // @description:fr utiliserChart.jsObtention et visualisation des données de script utilisateur,Et générez un graphique sur la page d’accueil personnelle de l’utilisateur pour afficher l’état détaillé de l’installation ci-dessous.
  28. // @name:he GreasyFork הדמיית נתוני סקריפט שפורסם על ידי המשתמש
  29. // @description:he לְהִשְׁתַמֵשׁChart.jsהשגה והצגה של נתוני סקריפט משתמש,וצור תרשים בדף הבית האישי של המשתמש כדי להציג את מצב ההתקנה המפורט למטה.
  30. // @name:hr GreasyFork Vizualizacija podataka skripte koju je objavio korisnik
  31. // @description:hr koristitiChart.jsDobivanje i vizualizacija podataka korisničke skripte,I generirajte grafikon na osobnoj početnoj stranici korisnika za prikaz detaljnog statusa instalacije u nastavku.
  32. // @name:hu GreasyFork Felhasználó által közzétett szkriptadatok megjelenítése
  33. // @description:hu használatChart.jsFelhasználói szkriptadatok beszerzése és megjelenítése,És készítsen diagramot a felhasználó személyes honlapján, hogy megjelenítse a részletes telepítési állapotot.
  34. // @name:id GreasyFork Visualisasi data skrip yang dipublikasikan pengguna
  35. // @description:id menggunakanChart.jsMemperoleh dan memvisualisasikan data skrip pengguna,Dan buat bagan di beranda pribadi pengguna untuk menampilkan status instalasi terperinci di bawah.
  36. // @name:it GreasyFork Visualizzazione dei dati degli script pubblicati dall’utente
  37. // @description:it utilizzoChart.jsOttenere e visualizzare i dati dello script utente,E genera un grafico sulla home page personale dell’utente per visualizzare lo stato dettagliato dell’installazione di seguito.
  38. // @name:ja GreasyFork ユーザーが公開したスクリプト データの視覚化
  39. // @description:ja 使用Chart.jsユーザースクリプトデータの取得と可視化,また、ユーザーの個人ホームページ上にチャートを生成し、以下の詳細なインストール状況を表示します。
  40. // @name:ka GreasyFork მომხმარებლის მიერ გამოქვეყნებული სკრიპტის მონაცემთა ვიზუალიზაცია
  41. // @description:ka გამოყენებაChart.jsმომხმარებლის სკრიპტის მონაცემების მიღება და ვიზუალიზაცია,და შექმენით დიაგრამა მომხმარებლის პირად მთავარ გვერდზე, რათა აჩვენოთ ინსტალაციის დეტალური სტატუსი ქვემოთ.
  42. // @name:ko GreasyFork 사용자 게시 스크립트 데이터 시각화
  43. // @description:ko 사용Chart.js사용자 스크립트 데이터 획득 및 시각화,그리고 사용자의 개인 홈페이지에 차트를 생성하여 아래와 같이 자세한 설치 현황을 표시합니다.
  44. // @name:nl GreasyFork Door de gebruiker gepubliceerde visualisatie van scriptgegevens
  45. // @description:nl gebruikChart.jsVerkrijgen en visualiseren van gebruikersscriptgegevens,En genereer een diagram op de persoonlijke startpagina van de gebruiker om de gedetailleerde installatiestatus hieronder weer te geven.
  46. // @name:nb GreasyFork Brukerpublisert skriptdatavisualisering
  47. // @description:nb brukChart.jsInnhenting og visualisering av brukerskriptdata,Og generer et diagram på brukerens personlige hjemmeside for å vise den detaljerte installasjonsstatusen nedenfor.
  48. // @name:pl GreasyFork Wizualizacja danych skryptu opublikowanych przez użytkownika
  49. // @description:pl używaćChart.jsPozyskiwanie i wizualizacja danych skryptu użytkownika,I wygeneruj wykres na osobistej stronie głównej użytkownika, aby wyświetlić poniżej szczegółowy stan instalacji.
  50. // @name:pt-BR GreasyFork Visualização de dados de script publicado pelo usuário
  51. // @description:pt-BR usarChart.jsObtendo e visualizando dados de script do usuário,E gere um gráfico na página inicial pessoal do usuário para exibir o status detalhado da instalação abaixo.
  52. // @name:ro GreasyFork Vizualizarea datelor scripturilor publicate de utilizator
  53. // @description:ro utilizareChart.jsObținerea și vizualizarea datelor de script utilizator,Și generați o diagramă pe pagina de pornire personală a utilizatorului pentru a afișa mai jos starea detaliată a instalării.
  54. // @name:ru GreasyFork Визуализация данных сценария, опубликованного пользователем.
  55. // @description:ru использоватьChart.jsПолучение и визуализация данных пользовательского сценария,И создайте диаграмму на личной домашней странице пользователя, чтобы отобразить подробный статус установки ниже.
  56. // @name:sk GreasyFork Používateľom publikovaná vizualizácia dát skriptu
  57. // @description:sk použitieChart.jsZískavanie a vizualizácia údajov používateľského skriptu,A vygenerujte graf na osobnej domovskej stránke používateľa, ktorý zobrazí podrobný stav inštalácie nižšie.
  58. // @name:sr GreasyFork Визуелизација података скрипте коју је објавио корисник
  59. // @description:sr користитиChart.jsДобијање и визуелизација података корисничких скрипти,И генеришите графикон на личној почетној страници корисника да бисте приказали детаљан статус инсталације испод.
  60. // @name:sv GreasyFork Användarpublicerad skriptdatavisualisering
  61. // @description:sv användaChart.jsSkaffa och visualisera användarskriptdata,Och generera ett diagram på användarens personliga hemsida för att visa den detaljerade installationsstatusen nedan.
  62. // @name:th GreasyFork การแสดงข้อมูลสคริปต์ที่ผู้ใช้เผยแพร่
  63. // @description:th ใช้Chart.jsการรับและการแสดงภาพข้อมูลสคริปต์ผู้ใช้,และสร้างแผนภูมิบนหน้าแรกส่วนตัวของผู้ใช้เพื่อแสดงสถานะการติดตั้งโดยละเอียดด้านล่าง
  64. // @name:tr GreasyFork Kullanıcı tarafından yayınlanan komut dosyası veri görselleştirmesi
  65. // @description:tr kullanmakChart.jsKullanıcı komut dosyası verilerinin elde edilmesi ve görselleştirilmesi,Aşağıda ayrıntılı kurulum durumunu görüntülemek için kullanıcının kişisel ana sayfasında bir grafik oluşturun.
  66. // @name:ug GreasyFork ئىشلەتكۈچى ئېلان قىلغان قوليازما سانلىق مەلۇمات كۆرۈنۈش
  67. // @description:ug useChart.jsئىشلەتكۈچى قوليازما سانلىق مەلۇماتلىرىغا ئېرىشىش ۋە تەسۋىرلەش,ھەمدە تۆۋەندىكى تەپسىلىي قاچىلاش ھالىتىنى كۆرسىتىش ئۈچۈن ئىشلەتكۈچىنىڭ شەخسىي باش بېتىدە جەدۋەل ھاسىل قىلىڭ.
  68. // @name:uk GreasyFork Візуалізація даних опублікованого користувачем сценарію
  69. // @description:uk використовуватиChart.jsОтримання та візуалізація даних сценарію користувача,І створіть діаграму на особистій домашній сторінці користувача, щоб відобразити детальний стан встановлення нижче.
  70. // @name:vi GreasyFork Trực quan hóa dữ liệu tập lệnh do người dùng xuất bản
  71. // @description:vi sử dụngChart.jsLấy và hiển thị dữ liệu tập lệnh người dùng,Và tạo biểu đồ trên trang chủ cá nhân của người dùng để hiển thị trạng thái cài đặt chi tiết bên dưới.
  72. // @name:zh-TW GreasyFork 用戶發布的腳本資料視覺化
  73. // @description:zh-TW 使用Chart.js獲取和可視化獲取用戶腳本數據,並在使用者個人主頁產生圖表在下方顯示詳細安裝情況
  74. // @name:zh-HK GreasyFork 用戶發布的腳本資料視覺化
  75. // @description:zh-HK 使用Chart.js獲取和可視化獲取用戶腳本數據,並在使用者個人主頁產生圖表在下方顯示詳細安裝情況
  76. // @name:fr-CA GreasyFork Visualisation des données de script publié par l’utilisateur
  77. // @description:fr-CA utiliserChart.jsObtention et visualisation des données de script utilisateur,Et générez un graphique sur la page d’accueil personnelle de l’utilisateur pour afficher l’état détaillé de l’installation ci-dessous.
  78. // @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDMwMCAzMDAiIHN0eWxlPSJmaWxsOiAjRDcyMzIzOyI+PHBhdGggZD0iTTIwMC4zIDI2OS45Yy0xNS43IDYuNi0zMi43IDEwLjEtNTAuMyAxMC4xLTM0LjcgMC02Ny40LTEzLjUtOTEuOS0zOC4xQzMzLjUgMjE3LjQgMjAgMTg0LjcgMjAgMTUwczEzLjUtNjcuNCAzOC4xLTkxLjlDODIuNiAzMy41IDExNS4zIDIwIDE1MCAyMHM2Ny40IDEzLjUgOTEuOSAzOC4xQzI2Ni41IDgyLjYgMjgwIDExNS4zIDI4MCAxNTBjMCAxNy42LTMuNSAzNC42LTEwIDUwLjMgNSA1IDEwIDEwLjEgMTUuMSAxNS4xIDkuNi0xOS44IDE1LTQyIDE1LTY1LjRDMzAwIDY3LjIgMjMyLjggMCAxNTAgMFMwIDY3LjIgMCAxNTBzNjcuMiAxNTAgMTUwIDE1MGMyMy40IDAgNDUuNi01LjQgNjUuNC0xNS01LjEtNS0xMC4xLTEwLjEtMTUuMS0xNS4xeiIvPjxwYXRoIGQ9Ik0yNjcuOCAzMDBjLTkuNi0xLjMtMTYuNS03LTIzLjEtMTMuNy0xNC45LTE1LjMtMzAuMS0zMC4yLTQ1LjItNDUuMy05LjMtOS4zLTEyLTIwLjEtNy41LTMyLjcuMy0uOC4zLTIuMS0uMi0yLjYtMy45LTQuMS03LjktOC0xMi0xMi4xLTYuNCA0LTEzLjEgNi43LTIwLjUgNy42LTE1LjUgMS45LTI5LTIuNC00MC4yLTEzLjItMTIuMy0xMS44LTI0LjItMjQtMzYuMi0zNi4xLTMuNS0zLjUtNC4xLTcuNC0yLjItMTEuMiAxLjktMy43IDUuOS02LjQgOS43LTUuNiAyLjUuNSA1LjEgMiA2LjkgMy44IDcuNCA3LjEgMTQuNSAxNC40IDIxLjggMjEuNi42LjYgMS4zIDEuMiAxLjcgMS42bDEzLjgtMTMuOGMtNi4yLTYuMS0xMi42LTEyLjUtMTguOS0xOC45LTEuOS0xLjktMy44LTMuNy01LjYtNS42LTMuOC00LjItMy43LTkuNy4yLTEzLjYgMy45LTMuOSA5LjUtNC4xIDEzLjYtLjEgNy41IDcuMyAxNC44IDE0LjcgMjIuMSAyMi4xLjguOCAxLjUgMS44IDIuMSAyLjRsMTQuMy0xNC4zYy0yLTEuOC00LjUtNC02LjgtNi4zLTYtNS45LTExLjktMTEuOC0xNy44LTE3LjgtMi43LTIuNy0zLjctNS45LTIuNC05LjYgMS40LTMuOSA0LjItNi4zIDguMy02LjkgMy40LS42IDYgMSA4LjQgMy4zbDE0LjcgMTQuN2M3LjQgNy40IDE0LjkgMTQuNiAyMiAyMi4yIDE0LjcgMTUuNyAxNyAzOS4xIDYuMSA1Ny43LS40LjctLjcgMS40LTEuMyAyLjQgMy45IDMuOSA3LjkgNy44IDExLjkgMTEuNi42LjUgMiAuNiAyLjguMyAxMi41LTQuNCAyMy4zLTEuNyAzMi43IDcuNiAxNS4xIDE1LjEgMzAuMSAzMC4zIDQ1LjMgNDUuMiA2LjcgNi41IDEyLjQgMTMuNCAxMy43IDIzdjUuOGMtLjIuNS0uNCAxLjEtLjUgMS42LTEuOCA5LjUtNi42IDE3LTE1LjUgMjEuMi0zLjMgMS42LTYuOSAyLjMtMTAuNCAzLjUtMS45LjItMy44LjItNS44LjJ6Ii8+PHBhdGggZD0iTTE3MCAyMTkuNmMtMi43LjctNS40IDEuMi04LjIgMS41LTMuMS40LTYuMi42LTkuMi42LTE3LjkgMC0zNC4yLTYuNi00Ny4yLTE5LjItMTAuMi05LjgtMjAuMi0yMC0zMC0yOS44bC02LjYtNi42Yy05LjUtOS41LTExLjctMjIuNy01LjgtMzQuMyA0LjktOS42IDE0LjQtMTYgMjQuNS0xNi42LjUtNi45IDMuNS0xMy42IDguOS0xOC45IDUuMi01LjEgMTEuOC04LjIgMTguNy04LjcuMi0yLjUuNy00LjkgMS42LTcuNCAzLjgtMTAuOCAxMi42LTE4LjEgMjMuOS0yMCAxLjUtLjIgMy4xLS40IDQuNi0uNCA1LjQgMCAxMy40IDEuNiAyMS4xIDkuMiA0LjcgNC43IDkuNiA5LjUgMTQuOCAxNC43IDIuMSAyLjIgNC40IDQuNCA2LjUgNi41IDUuMyA1LjIgMTAuNyAxMC42IDE1LjkgMTYuMiAxMC4yIDEwLjkgMTYuNCAyNC41IDE3LjkgMzkuMy45IDguMi4yIDE2LjQtMS44IDI0LjJoLjFjMTIuOCAwIDI0LjcgNS4xIDM0LjcgMTQuOCAzLjYtMTAuOSA1LjYtMjIuNiA1LjYtMzQuNyAwLTYwLjgtNDkuMi0xMTAtMTEwLTExMFM0MCA4OS4yIDQwIDE1MHM0OS4yIDExMCAxMTAgMTEwYzEyLjEgMCAyMy44LTIgMzQuNy01LjYtOS44LTEwLjEtMTQuOC0yMi4xLTE0LjctMzQuOHoiLz48L3N2Zz4=
  79. // @namespace https://github.com/#####GodMan/UserScripts
  80. // @version 2024.12.17.1920
  81. // @author aspen138,人民的勤务员 <china.qinwuyuan@gmail.com>
  82. // @compatible chrome
  83. // @compatible firefox
  84. // @compatible edge
  85. // @compatible opera
  86. // @compatible safari
  87. // @match *://greasyfork.org/*/users/*
  88. // @grant none
  89. // @license MIT
  90. // @supportURL https://github.com/#####GodMan/UserScripts/issues
  91. // @homepageURL https://github.com/#####GodMan/UserScripts
  92. // ==/UserScript==
  93. (function () {
  94. 'use strict'
  95. let ONPAGE = true//默认向GreasyFork下载用户数据,为true时从当前访问的页面获取
  96. let OPENLINK = 1 //点击柱,跳转到脚本网址.0 不跳转,1跳转前有提示,2直接跳转
  97. // Function to fetch user data
  98. const injectChartJs = () => {
  99. const userHeader = document.querySelector('#about-user h2')
  100. if (!userHeader) return
  101. const loadChartJs = (library) => {
  102. const script = document.createElement('script')
  103. script.textContent = library
  104. document.head.appendChild(script)
  105. fetchDataAndPlot()
  106. }
  107. const chartJsFromStorage = localStorage.getItem('chartJsLibrary')
  108. if (chartJsFromStorage) {
  109. loadChartJs(chartJsFromStorage)
  110. } else {
  111. fetch('https://cdn.jsdelivr.net/npm/chart.js')
  112. .then(response => response.text())
  113. .then(library => {
  114. localStorage.setItem('chartJsLibrary', library)
  115. loadChartJs(library)
  116. })
  117. .catch(error => console.error('Chart.js 加载失败: ', error))
  118. }
  119. }
  120. const getUserData = (userID) => {
  121. return fetch(`https://${window.location.hostname}/users/${userID}.json`)
  122. .then((response) => {
  123. console.log(`${response.status}: ${response.url}`)
  124. return response.json()
  125. })
  126. .then((data) => {
  127. data.scripts.sort((a, b) => b.total_installs - a.total_installs)
  128. return data
  129. })
  130. }
  131. // Function to plot the chart console.log()
  132. const plotDistribution = (labels, totalInstalls, dailyInstalls, links, updateds, createds) => {
  133. const canvasHtml = '<canvas id="installDistributionCanvas" width="100" height="50"></canvas>'
  134. const userHeader = document.querySelector('#about-user h2')
  135. if (userHeader) {
  136. userHeader.insertAdjacentHTML('afterend', canvasHtml)
  137. const ctx = document.getElementById('installDistributionCanvas').getContext('2d')
  138. // Plot chart
  139. const chart = new Chart(ctx, {
  140. type: 'bar', // Change this to 'line', 'bar', etc. as needed
  141. data: {
  142. labels: labels, // X-axis labels
  143. datasets: [{
  144. label: 'Total Installs',
  145. data: totalInstalls, // Y-axis data for Total Installs
  146. backgroundColor: 'rgba(54, 162, 235, 0.2)',
  147. borderColor: 'rgba(54, 162, 235, 1)',
  148. borderWidth: 1,
  149. yAxisID: 'y-axis-1'// Associate this dataset with the first y-axis
  150. },
  151. {
  152. label: 'Daily Installs',
  153. data: dailyInstalls, // Y-axis data for Daily Installs
  154. backgroundColor: 'rgba(255, 99, 132, 0.2)',
  155. borderColor: 'rgba(255, 99, 132, 1)',
  156. borderWidth: 1,
  157. yAxisID: 'y-axis-2'// Associate this dataset with the second y-axis
  158. }]
  159. },
  160. options: {
  161. scales: {
  162. 'y-axis-1': {
  163. type: 'linear',
  164. position: 'left', // This places the first y-axis on the left
  165. beginAtZero: true,
  166. ticks: {
  167. color: 'rgba(54, 162, 235, 1)'
  168. }
  169. },
  170. 'y-axis-2': {
  171. type: 'linear',
  172. position: 'right',// This places the second y-axis on the right
  173. beginAtZero: true,
  174. ticks: {
  175. color: 'rgba(255, 99, 132, 1)'
  176. }
  177. }, x: {
  178. grid: {
  179. display: false
  180. }
  181. /* ticks: {
  182. color: 'blue',
  183. maxRotation: 60,
  184. minRotation: 60,
  185. callback: function (value) {
  186. const label = this.getLabelForValue(value)
  187. if (label.length > 15) {
  188. return label.substring(0, 10) + '...'
  189. }
  190. return label.split(' ').join('\n')
  191. },
  192. } */
  193. }
  194. }, onClick: function (evt, activeElements) {
  195. if (activeElements.length > 0) {
  196. const element = activeElements[0]
  197. const datasetIndex = element.datasetIndex
  198. const dataIndex = element.index
  199. const label = chart.data.labels[dataIndex]
  200. const value = chart.data.datasets[datasetIndex].data[dataIndex]
  201. console.log(`点击\nLabel: ${label}\nValue: ${value}\nLink: ${links[dataIndex]}`)
  202. if (OPENLINK === 1 && !confirm(`Open: ${label}?`)) return
  203. if (OPENLINK !== 0) window.open(links[dataIndex], '_blank')
  204. }
  205. },
  206. plugins: {
  207. legend: {
  208. onClick: (e, legendItem, legend) => {
  209. // 获取当前数据集
  210. const datasetIndex = legendItem.datasetIndex
  211. const dataset = chart.data.datasets[datasetIndex]
  212. // 切换数据集的显示状态
  213. dataset.hidden = !dataset.hidden
  214. // 更新 Y 轴显示状态
  215. chart.options.scales['y-axis-1'].display = chart.data.datasets.some(ds => ds.yAxisID === 'y-axis-1' && !ds.hidden)
  216. chart.options.scales['y-axis-2'].display = chart.data.datasets.some(ds => ds.yAxisID === 'y-axis-2' && !ds.hidden)
  217. // 更新图表
  218. chart.update()
  219. }
  220. }, tooltip: {
  221. callbacks: {
  222. label: function (tooltipItem) {
  223. const label = tooltipItem.dataset.label || ''
  224. const value = tooltipItem.raw
  225. return `${label}: ${value}`
  226. },
  227. afterBody: function (tooltipItem) {
  228. const index = tooltipItem[0].dataIndex
  229. const extraInfo = `\n📅${toSystemTime(createds[index])}\n${toSystemTime(updateds[index])}`
  230. return extraInfo
  231. }
  232. }
  233. }
  234. }
  235. }
  236. })
  237. }
  238. }
  239. function toSystemTime(isoTime) {
  240. let date = new Date(isoTime)
  241. return date.toLocaleString()
  242. }
  243. // Function to display totals
  244. const displayTotals = (daily, total, publishedScriptsNumber) => {
  245. const userHeader = document.querySelector('#about-user h2')
  246. const language = document.documentElement.lang // Get the current language of the document
  247. let dailyInstallsText = ''
  248. let totalInstallsText = ''
  249. // Determine the text based on the current language
  250. switch (language) {
  251. case 'zh-CN':
  252. publishedScriptsNumber = `已发布脚本总数:${publishedScriptsNumber}`
  253. dailyInstallsText = `该用户所有脚本的今日总安装次数:${daily}`
  254. totalInstallsText = `该用户所有脚本的迄今总安装次数:${total}`
  255. break
  256. case 'zh-TW':
  257. publishedScriptsNumber = `已發布腳本總數:${publishedScriptsNumber}`
  258. dailyInstallsText = `該用戶所有腳本的今日總安裝次數:${daily}`
  259. totalInstallsText = `該用戶所有腳本的迄今總安裝次數:${total}`
  260. break
  261. case 'ja':
  262. publishedScriptsNumber = `公開されたスクリプトの合計:${publishedScriptsNumber}`
  263. dailyInstallsText = `本日の全スクリプトの合計インストール回数:${daily}`
  264. totalInstallsText = `全スクリプトの累計インストール回数:${total}`
  265. break
  266. case 'ko':
  267. publishedScriptsNumber = `게시된 스크립트 수: ${publishedScriptsNumber}`
  268. dailyInstallsText = `해당 사용자의 모든 스크립트에 대한 오늘의 설치 횟수: ${daily}`
  269. totalInstallsText = `해당 사용자의 모든 스크립트에 대한 설치 횟수: ${total}`
  270. break
  271. default:
  272. publishedScriptsNumber = `Number of published scripts: ${publishedScriptsNumber}`
  273. dailyInstallsText = `Total daily installations for all scripts: ${daily}`
  274. totalInstallsText = `Total installations to date for all scripts: ${total}`
  275. }
  276. if (userHeader) {
  277. userHeader.insertAdjacentHTML('afterend', `
  278. <div>${publishedScriptsNumber}</div>
  279. <div>${dailyInstallsText}</div>
  280. <div>${totalInstallsText}</div>
  281. `)
  282. }
  283. }
  284. // Function to fetch data and plot the chart
  285. const fetchDataAndPlot = () => {
  286. if (ONPAGE) {
  287. const totalInstalls_selector = '#user-script-list-section dd.script-list-total-installs > span'
  288. const dailyInstalls_selector = '#user-script-list-section dd.script-list-daily-installs > span'
  289. const scriptTitle_selector = '#user-script-list-section article > h2 > a.script-link'
  290. const links = Array.from(document.querySelectorAll(scriptTitle_selector)).map(el => el.href)
  291. if (!links.length) return
  292. const labels = Array.from(document.querySelectorAll(scriptTitle_selector)).map(el => el.text)
  293. const updateds = Array.from(document.querySelectorAll('#user-script-list-section dd.script-list-updated-date > span'))
  294. .map(span => span.querySelector('relative-time')?.getAttribute('datetime'))
  295. const createds = Array.from(document.querySelectorAll('#user-script-list-section dd.script-list-created-date > span'))
  296. .map(span => span.querySelector('relative-time')?.getAttribute('datetime'))
  297. const totalInstalls = Array.from(document.querySelectorAll(totalInstalls_selector)).map(el => (parseInt(el.textContent.replace(/,/g, ''), 10) || 0))
  298. const dailyInstalls = Array.from(document.querySelectorAll(dailyInstalls_selector)).map(el => (parseInt(el.textContent.replace(/,/g, ''), 10) || 0))
  299. const totalDailyInstalls = dailyInstalls.reduce((sum, current) => sum + current, 0)
  300. const totalTotalInstalls = totalInstalls.reduce((sum, current) => sum + current, 0)
  301. const publishedScriptsNumber = totalInstalls.length
  302. plotDistribution(labels, totalInstalls, dailyInstalls, links, updateds, createds)
  303. displayTotals(totalDailyInstalls, totalTotalInstalls, publishedScriptsNumber)
  304. return
  305. }
  306. const currentURL = window.location.href
  307. const userIDMatch = currentURL.match(/(\d+)/)
  308. const userID = userIDMatch ? userIDMatch[1] : null
  309. getUserData(userID)
  310. .then((data) => {
  311. //console.log("data=", data);
  312. const scripts = data.all_listable_scripts || data.scripts || []
  313. //const filteredScripts = scripts.filter(script => !script.deleted)
  314. const filteredScripts = scripts.filter(script =>
  315. !script.deleted &&
  316. (script.code_url.includes('.user.js') || script.code_url.includes('.user.css'))
  317. )//在当前已登录账户的个人主页屏蔽删除掉的脚本与排除.js库文件
  318. const labels = filteredScripts.map(script => script.name)
  319. const links = filteredScripts.map(script => script.url)
  320. if (!links.length) return
  321. const updateds = filteredScripts.map(script => script.code_updated_at)
  322. const createds = filteredScripts.map(script => script.created_at)
  323. const totalInstalls = filteredScripts.map(script => script.total_installs)
  324. const dailyInstalls = filteredScripts.map(script => script.daily_installs)
  325. const totalDailyInstalls = dailyInstalls.reduce((sum, value) => sum + value, 0)
  326. const totalTotalInstalls = totalInstalls.reduce((sum, value) => sum + value, 0)
  327. const publishedScriptsNumber = filteredScripts.length
  328. plotDistribution(labels, totalInstalls, dailyInstalls, links, updateds, createds)
  329. displayTotals(totalDailyInstalls, totalTotalInstalls, publishedScriptsNumber)
  330. })
  331. .catch((error) => console.error('Error fetching user data:', error))
  332. }
  333. injectChartJs()
  334. })()