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' ) ,
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' )
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
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-19 00:27:39 -06:00
var currentTime = new Date ( Date . now ( ) )
var currentHour = currentTime . getHours ( )
if ( currentHour >= 8 && currentHour <= 16 && ! ( currentTime . getDay ( ) == 6 || currentTime . getDay ( ) == 7 ) ) {
addedHTML = ` <span style="color: yellow">at school</span> `
} else if ( currentHour <= 10 && currentHour > 0 ) {
addedHTML = ` <span style="color: rgb(200, 150, 255)">eeping</span> `
} else {
addedHTML = ` <span style="color: limegreen">active?</span> `
}
html = html . replace ( "{ACTIVE_STATUS}" , addedHTML )
addedHTML = ""
2023-11-18 21:09:42 -06:00
if ( lanyardData && lanyardData . activities . length > 0 ) {
if ( lanyardData . activities [ 0 ] . type == 4 ) {
addedHTML += ` <hr><p><em><span style="color: lightgray">" ${ lanyardData . activities [ 0 ] . state } "</span> - ${ lanyardData . discord _user . display _name } ${ new Date ( Date . now ( ) ) . getFullYear ( ) } </em></p> `
}
}
html = html . replace ( "{LANYARD_QUOTE}" , addedHTML )
addedHTML = ""
2023-11-16 19:29:22 -06:00
if ( lanyardData ) {
for ( let index = 0 ; index < lanyardData . activities . length ; index ++ ) {
const activity = lanyardData . activities [ index ] ;
2023-11-18 21:09:42 -06:00
if ( activity . type == 4 ) {
addedHTML += ` <p><em><span style="color: lightgray">" ${ lanyardData . activities [ 0 ] . state } "</span> - ${ lanyardData . discord _user . display _name } ${ new Date ( Date . now ( ) ) . getFullYear ( ) } </em></p> `
}
}
}
html = html . replace ( "{LANYARD_SPOTIFY}" , 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 ] ;
if ( ! debounce && activity . type != 4 ) {
2023-11-18 21:46:49 -06:00
addedHTML += ` <h2><hr>What I'm up to:</h2><p>This section is pulled automatically from my discord. If Discord is down, or i'm offline, it won't be here.<br> Huge credit to <a href="https://github.com/Phineas/lanyard/">Phineas' Lanyard</a> for making this possible :D <br>(This is extremely experimental, so PLEASE report any issues on <a href="https://codeberg.org/Bingus_Violet/Violets-Purgatory">Codeberg!</a></p><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 ( ) {
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/" ) ) {
return 'https://' + image . substr ( image . indexOf ( 'https/' ) + 6 , image . length )
} else if ( image . includes ( "spotify" ) ) {
return 'https://i.scdn.co/image/' + image . substr ( image . indexOf ( 'spotify:' ) + 8 , image . length )
}
}
}
}
2023-11-16 19:29:22 -06:00
if ( activity . type == 2 ) {
2023-11-18 21:09:42 -06:00
if ( get _img ( ) ) {
addedHTML += `
2023-11-18 21:53:13 -06:00
< div class = "chip activity col-md-6 testing" >
2023-11-18 21:22:02 -06:00
< img src = "${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 >
2023-11-18 21:36:53 -06:00
< br > Song : "${activity.details}"
< br > Album : "${activity.assets.large_text}"
2023-11-18 21:09:42 -06:00
< br > Artist : "${activity.state}"
< / p >
< / d i v >
`
} else {
addedHTML += `
2023-11-18 21:53:13 -06:00
< div class = "chip activity col-md-6 testing" >
2023-11-18 21:09:42 -06:00
< p style = "width: 100%;" >
Playing < span style = "color: rgb(255, 100, 150);" > $ { activity . name } < / s p a n >
< br > $ { activity . state }
< br > $ { activity . details }
< / p >
< / d i v >
`
}
} else if ( activity . type == 0 ) {
if ( get _img ( ) ) {
addedHTML += `
2023-11-18 21:53:13 -06:00
< div class = "chip activity col-md-6 testing" >
2023-11-18 21:22:02 -06:00
< img src = "${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 >
2023-11-18 21:16:59 -06:00
< br > $ { activity . state || activity . assets . small _text }
< br > $ { activity . details || activity . assets . large _text }
2023-11-18 21:09:42 -06:00
< / p >
< / d i v >
`
} else {
addedHTML += `
2023-11-18 21:53:13 -06:00
< div class = "chip activity col-md-6 testing" >
2023-11-18 21:09:42 -06:00
< p >
Playing < span style = "color: rgb(255, 100, 150);" > $ { activity . name } < / s p a n >
< br > $ { activity . state }
< br > $ { activity . details }
< / 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 ( )
addedHTML += socialsHTML . substr ( socialsHTML . indexOf ( "<h1>" ) , socialsHTML . indexOf ( "</body>" ) )
html = html . replace ( "{SOCIALS}" , addedHTML )
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
} else {
console . log ( data . d )
}
2023-11-07 13:07:11 -06:00
} )