diff options
| author | RblSb <msrblsb@gmail.com> | 2020-03-04 20:41:43 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2020-03-04 20:41:43 +0300 |
| commit | 6e28381de77265f8b6a24cdd9c583d1d27d8d7b2 (patch) | |
| tree | 4a960040204580999774bfffea23634c19d02c9c /src | |
| parent | 4155b95cce55e1176aecb1531b9c06344a2e81b5 (diff) | |
Playlist config limits
Diffstat (limited to 'src')
| -rw-r--r-- | src/Types.hx | 7 | ||||
| -rw-r--r-- | src/VideoList.hx | 6 | ||||
| -rw-r--r-- | src/client/Main.hx | 13 | ||||
| -rw-r--r-- | src/server/Main.hx | 34 |
4 files changed, 52 insertions, 8 deletions
diff --git a/src/Types.hx b/src/Types.hx index 5dbc07a..e5b467a 100644 --- a/src/Types.hx +++ b/src/Types.hx @@ -12,7 +12,8 @@ typedef Config = { maxLoginLength:Int, maxMessageLength:Int, serverChatHistory:Int, - videoLimit:Int, + totalVideoLimit:Int, + userVideoLimit:Int, leaderRequest:String, emotes:Array<Emote>, filters:Array<Filter>, @@ -84,6 +85,9 @@ typedef WsEvent = { clientName:String, text:String }, + ?serverMessage:{ + textId:String + }, ?updateClients:{ clients:Array<ClientData>, }, @@ -140,6 +144,7 @@ enum abstract WsEventType(String) { var LoginError; var Logout; var Message; + var ServerMessage; var UpdateClients; // var AddClient; // var RemoveClient; diff --git a/src/VideoList.hx b/src/VideoList.hx index 2f13b6c..e2d88d5 100644 --- a/src/VideoList.hx +++ b/src/VideoList.hx @@ -64,4 +64,10 @@ abstract VideoList(Array<VideoItem>) from Array<VideoItem> to Array<VideoItem> { return itemPos; } + public function itemsByUser(client:Client):Int { + var i = 0; + for (item in this) if (item.author == client.name) i++; + return i; + } + } diff --git a/src/client/Main.hx b/src/client/Main.hx index a5fe9bb..b2f51ca 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -267,9 +267,6 @@ class Main { showGuestPasswordPanel(); case LoginError: - final text = Lang.get("usernameError") - .replace("$MAX", '${config.maxLoginLength}'); - serverMessage(4, text); showGuestLoginPanel(); case Logout: @@ -284,6 +281,16 @@ class Main { case Message: addMessage(data.message.clientName, data.message.text); + case ServerMessage: + final id = data.serverMessage.textId; + final text = switch (id) { + case "usernameError": + Lang.get(id).replace("$MAX", '${config.maxLoginLength}'); + default: + Lang.get(id); + } + serverMessage(4, text); + case AddVideo: player.addVideoItem(data.addVideo.item, data.addVideo.atEnd); if (player.itemsLength() == 1) player.setVideo(0); diff --git a/src/server/Main.hx b/src/server/Main.hx index 6a2ad82..8f71bd2 100644 --- a/src/server/Main.hx +++ b/src/server/Main.hx @@ -13,7 +13,10 @@ import js.npm.ws.Server as WSServer; import js.npm.ws.WebSocket; import js.node.http.IncomingMessage; import js.node.Http; -import Types; +import Types.Config; +import Types.UserList; +import Types.Message; +import Types.WsEvent; using StringTools; using ClientTools; using Lambda; @@ -249,6 +252,7 @@ class Main { final name = data.login.clientName; if (badNickName(name) || name.length > config.maxLoginLength || clients.getByName(name) != null) { + serverMessage(client, "usernameError"); send(client, {type: LoginError}); return; } @@ -263,7 +267,7 @@ class Main { a -> a.name == name && a.hash == hash )) client.isAdmin = true; else { - // TODO server msg type + serverMessage(client, "passwordMatchError"); send(client, {type: LoginError}); return; } @@ -310,8 +314,22 @@ class Main { if (messages.length > config.serverChatHistory) messages.shift(); broadcast(data); + case ServerMessage: case AddVideo: - if (!client.isAdmin && !isPlaylistOpen) return; + if (!client.isAdmin && !isPlaylistOpen) { + serverMessage(client, "accessError"); + return; + } + if (config.totalVideoLimit != 0 + && videoList.length >= config.totalVideoLimit) { + serverMessage(client, "totalVideoLimitError"); + return; + } + if (config.userVideoLimit != 0 + && videoList.itemsByUser(client) >= config.userVideoLimit) { + serverMessage(client, "videoLimitPerUserError"); + return; + } final item = data.addVideo.item; item.author = client.name; final local = '$localIp:$port'; @@ -319,7 +337,7 @@ class Main { item.url = item.url.replace(local, '$globalIp:$port'); } if (videoList.exists(i -> i.url == item.url)) { - // TODO send server message + serverMessage(client, "videoAlreadyExistsError"); return; } videoList.addItem(item, data.addVideo.atEnd, itemPos); @@ -486,6 +504,14 @@ class Main { }); } + function serverMessage(client:Client, textId:String):Void { + send(client, { + type: ServerMessage, serverMessage: { + textId: textId + } + }); + } + function send(client:Client, data:WsEvent):Void { client.ws.send(Json.stringify(data), null); } |
