Skip to content

Instantly share code, notes, and snippets.

@SheepTester
Created February 22, 2021 18:42
Show Gist options
  • Select an option

  • Save SheepTester/d137a3101f57d2a5d3f72a4c11de5d23 to your computer and use it in GitHub Desktop.

Select an option

Save SheepTester/d137a3101f57d2a5d3f72a4c11de5d23 to your computer and use it in GitHub Desktop.

I'm using the following localStorage extension:

importScripts('https://cdnjs.cloudflare.com/ajax/libs/localforage/1.7.3/localforage.min.js')

class LocalStorage {
  constructor () {}

  getInfo () {
    return {
      id: 'localstorage',
      name: 'LocalStorage',

      blocks: [
        {
          opcode: 'readLocalStorage',

          blockType: Scratch.BlockType.REPORTER,

          text: '[NAME]',
          arguments: {
            NAME: {
              type: Scratch.ArgumentType.STRING,
              defaultValue: 'highscore'
            }
          }
        },
        {
          opcode: 'setLocalStorage',

          blockType: Scratch.BlockType.COMMAND,

          text: 'set [NAME] to [VALUE]',
          arguments: {
            NAME: {
              type: Scratch.ArgumentType.STRING,
              defaultValue: 'highscore'
            },
            VALUE: {
              type: Scratch.ArgumentType.STRING,
              defaultValue: '12'
            }
          }
        }
      ]
    }
  }

  readLocalStorage ({ NAME }) {
    return localforage.getItem(NAME)
      .then(value => value || '')
  }

  setLocalStorage ({ NAME, VALUE }) {
    return localforage.setItem(NAME, VALUE)
  }
}

Scratch.extensions.register(new LocalStorage())

You can paste the following into the "Enter the URL of the extension" dialogue that pops up when you select "Choose an extension: For developers":

data:text/javascript;base64,aW1wb3J0U2NyaXB0cygnaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbG9jYWxmb3JhZ2UvMS43LjMvbG9jYWxmb3JhZ2UubWluLmpzJykNCg0KY2xhc3MgTG9jYWxTdG9yYWdlIHsNCiAgY29uc3RydWN0b3IgKCkge30NCg0KICBnZXRJbmZvICgpIHsNCiAgICByZXR1cm4gew0KICAgICAgaWQ6ICdsb2NhbHN0b3JhZ2UnLA0KICAgICAgbmFtZTogJ0xvY2FsU3RvcmFnZScsDQoNCiAgICAgIGJsb2NrczogWw0KICAgICAgICB7DQogICAgICAgICAgb3Bjb2RlOiAncmVhZExvY2FsU3RvcmFnZScsDQoNCiAgICAgICAgICBibG9ja1R5cGU6IFNjcmF0Y2guQmxvY2tUeXBlLlJFUE9SVEVSLA0KDQogICAgICAgICAgdGV4dDogJ1tOQU1FXScsDQogICAgICAgICAgYXJndW1lbnRzOiB7DQogICAgICAgICAgICBOQU1FOiB7DQogICAgICAgICAgICAgIHR5cGU6IFNjcmF0Y2guQXJndW1lbnRUeXBlLlNUUklORywNCiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnaGlnaHNjb3JlJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIG9wY29kZTogJ3NldExvY2FsU3RvcmFnZScsDQoNCiAgICAgICAgICBibG9ja1R5cGU6IFNjcmF0Y2guQmxvY2tUeXBlLkNPTU1BTkQsDQoNCiAgICAgICAgICB0ZXh0OiAnc2V0IFtOQU1FXSB0byBbVkFMVUVdJywNCiAgICAgICAgICBhcmd1bWVudHM6IHsNCiAgICAgICAgICAgIE5BTUU6IHsNCiAgICAgICAgICAgICAgdHlwZTogU2NyYXRjaC5Bcmd1bWVudFR5cGUuU1RSSU5HLA0KICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICdoaWdoc2NvcmUnDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgVkFMVUU6IHsNCiAgICAgICAgICAgICAgdHlwZTogU2NyYXRjaC5Bcmd1bWVudFR5cGUuU1RSSU5HLA0KICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcxMicNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIF0NCiAgICB9DQogIH0NCg0KICByZWFkTG9jYWxTdG9yYWdlICh7IE5BTUUgfSkgew0KICAgIHJldHVybiBsb2NhbGZvcmFnZS5nZXRJdGVtKE5BTUUpDQogICAgICAudGhlbih2YWx1ZSA9PiB2YWx1ZSB8fCAnJykNCiAgfQ0KDQogIHNldExvY2FsU3RvcmFnZSAoeyBOQU1FLCBWQUxVRSB9KSB7DQogICAgcmV0dXJuIGxvY2FsZm9yYWdlLnNldEl0ZW0oTkFNRSwgVkFMVUUpDQogIH0NCn0NCg0KU2NyYXRjaC5leHRlbnNpb25zLnJlZ2lzdGVyKG5ldyBMb2NhbFN0b3JhZ2UoKSkNCg==

