(defpackage #:dice-roller (:use #:cl) (:local-nicknames (#:wknd #:weekend))) (in-package #:dice-roller) (defconstant +digits+ "([0-9]+)") (defclass roller () ((rolls :reader rolls :initarg :rolls :initform (wknd::slot-required 'roller 'rolls) :type integer :documentation "The number of rolls") (sides :reader sides :initarg :sides :initform (wknd:slot-required 'roller 'rolls) :type integer :documentation "The number of sides")) (:documentation "Rolls a virtual dices with SIDES sides ROLLS number of times.") (:metaclass wknd::endpoint) (:method . :get) (:route-parts "roll" +digits+ "d" +digits+) (:extractors (:rolls parse-integer) (:sides parse-integer)) (:content-type . "text/plain")) (defmethod wknd::handle ((req roller)) (with-slots (rolls sides) req (format nil "~ad~a ... rolled a ~a" rolls sides (loop :repeat rolls :sum (1+ (random sides)))))) (defvar *server* (make-instance 'hunchentoot:easy-acceptor :port 8888)) (hunchentoot:start *server*) ;; now visit http://localhost:8888/roll/10/d/4 (ql:quickload :dexador) (defun get-roll (rolls sides) (dexador:get (concatenate 'string "http://localhost:8888" (wknd::route-to 'roller :rolls rolls :sides sides))))