aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRblSb <msrblsb@gmail.com>2022-03-15 06:51:53 +0300
committerRblSb <msrblsb@gmail.com>2022-03-15 06:51:53 +0300
commit79f3c34d24d6ae6aba17dd643726e20754140d80 (patch)
treed6b1d23bcfbdc023fc757f25b1b3fa085fd5e790 /src
parent692e4690abc2083d151c011a2df2976ecf6886cc (diff)
Update locked playlist restrictions
And add "toggleItemType" permission. Closes #36
Diffstat (limited to 'src')
-rw-r--r--src/Client.hx13
-rw-r--r--src/ClientTools.hx9
-rw-r--r--src/Types.hx1
-rw-r--r--src/client/Buttons.hx8
-rw-r--r--src/client/Main.hx13
-rw-r--r--src/client/Player.hx5
-rw-r--r--src/server/Main.hx17
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;
+ }
}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage