您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add hooks to the events on the InstaSynch page
当前为
// ==UserScript== // @name InstaSynchP Event Hooks // @namespace InstaSynchP // @description Add hooks to the events on the InstaSynch page // @version 1.1.1 // @author Zod- // @source https://github.com/Zod-/InstaSynchP-Event-Hooks // @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/2857-jquery-bind-first/code/jquerybind-first.js?version=26080 // @require https://greasyfork.org/scripts/5647-instasynchp-library/code/InstaSynchP%20Library.js // ==/UserScript== function EventHooks(version) { "use strict"; this.version = version; this.name = 'InstaSynchP Event Hooks'; this.resetVariables(); } EventHooks.prototype.executeOnceCore = function () { "use strict"; var th = this, oldLinkify = window.linkify, hooks = { 'onConnecting':{'location':'global','name':'Connecting'}, 'onConnected':{'location':'global','name':'Connected'}, 'onJoining':{'location':'global','name':'Joining'}, 'onJoined':{'location':'global','name':'Joined'}, 'onReconnecting':{'location':'global','name':'Reconnecting'}, 'onReconnect':{'location':'global','name':'Reconnect'}, 'reconnectFailed':{'location':'global','name':'ReconnectFailed'}, 'onError':{'location':'global','name':'Error'}, 'onDisconnect':{'location':'global','name':'Disconnect'}, 'requestPartialPage':{'location':'global','name':'RequestPartialPage'}, 'loadRoomObj':{'location':'global','name':'LoadRoom'}, 'addMessage':{'name':'AddMessage'}, 'addUser':{'name':'AddUser'}, 'removeUser':{'name':'RemoveUser'}, 'makeLeader':{'name':'MakeLeader'}, 'renameUser':{'name':'RenameUser'}, 'addVideo':{'name':'AddVideo'}, 'removeVideo':{'name':'RemoveVideo'}, 'moveVideo':{'name':'MoveVideo'}, 'playVideo':{'name':'PlayVideo'}, 'resume':{'name':'Resume'}, 'pause':{'name':'Pause'}, 'seekTo':{'name':'SeekTo'}, 'purge':{'name':'Purge'}, 'skips':{'name':'Skips'}, 'loadPlaylist':{'name':'LoadPlaylist'}, 'loadUserlist':{'name':'LoadUserlist'}, 'createPoll':{'name':'CreatePoll'}, 'addPollVote':{'name':'AddPollVote'}, 'removePollVote':{'name':'RemovePollVote'}, 'endPoll':{'name':'EndPoll'} }; window.linkify = function (str, buildHashtagUrl, includeW3, target) { var tags = [], index = -1; //remove image urls so they wont get linkified str = str.replace(/(src|href)=\"([^\"]*)\"/gi, function ($0, $1, $2) { tags.push({ 'tagName': $1, 'url': $2 }); return '{0}=\"\"'.format($1); }); str = oldLinkify(str, buildHashtagUrl, includeW3, target); //put them back in str = str.replace(/(src|href)=\"\"/gi, function () { index += 1; return '{0}="{1}"'.format(tags[index].tagName, tags[index].url); }); return str; }; function countUser(user, neg) { var inc = (typeof neg === 'boolean' && neg) ? -1 : 1; if (user.permissions > 0) { th.mods += inc; } if (user.loggedin) { th.blacknames += inc; } else { th.greynames += inc; } } function subtractUser(user) { countUser(user, true); } function createHookFunction(ev) { function defaultFunction() { events.fire(ev.name, arguments, true); ev.old.apply(undefined, arguments); events.fire(ev.name, arguments, false); } //custom hooks switch (ev.name) { case 'AddUser': return function () { countUser(arguments[0]); defaultFunction.apply(undefined, arguments); }; case 'RemoveUser': return function () { var args = [].slice.call(arguments), user = findUserId(args[0]); args.push(user); subtractUser(user); defaultFunction.apply(undefined, args); }; case 'RenameUser': return function () { var args = [].slice.call(arguments), user = findUserId(args[0]); args.push(user); subtractUser(user); defaultFunction.apply(undefined, args); }; case 'RemoveVideo': return function () { var indexOfVid = window.getVideoIndex(arguments[0]), video = window.playlist[indexOfVid], args = [].slice.call(arguments); args.push(video); args.push(indexOfVid); defaultFunction.apply(undefined, args); }; case 'MoveVideo': return function () { var args = [].slice.call(arguments), oldPosition = window.getVideoIndex(args[0]), video = window.playlist[oldPosition]; args.push(oldPosition); args.push(video); defaultFunction.apply(undefined, args); }; case 'Skips': return function () { var args = [].slice.call(arguments); args.push((args[1] / th.blacknames) * 100); //skip percentage defaultFunction.apply(undefined, args); }; } return defaultFunction; } for (var hook in hooks) { if (hooks.hasOwnProperty(hook)) { var ev = hooks[hook]; if (ev.location && ev.location === 'global') { ev.old = window.global[hook]; window.global[hook] = createHookFunction(ev); } else { ev.old = window[hook]; window[hook] = createHookFunction(ev); } } } window.addEventListener("message", function (event) { try { var parsed = JSON.parse(event.data); if (parsed.action) { //own events events.fire(parsed.action, [parsed.data], false); } //all events.fire('PageMessage', [parsed], false); } catch (ignore) {} }, false); //get user count when already connected if (window.plugins.core.connected) { window.users.forEach(countUser); } }; EventHooks.prototype.preConnect = function () { "use strict"; var oldPlayerDestroy = window.video.destroy; window.video.destroy = function () { events.fire('PlayerDestroy', [], true); oldPlayerDestroy(); events.fire('PlayerDestroy', [], false); }; $("#chat input").bindFirst('keypress', function (event) { events.fire('InputKeypress[{0}]'.format(event.keyCode), [event, $("#chat input").val()], false); events.fire('InputKeypress', [event, $("#chat input").val()], false); if (event.keyCode === 13 && $("#chat input").val() !== '') { events.fire('SendChat', [$("#chat input").val()], false); } }); $("#chat input").bindFirst('keydown', function (event) { events.fire('InputKeydown[{0}]'.format(event.keyCode), [event, $("#chat input").val()], false); events.fire('InputKeydown', [event, $("#chat input").val()], false); }); $("#chat input").bindFirst('keyup', function (event) { events.fire('InputKeyup[{0}]'.format(event.keyCode), [event, $("#chat input").val()], false); events.fire('InputKeyup', [event, $("#chat input").val()], false); }); }; EventHooks.prototype.resetVariables = function () { "use strict"; this.mods = 0; this.blacknames = 0; this.greynames = 0; }; window.plugins = window.plugins || {}; window.plugins.eventHooks = new EventHooks('1.1.1');