2023-10-20 21:53:49 -05:00
const express = require ( 'express' ) ,
2023-11-16 19:29:22 -06:00
path = require ( 'path' ) ,
fs = require ( 'fs' ) ,
2023-11-30 21:56:34 -06:00
WebSocket = require ( 'ws' ) ,
2023-12-19 12:29:17 -06:00
xml2json = require ( 'xml-js' ) ,
commitCount = require ( 'git-commit-count' ) ;
2023-10-20 21:53:49 -05:00
var app = express ( )
const PORT = process . env . PORT || 8080
2023-11-16 15:16:22 -06:00
const staticpath = path . join ( _ _dirname , 'static' )
const resourcePath = path . join ( _ _dirname , "resources" )
const mainpage = resourcePath + '/mainPage.html'
var lanyardData = undefined
var discData = null
2023-10-20 21:53:49 -05:00
2024-01-03 17:40:05 -06:00
const activityImages = {
2024-01-12 08:53:53 -06:00
"ULTRAKILL" : "https://fs.violets-purgatory.dev/ULTRAKILL/etc/DiscordIcon.webp"
2024-01-03 17:40:05 -06:00
}
2023-11-30 21:56:34 -06:00
var mastoData = {
"lastUpdate" : 0 ,
"HTML" : ""
}
2023-10-20 21:53:49 -05:00
app . use ( express . static ( staticpath ) )
2023-11-16 15:16:22 -06:00
app . listen ( PORT , ( ) => {
console . log ( "Violet's Purgatory is now listening on port: " + PORT )
2023-11-03 13:01:13 -05:00
} )
2023-11-17 08:43:11 -06:00
function pageUpdate ( ) {
2023-11-16 22:00:16 -06:00
var statuses = {
"online" : {
"text" : "Online" ,
"color" : "rgb(100, 255, 100)"
} ,
"dnd" : {
"text" : "DND" ,
"color" : "rgb(255, 100, 100)"
} ,
"idle" : {
"text" : "Idle" ,
"color" : "rgb(255, 255, 75)"
} ,
"offline" : {
"text" : "Offline" ,
"color" : "rgb(125, 125, 125)"
}
}
2023-11-18 21:09:42 -06:00
2023-11-16 15:16:22 -06:00
var html = fs . readFileSync ( mainpage ) . toString ( )
2023-11-16 22:00:16 -06:00
2023-11-17 08:43:11 -06:00
var addedHTML = ""
2023-11-16 22:00:16 -06:00
2023-11-18 21:09:42 -06:00
if ( lanyardData ) {
var statusData = statuses [ lanyardData . discord _status ]
2023-11-16 15:16:22 -06:00
2023-11-18 21:09:42 -06:00
addedHTML += ` <p style="color: ${ statusData . color } "> ${ statusData . text } </p> `
addedHTML += ` <style>.pfp { border-color: ${ statusData . color } !important }</style> `
}
2023-11-16 22:00:16 -06:00
2023-11-17 08:43:11 -06:00
html = html . replace ( "{LANYARD_STATUS}" , addedHTML )
addedHTML = ""
2023-11-16 19:29:22 -06:00
2023-11-18 21:09:42 -06:00
if ( lanyardData && lanyardData . activities . length > 0 ) {
if ( lanyardData . activities [ 0 ] . type == 4 ) {
2024-01-04 16:29:47 -06:00
var status = lanyardData . activities [ 0 ]
addedHTML += "<hr><p>"
if ( status . emoji ) {
2024-01-11 12:43:30 -06:00
if ( status . emoji . id ) {
2024-01-12 08:51:22 -06:00
addedHTML += ` <img class="emoji" src="https://thumbor-production-0e82.up.railway.app/unsafe/https://cdn.discordapp.com/emojis/ ${ status . emoji . id } .webp?size=32&quality=lossless"/> `
2024-01-11 12:43:30 -06:00
} else {
addedHTML += status . emoji . name
}
2024-01-04 16:29:47 -06:00
}
2024-01-04 16:32:59 -06:00
if ( status . state ) {
addedHTML += ` <em><span style="color: lightgray">" `
addedHTML += ( status . state || "" )
addedHTML += ` "</span> `
}
addedHTML += ` - ${ lanyardData . discord _user . display _name } ${ new Date ( Date . now ( ) ) . getFullYear ( ) } </em></p> `
2023-11-18 21:09:42 -06:00
}
}
html = html . replace ( "{LANYARD_QUOTE}" , addedHTML )
addedHTML = ""
var debounce = false
if ( lanyardData && lanyardData . activities . length > 0 ) {
for ( let index = 0 ; index < lanyardData . activities . length ; index ++ ) {
const activity = lanyardData . activities [ index ] ;
2024-01-03 17:40:05 -06:00
var found = false
for ( let index = 0 ; index < lanyardData . activities . length ; index ++ ) {
const act = lanyardData . activities [ index ]
if ( act . name == activity . name ) {
if ( Object . keys ( act ) . length > Object . keys ( activity ) . length ) {
found = true
}
}
}
if ( found ) {
continue
}
2023-11-18 21:09:42 -06:00
if ( ! debounce && activity . type != 4 ) {
2023-11-30 22:49:14 -06:00
addedHTML += ` <h2><hr>What I'm up to:</h2><div class="container-fluid row" style="margin: 0; padding: 0; display: flex;"> `
2023-11-18 21:09:42 -06:00
debounce = true
}
function get _img ( ) {
2024-01-03 17:40:05 -06:00
2023-11-18 21:09:42 -06:00
if ( "assets" in activity ) {
var image = undefined
if ( "large_image" in activity . assets ) {
image = activity . assets . large _image
} else if ( "small_image" in activity . assets ) {
image = activity . assets . small _image
}
if ( image ) {
if ( image . includes ( "https/" ) ) {
2023-11-30 20:18:56 -06:00
return decodeURIComponent ( 'https://' + image . substr ( image . indexOf ( 'https/' ) + 6 , image . length ) )
2023-11-18 21:09:42 -06:00
} else if ( image . includes ( "spotify" ) ) {
2023-11-30 20:18:56 -06:00
return decodeURIComponent ( 'https://i.scdn.co/image/' + image . substr ( image . indexOf ( 'spotify:' ) + 8 , image . length ) )
2023-11-20 18:50:02 -06:00
} else {
2023-11-30 20:18:56 -06:00
return decodeURIComponent ( ` https://cdn.discordapp.com/app-assets/ ${ activity . application _id } / ${ image } .png ` )
2023-11-18 21:09:42 -06:00
}
}
}
2024-01-03 17:53:06 -06:00
if ( ! image ) {
if ( activity . name in activityImages ) {
return decodeURIComponent ( activityImages [ activity . name ] )
} else {
return decodeURIComponent ( ` https://cdn.discordapp.com/app-assets/680748054038577165/680775885317472448.png ` )
2024-01-12 08:51:22 -06:00
// This was supposed to be temporary but it kinda stuck honestly lol (It's an ultrakill icon)
2024-01-03 17:53:06 -06:00
}
}
2023-11-18 21:09:42 -06:00
}
2024-01-01 21:51:51 -06:00
function songStats ( ) {
var html = ` `
if ( activity . assets && activity . assets . large _text != activity . details ) {
html += `
< br > Album : $ { activity . assets . large _text || " " }
< br > Artist : $ { activity . state || " " }
`
} else {
html += ` <br> Artist: ${ activity . state || " " } `
}
return html
}
2023-11-16 19:29:22 -06:00
if ( activity . type == 2 ) {
2023-11-18 21:09:42 -06:00
addedHTML += `
2023-11-18 21:53:13 -06:00
< div class = "chip activity col-md-6 testing" >
2024-01-12 08:53:53 -06:00
< img src = "https://thumbor-production-0e82.up.railway.app/unsafe/512x512/${get_img()}" title = "${activity.assets.large_text || activity.assets.small_text}" >
2023-11-18 21:09:42 -06:00
< p >
Listening to < span style = "color: limegreen;" > $ { activity . name } < / s p a n >
2024-01-01 21:51:51 -06:00
< br > Song : $ { activity . details || " " }
$ { songStats ( ) }
2023-11-18 21:09:42 -06:00
< / p >
< / d i v >
`
} else if ( activity . type == 0 ) {
2024-01-01 23:25:35 -06:00
var time = activity . created _at
if ( activity . timestamps ) {
time = activity . timestamps . start
}
2024-01-03 17:40:05 -06:00
if ( ! activity . assets ) {
activity . assets = { "large_text" : " " , "small_text" : " " }
}
2023-11-18 21:09:42 -06:00
addedHTML += `
2023-11-18 21:53:13 -06:00
< div class = "chip activity col-md-6 testing" >
2024-01-12 08:51:22 -06:00
< img src = "https://thumbor-production-0e82.up.railway.app/unsafe/${get_img()}" title = "${activity.assets.large_text || activity.assets.small_text}" >
2023-11-18 21:09:42 -06:00
< p >
Playing < span style = "color: rgb(255, 100, 150);" > $ { activity . name } < / s p a n >
2024-01-01 21:51:51 -06:00
< br > $ { activity . details || activity . assets . large _text || " " }
< br > $ { activity . state || activity . assets . small _text || " " }
2024-01-01 23:26:18 -06:00
< br > $ { Math . ceil ( ( ( Date . now ( ) - time ) / 1000 / 60 ) ) . toString ( ) + " Minutes" || " " }
2023-11-18 21:09:42 -06:00
< / p >
< / d i v >
`
2023-11-16 19:29:22 -06:00
}
2023-11-16 15:16:22 -06:00
}
2023-11-16 19:29:22 -06:00
}
2023-11-17 08:43:11 -06:00
2023-11-18 21:09:42 -06:00
if ( addedHTML ) {
addedHTML += "</div>"
}
html = html . replace ( "{LANYARD_FULL}" , addedHTML )
2023-11-17 08:43:11 -06:00
2023-11-18 21:36:53 -06:00
addedHTML = ""
var socialsHTML = fs . readFileSync ( path . join ( _ _dirname , 'static/socials/index.html' ) ) . toString ( )
2023-11-19 10:27:01 -06:00
addedHTML += socialsHTML . substring ( socialsHTML . indexOf ( "<h1>" ) , socialsHTML . indexOf ( "</body>" ) )
2023-11-18 21:36:53 -06:00
html = html . replace ( "{SOCIALS}" , addedHTML )
2024-01-03 22:24:56 -06:00
addedHTML = ""
2024-01-10 12:47:18 -06:00
// var faqHTML = fs.readFileSync(path.join(__dirname, 'static/faq/index.html')).toString()
// addedHTML += faqHTML.substring(faqHTML.indexOf("<h1>"), faqHTML.indexOf("</body>"))
2024-01-03 22:24:56 -06:00
2024-01-10 12:47:18 -06:00
html = html . replace ( "{FAQ}" , ` ` )
2024-01-03 22:24:56 -06:00
2023-11-30 21:56:34 -06:00
html = html . replace ( "{MASTODON_FEED}" , mastoData . HTML )
2023-12-17 21:23:39 -06:00
var now = new Date ( )
currentMonth = now . getMonth ( ) + 1
2024-01-03 16:57:00 -06:00
if ( [ 11 , 12 ] . includes ( currentMonth ) ) { // The Below HTML is copy and pasted from that one site :>
2024-01-11 12:09:32 -06:00
html = html . replace ( "{SEASONAL_EFFECT}" , fs . readFileSync ( path . join ( _ _dirname , 'static/snow.html' ) ) )
2024-01-11 12:13:24 -06:00
console . log ( "beep" )
2023-12-17 21:23:39 -06:00
} else {
html = html . replace ( "{SEASONAL_EFFECT}" , "" )
}
2024-01-12 11:48:19 -06:00
html = '<!-- The following code is dynamically generated, I apologize for any formatting errors. Please view the "resources/mainPage.html" on the codeberg repository for something more readable. -->\n' + html
2023-11-17 08:43:11 -06:00
fs . writeFileSync ( path . join ( _ _dirname , 'static/index.html' ) , html )
}
2023-11-16 15:16:22 -06:00
// Lanyard Stuffs
var lanyard = new WebSocket ( 'wss://api.lanyard.rest/socket' )
function beat ( dur ) {
lanyard . send ( JSON . stringify ( {
op : 3
} ) )
setTimeout ( ( ) => {
beat ( dur )
} , dur ) ;
}
2023-11-16 19:29:22 -06:00
lanyard . addEventListener ( "message" , ( res ) => {
2023-11-16 15:16:22 -06:00
var data = JSON . parse ( res . data )
if ( data . op == 1 ) {
beat ( data . d . heartbeat _interval )
lanyard . send ( JSON . stringify ( {
op : 2 ,
d : {
subscribe _to _id : "534132311781015564"
}
} ) )
} else if ( data . op == 0 ) {
lanyardData = data . d
2023-11-17 08:43:11 -06:00
pageUpdate ( )
2023-11-16 15:16:22 -06:00
}
2023-11-30 21:56:34 -06:00
} )
2023-12-21 10:19:15 -06:00
pageUpdate ( )
2023-12-19 12:15:35 -06:00
app . use ( ( req , res , next ) => {
2023-12-19 12:21:37 -06:00
res . status ( 404 ) . send ( `
< link rel = "stylesheet" href = "/style.css" >
2024-01-12 13:05:34 -06:00
< h1 > 404 < / h 1 >
< p > Uh oh ... I think your lost ? There ' s nothing here : P < / p >
2023-12-19 12:21:37 -06:00
` )
2023-12-19 12:15:35 -06:00
} )