unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Ferdinand Pieper <list_gnu@pie.tf>,
	Robert Pluim <rpluim@gmail.com>,
	Andrew G Cohen <cohen@andy.bu.edu>,
	Alexandre Duret-Lutz <adl@lrde.epita.fr>
Cc: 72831@debbugs.gnu.org
Subject: bug#72831: [PATCH] gnus-icalendar: Allow comments in event replies
Date: Wed, 28 Aug 2024 14:02:42 +0300	[thread overview]
Message-ID: <868qwgj4fh.fsf@gnu.org> (raw)
In-Reply-To: <875xrml22f.fsf@pie.tf> (message from Ferdinand Pieper on Tue, 27 Aug 2024 11:58:32 +0200)

> From: Ferdinand Pieper <list_gnu@pie.tf>
> Date: Tue, 27 Aug 2024 11:58:32 +0200
> 
> Tags: patch
> 
> The iCalendar RFC allows comments in an event reply to e.g. indicate a reason for declining. This patch implements sending an additional comment if the usual functions `gnus-icalendar-reply-[accept,decline,tentative]` (bound to `i a`, `i d`, `i t`) are called with a prefix argument.
> 
> Please let me know any feedback regarding the patch and commit message formatting.
> 
> Notably this only implements the comment functionality for the functions mentioned above and does not include the buttons defined in `gnus-icalendar-event:inline-reply-buttons`, as I am not sure how the `read-string` for the user's comment should be implemented for them.

Thanks.

Robert, Andrew, and Alexandre: would you please review the proposed
changes below and comment?


