Discord/Shapes - LocalStorage Import/Export

Script to export/import specific entries from localStorage

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