(module random-org scheme
(require net/url)
(provide/contract [rename check-quota random-org:check-quota (->* ()
(#:ip string?)
integer?)]
[rename generate-integers random-org:generate-integers (->* ()
(#:num
(integer-in 1 (expt 10 4))
#:min
(integer-in (expt -10 9)
(expt 10 9))
#:max
(integer-in (expt -10 9)
(expt 10 9)))
(listof integer?))]
[rename generate-sequence random-org:generate-sequence (->* ()
(#:min
(integer-in (expt -10 9)
(expt 10 9))
#:max
(integer-in (expt -10 9)
(expt 10 9)))
(listof integer?))]
[rename generate-strings random-org:generate-strings (->* ()
(#:num
(integer-in 1 (expt 10 4))
#:len
(integer-in 1 20)
#:digits boolean?
#:upper boolean?
#:lower boolean?
#:unique boolean?)
(listof string?))]
[rename generate-password random-org:generate-password (-> (integer-in 1 (expt 10 4))
string?)])
(provide (prefix-out random-org: *default-number-integers*)
(prefix-out random-org: *default-min-integer*)
(prefix-out random-org: *default-max-integer*)
(prefix-out random-org: *default-number-strings*)
(prefix-out random-org: *default-length-strings*))
(define *integer-url-string* "http://random.org/integers/?format=plain")
(define *sequence-url-string* "http://random.org/sequences/?format=plain")
(define *string-url-string* "http://random.org/strings/?format=plain")
(define *quota-url-string* "http://random.org/quota/?format=plain")
(define (check-quota #:ip [ip #f])
(if ip
(read (get-pure-port (string->url (string-append *quota-url-string* "&ip=" ip))))
(read (get-pure-port (string->url *quota-url-string*)))))
(define *default-number-integers* 1)
(define *default-min-integer* 0)
(define *default-max-integer* 1000)
(define *default-columns-integers* 1)
(define (generate-integers #:num [num *default-number-integers*]
#:min [min *default-min-integer*]
#:max [max *default-max-integer*])
(let [(port (get-pure-port (string->url
(string-append
*integer-url-string*
(string-append "&num=" (number->string num))
(string-append "&min=" (number->string min))
(string-append "&max=" (number->string max))
(string-append "&col=" (number->string *default-columns-integers*))
"&base=10"))))]
(define (read-numbers)
(let ([n (read port)])
(cond [(eq? eof n) null]
[else (cons n (read-numbers))])))
(read-numbers)))
(define (generate-sequence #:min [min *default-min-integer*]
#:max [max *default-max-integer*])
(let [(port (get-pure-port (string->url
(string-append
*sequence-url-string*
(string-append "&min=" (number->string min))
(string-append "&max=" (number->string max))
(string-append "&col=" (number->string *default-columns-integers*))))))]
(define (read-numbers)
(let ([n (read port)])
(cond [(eq? eof n) null]
[else (cons n (read-numbers))])))
(read-numbers)))
(define *default-number-strings* 1)
(define *default-length-strings* 5)
(define (generate-strings #:num (num *default-number-strings*) #:len (len *default-length-strings*)
#:digits (digits #t) #:upper (upper #t)
#:lower (lower #t) #:unique (unique #t))
(for/list ((s (in-lines
(get-pure-port
(string->url (string-append *string-url-string*
"&num=" (number->string num)
"&len=" (number->string len)
"&digits=" (if digits "on" "off")
"&upperalpha=" (if upper "on" "off")
"&loweralpha=" (if lower "on" "off")
"&unique=" (if unique "on" "off")))))))
s))
(define (generate-password len)
(list->string (map integer->char (generate-integers #:min 32 #:max 127 #:num len))))
)