diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Types.hx | 1 | ||||
| -rw-r--r-- | src/client/Buttons.hx | 4 | ||||
| -rw-r--r-- | src/client/Main.hx | 40 | ||||
| -rw-r--r-- | src/client/Player.hx | 19 |
4 files changed, 51 insertions, 13 deletions
diff --git a/src/Types.hx b/src/Types.hx index 76e811b..4061b09 100644 --- a/src/Types.hx +++ b/src/Types.hx @@ -22,6 +22,7 @@ typedef Config = { serverChatHistory:Int, totalVideoLimit:Int, userVideoLimit:Int, + requestLeaderOnPause:Bool, localAdmins:Bool, templateUrl:String, youtubeApiKey:String, diff --git a/src/client/Buttons.hx b/src/client/Buttons.hx index 5eb1baf..cdc9780 100644 --- a/src/client/Buttons.hx +++ b/src/client/Buttons.hx @@ -270,7 +270,7 @@ class Buttons { case S: ge("#voteskip").onclick(); case C: ge("#getplaylist").onclick(); case F: ge("#fullscreenbtn").onclick(); - case L: ge("#leader_btn").onclick(); + case L: main.toggleLeader(); case P: if (!main.isLeader()) { JsApi.once(SetLeader, event -> { @@ -278,7 +278,7 @@ class Buttons { if (name == main.getName()) player.pause(); }); } - ge("#leader_btn").onclick(); + main.toggleLeader(); default: return; } e.preventDefault(); diff --git a/src/client/Main.hx b/src/client/Main.hx index d567d92..5c29d29 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -17,6 +17,8 @@ import Client.ClientData; import Types.VideoDataRequest; import Types.VideoData; import Types.Config; +import Types.Permission; +import Client.ClientGroup; import Types.WsEvent; using StringTools; using ClientTools; @@ -123,17 +125,7 @@ class Main { function initListeners():Void { Buttons.init(this); - ge("#leader_btn").onclick = e -> { - // change button style before answer - setLeaderButton(!personal.isLeader); - final name = personal.isLeader ? "" : personal.name; - send({ - type: SetLeader, - setLeader: { - clientName: name - } - }); - } + ge("#leader_btn").onclick = toggleLeader; final voteSkip = ge("#voteskip"); voteSkip.onclick = e -> { if (Utils.isTouch() && !window.confirm(Lang.get("skipItemConfirm"))) return; @@ -829,6 +821,32 @@ class Main { Settings.write(settings); } + public function hasPermission(group:ClientGroup, permission:Permission):Bool { + final id = group.getName().toLowerCase(); + final arr:Array<Permission> = Reflect.field(config.permissions, id); + return arr.contains(permission); + } + + public function toggleLeader():Void { + // change button style before answer + setLeaderButton(!personal.isLeader); + final name = personal.isLeader ? "" : personal.name; + send({ + type: SetLeader, + setLeader: { + clientName: name + } + }); + } + + public function hasLeader():Bool { + return clients.hasLeader(); + } + + public function hasLeaderOnPauseRequest():Bool { + return config.requestLeaderOnPause; + } + public function getTemplateUrl():String { return config.templateUrl; } diff --git a/src/client/Player.hx b/src/client/Player.hx index 8fe42b3..59ca11f 100644 --- a/src/client/Player.hx +++ b/src/client/Player.hx @@ -170,9 +170,28 @@ class Player { time: getTime() } }); + if (main.hasLeaderOnPauseRequest()) { + // do not remove leader if user cannot request it back + final group:Client.ClientGroup = main.isAdmin() ? Admin : User; + if (main.hasPermission(group, RequestLeaderPerm)) main.toggleLeader(); + } } public function onPause():Void { + if (main.hasLeaderOnPauseRequest() && !main.hasLeader()) { + JsApi.once(SetLeader, event -> { + final name = event.setLeader.clientName; + if (name != main.getName()) return; + main.send({ + type: Pause, pause: { + time: getTime() + } + }); + player.pause(); + }); + main.toggleLeader(); + return; + } if (!main.isLeader()) return; main.send({ type: Pause, pause: { |
