164 lines
4.6 KiB
JavaScript
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")
|
|
});
|
|
|
|
|