Something went wrong. Try again.
silliest site on the web*
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193import { Server as SServer } from "socket.io";import { RateLimiterMemory } from 'rate-limiter-flexible';import colors from 'colors';
const devmode = process.env.DEVMODE;
export default async function socks(server) {const io = new SServer(server);
console.log(`${colors.yellow("[socket.io]")} socket running.`);
let sconn = []; // SOCKS!!!const maxsocks = 25; // ONLY ONE PAIR.let memberlist = [];
io.of("/").on('connection', (socket) => { // deny incorrect namespacesocket.disconnect(true);});
io.of("/chat").on('connection', (socket) => {let ipaddr = socket.handshake.headers['cf-connecting-ip']||socket.handshake.address;
if(devmode !== "true") {if(sconn.includes(ipaddr)) {console.log(`${colors.yellow("[socket.io]")} duplicate user`);socket.emit('error', 'already connected');socket.disconnect(true); // Disconnect the userreturn;}
if(sconn.length >= maxsocks) {console.log(`${colors.yellow("[socket.io]")} reached maximum active socket connections`);socket.emit('error', 'server is full');socket.disconnect(true); // Disconnect the userreturn;};}
let nickname = "anonymous";if(socket.handshake.query.username) {nickname = socket.handshake.query.username;if(/[^0-9A-Za-z ]/g.test(nickname)) {nickname = "nerd";// if you are editing your cookie (or making a new client) you deserve this} else {nickname = nickname.substring(0, 30);nickname = nickname.replaceAll("\n","");nickname = nickname.replace(/ +/g," ");nickname = nickname.replace(/^ /g,"");nickname = nickname.replace(/ $/g,"");nickname = nickname.toLowerCase();}
}socket.username = nickname;socket.emit('confirm', {username: nickname});
const now = new Date();
const idletime = 1200000;
socket.onAny(() => { socket.lastActivity = Date.now();});
setInterval(() => { for (const [id, socket] of io.of("/chat").sockets) { if (Date.now() - socket.lastActivity > idletime) { socket.disconnect(true); } }}, 10000);
sconn.push(ipaddr)socket.on('disconnect', () => {sconn.splice(sconn.indexOf(ipaddr), 1, );
console.log(`${colors.yellow("[socket.io]")} Disonnect: ${sconn.length} WS`);memberlist.splice(memberlist.findIndex(obj => obj.id === socket.id), 1, );io.of("/chat").emit('conmsg', {join:false, name: socket.username,time:now.toISOString(), users: memberlist.map(({ id, ...rest }) => rest)});});console.log(`${colors.yellow("[socket.io]")} Connect: ${sconn.length} WS`);memberlist.push({username:socket.username,id:socket.id});io.of("/chat").emit('conmsg', {join:true, name: socket.username, time:now.toISOString(), users: memberlist.map(({ id, ...rest }) => rest)});socket.lastActivity = Date.now();});
const rateLimiter = new RateLimiterMemory({points: 3, // allowed "points" (how many times requests can be sent in the time limit)duration: 2, // per second});// right from the docs// https://github.com/animir/node-rate-limiter-flexible/wiki/Overall-example#websocket-single-connection-prevent-flooding
io.of("/chat").on('connection', (socket) => {
socket.on('chatmsg', async (data) => { try { await rateLimiter.consume(socket.handshake.address); // consume 1 point per event from IP var message = data.msg; var uname = socket.username; var color = data.col||0;
if(isNaN(color)) { return socket.emit('error', "color must be a valid number") } else ( color = Math.floor(Number(color)) )
if(!(color >= 0 && color <= 9)) { return socket.emit('error', "color must be a number between 0-9") }
message = message.substring(0, 512); message = message.replaceAll("\n"," "); message = message.replace(/ +/g," "); message = message.replace(/^ /g,""); message = message.replace(/ $/g,"");
const now = new Date(); var day = String(now.getDate()); var month = String(now.getMonth() + 1); var year = now.getFullYear();
const mdat = {// Modified DATa uname: uname, msg: message, col: color, time: now.toISOString(), }
// console.log(mdat)
if(message && uname) { socket.emit('chatmsg', mdat); socket.broadcast.emit('chatmsg', mdat); } else { socket.emit('error',"cannot have empty message/username") } } catch(rejRes) { // no available points to consume // emit error or warning message socket.emit('error', `you have been rate limited.`); }});
socket.on('namechange', async (data) => {try {await rateLimiter.consume(socket.handshake.address);const now = new Date();
var onam = socket.username; // obama variablevar nnam = data.n;if(/[^0-9A-Za-z ]/g.test(nnam)) {return socket.emit('error', `nickname can only be alphanumeric with spaces`);}nnam = nnam.substring(0, 30);nnam = nnam.replaceAll("\n","");nnam = nnam.replace(/ +/g," ");nnam = nnam.replace(/^ /g,"");nnam = nnam.replace(/ $/g,"");nnam = nnam.toLowerCase();
if(!nnam) {return socket.emit('error', `cannot set an empty nickname`);}
if(nnam == onam) {return socket.emit('error', `already what youre called`);}
socket.username = nnam;
memberlist[memberlist.findIndex(obj => obj.id === socket.id)].username = nnam;
const mdat = {o:onam,n:nnam,time: now.toISOString(),users: memberlist.map(({ id, ...rest }) => rest),}
socket.emit('namechange', mdat);socket.broadcast.emit('namechange', mdat);} catch(rejRes) {socket.emit('error', `you have been rate limited`); // more backend related. (its barely been a few hours and i forgot what i meant by this)}});
});};