Compare commits

..

2 commits

Author SHA1 Message Date
86269e624b
bump version 2024-05-08 01:02:42 +01:00
ba0d062512
defend against the client crapping out 2024-05-08 01:02:18 +01:00
3 changed files with 47 additions and 34 deletions

View file

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name MultiProbe // @name MultiProbe
// @namespace https://*.angusnicneven.com/* // @namespace https://*.angusnicneven.com/*
// @version 20240507.1 // @version 20240508.1
// @description Probe with friends! // @description Probe with friends!
// @author tgpholly // @author tgpholly
// @match https://*.angusnicneven.com/* // @match https://*.angusnicneven.com/*
@ -41,7 +41,7 @@ console.log("[MP] MultiProbe init");
'use strict'; 'use strict';
// Make sure to change the userscript version too!!!!!!!!!! // Make sure to change the userscript version too!!!!!!!!!!
const USERSCRIPT_VERSION_RAW = "20240507.1"; const USERSCRIPT_VERSION_RAW = "20240508.1";
const USERSCRIPT_VERSION = parseInt(USERSCRIPT_VERSION_RAW.replace(".", "")); const USERSCRIPT_VERSION = parseInt(USERSCRIPT_VERSION_RAW.replace(".", ""));
if (!continueRunningScript) { if (!continueRunningScript) {
@ -461,35 +461,39 @@ kbd {
let timeLastFrame = performance.now(); let timeLastFrame = performance.now();
let frameDeltaTime = 0; let frameDeltaTime = 0;
let timeSinceLastPingReset = performance.now(); let timeSinceLastPingReset = performance.now();
function animate() { try {
frameDeltaTime = (performance.now() - timeLastFrame) * 0.001; function animate() {
frameDeltaTime = (performance.now() - timeLastFrame) * 0.001;
if (ws && ready) { if (ws && ready) {
if (currentMouseX !== oldMouseX || currentMouseY !== oldMouseY) { if (currentMouseX !== oldMouseX || currentMouseY !== oldMouseY) {
if ((performance.now() - lastSendTime) >= 41) { if ((performance.now() - lastSendTime) >= 41) {
lastSendTime = performance.now(); lastSendTime = performance.now();
oldMouseX = currentMouseX; oldMouseX = currentMouseX;
oldMouseY = currentMouseY; oldMouseY = currentMouseY;
ws.send(createWriter(Endian.LE, 9).writeByte(MessageType.CursorPos).writeFloat(oldMouseX / clientWidth).writeInt(currentMouseY).toBuffer()); ws.send(createWriter(Endian.LE, 9).writeByte(MessageType.CursorPos).writeFloat(oldMouseX / clientWidth).writeInt(currentMouseY).toBuffer());
}
} }
} }
if ((performance.now() - timeSinceLastPingReset) >= 1000) {
allowedPings = 10;
timeSinceLastPingReset = performance.now();
}
remoteClients.forEach(remoteUser => {
remoteUser.actualX = lerp(remoteUser.actualX, remoteUser.targetX, 20 * frameDeltaTime);
remoteUser.actualY = lerp(remoteUser.actualY, remoteUser.targetY, 20 * frameDeltaTime);
remoteUser.updateCursor();
});
requestAnimationFrame(animate);
timeLastFrame = performance.now();
} }
animate();
if ((performance.now() - timeSinceLastPingReset) >= 1000) { } catch (e) {
allowedPings = 10; console.error(e);
timeSinceLastPingReset = performance.now();
}
remoteClients.forEach(remoteUser => {
remoteUser.actualX = lerp(remoteUser.actualX, remoteUser.targetX, 20 * frameDeltaTime);
remoteUser.actualY = lerp(remoteUser.actualY, remoteUser.targetY, 20 * frameDeltaTime);
remoteUser.updateCursor();
});
requestAnimationFrame(animate);
timeLastFrame = performance.now();
} }
animate();
let windowContainer = null; let windowContainer = null;
@ -622,7 +626,9 @@ kbd {
setTimeout(() => doConnect(localStorage["mpapikey"]), 5000); setTimeout(() => doConnect(localStorage["mpapikey"]), 5000);
} }
ws.onclose = onCloseAndError; ws.onclose = onCloseAndError;
ws.onerror = onCloseAndError; ws.onerror = (e) => {
console.error(e);
}
} }
function createOnlineDialog() { function createOnlineDialog() {

View file

@ -411,10 +411,13 @@ websocketServer.on("connection", (socket) => {
socket.on("message", async (data) => { socket.on("message", async (data) => {
const reader = createReader(Endian.LE, data as Buffer); const reader = createReader(Endian.LE, data as Buffer);
// There is absolutely no reason we should ever get
// more than 50 bytes legit.
if (reader.length > 0 && reader.length < 1024) { if (reader.length > 0 && reader.length < 1024) {
switch (reader.readByte()) { switch (reader.readByte()) {
case MessageType.KeepAlive:
{
user.lastKeepAliveTime = Date.now();
break;
}
case MessageType.ClientDetails: case MessageType.ClientDetails:
{ {
if (user !== undefined) { if (user !== undefined) {
@ -449,9 +452,9 @@ websocketServer.on("connection", (socket) => {
usersToSend.writeUInt(otherUser.id).writeShortString(otherUser.username).writeFloat(otherUser.cursorX).writeInt(otherUser.cursorY); usersToSend.writeUInt(otherUser.id).writeShortString(otherUser.username).writeFloat(otherUser.cursorX).writeInt(otherUser.cursorY);
} }
if (dbParty) { if (dbParty) {
user = users.set(myUUID, new RemoteUser(socket, dbUser.Username, page, rawURL, dbUser.Id, dbParty.Id, dbParty.Name)); user = users.set(myUUID, new RemoteUser(socket, myUUID, dbUser.Username, page, rawURL, dbUser.Id, dbParty.Id, dbParty.Name));
} else { } else {
user = users.set(myUUID, new RemoteUser(socket, dbUser.Username, page, rawURL, dbUser.Id, Number.MIN_VALUE, "")); user = users.set(myUUID, new RemoteUser(socket, myUUID, dbUser.Username, page, rawURL, dbUser.Id, Number.MIN_VALUE, ""));
} }
sendToAllButSelf(user, createWriter(Endian.LE, 6 + dbUser.Username.length).writeByte(MessageType.ClientJoined).writeUInt(user.id).writeShortString(dbUser.Username).toBuffer()); sendToAllButSelf(user, createWriter(Endian.LE, 6 + dbUser.Username.length).writeByte(MessageType.ClientJoined).writeUInt(user.id).writeShortString(dbUser.Username).toBuffer());
user.send(usersToSend.toBuffer()); user.send(usersToSend.toBuffer());

View file

@ -3,7 +3,8 @@ import { WebSocket } from "ws";
export default class RemoteUser { export default class RemoteUser {
private static USER_IDS = 0; private static USER_IDS = 0;
private readonly socket:WebSocket; public readonly socket:WebSocket;
public readonly connectionUUID:string;
public readonly id:number; public readonly id:number;
public readonly username:string; public readonly username:string;
public readonly currentURL:string; public readonly currentURL:string;
@ -15,9 +16,11 @@ export default class RemoteUser {
public userId:number; public userId:number;
public groupId:number = Number.MIN_VALUE; public groupId:number = Number.MIN_VALUE;
public groupName:string; public groupName:string;
public lastKeepAliveTime:number;
constructor(socket:WebSocket, username:string, currentURL:string, rawURL:string, userId:number, groupId:number, groupName:string) { constructor(socket:WebSocket, connectionUUID:string, username:string, currentURL:string, rawURL:string, userId:number, groupId:number, groupName:string) {
this.socket = socket; this.socket = socket;
this.connectionUUID = connectionUUID;
this.id = RemoteUser.USER_IDS++; this.id = RemoteUser.USER_IDS++;
this.username = username; this.username = username;
this.currentURL = currentURL; this.currentURL = currentURL;
@ -27,6 +30,7 @@ export default class RemoteUser {
this.userId = userId; this.userId = userId;
this.groupId = groupId; this.groupId = groupId;
this.groupName = groupName; this.groupName = groupName;
this.lastKeepAliveTime = Date.now();
} }
send(data:Buffer) { send(data:Buffer) {