Greasy Fork 还支持 简体中文。

InstaSynchP Event Hooks

Add hooks to the events on the InstaSynch page

目前為 2014-11-26 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name InstaSynchP Event Hooks
  3. // @namespace InstaSynchP
  4. // @description Add hooks to the events on the InstaSynch page
  5.  
  6. // @version 1.1.1
  7. // @author Zod-
  8. // @source https://github.com/Zod-/InstaSynchP-Event-Hooks
  9. // @license MIT
  10.  
  11. // @include http://*.instasynch.com/*
  12. // @include http://instasynch.com/*
  13. // @include http://*.instasync.com/*
  14. // @include http://instasync.com/*
  15. // @grant none
  16. // @run-at document-start
  17.  
  18. // @require https://greasyfork.org/scripts/2857-jquery-bind-first/code/jquerybind-first.js?version=26080
  19. // @require https://greasyfork.org/scripts/5647-instasynchp-library/code/InstaSynchP%20Library.js
  20. // ==/UserScript==
  21.  
  22. function EventHooks(version) {
  23. "use strict";
  24. this.version = version;
  25. this.name = 'InstaSynchP Event Hooks';
  26. this.resetVariables();
  27. }
  28.  
  29. EventHooks.prototype.executeOnceCore = function () {
  30. "use strict";
  31. var th = this,
  32. oldLinkify = window.linkify,
  33. hooks = {
  34. 'onConnecting':{'location':'global','name':'Connecting'},
  35. 'onConnected':{'location':'global','name':'Connected'},
  36. 'onJoining':{'location':'global','name':'Joining'},
  37. 'onJoined':{'location':'global','name':'Joined'},
  38. 'onReconnecting':{'location':'global','name':'Reconnecting'},
  39. 'onReconnect':{'location':'global','name':'Reconnect'},
  40. 'reconnectFailed':{'location':'global','name':'ReconnectFailed'},
  41. 'onError':{'location':'global','name':'Error'},
  42. 'onDisconnect':{'location':'global','name':'Disconnect'},
  43. 'requestPartialPage':{'location':'global','name':'RequestPartialPage'},
  44. 'loadRoomObj':{'location':'global','name':'LoadRoom'},
  45. 'addMessage':{'name':'AddMessage'},
  46. 'addUser':{'name':'AddUser'},
  47. 'removeUser':{'name':'RemoveUser'},
  48. 'makeLeader':{'name':'MakeLeader'},
  49. 'renameUser':{'name':'RenameUser'},
  50. 'addVideo':{'name':'AddVideo'},
  51. 'removeVideo':{'name':'RemoveVideo'},
  52. 'moveVideo':{'name':'MoveVideo'},
  53. 'playVideo':{'name':'PlayVideo'},
  54. 'resume':{'name':'Resume'},
  55. 'pause':{'name':'Pause'},
  56. 'seekTo':{'name':'SeekTo'},
  57. 'purge':{'name':'Purge'},
  58. 'skips':{'name':'Skips'},
  59. 'loadPlaylist':{'name':'LoadPlaylist'},
  60. 'loadUserlist':{'name':'LoadUserlist'},
  61. 'createPoll':{'name':'CreatePoll'},
  62. 'addPollVote':{'name':'AddPollVote'},
  63. 'removePollVote':{'name':'RemovePollVote'},
  64. 'endPoll':{'name':'EndPoll'}
  65. };
  66.  
  67. window.linkify = function (str, buildHashtagUrl, includeW3, target) {
  68. var tags = [],
  69. index = -1;
  70. //remove image urls so they wont get linkified
  71. str = str.replace(/(src|href)=\"([^\"]*)\"/gi, function ($0, $1, $2) {
  72. tags.push({
  73. 'tagName': $1,
  74. 'url': $2
  75. });
  76. return '{0}=\"\"'.format($1);
  77. });
  78. str = oldLinkify(str, buildHashtagUrl, includeW3, target);
  79. //put them back in
  80. str = str.replace(/(src|href)=\"\"/gi, function () {
  81. index += 1;
  82. return '{0}="{1}"'.format(tags[index].tagName, tags[index].url);
  83. });
  84. return str;
  85. };
  86.  
  87. function countUser(user, neg) {
  88. var inc = (typeof neg === 'boolean' && neg) ? -1 : 1;
  89. if (user.permissions > 0) {
  90. th.mods += inc;
  91. }
  92. if (user.loggedin) {
  93. th.blacknames += inc;
  94. } else {
  95. th.greynames += inc;
  96. }
  97. }
  98.  
  99. function subtractUser(user) {
  100. countUser(user, true);
  101. }
  102.  
  103. function createHookFunction(ev) {
  104. function defaultFunction() {
  105. events.fire(ev.name, arguments, true);
  106. ev.old.apply(undefined, arguments);
  107. events.fire(ev.name, arguments, false);
  108. }
  109. //custom hooks
  110. switch (ev.name) {
  111. case 'AddUser':
  112. return function () {
  113. countUser(arguments[0]);
  114. defaultFunction.apply(undefined, arguments);
  115. };
  116. case 'RemoveUser':
  117. return function () {
  118. var args = [].slice.call(arguments),
  119. user = findUserId(args[0]);
  120. args.push(user);
  121. subtractUser(user);
  122. defaultFunction.apply(undefined, args);
  123. };
  124. case 'RenameUser':
  125. return function () {
  126. var args = [].slice.call(arguments),
  127. user = findUserId(args[0]);
  128. args.push(user);
  129. subtractUser(user);
  130. defaultFunction.apply(undefined, args);
  131. };
  132. case 'RemoveVideo':
  133. return function () {
  134. var indexOfVid = window.getVideoIndex(arguments[0]),
  135. video = window.playlist[indexOfVid],
  136. args = [].slice.call(arguments);
  137. args.push(video);
  138. args.push(indexOfVid);
  139. defaultFunction.apply(undefined, args);
  140. };
  141. case 'MoveVideo':
  142. return function () {
  143. var args = [].slice.call(arguments),
  144. oldPosition = window.getVideoIndex(args[0]),
  145. video = window.playlist[oldPosition];
  146. args.push(oldPosition);
  147. args.push(video);
  148. defaultFunction.apply(undefined, args);
  149. };
  150. case 'Skips':
  151. return function () {
  152. var args = [].slice.call(arguments);
  153. args.push((args[1] / th.blacknames) * 100); //skip percentage
  154. defaultFunction.apply(undefined, args);
  155. };
  156. }
  157. return defaultFunction;
  158. }
  159. for (var hook in hooks) {
  160. if (hooks.hasOwnProperty(hook)) {
  161. var ev = hooks[hook];
  162. if (ev.location && ev.location === 'global') {
  163. ev.old = window.global[hook];
  164. window.global[hook] = createHookFunction(ev);
  165. } else {
  166. ev.old = window[hook];
  167. window[hook] = createHookFunction(ev);
  168. }
  169. }
  170. }
  171.  
  172. window.addEventListener("message", function (event) {
  173. try {
  174. var parsed = JSON.parse(event.data);
  175. if (parsed.action) {
  176. //own events
  177. events.fire(parsed.action, [parsed.data], false);
  178. }
  179. //all
  180. events.fire('PageMessage', [parsed], false);
  181. } catch (ignore) {}
  182. }, false);
  183.  
  184. //get user count when already connected
  185. if (window.plugins.core.connected) {
  186. window.users.forEach(countUser);
  187. }
  188. };
  189.  
  190. EventHooks.prototype.preConnect = function () {
  191. "use strict";
  192. var oldPlayerDestroy = window.video.destroy;
  193. window.video.destroy = function () {
  194. events.fire('PlayerDestroy', [], true);
  195. oldPlayerDestroy();
  196. events.fire('PlayerDestroy', [], false);
  197. };
  198. $("#chat input").bindFirst('keypress', function (event) {
  199. events.fire('InputKeypress[{0}]'.format(event.keyCode), [event, $("#chat input").val()], false);
  200. events.fire('InputKeypress', [event, $("#chat input").val()], false);
  201. if (event.keyCode === 13 && $("#chat input").val() !== '') {
  202. events.fire('SendChat', [$("#chat input").val()], false);
  203. }
  204. });
  205. $("#chat input").bindFirst('keydown', function (event) {
  206. events.fire('InputKeydown[{0}]'.format(event.keyCode), [event, $("#chat input").val()], false);
  207. events.fire('InputKeydown', [event, $("#chat input").val()], false);
  208. });
  209. $("#chat input").bindFirst('keyup', function (event) {
  210. events.fire('InputKeyup[{0}]'.format(event.keyCode), [event, $("#chat input").val()], false);
  211. events.fire('InputKeyup', [event, $("#chat input").val()], false);
  212. });
  213. };
  214.  
  215. EventHooks.prototype.resetVariables = function () {
  216. "use strict";
  217. this.mods = 0;
  218. this.blacknames = 0;
  219. this.greynames = 0;
  220. };
  221.  
  222. window.plugins = window.plugins || {};
  223. window.plugins.eventHooks = new EventHooks('1.1.1');