#EmacsConf backstage: Using Spookfox to automate creating BigBlueButton rooms in Mozilla Firefox
| emacsconf, emacs, org
Naming conventions make it easier for other people to find things.
Just like with file prefixes, I like to use a standard naming pattern
for our BigBlueButton web conference rooms. For EmacsConf 2022, we
used ec22-day-am-gen Speaker name (slugs)
. For
EmacsConf 2023, I want to set up the BigBlueButton rooms before the
schedule settles down, so I won't encode the time or track information
into it. Instead, I'll use Speaker name (slugs) - emacsconf2023
.
BigBlueButton does have an API for managing rooms, but that requires a
shared secret that I don't know yet. I figured I'd just automate it
through my browser. Over the last year, I've started using Spookfox to
control the Firefox web browser from Emacs. It's been pretty handy for
scrolling webpages up and down, so I wondered if I could replace my
old xdotool
-based automation. Here's what I came up with for this
year.
First, I need a function that creates the BBB room for a group of talks and updates the Org entry with the URL. Adding a slight delay makes it a bit more reliable.
emacsconf-spookfox-create-bbb: Create a BBB room for this group of talks.
(defun emacsconf-spookfox-create-bbb (group) "Create a BBB room for this group of talks. GROUP is (email . (talk talk talk)). Needs a Spookfox connection." (let* ((bbb-name (format "%s (%s) - %s%s" (mapconcat (lambda (o) (plist-get o :slug)) (cdr group) ", ") (plist-get (cadr group) :speakers) emacsconf-id emacsconf-year)) path (retrieve-command (format "window.location.origin + [...document.querySelectorAll('h4.room-name-text')].find((o) => o.textContent.trim() == '%s').closest('tr').querySelector('.delete-room').getAttribute('data-path')" bbb-name)) (create-command (format "document.querySelector('#create-room-block').click(); document.querySelector('#create-room-name').value = \"%s\"; document.querySelector('#room_mute_on_join').click(); document.querySelector('.create-room-button').click();" bbb-name))) (setq path (spookfox-js-injection-eval-in-active-tab retrieve-command t)) (unless path (dolist (cmd (split-string create-command ";")) (spookfox-js-injection-eval-in-active-tab cmd t) (sleep-for 2)) (sleep-for 2) (setq path (spookfox-js-injection-eval-in-active-tab retrieve-command t))) (when path (dolist (talk (cdr group)) (save-window-excursion (emacsconf-with-talk-heading talk (org-entry-put (point) "ROOM" path)))) (cons bbb-name path))))
Then I need to iterate over the list of talks that have live Q&A sessions but don't have BBB rooms assigned yet so that I can create them.
emacsconf-spookfox-create-bbb-for-live-talks: Create BBB rooms for talks that don’t have them yet.
(defun emacsconf-spookfox-create-bbb-for-live-talks () "Create BBB rooms for talks that don't have them yet." (let* ((talks (seq-filter (lambda (o) (and (string-match "live" (or (plist-get o :q-and-a) "")) (not (string= (plist-get o :status) "CANCELLED")) (not (plist-get o :bbb-room)))) (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))) (groups (and talks (emacsconf-mail-groups talks)))) (dolist (group groups) (emacsconf-spookfox-create-bbb group))))
The result: a whole bunch of rooms ready for people to check in.
Using Spookfox to communicate with Firefox from Emacs Lisp made it easy to get data in and out of my browser. Handy!
This code is in emacsconf-spookfox.el.