~edwargix/tallyard

c2bbc518842ec1afe9f13a16d89c514ee4da80b1 — David Florness 5 years ago 15cc7c3
The client now supports voting in multiple elections
1 files changed, 39 insertions(+), 23 deletions(-)

M client.rkt
M client.rkt => client.rkt +39 -23
@@ 53,35 53,17 @@
  (let loop ([wait 0])
    (sleep wait)
    (with-handlers ([exn:fail:network:http:error?
                     (λ (exn)
                     (λ (ex)
                       (break-enabled #t)
                       (display ".")
                       (flush-output)
                       (loop 3))])
      f)))

(module+ main
  (define point (gen))

  (define bulletin
    (update-port (update-host json-requester "localhost") 1984))

  (define token
    (let ([username (readline "Username: ")]
          [password (get-pass "Password: ")])
      (with-handlers ([exn:fail:network:http:error?
                       (λ ([ex : exn:fail:network:http:error])
                         (newline)
                         (displayln (format "Login refused: ~a"
                                            (exn-message ex)))
                         (exit))])
        (json-response-body
         (post bulletin "/register"
               #:data
               (jsexpr->string (hasheq 'input (integer->hex-string point)
                                       'username username
                                       'password password)))))))

(define (vote-in-election
         [point    : Integer]
         [bulletin : requester]
         [token    : JSExpr])
  (displayln "retrieving candidates...")
  (define candidates (cast (json-response-body
                            (retry-request (get bulletin "/candidates")))


@@ 308,3 290,37 @@
        [rank rankings])
    (for ([r rank])
      (displayln (format "~a) ~a" i (list-ref candidates r))))))

(module+ main
  (define point (gen))

  (define bulletin
    (update-port (update-host json-requester "localhost") 1984))

  (define token
    (let ([username (readline "Username: ")]
          [password (get-pass "Password: ")])
      (with-handlers ([exn:fail:network:http:error?
                       (λ ([ex : exn:fail:network:http:error])
                         (newline)
                         (displayln (format "Login refused: ~a"
                                            (exn-message ex)))
                         (exit))])
        (json-response-body
         (post bulletin "/register"
               #:data
               (jsexpr->string (hasheq 'input (integer->hex-string point)
                                       'username username
                                       'password password)))))))

  ; the bulletin can have multiple elections
  (let loop ()
    (with-handlers ([exn:fail?
                     (λ ([ex : exn:fail])
                       (displayln (exn-message ex))
                       (displayln
                        "Assuming election was cancelled; starting over")
                       (break-enabled #t)
                       (loop))])
      (vote-in-election point bulletin token))
    (loop)))