diff --git a/config.js b/config.js index 56adb41..ec3adc7 100644 --- a/config.js +++ b/config.js @@ -1,47 +1,47 @@ global.testmode = process.env.TEST ? true : false; module.exports = { - - "DISCORD_TOKEN": process.env.DISCORD_TOKEN, + + "DISCORD_TOKEN": process.env.DISCORD_TOKEN, "webhooks": { - "welcome": process.env.WEBHOOK_WELCOME, - "error": process.env.WEBHOOK_ERROR, - "ddp": process.env.WEBHOOK_DDP, - "pinboard": process.env.WEBHOOK_PINBOARD + "welcome": process.env.WEBHOOK_WELCOME, + "error": process.env.WEBHOOK_ERROR, + "ddp": process.env.WEBHOOK_DDP, + "pinboard": process.env.WEBHOOK_PINBOARD }, - "opID": "330499035419115522", - "guildID": testmode ? "467473467634089985" : "321819041348190249", + "opID": "330499035419115522", + "guildID": testmode ? "467473467634089985" : "321819041348190249", - "channels": { // includes voice channels & category channels - "main": testmode ? "467473467634089987" : "321819041348190249", - "view_deleted_channels": testmode ? "467473467634089989" : "425060452129701889", - "name_collection": testmode ? "467481952728121345" : '379738469511069698', - "mpp_bridges": testmode ? "467481904707534850" : '360557444952227851', - "user_channels": testmode ? "467482031157149709" : '399735134061985792', - "deleted_channels": testmode ? "467482085657935872" : '425054198699261953', - "deleted_bridges": testmode ? "467482121657778176" : '696954288752164914', - "mpp_screenshot": testmode ? "467482164611514388" : '383773548810076163', - "owop_screenshot": testmode ? "467482202217906226" : '399079481161023492' - }, + "channels": { // includes voice channels & category channels + "main": testmode ? "467473467634089987" : "321819041348190249", + "view_deleted_channels": testmode ? "467473467634089989" : "425060452129701889", + "name_collection": testmode ? "467481952728121345" : '379738469511069698', + "mpp_bridges": testmode ? "467481904707534850" : '360557444952227851', + "user_channels": testmode ? "467482031157149709" : '399735134061985792', + "deleted_channels": testmode ? "467482085657935872" : '425054198699261953', + "deleted_bridges": testmode ? "467482121657778176" : '696954288752164914', + "mpp_screenshot": testmode ? "467482164611514388" : '383773548810076163', + "owop_screenshot": testmode ? "467482202217906226" : '399079481161023492' + }, - "roles": { - "viewing_deleted_channels": testmode ? "467473718353068042" : "425060792455397376", - }, + "roles": { + "viewing_deleted_channels": testmode ? "467473718353068042" : "425060792455397376", + }, - - "mppname": "[discord.gg/k44Eqha]", - "disabledRooms": [ - "RP Room", - "Legends of Alorgon {RP Room}", - "Legends of Alorgon", - "Breastmilk ♥ 7:45 AM" - ], + + "mppname": "[discord.gg/k44Eqha]", + "disabledRooms": [ + "RP Room", + "Legends of Alorgon {RP Room}", + "Legends of Alorgon", + "Breastmilk ♥ 7:45 AM" + ], - "owop_captcha_password": process.env.OWOP_CAPTCHA_PASSWORD, - "pr_password": process.env.PR_PASSWORD, - "mpc_token": process.env.MPC_TOKEN, + "owop_captcha_password": process.env.OWOP_CAPTCHA_PASSWORD, + "pr_password": process.env.PR_PASSWORD, + "mpc_token": process.env.MPC_TOKEN, } diff --git a/ddpbridge.js b/ddpbridge.js index 8132f3c..836c301 100644 --- a/ddpbridge.js +++ b/ddpbridge.js @@ -9,56 +9,56 @@ var wasConnected = false; //var myId; var wsc = new WebSocketMessageCollector(async function(data, startDate, endDate){ - await webhook.send({files:[{ - attachment: data, - name: `daydun piano main raw data recording from ${startDate.toISOString()} to ${endDate.toISOString()} .txt.gz` - }]}); + await webhook.send({files:[{ + attachment: data, + name: `daydun piano main raw data recording from ${startDate.toISOString()} to ${endDate.toISOString()} .txt.gz` + }]}); }); (function connect() { - ws = new WebSocket("wss://daydun.com:5012/?nick=%5Bdiscord.gg%2Fk44Eqha%5D"); - ws.on("open", () => { - if (!wasConnected) send2discord("**Connected**"); - wasConnected = true; - }); - ws.on("message", message => { - wsc.collect(message); - if (typeof message != 'string') return; - var transmission = JSON.parse(message); - if (transmission.type == 'chat') { - let chatmsg = transmission.message; - if (chatmsg.type == "message") { - //if (chatmsg.id != myId) - if (!chatmsg.content.startsWith('\u034f')) - send2discord(`**${sanitizeName(chatmsg.user.nick)}:** ${chatmsg.content}`); - } else if (chatmsg.type == "join") { - send2discord(`__***${sanitizeName(chatmsg.nick || chatmsg.id)} joined.***__`); - } else if (chatmsg.type == "leave") { - send2discord(`__***${sanitizeName(chatmsg.nick || chatmsg.id)} left.***__`); - } - } /*else if (transmission.type == 'load') { - myId = transmission.id; - }*/ - }); - ws.on("error", error => handleError(error)); - ws.on("close", () => { - if (wasConnected) send2discord("**Disconnected**"); - wasConnected = false; - setTimeout(connect, 5000); - }); + ws = new WebSocket("wss://daydun.com:5012/?nick=%5Bdiscord.gg%2Fk44Eqha%5D"); + ws.on("open", () => { + if (!wasConnected) send2discord("**Connected**"); + wasConnected = true; + }); + ws.on("message", message => { + wsc.collect(message); + if (typeof message != 'string') return; + var transmission = JSON.parse(message); + if (transmission.type == 'chat') { + let chatmsg = transmission.message; + if (chatmsg.type == "message") { + //if (chatmsg.id != myId) + if (!chatmsg.content.startsWith('\u034f')) + send2discord(`**${sanitizeName(chatmsg.user.nick)}:** ${chatmsg.content}`); + } else if (chatmsg.type == "join") { + send2discord(`__***${sanitizeName(chatmsg.nick || chatmsg.id)} joined.***__`); + } else if (chatmsg.type == "leave") { + send2discord(`__***${sanitizeName(chatmsg.nick || chatmsg.id)} left.***__`); + } + } /*else if (transmission.type == 'load') { + myId = transmission.id; + }*/ + }); + ws.on("error", error => handleError(error)); + ws.on("close", () => { + if (wasConnected) send2discord("**Disconnected**"); + wasConnected = false; + setTimeout(connect, 5000); + }); })(); function send2discord(message) { - webhook.send(message.substring(0,2000)); + webhook.send(message.substring(0,2000)); } function send2ddp(message) { - if (ws.readyState == WebSocket.OPEN) ws.send(JSON.stringify({type:"chat",message})); + if (ws.readyState == WebSocket.OPEN) ws.send(JSON.stringify({type:"chat",message})); } dClient.on("messageCreate", message => { - if (message.channel.id != "508890674138054667" || message.author.bot) return; - var x = message.cleanContent; - if (message.attachments.size > 0) x += ' ' + message.attachments.map(a => a.url).join(' '); - send2ddp(`\u034f${message.member.displayName}#${message.author.discriminator}: ${x}`); + if (message.channel.id != "508890674138054667" || message.author.bot) return; + var x = message.cleanContent; + if (message.attachments.size > 0) x += ' ' + message.attachments.map(a => a.url).join(' '); + send2ddp(`\u034f${message.member.displayName}#${message.author.discriminator}: ${x}`); }); diff --git a/lib/datacollector.js b/lib/datacollector.js index aace7aa..ae188f4 100644 --- a/lib/datacollector.js +++ b/lib/datacollector.js @@ -1,28 +1,28 @@ var gzip = require("util").promisify(require("zlib").gzip); module.exports = class WebSocketMessageCollector { - constructor(dispatchFunction) { - this.maxSize = 8000000; - this.data = ""; - this.startDate = new Date(); - this.dispatchFunction = dispatchFunction; - exitHook(cb => { - this.package().then(cb); - }); - } + constructor(dispatchFunction) { + this.maxSize = 8000000; + this.data = ""; + this.startDate = new Date(); + this.dispatchFunction = dispatchFunction; + exitHook(cb => { + this.package().then(cb); + }); + } - collect(message) { - message = message.data || message; - if (message instanceof ArrayBuffer) message = Buffer.from(message).toString('base64'); - var line = `${Date.now()} ${message}\n`; - this.data += line; - if (this.data.length > this.maxSize) this.package(); - } + collect(message) { + message = message.data || message; + if (message instanceof ArrayBuffer) message = Buffer.from(message).toString('base64'); + var line = `${Date.now()} ${message}\n`; + this.data += line; + if (this.data.length > this.maxSize) this.package(); + } - async package() { - var data = this.data, startDate = this.startDate, endDate = new Date(); - this.data = "", this.startDate = new Date(); - data = await gzip(data); - await this.dispatchFunction(data, startDate, endDate); - } + async package() { + var data = this.data, startDate = this.startDate, endDate = new Date(); + this.data = "", this.startDate = new Date(); + data = await gzip(data); + await this.dispatchFunction(data, startDate, endDate); + } } \ No newline at end of file diff --git a/misc.js b/misc.js index b8b04ec..cf32ec6 100644 --- a/misc.js +++ b/misc.js @@ -1,83 +1,73 @@ // join/leave (async function(){ - var webhook = new Discord.WebhookClient({url: config.webhooks.welcome}, {allowedMentions: {parse: []}}); - dClient.on('guildMemberAdd', async member => { - 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; - webhook.send({content: `${member} joined.`, username, avatarURL: member.user.displayAvatarURL({format:'png',size:2048})}); - }); - dClient.on('guildMemberRemove', async member => { - 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; - webhook.send({content: `${member.user.tag} left.`, username, avatarURL: member.user.displayAvatarURL({format:'png',size:2048})}); - }); + var webhook = new Discord.WebhookClient({url: config.webhooks.welcome}, {allowedMentions: {parse: []}}); + dClient.on('guildMemberAdd', async member => { + 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; + webhook.send({content: `${member} joined.`, username, avatarURL: member.user.displayAvatarURL({format:'png',size:2048})}); + }); + dClient.on('guildMemberRemove', async member => { + 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; + webhook.send({content: `${member.user.tag} left.`, username, avatarURL: member.user.displayAvatarURL({format:'png',size:2048})}); + }); })(); // view deleted channels (async function(){ - dClient.on('voiceStateUpdate', async (oldState, newState) => { - if (oldState.channelId != config.channels.view_deleted_channels && newState.channelId == config.channels.view_deleted_channels) { - // member joined the channel - newState.member.roles.add(config.roles.viewing_deleted_channels); - } else if (oldState.channelId == config.channels.view_deleted_channels && newState.channelId != config.channels.view_deleted_channels) { - // member left the channel - newState.member.roles.remove(config.roles.viewing_deleted_channels); - } - }); + dClient.on('voiceStateUpdate', async (oldState, newState) => { + if (oldState.channelId != config.channels.view_deleted_channels && newState.channelId == config.channels.view_deleted_channels) { + // member joined the channel + newState.member.roles.add(config.roles.viewing_deleted_channels); + } else if (oldState.channelId == config.channels.view_deleted_channels && newState.channelId != config.channels.view_deleted_channels) { + // member left the channel + newState.member.roles.remove(config.roles.viewing_deleted_channels); + } + }); })(); // arrange bots at bottom of list (async function(){ - let prefix = "\u17b5"; - let onNick = async member => { - if (member.guild.id != config.guildID) return; - if (member.user.bot && !member.displayName.startsWith(prefix)) - await member.setNickname(`${prefix}${member.displayName}`.substring(0,32)); - }; - dClient.on('guildMemberAdd', onNick); - dClient.on('guildMemberUpdate', async (oldMember, newMember) => { - if (newMember.displayName != oldMember.displayName) await onNick(newMember); - }); + let prefix = "\u17b5"; + let onNick = async member => { + if (member.guild.id != config.guildID) return; + if (member.user.bot && !member.displayName.startsWith(prefix)) + await member.setNickname(`${prefix}${member.displayName}`.substring(0,32)); + }; + dClient.on('guildMemberAdd', onNick); + dClient.on('guildMemberUpdate', async (oldMember, newMember) => { + if (newMember.displayName != oldMember.displayName) await onNick(newMember); + }); })(); // persistent emojis dClient.on("emojiDelete", async emoji => { - console.log("emoji deleted:", emoji.name, emoji.url); - if (global.disableEmojiProtection) return; - if (emoji.name.toLowerCase().includes('delete')) return; - async function readdEmoji() { - await emoji.guild.emojis.create(emoji.url, emoji.name); - delete readdEmoji; - } - // re-add emoji in 5 to 10 minutes - setTimeout(() => { - if (readdEmoji) readdEmoji(); - }, 300000 + Math.random() * 300000); - // wouldn't want emoji to be lost if process is stopped before timeout ends - exitHook(callback => { - if (readdEmoji) readdEmoji().then(() => callback()); - else callback(); - }); + console.log("emoji deleted:", emoji.name, emoji.url); + if (global.disableEmojiProtection) return; + if (emoji.name.toLowerCase().includes('delete')) return; + async function readdEmoji() { + await emoji.guild.emojis.create(emoji.url, emoji.name); + delete readdEmoji; + } + // re-add emoji in 5 to 10 minutes + setTimeout(() => { + if (readdEmoji) readdEmoji(); + }, 300000 + Math.random() * 300000); + // wouldn't want emoji to be lost if process is stopped before timeout ends + exitHook(callback => { + if (readdEmoji) readdEmoji().then(() => callback()); + else callback(); + }); }); // allow anyone to pin a message via reaction // todo need enable partials for it to work on old messages dClient.on("messageReactionAdd", async (messageReaction) => { - if (messageReaction.guild?.id != config.guildID) return; - if (messageReaction.emoji.name == "📌" || messageReaction.emoji.name == "📍") - await messageReaction.message.pin(); + if (messageReaction.guild?.id != config.guildID) return; + if (messageReaction.emoji.name == "📌" || messageReaction.emoji.name == "📍") + await messageReaction.message.pin(); }); - - - - - - - - - - diff --git a/mppbridger.js b/mppbridger.js index a0b3eed..6767f7d 100644 --- a/mppbridger.js +++ b/mppbridger.js @@ -117,19 +117,19 @@ global.createMPPbridge = async function createMPPbridge({room, channel, uri}) { // announce join/leave/rename gClient.prependListener("p", async participant => { - if (gClient.ppl[participant.id]) { // is update - let oldName = gClient.ppl[participant.id].name, newName = participant.name; - if (newName != oldName) - d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(oldName)}** changed their name to **${sanitizeName(newName)}**___`); - } else { // is join - d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(participant.name)}** entered the room.___`); - } + if (gClient.ppl[participant.id]) { // is update + let oldName = gClient.ppl[participant.id].name, newName = participant.name; + if (newName != oldName) + d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(oldName)}** changed their name to **${sanitizeName(newName)}**___`); + } else { // is join + d.send(`\`${participant._id.substr(0,6)}\` ___**${sanitizeName(participant.name)}** entered the room.___`); + } }); 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.___`); + }); @@ -143,8 +143,8 @@ global.createMPPbridge = async function createMPPbridge({room, channel, uri}) { // handle bans if (msg.text && (msg.text.startsWith('Banned from "'+room+'"') || msg.text.startsWith('Currently banned from "'+room+'"'))) { - // Banned from "{room}" for {n} minutes. - // Currently banned from "{room}" for {n} minutes. + // Banned from "{room}" for {n} minutes. + // Currently banned from "{room}" for {n} minutes. let arr = msg.text.split(' '); arr.pop(); let minutes = arr.pop(); @@ -170,7 +170,7 @@ global.createMPPbridge = async function createMPPbridge({room, channel, uri}) { }); - + // addons var wsc = new WebSocketMessageCollector(async function(data, startDate, endDate) { var attachmentName = `${uri} ${room} raw data recording from ${startDate.toISOString()} to ${endDate.toISOString()} .txt.gz`; diff --git a/prbridge/PRClient.js b/prbridge/PRClient.js index bc78f53..f448159 100644 --- a/prbridge/PRClient.js +++ b/prbridge/PRClient.js @@ -1,48 +1,48 @@ 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 - }) - }) - } + 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; \ No newline at end of file diff --git a/prbridge/index.js b/prbridge/index.js index eb6fb85..baf6d18 100644 --- a/prbridge/index.js +++ b/prbridge/index.js @@ -19,24 +19,24 @@ client.socket.on("setRoom", function (data, callback) { }) 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 (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; - } - } + (!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 => { @@ -50,5 +50,5 @@ dClient.on("messageCreate", async message => { "uuid": "[discord.gg/k44Eqha]", "color": "#8012ed", "name": "[discord.gg/k44Eqha]" - }); + }); }); diff --git a/screenshotter/package.json b/screenshotter/package.json index a96896f..09a00e1 100644 --- a/screenshotter/package.json +++ b/screenshotter/package.json @@ -1,7 +1,7 @@ { - "dependencies": { - "discord.js": "^12.5.3", - "dotenv": "^10.0.0", - "puppeteer": "^10.2.0" - } + "dependencies": { + "discord.js": "^12.5.3", + "dotenv": "^10.0.0", + "puppeteer": "^10.2.0" + } } diff --git a/util.js b/util.js index 73a09d6..374d006 100644 --- a/util.js +++ b/util.js @@ -1,11 +1,11 @@ global.random = function (array) { - return array[Math.floor(Math.random() * array.length)] + return array[Math.floor(Math.random() * array.length)] } global.sanitizeName = function sanitizeName(str){ // for showing names in discord str = str.replace(/[_~*\\]/g,"\\$&"); // formatting - str = str.replace(/discord.gg\//g, 'discord.gg\\/'); // invites - str = str.replace(/(http|https):\/\//g, "$1\\://"); // urls + str = str.replace(/discord.gg\//g, 'discord.gg\\/'); // invites + str = str.replace(/(http|https):\/\//g, "$1\\://"); // urls return str; }