Compare commits

..

18 Commits

Author SHA1 Message Date
lamp 0121a48063 :/ 2026-03-18 03:16:05 -04:00
lamp 525346ddcf change getOwnParticipant()._id to user._id 2026-03-18 03:10:12 -04:00
lamp dff251d33d ignore bot name change 2026-03-18 03:00:04 -04:00
lamp 7e64c4379e add cheez 2026-03-18 02:59:56 -04:00
lamp f3f8a35107 fucking bruh moment 2026-03-18 02:18:39 -04:00
lamp 39adc796d0 up max reconnect interval to 60s 2026-03-18 01:47:48 -04:00
lamp 5ac9604504 updated mppclone uri 2026-03-18 01:43:54 -04:00
lamp 2527a331a7 too much error overload webhook 2025-09-19 01:12:55 -04:00
lamp 17052a9ffe update user-agent 2025-09-19 01:10:22 -04:00
lamp e0dea9ebf4 stop print [object Object] 2025-09-19 01:07:12 -04:00
lamp 4a40060439 no more tag 2025-09-19 00:46:41 -04:00
lamp b507813f0a update deps 2025-09-19 00:44:23 -04:00
lamp 5476ecf714 disable name change msg in dev room 2024-12-05 17:07:41 -06:00
lamp ef4ccb8bc0 update deps 2023-10-10 18:29:16 -05:00
lamp 995ac6d96f delete unused prbridge and screenshotter 2023-10-10 16:17:16 -07:00
lamp e21a264ed0 normalize indents 2023-10-10 16:14:42 -07:00
lamp 1af74e957d ignore unknown participant bye 2023-10-10 18:04:19 -05:00
lamp 8bfd16a41f fix useless error 2023-10-10 17:58:11 -05:00
17 changed files with 706 additions and 2045 deletions
+5 -5
View File
@@ -3,11 +3,11 @@
{ "room": "lobby2", "channel": "1159954805146529823", "uri": "wss://game.multiplayerpiano.com:443" }, { "room": "lobby2", "channel": "1159954805146529823", "uri": "wss://game.multiplayerpiano.com:443" },
{ "room": "test/awkward", "channel": "1159954847542546513", "uri": "wss://game.multiplayerpiano.com:443" }, { "room": "test/awkward", "channel": "1159954847542546513", "uri": "wss://game.multiplayerpiano.com:443" },
{ "room": "lobby", "channel": "339609383644168195", "uri": "wss://mppclone.com:8443" }, { "room": "lobby", "channel": "339609383644168195", "uri": "wss://backend.multiplayerpiano.net" },
{ "room": "lobby2", "channel": "350006891948277770", "uri": "wss://mppclone.com:8443" }, { "room": "lobby2", "channel": "350006891948277770", "uri": "wss://backend.multiplayerpiano.net" },
{ "room": "✧𝓓𝓔𝓥 𝓡𝓸𝓸𝓶✧", "channel": "698736467559710740", "uri": "wss://mppclone.com:8443" }, { "room": "✧𝓓𝓔𝓥 𝓡𝓸𝓸𝓶✧", "channel": "698736467559710740", "uri": "wss://backend.multiplayerpiano.net" },
{ "room": "test/awkward", "channel": "360556775860076544", "uri": "wss://mppclone.com:8443" }, { "room": "test/awkward", "channel": "360556775860076544", "uri": "wss://backend.multiplayerpiano.net" },
{ "room": "test/fishing", "channel": "339613702472859659", "uri": "wss://mppclone.com:8443" }, { "room": "test/fishing", "channel": "339613702472859659", "uri": "wss://backend.multiplayerpiano.net" },
{ "room": "lobby", "channel": "339904195719200768", "uri": "wss://piano.ourworldofpixels.com" } { "room": "lobby", "channel": "339904195719200768", "uri": "wss://piano.ourworldofpixels.com" }
] ]
+2 -2
View File
@@ -76,7 +76,7 @@ Client.prototype.connect = function() {
if(typeof module !== "undefined") { if(typeof module !== "undefined") {
let headers = { let headers = {
"origin": `https://${new URL(this.uri).host}`, "origin": `https://${new URL(this.uri).host}`,
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36" "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}; };
if (this.uri.includes("multiplayerpiano.com")) headers["X-Forwarded-For"] = `${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}`; if (this.uri.includes("multiplayerpiano.com")) headers["X-Forwarded-For"] = `${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}`;
// nodejsicle // nodejsicle
@@ -105,7 +105,7 @@ Client.prototype.connect = function() {
} else { } else {
++self.connectionAttempts; ++self.connectionAttempts;
} }
var ms_lut = [50, 2950, 7000, 10000]; var ms_lut = [50, 2950, 7000, 10000, 30000, 60000];
var idx = self.connectionAttempts; var idx = self.connectionAttempts;
if(idx >= ms_lut.length) idx = ms_lut.length - 1; if(idx >= ms_lut.length) idx = ms_lut.length - 1;
var ms = ms_lut[idx]; var ms = ms_lut[idx];
+1 -1
View File
@@ -18,7 +18,7 @@ global.dClient = new Discord.Client({
let msg = error && (error.stack || error.message || error); let msg = error && (error.stack || error.message || error);
console.error(title + ':\n' + msg); console.error(title + ':\n' + msg);
try { try {
webhook.send(`${title ? `**${title}:**` : ""}\`\`\`\n${msg}\n\`\`\``).catch(()=>{}); //webhook.send(`${title ? `**${title}:**` : ""}\`\`\`\n${msg}\n\`\`\``).catch(()=>{});
} catch(e) {} } catch(e) {}
} }
process.on('unhandledRejection', error => handleError(error, "Unhandled Rejection")); process.on('unhandledRejection', error => handleError(error, "Unhandled Rejection"));
+2 -12
View File
@@ -9,7 +9,7 @@
dClient.on('guildMemberRemove', async member => { dClient.on('guildMemberRemove', async member => {
if (member.guild.id != config.guildID) return; if (member.guild.id != config.guildID) return;
let username = member.user.username.toLowerCase().includes('clyde') ? member.user.username.replace(/C/g,'Q').replace(/c/g,'q') : member.user.username; let username = member.user.username.toLowerCase().includes('clyde') ? member.user.username.replace(/C/g,'Q').replace(/c/g,'q') : member.user.username;
webhook.send({content: `${member.user.tag} left.`, username, avatarURL: member.user.displayAvatarURL({format:'png',size:2048})}); webhook.send({content: `${member.user.username} left.`, username, avatarURL: member.user.displayAvatarURL({format:'png',size:2048})});
}); });
})(); })();
@@ -67,17 +67,7 @@ dClient.on("emojiDelete", async emoji => {
// allow anyone to pin a message via reaction // allow anyone to pin a message via reaction
// todo need enable partials for it to work on old messages // todo need enable partials for it to work on old messages
dClient.on("messageReactionAdd", async (messageReaction) => { dClient.on("messageReactionAdd", async (messageReaction) => {
if (messageReaction.guild.id != config.guildID) return; if (messageReaction.guild?.id != config.guildID) return;
if (messageReaction.emoji.name == "📌" || messageReaction.emoji.name == "📍") if (messageReaction.emoji.name == "📌" || messageReaction.emoji.name == "📍")
await messageReaction.message.pin(); await messageReaction.message.pin();
}); });
+8 -6
View File
@@ -7,7 +7,7 @@ global.createMPPbridge = async function createMPPbridge({room, channel, uri}) {
var d = new DiscordMessageSender(channel); var d = new DiscordMessageSender(channel);
const gClient = new Client(uri); const gClient = new Client(uri);
if (uri == "wss://mppclone.com:8443") gClient.token = config.mpc_token; //todo hmm if (uri == "wss://backend.multiplayerpiano.net") gClient.token = config.mpc_token; //todo hmm
gClient.setChannel(room, {visible:false}); gClient.setChannel(room, {visible:false});
gClient.start(); gClient.start();
@@ -21,10 +21,10 @@ global.createMPPbridge = async function createMPPbridge({room, channel, uri}) {
let lastError; let lastError;
gClient.on("error", error => { gClient.on("error", error => {
//handleError(error, `[${uri}][${room}]`); handleError(error, `[${uri}][${room}]`);
error = error.toString(); error = error.message || JSON.stringify(error);
if (lastError != error) { if (lastError != error) {
d.send(`**${error.toString()}**`); d.send(`**${error}**`);
lastError = error; lastError = error;
} }
}); });
@@ -78,7 +78,7 @@ global.createMPPbridge = async function createMPPbridge({room, channel, uri}) {
// MPP to Discord // MPP to Discord
gClient.on('a', async msg => { gClient.on('a', async msg => {
if (msg.p._id == gClient.getOwnParticipant()._id) return; if (msg.p._id == gClient.user._id) return;
var id = msg.p._id.substr(0,6); var id = msg.p._id.substr(0,6);
var name = sanitizeName(msg.p.name); var name = sanitizeName(msg.p.name);
var content = msg.a; var content = msg.a;
@@ -119,7 +119,8 @@ global.createMPPbridge = async function createMPPbridge({room, channel, uri}) {
gClient.prependListener("p", async participant => { gClient.prependListener("p", async participant => {
if (gClient.ppl[participant.id]) { // is update if (gClient.ppl[participant.id]) { // is update
let oldName = gClient.ppl[participant.id].name, newName = participant.name; let oldName = gClient.ppl[participant.id].name, newName = participant.name;
if (newName != oldName) let isBot = gClient.ppl[participant.id].tag?.text == "BOT";
if (newName != oldName && !isBot)
d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(oldName)}** changed their name to **${sanitizeName(newName)}**___`); d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(oldName)}** changed their name to **${sanitizeName(newName)}**___`);
} else { // is join } else { // is join
d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(participant.name)}** entered the room.___`); d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(participant.name)}** entered the room.___`);
@@ -127,6 +128,7 @@ global.createMPPbridge = async function createMPPbridge({room, channel, uri}) {
}); });
gClient.prependListener("bye", async msg => { gClient.prependListener("bye", async msg => {
var participant = gClient.ppl[msg.p]; var participant = gClient.ppl[msg.p];
if (!participant) return;
d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(participant.name)}** left the room.___`); d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(participant.name)}** left the room.___`);
}); });
+523 -412
View File
File diff suppressed because it is too large Load Diff
+3 -4
View File
@@ -1,9 +1,8 @@
{ {
"dependencies": { "dependencies": {
"async-exit-hook": "^2.0.1", "async-exit-hook": "^2.0.1",
"discord.js": "^13.5.0", "discord.js": "^13.17.1",
"dotenv": "^8.2.0", "dotenv": "^8.6.0",
"socketcluster-client": "^14.2.2", "ws": "^8.18.3"
"ws": "^3.3.2"
} }
} }
-48
View File
@@ -1,48 +0,0 @@
const socketCluster = require("socketcluster-client")
const EventEmitter = require("events").EventEmitter;
class PRClient extends EventEmitter {
constructor(credentials, options) {
super()
EventEmitter.call(this);
this.options = options;
this.socket;
this.channels = {};
this.credentials = credentials
}
connect() {
if (!this.options) {
this.options = {
path: "/socketcluster/",
hostname: "www.pianorhythm.me",
port: 443,
secure: true,
autoReconnect: true,
}
}
// Initiate the connection to the server
this.socket = socketCluster.connect(this.options);
this.socket.connect();
this.socket.on("error", (msg) => {
handleError(msg, "pr socket");
})
this.socket.on("connect", () => {
console.log("Connected!")
this.socket.emit("enableAuthLogin", {
enable: true,
roomName: this.credentials.roomName
});
this.socket.emit("enableCursor", {
enable: true
});
this.socket.emit("login", {
password: this.credentials.password,
roomName: this.credentials.roomName,
username: this.credentials.username
});
this.socket.emit("getPlayerStats", {
"username": this.credentials.username
})
})
}
}
module.exports = PRClient;
-54
View File
@@ -1,54 +0,0 @@
const PRClient = require("./PRClient.js");
let client = new PRClient({// account stuff
username: "Discord",
password: config.pr_password,
roomName: 'lobby'
});
global.prClient = client;
client.connect();
client.socket.on("setRoom", function (data, callback) {
client.roomID = data.roomID;
try {
if (client.channels.chatChannel && client.roomID) {
client.socket.destroyChannel(client.roomID);
}
} catch (err) {}
client.channels.chatChannel = client.socket.subscribe(data.roomID);
client.channels.chatChannel.watch(messagehandle);
})
async function messagehandle(data) {
if (data && data.type) {
switch (data.type) {
case "chat":
if (data && data.message) {
let name = data.name || "";
let effect = data.effect || "";
let roomName = data.roomName;
let color = data.color;
let id = data.sID || data.socketID || data.id;
if (id == client.socket.id) return;
let c = dClient.channels.resolve("593943518351982603");
let msg;
(!name && (data.message.startsWith("[i]"))) ? msg = `*${data.message.split("[i]")[1]}*` : msg = `**${sanitizeName(name)}:** ${data.message}`;
if (c) c.send(msg);
}
break;
}
}
}
dClient.on("messageCreate", async message => {
if (message.channel.id != "593943518351982603" || message.author.id == dClient.user.id) return;
if (!client.roomID) return;
client.socket.publish(client.roomID, {
"type": "chat",
"message": `${message.member && message.member.displayName || message.author.username}#${message.author.discriminator}: ${message.cleanContent + (message.attachments.size > 0 && message.attachments.map(x => x.url).join(' ') || '')}`,
"value": false,
"socketID": "[discord.gg/k44Eqha]",
"uuid": "[discord.gg/k44Eqha]",
"color": "#8012ed",
"name": "[discord.gg/k44Eqha]"
});
});
-5
View File
@@ -1,5 +0,0 @@
FROM buildkite/puppeteer
ADD . /app
WORKDIR /app
RUN npm ci
CMD ["node", "screenshotter.js"]
-1255
View File
File diff suppressed because it is too large Load Diff
-7
View File
@@ -1,7 +0,0 @@
{
"dependencies": {
"discord.js": "^12.5.3",
"dotenv": "^10.0.0",
"puppeteer": "^10.2.0"
}
}
-72
View File
@@ -1,72 +0,0 @@
require("dotenv").config();
var Discord = require("discord.js");
var puppeteer = require('puppeteer');
var wh_hmpps = new Discord.WebhookClient(process.env.WH_HMPPS_ID, process.env.WH_HMPPS_TOKEN);
var wh_hrprs = new Discord.WebhookClient(process.env.WH_HRPRS_ID, process.env.WH_HRPRS_TOKEN);
var wh_howps = new Discord.WebhookClient(process.env.WH_HOWPS_ID, process.env.WH_HOWPS_TOKEN);
global.screenshotter = {
capture: async function () {
console.log('Starting screen captures');
try {
var browser = await puppeteer.launch(/*{ args: ['--no-sandbox'] }*/);
var page = await browser.newPage();
await page.setViewport({ width: 1440, height: 900 });
try {
await page.goto('https://www.multiplayerpiano.com/');
try {await page.evaluate(function () {
document.getElementById('modal').click();
//MPP.client.uri = "wss://mpp_proxy.qonq.gq";
});} catch(e) {console.error(e.message)}
await new Promise(resolve => setTimeout(resolve, 5000));
let screenshot = await page.screenshot({ type: 'png' });
let filename = `Screenshot of www.multiplayerpiano.com @ ${new Date().toISOString()}.png`;
let attachment = new Discord.MessageAttachment(screenshot, filename);
await wh_hmpps.send(attachment);
} catch (error) {
await wh_hmpps.send(`:warning: ${error.stack}`);
}
try {
await page.evaluate(function () {
MPP.client.setChannel("✧𝓓𝓔𝓥 𝓡𝓸𝓸𝓶✧");
});
await new Promise(resolve => setTimeout(resolve, 5000));
let screenshot = await page.screenshot({ type: 'png' });
let filename = `Screenshot of www.multiplayerpiano.com/✧𝓓𝓔𝓥 𝓡𝓸𝓸𝓶✧ @ ${new Date().toISOString()}.png`;
let attachment = new Discord.MessageAttachment(screenshot, filename);
await wh_hrprs.send(attachment);
} catch(error) {
await wh_hrprs.send(`:warning: ${error.stack}`);
}
try {
await page.goto('http://ourworldofpixels.com');
await page.evaluate(function (owopcaptcha) {
localStorage.owopcaptcha = owopcaptcha;
OWOP.camera.zoom = 1;
}, process.env.OWOP_CAPTCHA_PASSWORD);
await new Promise(resolve => setTimeout(resolve, 2000));
await page.evaluate(function () {
for (let butt of document.getElementsByTagName('button')) {
if (butt.innerText == 'OK') {butt.click();break}
}
});
await new Promise(resolve => setTimeout(resolve, 13000));
let screenshot = await page.screenshot({ type: 'png' });
let filename = `Screenshot of ourworldofpixels.com/main @ ${new Date().toISOString()}.png`;
let attachment = new Discord.MessageAttachment(screenshot, filename);
await wh_howps.send(attachment);
} catch (error) {
await wh_howps.send(`:warning: ${error.stack}`);
}
} catch(error) {
console.error(`Error occured with screen capture:\n${error.stack}`)
} finally {
if (browser) await browser.close();
console.log('Finished screen captures');
}
},
interval: setInterval(() => { screenshotter.capture(); }, 1000 * 60 * 60)
};
screenshotter.capture();