diff options
| -rw-r--r-- | emacsconf-erc.el | 215 | 
1 files changed, 128 insertions, 87 deletions
diff --git a/emacsconf-erc.el b/emacsconf-erc.el index 56c6ed7..cdc8b9b 100644 --- a/emacsconf-erc.el +++ b/emacsconf-erc.el @@ -142,108 +142,134 @@ If MESSAGE is not specified, reset the topic to the template."  ;;; Announcements +(defvar emacsconf-erc-check-against-recent-announcements 10 +	"Number of minutes since most recent announcement.") + +(defun emacsconf-erc-recently-announced (string) +	"Return non-nil if STRING was recently announced." +	(when emacsconf-erc-check-against-recent-announcements +		(let ((threshold-time +					 (time-add (current-time) +										 (seconds-to-time +											(* 60 emacsconf-erc-check-against-recent-announcements))))) +			(seq-find (lambda (entry) +									(and (string-match (regexp-quote string) (car entry)) +											 (time-less-p (cdr entry) +																		threshold-time))) +								emacsconf-erc-recent-announcements)))) +  (defun erc-cmd-NOWPLAYING (talk)    "Set the channel topics to announce TALK."    (interactive (list (emacsconf-complete-talk-info))) -  (when (stringp talk) (setq talk (or (emacsconf-find-talk-info talk) (error "Could not find talk %s" talk)))) +  (when (stringp talk) (setq talk (or (emacsconf-find-talk-info talk) (error "Could not find talk %s" talk))))     ;; Announce it in the track's channel -  (when (plist-get talk :track) -    (emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) -      (erc-cmd-TOPIC (format "%s: %s (%s) pad: %s Q&A: %s | %s" -                             (plist-get talk :slug) -                             (plist-get talk :title)                                -                             (plist-get talk :speakers) -                             (plist-get talk :pad-url) -                             (plist-get talk :qa-info) -                             (car (assoc-default (concat "#" (plist-get talk :channel)) emacsconf-topic-templates)))) -      (erc-send-message (format "---- %s: %s - %s ----" -                                (plist-get talk :slug) -                                (plist-get talk :title) -                                (plist-get talk :speakers-with-pronouns))) -      (erc-send-message (concat "Add your notes/questions to the pad: " (plist-get talk :pad-url))) -      (cond -       ((string-match "live" (or (plist-get talk :q-and-a) "")) -        (erc-send-message (concat "Live Q&A: " (plist-get talk :bbb-redirect)))) -       ((plist-get talk :irc) -        (erc-send-message (format "or discuss the talk on IRC (nick: %s)" -                                  (plist-get talk :irc))))))) -  ;; Short announcement in #emacsconf -  (emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) -    (erc-send-message (format "-- %s track: %s: %s (watch: %s, pad: %s, channel: #%s)" -                              (plist-get talk :track) -                              (plist-get talk :slug) -                              (plist-get talk :title)                                -                              (plist-get talk :watch-url) -                              (plist-get talk :pad-url) -                              (plist-get talk :channel))))) +	(if (emacsconf-erc-recently-announced (format "---- %s:" (plist-get talk :slug))) +			(message "Recently announced, skipping") +		(when (plist-get talk :track) +			(emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) +				(erc-cmd-TOPIC (format "%s: %s (%s) pad: %s Q&A: %s | %s" +															 (plist-get talk :slug) +															 (plist-get talk :title)                                +															 (plist-get talk :speakers) +															 (plist-get talk :pad-url) +															 (plist-get talk :qa-info) +															 (car (assoc-default (concat "#" (plist-get talk :channel)) emacsconf-topic-templates)))) +				(erc-send-message (format "---- %s: %s - %s ----" +																	(plist-get talk :slug) +																	(plist-get talk :title) +																	(plist-get talk :speakers-with-pronouns))) +				(erc-send-message (concat "Add your notes/questions to the pad: " (plist-get talk :pad-url))) +				(cond +				 ((string-match "live" (or (plist-get talk :q-and-a) "")) +					(erc-send-message (concat "Live Q&A: " (plist-get talk :bbb-redirect)))) +				 ((plist-get talk :irc) +					(erc-send-message (format "or discuss the talk on IRC (nick: %s)" +																		(plist-get talk :irc))))))) +		;; Short announcement in #emacsconf +		(emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) +			(erc-send-message (format "-- %s track: %s: %s (watch: %s, pad: %s, channel: #%s)" +																(plist-get talk :track) +																(plist-get talk :slug) +																(plist-get talk :title)                                +																(plist-get talk :watch-url) +																(plist-get talk :pad-url) +																(plist-get talk :channel))))))  (defun erc-cmd-NOWCLOSEDQ (talk)    "Announce TALK has started Q&A, but the host has not yet opened it up."    (interactive (list (emacsconf-complete-talk-info)))    (when (stringp talk) (setq talk (or (emacsconf-find-talk-info talk) (error "Could not find talk %s" talk)))) -  (emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) -    (erc-send-message (format "-- Q&A beginning for \"%s\" (%s) Watch: %s Add notes/questions: %s" -                              (plist-get talk :title) -                              (plist-get talk :qa-info) -                              (plist-get talk :watch-url) -                              (plist-get talk :pad-url))))   -  (emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) -    (erc-send-message (format "-- Q&A beginning for \"%s\" in the %s track (%s) Watch: %s Add notes/questions: %s . Chat: #%s" -                         (plist-get talk :title) -                         (plist-get talk :track) -                         (plist-get talk :qa-info) -                         (plist-get talk :watch-url) -                         (plist-get talk :pad-url) -                         (plist-get talk :channel))))) +	(if (emacsconf-erc-recently-announced (format "-- Q&A beginning for \"%s\"" (plist-get talk :slug))) +			(message "Recently announced, skipping") +		(emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) +			(erc-send-message (format "-- Q&A beginning for \"%s\" (%s) Watch: %s Add notes/questions: %s" +																(plist-get talk :title) +																(plist-get talk :qa-info) +																(plist-get talk :watch-url) +																(plist-get talk :pad-url))))   +		(emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) +			(erc-send-message (format "-- Q&A beginning for \"%s\" in the %s track (%s) Watch: %s Add notes/questions: %s . Chat: #%s" +																(plist-get talk :title) +																(plist-get talk :track) +																(plist-get talk :qa-info) +																(plist-get talk :watch-url) +																(plist-get talk :pad-url) +																(plist-get talk :channel))))))  (defun erc-cmd-NOWOPENQ (talk)    (interactive (list (emacsconf-complete-talk-info)))    (when (stringp talk) (setq talk (or (emacsconf-find-talk-info talk) (error "Could not find talk %s" talk)))) -  (emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) -    (erc-send-message (format "-- Q&A now open for \"%s\" (%s). Watch: %s Add notes/questions: %s ." -                         (plist-get talk :title) -                         (plist-get talk :qa-info) -                         (plist-get talk :watch-url) -                         (plist-get talk :pad-url))))   -  (emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) -    (erc-send-message (format "-- Q&A now open for \"%s\" in the %s track (%s). Watch: %s Add notes/questions: %s IRC: #%s" -                         (plist-get talk :title) -                         (plist-get talk :track) -                         (plist-get talk :qa-info) -                         (plist-get talk :watch-url) -                         (plist-get talk :pad-url) -                         (plist-get talk :channel))))) +	(if (emacsconf-erc-recently-announced (format "-- Q&A now open for \"%s\"" (plist-get talk :slug))) +			(message "Recently announced, skipping") +		(emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) +			(erc-send-message (format "-- Q&A now open for \"%s\" (%s). Watch: %s Add notes/questions: %s ." +																(plist-get talk :title) +																(plist-get talk :qa-info) +																(plist-get talk :watch-url) +																(plist-get talk :pad-url))))   +		(emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) +			(erc-send-message (format "-- Q&A now open for \"%s\" in the %s track (%s). Watch: %s Add notes/questions: %s IRC: #%s" +																(plist-get talk :title) +																(plist-get talk :track) +																(plist-get talk :qa-info) +																(plist-get talk :watch-url) +																(plist-get talk :pad-url) +																(plist-get talk :channel))))))  (defun erc-cmd-NOWUNSTREAMEDQ (talk)    (interactive (list (emacsconf-complete-talk-info)))    (when (stringp talk) (setq talk (or (emacsconf-find-talk-info talk) (error "Could not find talk %s" talk)))) -  (emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) -    (erc-send-message (format "-- Q&A continues off-stream for \"%s\" (%s) Add notes/questions: %s ." -                              (plist-get talk :title) -                              (plist-get talk :qa-info) -                              (plist-get talk :pad-url))))   -  (emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) -    (erc-send-message (format "-- Q&A continues off-stream for \"%s\" in the %s track (%s) Add notes/questions: %s IRC: #%s" -                              (plist-get talk :title) -                              (plist-get talk :track) -                              (plist-get talk :qa-info) -                              (plist-get talk :pad-url) -                              (concat "#" (plist-get talk :channel)))))) +	(if (emacsconf-erc-recently-announced (format "-- Q&A continues off-stream for \"%s\"" (plist-get talk :slug))) +			(message "Recently announced, skipping") +		(emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) +			(erc-send-message (format "-- Q&A continues off-stream for \"%s\" (%s) Add notes/questions: %s ." +																(plist-get talk :title) +																(plist-get talk :qa-info) +																(plist-get talk :pad-url))))   +		(emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) +			(erc-send-message (format "-- Q&A continues off-stream for \"%s\" in the %s track (%s) Add notes/questions: %s IRC: #%s" +																(plist-get talk :title) +																(plist-get talk :track) +																(plist-get talk :qa-info) +																(plist-get talk :pad-url) +																(concat "#" (plist-get talk :channel)))))))  (defun erc-cmd-NOWDONE (talk) -  (interactive (list (emacsconf-complete-talk-info))) -  (when (stringp talk) (setq talk (or (emacsconf-find-talk-info talk) (error "Could not find talk %s" talk)))) -  (emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) -    (erc-send-message (format "-- Q&A finished for \"%s\". Add notes/questions: %s %s" -                              (plist-get talk :title) -                              (plist-get talk :pad-url) -                              (emacsconf-surround " Speaker IRC nick: " (plist-get talk :irc) "" ""))))   -  (emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) -    (erc-send-message (format "-- Q&A finished for \"%s\" in the %s track. Add notes/questions: %s %s" -                              (plist-get talk :title) -                              (plist-get talk :track) -                              (plist-get talk :pad-url) -                              (emacsconf-surround " Speaker IRC nick: " (plist-get talk :irc) "" ""))))) +	(interactive (list (emacsconf-complete-talk-info))) +	(when (stringp talk) (setq talk (or (emacsconf-find-talk-info talk) (error "Could not find talk %s" talk)))) +	(if (emacsconf-erc-recently-announced (format "-- Q&A finished for \"%s\"" (plist-get talk :slug))) +			(message "Recently announced, skipping") +		(emacsconf-erc-with-channels (list (concat "#" (plist-get talk :channel))) +			(erc-send-message (format "-- Q&A finished for \"%s\". Add notes/questions: %s %s" +																(plist-get talk :title) +																(plist-get talk :pad-url) +																(emacsconf-surround " Speaker IRC nick: " (plist-get talk :irc) "" "")))) +		(emacsconf-erc-with-channels (list emacsconf-erc-hallway emacsconf-erc-org) +			(erc-send-message (format "-- Q&A finished for \"%s\" in the %s track. Add notes/questions: %s %s" +																(plist-get talk :title) +																(plist-get talk :track) +																(plist-get talk :pad-url) +																(emacsconf-surround " Speaker IRC nick: " (plist-get talk :irc) "" ""))))))  ;;; For todo hooks @@ -293,9 +319,9 @@ If MESSAGE is not specified, reset the topic to the template."  (defun erc-cmd-OPME ()    "Request chanserv to op me."    (erc-message "PRIVMSG" -	       (format "chanserv op %s %s" -		       (erc-default-target) -		       (erc-current-nick)) nil)) +							 (format "chanserv op %s %s" +											 (erc-default-target) +											 (erc-current-nick)) nil))  (defun erc-cmd-DEOPME ()    "Deop myself from current channel." @@ -304,7 +330,7 @@ If MESSAGE is not specified, reset the topic to the template."  (defun erc-cmd-OPALL (&optional nick)    (emacsconf-erc-with-channels (mapcar 'car emacsconf-topic-templates)      (if nick -	(erc-cmd-OP nick) +				(erc-cmd-OP nick)        (erc-cmd-OPME))))  (defun erc-cmd-DEOPALL (&optional nick) @@ -455,5 +481,20 @@ Usage: /conflog keyword notes go here"      (apply 'erc-cmd-CONFLOG (cdr args)))     (t (message "checkin start git log")))) +;;; Hooks for noticing + +;; (with-eval-after-load 'erc (add-hook 'erc-insert-pre-hook 'emacsconf-erc-notice-announcements)) + +(defvar emacsconf-erc-announcement-nicks '("sachac" "emacsconf")) +(defvar emacsconf-erc-recent-announcements nil "List of time and recent announcements.") +(defvar emacsconf-erc-recent-announcements-length 100 "How many entries to keep.") +(defun emacsconf-erc-notice-announcements (string) +	"Try to avoid spamming the announcement channels." +	(when (string-match (concat "\\`<@?" (regexp-opt emacsconf-erc-announcement-nicks) "> \\(--.*\\)") string) +		(message "%s" (substring-no-properties string)) +		(setq emacsconf-erc-recent-announcements +					(cons (cons (match-string-no-properties 1 string) (current-time)) +								(seq-take emacsconf-erc-recent-announcements (1- emacsconf-erc-recent-announcements-length)))))) +  (provide 'emacsconf-erc)  ;;; emacsconf-erc.el ends here  | 
