Events and OnlineAddresses

Online Event Types

There are three subtypes of online events:

  1. Videoconferencing where we have a link directly to the stream, that the user can click on to join the meeting,
  2. Videoconferencing applications where we do not have a link to the stream, that requires the user to click to an external event provider to join the meeting
  3. Non-videoconferencing online meetings such as discord or irc meetups, world of warcraft, etc.

PlaceCal currently supports types 1 and 2.

Sources

Raw event data for each source, including sample online event data, can be found under the title Event Data on the PlaceCal Devops page.

We currently support the following sources of online event data:

Eventbrite

Eventbrite events have a value (online) which tells us directly if the event is online or not. However, even if the Eventbrite event is online, we are not given a stream URL.

Meetup

Meetup events have a value (is_online_event) which tells us directly if the event is online or not. However, even if the Meetup event is online, we are not given a stream URL.

iCal

An iCal file generally (see exception below) does not have a special value for online events. The most common form of linking event data in iCal event data (in as much as, the events we are already looking at / taking in) is to simply put it in the description. This may be a stream URL, or may be a Facebook event.

iCal (Google Calendar)

An ICal created via Google Calendar has an option for events to create a Google Meet stream for the event. The URL is shared via a Google-only extension to the ICal data called X-Google-Conference

OnlineAddress Rationale

Online events are not in a very stable state. Most solutions seem to bootstrap around calendar limitations, which can be seen with the method “Just copy and paste the zoom link into the description”. Videoconferencing usage changes across time, as can be seen with the general loss of usage of Skype and the increase of using Zoom, Discord, and Microsoft Teams. In addition, it is possible for a single online stream URL to be shared among events. So, to allow future expansion on how we handle online events, to preserve the already-existing separation between an Event and where the event is hosted, and to allow future reverse-lookup of online URLs to Events, the best solution seemed to be creating a separate Model, OnlineAddress

An OnlineAddress may have multiple Events, whereas an Event may only have one OnlineAddress. Currently the OnlineAddress simply contains the URL we are handed by the event ingress source, and a value — is_stream, that tells us if the URL is a videoconferencing link (i.e. a Type 1 online event), or a link to an external provider that requires user intervention (i.e. a Type 2 online event).

Edge Cases and Behaviour

Determining whether an Event is online, is as simple as checking for the existence of event.online_address.

When the is_stream value on an OnlineAddress is true, we have a videoconferencing URL. This should probably be displayed next to other links we have, such as the event.publisher_url, so the user can join the event, or view directly on the external source if possible.

When the is_stream value on an OnlineAddress is false, this means we must redirect to an external provider for the user to join the meeting. In the majority of cases, the event.online_address.url is the same as the event.publisher_url making the presence of the online_address.url utterly redundant. However, in a handful of cases, event.publisher_url is nil, but we have an online_address.url to redirect someone to.

Thus for display logic, we have four conditions:

  1. The event is not online
  2. The event is online, and we have a videoconferencing URL for it (is_stream == true)
  3. The event is online, we do not have a videoconferencing URL for it, and we already have a link to redirect someone to, so that they may join the online event (is_stream == true, event.publisher_url == online_address.url)
  4. The event is online, we do not have a videoconferencing URL for it, and we do not already have a link to redirect someone to, so that they can join the online event (is_stream == false, event.publisher_url == nil)

In case 3. it is preferable not to display the online_address.url, as it is just a duplicate of the other URL we already display. In cases 2. and 4. we should display the online_address.url either next to, or instead of, the publisher url