multi player / per user playing and translation
This commit is contained in:
+52
-1
@@ -11,7 +11,9 @@
|
||||
open-playlist-store
|
||||
close-playlist-store!
|
||||
load-user-playlists
|
||||
save-user-playlists!)
|
||||
save-user-playlists!
|
||||
load-user-language
|
||||
save-user-language!)
|
||||
|
||||
(struct persisted-tab (id name tracks) #:transparent)
|
||||
(struct playlist-store (keystore lock) #:transparent)
|
||||
@@ -19,6 +21,11 @@
|
||||
(define (user-playlists-key username)
|
||||
(format "playlists-for-~a" username))
|
||||
|
||||
(define (user-language-key username)
|
||||
(format "language-for-~a" username))
|
||||
|
||||
(define supported-language-names '("en" "nl" "de" "fr" "es"))
|
||||
|
||||
(define (track->datum item)
|
||||
(hasheq 'file (path->string (track-file item))
|
||||
'title (track-title item)
|
||||
@@ -116,6 +123,45 @@
|
||||
(ks-set! ks index-key ids))
|
||||
(void)))))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; goal : Load one user's persisted interface language.
|
||||
; pre : Store is #f or an open playlist store; username is normalized.
|
||||
; post : Store contents remain unchanged.
|
||||
; result : A supported ISO language name, or #f when none was saved.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(define (load-user-language store username)
|
||||
(and store
|
||||
(call-with-semaphore
|
||||
(playlist-store-lock store)
|
||||
(λ ()
|
||||
(define value
|
||||
(ks-get (playlist-store-keystore store)
|
||||
(user-language-key username)
|
||||
#f))
|
||||
(and (member value supported-language-names) value)))))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; goal : Persist one user's interface language.
|
||||
; pre : Store is #f or open, username is normalized, and language is one of
|
||||
; en, nl, de, fr, or es.
|
||||
; post : The user's language key contains language when a store exists.
|
||||
; result : Void.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(define (save-user-language! store username language)
|
||||
(unless (member language supported-language-names)
|
||||
(raise-argument-error
|
||||
'save-user-language!
|
||||
"one of en, nl, de, fr, or es"
|
||||
language))
|
||||
(when store
|
||||
(call-with-semaphore
|
||||
(playlist-store-lock store)
|
||||
(λ ()
|
||||
(ks-set! (playlist-store-keystore store)
|
||||
(user-language-key username)
|
||||
language))))
|
||||
(void))
|
||||
|
||||
(module+ test
|
||||
(require rackunit
|
||||
uuid/random)
|
||||
@@ -166,6 +212,11 @@
|
||||
(check-equal?
|
||||
(map persisted-tab-name (load-user-playlists store "local" libraries))
|
||||
'("Local"))
|
||||
(check-false (load-user-language store "hans"))
|
||||
(save-user-language! store "hans" "fr")
|
||||
(check-equal? (load-user-language store "hans") "fr")
|
||||
(check-exn exn:fail:contract?
|
||||
(λ () (save-user-language! store "hans" "it")))
|
||||
|
||||
;; Rewriting the user's GUID index durably removes the omitted playlist.
|
||||
(save-user-playlists!
|
||||
|
||||
Reference in New Issue
Block a user