InstaSynchP Commands

Plugin for custom commands

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name        InstaSynchP Commands
// @namespace   InstaSynchP
// @description Plugin for custom commands

// @version     1.0.3
// @author      Zod-
// @source      https://github.com/Zod-/InstaSynchP-Commands
// @license     MIT

// @include     *://instasync.com/r/*
// @include     *://*.instasync.com/r/*
// @grant       none
// @run-at      document-start

// @require     https://greasyfork.org/scripts/5647-instasynchp-library/code/InstaSynchP%20Library.js?version=49210
// ==/UserScript==

function Commands(version) {
  "use strict";
  this.version = version;
  this.name = "InstaSynchP Commands";
  this.commandMap = {};
  this.sendcmdReady = true;
  this.commandQueue = [];
}

Commands.prototype.executeOnceCore = function () {
  "use strict";
  var th = this;
  window.commands = {
    //add a command
    bind: function (commands) {
      if (typeof commands === 'undefined') {
        return;
      }

      for (var command in commands) {
        if (commands.hasOwnProperty(command)) {
          commands[command].name = command;
          th.commandMap[command.toLowerCase()] = commands[command];
        }
      }
    },
    //get the commands
    get: function (key) {
      return th.commandMap[key.toLowerCase()];
    },
    //get all commands
    getAll: function () {
      return th.commandMap;
    },
    //execute a command
    execute: function () {
      if (th.commandMap.hasOwnProperty(arguments[0].toLowerCase())) {
        //send the event to the site
        window.postMessage(JSON.stringify({
          action: 'ExecuteCommand',
          data: {
            //turn arguments to array
            'arguments': [].slice.call(arguments)
          }
        }), "*");
      }
    }
  };

  /*{
      "'command": {
          'hasArguments':true,
          'type':'mod',
          'reference': this
          'description':'description',
          'callback': function(){
          }
      }
  }*/

  var defaultCommands = {
    "'resynch": {},
    "'toggleFilter": {},
    "'toggleAutosynch": {},
    "'togglePlaylistLock": {
      'type': 'mod'
    },
    "'kick": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'ban": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'unban": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'clean": {
      'type': 'mod'
    },
    "'remove": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'purge": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'move": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'play": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'shuffle": {
      'hasArguments': true,
      'type': 'mod',
      'callback': function (){
        sendcmd('shuffle');
      }
    },
    "'pause": {
      'type': 'mod'
    },
    "'resume": {
      'type': 'mod'
    },
    "'seekto": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'seekfrom": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'setskip": {
      'hasArguments': true,
      'type': 'mod'
    },
    "'banlist": {
      'type': 'mod'
    },
    "'modlist": {
      'type': 'mod'
    },
    "'leaverban": {
      'hasArguments': true,
      'type': 'mod'
    },
    //commented those so you can't accidently use them
    //"'clearbans",
    //"'motd ",
    //"'mod ",
    //"'demod ",
    //"'description ",
    "'next": {
      'type': 'mod'
    }
  };

  function empty() {
      return undefined;
    }
    //prepare default commands
  for (var command in defaultCommands) {
    if (defaultCommands.hasOwnProperty(command)) {
      defaultCommands[command].description = 'http://instasynch.com/help.php#commands';
      defaultCommands[command].callback = defaultCommands[command].callback || empty;

      if (!defaultCommands[command].type) {
        defaultCommands[command].type = 'regular';
      }
    }
  }
  //bind them
  commands.bind(defaultCommands);

  //commands gets executed by posting a message to the site and catching it
  //in the script scope
  events.on(th, 'ExecuteCommand', function (data) {
    var command = th.commandMap[data.arguments[0].toLowerCase()],
      opts = {
        usernames: [],
        videos: [],
        numbers: []
      },
      i,
      videoInfo;
    for (i = 1; i < data.arguments.length; i += 1) {
      videoInfo = urlParser.parse(data.arguments[i]);
      if (videoInfo) {
        opts.videos.push(videoInfo);
      }
      if (isBlackname(data.arguments[i])) {
        opts.usernames.push(data.arguments[i]);
      }
      if (data.arguments[i] !== '' && !isNaN(data.arguments[i])) {
        opts.numbers.push(Number(data.arguments[i]));
      }
    }
    data.arguments.splice(0, 1, opts);
    logger().debug(th.name, "Calling command", JSON.stringify(data.arguments));
    command.callback.apply(command.reference, data.arguments);
  });
  events.on(th, 'SendChat', function (message) {
    commands.execute.apply(commands, message.split(/\s/));
  });

  //flood protect
  var oldsendcmd = window.room.sendcmd;
  window.room.sendcmd = function (command, data) {
    var i;
    if (command) {
      //add the command to the cache
      th.commandQueue.push({
        command: command,
        data: data
      });
    }

    //early return if we can't send anything
    if (!th.sendcmdReady || th.commandQueue.length === 0) {
      return;
    }

    //set not ready
    th.sendcmdReady = false;
    oldsendcmd(th.commandQueue[0].command, th.commandQueue[0].data);
    th.commandQueue.splice(0, 1);
    //after a second send the next ones
    setTimeout(function () {
      th.sendcmdReady = true;
      window.room.sendcmd();
    }, 275);
  };
};

window.plugins = window.plugins || {};
window.plugins.commands = new Commands('1.0.3');