assets | ||
assets-source | ||
favicons | ||
public | ||
src | ||
views | ||
.gitignore | ||
CHANGELOG.md | ||
cli.js | ||
config-template.json | ||
gulpfile.js | ||
LICENSE_ART.txt | ||
LICENSE_CODE.txt | ||
LICENSE_MUSIC.txt | ||
package.json | ||
pony-town-offline.js | ||
pony-town.js | ||
README.md | ||
tsconfig-aot-es.json | ||
tsconfig-aot.json | ||
tsconfig.json | ||
tslint.json | ||
webpack.common.js | ||
webpack.dev.js | ||
webpack.prod.js | ||
workbox-config.js |
Pony Town
A game of ponies building a town
Prerequisites
- Node.js (version 9)
- gulp
npm install -g gulp
- MongoDB: download link and installation instructions
- ImageMagick (optional, required for generating preview gifs in animation tool)
Installation
npm install
Setting up Database
- Install MongoDB
- Start
mongo
from command line (you may need to go toC:\Program Files\MongoDB\Server\4.0\bin
path on windows to run the command) - Type
use your_database_name
to create database - Type
db.new_collection.insert({ some_key: "some_value" })
to initialize database - Type
to create database user.db.createUser( { user: "your_username", pwd: "your_password", roles: [ { role: "readWrite", db: "your_database_name" } ] } )
- Type
quit()
to exit mongo
Setting up OAuth keys
Get OAuth keys for authentication platform of your choice (github, google, twitter, facebook, vkontakte, patreon)
Github
- Go to https://github.com/settings/developers create new OAuth app.
- Set authorization callback URL to
http://<your domain>/auth/github/callback
orhttp://localhost:8090/auth/github/callback
for localhost server. - Add this to
oauth
field in yourconfig.json
"github": {
"clientID": "<your_client_id>",
"clientSecret": "<your_client_secret>"
}
- Go to https://developer.twitter.com/en/apps create new app.
- Set callback URL to
http://<your domain>/auth/twitter/callback
orhttp://localhost:8090/auth/twitter/callback
for localhost server. - Add this to
oauth
field in yourconfig.json
"twitter": {
"consumerKey": "<your_consumer_key>",
"consumerSecret": "<your_consumer_secret>"
}
- Go to https://console.developers.google.com/apis/dashboard create new project from dropdown at the top, go to credentials and create new entry.
- Add to Authorized JavaScript origins
http://<your domain>
orhttp://localhost:8090/
for localhost server. - Add to Authorized redirect URIs
http://<your domain>/auth/google/callback
orhttp://localhost:8090/auth/google/callback
for localhost server. - Add this to
oauth
field in yourconfig.json
"google": {
"clientID": "<your_client_id>",
"clientSecret": "<your_client_secret>"
}
- Go to https://developers.facebook.com/apps/ add a new app.
- Add "Facebook Login" product to your app
- Enable "Web OAuth Login"
- Add
https://<your domain>/auth/facebook/callback
to Valid OAuth Redirect URIs - Add this to
oauth
field in yourconfig.json
(You can find App ID and App Secret in Settings > Basic section)
"facebook": {
"clientID": "<your_app_id>",
"clientSecret": "<your_app_secret>",
"graphApiVersion": "v3.1"
}
VKontakte
- Go to https://vk.com/apps?act=manage and create new app
- Set Authorized redirect URI to
http://<your domain>/auth/vkontakte/callback
orhttp://localhost:8090/auth/vkontakte/callback
for localhost server. - Add this to
oauth
field in yourconfig.json
"vkontakte": {
"clientID": "<your_app_id>",
"clientSecret": "<secure_key>"
},
Other
If you want to add other sign-in methods you need to find appropriate passport package and add it in src/ts/server/oauth.ts
and add correct entry in config.json
.
Configuration
Add config.json
file in root directory with following content. You can use config-template.json
as a starting point for your own config. (do not include comments in your config.json
file)
{
"title": "Pony Town",
"twitterLink": "https://twitter.com/<twitter_name>", // optional
"contactEmail": "<your_contact_email>",
"port": 8090,
"adminPort": 8091,
"host": "http://localhost:8090/",
"local": "localhost:8090",
"adminLocal": "localhost:8091",
"secret": "<some_random_string_here>",
"token": "<some_random_string_here>",
"db": "mongodb://<username>:<password>@localhost:27017/<database_name>", // use values you used when setting up database
"analytics": { // optional google analytics
"trackingID": "<tracking_id>"
},
"facebookAppId": "<facebook_id>", // optional facebook app link
"assetsPath": "<path_to_graphics_assets>", // optional, for asset generation
"oauth": {
"google": {
"clientID": "<CLIENT_ID_HERE>",
"clientSecret": "<CLIENT_SECRET_HERE>"
}
// other oauth entries here
},
"servers": [
{
"id": "dev",
"port": 8090,
"path": "/s00/ws",
"local": "localhost:8090",
"name": "Dev server",
"desc": "Development server",
"flag": "test", // optional flag ("test", "star" or space separated list of country flags)
"flags": { // optional feature flags
"test": true, // test server
"editor": true, // in-game editor
},
"alert": "18+", // optional 18+ alert (also blocks underage players)
},
]
}
Running
Production environment
npm run build
npm start
Adding/removing roles
node cli.js --addrole <account_id> <role> # roles: superadmin, admin, mod, dev
node cli.js --removerole <account_id> <role>
To setup superadmin role use following command
node cli.js --addrole <your_account_id> superadmin
Admin panel is accessible at <base_url>/admin/
(requires admin or superadmin role to access)
Tools are accessible at <base_url>/tools/
(only available in dev mode or when started with --tools flag)
Starting as multiple processes
node pony-town.js --login # login server
node pony-town.js --game main # game server 1 ('main' has to match id from config.json)
node pony-town.js --game safe # game server 2 ('safe' has to match id from config.json)
node pony-town.js --admin --standaloneadmin # admin server
For these to work on the same URL, paths to game servers and admin server need to be bound to correct ports, using http proxy.
It is recommended to run processes with larger memory pool for large user bases (especially admin and game processes), example:
node --max_old_space_size=8192 pony-town.js --game main
Beta environment (with dev tools and in-development features)
npm run build-beta
node pony-town.js --login --admin --game --tools --beta
Running in development
npm run ts-watch # terminal 1
npm run wds # terminal 2
gulp dev # terminal 3
gulp test # terminal 4 (optional)
gulp dev --sprites # run with generation of sprite sheets (use src/ts/tools/trigger.txt to trigger sprite generation without restarting gulp)
gulp dev --test # run with tests
gulp dev --coverage # run with tests and code coverage
Customization
package.json
- settings for title and description of the websiteassets/images
- logos and team avatarspublic/images
- additional logospublic
- privacy policy and terms of servicefavicons
- iconssrc/ts/common/constants.ts
- global settingssrc/ts/server/maps/*
- maps configuration and setupsrc/ts/server/start.ts
- world setupsrc/ts/components/services/audio.ts
- adding/removing sound trackssrc/ts/client/credits
- credits and contributorssrc/style/partials/_variables.scss
- page style configuration
Custom map introduction
src/ts/server/start.ts:35
- adding custom map to the worldsrc/ts/server/map/customMap.ts
- commented introduction to customizing maps