You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

269 lines
6.5 KiB

import sqlite3 from 'sqlite3'
import ErrorType from '../error/types.error.js'
import serverConfig from '../configuration/server.config.js'
sqlite3.verbose()
const tableName = 'Roster'
const historyTableName = 'Histories'
class Roster {
constructor(options = {}) {
if (!options.name || !options.classe || !options.role) {
throw new Error('Member has to have a name, a class and a role')
}
this.name = options.name
this.classe = options.classe
this.role = options.role
}
static findAll() {
return new Promise((resolve, reject) => {
const db = openDB()
db.serialize(() => {
db.all(`SELECT * FROM ${tableName} order by name asc`, (err, rosters) => {
if (err) reject(new Error(ErrorType.TECHNICAL_UNKNOWN))
else {
const array = [];
for (const roster of rosters) {
array.push(createRosterFromDB(roster))
}
resolve(array);
}
})
closeDB(db)
})
})
}
static getBisData(raidDate) {
return new Promise((resolve, reject) => {
const db = openDB()
db.serialize(() => {
const query = `
SELECT
${tableName}.name,
${tableName}.classe,
'[' || GROUP_CONCAT(
'{' ||
'"equipLoc": "' || IFNULL(${historyTableName}.equipLoc, '') || '", ' ||
'"response": "' || IFNULL(${historyTableName}.response, '') || '", ' ||
'"instance": "' || IFNULL(${historyTableName}.instance, '') || '", ' ||
'"itemName": "' || IFNULL(${historyTableName}.itemName, '') || '"' ||
'}'
) || ']' AS historyData
FROM
${tableName}
LEFT JOIN
${historyTableName} ON ${tableName}.name = ${historyTableName}.name
WHERE ${historyTableName}.response = 'Bis' and ${historyTableName}.fullDate >= ${raidDate}
GROUP BY
${tableName}.name, ${tableName}.classe;
`
db.all(query, (err, result) => {
if (err) reject(new Error(ErrorType.TECHNICAL_UNKNOWN))
else {
const array = [];
for (const res of result) {
array.push(createBisFromDB(res))
}
resolve(array);
}
})
closeDB(db)
})
})
}
static delete(name) {
return new Promise((resolve, reject) => {
const db = openDB();
db.serialize(() => {
db.run(`DELETE FROM ${tableName} WHERE name = '${name}'`, (err, roster) => {
if (err) reject(new Error(ErrorType.TECHNICAL_UNKNOWN))
else resolve(roster)
})
})
closeDB(db)
})
}
async insert() {
return new Promise((resolve, reject) => {
const values = `'${this.name}', '${this.classe}', '${this.role}'`;
const db = openDB();
db.serialize(() => {
db.run(`INSERT INTO ${tableName} (name, classe, role) VALUES (${values})`, err => {
if (err) reject(new Error(ErrorType.TECHNICAL_UNKNOWN))
else resolve()
})
})
closeDB(db)
})
}
toJson() {
return {
name: this.name,
classe: this.classe,
role: this.role
}
}
}
export default Roster
function openDB() {
const env = process.env.NODE_ENV || 'development'
return new sqlite3.Database(serverConfig.database[env].path, err => {
if (err) throw new Error(err)
})
}
function closeDB(db) {
db.close(err => {
if (err) throw new Error(err)
})
}
function createRosterFromDB(dbRoster) {
return new Roster({
name: dbRoster.name,
classe: dbRoster.classe,
role: dbRoster.role
})
}
function createBisFromDB(res) {
const data = {
tete: 0,
cou: 0,
epaules: 0,
dos: 0,
torse: 0,
poignets: 0,
mains: 0,
taille: 0,
jambes: 0,
pied: 0,
doigt: 0,
bijou: 0,
arme: 0,
mainGauche: 0,
relique: 0
}
let firestones = 0
let tokenHM = 0
let totalBIS = 0
const histoData = JSON.parse(res.historyData)
for (const hist of histoData) {
if (hist.itemName && hist.equipLoc) {
switch (hist.equipLoc) {
case 'Tête':
data.tete += 1
totalBIS += 1
break
case 'Cou':
data.cou += 1
totalBIS += 1
break
case 'Épaule':
data.epaules += 1
totalBIS += 1
break
case 'Dos':
data.dos += 1
totalBIS += 1
break
case 'Torse':
data.torse += 1
totalBIS += 1
break
case 'Poignets':
data.poignets += 1
totalBIS += 1
break
case 'Mains':
data.mains += 1
totalBIS += 1
break
case 'Taille':
data.taille += 1
totalBIS += 1
break
case 'Jambes':
data.jambes += 1
totalBIS += 1
break
case 'Pieds':
data.pied += 1
totalBIS += 1
break
case 'Doigt':
data.doigt += 1
totalBIS += 1
break
case 'Bijou':
data.bijou += 1
totalBIS += 1
break
case 'À une main':
case 'Deux mains':
case 'Main droite':
data.arme += 1
totalBIS += 1
break
case 'Tenu(e) en main gauche':
case 'Main gauche':
data.mainGauche += 1
totalBIS += 1
break
case 'À distance':
case 'Relique':
data.relique += 1
totalBIS += 1
break
}
}
if (hist.equipLoc === '') {
switch (true) {
case hist.itemName.includes('Gantelets'):
data.mains += 1
tokenHM += 1
break
case hist.itemName.includes('Jambières'):
data.jambes += 1
tokenHM += 1
break
case hist.itemName.includes('Couronne') || hist.itemName.includes('Heaume'):
data.tete += 1
if (hist.itemName.includes('Couronne')) tokenHM += 1
break
case hist.itemName.includes('Epaulières') || hist.itemName.includes('Mantelet'):
data.epaules += 1
if (hist.itemName.includes('Epaulières')) tokenHM += 1
break
case hist.itemName.includes('Plastron'):
data.torse += 1
tokenHM += 1
break
case hist.itemName.includes('Essence du lugubre'):
data.tete += 1
tokenHM += 1
break
case hist.itemName.includes('Pierre de feu cristallisée'):
firestones += 1
break
}
totalBIS += 1
}
}
return {
name: res.name,
classe: res.classe,
tokenHM,
totalBIS,
firestones,
data
}
}