Skip to content
Snippets Groups Projects
Commit 69a0f29d authored by marpana's avatar marpana
Browse files
parents 4929382e 3cf4feae
No related branches found
No related tags found
No related merge requests found
Showing
with 14048 additions and 0 deletions
# Created by https://www.toptal.com/developers/gitignore/api/node
# Edit at https://www.toptal.com/developers/gitignore?templates=node
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
#variables
PORT=4000
RANGOMM=50
SUBIDA_RANGO=50
MODOCERO=0
MODOUNO=1
MODODOS=2
#rutas
HISTORIALPARTIDAS = "/home/mariopanpal/Escritorio/p.csv"
POBLARPARTIDAS = "/home/mariopanpal/Escritorio/1000/1000partidas.csv"
GETHISTORIAL = "http://localhost:3000/getHistorial"
#bbdd
USUARIO = mpanadero
PASS =Avenciamongo99
DBNAME =BD_COP
#Variables Glicko
Q = 0.00575646273
C = 34.6
PTOSELODEFAULT = 1500
RDDEFAULT = 350
PERIODOSSINJUGARDEFAULT = 0
\ No newline at end of file
const express = require('express')
bodyParser = require("body-parser")
const axios = require('axios');
const cron = require('node-cron');
const app = express()
require('dotenv').config()
const ListaJugadores = require ('./models/lista_jugadores')
const HistorialPartidas = require ('./models/historial_partidas')
const mongoose = require('mongoose');
var fechaInicioPeriodo = new Date()
//Conexión a la base de datos
const user = process.env.USUARIO
const pass = process.env.PASS
const dbname = process.env.DBNAME
const uri = `mongodb+srv://${user}:${pass}@cluster0.hsgzw.mongodb.net/${dbname}?retryWrites=true&w=majority`
mongoose.connect(uri,
{useNewUrlParser: true, useUnifiedTopology: true, autoIndex: true}
)
.then(() => console.log("Conectamos con la base de datos"))
.catch(e => console.log(e))
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
/**
* Función que calcula el valor de la variable Glicko g
* @param {number} RDi - Valor de RD del rival
* @returns {number} - El resultado de g tras su cálculo
*/
function g (RDi){
var result = 1/(Math.sqrt(1+(3*Math.pow(parseFloat(process.env.Q),2)*(Math.pow(RDi,2)))/(Math.pow(Math.PI,2))))
return result
}
/**
* Función que calcula el valor de la variable Glicko e
* @param {number} r - Puntación ELO del jugador a calcular
* @param {number} ro - Puntación ELO del rival
* @param {number} g - Resultado de la variable Glicko g tras su cálculo
* @returns {number} - El resultado de e tras su cálculo
*/
function e (r, ro, g){
var result = 1/(1+(Math.pow(10,((g*(r-ro))/(-400)))))
return result
}
/**
* Función que calcula el valor de la variable Glicko d
* @param {[JSON]} datos_rivales - Array que contiene los datos de los rivales a los que se ha enfrentado un jugador
* @param {number} r - Puntación ELO del jugador a calcular
* @returns {number} - El resultado de d tras su cálculo
*/
function d (datos_rivales, r){
var sum_d = 0
//Sumatorio para la variable Glicko d
var ri
var rdi
for (var x = 0; x < datos_rivales.length; x++){
ri = parseInt(datos_rivales[x].ptosELO,10) //Puntuación de cada rival
rdi = parseInt(datos_rivales[x].RD,10) //RD de cada rival
sum_d = sum_d + ((Math.pow(g(rdi),2))*(e(r,ri, g(rdi)))*(1-(e(r,ri, g(rdi)))))
}
var d = 1/(Math.pow(parseFloat(process.env.Q),2)*sum_d)
return d
}
/**
* Función que calcula el resultado del sumatorio de la fórmula de cálculo de nuevas puntuaciones ELO para un jugador
* @param {[JSON]} datos_rivales - Array que contiene los datos de los rivales a los que se ha enfrentado un jugador
* @param {[JSON]} buscaPartida - Array que contiene el id de las partidas disputadas por un jugador y el resultado conseguido en cada una
* @param {*} r - Puntación ELO del jugador a calcular
* @returns {number} - Resultado del sumatorio de la fórmula de cálculo de nuevas puntuaciones ELO
*/
function sum (datos_rivales, buscaPartida, r){
var sum_total = 0
//Sumatorio para la obtención de los ptosELO
var ri
var rdi
var resul
for (var y = 0; y < datos_rivales.length; y++){
ri = parseInt(datos_rivales[y].ptosELO,10)
rdi = parseInt(datos_rivales[y].RD,10)
resul = buscaPartida[y].resultado
sum_total = sum_total + (Math.pow(g(rdi),2)*(resul - e(r,ri, g(rdi))))
}
return sum_total
}
/**
* Función que suma 1 al atributo "PeriodosSinJugar" a los jugadores que no han disputado ninguna partida durante el periodo
* @param {[JSON]} nuevos_datos_totales - Array que contiene los nuevos resultados para los jugadores después del cálculo total
* @param {number} indiceModo - Variable que especifica el modo de juego sobre el que se están realizando los cálculos
* @param {[JSON]} jugadores_actualizar - Array que contiene los id de los jugadores que han disputado al menos una partida durante el periodo para ser actualizados
*/
async function sumarUnoPeriodosSinJugar(nuevos_datos_totales, indiceModo, jugadores_actualizar){
var jugadoresNuevosDatos = await ListaJugadores.find({id_modo : indiceModo})
for (var i = 0; i < jugadoresNuevosDatos.length; i++){
if(!jugadores_actualizar.includes(jugadoresNuevosDatos[i].id_jugador)){
var nuevos_datos = {
"id_jugador" : jugadoresNuevosDatos[i].id_jugador,
"ptosELO" : jugadoresNuevosDatos[i].ptosELO,
"RD" : jugadoresNuevosDatos[i].RD,
"periodosSinJugar": parseInt(jugadoresNuevosDatos[i].periodosSinJugar) + 1,
"id_modo": indiceModo
}
nuevos_datos_totales.push(nuevos_datos)
}
}
}
/**
* Función que realiza una petición al servidor intermedio solicitando el historial de partidas almacenado durante el periodo para el cálculo de puntuaciones
* @returns {[JSON]} - Array con el historial de partidas solicitado al Servidor intermedio
*/
async function getHistorial () {
var envio = {
"fecha": fechaInicioPeriodo
}
return axios.post('http://localhost:3000/getHistorial', envio)
.then(response => {
return response.data
})
.catch(error => {
console.log(error);
return Promise.reject(error);
});
}
/**
* Función que engloba el proceso de cálculo de las nuevas puntuaciones para este periodo
*/
async function calculo (){
var nuevos_datos_totales = []
var datos_rivales
var ptosELOSum
var RDSum
var datos_rival
var ptosELOMedia
var RDMedia
var datos_jugador
for (var indiceModo = 0; indiceModo < 3; indiceModo++){ //Se calculan las nuevas puntuaciones para cada modo
var inicioRiv = process.hrtime()
var jugadores_actualizar = await HistorialPartidas.find({$and:[{id_modo : indiceModo},{finalizada:1}]},{id_jugador : 1}).distinct("id_jugador")
for (var i = 0; i < jugadores_actualizar.length; i++){ //Proceso de cálculo de cada jugador
datos_rivales = []
var buscaPartida = await HistorialPartidas.find({$and:[{finalizada:1},{id_jugador : jugadores_actualizar[i]},{id_modo : indiceModo}]}, {id_partida:1, resultado:2})
for (var j = 0; j < buscaPartida.length; j++){ //Se recorre cada partida para obtener los datos de los rivales
var buscaRivalesAux = await HistorialPartidas.find({$and:[{finalizada:1},{id_modo : indiceModo},{id_partida : buscaPartida[j].id_partida}, {id_jugador:{$ne: jugadores_actualizar[i]}}]}, {id_jugador:1})
ptosELOSum = 0
RDSum = 0
for (var k = 0; k < buscaRivalesAux.length; k++){ //Se recorre cada rival de una partida acumulando sus puntos ELO y RD
datos_rival = await ListaJugadores.find({$and:[{id_modo: indiceModo}, {id_jugador: buscaRivalesAux[k].id_jugador}]},{ptosELO: 1, RD: 1})
ptosELOSum = ptosELOSum + parseInt(datos_rival[0].ptosELO)
RDSum = RDSum + parseInt(datos_rival[0].RD)
}
//Se calcula la media de los datos de los rivales
ptosELOMedia = ptosELOSum / buscaRivalesAux.length
RDMedia = RDSum / buscaRivalesAux.length
var rivalDef = {
"ptosELO": ptosELOMedia,
"RD": RDMedia
}
datos_rivales.push(rivalDef)
}
datos_jugador = await ListaJugadores.find({$and:[{id_modo: indiceModo}, {id_jugador: jugadores_actualizar[i]}]})
//Fórmula Glicko 1 -> RD estimativo
var nuevoRD = Math.min(Math.sqrt(Math.pow(datos_jugador.RD,2) + Math.pow(parseFloat(process.env.C),2) * datos_jugador.periodos_sin_jugar),process.env.RDDEFAULT)
var r = parseInt(datos_jugador[0].ptosELO) //ptos ELO del jugador
var rd = parseInt(datos_jugador[0].RD) //RD del jugador
//Fórmula 2 Glicko -> ptosELO:
var nueva_puntuacion = parseInt(r + (parseFloat(process.env.Q)/((1/Math.pow(rd,2))+(1/d(datos_rivales,r)))*sum(datos_rivales,buscaPartida,r)))
//Fórmula 3 Glicko -> RD definitivo tras ajuste
var nuevo_rd = parseInt(Math.sqrt(Math.pow(((1/Math.pow(nuevoRD,2))+(1/Math.pow(d(datos_rivales,r),2))),(-1))))
var nuevos_datos = {
"id_jugador" : datos_jugador[0].id_jugador,
"ptosELO" : nueva_puntuacion,
"RD" : nuevo_rd,
"periodosSinJugar": process.env.PERIODOSSINJUGARDEFAULT,
"id_modo": indiceModo
}
nuevos_datos_totales.push(nuevos_datos)
}
var finalRiv = process.hrtime(inicioRiv)
console.log("tiempo de jugador:", finalRiv)
var inicioAct = process.hrtime()
//Se suma 1 a los periodos sin jugar de los jugadores que no han disputado ninguan partida durante el periodo
sumarUnoPeriodosSinJugar(nuevos_datos_totales, indiceModo, jugadores_actualizar)
var finalAct = process.hrtime(inicioAct)
console.log("tiempo de actualizacion +1:", finalAct)
}
await HistorialPartidas.deleteMany()
await ListaJugadores.deleteMany()
ListaJugadores.insertMany(nuevos_datos_totales)
fechaInicioPeriodo = new Date()
console.log(fechaInicioPeriodo)
}
//routes
app.use("/buscarPartida", require("./routes/buscarPartida"))
app.use("/poblarpartidas", require("./poblarPartidas"))
app.use("/poblarjugadores", require("./routes/poblarJugadores"))
app.use("/registrarjugador", require("./routes/registrarJugador"))
/**
* Job que se activa al final de un periodo y calcula las nuevas puntuaciones para los jugadores que han disputado al menos una partida.
*/
cron.schedule('42 * * * *', async function() {
HistorialPartidas.deleteMany()
var inicio = process.hrtime()
var partidasTotales
getHistorial().then(resp =>{
partidasTotales = resp
HistorialPartidas.insertMany(partidasTotales, (err, result) => {
if (err) console.log(err);
calculo()
});
})
})
/**
* Método de escucha del servidor en el puerto 4000
*/
app.listen(process.env.PORT, (req,res) => {
console.log(`Estamos en el puerto ${process.env.PORT}`)
})
module.exports = app
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const historialPartidaSchema = new Schema({
id_partida: String,
id_jugador : String,
resultado: String,
id_modo: String,
finalizada: String,
fecha: Date
},{versionKey:false})
const HistorialPartidas = mongoose.model('historialpartidas', historialPartidaSchema);
module.exports = HistorialPartidas;
\ No newline at end of file
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const listaJugadoresSchema = new Schema({
id_jugador: String,
ptosELO: String,
RD: String,
periodosSinJugar: String,
id_modo: String
},{versionKey:false})
listaJugadoresSchema.index({
id_jugador: 1,
id_modo: 1,
}, {
unique: true,
});
const ListaJugadores = mongoose.model('listajugadores', listaJugadoresSchema);
module.exports = ListaJugadores;
\ No newline at end of file
This diff is collapsed.
{
"name": "servermm",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.27.2",
"csvtojson": "^2.0.10",
"dotenv": "^16.0.0",
"express": "^4.17.3",
"mongoose": "^6.2.9",
"node-cron": "^3.0.0",
"nodemon": "^2.0.15"
},
"devDependencies": {
"jest": "^28.1.0",
"supertest": "^6.2.3"
}
}
const Router = require("express")
const HistorialPartidas= require ('./models/historial_partidas')
const csvtojson = require('csvtojson')
const router = Router()
require('dotenv').config()
/**
* Endpoint para poblar el documento "historial_partidas" de la base de datos por medio de un fichero .csv
*/
router.get("/", async (req,res) => {
await HistorialPartidas.deleteMany()
const fileName = process.env.HISTORIALPARTIDAS;
var arrayToInsert = [];
csvtojson().fromFile(fileName).then(source => {
for (var i = 0; i < source.length; i++) {
var oneRow = {
id_partida: source[i]["id_partida"],
id_jugador: source[i]["id_jugador"],
resultado: source[i]["resultado"],
id_modo: source[i]["id_modo"],
finalizada: source[i]["finalizada"],
fecha: source[i]["fecha"]
};
arrayToInsert.push(oneRow);
}
HistorialPartidas.insertMany(arrayToInsert, (err, result) => {
if (err) console.log(err);
if(result){
console.log("Import CSV into database successfully.");
}
});
});
res.send("Partidas insertadas correctamente")
})
module.exports = router
\ No newline at end of file
const {Router, application} = require("express")
const ListaJugadores = require ('../models/lista_jugadores')
const router = Router()
require('dotenv').config()
/**
* Endpoint con el algoritmo de matchmaking que busca los rivales para el jugador que solicita partida
*/
router.post("/", async (req,res)=>{
var datos_jugador = await ListaJugadores.find({$and:[{id_modo: req.body.id_modo}, {id_jugador: req.body.id_jugador}]})
if (datos_jugador.length == 0){
res.send("No se ha encontrado al jugador que solicita partida en la base de datos")
}else{
var datos_rivales = []
while(datos_rivales.length == 0){
datos_rivales = await ListaJugadores.find({$and:[{id_modo: req.body.id_modo}, {id_jugador: {$ne: req.body.id_jugador}}, {periodosSinJugar: process.env.PERIODOSSINJUGARDEFAULT}, {ptosELO: {$gte: parseInt(datos_jugador[0].ptosELO)-parseInt(process.env.RANGOMM), $lte: parseInt(datos_jugador[0].ptosELO)+parseInt(process.env.RANGOMM)}}]},{id_jugador:1}).limit(parseInt(req.body.max_jugadores))
if (datos_rivales.length == 0){
process.env.RANGOMM = process.env.RANGOMM + process.env.SUBIDA_RANGO
}
}
res.send(datos_rivales)
}
})
module.exports = router
\ No newline at end of file
const {Router, application} = require("express")
const ListaJugadores = require ('../models/lista_jugadores')
const csvtojson = require('csvtojson')
const router = Router()
/**
* Endpoint para poblar el documento "lista_jugadores" de la base de datos por medio de un fichero .csv
*/
router.post("/", async (req,res) => {
//await ListaJugadores.deleteMany()
const fileName = req.body.pathListaJugadores
var arrayToInsert = [];
var mensaje
csvtojson().fromFile(fileName).then(source => {
for (var i = 0; i < source.length; i++) {
var oneRow = {
id_jugador: source[i]["id_jugador"],
ptosELO: source[i]["ptosELO"],
RD: source[i]["RD"],
periodosSinJugar: source[i]["periodosSinJugar"],
id_modo: source[i]["id_modo"],
};
arrayToInsert.push(oneRow);
}
ListaJugadores.insertMany(arrayToInsert, (err, result) => {
if (err.code === 11000) {
console.log("asdjfn")
mensaje = "Error. Documentos duplicados"
res.send(mensaje)
}
if(result){
console.log("Import CSV into database successfully.");
mensaje = "Jugadores insertados correctamente en la base de datos"
res.send(mensaje)
}
});
});
//res.send("a")
})
module.exports = router
\ No newline at end of file
require('dotenv').config()
const {Router, application} = require("express")
const ListaJugadores = require ('../models/lista_jugadores')
const router = Router()
/**
* Endpoint con el flujo para registrar un nuevo jugador en la base de datos
*/
router.post("/", async (req,res) => {
if(req.body.id_modo == undefined || req.body.id_jugador == undefined){
res.status(400).json({"error":"No se han pasado parámetros a la llamada o son nulos"})
}else{
var jugadorExiste = await ListaJugadores.find({$and:[{id_modo: req.body.id_modo}, {id_jugador: req.body.id_jugador}]})
if(jugadorExiste.length == 0){
if(req.body.id_modo == process.env.MODOCERO || req.body.id_modo == process.env.MODOUNO || req.body.id_modo == process.env.MODODOS){
var jugadorNuevo = {
"id_jugador": req.body.id_jugador,
"ptosELO": process.env.PTOSELODEFAULT,
"RD": process.env.RDDEFAULT,
"periodosSinJugar": process.env.PERIODOSSINJUGARDEFAULT,
"id_modo": req.body.id_modo
}
const partida = new ListaJugadores(jugadorNuevo)
await partida.save()
var mensaje = "El jugador se ha registrado correctamente"
}else{
var mensaje = "El modo no existe. Jugador no registrado"
}
}else{
var mensaje = "El jugador a registrar ya existe"
}
}
res.send(mensaje)
})
module.exports = router
\ No newline at end of file
const app = require('../routes/poblarPartidas')
const application = require('../index')
const request = require('supertest')
const mongoose = require('mongoose');
require('dotenv').config()
const ListaJugadores = require('../models/lista_jugadores')
const HistorialPartidas = require('../models/historial_partidas')
jest.setTimeout(20000)
describe('/poblarJugadores', () => {
const fileName = {"pathListaJugadores":"/home/mariopanpal/Escritorio/lista_jugadores_poblar.csv"}
test('poblarJugadores 200', async () => {
const res = await request(application).post("/poblarJugadores").send(fileName)
var listaJugadores1000 = await ListaJugadores.find({id_modo:1})
console.log(listaJugadores1000)
expect(res.statusCode).toBe(200)
})
test('poblarJugadores 404', async () => {
const res = await request(application).post("/poblarJugadore").send(fileName)
expect(res.statusCode).toBe(404)
})
})
describe('/buscarPartida', () => {
test('buscarPartida 200', async () => {
const res = await request(application).post("/buscarPartida").send()
expect(res.statusCode).toBe(200)
})
test('buscarPartida 404', async () => {
const res = await request(application).post("/buscarPartid").send()
expect(res.statusCode).toBe(404)
})
test('buscarPartida sin jugador', async () => {
const res = await request(application).post("/buscarPartida").send()
expect(res.text).toStrictEqual("No se ha encontrado al jugador que solicita partida en la base de datos")
})
test('buscarPartida Correcto', async () => {
var expectes=[{"id_jugador":1},{"id_jugador":8},{"id_jugador":9}]
var jugador={
"id_jugador": 5,
"id_modo":0
}
const res = await request(application).post("/buscarPartida").send(jugador)
var parseRes=[
{"id_jugador": parseInt(res.body[0].id_jugador)},
{"id_jugador": parseInt(res.body[1].id_jugador)},
{"id_jugador": parseInt(res.body[2].id_jugador)}
]
expect(parseRes).toStrictEqual(expectes)
})
})
describe('/registrarJugador', () => {
const jugadorNuevoBien = {"id_jugador":13, "id_modo":0}
const jugadorNuevoMal = {"id_jugador":12, "id_modo":4}
const jugadorNuevoRepetido = {"id_jugador":8, "id_modo":1}
test('registrarJugador 200', async () => {
const res = await request(application).post("/registrarJugador").send(jugadorNuevoBien)
expect(res.statusCode).toBe(200)
})
test('registrarJugador 404', async () => {
const res = await request(application).post("/registrarJugado").send(jugadorNuevoBien)
expect(res.statusCode).toBe(404)
})
test('registrarJugador 400', async () => {
const res = await request(application).post("/registrarJugador").send()
expect(res.statusCode).toBe(400)
})
test('registrarJugador Correcto', async () => {
const jugadorNuevoBis = {"id_jugador":14, "id_modo":0}
const res = await request(application).post("/registrarJugador").send(jugadorNuevoBis)
expect(res.text).toStrictEqual("El jugador se ha registrado correctamente")
})
test('registrarJugador Modo incorrecto', async () => {
const res = await request(application).post("/registrarJugador").send(jugadorNuevoMal)
expect(res.text).toStrictEqual("El modo no existe. Jugador no registrado")
})
test('registrarJugador Repetido', async () => {
const res = await request(application).post("/registrarJugador").send(jugadorNuevoRepetido)
expect(res.text).toStrictEqual("El jugador a registrar ya existe")
})
test('registrarJugador Correcto BD', async () => {
const jugadorNuevoBis = {"id_jugador":15, "id_modo":0}
const res = await request(application).post("/registrarJugador").send(jugadorNuevoBis)
var jugadorRegistrado = await ListaJugadores.find({$and:[{id_modo : 0}, {id_jugador:15}]},{id_modo:1, id_jugador:1})
var parseJugador = {
"id_modo": parseInt(jugadorRegistrado[0].id_modo),
"id_jugador": parseInt(jugadorRegistrado[0].id_jugador)
}
expect(parseJugador).toStrictEqual(jugadorNuevoBis)
})
test('registrarJugador Repetido BD', async () => {
const res = await request(application).post("/registrarJugador").send(jugadorNuevoRepetido)
var jugadorRegistrado = await ListaJugadores.find({$and:[{id_modo : jugadorNuevoRepetido.id_modo}, {id_jugador:jugadorNuevoRepetido.id_jugador}]},{id_modo:1, id_jugador:1})
expect(jugadorRegistrado).toHaveLength(1)
})
test('registrarJugador Incorrecto BD', async () => {
var expected=[]
const res = await request(application).post("/registrarJugador").send(jugadorNuevoMal)
var jugadorRegistrado = await ListaJugadores.find({$and:[{id_modo : jugadorNuevoMal.id_modo}, {id_jugador:jugadorNuevoMal.id_jugador}]},{id_modo:1, id_jugador:1})
expect(jugadorRegistrado).toEqual(expect.arrayContaining(expected))
})
})
afterAll(() => {
mongoose.connection.close()
})
UTF='utf8'
PORT=3000
MAXJUGADORES=5
#bbdd
USUARIO = mpanadero
PASS =Avenciamongo99
DBNAME =BD_COP
#paths
BBDD="/home/mariopanpal/Escritorio/bbdd.txt"
BUSCARPARTIDAPATH='http://localhost:4000/buscarPartida'
POBLARJUGADORESPATH='http://localhost:4000/poblarjugadores'
REGISTRARJUGADORPATH='http://localhost:4000/registrarJugador'
FILEPOBLARPARTIDAS="/home/mariopanpal/Escritorio/1000/1000partidas.csv"
#characters
FILEDIVISOR='||'
#sectors
CAMPOS0=0
CAMPOS1=1
const express = require('express')
const axios = require('axios');
bodyParser = require("body-parser")
const fs = require('fs')
const HistorialPartidasSCOP = require ('./models/historial_partidasSCOP')
const mongoose = require('mongoose');
require('dotenv').config()
//Conexión a la base de datos
const user = process.env.USUARIO
const pass = process.env.PASS
const dbname = process.env.DBNAME
const uri = `mongodb+srv://${user}:${pass}@cluster0.hsgzw.mongodb.net/${dbname}?retryWrites=true&w=majority`
mongoose.connect(uri
)
.then(() => console.log("Conectamos con la base de datos"))
.catch(e => console.log(e))
const app = express()
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use("/poblarpartidas", require("./poblarPartidas"))
app.post("/buscarPartida", (req,res)=>{
console.log("Recibido mensaje en ServerSim")
fs.readFile(process.env.BBDD,process.env.UTF,(error, datos)=>{
var lines = datos.split(/\r\n|\n/);
for(var line = 0; line < lines.length-1; line++){
var campos = lines[line].split(process.env.FILEDIVISOR)
if (campos[process.env.CAMPOS0]==req.body.token){
var id = campos[process.env.CAMPOS1]
break;
}
}
var envio = {
"id_jugador": id,
"id_modo" : req.body.id_modo,
"max_jugadores" : process.env.MAXJUGADORES
}
axios.post(process.env.BUSCARPARTIDAPATH, envio
).then((response) => {
res.send(response.data)
}, (error) => {
console.log(error);
});
})
})
app.post("/getHistorial", async (req,res) => {
console.log("llamada para historial recibida")
var fechap = new Date(req.body.fecha)
var historialPartidas = await HistorialPartidasSCOP.find({$and:[{finalizada:1},{fecha:{$gte:fechap}}]})
res.send(historialPartidas)
})
app.post("/bbdd", async (req,res)=>{
const partida = new HistorialPartidasSCOP(req.body)
await partida.save()
res.send ("Acabado")
})
app.listen(process.env.PORT, () => {
console.log("Estamos en el puerto 3000")
})
\ No newline at end of file
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const historialPartidaSCOPSchema = new Schema({
id_partida: String,
id_jugador : String,
resultado: String,
id_modo: String,
finalizada: String,
fecha: Date
},{versionKey:false})
const HistorialPartidasSCOP = mongoose.model('historialpartidasSCOP', historialPartidaSCOPSchema);
module.exports = HistorialPartidasSCOP;
\ No newline at end of file
This diff is collapsed.
{
"name": "serversim",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.26.1",
"csvtojson": "^2.0.10",
"dotenv": "^16.0.1",
"express": "^4.17.3",
"mongoose": "^6.2.9",
"nodemon": "^2.0.15"
}
}
const Router = require("express")
const HistorialPartidasSCOP= require ('./models/historial_partidasSCOP')
const csvtojson = require('csvtojson')
require('dotenv').config()
const router = Router()
/**
* Endpoint para poblar el documento "historial_partidas" de la base de datos por medio de un fichero .csv
*/
router.get("/", async (req,res) => {
await HistorialPartidasSCOP.deleteMany()
const fileName = process.env.FILEPOBLARPARTIDAS;
var arrayToInsert = [];
csvtojson().fromFile(fileName).then(source => {
for (var i = 0; i < source.length; i++) {
var oneRow = {
id_partida: source[i]["id_partida"],
id_jugador: source[i]["id_jugador"],
resultado: source[i]["resultado"],
id_modo: source[i]["id_modo"],
finalizada: source[i]["finalizada"],
fecha: source[i]["fecha"]
};
arrayToInsert.push(oneRow);
}
HistorialPartidasSCOP.insertMany(arrayToInsert, (err, result) => {
if (err) console.log(err);
if(result){
console.log("Import CSV into database successfully.");
}
});
});
res.send("Partidas insertadas correctamente")
})
module.exports = router
\ No newline at end of file
import requests
import time
import threading
from datetime import datetime
token=5555
modo=0
buscarPartidaPath='http://localhost:3000/buscarPartida'
guardarPartidaPath='http://localhost:3000/bbdd'
hilos=1
def cliente():
inicio = time.time()
objeto = {'token':token, "id_modo" : modo}
response = requests.post(buscarPartidaPath, json=objeto)
print(response.text)
"""DISPUTA DE PARTIDA"""
""" 1 para el que gana, 0 para el que pierde"""
now = datetime.now()
fecha_hora_str = now.strftime('%m/%d/%Y %H:%M:%S')
postPartida1 = {
"id_partida" : "p-10",
"id_jugador" : 5,
"resultado" : 1,
"id_modo": 0,
"finalizada": 1,
"fecha": fecha_hora_str
}
postPartida2 = {
"id_partida" : "p-10",
"id_jugador" : 1,
"resultado" : 0,
"id_modo": 0,
"finalizada": 1,
"fecha": fecha_hora_str
}
fin = time.time()
print (fin-inicio)
res1 = requests.post(guardarPartidaPath, json=postPartida1)
res2 = requests.post(guardarPartidaPath, json=postPartida2)
""" print(res1.text)
print(res2.text) """
for num_hilo in range(hilos):
hilo = threading.Thread(name='hilo%s' %num_hilo, target = cliente)
hilo.start()
import requests
idJugador=43
idModo=1
registrarJugadorPath='http://localhost:4000/registrarjugador'
jugadorRegistrar = {"id_jugador": idJugador, "id_modo": idModo}
#response = requests.post('http://virtual.infor.uva.es:65132/registrarjugador', data = jugadorRegistrar)
response = requests.post(registrarJugadorPath, data = jugadorRegistrar)
print(response.text)
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment