Files
2024-09-27 02:06:13 +08:00

164 lines
4.6 KiB
JavaScript

const express = require("express");
const { createServer } = require("http");
const { Server } = require("socket.io");
const { writeFileSync } = require("fs");
const app = express();
app.use("/upload", express.static('upload'))
const httpServer = createServer(app);
const io = new Server(httpServer, {
cors: {
origin: "*",
allowedHeaders: "*",
credentials: true
}
});
//后端
//存取所有 Socket
let onlineUserSocket = []
//在线群人员
let onlineUserList = {
}
//消息
let ChatRecords = {
"10086": [
{
room_id: "10086",
user_img: "../img/7.jpg",
user_name: "bmy",
level: 1,//1群主 2 管理员 3 普通成员
message: '这是我发的消息'
}
]
}
//链接是否成功
io.on("connection", (socket) => {
console.log("链接成")
//存取socket
socket.on('socketShake', (msg) => {
console.log("msg", msg)
if (msg.hasOwnProperty("clickUserName")) {
//私发消息
let userSocket = onlineUserSocket.filter(v => onlineUserList[msg.room_id].filter(v => msg.clickUserName == v.user_name)[0].socketId == v.id)[0];
let a = parseInt(Math.random() * 100000)
console.log("a: ", a);
socket.join(a);
userSocket.join(a)
io.in(a).emit("ShakeMessage", msg)
io.in(a).emit("openShake")
} else {
//群发
//群发消息
io.in(msg.room_id).emit("ShakeMessage", msg)
io.in(msg.room_id).emit("openShake");
}
})
socket.on("Mushinsocket", (msg) => {
//禁言判断
console.log("msg", msg)
if (msg.hasOwnProperty("Mushinname")) {
//判断操作之人的等级
let grade = onlineUserList[msg.room_id].filter(v => v.user_name == msg.user_name)[0]
if (grade.level == 1) {
let a = parseInt(Math.random() * 100000)
gradesocket = onlineUserSocket.filter(v => v.id == onlineUserList[msg.room_id].filter(v => v.user_name == msg.Mushinname)[0].socketId)[0]
gradesocket.join(a)
io.in(a).emit("MushinopenShake")
io.in(msg.room_id).emit("WelcomeUser", `用户${msg.Mushinname}已被禁言`);
}
}
})
socket.on("Allsilenced", (msg) => {
let grade = onlineUserList[msg.room_id].filter(v => v.user_name == msg.user_name)[0]
if(grade.level==1){
socket.to(msg.room_id).emit("MushinsocketAll");
io.in(msg.room_id).emit("WelcomeUser", `群主开启了全员禁言`);
}
})
socket.on('uploadFile', (msg) => {
console.log("图片base64: ", msg);
msg.user.message = saveFile(msg)
socket.to(msg.user.room_id).emit("uploadImgName", msg.user);
})
//加入群聊
socket.on('text', (msg) => {
console.log('message: ', msg);
//hasOwnProperty
//判断是否存在此群
if (onlineUserList.hasOwnProperty(msg.room_id)) {
console.log("存在此群")
//判断群里是否有此人
console.log(checkUserNameisExist(msg))
if (checkUserNameisExist(msg)) {
console.log("群里没有此人")
//没有此人
msg.level = 3 //为成员
//
msg.socketId = socket.id
onlineUserList[msg.room_id].push(msg)
}
onlineUserSocket.push(socket)
socket.join(msg.room_id);
} else {
//不存在群
console.log("不存在此群")
onlineUserList[msg.room_id] = []
msg.level = 1
msg.socketId = socket.id
onlineUserList[msg.room_id].push(msg)
onlineUserSocket.push(socket)
console.log("不存在此群", onlineUserList);
socket.join(msg.room_id);
}
io.in(msg.room_id).emit("WelcomeUser", `欢迎用户${msg.user_name}加入群聊`);
//向前端发送群成员信息
io.in(msg.room_id).emit("onLineUserList", onlineUserList[msg.room_id]);
console.log("所有", onlineUserList)
});
//接受前端发来的消息数据
socket.on("sendMessage", data => {
//将消息发送给指前端除自己以外房间里的所有人
console.log("收到的前端消息", data)
socket.to(data.room_id).emit("ServerMessage", data)
})
});
function checkUserNameisExist(msg) {
let ddd = onlineUserList[msg.room_id].filter(v => {
//将相等的数据返回
return v.user_name == msg.user_name
})
return ddd == 0 ? true : false;
}
function saveFile(imgData) {
var base64Data = imgData.base64.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = Buffer.from(base64Data, 'base64');
let fileName = `${new Date().getTime().toString() + (Math.random() * new Date().getTime())}.${imgData.fileType}`
writeFileSync(`upload/${fileName}`, dataBuffer);
return fileName
}
httpServer.listen(3000, () => {
console.log("ws://127.0.0.1:3000")
});