anchor.diff:        (save-weather-config (data-path "weather-throttle.lisp"))
         (reply-to message "~a: ~a" (source message) (message-of err)))))
   
  -(defun doge-weather (count temp-c icon prefix-flavor)
  +;; :a - adjective
  +;; :v - verb
  +;; :n - countable noun (cups)
  +;; :m - mass noun (water)
  +(defparameter +weather-word-class+
  +  (alexandria:alist-hash-table '(("amaze" . :a)
  +                                 ("bake" . :v)
  +                                 ("balmy" . :a)
  +                                 ("blind" . :a)
  +                                 ("boiling" . :a)
  +                                 ("bolt" . :v)
  +                                 ("boring" . :a)
  +                                 ("brrr" . :a)
  +                                 ("brrrr" . :a)
  +                                 ("brrrrr" . :a)
  +                                 ("chill" . :a)
  +                                 ("chilly" . :a)
  +                                 ("clear" . :a)
  +                                 ("climate change" . :n)
  +                                 ("climate" . :m)
  +                                 ("cloud" . :n)
  +                                 ("clouds" . :n)
  +                                 ("cloudy" . :a)
  +                                 ("coat" . :n)
  +                                 ("cold" . :a)
  +                                 ("concern" . :v)
  +                                 ("cool" . :a)
  +                                 ("crash" . :v)
  +                                 ("creepy" . :a)
  +                                 ("crisp" . :a)
  +                                 ("cumulus" . :n)
  +                                 ("dark" . :a)
  +                                 ("darkness" . :a)
  +                                 ("depress" . :a)
  +                                 ("dying" . :a)
  +                                 ("festive" . :a)
  +                                 ("freeze" . :v)
  +                                 ("freezing" . :a)
  +                                 ("frost" . :m)
  +                                 ("frosty" . :a)
  +                                 ("global warming" . :m)
  +                                 ("gloomy" . :a)
  +                                 ("heat" . :m)
  +                                 ("hibernate" . :v)
  +                                 ("hide" . :v)
  +                                 ("ice" . :m)
  +                                 ("icy" . :a)
  +                                 ("joy" . :m)
  +                                 ("lightning" . :n)
  +                                 ("loud" . :a)
  +                                 ("lovely" . :a)
  +                                 ("medium" . :a)
  +                                 ("melt" . :v)
  +                                 ("mild" . :a)
  +                                 ("mist" . :m)
  +                                 ("moderate" . :a)
  +                                 ("moon" . :n)
  +                                 ("nice" . :a)
  +                                 ("night" . :m)
  +                                 ("numb" . :a)
  +                                 ("okay" . :a)
  +                                 ("overcast" . :a)
  +                                 ("polar vortex" . :n)
  +                                 ("powder" . :m)
  +                                 ("raindrops" . :n)
  +                                 ("ridiculous" . :a)
  +                                 ("scare" . :v)
  +                                 ("scary" . :a)
  +                                 ("scattered" . :a)
  +                                 ("shady" . :a)
  +                                 ("shiny" . :a)
  +                                 ("shiver" . :v)
  +                                 ("shower" . :v)
  +                                 ("sky" . :m)
  +                                 ("sleet" . :m)
  +                                 ("slippery" . :a)
  +                                 ("snow" . :m)
  +                                 ("snowflake" . :n)
  +                                 ("soak" . :v)
  +                                 ("soft" . :a)
  +                                 ("space" . :m)
  +                                 ("spook" . :v)
  +                                 ("star" . :n)
  +                                 ("stars" . :n)
  +                                 ("suffer" . :v)
  +                                 ("sun" . :m)
  +                                 ("sweating" . :a)
  +                                 ("terrible" . :a)
  +                                 ("thunder" . :n)
  +                                 ("vapor" . :m)
  +                                 ("warmth" . :m)
  +                                 ("weather" . :m)
  +                                 ("wet" . :a)
  +                                 ("whatever" . :a)
  +                                 ("white" . :a)
  +                                 ("winter" . :m)
  +                                 ("wonderful" . :a)
  +                                 ("yuck" . :a))
  +                               :test 'equal))
  +
  +(defun generate-doge (count first-words amaze-words words)
  +  (with-output-to-string (s)
  +    (loop
  +       with wow-amaze = nil
  +       with words-left = (alexandria:shuffle (make-array (length words)
  +                                                         :initial-contents words
  +                                                         :fill-pointer t))
  +       repeat count do
  +         (cond
  +           ((and (zerop (random 6))
  +                 (not wow-amaze))
  +            (format s " ~a." (alexandria:random-elt amaze-words))
  +            (setf wow-amaze t))
  +           (t
  +            (let* ((selected-word (vector-pop words-left))
  +                   (selected-category (gethash selected-word +weather-word-class+))
  +                   (first-word (alexandria:random-elt (rest (assoc selected-category first-words)))))
  +              (format s " ~a ~a."
  +                      first-word
  +                      selected-word)))))))
  +
  +
  +
  +(defun doge-weather (count temp-c icon prefix-flavor amaze-flavor)
     (let ((such-temp
            (cond
              ((<= temp-c -30) '("winter" "freeze" "polar vortex" "ridiculous" "hibernate" "climate change"))
              ((<= temp-c -15) '("cold" "freeze" "shiver" "ice" "yuck" "climate change"))
              ((<= temp-c -7) '("icy" "winter" "chill" "crisp" "brrrrr" "cool"))
              ((<= temp-c 0) '("icy" "frost" "numb" "shiver" "brrr" "chilly"))
  -           ((<= temp-c 10) '("chilly" "concern" "coat" "frosty" "uh oh" "brrrr"))
  +           ((<= temp-c 10) '("chilly" "concern" "coat" "frosty" "brrrr"))
              ((<= temp-c 20) '("moderate" "mild" "okay" "medium" "cool" "whatever"))
  -           ((<= temp-c 30) '("heat" "warmth" "climate" "sweating" "balmy" "nice day"))
  +           ((<= temp-c 30) '("heat" "warmth" "climate" "sweating" "balmy" "nice"))
              (t '("boiling" "bake" "melt" "dying" "suffer" "global warming"))))
           (wow-conditions
            (cond
  
positive.code:           (reply-to message "~a... ~a.~a"
                      city
                      (if metricp temp-c temp-f)
                      (doge-weather 4 temp-c icon prefix-flavor))))
      (weather-error (err)
        (save-weather-config (data-path "weather-throttle.lisp"))
        (reply-to message "~a: ~a" (source message) (message-of err)))))
  
negative.code:            ((string= icon "nt_cloudy")
              '("gloomy" "clouds" "shady" "boring" "weather"))
             ((or (string= icon "nt_fog") (string= icon "nt_haze"))
              '("mist" "vapor" "creepy" "spook" "blind" "darkness" "gloomy" "depress" "weather"))
             ((or (string= icon "nt_mostlycloudy") (string= icon "nt_partlysunny"))
              '("cloud" "scattered" "night" "weather"))
             ((or (string= icon "nt_partlycloudy") (string= icon "nt_mostlysunny"))
              '("dark" "cumulus" "amaze" "cloud" "star" "space" "weather"))
             ((string= icon "nt_rain")
              '("raindrops" "soak" "wet" "slippery" "shower" "terrible" "scary" "cloud" "night" "weather"))
             ((string= icon "nt_sleet")
              '("sleet" "freezing" "wet" "slippery" "icy" "terrible" "weather" "night" "scary"))
             ((or (string= icon "nt_snow") (string= icon "nt_flurries"))
              '("snow" "white" "night time" "slippery" "icy" "snowflake" "powder" "joy" "shiny" "festive" "weather"))
             ((string= icon "nt_tstorms")
              '("scary" "thunder" "loud" "crash" "bolt" "lightning" "terrible" "hide" "weather")))))
      (generate-doge count
                     prefix-flavor
                     amaze-flavor
                     (append such-temp wow-conditions))))
  
  (defun display-doge-weather (module message metricp location prefix-flavor amaze-flavor)
    (handler-case
        (multiple-value-bind (city local-time weather icon humidity wind-dir
                                   temp-f dewpoint-f heat-index-f windchill-f
  