Component lisppaste

You are here: All Systems / lisppaste / lisppaste

;;;; $Id: lisppaste.lisp,v 1.28 2007/01/17 14:08:28 lisppaste Exp $
;;;; $Source: /project/lisppaste/cvsroot/lisppaste2/lisppaste.lisp,v $

;;;; See the LICENSE file for licensing information.

(in-package :lisppaste)

(defun start-lisppaste ()
  "Start accepting web requests."
  (if *no-channel-pastes*
      (pushnew "None" *channels* :test #'string-equal)
)

  (read-xml-pastes)
  (format t "Populating lookup table...~%")
  (clhs-lookup:populate-table)
  (r5rs-lookup:populate-table)
  (elisp-lookup:populate-table)
  (format t "Done!~%")
  (setf *boot-time* (get-universal-time))
  (araneida:start-listening *paste-listener*)
)


(defmacro make-new-paste (paste-list (&optional annotate real-number annotate-list) url &rest keys
                          &key channel user title &allow-other-keys
)

  (let ((paste-name (gensym)))
    `(let ((,paste-name (make-paste ,@keys)))
      (if (not (string-equal ,channel "None"))
          (irc-notify ,channel
                      (if ,annotate
                          (format nil "~A annotated #~A with \"~A\" at ~A" ,user ,real-number ,title ,url)
                          (format nil "~A pasted \"~A\" at ~A" ,user ,title ,url)
)
)
)

      ,(if annotate
           `(if ,annotate
             (push ,paste-name ,annotate-list)
             (push ,paste-name ,paste-list)
)

           `(push ,paste-name ,paste-list)
)

      (serialize-transaction ,paste-name (if ,annotate ,real-number))
)
)
)


(defun kill-paste (number)
  (let ((paste (if (typep number 'paste)
                   number
                   (find-paste number)
)
)
)

    (when paste
      (setf *pastes*
            (remove paste *pastes*)
)

      (disable-paste paste)
)
)
)


(defun kill-paste-annotations (number)
  (setf (paste-annotations (find-paste number))
        nil
)

  (paste-write-xml-to-file (find-paste number))
)


(defun kill-paste-annotation (number ann)
  (let ((paste (find number *pastes* :key #'paste-number)))
    (setf (paste-annotations paste)
          (remove ann (paste-annotations paste) :key #'paste-number)
)

    (paste-write-xml-to-file paste)
)
)


(defun logging-date ()
  (multiple-value-bind (second minute hour date month year)
      (get-decoded-time)
    (format nil "~2,'0D/~2,'0D/~4,'0D ~2,'0D:~2,'0D:~2,'0D "
             month date year hour minute second
)
)
)


(defun log-event (text &key (log-file *event-log-file*))
  (with-open-file (s log-file :direction :output :if-exists :append
                     :if-does-not-exist :create
)

    (write-string (logging-date) *trace-output*)
    (write-string (subseq text 0 50) *trace-output*)
    (fresh-line *trace-output*)
    (write-string (logging-date) s)
    (write-string text s)
    (finish-output s)
)
)

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.