> >From 8ff07723b407d56de72ddfea98b8931951bb7ad8 Mon Sep 17 00:00:00 2001
> From: fpi <git@pie.tf>
> Date: Mon, 19 Aug 2024 17:18:11 +0200
> Subject: [PATCH] Allow comments to organizer in ical event replies
> 
> * lisp/gnus/gnus-icalendar.el
> (gnus-icalendar-event--build-reply-event-body): Add optional COMMENT
> argument to be inserted into the reply.
> (gnus-icalendar-event-reply-from-buffer): Add COMMENT argument to be
> passed through to gnus-icalendar-event--build-reply-event-body
> (gnus-icalendar-reply-accept):
> (gnus-icalendar-reply-tentative):
> (gnus-icalendar-reply-decline): If interactively called with a prefix
> argument ask user for a COMMENT to add to the reply.
> ---
>  lisp/gnus/gnus-icalendar.el | 52 ++++++++++++++++++++++++++-----------
>  1 file changed, 37 insertions(+), 15 deletions(-)
> 
> diff --git a/lisp/gnus/gnus-icalendar.el b/lisp/gnus/gnus-icalendar.el
> index af7284b88e8..7a295fb9ed2 100644
> --- a/lisp/gnus/gnus-icalendar.el
> +++ b/lisp/gnus/gnus-icalendar.el
> @@ -309,7 +309,7 @@ gnus-icalendar-event-from-buffer
>  ;;; gnus-icalendar-event-reply
>  ;;;
>  
> -(defun gnus-icalendar-event--build-reply-event-body (ical-request status identities)
> +(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)
> @@ -319,6 +319,10 @@ gnus-icalendar-event--build-reply-event-body
>  	  (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
> @@ -341,6 +345,7 @@ gnus-icalendar-event--build-reply-event-body
>  		    (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"
> @@ -363,12 +368,17 @@ gnus-icalendar-event--build-reply-event-body
>                        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"))))
>  
> -(defun gnus-icalendar-event-reply-from-buffer (buf status identities)
> +(defun gnus-icalendar-event-reply-from-buffer (buf status identities &optional comment)
>    "Build a calendar event reply for request contained in BUF.
>  The reply will have STATUS (`accepted', `tentative' or  `declined').
>  The reply will be composed for attendees matching any entry
> @@ -396,7 +406,7 @@ gnus-icalendar-event-reply-from-buffer
>                                "PRODID:Gnus"
>                                "VERSION:2.0"
>                                zone
> -                              (gnus-icalendar-event--build-reply-event-body event status identities)
> +                              (gnus-icalendar-event--build-reply-event-body event status identities comment)
>                                "END:VCALENDAR")))
>  
>            (mapconcat #'identity (delq nil contents) "\n"))))))
> @@ -878,13 +888,13 @@ gnus-icalendar-send-buffer-by-mail
>        (insert "Subject: " subject)
>        (message-send-and-exit))))
>  
> -(defun gnus-icalendar-reply (data)
> +(defun gnus-icalendar-reply (data &optional comment)
>    (let* ((handle (car data))
>           (status (cadr data))
>           (event (caddr data))
>           (reply (gnus-icalendar-with-decoded-handle handle
>                    (gnus-icalendar-event-reply-from-buffer
> -                   (current-buffer) status (gnus-icalendar-identities))))
> +                   (current-buffer) status (gnus-icalendar-identities) comment)))
>           (organizer (gnus-icalendar-event:organizer event)))
>  
>      (when reply
> @@ -1009,25 +1019,37 @@ gnus-icalendar-save-event
>      (when data
>        (gnus-icalendar-save-part data))))
>  
> -(defun gnus-icalendar-reply-accept ()
> -  "Accept invitation in the current article."
> +(defun gnus-icalendar-reply-accept (&optional comment-p)
> +  "Accept invitation in the current article.
> +
> +With a prefix `\\[universal-argument]' prompt for a comment to include
> +in the reply."
>    (interactive nil gnus-article-mode gnus-summary-mode)
>    (with-current-buffer gnus-article-buffer
> -    (gnus-icalendar-reply (list gnus-icalendar-handle 'accepted gnus-icalendar-event))
> +    (gnus-icalendar-reply (list gnus-icalendar-handle 'accepted gnus-icalendar-event)
> +                          (when comment-p (read-string "Comment: ")))
>      (setq-local gnus-icalendar-reply-status 'accepted)))
>  
> -(defun gnus-icalendar-reply-tentative ()
> -  "Send tentative response to invitation in the current article."
> +(defun gnus-icalendar-reply-tentative (&optional comment-p)
> +  "Send tentative response to invitation in the current article.
> +
> +With a prefix `\\[universal-argument]' prompt for a comment to include
> +in the reply."
>    (interactive nil gnus-article-mode gnus-summary-mode)
>    (with-current-buffer gnus-article-buffer
> -    (gnus-icalendar-reply (list gnus-icalendar-handle 'tentative gnus-icalendar-event))
> +    (gnus-icalendar-reply (list gnus-icalendar-handle 'tentative gnus-icalendar-event)
> +                          (when comment-p (read-string "Comment: ")))
>      (setq-local gnus-icalendar-reply-status 'tentative)))
>  
> -(defun gnus-icalendar-reply-decline ()
> -  "Decline invitation in the current article."
> -  (interactive nil gnus-article-mode gnus-summary-mode)
> +(defun gnus-icalendar-reply-decline (&optional comment-p)
> +  "Decline invitation in the current article.
> +
> +With a prefix `\\[universal-argument]' prompt for a comment to include
> +in the reply."
> +  (interactive "P" gnus-article-mode gnus-summary-mode)
>    (with-current-buffer gnus-article-buffer
> -    (gnus-icalendar-reply (list gnus-icalendar-handle 'declined gnus-icalendar-event))
> +    (gnus-icalendar-reply (list gnus-icalendar-handle 'declined gnus-icalendar-event)
> +                          (when comment-p (read-string "Comment: ")))
>      (setq-local gnus-icalendar-reply-status 'declined)))
>  
>  (defun gnus-icalendar-event-export ()
> -- 
> 2.30.2
> 





  reply	other threads:[~2024-08-28 11:02 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-27  9:58 bug#72831: [PATCH] gnus-icalendar: Allow comments in event replies Ferdinand Pieper
2024-08-28 11:02 ` Eli Zaretskii [this message]
2024-08-28 13:45   ` Robert Pluim
2024-08-28 15:47     ` Eli Zaretskii
2024-08-28 16:35     ` Ferdinand Pieper
2024-08-29  7:52       ` Robert Pluim
2024-08-31 14:31         ` Ferdinand Pieper
2024-09-07 12:22           ` Ferdinand Pieper
2024-09-07 14:55             ` Eli Zaretskii
2024-09-07 15:05               ` Ferdinand Pieper
2024-09-11  8:13                 ` Robert Pluim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=868qwgj4fh.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=72831@debbugs.gnu.org \
    --cc=adl@lrde.epita.fr \
    --cc=cohen@andy.bu.edu \
    --cc=list_gnu@pie.tf \
    --cc=rpluim@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).