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

add isBackList

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