- // ==UserScript==
- // @name InstaSynchP Commands
- // @namespace InstaSynchP
- // @description Plugin for custom commands
-
- // @version 1.0.1
- // @author Zod-
- // @source https://github.com/Zod-/InstaSynchP-Commands
- // @license MIT
-
- // @include http://*.instasynch.com/*
- // @include http://instasynch.com/*
- // @include http://*.instasync.com/*
- // @include http://instasync.com/*
- // @grant none
- // @run-at document-start
-
- // @require https://greasyfork.org/scripts/5647-instasynchp-library/code/InstaSynchP%20Library.js
- // ==/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'},
- "'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 = 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);
- command.callback.apply(command.reference, data.arguments);
- });
- events.on(th, 'SendChat', function (message) {
- commands.execute.apply(commands, message.split(/\s/));
- });
-
- //load flood protect
- var oldsendcmd = window.global.sendcmd;
- window.global.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;
- //send and remove the last 4 commands
- for (i = 0; i < 4 && th.commandQueue.length > 0; i += 1) {
- 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.global.sendcmd();
- }, 1010);
- };
- };
-
- window.plugins = window.plugins || {};
- window.plugins.commands = new Commands('1.0.1');