Covey.Town provides a virtual meeting space where different groups of people can have simultaneous video calls, allowing participants to drift between different conversations, just like in real life. Covey.Town was built for Northeastern's Spring 2021 software engineering course, and is designed to be reused across semesters. You can view our reference deployment of the app at app.covey.town, and our project showcase (Spring 2022, Spring 2021) highlight select student projects.
The figure above depicts the high-level architecture of Covey.Town.
The frontend client (in the frontend
directory of this repository) uses the PhaserJS Game Library to create a 2D game interface, using tilemaps and sprites.
The frontend implements video chat using the Twilio Programmable Video API, and that aspect of the interface relies heavily on Twilio's React Starter App. Twilio's React Starter App is packaged and reused under the Apache License, 2.0.
A backend service (in the townService
directory) implements the application logic: tracking which "towns" are available to be joined, and the state of each of those towns.
Running the application locally entails running both the backend service and a frontend.
To run the backend, you will need a Twilio account. Twilio provides new accounts with $15 of credit, which is more than enough to get started. To create an account and configure your local environment:
- Go to Twilio and create an account. You do not need to provide a credit card to create a trial account.
- Create an API key and secret (select "API Keys" on the left under "Settings")
- Create a
.env
file in thetownService
directory, setting the values as follows:
Config Value | Description |
---|---|
TWILIO_ACCOUNT_SID |
Visible on your twilio account dashboard. |
TWILIO_API_KEY_SID |
The SID of the new API key you created. |
TWILIO_API_KEY_SECRET |
The secret for the API key you created. |
TWILIO_API_AUTH_TOKEN |
Visible on your twilio account dashboard. |
Once your backend is configured, you can start it by running npm start
in the townService
directory (the first time you run it, you will also need to run npm install
).
The backend will automatically restart if you change any of the files in the townService/src
directory.
Create a .env
file in the frontend
directory, with the line: REACT_APP_TOWNS_SERVICE_URL=http://localhost:8081
(if you deploy the towns service to another location, put that location here instead)
In the frontend
directory, run npm start
(again, you'll need to run npm install
the very first time). After several moments (or minutes, depending on the speed of your machine), a browser will open with the frontend running locally.
The frontend will automatically re-compile and reload in your browser if you change any files in the frontend/src
directory.
The Netlify-deployed application can be accessed at https://polling-area-413.netlify.app
Interaction with a Polling Area is similar to interacting with a Conversation or Viewing Area. Similar to how the spacebar changes the topic in a Conversation Area or the video in a Viewing Area, if the user is inside a Polling Area, they can press the spacebar to create a poll. On the Covey town map, the Polling Area should be in the room through the doors to the left from where a new user is spawned, in a translucent box within the gated area with a table in each of its 4 corners (shown in the images below). If a poll is not currently running, a dialog will appear prompting the player to press the spacebar. Upon pressing the key a window with options to set the title of the poll and length of time voting should be open for appears on the screen, and a popup message at the bottom of the screen indicates if the poll was created successfully. If it was successful, another window with the question and ‘yes’ and ‘no’ buttons replaces the poll creation window, and the player can select a vote (which is counted in a votes array that can be found in the UI’s React developer tools window if desired). If another player enters when a poll is already running, they will encounter an error if they try to create another one concurrently, meaning only one poll can be active in a Polling Area at a time.