Statistics Server
Component Documentation
Documentation for each component is linked below.Server-side Communications
The server receives messages and facilitates communication between the sword and web client via WebSocket.
Getting Started
Prerequisites
We assume you have Python 3.5+, Django 1.11+ and Channels 2.0 installed already. You should also install Docker in order to install and run Redis.
Installing
First, clone the git repo:
$ git clone https://github.com/TypingKoala/Vegetable-Assassin-Server.git
Config
You will need to change the directory routing to your own root or folder name in
Vegetable-Assassin-Server/mysite/settings.py
in the fields
STATICFILES_DIRS
and STATIC_ROOT
.
Do the same thing for database directories listed at the top of these files:
Vegetable-Assassin-Server/chat/get_access_id.py
and
Vegetable-Assassin-Server/chat/collisions.py
in the variables id_db
and
scoreboard_db
, respectively.
Running
You can run the application inside the Vegetable-Assassin-Server
directory by running
the following line in your terminal:
$ python3 manage.py runserver 0.0.0.0:80
Document Details
In case you want to change the game specs on your local system, this section will provide a brief overview of important files and their functionalities.
mysite
settings.py
contains all the Django settings for the project, which is currently called
mysite
. Here, you can change allowed hosts of the site (which is currently
game.vegetableassass.in
), specify installed applications, databases, time zones,
languages, and static file options. Explore the full documentation for more details
on settings configuration.
routing.py
tells websockets where to route url address to, in our case, it leads to a
url routing file in the chat
directory with specified urlpatterns.
urls.py
contains a list of urlpatterns that routes URLs
to views. Views are written out in separate documents and imported into the file. Here, we specify
routes for the endpoints getid
, leaderboard/username
,
leaderboard
, multileaderboard/teamname
, multileaderboard
.
Note that for two url patterns that start with the same root, the longer one with arbitrary user
queries always comes first. Django checks the urls in the list in order.
chat
views.py
returns HttpResponse objects in specific functions called on by url patterns.
Currently, it generates endpoints for leaderboards on both single player mode and multiplayer mode,
supporting both general queries and or requests to display all scores for a specfic
username/teamname. These responses are called by the web client, and thus are presented with
Cross-Orgin Resource Sharing (CORS).
urls.py
currently contains an empty list of urlpatterns. Change this if you want
specific access ids to display different views/functionality.
routing.py
contains a list of websocket urlpatterns, which currently contains one url
for any arbitrary user input (the access id in this case), and creates a new ChatConsumer for that
channel.
consumers.py
uses asynchronous functions to connect, disconnect, receive, and send
messages through a websocket. Alter this code if you want to have different functionality upon
receiving or sending specific message content.
collisions.py
uses sqlite to create databases for single (scoreboard.db
)
and multiplayer (multiscores.db
) leaderboards, updates those leaderboards every time a
game is over, and queries the top 10 scores from the database when requested by the web client.
Change the methods in this file if you want to alter the content or order of the leaderboard.
get_access_id.py
creates a database (access_id.db
) to keep track of all
used 5-digit access ids, and generates distinct new ids upon a get request. Change this
implementation if you want a different form of access ids for your game.
** Note: Django channels work relatively well for low volumes of game traffic, but has limitations supporting high connection levels on the performance of websocket messages because of the necessity of databases. Therefore for multiplayer and high numbers of single player game connections, we migrate to Node.js to support asynchronous functions more efficiently.