Discord/Shapes - LocalStorage Import/Export

Script to export/import specific entries from localStorage

当前为 2024-11-24 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Discord/Shapes - LocalStorage Import/Export
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.1
  5. // @description Script to export/import specific entries from localStorage
  6. // @author Vishanka
  7. // @match https://discord.com/channels/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. 'use strict';
  13.  
  14. // Create buttons to trigger export and import
  15. window.exportButton = document.createElement('div');
  16. exportButton.innerHTML = `
  17. <div style="display: flex; align-items: center; justify-content: center;">
  18. <button style="margin-top: 20px; margin-left: 4px; margin-right: 5px; padding: 7px 51px; font-size: 16px; cursor: pointer; background-color: transparent; color: #b0b0b0; border-radius: 8px; text-align: center; transition: background-color 0.1s, color 0.1s;">Export localStorage</button>
  19. </div>
  20. `;
  21.  
  22. exportButton.onmouseover = () => {
  23. exportButton.querySelector('button').style.backgroundColor = '#212121';
  24. exportButton.querySelector('button').style.color = '#ffffff';
  25. };
  26. exportButton.onmouseout = () => {
  27. exportButton.querySelector('button').style.backgroundColor = 'transparent';
  28. exportButton.querySelector('button').style.color = '#b0b0b0';
  29. };
  30. DCstoragePanel.appendChild(exportButton);
  31.  
  32. window.importButton = document.createElement('div');
  33. importButton.innerHTML = `
  34. <div style="display: flex; align-items: center; justify-content: center;">
  35. <button style="margin-top: 20px; margin-left: 4px; margin-right: 5px; padding: 7px 50px; font-size: 16px; cursor: pointer; background-color: transparent; color: #b0b0b0; border-radius: 8px; text-align: center; transition: background-color 0.1s, color 0.1s;">Import localStorage</button>
  36. </div>
  37. `;
  38.  
  39. importButton.onmouseover = () => {
  40. importButton.querySelector('button').style.backgroundColor = '#212121';
  41. importButton.querySelector('button').style.color = '#ffffff';
  42. };
  43. importButton.onmouseout = () => {
  44. importButton.querySelector('button').style.backgroundColor = 'transparent';
  45. importButton.querySelector('button').style.color = '#b0b0b0';
  46. };
  47. DCstoragePanel.appendChild(importButton);
  48.  
  49. // Export specific localStorage entries
  50. exportButton.addEventListener('click', () => {
  51. const filteredData = {};
  52. for (const key in localStorage) {
  53. if (localStorage.hasOwnProperty(key)) {
  54. if (key.startsWith('profile:') || key.includes('lorebook:') || key === 'selectedProfile') {
  55. filteredData[key] = localStorage.getItem(key);
  56. }
  57. }
  58. }
  59. const data = JSON.stringify(filteredData);
  60. const blob = new Blob([data], {type: 'application/json'});
  61. const url = URL.createObjectURL(blob);
  62.  
  63. const a = document.createElement('a');
  64. a.href = url;
  65. a.download = 'localStorage_filtered.json';
  66. document.body.appendChild(a);
  67. a.click();
  68. document.body.removeChild(a);
  69. });
  70.  
  71. // Import localStorage
  72. importButton.addEventListener('click', () => {
  73. const input = document.createElement('input');
  74. input.type = 'file';
  75. input.accept = 'application/json';
  76. input.addEventListener('change', (event) => {
  77. const file = event.target.files[0];
  78. if (!file) {
  79. return;
  80. }
  81.  
  82. const reader = new FileReader();
  83. reader.onload = (e) => {
  84. try {
  85. const importedData = JSON.parse(e.target.result);
  86. for (const key in importedData) {
  87. localStorage.setItem(key, importedData[key]);
  88. }
  89. alert('localStorage has been successfully imported.');
  90. } catch (err) {
  91. alert('Failed to import localStorage: ' + err.message);
  92. }
  93. };
  94. reader.readAsText(file);
  95. });
  96. input.click();
  97. });
  98. })();