diff --git a/mpp.hri7566.info b/mpp.hri7566.info index 327c677..1bcce0f 160000 --- a/mpp.hri7566.info +++ b/mpp.hri7566.info @@ -1 +1 @@ -Subproject commit 327c6775aceb4518437bf3f2c262c6e6f7423579 +Subproject commit 1bcce0f2b59d1d5407c510d738438a3d78ce199a diff --git a/src/Channel.js b/src/Channel.js index fb6f1c6..5f4dcb2 100644 --- a/src/Channel.js +++ b/src/Channel.js @@ -160,8 +160,10 @@ class Channel extends EventEmitter { this.settings = new RoomSettings(this.server.lobbySettings); } - this.settings.color = col.toHexa(); - this.settings.color2 = col.toHexa(); + this.settings.changeSettings({ + color: col.toHexa(), + color2: col.toHexa() + }); for (let key in this.settings) { this.server.lobbySettings[key] = this.settings[key]; @@ -200,7 +202,10 @@ class Channel extends EventEmitter { // user owns the room // we need to switch the crown to them //cl.quotas.a.setParams(Quota.PARAMS_A_CROWNED); - this.crown = new Crown(cl.participantId, cl.user._id); + this.emit("add crown", { + participantId: cl.participantId, + userId: cl.user._id + }); this.crowndropped = false; // this.settings = new RoomSettings(set, 'user'); @@ -281,39 +286,6 @@ class Channel extends EventEmitter { ]); this.updateCh(cl, this.settings); } - - if (this.flags.spin == true) { - this.spin(cl); - } - } - - spin(cl) { - // speeeeeeen - let id = cl.user._id; - if (!id) id = "room"; - this.Notification( - id, - "", - ``, - ``, - 1, - "#names", - "short" - ); - } - - stopSpin(cl) { - let id = cl.user._id; - if (!id) id = "room"; - this.Notification( - id, - "", - ``, - ``, - 1, - "#names", - "short" - ); } remove(p) { @@ -436,7 +408,7 @@ class Channel extends EventEmitter { .get(usr.connectionid) .sendArray(arr); } catch (e) { - console.log(e); + this.logger.error(e); } } }); @@ -582,9 +554,6 @@ class Channel extends EventEmitter { message.t = Date.now(); message.a = msg.message; - console.log("here:", p, msg); - console.log(message.length); - if (message.a.length > 0 && message.a.length <= 512) { message.p = { color: "#ffffff", @@ -726,40 +695,58 @@ class Channel extends EventEmitter { u.setChannel(Channel.banChannel, {}); if (asd) - this.Notification( - user.user._id, - "Notice", - `Banned from \"${this._id}\" for ${Math.floor( + new Notification(this.server, { + id: "", + title: "Notice", + text: `Banned from "${this._id}" for ${Math.floor( Math.floor(ms / 1000) / 60 )} minutes.`, - "", - 7000, - "#room", - "short" - ); + duration: 7000, + target: "#room", + class: "short", + targetUser: user.participantId, + targetChannel: "all", + cl: user + }).send(); + new Notification(this.server, { + id: "", + title: "Notice", + text: `Banned from "${this._id}" for ${Math.floor( + Math.floor(ms / 1000) / 60 + )} minutes.`, + duration: 7000, + target: "#room", + class: "short", + targetUser: user.participantId, + targetChannel: "all", + cl: user + }).send(); if (asd) - this.Notification( - "room", - "Notice", - `${pthatbanned.user.name} banned ${ + new Notification(this.server, { + id: "", + class: "short", + target: "#room", + title: "Notice", + text: `${pthatbanned.user.name} banned ${ user.user.name } from the channel for ${Math.floor( Math.floor(ms / 1000) / 60 )} minutes.`, - "", - 7000, - "#room", - "short" - ); + duration: 7000, + targetChannel: "room", + cl: pthatbanned + }).send(); if (this.crown && this.crown.userId == _id) { - this.Notification( - "room", - "Certificate of Award", - `Let it be known that ${user.user.name} kickbanned him/her self.`, - "", - 7000, - "#room" - ); + new Notification(this.server, { + id: "", + class: "short", + target: "#room", + title: "Certificate of Award", + text: `Let it be known that ${user.user.name} kickbanned him/her self.`, + targetChannel: "room", + duration: 7000, + cl: pthatbanned + }).send(); } //} }); @@ -779,20 +766,6 @@ class Channel extends EventEmitter { this.bans.delete(ban.user._id); } - Notification(who, title, text, html, duration, target, klass, id) { - new Notification({ - id: id, - chat: undefined, - refresh: undefined, - title: title, - text: text, - html: html, - duration: duration, - target: target, - class: klass - }).send(who, this); - } - bindEventListeners() { this.on("bye", participant => { this.remove(participant); @@ -818,24 +791,15 @@ class Channel extends EventEmitter { this.emit("update"); }); - this.on("flag spin", spin => { - if (spin) { - for (let cl of this.connections) { - this.spin(cl); - } - } else { - for (let cl of this.connections) { - this.stopSpin(cl); - } - } + this.on("add crown", msg => { + this.crown = new Crown(msg.participantId, msg.userId); + this.emit("update"); }); - this.on("flag among us", amongus => { - if (amongus) { - this.startAmongUs(); - } else { - this.stopAmongUs(); - } + this.on("kickban", msg => { + if (!msg._id) return; + if (!msg.ms) msg.ms = 30 * 60 * 1000; + this.kickban(msg._id, msg.ms); }); } @@ -853,7 +817,7 @@ class Channel extends EventEmitter { if (typeof msg.set.lobby !== "undefined") { if (msg.set.lobby == true) { - if (!this.isLobby(_id)) delete msg.set.lobby; // keep it nice and clean + if (!this.isLobby(_id)) delete msg.set.lobby; } else { if (this.isLobby(_id)) { msg.set = this.server.lobbySettings; @@ -870,28 +834,6 @@ class Channel extends EventEmitter { if (!val) return this.flags.hasOwnProperty(flag); return this.flags.hasOwnProperty(flag) && this.flags[flag] == val; } - - async startAmongUs() { - if (!this.amongus) { - this.amongus = {}; - } - - if (this.amongus.started) return; - - if (!this.amongus.started) { - this.amongus.started = true; - } - - let imposter = - this.connections[ - Math.floor(Math.random() * this.connections.length) - ]; - imposter.user.setFlag("freeze_name", true); - } - - stopAmongUs() { - this.amongus.started = false; - } } module.exports = Channel; diff --git a/src/Client.js b/src/Client.js index b134575..7d83e27 100644 --- a/src/Client.js +++ b/src/Client.js @@ -78,21 +78,23 @@ class Client extends EventEmitter { } if (userbanned) { - ch.Notification( - this.user._id, - "Notice", - `Currently banned from \"${_id}\" for ${Math.ceil( + new Notification(this.server, { + targetUser: this.participantId, + targetChannel: all, + title: "Notice", + text: `Currently banned from "${_id}" for ${Math.ceil( Math.floor( (userbanned.msbanned - (Date.now() - userbanned.bannedtime)) / 1000 ) / 60 )} minutes.`, - 7000, - "", - "#room", - "short" - ); + duration: 7000, + id: "", + target: "#room", + class: "short", + cl: this + }).send(); this.setChannel(Channel.banChannel, settings); return; } @@ -199,9 +201,22 @@ class Client extends EventEmitter { */ destroy() { if (this.user) { - this.user.stopFlagEvents(); + let lastClient = true; + + for (const cl of this.server.connections.values()) { + if (cl.user) { + if (cl.user._id == this.user._id) { + lastClient = false; + break; + } + } + } + + if (lastClient) this.user.stopFlagEvents(); } + this.ws.close(); + if (this.channel) { this.channel.emit("bye", this); } @@ -235,11 +250,13 @@ class Client extends EventEmitter { // this.destroy(); } }); + this.ws.on("close", () => { if (!this.destroied) { this.destroy(); } }); + this.ws.addEventListener("error", err => { console.error(err); if (!this.destroied) { @@ -258,26 +275,36 @@ class Client extends EventEmitter { let channels = []; this.server.channels.forEach(ch => { let ppl = []; - for (let p of ch.fetchChannelData().ppl) { + const chdata = ch.fetchChannelData(); + + for (let p of chdata.ppl) { ppl.push({ user: p }); } + channels.push({ + chat: ch.chatmsgs.slice(-1 * 32), participants: ppl }); }); let users = []; + let clients = []; this.server.connections.forEach(cl => { + let c = { + ip: cl.ip, + participantId: cl.participantId + }; + clients.push(c); if (!cl.user) return; let u = { p: { _id: cl.user._id, name: cl.user.name, color: cl.user.color, - flags: cl.user.flags, - inventory: cl.user.inventory + flags: cl.user.flags + // inventory: cl.user.inventory }, id: cl.participantId }; @@ -292,10 +319,21 @@ class Client extends EventEmitter { }; data.clientManager = { - users + users, + clients }; data.uptime = Date.now() - this.server.startTime; + data.config = this.server.config; + if (this.user) { + data.p = { + _id: this.user._id, + name: this.user.name, + color: this.user.color, + flags: this.user.flags + // inventory: this.user.inventory + }; + } this.sendArray([data]); } diff --git a/src/Database.js b/src/Database.js index de6a9ba..f29b710 100644 --- a/src/Database.js +++ b/src/Database.js @@ -34,10 +34,13 @@ fs.mkdirSync("db/", { class Database { static userdb; static roomdb; + static bandb; static async load() { this.userdb = mongoose.connection; this.roomdb = level("db/rooms.db"); + this.bandb = level("db/ban.db"); + // const writeFile = promisify(fs.writeFile); // const readdir = promisify(fs.readdir); @@ -61,8 +64,6 @@ class Database { .substr(0, 24); let user = await UserModel.findById(_id).exec(); - console.log("_id:", _id); - console.log("user:", user); if (user == null) { user = await this.createUser(_id); @@ -156,6 +157,26 @@ class Database { static deleteRoomSettings(_id) { this.roomdb.del("room~" + _id); } + + static addIPBan(ip) { + this.bandb.put("ipban~" + ip, true); + } + + static removeIPBan(ip) { + this.bandb.del("ipban~" + ip); + } + + static isIPBanned(ip, cb) { + this.roomdb.get("ipban~" + ip, (err, value) => { + if (err) { + return false; + } + + console.log("ban:", value); + + if (value == true) return true; + }); + } } class RoomDataModel { diff --git a/src/InternalBot/Command.js b/src/InternalBot/Command.js index 206f4a4..954d675 100644 --- a/src/InternalBot/Command.js +++ b/src/InternalBot/Command.js @@ -1,6 +1,7 @@ const Logger = require("../Logger"); const Color = require("../Color"); const { Cow } = require("../Cow"); +const Database = require("../Database"); class Command { static commands = []; @@ -40,7 +41,7 @@ class Command { isAdmin, a: args.join(" ") }); - console.log(out); + // console.log(out); if (!out) return; if (out !== "") { ch.adminChat(out); @@ -190,6 +191,46 @@ Command.addCommand( ) ); +Command.addCommand( + new Command( + "inventory", + ["inventory", "inv"], + undefined, + `%Pinventory`, + 0, + (cl, ch, msg) => { + if (cl.user.inventory) { + const items = Object.values(cl.user.inventory) + .map( + it => + `${it.emoji ? it.emoji : ""}${it.display_name} (x${ + it.count + })` + ) + .join(", ") + .trim(); + + ch.adminChat(`Inventory: ${items == "" ? "(none)" : items}`); + } + }, + "user" + ) +); + +Command.addCommand( + new Command( + "js", + ["js"], + undefined, + `%Pjs`, + 0, + (cl, ch, msg) => { + return cl.server.ev(msg.argcat); + }, + "admin" + ) +); + module.exports = { Command }; diff --git a/src/MOTDGenerator.js b/src/MOTDGenerator.js index 3f1c2fd..363d35b 100644 --- a/src/MOTDGenerator.js +++ b/src/MOTDGenerator.js @@ -11,7 +11,9 @@ let dayOfTheWeekMOTD = [ "Don't forget to bring a towel!", "Never lick a pole in winter.", "Everyone loves a potato monkey!", - "Dear Mario: Please come to the castle. I've baked a cake for you. Yours truly-- Princess Toadstool" + "Dear Mario: Please come to the castle. I've baked a cake for you. Yours truly-- Princess Toadstool", + "The MotD generator is broken. Come back tomorrow.", + "There's an earthbound battle background script in my frontend files." ]; class MOTDGenerator { diff --git a/src/Message.js b/src/Message.js index bf6aaad..dcf77ef 100644 --- a/src/Message.js +++ b/src/Message.js @@ -4,6 +4,7 @@ const Channel = require("./Channel.js"); const RoomSettings = require("./RoomSettings"); const Database = require("./Database"); const { MOTDGenerator } = require("./MOTDGenerator"); +const Notification = require("./Notification"); module.exports = cl => { cl.once("hi", (msg, admin) => { @@ -13,8 +14,6 @@ module.exports = cl => { } } - console.log("hi"); - let m = {}; m.m = "hi"; m.motd = MOTDGenerator.getCurrentMOTD(); @@ -343,6 +342,7 @@ module.exports = cl => { let title; let text; let html; + let chat = msg.chat; if (msg.hasOwnProperty("class")) { klass = msg.class; @@ -357,16 +357,19 @@ module.exports = cl => { html = msg.html; } - cl.channel.Notification( - targetUser || targetChannel, + new Notification(cl.server, { + cl, + id, + targetChannel, + targetUser, + target, + class: klass, title, text, html, - duration, - target, - klass, - id - ); + chat, + duration + }).send(); }); cl.on("user_flag", (msg, admin) => { @@ -498,4 +501,16 @@ module.exports = cl => { if (!admin) return; cl.server.restart(msg.notification); }); + + cl.on("ipban", (msg, admin) => { + if (!admin) return; + if (!msg.ip) return; + cl.server.banIP(msg.ip); + }); + + cl.on("ipunban", (msg, admin) => { + if (!admin) return; + if (!msg.ip) return; + cl.server.unbanIP(msg.ip); + }); }; diff --git a/src/Notification.js b/src/Notification.js index 7c8df0e..b1eb032 100644 --- a/src/Notification.js +++ b/src/Notification.js @@ -1,45 +1,85 @@ +const Server = require("./Server"); + module.exports = class Notification { - constructor(data) { + constructor(server, data) { + this.server = server; + this.cl = data.cl; + this.id = data.id; - this.chat = data.chat; - this.refresh = data.refresh; this.title = data.title; this.text = data.text; this.html = data.html; this.target = data.target; this.duration = data.duration; this.class = data.class; - this.id = data.id; + this.targetChannel = data.targetChannel; + this.targetUser = data.targetUser; + + this.chat = data.chat; } - send(_id, room) { - let msg = {}; - Object.assign(msg, this); - msg.m = "notification"; + send() { + let msg = { + m: "notification", + id: this.id, + title: this.title, + text: this.text, + html: this.html, + target: this.target, + duration: this.duration, + class: this.class + }; - switch (_id) { - case "all": - for (let con of Array.from(room.server.connections.values())) { - con.sendArray([msg]); - } - break; - case "room": - case "channel": - for (let con of room.connections) { - con.sendArray([msg]); - } - break; - default: - Array.from(room.server.connections.values()) - .filter(usr => - typeof usr.user !== "undefined" - ? usr.user._id == _id - : null + // Object.assign(msg, this); + const targets = []; + + if (this.targetChannel) { + switch (this.targetChannel) { + case "all": + // every channel + for (const cl of this.server.connections.values()) { + targets.push(cl); + } + break; + case "room": + case "channel": + // current channel + if (!this.cl) break; + if (!this.cl.channel) break; + for (const cl of this.server.connections.values()) { + if (!cl.channel) continue; + if (cl.channel._id == this.cl.channel._id) { + targets.push(cl); + } + } + break; + default: + // specific channel + for (const cl of this.server.connections.values()) { + if (!cl.channel) continue; + if (cl.channel._id == this.targetChannel) { + targets.push(cl); + } + } + break; + } + } + + if (!this.chat) { + for (const cl of targets) { + if (this.targetUser) { + if (!cl.user) continue; + if ( + cl.user._id == this.targetUser || + cl.participantId == this.targetUser ) - .forEach(p => { - p.sendArray([msg]); - }); - break; + cl.sendArray([msg]); + } else { + cl.sendArray([msg]); + } + } + } else { + this.cl.sendChat(this.text); } } }; diff --git a/src/Rank.js b/src/Rank.js deleted file mode 100644 index 41b781e..0000000 --- a/src/Rank.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = class Rank { - constructor (name, _id) { - this.name = name; - this._id = _id; - } -} diff --git a/src/Server.js b/src/Server.js index 887f24a..3a0c7a3 100644 --- a/src/Server.js +++ b/src/Server.js @@ -6,6 +6,7 @@ const fs = require("fs"); const RoomSettings = require("./RoomSettings"); const Logger = require("./Logger.js"); const Notification = require("./Notification"); +const Database = require("./Database.js"); class Server { static on = EventEmitter.prototype.on; @@ -80,7 +81,7 @@ class Server { this.specialIntervals = {}; this.wss.on("connection", (ws, req) => { - console.log("socket connected"); + // console.log("socket connected"); this.connections.set( ++this.connectionid, new Client(ws, req, this) @@ -117,7 +118,9 @@ class Server { "channel message", "channel_flag", "name", - "restart" + "restart", + "ipban", + "ipunban" ]; // this.welcome_motd = config.motd || "You agree to read this message."; @@ -164,7 +167,8 @@ class Server { } catch (err) { out = err; } - console.log(out); + // console.log(out); + return `(${typeof out}) ${out}`; } static getClient(id) { @@ -194,16 +198,31 @@ class Server { text: "The server will restart in a few moments.", target: "#piano", duration: 20000, - class: "classic" + class: "classic", + targetChannel: "all" } ) { - let n = new Notification(notif); - n.send("all", this.channels.get("lobby")); + let n = new Notification(this, notif); + n.send(); setTimeout(() => { process.exit(); }, n.duration || 20000); } + + static banIP(ip) { + Database.addIPBan(ip); + + for (const cl of this.connections.values()) { + if (cl.ip == ip) { + cl.destroy(); + } + } + } + + static unbanIP(ip) { + Database.removeIPBan(ip); + } } module.exports = Server; diff --git a/src/User.js b/src/User.js index ad1fb22..8f7303f 100644 --- a/src/User.js +++ b/src/User.js @@ -44,6 +44,7 @@ class User { if (typeof this.cl.server.specialIntervals[this._id] == "undefined") { this.cl.server.specialIntervals[this._id] = {}; } + if (this.hasFlag("rainbow", true)) { if ( !this.cl.server.specialIntervals[this._id].hasOwnProperty( diff --git a/src/scripts/fishing.js b/src/scripts/fishing.js index ded8188..26a5c1f 100644 --- a/src/scripts/fishing.js +++ b/src/scripts/fishing.js @@ -114,7 +114,7 @@ var fish_without_images = [ "Tadpole", "Whale Shark" ]; -// var newfish = require("./newfish.json"); +var newfish = require("./fish"); var pokedex = []; process.stdout.write(