Fully implement channel list, fix admin messages
This commit is contained in:
parent
00ec1f5640
commit
52e21f77d6
|
@ -130,8 +130,6 @@ export class Channel extends EventEmitter {
|
||||||
|
|
||||||
const userFlags = socket.getUserFlags();
|
const userFlags = socket.getUserFlags();
|
||||||
|
|
||||||
this.logger.debug(userFlags);
|
|
||||||
|
|
||||||
if (userFlags) {
|
if (userFlags) {
|
||||||
if (userFlags.cant_chat) return;
|
if (userFlags.cant_chat) return;
|
||||||
}
|
}
|
||||||
|
@ -157,7 +155,7 @@ export class Channel extends EventEmitter {
|
||||||
this.emit("command", msg, socket);
|
this.emit("command", msg, socket);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logger.debug(err);
|
this.logger.error(err);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -233,17 +231,15 @@ export class Channel extends EventEmitter {
|
||||||
* @returns undefined
|
* @returns undefined
|
||||||
*/
|
*/
|
||||||
public join(socket: Socket) {
|
public join(socket: Socket) {
|
||||||
|
//! /!\ Players are forced to join the same channel on two different tabs!
|
||||||
|
//? TODO Should this be a bug or a feature?
|
||||||
|
|
||||||
if (this.isDestroyed()) return;
|
if (this.isDestroyed()) return;
|
||||||
const part = socket.getParticipant() as Participant;
|
const part = socket.getParticipant() as Participant;
|
||||||
|
|
||||||
// Unknown side-effects, but for type safety...
|
|
||||||
// if (!part) return;
|
|
||||||
|
|
||||||
let hasChangedChannel = false;
|
let hasChangedChannel = false;
|
||||||
let oldChannelID = socket.currentChannelID;
|
let oldChannelID = socket.currentChannelID;
|
||||||
|
|
||||||
// this.logger.debug("Has user?", this.hasUser(part._id));
|
|
||||||
|
|
||||||
// Is user in this channel?
|
// Is user in this channel?
|
||||||
if (this.hasUser(part._id)) {
|
if (this.hasUser(part._id)) {
|
||||||
// Alreay in channel, don't add to list, but tell them they're here
|
// Alreay in channel, don't add to list, but tell them they're here
|
||||||
|
@ -256,25 +252,29 @@ export class Channel extends EventEmitter {
|
||||||
hasChangedChannel = true;
|
hasChangedChannel = true;
|
||||||
this.ppl.push(part);
|
this.ppl.push(part);
|
||||||
} else {
|
} else {
|
||||||
// Put us in full channel
|
// Put them in full channel
|
||||||
return socket.setChannel(config.fullChannel);
|
return socket.setChannel(config.fullChannel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Was the move complete?
|
||||||
if (hasChangedChannel) {
|
if (hasChangedChannel) {
|
||||||
|
// Were they in a channel before?
|
||||||
if (socket.currentChannelID) {
|
if (socket.currentChannelID) {
|
||||||
|
// Find the channel they were in
|
||||||
const ch = ChannelList.getList().find(
|
const ch = ChannelList.getList().find(
|
||||||
ch => ch._id == socket.currentChannelID
|
ch => ch._id == socket.currentChannelID
|
||||||
);
|
);
|
||||||
if (ch) {
|
|
||||||
ch?.leave(socket);
|
// Tell the channel they left
|
||||||
}
|
if (ch) ch.leave(socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Change the thing we checked to point to us now
|
||||||
socket.currentChannelID = this.getID();
|
socket.currentChannelID = this.getID();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send our data back
|
// Send our state data back
|
||||||
socket.sendArray([
|
socket.sendArray([
|
||||||
{
|
{
|
||||||
m: "ch",
|
m: "ch",
|
||||||
|
@ -288,12 +288,13 @@ export class Channel extends EventEmitter {
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// Get our friend's cursor position
|
||||||
const cursorPos: {
|
const cursorPos: {
|
||||||
x: string | number | undefined;
|
x: string | number | undefined;
|
||||||
y: string | number | undefined;
|
y: string | number | undefined;
|
||||||
} = socket.getCursorPos();
|
} = socket.getCursorPos();
|
||||||
|
|
||||||
// Broadcast participant update
|
// Broadcast a participant update for them
|
||||||
this.sendArray([
|
this.sendArray([
|
||||||
{
|
{
|
||||||
m: "p",
|
m: "p",
|
||||||
|
@ -305,6 +306,9 @@ export class Channel extends EventEmitter {
|
||||||
y: cursorPos.y
|
y: cursorPos.y
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// Broadcast a channel update so everyone subscribed to the channel list can see us
|
||||||
|
this.emit("update", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -342,7 +346,7 @@ export class Channel extends EventEmitter {
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
this.emit("update");
|
this.emit("update", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -514,7 +518,7 @@ export class Channel extends EventEmitter {
|
||||||
this.crown.userId = part._id;
|
this.crown.userId = part._id;
|
||||||
this.crown.participantId = part.id;
|
this.crown.participantId = part.id;
|
||||||
this.crown.time = Date.now();
|
this.crown.time = Date.now();
|
||||||
this.emit("update");
|
this.emit("update", this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -551,7 +555,7 @@ export class Channel extends EventEmitter {
|
||||||
|
|
||||||
delete this.crown.participantId;
|
delete this.crown.participantId;
|
||||||
|
|
||||||
this.emit("update");
|
this.emit("update", this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import { findSocketByPartID } from "../ws/Socket";
|
import { type Socket, findSocketByPartID } from "../ws/Socket";
|
||||||
import type Channel from "./Channel";
|
import type Channel from "./Channel";
|
||||||
|
|
||||||
const onChannelUpdate = (channel: Channel) => {
|
const onChannelUpdate = (channel: Channel) => {
|
||||||
const info = channel.getInfo();
|
const info = channel.getInfo();
|
||||||
const ppl = channel.getParticipantList();
|
// const ppl = channel.getParticipantList();
|
||||||
|
if (info.settings.visible !== true) return;
|
||||||
|
|
||||||
for (const partId of ChannelList.subscribers) {
|
for (const partId of ChannelList.subscribers) {
|
||||||
const socket = findSocketByPartID(partId);
|
const socket = findSocketByPartID(partId);
|
||||||
|
@ -16,7 +17,7 @@ const onChannelUpdate = (channel: Channel) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.sendChannelUpdate(info, ppl);
|
socket.sendChannelList([info], false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,16 +27,27 @@ export class ChannelList {
|
||||||
|
|
||||||
public static add(channel: Channel) {
|
public static add(channel: Channel) {
|
||||||
this.list.push(channel);
|
this.list.push(channel);
|
||||||
channel.on("update", () => {
|
channel.on("update", onChannelUpdate);
|
||||||
onChannelUpdate(channel);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static remove(channel: Channel) {
|
public static remove(channel: Channel) {
|
||||||
this.list.splice(this.list.indexOf(channel), 1);
|
this.list.splice(this.list.indexOf(channel), 1);
|
||||||
|
channel.off("update", onChannelUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static getList() {
|
public static getList() {
|
||||||
return this.list;
|
return this.list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static getPublicList() {
|
||||||
|
return this.list.filter(ch => ch.getSetting("visible") == true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static subscribe(partId: Socket["id"]) {
|
||||||
|
this.subscribers.push(partId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static unsubscribe(partId: Socket["id"]) {
|
||||||
|
this.subscribers.splice(this.subscribers.indexOf(partId), 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ export class Socket extends EventEmitter {
|
||||||
this.desiredChannel.set = set;
|
this.desiredChannel.set = set;
|
||||||
|
|
||||||
let channel;
|
let channel;
|
||||||
for (const ch of ChannelList.getList()) {
|
for (const ch of ChannelList.getPublicList()) {
|
||||||
if (ch.getID() == _id) {
|
if (ch.getID() == _id) {
|
||||||
channel = ch;
|
channel = ch;
|
||||||
}
|
}
|
||||||
|
@ -396,11 +396,30 @@ export class Socket extends EventEmitter {
|
||||||
}
|
}
|
||||||
|
|
||||||
public subscribeToChannelList() {
|
public subscribeToChannelList() {
|
||||||
// TODO Channel list subbing
|
ChannelList.subscribe(this.id);
|
||||||
|
|
||||||
|
const firstList = ChannelList.getPublicList().map(v => v.getInfo());
|
||||||
|
this.sendChannelList(firstList);
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsubscribeFromChannelList() {
|
public unsubscribeFromChannelList() {
|
||||||
// TODO Channel list unsubbing
|
ChannelList.unsubscribe(this.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public sendChannelList(list: IChannelInfo[], complete: boolean = true) {
|
||||||
|
// logger.debug(
|
||||||
|
// "Sending channel list:",
|
||||||
|
// list,
|
||||||
|
// complete ? "(complete)" : "(incomplete)"
|
||||||
|
// );
|
||||||
|
|
||||||
|
this.sendArray([
|
||||||
|
{
|
||||||
|
m: "ls",
|
||||||
|
c: complete,
|
||||||
|
u: list
|
||||||
|
}
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ export const user_flag: ServerEventListener<"user_flag"> = {
|
||||||
if (typeof msg.key !== "string") return;
|
if (typeof msg.key !== "string") return;
|
||||||
if (typeof msg.value == "undefined") return;
|
if (typeof msg.value == "undefined") return;
|
||||||
|
|
||||||
socket.getCurrentChannel()?.logger.debug(msg);
|
// socket.getCurrentChannel()?.logger.debug(msg);
|
||||||
|
|
||||||
// Find the user data we're modifying
|
// Find the user data we're modifying
|
||||||
const user = await readUser(msg._id);
|
const user = await readUser(msg._id);
|
||||||
|
@ -29,6 +29,6 @@ export const user_flag: ServerEventListener<"user_flag"> = {
|
||||||
sock.setUserFlag(msg.key, msg.value);
|
sock.setUserFlag(msg.key, msg.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.getCurrentChannel()?.logger.debug("socks:", socks);
|
// socket.getCurrentChannel()?.logger.debug("socks:", socks);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
|
import { Logger } from "../../../../util/Logger";
|
||||||
import env from "../../../../util/env";
|
import env from "../../../../util/env";
|
||||||
import { ServerEventListener } from "../../../../util/types";
|
import { ServerEventListener } from "../../../../util/types";
|
||||||
import { config } from "../../../usersConfig";
|
import { config } from "../../../usersConfig";
|
||||||
|
|
||||||
|
const logger = new Logger("Admin Message Handler");
|
||||||
|
|
||||||
export const admin_message: ServerEventListener<"admin message"> = {
|
export const admin_message: ServerEventListener<"admin message"> = {
|
||||||
id: "admin message",
|
id: "admin message",
|
||||||
callback: (msg, socket) => {
|
callback: (msg, socket) => {
|
||||||
if (typeof msg.password !== "string") return;
|
if (typeof msg.password !== "string") return;
|
||||||
if (msg.password !== env.ADMIN_PASS) return;
|
if (msg.password !== env.ADMIN_PASS) return;
|
||||||
|
|
||||||
socket.admin.emit(msg.msg.m, msg.msg, socket, true);
|
socket.admin.emit(msg.msg.m, msg.msg, socket, true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,6 +9,9 @@ import { m } from "./handlers/m";
|
||||||
import { a } from "./handlers/a";
|
import { a } from "./handlers/a";
|
||||||
import { userset } from "./handlers/userset";
|
import { userset } from "./handlers/userset";
|
||||||
import { n } from "./handlers/n";
|
import { n } from "./handlers/n";
|
||||||
|
import { plus_ls } from "./handlers/+ls";
|
||||||
|
import { minus_ls } from "./handlers/-ls";
|
||||||
|
import { admin_message } from "./handlers/admin_message";
|
||||||
|
|
||||||
EVENTGROUP_USER.add(hi);
|
EVENTGROUP_USER.add(hi);
|
||||||
EVENTGROUP_USER.add(devices);
|
EVENTGROUP_USER.add(devices);
|
||||||
|
@ -17,5 +20,8 @@ EVENTGROUP_USER.add(m);
|
||||||
EVENTGROUP_USER.add(a);
|
EVENTGROUP_USER.add(a);
|
||||||
EVENTGROUP_USER.add(userset);
|
EVENTGROUP_USER.add(userset);
|
||||||
EVENTGROUP_USER.add(n);
|
EVENTGROUP_USER.add(n);
|
||||||
|
EVENTGROUP_USER.add(plus_ls);
|
||||||
|
EVENTGROUP_USER.add(minus_ls);
|
||||||
|
EVENTGROUP_USER.add(admin_message);
|
||||||
|
|
||||||
eventGroups.push(EVENTGROUP_USER);
|
eventGroups.push(EVENTGROUP_USER);
|
||||||
|
|
Loading…
Reference in New Issue