Database Collections

This page documents the collections (tables) that Tworld manages in MongoDB.

config
General server configuration and miscellaneous values.


 * _id
 * key (indexed)
 * val (ad-hoc format)

keys are...
 * dbversion: 6 (for this description)
 * playerfields: contains {desc, pronoun} copied to new *players
 * globalscopeid: scid of the single global scope (from *scopes)
 * startworldid: wid of the starting (solo) world (from *worlds)
 * startworldloc: loc key of start location in startworld
 * firstportal: {wid, scid, locid} for a player's first portlist entry (if absent, startworld is used)
 * noregistration: if true, player registration is not allowed
 * nologin: if true, player login is not allowed (except for admin accounts)
 * lastactive: the timestamp of the last time the tworld server was known to be running

localize
Server text customization. This is where we replace the generic Tworld text with Myst-specific flavor. This table also supports internationalization, although Seltani does not have any yet.


 * _id
 * key
 * lang (None for all-language default)
 * client (optional, True if relayed to client)
 * val
 * (no indexes, because we're going to load this stuff up at launch time) (but logically, it's a compound index on key, lang)

sessions
Web sessions. When a player signs in on the web site, they get a ten-day cookie which matches the sessionid. (Refreshed weekly as long as they're connected to the game.)


 * _id
 * sid: session id (generated by create_session) (indexed, unique)
 * uid: _id from *players
 * email: from *players
 * name: from *players
 * ipaddr: request.remote_ip
 * starttime: time signed in
 * refreshtime: time that cookie was last refreshed
 * guest: True if this is a guest account (optional)

players
Player account records.


 * _id: uid
 * email: fixed at signup time (indexed, unique)
 * name: changeable by player (indexed, unique)
 * namekey: sluggified name (indexed; not unique, although we try to keep it unique)
 * admin: True for the admin (optional)
 * build: True if the player has build permission (optional)
 * askbuild: True if the player can request build permission via web form (optional)
 * guest: True if this is a guest account (optional) (indexed, sparse index)
 * guestsession: id from *sessions, if the guest account is logged in (optional)
 * pwsalt: added to password before hashing (generated by create_player)
 * password: hash of "pwsalt:password"
 * createtime: time signed up
 * scid: personal scope in *scopes
 * plistid: personal portlist (booklet) in *portlists
 * desc: as: (name is...) "an ordinary explorer."
 * pronoun: "he", "she", "it", "they", "name"

playstate
Current location of each player.


 * _id: uid (same as *players)
 * iid: _id from *instances
 * locid: _id from *locations
 * focus: symbol name or None
 * lastmoved: timestamp of last locale or world (not focus) change (optional)
 * lastlocid: locid of location moved from, or null if ported in (optional)
 * portto: { wid, scid, locid } (only present during porting, otherwise None)
 * (compound index on iid, locid) (nonunique)

playprefs
Player UI preferences.


 * _id
 * uid (indexed, not unique; used for aggregation for play.html template)
 * key
 * val (ad-hoc format)
 * (compound index on uid, key) (unique)

pwrecover
Password recovery requests ("I forgot my password").


 * _id: uid (same as *players)
 * key: random string (for URL) (indexed, unique)
 * createtime: time requested

worlds
Master records for worlds.


 * _id: wid
 * creator: uid (_id of player who built it)
 * name: as "Old District" (not necessarily unique!)
 * createtime: time created
 * copyable: bool
 * instancing: "solo", "shared", "standard"

locations
Locations within a world.


 * _id: locid
 * wid: _id from *worlds
 * key: py-key-compatible (as "ferry_dock") (must not be empty!)
 * name: as "Ferry Dock"
 * (compound index on wid, key) (unique)

scopes
Scopes (one global; one per player; eventually group scopes as well).


 * _id: scid
 * type: "pers", "glob", "grp"
 * group: name of group (only present for "grp") (not necessarily unique!)
 * uid: player of personal (only present for "pers")

scopeaccess
A player defaults to visitor for most scopes.


 * _id
 * uid: player
 * scid: scope
 * level: 0 (banned), 1 (visitor), 2 (member), 3 (owner), 4 (founder)
 * (compound index on uid, scid) (unique)

instances
Instances of a world.


 * _id: iid
 * wid: world
 * scid: scope
 * minaccess: minimum (scope) access level to enter (optional, defaults to visitor)
 * lastawake: None/absent if the instance has never been awake; True if it is currently awake; or a timestamp of the last time it slept
 * (compound index on wid, scid) (unique)

worldprop
Definitions of world-location properties. (As defined by the creator.)


 * _id
 * wid: _id from *worlds
 * locid: _id from *locations, or null for realm-wide
 * key (py-key-compatible)
 * val: ...
 * (compound index on wid, locid, key) (unique)

instanceprop
Instance values of location properties. Only exist if changed from the world def.


 * _id
 * iid: _id from *instances
 * locid: _id from *locations, or null for realm-wide
 * key (py-key-compatible)
 * val: ...
 * (compound index on iid, locid, key) (unique)

wplayerprop
Definitions of world-player properties.


 * _id
 * wid: _id from *worlds
 * uid: _id from *players, or null for all-players
 * key (py-key-compatible)
 * val: ...
 * (compound index on wid, uid, key) (unique)

iplayerprop
Instance values of player properties.


 * _id
 * iid: _id from *instances
 * uid: _id from *players, or null for all-players
 * key (py-key-compatible)
 * val: ...
 * (compound index on iid, uid, key) (unique)

trashprop
Discarded (world) properties. Kept for 24 hours.


 * _id
 * wid: _id from *worlds (indexed)
 * changed: date added (indexed)
 * origtype: 'worldprop' or 'wplayerprop'
 * locid: _id from *locations, or null for realm-wide (only for 'worldprop')
 * uid: _id from *players, or null for all-players (only for 'wplayerprop')
 * key (py-key-compatible)
 * val: ...

portlists
One for each player (the booklet); one for each bookshelf built in a world.


 * _id: plistid
 * type: "pers", "world"
 * uid: player owning this portlist (optional, only if personal)
 * wid: world containing this portlist (optional, only if world) (sparse index)
 * external: bool (optional; true if this portlist permits portal URLs)
 * key: (py-key-compatible) (optional, only if world)

portals
Every portal (linking book) is contained in a portlist (booklet or bookshelf).


 * _id: portid
 * plistid: portlist that the portal is in
 * iid: instance of portlist (will be None for world portals, personal portals) (must be an instance of the portlist's inwid for instance portals)
 * listpos: float (may be negative!) (optional, default 0)
 * preferred: bool (optional, only if in a player's portlist)
 * wid: world that the portal goes to
 * scid: scope that the portal goes to (or strings 'personal', 'global', 'same')
 * locid: location that the portal goes to
 * (compound index on plistid, iid)