GreasyFork: Amélioration de la barre de navigation

Ajouter une liste d’utilisateurs sur la barre de navigation,console,Collecte etc..

Installer ce script?
Script suggéré par l'auteur

Vous pourriez également aimer Greasyfork Artisan de la colle.

Installer ce script
  1. // ==UserScript==
  2. // @name GreasyFork: User Control Panel Button
  3. // @name:zh-CN GreasyFork: 导航栏增强
  4. // @description:zh-CN 在导航栏上添加用户列表,控制台,收藏等..
  5. // @name:ar GreasyFork: تعزيز شريط التنقل
  6. // @description:ar إضافة قائمة المستخدمين على شريط التنقل,وحدة التحكم,جمع الخ..
  7. // @name:bg GreasyFork: Подобряване на лентата за навигация
  8. // @description:bg Добавяне на потребителски списък в лентата за навигация,конзола,Колекция и др...
  9. // @name:cs GreasyFork: Vylepšení navigační lišty
  10. // @description:cs Přidejte seznam uživatelů na navigační lištu,utěšit,Sbírka atd...
  11. // @name:da GreasyFork: Forbedring af navigationslinjen
  12. // @description:da Tilføj brugerliste på navigationslinjen,konsol,Indsamling mv...
  13. // @name:de GreasyFork: Verbesserung der Navigationsleiste
  14. // @description:de Benutzerliste zur Navigationsleiste hinzufügen,Konsole,Sammlung usw...
  15. // @name:el GreasyFork: Βελτίωση της γραμμής πλοήγησης
  16. // @description:el Προσθήκη λίστας χρηστών στη γραμμή πλοήγησης,κονσόλα,Συλλογή κλπ...
  17. // @name:en GreasyFork: Navigation bar enhancement
  18. // @description:en Add user list on navigation bar,console,Collection etc...
  19. // @name:eo GreasyFork: Plibonigo de navigado trinkejo
  20. // @description:eo Aldonu uzantliston sur navigadbreto,konzolo,Kolekto ktp...
  21. // @name:es GreasyFork: Mejora de la barra de navegación
  22. // @description:es Agregar lista de usuarios en la barra de navegación,consola,Colección, etc...
  23. // @name:fi GreasyFork: Navigointipalkin parannus
  24. // @description:fi Lisää käyttäjäluettelo navigointipalkkiin,konsoli,Kokoelma jne...
  25. // @name:fr GreasyFork: Amélioration de la barre de navigation
  26. // @description:fr Ajouter une liste d’utilisateurs sur la barre de navigation,console,Collecte etc..
  27. // @name:he GreasyFork: שיפור סרגל הניווט
  28. // @description:he הוסף רשימת משתמשים בסרגל הניווט,לְנַחֵם,אוסף וכו’...
  29. // @name:hr GreasyFork: Poboljšanje navigacijske trake
  30. // @description:hr Dodajte popis korisnika na navigacijsku traku,konzola,Zbirka itd...
  31. // @name:hu GreasyFork: A navigációs sáv továbbfejlesztése
  32. // @description:hu Felhasználói lista hozzáadása a navigációs sávhoz,konzol,Gyűjtemény stb...
  33. // @name:id GreasyFork: Peningkatan bilah navigasi
  34. // @description:id Tambahkan daftar pengguna di bilah navigasi,menghibur,Koleksi dll...
  35. // @name:it GreasyFork: Miglioramento della barra di navigazione
  36. // @description:it Aggiungi l’elenco degli utenti sulla barra di navigazione,consolle,Raccolta ecc...
  37. // @name:ja GreasyFork: ナビゲーションバーの強化
  38. // @description:ja ナビゲーションバーにユーザーリストを追加,コンソール,コレクションなど..
  39. // @name:ka GreasyFork: ნავიგაციის ზოლის გაუმჯობესება
  40. // @description:ka დაამატეთ მომხმარებლის სია ნავიგაციის ზოლში,კონსოლი,კოლექცია და ა.შ...
  41. // @name:ko GreasyFork: 탐색 표시줄 개선
  42. // @description:ko 탐색 표시줄에 사용자 목록 추가,콘솔,수집 등..
  43. // @name:nl GreasyFork: Verbetering van de navigatiebalk
  44. // @description:nl Voeg een gebruikerslijst toe aan de navigatiebalk,troosten,Collectie enz...
  45. // @name:nb GreasyFork: Forbedring av navigasjonslinjen
  46. // @description:nb Legg til brukerliste på navigasjonslinjen,konsoll,Samling etc...
  47. // @name:pl GreasyFork: Udoskonalenie paska nawigacji
  48. // @description:pl Dodaj listę użytkowników na pasku nawigacyjnym,konsola,Kolekcja itp...
  49. // @name:pt-BR GreasyFork: Aprimoramento da barra de navegação
  50. // @description:pt-BR Adicionar lista de usuários na barra de navegação,console,Coleção etc..
  51. // @name:ro GreasyFork: Îmbunătățirea barei de navigare
  52. // @description:ro Adăugați lista de utilizatori pe bara de navigare,consolă,Colectare etc...
  53. // @name:ru GreasyFork: Улучшение панели навигации
  54. // @description:ru Добавить список пользователей на панель навигации,консоль,Коллекция и т. д...
  55. // @name:sk GreasyFork: Vylepšenie navigačnej lišty
  56. // @description:sk Pridajte zoznam používateľov na navigačnú lištu,konzoly,Zbierka atď...
  57. // @name:sr GreasyFork: Побољшање траке за навигацију
  58. // @description:sr Додајте листу корисника на траку за навигацију,конзола,Збирка итд...
  59. // @name:sv GreasyFork: Förbättring av navigeringsfältet
  60. // @description:sv Lägg till användarlista i navigeringsfältet,trösta,Samling etc...
  61. // @name:th GreasyFork: การเพิ่มประสิทธิภาพแถบนำทาง
  62. // @description:th เพิ่มรายชื่อผู้ใช้บนแถบนำทาง,คอนโซล,คอลเลกชัน ฯลฯ..
  63. // @name:tr GreasyFork: Gezinme çubuğu geliştirmesi
  64. // @description:tr Gezinme çubuğuna kullanıcı listesi ekleyin,konsol,Koleksiyon vb...
  65. // @name:ug GreasyFork: يولباشچى بالداقنى كۈچەيتىش
  66. // @description:ug يولباشچى ستونىغا ئىشلەتكۈچى تىزىملىكىنى قوشۇڭ,console,توپلاش قاتارلىقلار...
  67. // @name:uk GreasyFork: Покращення панелі навігації
  68. // @description:uk Додати список користувачів на панель навігації,консоль,Колекція тощо..
  69. // @name:vi GreasyFork: Cải tiến thanh điều hướng
  70. // @description:vi Thêm danh sách người dùng trên thanh điều hướng,bảng điều khiển,Bộ sưu tập vv...
  71. // @name:zh-TW GreasyFork: 導覽列增強
  72. // @description:zh-TW 在導覽列上新增使用者列表,主機,收藏等..
  73. // @name:zh-HK GreasyFork: 導覽列增強
  74. // @description:zh-HK 在導覽列上新增使用者列表,主機,收藏等..
  75. // @name:fr-CA GreasyFork: Amélioration de la barre de navigation
  76. // @description:fr-CA Ajouter une liste d’utilisateurs sur la barre de navigation,console,Collecte etc..
  77. // @namespace https://github.com/ChinaGodMan/UserScripts
  78. // @match https://greatest.deepsurf.us/*
  79. // @match https://sleazyfork.org/*
  80. // @grant none
  81. // @version 0.3.1.57
  82. // @license MIT
  83. // @author CY Fung & 人民的勤务员 <china.qinwuyuan@gmail.com>
  84. // @description To add User Control Panel Button into navigation bar
  85. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYRBAceMUIR3QAAEg9JREFUeNrtXWlwVNW2/k4n3RkbM5FRMEHUBOIAekGMJV4lYVDBAeQ+IYTJODAVjwBXfRZFQRn04vthiQgGEOMDiylY4lB6g1CG8VFJLF4SSYiBRBDTSZM06aQzdH/vB+ccex5Id9IBV9WuJDvnnL3P+s7+9tprr723gBsUkkoAEAShG96VQABqAOHiz+EARog/7wAwGECkmMLEe/QAropJA+AigPMAKsWfbQCuianH7B2iAOgFQehEP4kA/xClqOQHANwL4B4AdwEYCiCkl8/uAFAPoAbAOQBnAZQDqALQhVtcEgAsB3AcwG/il0ofpzaxrONi2Qm3ksIFAFEAxgHYDqDVE+VJEhISwoKCAra0tFCj0TA/P9/uddb363Q6/vTTT/Lfw4YNo0KhaBXrMk6sm3CzKj8JwKsAvlGpVO2zZ8/mkSNHePnyZRoMBrsKcwTAnj17aC2LFi1yCYB1/vnz57ljxw7p73YA34h1TLqZFB8MIDcwMLBi6NChHUuXLuXFixdpT9wF4MyZMxw5ciQHDRrEjz/+mCR5+vRpjwGw/jszM5NRUVEdACoA5Ip1H7ASC+A5AP/rLf6WZMyYMXJeQkICSfLatWu9BqCjo4Pfffed+T0lAB4xs7YGjEwRrQ2jNztQSVQqlUeKdfc6B/e1ANgEIG0gKD4QwGYA3QCoUCgoCAIFQWBqaip//fVXOhN3AfBUsQCoUqluFACK73MBwGwACn+mnN0ATEqlki+//DIrKyu5detWJiUlySCcPXuWJpPJpwA0NjaSJBMTE+W8sWPH9gYAKRkA/Et8V7+SvwE4JFFOQkICT58+TZLs7u7mgQMHOGTIEK9RkKv8Y8eOkSQ3b95MtVrNESNG8MyZM94AgOJI+pD4zn5h108BUG1eyYiICBYVFckv1N3dzeLiYkZGRvYJAPPmzbNpXXv37vUYABeAVIvv3m/jhgAATwO4bK+Co0aNYnl5uYUSiouLOWTIEAqC4FMAADA/P58ajYatra389NNPGRoa6pHCIyMjSZLV1dXO6nRZ1EFAXytfBWCp6NxyWMFRo0bx2LFjMudLdHT77bf72t3Q67R48WLq9Xred999rq5tFscMqr788v9TdGS5fJHU1FSZk83pKCIiwq8BKC0t5bx589y9XiuCENAXnP+s6GFkUFAQU1JSmJiYSEGhcNoSvE1HfpiaRTryaZ8wBcAfUqFz5sxhXV0dy8vL+cL06QwIDHQKQklJiQ0decM68qN0WdSRz0zNGvMCd+3aJX/Rly5d4vQZM5y2hIFKRx6mal+YqLEAvrYubMqUKfKghyTr6+s5ITPzLzq6Pk7w2mBNIY7+bPw6QUFBzM3NpUajsQBhuht0ZM86uonoqEfUmVfcFh8BMDkqLCgoiNnZ2ezo6PiLjmzdFrO90el2C4LAQCdfNABmZ2dbtISGhgZmZWU5BWH06NG9piN3/Ui+8Mq6ce0FAKm94f2zkmNt/fr1fOSRR+isJdiloxkzvGIdeTIK9iMAukVX9g3NJ7wCwDRlyhTq9XoajUbW19czKyuLntLRDC/QkeTKHoBU1CJO6ng8jfgbAM6cOZPd3d0WCp00aRIDAgLcpiNvWEeSK3uA9gclnk5v5ko3h4eHc8eOHezq6iJJmkwmVlRUcNKkSQ4LVNmho4aGBs7oBR0JgsBHH32UZ8+etaAAazpQKpVctWoVy8rKqNfrqdfrWVZWxry8PIt+zN0IC3cpyN7zGhsbOWfOHOmaXE+iF/4PAJ944gkCYGxsLAsLC9nT0yODcOnSpRuiI1fW0YQJE6jT6ezSkfXMmrUyVCoVjxw54nDGrbi4WAbB3QgLTwGw9zzR+VjhTrSFIIZltFsXGhcXx0OHDtFoNHpER7PdpCOFQsG0tDRWVVU5VJ4968hcGatWrSJJarVazp07lzExMYyJieG8efPY0tJCkszLy/MowsJTAOw9b+/evVLYy6uufEVRYmyMxcOllhAfH8/CwkKP6Mgd60ihUDAjI4NlZWUOv153rCOpD8nJybGpx/z580mSpaWlHkVYeAqAvefpdDop7xtRxw5lnL2vv7a21oaOpJYg0dHEiROd9gnO6CgtLY1lZWUWrcsRCIcOHWJISIhdZbS3t5Mko6OjbeoQExNDktTr9R5FWHgKgIvntYs6dijbHRVYVVXVazqyZx39x0svOaQdR/Lee+/J5fz++++9AuBGbHxnALhx7XZHyk9wFKtp7+FxcXEe05E960i63xOpra3lPffcQwD88MMPbSgoOzvbpuy5c+fapaB+AKAVDgKCl3s68vOWdeSptLa28sUXXyQALliwwKYTbm5uZnZ2NqOjoxkdHc2cnBxqtVq7nXBfAyC23OXWylfieri22wVKzdxTOpKsnfr6+hsGwGAw8PXXXycA5uTkWJihR48edXjf4cOHqVQq+xWAjIwMirpWmgNwvzTy9aQFDBs2zCM6csfacUfa29u5cOFCGwAkEFatWsXy8nK2t7dTr9ezvLycK1eulJXfnwAUFhZS1PX95gDkoJeLI9yhI3etHVei0WiYmZk5kF3VbaLO5XjOjd54sCM6mjx5MtPT0z22dhzJiRMnGBUVNdDnCzaKukckgK+89WB7dFRdXc2amhqvKF+j0Tgdcwyg9JWoewwB8Is3H25NR94UjUbDkenpNwMAv+D6IkSMsDf69QUdeUsqKio4avRop069AZDaRd1jqq8KsaYjb4nRaGRJSQlHjR490FvBVAD4py8L8RUdGY1GVlRUMG3EiIEMwD8BoMDXBf1FRw5TAQD84KsCli1bxgcffNAv6Kg/Ju/dSD8A15fte/3hw4cPp8FgsBgNx8bGcufOnS7pyNESpt7QUV8DoFKpuGbNGtbW1tJgMLC2tpZr1qyxGI2LusdFX1Tg888/p1artYknui0iglu2bGFTU5MNJXV1dbG6upqLFi3iwYMHPe43/ImO9u3bZ7eO4uyYlC4CgM7bhcfHx7Ozs1Pye9j1iGZlZXHjxo388ssvWVxczN27d/ONN97g/fffT4VCwZiYGBYUFLCzs3PAWUcTJ04kSba0tDArK0t+X2la1MyNosPkyZNNNTU1LqMHgoOD+cEHH/DKlSvs7u52WoElS5aQJBcsWCB7Tjs6OlhTU8OgoCCLZhoZGcnBgwdTrVbbeE8lEDxpCY7oqC8p6LPPPiNJrl692iJ/9erVJMmdO3dKeUbMmjXLdOnSJZfRA+aL3Fy9yMGDB0mSDz30kE0o++LFi22uDw4OZmJiouziLioqkjvvmJgY7t+/v9d0tHXrVpcfjifi7DmSzyvdasSenp5OkqysrPwTgJSUlLaoqCiX0QMNDQ2cPHkyw8LCXH4BtbW1JMnBgwfLeY8//rgcNWB9/ebNm1lWVsbhw4cTAPfs2cO0tDQ5AsIbdBQfH8+tW7f2CQBSWE1oaKhFvrRQsLW19U8Ksu6EHUUPPPvss243wba2NrsT1OfOnSNJpqamWgRjkWRJSYnTZ3qDjtRqdZ9QkFRH6xAaQRDk4ALzTrjcnclrT8LGJQDM+R4A8/LySJLr1q2T86TYmfnz58uTNitWrGBpaSnb2tpYVVXldTrydfKgBZTbDMTcjR5wh4JiY2NtvmLJJpbCHnU6HXU6nUxt77//vo0Cq6qq5LAYX1pH/dAH/GDjinA3esCdTtg8SElKX3zxBUkyIyODr7zyCkmyoKBA/n9TU5Mc2RAZGUmFQsHIyEiL2CRvWke+AMADK6gACQkJa8LDwz2OHnDHDM3NzaW9KDtpH4fS0lKS5Lhx4+T/Nzc3kySnTZtGlUrFlJQU2QIzj03yZzqaNGmSPA7IzMykSqViZmambOA8+eSTfzrjZsyYkfv22297HD3gaiBmMBi4e/duu/+vrq6Ww1LMmqM8graWAwcO2K2HPw/WzOtsLvv377d0Ry9ZsuTvU6dO7fQ0esCdwUhLS4u178Mifse8pUkpMjKShYWFbGpqolar5bZt2xgWFmZTD1/TkTd8QWvXrmVdXR07OztZV1fHtWvXmluG8oTMUG9PSQLgnXfeyY6ODs6cOdPnVsdAsY4cTUl6dVLePK1bt44nTpzokxcagL4jeVLea2Ep/Z38lY5chaV4JTDLn0AYAHRkEZjlMjRxoLYEP6Yjm9BElbPg3L/oyOvpuL0NnpbfTAD4OR0t92iBxl905NXkcIGGwyVK/bDE/2amo+0uF+l9//339iaQvQ6AK0B6uRTIH+nI5SK9KIVC8e3JkyfZ1NRk404eyAD4CR3ZLlMlKVgv1H7qqac6X3rpJZ9TUF8D0M90ZH+htslksl65nRQeHl7l6AXDwsK4fft2trS08PLly1y6dKmFE02r1VKj0XD9+vVeB8BTMb8nKCiIQ4cO9RodBQYGcsWKFdRoNDQYDKypqeG7777LQYMGyfVNTk5mUVERV65c6fZWBTabdVi//P79+20q9swzz/DkyZM2+bNnz/YbAPbt2+f1mbX4+Hh5mawkZ8+epVqtZlRUFOvr6/nzzz9Ls31ub9YhbVdTYk8ZpaWlvPfee6lWq+XCr169ajff/LyW3ii0NxQkSV1dHR977DGGhITI89veoqPAwEA+/PDDPHXqFEkyPz+fGzZsYEdHB5977rkb2q4G4iZDLdYvMnbsWIuJF2f5V65c8RsAnn76acsQydtu87p1lJycTJI8d+4cKysr+fXXXzMoKOiGNmyCuM3WJnHbLZd7IdjLNxqN/d4JSyIpXEpqtdordCRNvD/wwAPyNjqdnZ1sa2vj+PHje1xuWWanEzaXNHHjOTli2dMX91cAIiIiWFtby/Hjx/eKjo4fP87Q0FAGBATwzTffJEn29PTwrbfekjbtc370iZUZak9mAzA0NDT4BQBSRLXCamDkKN8RBU2bNo0k+dVXX/V6sGY9rSpuSeDetpUuWgAgbtz62muvGf0BAGmjj6ysLIvIM0f51p1wWFgYx48fzwsXLpAkN2zYYHeO2RM6KikpYXBwMAHwhRde4F133eXVjVulLSwPbdq0qd8BsLclmLN8Z+ZzfX29fKpHb+KOKisrZctKnAP36tbFkvwtKirqfH8DkJCQwL1791os8HCWL0loaCg/+eQTNjc389q1aywqKmJycrLDPZE8oaOjR4/KYYiCIPhk825JpsDBkSX+mnrjgXWHjoxGo/lBD13w4fb1kq/oaVw/rOCmB0BaXLJp0ya7iwtNJhO3bdsm8b8JwH+hDw71CRCH1dpbAQAADAsLY15eHqurq9nY2MimpibW1tYyPz9fMm9NAApxA+fI3ChaKgBzAeS72gWwv+W67gFB6P2HmZiYiLvvvhtKpRIXLlxAXV0denp6COB/ALwmRjv0mTg9xuoWSUYAa9GHJyjZa0E2B7ndIukygH/ATw6Alo4y7LkFFO9XRxlaD9b+hesnR9ysyvfbwzzN3RazRSdU901kJQ2I42zNJVV0w7YMRAACAgI4c+ZMPv/880xKStIFBAR8hAFyoLP1fMIj1jNr/g5AXFwc33nnHaakpEgzWQPySHPr6c1ccVK63R8BMJlM8hLZMWPGGAIDAyvFOgfjJpIkAK8mJSX9OyMjw6BUKrlx40ZqNBrqdDoeOHCAd9xxh4VyZs2axR9//JFXr151GHkgiauTMKQIhWvXrlGj0fCjjz5iSEgIy8rKpMiOdqVS+a0YOpKEm1QEceQ8DsD2sLAw3YIFC1hSUkKtVsuamhrZPWxvsZ515AHcPAlDilAwGo1sa2tjY2Mjd+3axbS0NAYGBraK4YLjxLoJuIUkAcByQRCOp6WlXVm4cKFh6tSpnDhxIquqqlhVVcXp06czOjqawcHBNpEHcHFyxalTp+Rls/v27eOKFSsYExOjFwThN1wPEV8OJ4Gyt5IocX3BQk5QUNB/x8bGfpeenv6rWq226TOSkpJ44cIFedOPzs5OajQai4OXBw0axGXLlnHChAkE0J6cnHw+Ojr6W1xfFpQjlqXyF0pwKUajMUAQBMV1n5Zg4ehSKBRd4u8q0enVZcchppKudXXdli1bAvfs2aP+448/wvV6fbhOp7uzq6srzWg03knyDpIxJCMBRHR1dYWpVCoA0Hd1dV0FcBWABsDF8PDwOpVKVaXVan8ZOXJkZ1xcXNvhw4ebxZGsRZlSfUwmk0oQBLS3t3eLwVTuOPvsvo+z9zSX/wfl+jWwZp8+ogAAAABJRU5ErkJggg==
  86. // @iconbak https://greatest.deepsurf.us/vite/assets/blacklogo96-CxYTSM_T.png
  87. // @supportURL https://github.com/ChinaGodMan/UserScripts/issues
  88. // @homepageURL https://github.com/ChinaGodMan/UserScripts
  89. // ==/UserScript==
  90.  
  91. (async () => {
  92. let sections = [
  93. { id: '#user-script-sets-section' },
  94. { id: '#control-panel' },
  95. // { id: '#user-library-list-section', name: '库' },
  96. //{ id: '#user-unlisted-script-list-section', name: '没上架' },
  97. // { id: '#user-discussions', name: '讨论' },
  98. { id: '#user-script-list-section' }
  99. ]
  100.  
  101. function preSetup() {
  102. let pos = document.querySelectorAll('#site-nav>nav>li.with-submenu')
  103. pos = pos.length >= 1 ? pos[pos.length - 1] : null
  104.  
  105. if (!pos) return
  106.  
  107. pos.parentNode.style.minHeight = '2.8rem'
  108.  
  109. return { pos }
  110. }
  111.  
  112. function setup(m, namespace) {
  113. const { cpmRoot } = m
  114.  
  115. let h = cpmRoot.querySelector('h3') || cpmRoot.querySelector('header')
  116. if (!h) return
  117.  
  118. let nav = document.createElement('nav')
  119.  
  120. let addedText = new Set()
  121. let lastText = null
  122.  
  123. for (const anchor of cpmRoot.querySelectorAll('li a[href]')) {
  124. let textContent = anchor.textContent.trim()
  125.  
  126. if (addedText.has(textContent)) {
  127. lastText = textContent
  128. continue
  129. }
  130.  
  131. let li = nav.appendChild(document.createElement('li'))
  132. li.appendChild(anchor)
  133.  
  134. addedText.add(textContent)
  135. }
  136.  
  137. if (lastText !== null) {
  138. nav.querySelectorAll('li').forEach(li => {
  139. if (li.querySelector('a').textContent.trim() === lastText) {
  140. li.remove()
  141. }
  142. })
  143. }
  144.  
  145. let tm = document.createElement('template')
  146. tm.innerHTML = `
  147. <li class="with-submenu" style="display: block;">
  148. <a href="#" onclick="return false">${namespace ? namespace : h.textContent}</a>
  149. <nav style="min-width: initial;">
  150. ${nav.innerHTML}
  151. </nav>
  152. </li>
  153. `.trim()
  154.  
  155. return tm.content
  156. }
  157.  
  158. function bufferToHex(buffer) {
  159. const byteArray = new Uint8Array(buffer)
  160. const len = byteArray.length
  161. const hexCodes = new Array(len * 2)
  162. const chars = '0123456789abcdef'
  163. for (let i = 0, j = 0; i < len; i++) {
  164. const byte = byteArray[i]
  165. hexCodes[j++] = chars[byte >> 4]
  166. hexCodes[j++] = chars[byte & 0x0F]
  167. }
  168. return hexCodes.join('')
  169. }
  170.  
  171. async function digestMessage(message) {
  172. const encoder = new TextEncoder('utf-8')
  173. const msgUint8 = encoder.encode(message)
  174. const hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8)
  175. return bufferToHex(hashBuffer)
  176. }
  177.  
  178. async function fetchHTML(href) {
  179. let response = await fetch(href, {
  180. method: 'GET',
  181. mode: 'same-origin',
  182. cache: 'force-cache',
  183. credentials: 'same-origin',
  184. redirect: 'follow',
  185. referrerPolicy: 'no-referrer'
  186. })
  187.  
  188. return response.text()
  189. }
  190.  
  191. async function addSectionsToNav() {
  192. let presetup = preSetup()
  193. if (!presetup) return
  194. const { pos } = presetup
  195.  
  196. let plink = document.querySelector('.user-profile-link')
  197. if (!plink) return
  198. let href = plink.querySelector('a[href*="/users/"]').href
  199. if (href.includes('/users/sign')) return
  200.  
  201. let dm = await digestMessage(href)
  202. const stKey = `gf_user_page_${dm}`
  203.  
  204. for (let trialN = 8; trialN--;) {
  205. let s = sessionStorage.getItem(stKey)
  206. let d = typeof s === 'string' ? parseInt(s) : 0
  207. if (d > 9 && Date.now() - d < 8000) await new Promise(r => setTimeout(r, 320))
  208. else break
  209. }
  210.  
  211. const userPageHTML = await fetchHTML(href)
  212. if (!userPageHTML || typeof userPageHTML !== 'string') return
  213.  
  214. sessionStorage.setItem(stKey, userPageHTML)
  215.  
  216. let template = document.createElement('template')
  217. template.innerHTML = userPageHTML
  218. const content = template.content
  219.  
  220.  
  221.  
  222. sections.forEach(({ id, name }) => {
  223. let section = content.querySelector(id)
  224. if (section) {
  225. const kc = setup({ cpmRoot: section, pos }, name)
  226. if (kc) {
  227. pos.parentNode.insertBefore(kc, pos.nextSibling)
  228. }
  229. }
  230. })
  231. }
  232.  
  233. if (!document.querySelector('.sign-out-link') || document.querySelector('.sign-in-link')) return
  234.  
  235. await addSectionsToNav()
  236. })()