// ==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://gf.qytechs.cn/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');