anchor.diff:          (respond event "Feed ~a removed!" name))
         (respond event "No feed called \"~a\" could be found!" name)))
   
  +(define-command (rss about) (name) (:documentation "Show information about a feed.")
  +  (if (gethash name (feeds module))
  +      (respond event "~a: ~a" name (url (gethash name (feeds module))))
  +      (respond event "No feed called \"~a\" could be found!" name)))
  +
   (define-command (rss watch) (name) (:authorization T :documentation "Start watching a feed on this channel.")
     (pushnew (cons (name (server event)) (channel event)) (report-to module))
     (respond event "Now watching ~a on this channel." name))
  
positive.code: (defmethod get-items ((feed feed) &key limit)
    (let ((lquery:*lquery-master-document*)
          (drakma:*text-content-types* (cons '("application" . "xml")
                                             drakma:*text-content-types*)))
      ($ (initialize (drakma:http-request (url feed)) :type :XML))
      (loop for node in ($ "item")
         for i from 0
  
negative.code: 
  (defmethod start ((rss rss))
    (load-feeds rss)
    (loop for feed being the hash-values of (feeds rss)
       do (update feed))
    (setf (thread rss) (bordeaux-threads:make-thread 
                        #'(lambda () (check-loop rss))
                        :initial-bindings `((*servers* . ,*servers*)))))
  
  (defmethod stop ((rss rss))
    (save-feeds rss)
    (when (bordeaux-threads:thread-alive-p (thread rss))
      (bordeaux-threads:destroy-thread (thread rss))))
  
  (defmethod save-feeds ((rss rss))
    (v:info :rss "Saving feeds...")
    (with-open-file (stream *save-file* :direction :output :if-exists :supersede :if-does-not-exist :create)
      (let ((data (loop for feed being the hash-values of (feeds rss)
                     collect (cons (if (keywordp (name feed)) 
                                       (name feed) 
                                       (intern (name feed) :KEYWORD))
                                   (list (cons :URL (url feed))
                                         (cons :REPORT (list (report-to feed))))))))
        (json:encode-json data stream)
        (v:info :rss "~a feeds saved." (hash-table-count (feeds rss))))))
  
  (defmethod load-feeds ((rss rss))
    (v:info :rss "Loading feeds...")
    (with-open-file (stream *save-file* :if-does-not-exist NIL)
      (when stream
        (let ((feeds (loop with feeds = (make-hash-table :test 'equalp) 
                        for feed in (json:decode-json stream)
                        for name = (string-downcase (car feed))
                        for url = (cdr (assoc :URL (cdr feed)))
                        for report = (first (cdr (assoc :REPORT (cdr feed))))
                        do (setf (gethash name feeds) (make-instance 'feed :name name :url url :report-to report))
                        finally (return feeds))))
          (setf (feeds rss) feeds)
          (v:info :rss "~a feeds loaded." (hash-table-count feeds))))))
  
  (defmethod check-loop ((rss rss))
    (v:debug :rss "Starting check-loop.")
    (loop while (active rss)
       do (sleep (* 60 5))
         (v:info :rss "Checking all...")
         (loop for feed being the hash-values of (feeds rss)
            do (handler-case 
                   (let ((update (update feed)))
  