diff options
| author | RblSb <msrblsb@gmail.com> | 2022-03-15 06:51:53 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2022-03-15 06:51:53 +0300 |
| commit | 79f3c34d24d6ae6aba17dd643726e20754140d80 (patch) | |
| tree | d6b1d23bcfbdc023fc757f25b1b3fa085fd5e790 /src | |
| parent | 692e4690abc2083d151c011a2df2976ecf6886cc (diff) | |
Update locked playlist restrictions
And add "toggleItemType" permission. Closes #36
Diffstat (limited to 'src')
| -rw-r--r-- | src/Client.hx | 13 | ||||
| -rw-r--r-- | src/ClientTools.hx | 9 | ||||
| -rw-r--r-- | src/Types.hx | 1 | ||||
| -rw-r--r-- | src/client/Buttons.hx | 8 | ||||
| -rw-r--r-- | src/client/Main.hx | 13 | ||||
| -rw-r--r-- | src/client/Player.hx | 5 | ||||
| -rw-r--r-- | src/server/Main.hx | 17 |
7 files changed, 42 insertions, 24 deletions
diff --git a/src/Client.hx b/src/Client.hx index ae35ef4..64d7e54 100644 --- a/src/Client.hx +++ b/src/Client.hx @@ -1,10 +1,12 @@ package; +import Types.Permission; +import Types.Permissions; +import haxe.EnumFlags; #if nodejs import js.node.http.IncomingMessage; import js.npm.ws.WebSocket; #end -import haxe.EnumFlags; enum ClientGroup { Banned; @@ -47,6 +49,15 @@ class Client { } #end + public function hasPermission(permission:Permission, permissions:Permissions):Bool { + final p = permissions; + if (isBanned) return p.banned.contains(permission); + if (isAdmin) return p.admin.contains(permission); + if (isLeader) return p.leader.contains(permission); + if (isUser) return p.user.contains(permission); + return p.guest.contains(permission); + } + inline function get_isBanned():Bool { return group.has(Banned); } diff --git a/src/ClientTools.hx b/src/ClientTools.hx index c5053f1..46400f7 100644 --- a/src/ClientTools.hx +++ b/src/ClientTools.hx @@ -26,13 +26,4 @@ class ClientTools { } return def; } - - public static function hasPermission(client:Client, permission:Permission, permissions:Permissions):Bool { - final p = permissions; - if (client.isBanned) return p.banned.contains(permission); - if (client.isAdmin) return p.admin.contains(permission); - if (client.isLeader) return p.leader.contains(permission); - if (client.isUser) return p.user.contains(permission); - return p.guest.contains(permission); - } } diff --git a/src/Types.hx b/src/Types.hx index d31196d..61a1ab1 100644 --- a/src/Types.hx +++ b/src/Types.hx @@ -57,6 +57,7 @@ enum abstract Permission(String) { var ClearChatPerm = "clearChat"; var SetLeaderPerm = "setLeader"; var ChangeOrderPerm = "changeOrder"; + var ToggleItemTypePerm = "toggleItemType"; var LockPlaylistPerm = "lockPlaylist"; var BanClientPerm = "banClient"; } diff --git a/src/client/Buttons.hx b/src/client/Buttons.hx index 902da1b..aa7e1cc 100644 --- a/src/client/Buttons.hx +++ b/src/client/Buttons.hx @@ -144,7 +144,13 @@ class Buttons { final lockPlaylist = ge("#lockplaylist"); lockPlaylist.onclick = e -> { - if (main.isAdmin()) main.send({type: TogglePlaylistLock}); + if (!main.hasPermission(LockPlaylistPerm)) return; + if (main.isPlaylistOpen) { + if (!window.confirm(Lang.get("lockPlaylistConfirm"))) return; + } + main.send({ + type: TogglePlaylistLock + }); } final showMediaUrl = ge("#showmediaurl"); diff --git a/src/client/Main.hx b/src/client/Main.hx index b3eaea9..fad4e4f 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -1,7 +1,6 @@ package client; import Client.ClientData; -import Client.ClientGroup; import Types.Config; import Types.Permission; import Types.VideoData; @@ -33,6 +32,7 @@ class Main { public var forceSyncNextTick = false; public final host:String; public var globalIp(default, null) = ""; + public var isPlaylistOpen = true; final clients:Array<Client> = []; var pageTitle = document.title; @@ -192,6 +192,10 @@ class Main { return personal.name; } + public function hasPermission(permission:Permission):Bool { + return personal.hasPermission(permission, config.permissions); + } + final mask = ~/\${([0-9]+)-([0-9]+)}/g; function handleUrlMasks(links:Array<String>):Void { @@ -959,6 +963,7 @@ class Main { } function setPlaylistLock(isOpen:Bool):Void { + isPlaylistOpen = isOpen; final lockPlaylist = ge("#lockplaylist"); final icon = lockPlaylist.firstElementChild; if (isOpen) { @@ -984,12 +989,6 @@ 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); diff --git a/src/client/Player.hx b/src/client/Player.hx index a147e6a..1979091 100644 --- a/src/client/Player.hx +++ b/src/client/Player.hx @@ -82,7 +82,7 @@ class Player { public function toggleItemType(pos:Int):Void { videoList.toggleItemType(pos); final el = videoItemsEl.children[pos]; - setItemElementType(el, videoList.getItem(videoList.pos).isTemp); + setItemElementType(el, videoList.getItem(pos).isTemp); } function setPlayer(newPlayer:IPlayer):Void { @@ -174,8 +174,7 @@ class Player { final hasAutoPause = main.hasLeaderOnPauseRequest() && videoList.length > 0; if (hasAutoPause) { // 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(); + if (main.hasPermission(RequestLeaderPerm)) main.toggleLeader(); } } diff --git a/src/server/Main.hx b/src/server/Main.hx index bef889a..e9f6e21 100644 --- a/src/server/Main.hx +++ b/src/server/Main.hx @@ -568,10 +568,8 @@ class Main { case ServerMessage: case AddVideo: + if (isPlaylistLockedFor(client)) return; if (!checkPermission(client, AddVideoPerm)) return; - if (!videoList.isOpen) { - if (!checkPermission(client, LockPlaylistPerm)) return; - } if (config.totalVideoLimit != 0 && videoList.length >= config.totalVideoLimit) { serverMessage(client, "totalVideoLimitError"); return; @@ -604,6 +602,7 @@ class Main { prepareVideoPlayback(); case RemoveVideo: + if (isPlaylistLockedFor(client)) return; if (!checkPermission(client, RemoveVideoPerm)) return; if (videoList.length == 0) return; final url = data.removeVideo.url; @@ -757,6 +756,7 @@ class Main { broadcast(data); case SetNextItem: + if (isPlaylistLockedFor(client)) return; if (!checkPermission(client, ChangeOrderPerm)) return; final pos = data.setNextItem.pos; if (pos == videoList.pos || pos == videoList.pos + 1) return; @@ -764,6 +764,8 @@ class Main { broadcast(data); case ToggleItemType: + if (isPlaylistLockedFor(client)) return; + if (!checkPermission(client, ToggleItemTypePerm)) return; final pos = data.toggleItemType.pos; videoList.toggleItemType(pos); broadcast(data); @@ -774,12 +776,14 @@ class Main { broadcast(data); case ClearPlaylist: + if (isPlaylistLockedFor(client)) return; if (!checkPermission(client, RemoveVideoPerm)) return; videoTimer.stop(); videoList.clear(); broadcast(data); case ShufflePlaylist: + if (isPlaylistLockedFor(client)) return; if (!checkPermission(client, ChangeOrderPerm)) return; if (videoList.length == 0) return; videoList.shuffle(); @@ -976,4 +980,11 @@ class Main { videoTimer.setTime(flashbackTime); flashbackTime = time; } + + function isPlaylistLockedFor(client:Client):Bool { + if (!videoList.isOpen) { + if (!checkPermission(client, LockPlaylistPerm)) return true; + } + return false; + } } |
