Je travaille actuellement sur la création de comptes joueurs, la connexion au serveur, la création de personnages et la sélection des personnages avant l’entrée dans le jeu.
J’utilise une API Noje.js (listing ci-dessous des 4 routes qui nous concernent) vers une DB Maria unreal_db dont voici les tables qui concernent cette part du chantier, tu me demanderas des précisions sur les types des données si tu en as besoin:
1° accounts: id, username, password, email, created_at
2° characters: id, account_id, name, sex, icon_id, last_played
J’ai créé un WBP_Login widget qui pour le moment ne contient des textes éditables que pour le Username et le Password. Je voudrais aujourd’hui ajouter la fonctionnalité de créer un compte avant de passer à l’étape de création/sélection de personnages. Le code en BP de connexion VaRest existe et fonctionne.
Tu as des question à me poser avant que nous commencions ?
// — ACCOUNT MANAGEMENT —
// 1. Register
app.post(‘/account/register’, async (req, res) => {
const { username, password, email } = req.body;
try {
const conn = await pool.getConnection();
const check = await conn.query(“SELECT id FROM accounts WHERE username = ?”, [username]);
if (check.length > 0) {
conn.release();
return res.json({ status: “Error”, message: “Username already taken” });
}
const result = await conn.query(“INSERT INTO accounts (username, password, email) VALUES (?, ?, ?)”, [username, password, email]);
conn.release();
res.json({ status: “Success”, accountId: Number(result.insertId) });
} catch (err) {
res.status(500).json({ status: “Error”, message: err.message });
}
});
// 2. Login
app.post(‘/account/login’, async (req, res) => {
const { username, password } = req.body;
try {
const conn = await pool.getConnection();
const rows = await conn.query(“SELECT id, password FROM accounts WHERE username = ?”, [username]);
conn.release();
if (rows.length > 0 && rows[0].password === password) {
res.json({ status: “Success”, accountId: rows[0].id });
} else {
res.json({ status: “Error”, message: “Invalid credentials” });
}
} catch (err) {
res.status(500).json({ status: “Error”, message: err.message });
}
});
// — CHARACTER MANAGEMENT —
// 3. Create Character
app.post(‘/char/create’, async (req, res) => {
const { accountId, charName, sex, iconId } = req.body;
try {
const conn = await pool.getConnection();
const check = await conn.query(“SELECT id FROM characters WHERE name = ?”, [charName]);
if (check.length > 0) {
conn.release();
return res.json({ status: “Error”, message: “Character name already taken” });
}
const result = await conn.query(
“INSERT INTO characters (account_id, name, sex, icon_id) VALUES (?, ?, ?, ?)”,
[accountId, charName, sex, iconId]
);
conn.release();
res.json({ status: “Success”, characterId: Number(result.insertId) });
} catch (err) {
res.status(500).json({ status: “Error”, message: err.message });
}
});
// 4. List Characters
app.post(‘/char/list’, async (req, res) => {
const { accountId } = req.body;
try {
const conn = await pool.getConnection();
const rows = await conn.query(
“SELECT id, name, sex, icon_id, last_played FROM characters WHERE account_id = ? ORDER BY last_played DESC”,
[accountId]
);
conn.release();
res.json({ status: “Success”, characters: rows });
} catch (err) {
res.status(500).json({ status: “Error”, message: err.message });
}
});