Commit 63e1b81a authored by Vũ Gia Vương's avatar Vũ Gia Vương

add isBackList

parent a2d20591
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@socket.io/admin-ui": "^0.5.1",
"@socket.io/redis-adapter": "^8.3.0", "@socket.io/redis-adapter": "^8.3.0",
"@types/express": "^5.0.3", "@types/express": "^5.0.3",
"cors": "^2.8.5", "cors": "^2.8.5",
......
...@@ -12,6 +12,7 @@ const INIT_SPEED: number = 300; ...@@ -12,6 +12,7 @@ const INIT_SPEED: number = 300;
const A_POWER: number = 300; const A_POWER: number = 300;
const DT: number = 0.016; const DT: number = 0.016;
const MAX_TOWER: number = 50; const MAX_TOWER: number = 50;
const RATE_BLACK_LIST = 0.15;
export async function endGameCtrl(socket: Socket, user: User) { export async function endGameCtrl(socket: Socket, user: User) {
try { try {
...@@ -48,7 +49,7 @@ export async function passTowerCtrl(socket: Socket, data: IRequestPassTower, use ...@@ -48,7 +49,7 @@ export async function passTowerCtrl(socket: Socket, data: IRequestPassTower, use
try { try {
let xDistance_ = 0; let xDistance_ = 0;
const { direction, nextBlock, towerNumber, position } = user; const { direction, nextBlock, towerNumber, position, distance2Tower } = user;
if (towerNumber > MAX_TOWER) { if (towerNumber > MAX_TOWER) {
let speed = INIT_SPEED; let speed = INIT_SPEED;
...@@ -88,6 +89,15 @@ export async function passTowerCtrl(socket: Socket, data: IRequestPassTower, use ...@@ -88,6 +89,15 @@ export async function passTowerCtrl(socket: Socket, data: IRequestPassTower, use
target = nextTowerPos.clone(); target = nextTowerPos.clone();
score = 2; score = 2;
} }
if (minDistance < HALF_SIZE_TOWER * 0.3 && user.isBlacklist) {
const random = Math.random();
const dir = random < 0.5 ? -1 : 1;
const isSubBlackList = Math.abs(0.5 - random) > RATE_BLACK_LIST;
if (isSubBlackList) {
target = nextTowerPos.clone().sub(pointEdge.clone().mul(0.5 * dir));
score = 1;
}
}
const heightJump = user.distance2Tower * 0.7; const heightJump = user.distance2Tower * 0.7;
...@@ -159,3 +169,7 @@ export async function addBlockCtrl(socket: Socket, user: User) { ...@@ -159,3 +169,7 @@ export async function addBlockCtrl(socket: Socket, user: User) {
console.log('error', error) console.log('error', error)
} }
} }
export async function getHistory(socket: Socket, user: User) {
socket.emit(CONFIG.EVT.REQUEST_HISTORY, user.history);
}
\ No newline at end of file
import { redis } from ".."; import { redis } from "..";
import User from "../Model/User";
import { users } from "../socket";
export const ONLINE_KEY = 'socket:online'; const ONLINE_KEY = 'socket:online';
export const VISITS_KEY = 'socket:visits'; const VISITS_KEY = 'socket:visits';
const CONNECT = 'connect';
const DISCONNECT = 'disconnect';
const FIVE_MINUTE_EX = 2 * 60 * 60;
export function incrUserCtrl() { export function setDataStatistical() {
redis.incr(ONLINE_KEY);
const dayKey = getDayKey();
redis.incr(dayKey);
const hourKey = getHourKey();
redis.incr(hourKey);
} }
export function decrUserCtrl() { export function getDataStatistical() {
redis.decr(ONLINE_KEY); return users;
};
const dayKey = getDayKey();
redis.decr(dayKey);
const hourKey = getHourKey(); export function connectedUserCtrl() {
redis.decr(hourKey); const {today, hour, minute} = getTime5Minute();
const connected5MinuteKey = `${CONNECT}:${today}:${hour}:${minute}`;
redis.incr(connected5MinuteKey);
} }
function getHourKey() { export function disconnectUserCtrl() {
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD const {today, hour, minute} = getTime5Minute();
const hour = new Date().getHours() + 1; // 0-23 const disconnected5MinuteKey = `${CONNECT}:${today}:${hour}:${minute}`;
const hourKey = `${VISITS_KEY}:${today}:${hour}`; redis.incr(disconnected5MinuteKey);
return hourKey;
} }
function getDayKey() { function getTime5Minute() {
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
const dayKey = `${VISITS_KEY}:${today}`; const hour = new Date().getHours() + 1; // 1-24
return dayKey; const minute = Math.floor(new Date().getMinutes() / 5) * 5; // 0-59
return { today, hour, minute };
} }
...@@ -19,6 +19,7 @@ class User { ...@@ -19,6 +19,7 @@ class User {
public timeStart: number = 0; public timeStart: number = 0;
public isStartGame: boolean = true; public isStartGame: boolean = true;
public history: History[] = []; public history: History[] = [];
public isBlacklist: boolean = false;
constructor(user: User) { constructor(user: User) {
this.token = user.token; this.token = user.token;
......
...@@ -4,6 +4,7 @@ import { Server } from 'socket.io'; ...@@ -4,6 +4,7 @@ import { Server } from 'socket.io';
import { setupSocket } from "./socket"; import { setupSocket } from "./socket";
import { createAdapter } from "@socket.io/redis-adapter"; import { createAdapter } from "@socket.io/redis-adapter";
import { createClient } from "redis"; import { createClient } from "redis";
import { instrument } from "@socket.io/admin-ui";
const PORT = process.env.PORT || 6636; const PORT = process.env.PORT || 6636;
// const REDIS_URL = "redis://default:Myreview123@123a@127.0.0.1:6379"; // const REDIS_URL = "redis://default:Myreview123@123a@127.0.0.1:6379";
...@@ -28,6 +29,8 @@ const io = new Server(server, { ...@@ -28,6 +29,8 @@ const io = new Server(server, {
cors: { cors: {
methods: ["GET", "POST"], methods: ["GET", "POST"],
origin: "*", origin: "*",
// origin: ["https://admin.socket.io", "http://localhost:8080"],
credentials: true,
} }
}); });
...@@ -37,6 +40,11 @@ const subClient = pubClient.duplicate(); ...@@ -37,6 +40,11 @@ const subClient = pubClient.duplicate();
Promise.all([pubClient.connect(), subClient.connect()]).then(() => { Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
io.adapter(createAdapter(pubClient, subClient)); io.adapter(createAdapter(pubClient, subClient));
console.log("✅ Socket.IO Redis adapter connected"); console.log("✅ Socket.IO Redis adapter connected");
instrument(io, {
auth: false,
readonly: true,
});
}); });
setupSocket(io); setupSocket(io);
......
import express, { Request, Response, NextFunction } from 'express' import express, { Request, Response, NextFunction } from 'express'
import cors from 'cors'; import cors from 'cors';
import { getDataStatistical } from './Controller/statisticalCtrl';
const app = express(); const app = express();
app.use(cors()); app.use(cors());
...@@ -9,9 +10,12 @@ app.get('/', (req: Request, res: Response, next: NextFunction) => { ...@@ -9,9 +10,12 @@ app.get('/', (req: Request, res: Response, next: NextFunction) => {
res.send('Hello World') res.send('Hello World')
}) })
app.get('/socketws/dev', (req: Request, res: Response, next: NextFunction) => { app.get('/socketws/online', (req: Request, res: Response, next: NextFunction) => {
res.send('dev') // const data = getDataStatistical();
}) // const result = Array.from(data.values());
// res.json(result);
res.send('online');
})
export default app; export default app;
import { Server, Socket } from "socket.io"; import { Server, Socket } from "socket.io";
import User, { IRequestPassTower } from "./Model/User"; import User, { IRequestPassTower } from "./Model/User";
import { redis } from "."; import { redis } from ".";
import { decrUserCtrl, incrUserCtrl } from "./Controller/statisticalCtrl"; import { endGameCtrl, getHistory, passTowerCtrl, startGameCtrl } from "./Controller/gameCtrl";
import { endGameCtrl, passTowerCtrl, startGameCtrl } from "./Controller/gameCtrl";
import CONFIG from "./Config/config"; import CONFIG from "./Config/config";
const users: Map<string, User> = new Map<string, User>(); export const users: Map<string, User> = new Map<string, User>();
const TIME_EX = 24 * 60 * 60; const TIME_EX = 24 * 60 * 60;
...@@ -15,6 +14,7 @@ export async function setupSocket(io: Server) { ...@@ -15,6 +14,7 @@ export async function setupSocket(io: Server) {
try { try {
const token = String(socket.handshake.query.token); const token = String(socket.handshake.query.token);
const userId = String(socket.handshake.query.userId); const userId = String(socket.handshake.query.userId);
const isBlacklist = Boolean(socket.handshake.query.isBlacklist);
if (!token || !userId) { if (!token || !userId) {
return; return;
} }
...@@ -24,11 +24,12 @@ export async function setupSocket(io: Server) { ...@@ -24,11 +24,12 @@ export async function setupSocket(io: Server) {
const userJson = await redis.get(`user:${userId}`); const userJson = await redis.get(`user:${userId}`);
const user = userJson ? JSON.parse(userJson) : null; const user = userJson ? JSON.parse(userJson) : null;
const newUser = new User(user || { token, id: userId } as User); const newUser = new User(user || { token, id: userId, isBlacklist} as User);
newUser.isBlacklist = isBlacklist;
users.set(userId, newUser); users.set(userId, newUser);
if (!user) { if (!user) {
await redis.set(`user:${userId}`, JSON.stringify(user)); await redis.set(`user:${userId}`, JSON.stringify(newUser));
await redis.expire(`user:${userId}`, TIME_EX); await redis.expire(`user:${userId}`, TIME_EX);
} }
next(); next();
...@@ -40,7 +41,6 @@ export async function setupSocket(io: Server) { ...@@ -40,7 +41,6 @@ export async function setupSocket(io: Server) {
io.on("connection", (socket: Socket) => { io.on("connection", (socket: Socket) => {
try { try {
console.log(`🟢 Client connected: ${socket.id}`); console.log(`🟢 Client connected: ${socket.id}`);
incrUserCtrl();
const userId = String(socket.handshake.query.userId); const userId = String(socket.handshake.query.userId);
const user = users.get(userId)!; const user = users.get(userId)!;
...@@ -56,13 +56,11 @@ export async function setupSocket(io: Server) { ...@@ -56,13 +56,11 @@ export async function setupSocket(io: Server) {
console.log('error', error) console.log('error', error)
} }
}); });
} }
async function onDisconnect(socket: Socket, user: User) { async function onDisconnect(socket: Socket, user: User) {
try { try {
console.log(`🔴 Client disconnected: ${socket.id}`) console.log(`🔴 Client disconnected: ${socket.id}`)
decrUserCtrl();
await redis.set(`user:${user.id}`, JSON.stringify(user)); await redis.set(`user:${user.id}`, JSON.stringify(user));
await redis.expire(`user:${user.id}`, TIME_EX); await redis.expire(`user:${user.id}`, TIME_EX);
...@@ -72,6 +70,4 @@ async function onDisconnect(socket: Socket, user: User) { ...@@ -72,6 +70,4 @@ async function onDisconnect(socket: Socket, user: User) {
} }
} }
async function getHistory(socket: Socket, user: User) {
socket.emit(CONFIG.EVT.REQUEST_HISTORY, user.history);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment