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' ) ,
2024-01-17 11:19:12 -06:00
WebSocket = require ( 'ws' )
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' )
2024-01-25 23:29:28 -06:00
const resourcePath = path . join ( _ _dirname , 'resources' )
2023-11-16 15:16:22 -06:00
const mainpage = resourcePath + '/mainPage.html'
var lanyardData = undefined
var discData = null
2023-10-20 21:53:49 -05:00
2024-01-25 23:29:28 -06:00
var config = JSON . parse ( fs . readFileSync ( path . join ( _ _dirname , 'config.json' ) ) )
var thumborInstances = config . thumborInstances
2024-01-19 11:18:50 -06:00
2024-01-25 23:50:09 -06:00
var activityImages = config . activityImages
2024-01-19 11:18:50 -06:00
var thumbCount = 0
function getThumbor ( ) {
thumbCount += 1
return thumborInstances [ thumbCount % thumborInstances . length ] + "unsafe"
}
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
} )
2024-01-25 23:29:28 -06:00
var randomQuotes = config . quotes
2024-01-25 23:03:05 -06:00
function timeFormatter ( seconds ) {
seconds = Math . ceil ( seconds )
2024-01-25 23:08:44 -06:00
var minutes = Math . floor ( seconds / 60 )
2024-01-25 23:03:05 -06:00
2024-01-25 23:11:53 -06:00
if ( seconds % 60 < 10 ) {
2024-01-25 23:11:19 -06:00
return ` ${ minutes } :0 ${ seconds % 60 } `
2024-01-25 23:11:53 -06:00
} else {
return ` ${ minutes } : ${ seconds % 60 } `
2024-01-25 23:11:19 -06:00
}
2024-01-25 23:11:53 -06:00
2024-01-25 23:03:05 -06:00
}
2024-01-25 23:07:26 -06:00
function gameTimeFormatter ( seconds ) {
seconds = Math . ceil ( seconds )
var minutes = Math . ceil ( seconds / 60 )
2024-01-25 23:08:44 -06:00
var hours = Math . floor ( minutes / 60 )
2024-01-25 23:07:26 -06:00
if ( seconds < 60 ) {
return 'Under a minute ago'
} else if ( minutes < 60 ) {
return ` ${ minutes } Minutes `
}
2024-01-25 23:11:19 -06:00
return ` ${ hours } hours and ${ minutes % 60 } minutes `
2024-01-25 23:07:26 -06: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-19 11:18:50 -06:00
addedHTML += ` <img class="emoji" src=" ${ getThumbor ( ) } /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 ) {
2024-01-25 22:24:09 -06:00
var timeLeft = Math . round ( ( activity . timestamps . end - Date . now ( ) ) / 1000 )
var currentPercent = ( Date . now ( ) - activity . timestamps . start ) / ( activity . timestamps . end - activity . timestamps . start ) * 100
addedHTML += `
< div class = "chip activity col-md-6 testing" >
2024-01-25 23:09:53 -06:00
< img src = "${getThumbor()}/256x256/${get_img()}" title = "${activity.assets.large_text || activity.assets.small_text}" >
2024-01-25 22:24:09 -06:00
< p >
Listening to < span style = "color: limegreen;" > $ { activity . name } < / s p a n >
< br > Song : $ { activity . details || " " }
$ { songStats ( ) }
< br >
< span class = "lengthBar lengthBar${index}" > < span > < / s p a n > < / s p a n >
2024-01-25 23:03:05 -06:00
$ { timeFormatter ( ( activity . timestamps . end - activity . timestamps . start ) / 1000 ) }
2024-01-25 22:24:09 -06:00
< / p >
2023-11-18 21:09:42 -06:00
< / d i v >
2024-01-25 22:24:09 -06:00
< style >
. lengthBar$ { index } > span {
animation - name : songSlider$ { index } ;
animation - duration : $ { timeLeft } s ;
animation - timing - function : linear ;
}
@ keyframes songSlider$ { index } {
0 % {
width : $ { currentPercent } % ;
}
100 % {
width : 100 % ;
}
}
< / s t y l e >
2023-11-18 21:09:42 -06:00
`
} 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-19 11:18:50 -06:00
< img src = "${getThumbor()}/${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-25 23:07:26 -06:00
< br > $ { gameTimeFormatter ( ( Date . now ( ) - time ) / 1000 ) }
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-12-17 21:23:39 -06:00
var now = new Date ( )
2024-01-25 23:29:28 -06:00
2023-12-17 21:23:39 -06:00
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' ) ) )
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
2024-01-19 11:18:50 -06:00
html = html . replace ( "{THUMBOR}" , getThumbor ( ) )
2024-01-25 22:27:32 -06:00
2024-01-25 23:29:28 -06:00
html = html . replace ( "{RANDOM_QUOTE}" , randomQuotes [ Math . floor ( Math . random ( ) * randomQuotes . length ) ] )
2024-01-25 23:15:12 -06:00
if ( process . env . BRANCH == "dev" ) {
html = html . replace ( "{OPPOSITE_URL}" , "www" )
html = html . replace ( "{OPPOSITE_BRANCH}" , "Main" )
} else {
html = html . replace ( "{OPPOSITE_URL}" , "beta" )
html = html . replace ( "{OPPOSITE_BRANCH}" , "Beta" )
}
2024-01-25 22:50:31 -06:00
fs . writeFileSync ( path . join ( _ _dirname , 'static/index.html' ) , html )
2023-11-17 08:43:11 -06:00
}
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
} )
2024-01-25 22:50:31 -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
` )
2024-01-25 22:24:09 -06:00
} )