Alternatively, you can URL settings editor (File > Change URL settings) to generate a URL like

https://sheeptester.github.io/scratch-gui/?extension=data%3Atext%2Fjavascript%3Bbase64%2CaW1wb3J0U2NyaXB0cygnaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbG9jYWxmb3JhZ2UvMS43LjMvbG9jYWxmb3JhZ2UubWluLmpzJykNCg0KY2xhc3MgTG9jYWxTdG9yYWdlIHsNCiAgY29uc3RydWN0b3IgKCkge30NCg0KICBnZXRJbmZvICgpIHsNCiAgICByZXR1cm4gew0KICAgICAgaWQ6ICdsb2NhbHN0b3JhZ2UnLA0KICAgICAgbmFtZTogJ0xvY2FsU3RvcmFnZScsDQoNCiAgICAgIGJsb2NrczogWw0KICAgICAgICB7DQogICAgICAgICAgb3Bjb2RlOiAncmVhZExvY2FsU3RvcmFnZScsDQoNCiAgICAgICAgICBibG9ja1R5cGU6IFNjcmF0Y2guQmxvY2tUeXBlLlJFUE9SVEVSLA0KDQogICAgICAgICAgdGV4dDogJ1tOQU1FXScsDQogICAgICAgICAgYXJndW1lbnRzOiB7DQogICAgICAgICAgICBOQU1FOiB7DQogICAgICAgICAgICAgIHR5cGU6IFNjcmF0Y2guQXJndW1lbnRUeXBlLlNUUklORywNCiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnaGlnaHNjb3JlJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIG9wY29kZTogJ3NldExvY2FsU3RvcmFnZScsDQoNCiAgICAgICAgICBibG9ja1R5cGU6IFNjcmF0Y2guQmxvY2tUeXBlLkNPTU1BTkQsDQoNCiAgICAgICAgICB0ZXh0OiAnc2V0IFtOQU1FXSB0byBbVkFMVUVdJywNCiAgICAgICAgICBhcmd1bWVudHM6IHsNCiAgICAgICAgICAgIE5BTUU6IHsNCiAgICAgICAgICAgICAgdHlwZTogU2NyYXRjaC5Bcmd1bWVudFR5cGUuU1RSSU5HLA0KICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICdoaWdoc2NvcmUnDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgVkFMVUU6IHsNCiAgICAgICAgICAgICAgdHlwZTogU2NyYXRjaC5Bcmd1bWVudFR5cGUuU1RSSU5HLA0KICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcxMicNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIF0NCiAgICB9DQogIH0NCg0KICByZWFkTG9jYWxTdG9yYWdlICh7IE5BTUUgfSkgew0KICAgIHJldHVybiBsb2NhbGZvcmFnZS5nZXRJdGVtKE5BTUUpDQogICAgICAudGhlbih2YWx1ZSA9PiB2YWx1ZSB8fCAnJykNCiAgfQ0KDQogIHNldExvY2FsU3RvcmFnZSAoeyBOQU1FLCBWQUxVRSB9KSB7DQogICAgcmV0dXJuIGxvY2FsZm9yYWdlLnNldEl0ZW0oTkFNRSwgVkFMVUUpDQogIH0NCn0NCg0KU2NyYXRjaC5leHRlbnNpb25zLnJlZ2lzdGVyKG5ldyBMb2NhbFN0b3JhZ2UoKSkNCg%3D%3D

If loading an extension this way doesn't work, there might have been an error, which will appear in the console. You can look up how to open the browser console

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment