This commit is contained in:
Hri7566 2023-04-01 01:05:12 -04:00
parent 1ef018fa1a
commit a0de8c2e02
12 changed files with 303 additions and 190 deletions

@ -1 +1 @@
Subproject commit 327c6775aceb4518437bf3f2c262c6e6f7423579
Subproject commit 1bcce0f2b59d1d5407c510d738438a3d78ce199a

View File

@ -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,
"",
``,
`<script>$("#piano").addClass("spin")</script>`,
1,
"#names",
"short"
);
}
stopSpin(cl) {
let id = cl.user._id;
if (!id) id = "room";
this.Notification(
id,
"",
``,
`<script>$("#piano").removeClass("spin")</script>`,
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;

View File

@ -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]);
}

View File

@ -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 {

View File

@ -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
};

View File

@ -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 {

View File

@ -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);
});
};

View File

@ -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) {
// Object.assign(msg, this);
const targets = [];
if (this.targetChannel) {
switch (this.targetChannel) {
case "all":
for (let con of Array.from(room.server.connections.values())) {
con.sendArray([msg]);
// every channel
for (const cl of this.server.connections.values()) {
targets.push(cl);
}
break;
case "room":
case "channel":
for (let con of room.connections) {
con.sendArray([msg]);
// 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:
Array.from(room.server.connections.values())
.filter(usr =>
typeof usr.user !== "undefined"
? usr.user._id == _id
: null
)
.forEach(p => {
p.sendArray([msg]);
});
// 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
)
cl.sendArray([msg]);
} else {
cl.sendArray([msg]);
}
}
} else {
this.cl.sendChat(this.text);
}
}
};

View File

@ -1,6 +0,0 @@
module.exports = class Rank {
constructor (name, _id) {
this.name = name;
this._id = _id;
}
}

View File

@ -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;

View File

@ -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(

View File

@ -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(