Function: gnus-icalendar-event--build-reply-event-body

gnus-icalendar-event--build-reply-event-body is a byte-compiled function defined in gnus-icalendar.el.gz.

Signature

(gnus-icalendar-event--build-reply-event-body ICAL-REQUEST STATUS IDENTITIES &optional COMMENT)

Source Code

;; Defined in /usr/src/emacs/lisp/gnus/gnus-icalendar.el.gz
;;;
;;; gnus-icalendar-event-reply
;;;

(defun gnus-icalendar-event--build-reply-event-body (ical-request status identities &optional comment)
  (let ((summary-status (capitalize (symbol-name status)))
        (attendee-status (upcase (symbol-name status)))
        reply-event-lines)
    (cl-labels
	((update-summary
	  (line)
	  (if (string-match "^[^:]+:" line)
	      (replace-match (format "\\&%s: " summary-status) t nil line)
	    line))
         (update-comment
           (line)
           (if comment (format "COMMENT:%s" comment)
             line))
	 (update-dtstamp ()
			 (format-time-string "DTSTAMP:%Y%m%dT%H%M%SZ" nil t))
	 (attendee-matches-identity
	  (line)
	  (gnus-icalendar-find-if (lambda (name) (string-match-p name line))
				  identities))
	 (update-attendee-status
	  (line)
	  (when (and (attendee-matches-identity line)
		     (string-match "\\(PARTSTAT=\\)[^;]+" line))
	    (replace-match (format "\\1%s" attendee-status) t nil line)))
	 (process-event-line
	  (line)
	  (when (string-match "^\\([^;:]+\\)" line)
	    (let* ((key (match-string 0 line))
		   ;; NOTE: not all of the below fields are mandatory,
		   ;; but they are often present in other clients'
		   ;; replies. Can be helpful for debugging, too.
		   (new-line
		    (cond
		     ((string= key "ATTENDEE") (update-attendee-status line))
		     ((string= key "SUMMARY") (update-summary line))
		     ((string= key "COMMENT") (update-comment line))
		     ((string= key "DTSTAMP") (update-dtstamp))
		     ((member key '("ORGANIZER" "DTSTART" "DTEND"
				    "LOCATION" "DURATION" "SEQUENCE"
				    "RECURRENCE-ID" "UID"))
                      line)
		     (t nil))))
	      (when new-line
		(push new-line reply-event-lines))))))

      (mapc #'process-event-line (split-string ical-request "\n"))

      ;; RFC5546 refers to uninvited attendees as "party crashers".
      ;; This situation is common if the invitation is sent to a group
      ;; of people via a mailing list.
      (unless (gnus-icalendar-find-if (lambda (x) (string-match "^ATTENDEE" x))
				      reply-event-lines)
        (lwarn 'gnus-icalendar :warning
               "Could not find an event attendee matching given identity")
        (push (format "ATTENDEE;RSVP=TRUE;PARTSTAT=%s;CN=%s:MAILTO:%s"
                      attendee-status user-full-name user-mail-address)
              reply-event-lines))

      ;; add comment line if not existing
      (when (and comment
                 (not (gnus-icalendar-find-if
                       (lambda (x)
                         (string-match "^COMMENT" x))
                       reply-event-lines)))
        (push (format "COMMENT:%s" comment) reply-event-lines))

      (mapconcat #'identity `("BEGIN:VEVENT"
                              ,@(nreverse reply-event-lines)
                              "END:VEVENT")
                 "\n"))))