Add notifications
This commit is contained in:
parent
4cc3040180
commit
52efc7a746
|
@ -6,7 +6,8 @@ import {
|
|||
ClientEvents,
|
||||
Participant,
|
||||
ServerEvents,
|
||||
IChannelInfo
|
||||
IChannelInfo,
|
||||
Notification
|
||||
} from "../util/types";
|
||||
import type { Socket } from "../ws/Socket";
|
||||
import { validateChannelSettings } from "./settings";
|
||||
|
@ -473,6 +474,10 @@ export class Channel extends EventEmitter {
|
|||
}));
|
||||
}
|
||||
|
||||
public getParticipantListUnsanitized() {
|
||||
return this.ppl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether a user is in this channel (by user ID)
|
||||
* @param _id User ID
|
||||
|
@ -735,6 +740,23 @@ export class Channel extends EventEmitter {
|
|||
c: this.chatHistory
|
||||
}]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a notification to this channel
|
||||
* @param notif Notification to send
|
||||
**/
|
||||
public sendNotification(notif: Notification) {
|
||||
this.sendArray([{
|
||||
m: "notification",
|
||||
id: notif.id,
|
||||
target: notif.target,
|
||||
duration: notif.duration,
|
||||
class: notif.class,
|
||||
title: notif.title,
|
||||
text: notif.text,
|
||||
html: notif.html
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
export default Channel;
|
||||
|
|
|
@ -233,7 +233,13 @@ declare interface ServerEvents {
|
|||
|
||||
clear_chat: {
|
||||
m: "clear_chat"
|
||||
}
|
||||
};
|
||||
|
||||
notification: {
|
||||
m: "notification"
|
||||
targetChannel?: string;
|
||||
targetUser?: string;
|
||||
} & Notification;
|
||||
}
|
||||
|
||||
declare interface ClientEvents {
|
||||
|
|
|
@ -13,7 +13,8 @@ import {
|
|||
Participant,
|
||||
ServerEvents,
|
||||
UserFlags,
|
||||
Vector2
|
||||
Vector2,
|
||||
Notification
|
||||
} from "../util/types";
|
||||
import type { User } from "@prisma/client";
|
||||
import { createUser, readUser, updateUser } from "../data/user";
|
||||
|
@ -477,6 +478,19 @@ export class Socket extends EventEmitter {
|
|||
public getUUID() {
|
||||
return this.uuid;
|
||||
}
|
||||
|
||||
public sendNotification(notif: Notification) {
|
||||
this.sendArray([{
|
||||
m: "notification",
|
||||
id: notif.id,
|
||||
target: notif.target,
|
||||
duration: notif.duration,
|
||||
class: notif.class,
|
||||
title: notif.title,
|
||||
text: notif.text,
|
||||
html: notif.html
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
export const socketsBySocketID = new Map<string, Socket>();
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
import { ChannelList } from "../../../../channel/ChannelList";
|
||||
import { ServerEventListener } from "../../../../util/types";
|
||||
import { socketsBySocketID } from "../../../Socket";
|
||||
|
||||
export const notification: ServerEventListener<"notification"> = {
|
||||
id: "notification",
|
||||
callback: async (msg, socket) => {
|
||||
// Send notification to user/channel
|
||||
if (typeof msg.targetChannel == "undefined" && typeof msg.targetUser == "undefined") return;
|
||||
|
||||
if (typeof msg.targetChannel !== "undefined") {
|
||||
for (const ch of ChannelList.getList().values()) {
|
||||
if (ch.getID() == msg.targetChannel) {
|
||||
ch.sendNotification(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof msg.targetUser !== "undefined") {
|
||||
for (const socket of socketsBySocketID.values()) {
|
||||
if (socket.getUserID() == msg.targetUser) {
|
||||
socket.sendNotification(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
|
@ -0,0 +1,26 @@
|
|||
import { readUser, updateUser } from "../../../../data/user";
|
||||
import { ServerEventListener } from "../../../../util/types";
|
||||
import { findSocketsByUserID } from "../../../Socket";
|
||||
|
||||
export const name: ServerEventListener<"name"> = {
|
||||
id: "name",
|
||||
callback: async (msg, socket) => {
|
||||
// Change someone else's name but it's an annoying admin feature
|
||||
const id = msg._id;
|
||||
const name = msg.name;
|
||||
|
||||
if (typeof id !== "string") return;
|
||||
if (typeof name !== "string") return;
|
||||
|
||||
const user = await readUser(msg._id);
|
||||
if (!user) return;
|
||||
|
||||
user.name = name;
|
||||
await updateUser(id, user);
|
||||
|
||||
const toUpdate = findSocketsByUserID(id);
|
||||
toUpdate.forEach(s => {
|
||||
s.userset(msg.name, undefined, true);
|
||||
});
|
||||
}
|
||||
};
|
|
@ -5,12 +5,13 @@ export const EVENT_GROUP_ADMIN = new EventGroup("admin");
|
|||
|
||||
import { color } from "./handlers/color";
|
||||
import { name } from "./handlers/name";
|
||||
import { notification } from "./handlers/notification";
|
||||
import { user_flag } from "./handlers/user_flag";
|
||||
|
||||
// EVENT_GROUP_ADMIN.add(color);
|
||||
// EVENT_GROUP_ADMIN.add(name);
|
||||
// EVENT_GROUP_ADMIN.add(user_flag);
|
||||
|
||||
EVENT_GROUP_ADMIN.addMany(color, name, user_flag, clear_chat);
|
||||
EVENT_GROUP_ADMIN.addMany(color, name, user_flag, clear_chat, notification);
|
||||
|
||||
eventGroups.push(EVENT_GROUP_ADMIN);
|
||||
|
|
Loading…
Reference in New Issue