aboutsummaryrefslogtreecommitdiffstats
path: root/src/client
diff options
context:
space:
mode:
authorRblSb <msrblsb@gmail.com>2020-03-11 11:12:29 +0300
committerRblSb <msrblsb@gmail.com>2020-03-11 11:12:29 +0300
commitfcea47721fd27dff36c92613bea73a23e3926c89 (patch)
tree16543334e05fbd7726ae7d4f6d3679b21f6a1f15 /src/client
parent21c4be884d6c278b5dac67960ed459a6dd2630a2 (diff)
Local settings
closes #1
Diffstat (limited to 'src/client')
-rw-r--r--src/client/Buttons.hx60
-rw-r--r--src/client/ClientSettings.hx14
-rw-r--r--src/client/Main.hx57
-rw-r--r--src/client/Settings.hx65
4 files changed, 161 insertions, 35 deletions
diff --git a/src/client/Buttons.hx b/src/client/Buttons.hx
index b5656e1..3245b44 100644
--- a/src/client/Buttons.hx
+++ b/src/client/Buttons.hx
@@ -15,8 +15,12 @@ class Buttons {
static final personalHistory:Array<String> = [];
static var personalHistoryId = -1;
static var split:Split;
+ static var settings:ClientSettings;
public static function init(main:Main):Void {
+ settings = main.settings;
+ window.onresize = onVideoResize;
+ initSplit();
initChatInput(main);
initNavBar(main);
@@ -67,31 +71,29 @@ class Buttons {
final userlistToggle = ge("#userlisttoggle");
userlistToggle.onclick = e -> {
+ final isHidden = userlistToggle.classList.toggle("glyphicon-chevron-right");
+ userlistToggle.classList.toggle("glyphicon-chevron-down");
final style = ge("#userlist").style;
- if (style.display == "none") {
- userlistToggle.classList.add("glyphicon-chevron-down");
- userlistToggle.classList.remove("glyphicon-chevron-right");
- style.display = "block";
- } else {
- userlistToggle.classList.add("glyphicon-chevron-right");
- userlistToggle.classList.remove("glyphicon-chevron-down");
- style.display = "none";
- }
+ if (isHidden) style.display = "none";
+ else style.display = "block";
+ settings.isUserListHidden = isHidden;
+ Settings.write(settings);
}
ge("#usercount").onclick = userlistToggle.onclick;
+ if (settings.isUserListHidden) userlistToggle.onclick();
final extendPlayer = ge("#extendplayer");
extendPlayer.onclick = e -> {
- if (extendPlayer.classList.contains("active")) {
- split.setSizes([40, 60]);
- ge("#userlist").style.width = "90px";
- } else {
- split.setSizes([20, 80]);
- ge("#userlist").style.width = "80px";
- }
- extendPlayer.classList.toggle("active");
+ final isExtended = extendPlayer.classList.toggle("active");
+ final sizes = isExtended ? [20, 80] : [40, 60];
+ ge("#userlist").style.width = isExtended ? "80px" : "90px";
+ if (settings.isSwapped) sizes.reverse();
+ split.setSizes(sizes);
+ settings.isExtendedPlayer = isExtended;
+ writeSplitSize();
window.dispatchEvent(new Event("resize"));
}
+ if (settings.isExtendedPlayer) extendPlayer.onclick();
final toggleSynch = ge("#togglesynch");
toggleSynch.onclick = e -> {
@@ -157,9 +159,6 @@ class Buttons {
input.value = main.getTemplateUrl();
input.focus();
}
-
- window.onresize = onVideoResize;
- initSplit();
}
static function showPlayerGroup(el:Element):Void {
@@ -175,11 +174,11 @@ class Buttons {
ge(el.dataset.target).classList.toggle("collapse");
}
- static function initSplit(swapped = false):Void {
+ static function initSplit():Void {
if (split != null) split.destroy();
final divs = ["#chatwrap", "#videowrap"];
- final sizes = [40, 60];
- if (swapped) {
+ final sizes = [settings.chatSize, settings.playerSize];
+ if (settings.isSwapped) {
divs.reverse();
sizes.reverse();
}
@@ -187,6 +186,7 @@ class Buttons {
sizes: sizes,
onDragEnd: () -> {
window.dispatchEvent(new Event("resize"));
+ writeSplitSize();
},
minSize: 185,
snapOffset: 0
@@ -194,6 +194,14 @@ class Buttons {
window.dispatchEvent(new Event("resize"));
}
+ static function writeSplitSize():Void {
+ final sizes = split.getSizes();
+ if (settings.isSwapped) sizes.reverse();
+ settings.chatSize = sizes[0];
+ settings.playerSize = sizes[1];
+ Settings.write(settings);
+ }
+
static function onVideoResize():Void {
final player = ge("#ytapiplayer");
final height = player.offsetHeight - ge("#chatline").offsetHeight;
@@ -263,11 +271,13 @@ class Buttons {
p.insertBefore(p.children[1], p.children[0]);
final p = ge("#playlistrow");
p.insertBefore(p.children[1], p.children[0]);
- final swapped = ge("#main").firstElementChild == ge("#videowrap");
- initSplit(swapped);
+ settings.isSwapped = ge("#main").firstElementChild == ge("#videowrap");
+ Settings.write(settings);
+ initSplit();
swapLayoutBtn.blur();
hideMenus();
}
+ if (settings.isSwapped) swapLayoutBtn.onclick();
final removeBtn = ge("#removeVideoBtn");
removeBtn.onclick = e -> {
final has = main.toggleVideoElement();
diff --git a/src/client/ClientSettings.hx b/src/client/ClientSettings.hx
new file mode 100644
index 0000000..4e931d3
--- /dev/null
+++ b/src/client/ClientSettings.hx
@@ -0,0 +1,14 @@
+package client;
+
+typedef ClientSettings = {
+ version:Int,
+ name:String,
+ hash:String,
+ isExtendedPlayer:Bool,
+ chatSize:Int,
+ playerSize:Int,
+ synchThreshold:Int,
+ isSwapped:Bool,
+ isUserListHidden:Bool,
+ latestLinks:Array<String>
+}
diff --git a/src/client/Main.hx b/src/client/Main.hx
index cee749b..e5c67a7 100644
--- a/src/client/Main.hx
+++ b/src/client/Main.hx
@@ -20,8 +20,9 @@ using ClientTools;
class Main {
+ public final settings:ClientSettings;
public var isSyncActive = true;
- public var synchThreshold(default, null) = 2;
+ public var synchThreshold(get, never):Int;
final clients:Array<Client> = [];
var pageTitle = document.title;
final host:String;
@@ -32,7 +33,7 @@ class Main {
var isConnected = false;
var ws:WebSocket;
final player:Player;
- var onTimeGet = new Timer(2000);
+ var onTimeGet:Timer;
var onBlinkTab:Null<Timer>;
static function main():Void new Main();
@@ -45,7 +46,23 @@ class Main {
if (port == null) port = Browser.location.port;
if (port == "") port = "80";
+ final defaults:ClientSettings = {
+ version: 1,
+ name: "",
+ hash: "",
+ isExtendedPlayer: false,
+ chatSize: 40,
+ playerSize: 60,
+ synchThreshold: 2,
+ isSwapped: false,
+ isUserListHidden: false,
+ latestLinks: []
+ }
+ Settings.init(defaults);
+ settings = Settings.read();
+
initListeners();
+ onTimeGet = new Timer(settings.synchThreshold * 1000);
onTimeGet.run = requestTime;
document.onvisibilitychange = () -> {
if (!document.hidden && onBlinkTab != null) {
@@ -59,6 +76,10 @@ class Main {
});
}
+ inline function get_synchThreshold():Int {
+ return settings.synchThreshold;
+ }
+
function requestTime():Void {
if (!isSyncActive) return;
if (player.isListEmpty()) return;
@@ -269,11 +290,17 @@ class Main {
showGuestPasswordPanel();
case LoginError:
+ settings.name = "";
+ settings.hash = "";
+ Settings.write(settings);
showGuestLoginPanel();
case Logout:
updateClients(data.logout.clients);
personal = new Client(data.logout.clientName, 0);
+ settings.name = "";
+ settings.hash = "";
+ Settings.write(settings);
showGuestLoginPanel();
case UpdateClients:
@@ -386,12 +413,12 @@ class Main {
onLogin(connected.clients, connected.clientName);
}
final guestName:InputElement = cast ge("#guestname");
- final guestPass:InputElement = cast ge("#guestpass");
- if (config.salt != null && guestPass.value.length > 0) {
- userLogin(guestName.value, guestPass.value);
- } else {
- guestLogin(guestName.value);
- }
+ var name = settings.name;
+ if (name.length == 0) name = guestName.value;
+ final hash = settings.hash;
+ if (hash.length > 0) loginRequest(name, hash);
+ else guestLogin(name);
+
setPlaylistLock(connected.isPlaylistOpen);
clearChat();
serverMessage(1);
@@ -408,16 +435,25 @@ class Main {
clientName: name
}
});
+ settings.name = name;
+ Settings.write(settings);
}
public function userLogin(name:String, password:String):Void {
if (config.salt == null) return;
if (password.length == 0) return;
if (name.length == 0) return;
+ final hash = Sha256.encode(password + config.salt);
+ loginRequest(name, hash);
+ settings.hash = hash;
+ Settings.write(settings);
+ }
+
+ public function loginRequest(name:String, hash:String):Void {
send({
type: Login, login: {
clientName: name,
- passHash: Sha256.encode(password + config.salt)
+ passHash: hash
}
});
}
@@ -643,10 +679,11 @@ class Main {
}
public function setSynchThreshold(s:Int):Void {
- synchThreshold = s;
onTimeGet.stop();
onTimeGet = new Timer(s * 1000);
onTimeGet.run = requestTime;
+ settings.synchThreshold = s;
+ Settings.write(settings);
}
public function getTemplateUrl():String {
diff --git a/src/client/Settings.hx b/src/client/Settings.hx
new file mode 100644
index 0000000..47d67fc
--- /dev/null
+++ b/src/client/Settings.hx
@@ -0,0 +1,65 @@
+package client;
+
+import haxe.Json;
+import js.html.Storage;
+import js.Browser;
+
+private typedef Vers = {version:Int};
+private typedef Updater = (data:Any, version:Int)->Any;
+
+class Settings {
+
+ static var defaults:Null<Vers>;
+ static var updater:Null<Updater>;
+ static var storage:Storage;
+ static var isSupported = false;
+
+ public static function init(def:Vers, ?upd:Updater):Void {
+ storage = Browser.getLocalStorage();
+ isSupported = storage != null;
+ defaults = def;
+ updater = upd;
+ }
+
+ public static function read():Any {
+ if (!isSupported) return defaults;
+ final data:Any = Json.parse(storage.getItem("data"));
+ return checkData(data);
+ }
+
+ static function checkData(data:Vers):Any {
+ if (defaults == null) throw "read: default data is null";
+ if (data == null) return defaults;
+ if (data.version == defaults.version) return data;
+ if (data.version > defaults.version)
+ throw "read: current data version is larger than default data version";
+ if (updater == null) throw "read: updater function is null";
+ while (data.version < defaults.version) {
+ data = updater(data, data.version);
+ data.version++;
+ }
+ write(data);
+ return data;
+ }
+
+ public static function set(sets:Any):Void {
+ final data = read();
+ final fields = Reflect.fields(sets);
+ for (field in fields) {
+ final value = Reflect.field(sets, field);
+ Reflect.setField(data, field, value);
+ }
+ write(data);
+ }
+
+ public static function write(data:Vers):Void {
+ if (!isSupported) return;
+ storage.setItem("data", Json.stringify(data));
+ }
+
+ public static function reset():Void {
+ if (defaults == null) throw "reset: default data is null";
+ write(defaults);
+ }
+
+}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage