From 80ec4ba1747d22ec136a95d6b35ba6289e15e8ad Mon Sep 17 00:00:00 2001 From: RblSb Date: Sat, 6 Jun 2020 14:31:43 +0300 Subject: Once events api, improve pause hotkey --- res/client.js | 27 +++++++++++++++++++++++---- src/client/Buttons.hx | 5 ++++- src/client/JsApi.hx | 22 ++++++++++++++++++++++ src/client/Main.hx | 5 +++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/res/client.js b/res/client.js index b210307..2c2a507 100644 --- a/res/client.js +++ b/res/client.js @@ -685,9 +685,11 @@ client_Buttons.initHotkeys = function(main,player) { break; case 80: if(!((main.personal.group & 2) != 0)) { - haxe_Timer.delay(function() { - player.pause(); - },500); + client_JsApi.once("SetLeader",function(event) { + if(event.setLeader.clientName == main.personal.name) { + player.pause(); + } + }); } window.document.querySelector("#leader_btn").onclick(); break; @@ -868,6 +870,21 @@ client_JsApi.forceSyncNextTick = $hx_exports["client"]["JsApi"]["forceSyncNextTi client_JsApi.setVideoSrc = $hx_exports["client"]["JsApi"]["setVideoSrc"] = function(src) { client_JsApi.player.changeVideoSrc(src); }; +client_JsApi.once = $hx_exports["client"]["JsApi"]["once"] = function(type,func) { + client_JsApi.onceListeners.push({ type : type, func : func}); +}; +client_JsApi.fireOnceEvent = function(event) { + var i = 0; + while(i < client_JsApi.onceListeners.length) { + var listener = client_JsApi.onceListeners[i]; + if(listener.type == event.type) { + listener.func(event); + HxOverrides.remove(client_JsApi.onceListeners,listener); + continue; + } + ++i; + } +}; client_JsApi.notifyOnVideoChange = $hx_exports["client"]["JsApi"]["notifyOnVideoChange"] = function(func) { client_JsApi.videoChange.push(func); }; @@ -1167,8 +1184,9 @@ client_Main.prototype = { var data = JSON.parse(e.data); if(this.config != null && this.config.isVerbose) { var t = data.type; - haxe_Log.trace("Event: " + data.type,{ fileName : "src/client/Main.hx", lineNumber : 326, className : "client.Main", methodName : "onMessage", customParams : [Reflect.field(data,t.charAt(0).toLowerCase() + HxOverrides.substr(t,1,null))]}); + haxe_Log.trace("Event: " + data.type,{ fileName : "src/client/Main.hx", lineNumber : 330, className : "client.Main", methodName : "onMessage", customParams : [Reflect.field(data,t.charAt(0).toLowerCase() + HxOverrides.substr(t,1,null))]}); } + client_JsApi.fireOnceEvent(data); switch(data.type) { case "AddVideo": this.player.addVideoItem(data.addVideo.item,data.addVideo.atEnd); @@ -3362,6 +3380,7 @@ Lang.ids = ["en","ru"]; Lang.lang = HxOverrides.substr($global.navigator.language,0,2).toLowerCase(); client_JsApi.videoChange = []; client_JsApi.videoRemove = []; +client_JsApi.onceListeners = []; client_Settings.isSupported = false; js_youtube_Youtube.isLoadedAPI = false; client_Main.main(); diff --git a/src/client/Buttons.hx b/src/client/Buttons.hx index 771f827..5eb1baf 100644 --- a/src/client/Buttons.hx +++ b/src/client/Buttons.hx @@ -273,7 +273,10 @@ class Buttons { case L: ge("#leader_btn").onclick(); case P: if (!main.isLeader()) { - Timer.delay(() -> player.pause(), 500); + JsApi.once(SetLeader, event -> { + final name = event.setLeader.clientName; + if (name == main.getName()) player.pause(); + }); } ge("#leader_btn").onclick(); default: return; diff --git a/src/client/JsApi.hx b/src/client/JsApi.hx index 7528f42..66d0516 100644 --- a/src/client/JsApi.hx +++ b/src/client/JsApi.hx @@ -1,11 +1,14 @@ package client; +import Types.WsEventType; +import Types.WsEvent; import Types.VideoItem; import js.Browser.document; import js.Browser.window; import js.Syntax; private typedef VideoChangeFunc = (item:VideoItem)->Void; +private typedef OnceEventFunc = (event:WsEvent)->Void; class JsApi { @@ -13,6 +16,7 @@ class JsApi { static var player:Player; static final videoChange:Array = []; static final videoRemove:Array = []; + static final onceListeners:Array<{type:WsEventType, func:OnceEventFunc}> = []; public static function init(main:Main, player:Player):Void { JsApi.main = main; @@ -84,6 +88,24 @@ class JsApi { player.changeVideoSrc(src); } + @:expose + public static function once(type:WsEventType, func:OnceEventFunc):Void { + onceListeners.push({type: type, func: func}); + } + + public static function fireOnceEvent(event:WsEvent):Void { + var i = 0; + while (i < onceListeners.length) { + final listener = onceListeners[i]; + if (listener.type == event.type) { + listener.func(event); + onceListeners.remove(listener); + continue; + } + i++; + } + } + @:expose static function notifyOnVideoChange(func:VideoChangeFunc):Void { videoChange.push(func); diff --git a/src/client/Main.hx b/src/client/Main.hx index 0f6b31e..1cf4b04 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -178,6 +178,10 @@ class Main { return personal.isAdmin; } + public inline function getName():String { + return personal.name; + } + final mask = ~/\${([0-9]+)-([0-9]+)}/g; function handleUrlMasks(links:Array):Void { @@ -325,6 +329,7 @@ class Main { final t = t.charAt(0).toLowerCase() + t.substr(1); trace('Event: ${data.type}', Reflect.field(data, t)); } + JsApi.fireOnceEvent(data); switch (data.type) { case Connected: onConnected(data); -- cgit v1.2.3