diff --git a/src/config.rkt b/src/config.rkt index bdf4440..6fc029f 100644 --- a/src/config.rkt +++ b/src/config.rkt @@ -1,23 +1,32 @@ -#lang racket/base +#lang typed/racket/base (require racket/function racket/pretty racket/runtime-path - racket/string - ini) + racket/string) +(require/typed ini + [#:opaque Ini ini?] + [read-ini (Input-Port -> Ini)] + [ini->hash (Ini -> (Immutable-HashTable Symbol (Immutable-HashTable Symbol String)))]) (provide config-parameter config-true? config-get) +(module+ test + (require "typed-rackunit.rkt")) + (define-runtime-path path-config "../config.ini") +(: config-parameter (Symbol -> (Parameterof String))) (define (config-parameter key) (hash-ref config key)) +(: config-true? (Symbol -> Boolean)) (define (config-true? key) (not (member ((config-parameter key)) '("" "false")))) +(: config-get (Symbol -> String)) (define (config-get key) ((config-parameter key))) @@ -26,6 +35,7 @@ (canonical_origin . "") (debug . "false") (instance_is_official . "false") ; please don't turn this on, or you will make me very upset + (log_outgoing . "true") (port . "10416") (strict_proxy . "true"))) @@ -55,18 +65,24 @@ (define env-alist (let ([e-names (environment-variables-names (current-environment-variables))] - [e-ref (λ (name) (bytes->string/latin-1 (environment-variables-ref (current-environment-variables) name)))]) - (map (λ (name) (cons (string->symbol (string-downcase (substring (bytes->string/latin-1 name) 3))) - (e-ref name))) - (filter (λ (name) (string-prefix? (string-downcase (bytes->string/latin-1 name)) "bw_")) e-names)))) + [e-ref (λ ([name : Bytes]) + (bytes->string/latin-1 + (cast (environment-variables-ref (current-environment-variables) name) + Bytes)))]) + (map (λ ([name : Bytes]) + (cons (string->symbol (string-downcase (substring (bytes->string/latin-1 name) 3))) + (e-ref name))) + (filter (λ ([name : Bytes]) (string-prefix? (string-downcase (bytes->string/latin-1 name)) + "bw_")) + e-names)))) (when (> (length env-alist) 0) (printf "note: ~a items loaded from environment variables~n" (length env-alist))) (define combined-alist (append default-config loaded-alist env-alist)) (define config - (make-hasheq - (map (λ (pair) + (make-immutable-hasheq + (map (λ ([pair : (Pairof Symbol String)]) (cons (car pair) (make-parameter (cdr pair)))) combined-alist))) @@ -74,8 +90,8 @@ ; all values here are optimised for maximum prettiness (parameterize ([pretty-print-columns 80]) (display "config: ") - (pretty-write (sort - (hash->list (make-hasheq combined-alist)) + (pretty-write ((inst sort (Pairof Symbol String)) + (hash->list (make-immutable-hasheq combined-alist)) symbolquery ; make a proxied version of a fandom url u-proxy-url ; check whether a url is on a domain controlled by fandom - is-fandom-url?) + is-fandom-url? + ; prints "out: " + log-outgoing) (module+ test (require "typed-rackunit.rkt")) +(define px-wikiname "[a-zA-Z0-9-]{3,50}") + ;; https://url.spec.whatwg.org/#urlencoded-serializing (define urlencoded-set '(#\! #\' #\( #\) #\~ ; urlencoded set @@ -57,7 +64,7 @@ (: is-fandom-url? (String -> Boolean)) (define (is-fandom-url? url) - (regexp-match? #px"^https://static.wikia.nocookie.net/|^https://[a-zA-Z0-9-]{3,50}.fandom.com/" url)) + (regexp-match? (pregexp (format "^https://static\\.wikia\\.nocookie\\.net/|^https://~a\\.fandom\\.com/" px-wikiname)) url)) (module+ test (check-true (is-fandom-url? "https://static.wikia.nocookie.net/wikiname/images/2/2f/SomeImage.jpg/revision/latest?cb=20110210094136")) (check-true (is-fandom-url? "https://test.fandom.com/wiki/Some_Page")) @@ -69,3 +76,8 @@ is-fandom-url? (λ ([v : String]) (string-append "/proxy?" (params->query `(("dest" . ,url))))) url)) + +(: log-outgoing (String -> Void)) +(define (log-outgoing url-string) + (when (config-true? 'log_outgoing) + (printf "out: ~a~n" url-string)))