Files
catherine-league/main-web/server/src/index.ts
2020-08-09 15:24:09 +09:00

278 lines
7.1 KiB
TypeScript

import express from 'express';
import socketIo from 'socket.io';
import http from 'http';
import cors from 'cors';
import mysql from 'mysql';
import dotenv from 'dotenv';
import { v1 } from 'uuid';
import { IJankenSelect, IJankenResult } from './models/message';
dotenv.config();
const port: number = 8080;
const app: express.Express = express();
const httpServer: http.Server = http.createServer(app);
const io: socketIo.Server = socketIo(httpServer);
const tournaments: Record<string, number> = {};
const players: Record<string, number> = {};
console.log(process.env.DB_ENDPOINT);
const connection = mysql.createPool({
connectionLimit: 10,
port: (process.env.DB_PORT ? parseInt(process.env.DB_PORT, 10) : 3306),
host: process.env.DB_ENDPOINT,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: 'catherine_league'
});
connection.query(
`SELECT id, tournament_key
FROM tournaments`,
(error: mysql.MysqlError | null, results: any) => {
if (error) {
return;
}
if (results.length > 0) {
results.forEach((result: any) => {
tournaments[result.tournament_key] = result.id;
});
}
}
);
connection.query(
`SELECT id, player_key FROM players;`,
(error: mysql.MysqlError | null, results: any) => {
if (error) {
console.log(error);
return;
}
if (results.length > 0) {
results.forEach((result: any) => {
players[result.player_key] = result.id;
});
}
}
);
if (process.env.NODE_ENV === 'development') {
app.use(cors());
app.options('*', cors());
}
app.get('/api/players/:key', (req: any, res: any) => {
if (req.params && req.params.key && tournaments[req.params.key]) {
const sqlToPrepare = `SELECT p.id, p.player_key, p.player_name,p.description,p.image,c.name_id, c.name, c.name_jp
FROM players p
JOIN player_to_tournament ptt
on p.id = ptt.player_id
JOIN characters c
on c.id = p.character_id
where ptt.tournament_id = ?`;
const sql = mysql.format(sqlToPrepare, [tournaments[req.params.key]]);
connection.query(sql,
(error: mysql.MysqlError | null, results: any) => {
if (error) {
console.error(error);
// players not found
} else {
res.send(results);
}
}
);
} else {
// send error
}
});
app.get('/api/players', (req: any, res: any) => {
connection.query(
`SELECT p.id, p.player_key, p.player_name,p.description,p.image,c.name_id, c.name, c.name_jp
FROM players p
JOIN characters c
on c.id = p.character_id`,
(error: mysql.MysqlError | null, results: any) => {
if (error) {
console.log(error);
// players not found
} else {
res.send(results);
}
}
);
});
app.get('/api/guide', (req: any, res: any) => {
connection.query(
`SELECT *
FROM guide`,
(error: mysql.MysqlError | null, results: any) => {
if (error) {
console.log(error);
res.send([]);
} else {
res.send(results);
}
}
);
});
app.get('/api/archive', (req: any, res: any) => {
connection.query(
`SELECT *
FROM archive`,
(error: mysql.MysqlError | null, results: any) => {
if (error) {
console.log(error);
res.send([]);
} else {
res.send(results);
}
}
);
});
app.get('/api/contact', (req: any, res: any) => {
connection.query(
`SELECT *
FROM contact`,
(error: mysql.MysqlError | null, results: any) => {
if (error) {
console.log(error);
res.send([]);
} else {
res.send(results);
}
}
);
});
app.use('/players', express.static('client'));
app.use('/tournaments*', express.static('client'));
app.use('/about', express.static('client'));
app.use('/guide', express.static('client'));
app.use('/archive', express.static('client'));
app.use('/contact', express.static('client'));
app.use('/tool', express.static('tool'));
app.use(express.static('client'));
httpServer.listen(port, () => {
console.log(`listening to port ${port}`);
});
// Janken Tool
let room: boolean = false;
let playerOne: string = '';
let playerTwo: string = '';
let playerOneOption: string = '';
let playerTwoOption: string = '';
let stages: string[] = [];
let currentIndex: number = 0;
const defaultStages: string[] = ['cementery', 'prison', 'torture', 'inquisition', 'quadrangle', 'clock', 'spiral', 'empireo', 'cathedral', 'close', 'arrange'];
io.on('connection', (socket: socketIo.Socket) => {
socket.on('disconnect', () => {
console.log('disconnect');
});
socket.on('exitGame', () => {
console.log('exitGame');
io.emit('exitGame');
room = false;
initRoom();
Object.keys(io.sockets.sockets).forEach((s: string) => {
io.sockets.sockets[s].disconnect(true);
});
});
socket.on('janken', (data: IJankenSelect) => {
console.log('janken', data);
if (playerOne === data.userName) {
playerOneOption = data.option;
} else if (playerTwo === data.userName) {
playerTwoOption = data.option;
}
console.log('playerOneOption', playerOneOption);
console.log('playerTwoOption', playerTwoOption);
if (playerOneOption !== '' && playerTwoOption !== '') {
const message: IJankenResult = {
playerOne,
playerOneOption,
playerTwo,
playerTwoOption
};
io.emit('jankenResult', message);
}
});
socket.on('registerUser', (data: string) => {
console.log('registerUser', data);
if (playerOne === '') {
playerOne = data;
socket.emit('registerUser', data);
} else if (playerTwo === '') {
playerTwo = data;
socket.emit('registerUser', data);
}
const message = {
playerOne,
playerTwo
};
io.emit('login', message);
});
socket.on('moveToStage', () => {
console.log('moveToStage');
stages = shuffle(defaultStages);
currentIndex = 0;
io.emit('stages', stages);
});
socket.on('nextIndex', () => {
console.log('nextIndex');
if (currentIndex < stages.length) {
currentIndex += 1;
io.emit('updateIndex', currentIndex);
}
});
socket.on('againGame', () => {
console.log('againGame');
io.emit('againGame');
playerOneOption = '';
playerTwoOption = '';
});
socket.on('previousIndex', () => {
console.log('previousIndex');
if (currentIndex > 0) {
currentIndex -= 1;
io.emit('updateIndex', currentIndex);
}
});
if (!room) {
// create new room
initRoom();
room = true;
const message = {
playerOne: '',
playerTwo: '',
};
socket.emit('login', message);
} else {
if (playerOne === '' || playerTwo === '' || playerOneOption === '' || playerTwoOption === '') {
const message = {
playerOne,
playerTwo,
};
socket.emit('login', message);
} else {
const message = {
stages,
currentIndex
};
socket.emit('stages', message);
}
}
});
const shuffle = (array: string[]): string[] => {
return array.sort(() => Math.random() - 0.5);
};
const initRoom = (): void => {
playerOne = '';
playerTwo = '';
playerOneOption = '';
playerTwoOption = '';
};