1 import { db } from './lib/db';
2 import {Player, maxHp} from "../shared/player";
3 import { random } from 'lodash';
4 import { Skills } from '../shared/skills';
5 import {Profession} from 'shared/profession';
6 import {logger} from './lib/logger';
8 export async function loadPlayer(authToken: string): Promise<Player> {
9 const res = await db.first()
12 'profession_levels.level',
13 'profession_levels.exp',
14 db.raw(`coalesce(pp.permissions, '[]'::json) as permissions`)
16 .from<Player>('players')
17 .join('profession_levels', function() {
19 this.on('profession_levels.player_id', '=', 'players.id')
20 this.andOn('profession_levels.profession', '=', 'players.profession')
24 db.raw(`(select json_agg(pp.permission) as permissions, pp.player_id from player_permissions pp group by pp.player_id) pp`),
25 'pp.player_id','=', 'players.id'
28 'players.id': authToken
34 export async function findPlayerByUsername(username: string): Promise<Player> {
35 const res = await db.first()
38 'profession_levels.level',
39 'profession_levels.exp',
40 db.raw(`coalesce(pp.permissions, '[]'::json) as permissions`)
42 .from<Player>('players')
43 .join('profession_levels', function() {
45 this.on('profession_levels.player_id', '=', 'players.id')
46 this.andOn('profession_levels.profession', '=', 'players.profession')
50 db.raw(`(select json_agg(pp.permission) as permissions, pp.player_id from player_permissions pp group by pp.player_id) pp`),
51 'pp.player_id','=', 'players.id'
54 'players.username': username
60 export async function createPlayer(): Promise<Player> {
61 const raw: Partial<Player> = {
62 username: `Player${Date.now().toString().substr(-7)}`,
63 strength: random(3, 5),
64 constitution: random(3, 5),
65 dexterity: random(3, 5),
66 intelligence: random(3, 5),
69 raw.hp = maxHp(raw.constitution, 1);
71 const res = await db('players').insert(raw).returning<Player[]>('*');
72 const player = res.pop();
74 logger.log(`Created player [${player.id}]`);
79 const sql = `insert into player_skills (id, player_id) values `;
81 logger.log(`Inserted base skills for [${player.id}]`)
83 Skills.forEach(skill => {
85 values.push(skill.id, player.id);
88 await db.raw(sql + pairs.join(','), values);
90 // create the profession level
91 await db('profession_levels').insert({
93 profession: 'Wanderer',
98 logger.log(`Inserted base profession level [${player.id}]`);
104 export async function updatePlayer(player: Player) {
106 db('players').where({
111 strength: player.strength,
112 constitution: player.constitution,
113 dexterity: player.dexterity,
114 intelligence: player.intelligence,
115 stat_points: player.stat_points,
118 db('profession_levels').where({
119 player_id: player.id,
120 profession: player.profession
128 export async function movePlayer(cityId: number, playerId: string) {
129 return db('players').where({
131 }).update({city_id: cityId})
134 export async function changeProfession(player_id: string, newProfession: Profession): Promise<{level: number, exp: number}> {
138 await db('profession_levels').insert({
140 profession: newProfession,
147 const res = await db.first().select('*').from('profession_levels').where({
149 profession: newProfession
154 // profession already exists, wahtever yo!
157 await db('players').where({
159 }).update({ profession: newProfession });