Skip to content

2. Sync Data

Stuyk edited this page Jul 2, 2023 · 3 revisions

When you have an account or a character you want to bind to a player's session that is when you use crc.data.sync.

This allows for values to easily be set and get.

This means that you can set values such as cash, bank, appearance, etc. to the database for your player.

You usually want to sync a player after they have logged in.

  • This can be after login
  • This can also be after login, and after selecting a character

You should only call sync on a player one time.

Allowed Entities

Pretty much anything that uses alt.Entity can be auto-synchronized with updates to the database.

  • alt.Player
  • alt.Vehicle
  • alt.Ped
  • alt.Colshape
  • alt.Checkpoint
  • etc.

Usage

crc.data.sync(player, documentID, 'mytable');

Example

The example below shows how to login / register and also apply data synchronization for a single account.

import * as crc from '@stuyk/cross-resource-cache';

interface Account {
    _id?: string;
    username: string;
    password: string;
}

const COLLECTION_NAME = 'account';

async function createAccount(username: string, password: string) {
    // Protected plain text password in-database
    const passwordHash = crc.utility.password.create(password);

    // This creates a new document for the username and uses the hashed password.
    const documentID = await crc.database.create<Account>(
        { id: data.id, username, password: passwordHash },
        COLLECTION_NAME
    );

    return await crc.database.get<I.Account>({ _id: documentID }, COLLECTION_NAME);
}

async function loginOrRegister(player: alt.Player, username: string, password: string) {
    // Lookup account by username
    let account: Account = await crc.database.get<Account>({ username }, COLLECTION_NAME);
    if (!account) {
      account = await createAccount(username, password);
    }
    
    // Check if the password matches, if not cancel
    if (!crc.utility.password.check(password, account.password)) {
       // Add cancel logic here...
       return;
    }


    // Synchronize the player to use this single-account for all database writes for this player
    crc.data.sync(player, account._id, COLLECTION_NAME);
}
Clone this wiki locally