summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--emacsconf-mail.el176
1 files changed, 90 insertions, 86 deletions
diff --git a/emacsconf-mail.el b/emacsconf-mail.el
index 3a15152..b566f77 100644
--- a/emacsconf-mail.el
+++ b/emacsconf-mail.el
@@ -523,14 +523,15 @@ Include some other things, too, such as emacsconf-year, title, name, email, url,
(switch-to-buffer (current-buffer)))))
(defun emacsconf-mail-merge-cancel ()
+ "Cancel all the unsent messages."
(interactive)
(mapc (lambda (buffer)
(when (string-match "unsent" (buffer-name buffer))
- (let ((kill-buffer-query-functions nil)
- (undo-tree-auto-save-history nil)
- (buffer-modified-p nil))
- (set-buffer-modified-p nil)
- (kill-buffer buffer))))
+ (with-current-buffer buffer
+ (let ((kill-buffer-query-functions nil)
+ (undo-tree-auto-save-history nil))
+ (set-buffer-modified-p nil)
+ (kill-buffer buffer)))))
(buffer-list)))
;;; Notmuch
@@ -572,7 +573,7 @@ Include some other things, too, such as emacsconf-year, title, name, email, url,
Good for adding to `message-send-hook'."
(save-excursion
(goto-char (point-min))
- (when (re-search-forward "ZZZ" nil t)
+ (when (re-search-forward "ZZZ\\|\\${" nil t)
(unless (yes-or-no-p "ZZZ marker found. Send anyway? ")
(error "ZZZ marker found.")))))
@@ -850,8 +851,13 @@ Thank you so much for all the work you put into preparing a talk for ${conf-name
${signature}")
(plist-get talk :email)
(let ((default-directory emacsconf-cache-dir)
- (files (directory-files emacsconf-cache-dir
- t (regexp-quote (plist-get talk :file-prefix)))))
+ (files
+ (seq-remove
+ (lambda (o)
+ (string-match "--intro\\.\\(webm\\|vtt\\)"
+ o))
+ (directory-files emacsconf-cache-dir
+ t (regexp-quote (plist-get talk :file-prefix))))))
(list
:title (plist-get talk :title)
:conf-name emacsconf-name
@@ -1353,7 +1359,7 @@ ${signature}"))
(error "Number of rooms for %s speaker: %d"
(plist-get (cadr group) :slug)
(length (seq-uniq (mapcar (lambda (o) (plist-get o :bbb-room)) (cdr group))))))
- (t (plist-get (car (cdr group)) :bbb-backstage)))
+ (t (emacsconf-backstage-url (plist-get (car (cdr group)) :bbb-backstage))))
:bbb-tips (concat emacsconf-base-url emacsconf-year "/bbb-for-speakers/")
:intro-url (mapconcat
(lambda (talk)
@@ -1366,14 +1372,18 @@ ${signature}"))
emacsconf-year
(plist-get talk :file-prefix))
(error "No intro file for %s" (plist-get talk :slug))))
- (cdr group))))))))
+ (cdr group)
+ " , ")))))))
(defun emacsconf-mail-checkin-instructions-to-all ()
"Draft check-in instructions for all speakers."
(interactive)
- (let* ((talks (seq-filter (lambda (o) (and (plist-get o :email)
- (plist-get o :q-and-a)))
- (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info))))
+ (let* ((talks
+ (emacsconf-filter-talks-by-logbook
+ "sent check-in information"
+ (seq-filter (lambda (o) (and (plist-get o :email)
+ (plist-get o :q-and-a)))
+ (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))))
(by-attendance (seq-group-by (lambda (o) (null (string-match "after" (plist-get o :q-and-a))))
talks)))
(dolist (group (emacsconf-mail-groups (assoc-default nil by-attendance)))
@@ -1392,37 +1402,26 @@ GROUP is (email . (talk talk))"
(null (plist-get o :email))
(string-match "after" (or (plist-get o :q-and-a) ""))))
(emacsconf-get-talk-info)))))
- (let ((waiting-talks (seq-filter (lambda (o) (string= (plist-get o :status) "WAITING_FOR_PREREC")) (cdr group))))
- (emacsconf-mail-prepare
- (list
- :subject "${conf-name} ${year}: Check-in instructions"
- :reply-to "emacsconf-submit@gnu.org, ${email}, ${user-email}"
- :mail-followup-to "emacsconf-submit@gnu.org, ${email}, ${user-email}"
- :log-note "sent check-in information for people who will be there"
- :body
- "${email-notes}Hello, ${speakers-short}!
+ (emacsconf-mail-prepare
+ (list
+ :subject "${conf-name} ${year}: Check-in instructions"
+ :reply-to "emacsconf-submit@gnu.org, ${email}, ${user-email}"
+ :mail-followup-to "emacsconf-submit@gnu.org, ${email}, ${user-email}"
+ :log-note "sent check-in information for people who will be there"
+ :body
+ "${email-notes}Hello, ${speakers-short}!
We're looking forward to having you join us at ${conf-name}!
Here's your talk page URL and checkin information:
${checkin-info}
-You can get a rough idea of your schedule on your talk
-page${plural}, and then check it again on the day of your
-talk${plural} for any changes. We'll try our best to keep your
-talk in the same general timeslot (ex: Saturday morning, Saturday
-afternoon, Sunday morning, Sunday afternoon). If there are big
-changes to your schedule on the day of your talk${plural}, you'll
-get an e-mail from us with a subject like \"URGENT: ${conf-name}
-${year}: ...\". Please let me know if something has come up and
-the times don't work for you.${wrap}
-
-Please check in early so that we can deal with scheduling changes or
-technical issues, and so that we don't worry too much about whether
-you'll be ready to go for Q&A. =) You can find the check-in process at
-${base-url}${year}/speakers/ .${waiting}${wrap}
-
-If something comes up, please let us know as soon as you can. Here's
+Please check in early so that we can deal with scheduling changes
+or technical issues, and so that we don't worry too much about
+missing speakers (aaah!). You can find the check-in
+process at ${base-url}${year}/speakers/ . ${wrap}
+
+${waiting}If something comes up, please let us know as soon as you can. Here's
my emergency contact information: ${emergency}${wrap}
Thank you for sharing your time and energy with the ${conf-name}
@@ -1432,55 +1431,59 @@ ${signature}
p.s. If you need to cancel, that's okay too, life happens. Let me know
as soon as you can and I'll try to shuffle things around. Thank you!")
- (car group)
- (list
- :year emacsconf-year
- :base-url emacsconf-base-url
- :conf-name emacsconf-name
- :email (car group)
- :emergency emacsconf-emergency-contact
- :plural (if (> (length (cdr group)) 1) "s" "")
- :speakers-short (plist-get (cadr group) :speakers-short)
- :url (mapconcat (lambda (o) (concat emacsconf-base-url (plist-get o :url)))
- (cdr group) " , ")
- :email-notes (emacsconf-surround "ZZZ: " (plist-get (cadr group) :email-notes) "\n\n" "")
- :signature user-full-name
- :waiting
- (cond
- ((> (length waiting-talks) 1)
- " If you can upload talk videos before the conference, I think that might be much less stressful for everyone than doing it live. =) Please note that we will turn off the web-based upload on Dec 1 to free up memory on the server, so please upload them as early as you can.${wrap}")
- ((= (length waiting-talks) 1)
- " If you can upload a talk video before the conference, I think that might be much less stressful for everyone than doing it live. =) Please note that we will turn off the web-based upload on Dec 1 to free up memory on the server, so please upload it as early as you can.${wrap}")
- (t ""))
- :checkin-info
- (mapconcat
- (lambda (o)
- (emacsconf-replace-plist-in-string
- (append (list :base-url emacsconf-base-url
- :check-in
- (concat
- "Before "
- (emacsconf-timezone-strings-combined
- (plist-get o :checkin-time)
- (plist-get o :timezone))
- " (this is " (plist-get o :checkin-label) ")")
- :qa-info-speakers
- (cond
- ;; aaaaah, no prerec yet
- ((string= (plist-get o :status) "WAITING_FOR_PREREC")
- (concat "Q&A BigBlueButton room (and possibly also the talk if you want to do it live): " (plist-get o :bbb-room)))
- ((null (plist-get o :q-and-a)) "")
- ((string-match "live" (plist-get o :q-and-a)) (concat "Q&A BigBlueButton room: " (plist-get o :bbb-room)))
- ((string-match "irc" (plist-get o :q-and-a)) (concat "Q&A: " (plist-get o :channel) " (" (plist-get o :webchat-url) ")"))
- ((string-match "pad" (plist-get o :q-and-a)) "Q&A: On the pad")
- (t "Q&A: After the event")))
- o)
- "- ${title}
+ (car group)
+ (list
+ :year emacsconf-year
+ :base-url emacsconf-base-url
+ :conf-name emacsconf-name
+ :user-email user-mail-address
+ :email (car group)
+ :emergency emacsconf-emergency-contact
+ :plural (if (> (length (cdr group)) 1) "s" "")
+ :speakers-short (plist-get (cadr group) :speakers-short)
+ :url (mapconcat (lambda (o) (concat emacsconf-base-url (plist-get o :url)))
+ (cdr group) " , ")
+ :email-notes (emacsconf-surround "ZZZ: " (plist-get (cadr group) :email-notes) "\n\n" "")
+ :waiting (let ((waiting (seq-remove (lambda (o) (plist-get o :video-file)) (cdr group))))
+ (cond
+ ((= (length waiting) 0) "")
+ ((= (length waiting) 1) "If you happen to be able to get a pre-recorded video together in the next few days, I think we might be able to still manage that.${fill}\n\n")
+ (t "If you happen to be able to get your pre-recorded videos together in the next few days, I think we might be able to still manage them.${fill}\n\n")))
+ :signature user-full-name
+ :checkin-info
+ (mapconcat
+ (lambda (o)
+ (emacsconf-replace-plist-in-string
+ (append (list :base-url emacsconf-base-url
+ :check-in
+ (concat
+ "Before "
+ (emacsconf-timezone-strings-combined
+ (plist-get o :checkin-time)
+ (plist-get o :timezone))
+ "\n (this is " (plist-get o :checkin-label) ")")
+ :qa-info-speakers
+ (cond
+ ((or (plist-get o :live) (null (plist-get o :video-file))) ;; intentionally a live talk
+ (concat "Talk & Q&A BigBlueButton room: "
+ (emacsconf-backstage-url (plist-get o :bbb-backstage))))
+ ((string= (plist-get o :qa-type) "none")
+ "Q&A: After the event; we'll collect the questions and e-mail them to you")
+ ((string= (plist-get o :qa-type) "live")
+ (concat "Q&A BigBlueButton room: "
+ (emacsconf-backstage-url (plist-get o :bbb-backstage))))
+ ((string= (plist-get o :qa-type) "irc")
+ (concat "Q&A: On IRC: #" (plist-get o :channel) " ( " (plist-get o :webchat-url) " )"))
+ ((string= (plist-get o :qa-type) "pad")
+ (concat "Q&A: On Etherpad"))
+ (t "Q&A: After the event; we'll collect the questions and e-mail them to you")))
+ o)
+ "- ${title}
Info and sched: ${base-url}${url}
Check-in: ${check-in}
Pad: ${pad-url}
${qa-info-speakers}"))
- (cdr group) "\n\n")))))
+ (cdr group) "\n\n"))))
(defun emacsconf-mail-checkin-instructions-for-nonattending-speakers (group)
"Send checkin note to speakers who will not be there.
@@ -1498,7 +1501,7 @@ GROUP is (email . (talk talk))"
:subject "${conf-name} ${year}: Check-in instructions in case you happen to want to join us"
:reply-to "emacsconf-submit@gnu.org, ${email}, ${user-email}"
:mail-followup-to "emacsconf-submit@gnu.org, ${email}, ${user-email}"
- :log-note "sent check-in information for people who will be there"
+ :log-note "sent check-in information for people who will not be there"
:body
"${email-notes}Hello, ${speakers-short}!
@@ -1521,8 +1524,9 @@ Sacha")
:year emacsconf-year
:base-url emacsconf-base-url
:conf-name emacsconf-name
- :email (plist-get (car talks) :email)
- :speakers-short (plist-get (car talks) :speakers-short)
+ :email (car group)
+ :user-email user-mail-address
+ :speakers-short (plist-get (cadr group) :speakers-short)
:url (mapconcat (lambda (o) (concat emacsconf-base-url (plist-get o :url)))
(cdr group) " , ")
:email-notes (emacsconf-surround "ZZZ: " (plist-get (cadr group) :email-notes) "\n\n" ""))))