117 lines
3.2 KiB
TypeScript
117 lines
3.2 KiB
TypeScript
import { Server } from 'socket.io'
|
|
import { PrismaClient } from '@prisma/client'
|
|
import { IChannel, IServer, IUser, SafeUser } from '~~/types'
|
|
const prisma = new PrismaClient()
|
|
|
|
declare global {
|
|
let io: Server | undefined
|
|
}
|
|
|
|
export default defineEventHandler(({ node }) => {
|
|
if (!global.io) {
|
|
global.io = new Server(node.res.socket?.server);
|
|
|
|
global.io.on('connection', async (socket) => {
|
|
const token = socket.handshake.auth.token;
|
|
if (!token) {
|
|
return;
|
|
}
|
|
|
|
const { user } = await prisma.session.findFirst({
|
|
where: {
|
|
token
|
|
},
|
|
select: {
|
|
user: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
servers: {
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
participants: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
roles: {
|
|
select: {
|
|
id: true,
|
|
administrator: true,
|
|
owner: true
|
|
}
|
|
}
|
|
}
|
|
},
|
|
channels: {
|
|
select: {
|
|
id: true,
|
|
DM: true,
|
|
server: {
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
participants: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
roles: {
|
|
select: {
|
|
id: true,
|
|
administrator: true,
|
|
owner: true
|
|
}
|
|
}
|
|
}
|
|
},
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
channels: {
|
|
select: {
|
|
id: true,
|
|
DM: true,
|
|
dmParticipants: {
|
|
select: {
|
|
id: true,
|
|
username: true
|
|
}
|
|
},
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}) as { user: IUser } | null;
|
|
|
|
if (!user) {
|
|
return;
|
|
}
|
|
|
|
socket.on('typing', async (ev) => {
|
|
if (!ev) {
|
|
return;
|
|
}
|
|
|
|
let channel = user.channels.find((c: IChannel) => c.id === ev) || user.servers.find((s: IServer) => s.channels.some((c: IChannel) => c.id === ev))
|
|
if (channel.DM === undefined) {
|
|
// assume its a server
|
|
channel = channel.channels.find((c: IChannel) => c.id === ev)
|
|
}
|
|
|
|
if (!channel) return;
|
|
|
|
if (!channel.dmParticipants?.find((e: SafeUser) => e.id === user.id)) {
|
|
if (!channel.server || !channel.server.participants.find((e: SafeUser) => e.id === user.id)) {
|
|
return
|
|
}
|
|
}
|
|
|
|
global.io.emit(`typing-${channel.id}`, user.username)
|
|
})
|
|
})
|
|
}
|
|
}) |