From 7e52727bf0f80209ddbceb8287f93bae273805a4 Mon Sep 17 00:00:00 2001 From: bingus_violet Date: Sun, 7 Jul 2024 23:33:16 -0500 Subject: [PATCH] Blog in development --- api.js | 55 ++++++- ...code-sans-expanded-v11-latin-regular.woff2 | Bin 0 -> 23400 bytes .../source-code-pro-v23-latin-regular.woff2 | Bin 0 -> 11048 bytes assets/html/blog.html | 33 ++++ blog.js | 33 ++++ index.js | 2 + package-lock.json | 39 +++++ package.json | 1 + pageUpdater.js | 50 +++++- static/blog/index.html | 37 +++++ static/blog/style.css | 147 ++++++++++++++++++ static/index.html | 2 +- 12 files changed, 389 insertions(+), 10 deletions(-) create mode 100644 assets/fonts/encode-sans-expanded-v11-latin-regular.woff2 create mode 100644 assets/fonts/source-code-pro-v23-latin-regular.woff2 create mode 100644 assets/html/blog.html create mode 100644 blog.js create mode 100644 static/blog/index.html create mode 100644 static/blog/style.css diff --git a/api.js b/api.js index ab08787..8605a92 100644 --- a/api.js +++ b/api.js @@ -14,6 +14,9 @@ module.exports = { "connected": false, "lastLanyardUpdate": Date.now(), + "blogConnected": false, + "blogPosts": undefined, + "events": events, "spins": 0, @@ -69,4 +72,54 @@ function socketeer() { }) } -socketeer() \ No newline at end of file +socketeer() + +function blogSocket() { + var blog = new WebSocket('https://blog.violets-purgatory.dev') + + blog.on("error", (error) => { + console.log(error) + }) + + blog.on("close", () => { + console.log("Connection Closed. Attempting Reconnect in 30 seconds.") + module.exports.blogConnected = false + setTimeout(() => { + blogSocket() + }, 30000); + }) + + function ping(dur) { + blog.send(JSON.stringify({ + type: "ping" + })) + setTimeout(() => { + ping(dur) + if (Date.now() - lastPong > 120000) { + blog.close() + console.log("Max duration since last pong exceeded- Closing socket.") + } + }, dur); + } + + blog.addEventListener("message", async (res) => { + var data = JSON.parse(res.data) + if (data.type == "init") { + console.log("Connected to Blog Websocket!") + module.exports.blogConnected = true + ping(30000) + lastPong = Date.now() + events.emit("blogConnect") + } else if (data.type == "ping") { + lastPong = Date.now() + } else if (data.type == "allPosts") { + console.log("Recieved posts!") + module.exports.blogPosts = data.data + events.emit("blogUpdate") + } else { + console.log(data) + } + }) +} + +blogSocket() \ No newline at end of file diff --git a/assets/fonts/encode-sans-expanded-v11-latin-regular.woff2 b/assets/fonts/encode-sans-expanded-v11-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..dbdfcebcd5bfa89b098b15c2b849a000d1008a05 GIT binary patch literal 23400 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�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 W$$#HZ=85%R)&-qsFyLiiU;qF@46Gyo literal 0 HcmV?d00001 diff --git a/assets/fonts/source-code-pro-v23-latin-regular.woff2 b/assets/fonts/source-code-pro-v23-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b62bc793cf29e1fa1d3f52a14f39dc1d77d7d797 GIT binary patch literal 11048 zcmXT-cQayOWME)m(AHoO0MU^V3=CSwAYvdsDwb-LknYTrY13m%un!J#4Dn!S2@>Ss zYV44BrO(|G#=vOCq{7@1#-hO5ro^tm!!G^TjrGk9WjXeQ5a|q&r%fg60;d>w`F^XP zo6yBG`(3+_ZPQV!rL5*xR|h;7TFd^lXuh;+LSjVfWab-*3QvFhTl-V3`lp48A#eR> z9bUO7yl#gS=k>{}a`Bv!U1V#`eEjE%o!@NsZ<}9yKY8|v_1?Au;>DeD)8YiDmIWSq zp?d0sLeHTUY(1|`r54*?lV0@F=2n18fak1jnP>h#{^x0z)Ehpxi%Ix~!OgA}J{y8= zunFHuV?A{xQTpTk`icYFl0 zIVRTqeLvAxd5*&d^YtBPVz2ECH$9toQ1#_EmJ4T$CZ_Po^K!{x$&z_83OTiz&ap+zp>u zq8VHwYwo+?xP9R7;!8G554YbCiPj2?*3pyfsd1UTUw&Dg$I{zL`tue}Pi&KUZM3#9 zw5;V`hu@PV&F(!{oUhoP%by=S(O2c@n`JkRP8rSdi@9edr{J;wXEQ?vW5e8^pIaN% zIW-+qT(=3{Jl%alRGq0=w@sl%K#{|$szoD^qjQpAPY=gTBf+8)w-?K#oz}&)BrWA| z=5hYg;ViS#$=PK)_c>-BrUecQ^ePT3U*!0jnz7$$MgHF^afiL-@&P=iattnl<&2yE zbF;|C)$fyeRqZHP&T&cNTlFVhH9A?%N)UWty z|EmU@z*P%Gq(2MB@iqx$Iqa3-O3Y&CD(Tf-I7Q$d^Q)E;n+=Upit%|Yay%aWH50^I zcP{caWG;R7vfJ?;+%HS;8m;F!qo?FFS(j|xF@a1)%-r+i4MJ8US5XtqZ?@y50K`p8U*+?G4ZNS7LfQxM%DToM-=}Sl{^G zkq1|e6*2>wuCC@4^|(H%jpNRiViooU|0cBbrpzx_(hgZ2_Git>mu1WE7R}yhaOz5GShVv};iWH5^L|<$GrJ?CRqO2UuZo(Q zCuZe5J>`7#fM%M^ykgFs2Oi|GoZj*KWB~8o<%{(7v%(gL@*PiPeZRIUNyI^RLTaMU z9BaAdSd~%P*Ld9%2@lG#&hM2t{W^|@z|Fq zbi!M&y6112oBCus_q;x~$Z^@G9j_VYrOukndSIEZ@q)R#ZLg^Q4`2>1D(ZVK@tAQ2 zgUqw<(Pu2pShu#Q7M1_AXWBEpKYl?f;{x~9JOTv@&(t0yG=|SVIR6gg6^lI{x7`W@ zr+*HVb88b=peRwC;MXC`mvBt>(F)-TvCJi1cDv(BYFav{t(~3dwzBYE^81b_>bnkG zZ>_E_=y+^tdHn^)JHDo<0%050UIB#{EX@WEH{KllqVYN6S?A}HKk8kq95pYGoVa+m z;Plm92iEA-DOtOiG0Pl3nRbJlmu0%|BmI`6lO1hVJ(!@8Bk&+W;L`W|FX!i(M)#hb z{`>p)@2e}>|y%JWn{luTMH)oT#E(^jrJb;+j9@6P`Zd+)RLiiotY@m+QKTC>}E*}2=!g|Ggz z`JS3|P4}|Md4|C@1M_!_Zafh8UH9WH>HM>T#}`bk za9gXIv3PBn(BA1PuB%L5-a36DTz~J^L?f4ZHLP5sn%^8d>wZZmEO2a-(usVz`N{d@ zRKItST{kbcVad=z~z+ij|sEI&Qx_ zQgSe6;r2CKcQ4Q?+tvADQuSWRxn_B}xnFj1%#Yi`@ig_Zow~F0SBptsljf{sa&Ru) zG+R{p_%~xSbI~u4zcX58d+ELZeQuD5#VR~Y$a|A;}<4(q+Yiv@< z32aJE7eo7PFIM*MW_7r~Vq5N?cawbnXKaZ7q1Jj$W$DGPUd5$TrXR1Ivgo;|;aX?s z8w(h|ZEg-`Xj>3)XQ}1Qg)>xK>~c2b6e;(Ay=t;{?W$GpEfl3=7IitBT&Nem^m~(| z@9#x|o2EAK+z5*mJ#W}|@71liP+p-;&tF`6B^dW@qIqEQpBIiA4K+M^$qDaQz7kpT zP(@Vu#YxAN-s<%dE&iNo|t1$(HY8b$0@*?k&?7f633a zQ<-D_)Ro?n)g1N@(;e*Ef6Z&OoA>{tcG<2ksVNn&KS{Wsd+4^$VRo{O(Keko;h!pU zZ<-z7u&c|)-c?-xrb+!No?@M@9W#!4Z<-*~HzDrI3ip#!n5I{AUH>R4wWIdH4tr+S zH^K{YisUC>S(CN?q?^C@?0GdFF0anVWh9Y4ti9=v}1BJ*_v zm9oet?rR-_JFm|--PGUpGUMasb^mpnwRBdmHx39n6z9_Z&W-(sea99vn}02{$^uQ8 zj#x;kea^GdNeo(l@Ui5-rFXfRWrMF?y}RucztMsOCr-6v*p zd|B}A#L|5d_j0E`fAD3(&)*Mv{k1$FZxA`sBJb$ze*g5W@+`f?_>et8CqFpe(V5)7 z_LS<@bqD7z@qTZx)AHY+-%%Ih`p@lq-I7ysMKDmaX1!16ft?Bq4S9Hu7%P?jS)XCz zaMNI!QBV~-*Zga<6&C&76kZ^={$f*Y%TGUbGG_T zd+YgcR88WZdrS_TaHAkmMxi$SqoK>&7tWpalNC9XnD!RKXhIkY)^ZJn#~;`tW(3mbfQ@u)T(>zw~ESIgUSW6Ymd?Dx~}`#9!b zELuHd>Afi1iZu!^4b_&uKEFOX;>9^hr*f8#KdIkC^X9QU+M2$d=Um+SX}cEn%<#H5 z(e*;J=1HN+z8~GbPTXk8uzhjg5@{(e>;Bw-z<4CV=YQ|FZ-LT6 z?jdqNp9^?}IxaueY&R=caNY}f^$@-*e>o1Osl2~r+WxHBM^k}W_)Yn?`dHhFHGxc~ z9}C>Cmpj-*t#j!UV|&HED@*Om%MGVrx|+J3xMQP`*|#V2`0L|d*Cxvrtlg=eJ?~g7 zm$9*LtFxME*~xffY#_TD1El~@=&cjxQrzOiqQI+$5; z2Bh;GRBlym{Ly3V>8VkDjQ@wl2`|Y`&nCXP*CrRd2%B$i6W)9!{?G2Og87^OJ+ar( zuRi8?{d9?B>;fL`$?Bo)+j4^T3&$#5{Ji!$>$jh(6{ZY{r#`y~U5}~M&&kbwtCXK` z!*08Vel*L%&BxF3afvrSyWQs+dj3&kwd?(>Z^M*s&w6`d)`V|`jKQlslmKOFv2EHd(olf^m^KOn<=_DkTJlE)_ zUeuPZeKG|_?EZnd>zFv#-w=J1SaaDY$Ur%;Sr4aO)jD2q&S}Zh=iIt0 z&n%y|@FSxm?+4o|;X6(a?*+miB=&Vy1aP%GEp?MWIVGiGwFh^+-u_=oC)>j1I`m5Z zH&wjYt~BlItUVu&A7}c*tG4Pr`>}fud_`wEuGU`iYT>;Ho)r_%#@e0d|ReWIPhh^pbY{Evzw;sz~{Vp_r zmg+s90JSMzR~L7xDBgW3wdKLq)qH!6dUriYG11dvskRCEtv2D2VTwd1&oS}7nL1NB zTUW{PHB{Pdf4GmAalh$yO_7j$R{vvJcD#J@;rH%;U)>jIY>4$*>-VNi_J865ImQ)k zySXl%x7&QUWR~7$+c>f3bGCOaWDxh5`%tmEr0Ml;p7@!5mCheMdk(Wiusycu6cb@g zH4=Nw@i%U=7Ym za_t>mi(Tc&CI(Cn>o*&Jtl2 zy0E2SbN<&ei&_?jRQ)>XB<-7^xmoL%QsB`iMzdX8irU&wXQe7wZrEDZcYWuQl{Yu$ zlr6Aos;Dtdi_AAsdcE@EZ<__x2}@7csY;*ycd)_Fyf}G9Uv*i~>OJ~GQ+@QdMb6w_^zCd(-08m?`PddVO31bM^BxJY5MAN2 zeQAF2+S04y;#?mhd^az0sJp~n7;BavXnybNhk2dh;fV~U%!d9}_hN6B|JwD%Y4)9O zzZDHK6&@8XI$(PtV3vROv4Gj9KS{G4ddDPq?Ag&Jo0m`TH=5S>$jATm*JZa|Sn~uV zHFobiXJf8gozrb3rWd<)&c@y@m4=P?)+wES<*7SuYOLb=a+PIUeX=^`Pd%Piz4njh zMveXFv!|V&xk0Sg@ZtLK3kDxHrVHJcD7EfgX|`}T`{O)6mmEKnRek2cPm533h8?_; z;&S1=r%Pw%#1!v8|8GcCM%;;;_P!%MC#s@l?$$->r~g@Z?P~P)U=EfqyYclS8^=s9 zjXds_vtij0k{Q`cZa?s!G}WQ2)ITsz#VV^Msy$pit@iEWDWBD&ST}@fg|n}2O)Fj; zQ24}k(t-l=!@?~S1NZFiOk8DoIPIs21n=?VD}N|_EI4j{KrLUJV^`ma z+n=igKUi;D+F!@jm(xA>3`?=K>Xz@(xBkt^ThLyVsG`^$q{eY_!&3kCqJcR9g3rHR zmpcCKGQ->wW$uU#Zww~Sip#ebx11a{&ra)L^V_3tfxGpy-mErV$ag~Tky?*dP=&{_ z0^_;+J7Qe|dcOJ_TI@O`=zratZM~slg~{uG`)zV#bow$)7iIXY5v`2;E@NwIGhyYL zH#1F5Q{JsJewiTt_xG1Ck0wtn?(6%aEvR_&pxcd?`y=))bmlX(U*!8MtAYLXOLL3e z-A?D$`7J&hx;XTjwQ=W>(raSjN)qlabrB+_ktr7~mWb`*GT3gK%JacH%wkHHx8Szq zrid?^^Ybn%vfVkn_Sw-HPAnhn+_N+7W*DuPW42xTG`?Ee*qLedltz{%0yWigGuf&% zyk?po3w~Ih&CP3>GJnh3MJ|bAH<^NuoIGsuL#?~g*<&$R`^+`R4fcnJyI6Uqm}Y5n zo>;%*F-u+q$EowK=Mr{ZzPKc6y2h%tLhccMt#>(;KkU=UuoRa(*7L7^&BiLR?;%m| zjCms(c}12A9k!mhKVd4X8qYiK1ono!BljjAQ*e6oJ3Ge7W8v58Q%apXCUpdc{uB=2 z?tGyT()dZx-Hm0k*Q&b3);(MOjBe~cB&d39?LHNubE%FheunC+E*2&ISUJ%{CMnNn z^+Pw=q=2%QvhLAVx~c*wjM{?18qx)`fNv%X3q*tB<>I9}S4&@ZW4~JM-b2mIRY_{mo&Y4%FyG zsiccZyFZ&Po^)(|@tXgFKR-&wMCm2&-P6`mn%;bWqpUIWBL10o@|t8WY*}=IW0K(E zib+`var-*T9>|L?N;gRFcyX4m=Ea@h3wQsREK&~Z-+s#Qn@{%ihn31U?>GI`zjY!a zdu!i|{F+;fD#LnQPa8gs*b?!TC!*i}{*Tg?`=6fq8$E+xe@>~n>i7R854PtdAD`U0 z|KoZ2z80$kJ=r(sY`%GI>DGv&_D_x#{$mca z@7Z&yo8J|$HuLrB+ZpBs-yPQMy<{g0bgbevh{ zKBubaO(^3}@rQS>uVp>3BUd7@Zw}k(O`bABc|MPit@TkV^K#KJd=e|PxBkKT-4B+u z6&cj8tgic_;HsA2;chD4bApL2G2BAw)uPiAH0Q|8u~)zS{=3Ff{TVwpUTfd^GcaPs z$`vbIPEBn!{uHzN{KgyhT{+Q(7W=gy9_4>>=6~)TJxf+Q-^De59RA-FRm0QuYKP-$K>#7 zn&v%;E1Z%UcQwD9)Q;HU|g>*M*~ z?BqM8x3*)BzxR^oNA%vs)NEV7?c9>|-xB(lZd#l${5YwHZ{_{p{O<|^?>zncT6}V< zN)yZTWtWGw49@(yQ~lc(yCKCr)kc^6g`}q9o^8^jPfVr?+fsipT#+Ff3}0 zR?=~K79jXv-TIrxhNWkvO}+csBlfL&!qU` z^Ks9SLluKH;sg8uk{z6Yw>}wl$|RGu-?2mDuR0E2pKJ z^k#EhEc)$zdWUUCluF5powlh<@6@%6?Q?R;FtOek;I~-QVe8``bIn6H^4h=j`4!9e zVB*#=9eIu~D@;0sMSnijue%YxxFq8Akxwhmy_jj0?Wa`oIQJBJgRUU3KNR?QMhAcLh>}U!8gA zCQ%|MuP$R=)$;53zu&Xp{LeU}9ekOAb#=G6&Fk5@%WoGcPHbn5bp5u2{pt4ye$P(L z4y^iiVV~Kym0=6KE$4n)6(+eMX{u)5+4JxCLJk)1x#%@7X#SIZJ1*wyr)W>s`l`KF zF>iJF+DG#Yoy(RVKIi)>-g~p(I)T%?M>ptX8o%^jEs`)pTXEflvs`;tZ7N?BE+V!i zV_8bxy;oa`6b|j0-EwO}%!$o)?uUJ@?s{spQ~l`mspg?STy8x$Epe=7O~j%v*SkMS zJ6nmrJtjRt=wjDS`5!YK+JE^L9V-{jd(@`?>Heb4Qg=)kENo8x{g$?W?vXIHtE*yX zUwL%VXQSoZqrIWYL4QxJdJ+{nDcPUzOl{2S9Sp~e{yi@EpKMV7ps0?4KmUrI`Oz~w zf_y(**{RcX#p}r*NAWJ1wveA90sTwQq#HaB)Ciu@v$EP|hI!#XxlMk{+IBUr34c6k z@u|c7M!g=trtWG#d&_s}yR?np8S>(Tua;%(Srb3^Y@XHZQZ=r_zzt!((qMT%=zo;p8wx`JhX*RdTt4O zy^b}$Co8*t!b?4d089TxUw{98bH+I()Ty0&Meg*=MH#&%&zL@}-P5+_8^il;@&77c zoHV%>W#zx<^Uq(7JCnXHGbmj@b6f2#zJT>B);&3z^(>sX<=w9S-3Rx!Op!itx5hd; zL6~dm4ZWZLmN6f8`ob+DV|OLOB(>t?B+Y*5!_Tu9Pkp}JcePEpG_y5-r;xO3$J`q~ zmwkA0{A0%C_JiV|PjgI~{r~QihF78Q6xF6QK3=WmWy08Z^8AUll7T zlA+}zwDi!rv;&L1RW3#8x2a8qN0 z&}Avg9L~vEJO=n)tiF1#4sS1^B_^inB@b^*a zL%-iGn*UFiUHpWA>k*&j2d)OpxIJ_7(G%*;lgt8^)-7De)O~fuhSdfwifs?{Le|cl zf3c;I*Xf0V+Tu(*gMFD9(^|8Ro?aEl{cf&kzeTri!D?rP{9{vgvDjQw>{xH0RNHi8 zhmWRd%G4Duu1wx7U%j?m-LXkCLHOopJE^R`2_Jcip1;iOo#{DsMk$X<%d^!@pX-hG zpI;jG`uc1B*h_1#GagJ#-JH<3)ywkvlBgwY(R|u(Z(X{uJmj6TT&I~?&|A?1&l-*% zYJ3y-W%uK(1M)#FtXG*oB(X&wO!(VmV(7PU()}di{c0k6A0`}_Q>Wz;MKmPjozrVq?p1)boKD) z4@GtFytvlAK7M;mwa-aAyULr*JuJPS%59srmu{D@$e3%MAGWtzl*wt$gG=x1GwgeX zbW~<%{Aj;#b1tshYj44vVnyFNXRq@$oEaPUMC-ULddw8%Xb9n~K?B){(CWv}*Y?C^;U&qPi!SC$;SK;5-5>?a>vKfT6Yeasz*E-|Ve-9ZK zooUfWWs1yNB3~yI#1tJ9u+iiG&e>U^uKs><;cD*ZPamaky>9>T*|r8B)vvi1SN*>K zG>CtXN=S{rYOVhn`9*?<`j{-+)+F#ho&H|p2_J9LzMRtC=a;`bv9GK%Jo&=vr$!#x z-+!iF{=$|qeI4rt<#g+Y)g=ZDXBX=qV+?mvKbIR(b^*9v;QclQS! z7Mb#$VcH29&28u8nm6Cq{u8(E#(CAdZk~y&X8-rl3Ein(Ay(J%AR+gEVs~LTW428K zi{nq{;HA^L=332L6f6?Tq5DkZ%g_4W*^09-uUgW#;QUOlX{UP%7t2qa%KK6>YC>44 zOVyDwmrYN1sK)IQueebtA#-?M>@M@7Lz_a2&XoC7GtygyOob`XcU;l)`{~5gd&Kpnt^8U2^kykZre++{o zR~)tUQO@{ybHfGuN)5NSH>7uNxB6CMTJ}dqR8qez&cN(pVBX}~&I++MpK$IT_I369 zueqGC+FHB1`$f@ei!1B*&sVy+d|JM1r(X!`J@dJ9Q|v6b4*ZtP=h$I$a5m4g*-Ucb zAJ|%VHXglsASLI)1~Y~^%75agM4padf5O|xJ8!qW8Mm?7>$=Euh8MOZ^b-3p4xiy_#hu{8H=Hty2aIjz``2@_FZ+Jwjn;XKY%l6ZGnJ*uzg=g70|5EMB%mjH$r-d#jjGMXN za_u{D{{Nzc>D9I71#e^SE#0%Ho5xSec{XQ&(~0_yMx&Z{Zq_TfAv(fw4X_S-eLWW)gPBUiF=@McSB|N`a`GJ&g-gU zk?DU>{*ZI`#~*iDVv1sZsTv*pooT*xrfOwQP=4xVjgv((vv1w9lU8bx^PO`&kJS~>(BX~$kd$NTrXVD{hPZv-S2VHuZq(Z#)b<5+576x)%mtQzVp`n zcdp&`1K)p%+Ih*l&EET8e_Cf~lmTxMqsNLbU**_VZ!wO{S@-gx@lWNITW0E9IgzB@ z|&kkdPw*JS$ zKUC~m{U00u(6MVjH+#}u=DI(MVm9;H_XO(l2`Aj)NNoS66qbP2)tgG>1(n>ow4SVJe!N)I_wl6IADjpE z^=tMsdD&_Q^qT%S{yiqszkHp;*Fd(`$0x=7tqeFnr(R=`6xhANeZsUuPfjpc%yW_B zHK?CaCLyEVUiijxUl;%L)%shnO#Cy6(P!_~mB-$4I{t3CwEW&znN6yKu77eaowrSo z-(F$G9BlMg@EMc3Pzck$cXC=QXT5sJA}G``@%VbX$DRt?-q?MWvE)<#ogv6;uXp#( zt!=xOb@y9OIr-pxSNZN)R}0jBJYRL0^_jl{nWQ#9Ovg{OO;)ek+L>crYj z&wJ-dl$UQkC#(j7{^BO0JxD zaSSS%x~$z(XvycR?d#(nnM__}$=Z~8#N%?LmM!ySmbt0i6ZL!j(tlkocp8d7Fv z=%?v!fv%|`B8%@&QHWi>^z+xMj}tZ>mD2i>HsRUUsizEd9lxx{Ce zu9~dqIbmk)PK9!|cjvmlYqltIwFq_EZg1T%ZzB8Ul(y)#elss>tqp#gbh_+|P3b+? zb7CAaa&fP7CDwiVCAY3@U!a~-O2pCS(VKl(PksKw60o^PC%}h^eM(`%4ja{F4;}W% z99S9iInF7;tV(iCM&I;i!zz9L=Kp)eUM#(&?YM-`J5q7NbFUSJS{4T_)+Dsq$V^!0 zGVxv4R>K2YVy7+#yYHQ>wv%m*$G0h$J|_NUzNWwVl8;?eSbbQ=nkAFZA93%h=)AQ( zXTg!`SGw;GS4n!O2HC9TFeByj + + + + + + + + + + + + {BLOG_TITLE} + + + + + + + + + + + {WEATHER_MODIFIER} + + {TOPBAR} +

Blog

+
+ {BLOG_POST} +
+ + + \ No newline at end of file diff --git a/blog.js b/blog.js new file mode 100644 index 0000000..9c182ed --- /dev/null +++ b/blog.js @@ -0,0 +1,33 @@ +const api = require("./api.js"), +app = require("./expressHandler.js").app, +showdown = require("showdown"), +pageUpdater = require("./pageUpdater.js"), +fs = require("fs"), +path = require("path") +mkhtml = new showdown.Converter() + +mkhtml.setFlavor("github") + +app.use((req, res, next) => { + if (req.path.includes("blog") && api.blogPosts) { + var postName = decodeURIComponent(req.path.substring(6, req.path.length - 1)) + for (var i = 0; i < api.blogPosts.length; i++) { + var post = api.blogPosts[i] + + if (post.folder == postName || post.folder == decodeURIComponent(post.title)) { + var mkdwn = post.data + var html = mkhtml.makeHtml(mkdwn) + + html = fs.readFileSync(path.join(__dirname, "assets/html/blog.html")).toString().replace("{BLOG_POST}", html) + + html = pageUpdater.converter(html, false) + + res.send(html) + return + } + } + next() + } else { + next() + } +}) \ No newline at end of file diff --git a/index.js b/index.js index f18948c..a68365e 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,8 @@ const fs = require("fs") require("./fileHandler.js") require('./expressHandler.js') +require("./pageUpdater.js") +require("./blog.js") // require("./imageEmbedder.js") process.on('uncaughtException', (err, origin) => { diff --git a/package-lock.json b/package-lock.json index 86c401b..be0ecd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "glob": "^10.4.2", "himalaya": "^1.1.0", "minify-html": "^0.0.2", + "showdown": "^2.1.0", "ws": "^8.16.0", "youtubei.js": "^9.0.2" } @@ -282,6 +283,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1235,6 +1245,22 @@ "node": ">=8" } }, + "node_modules/showdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", + "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", + "license": "MIT", + "dependencies": { + "commander": "^9.0.0" + }, + "bin": { + "showdown": "bin/showdown.js" + }, + "funding": { + "type": "individual", + "url": "https://www.paypal.me/tiviesantos" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -1802,6 +1828,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -2470,6 +2501,14 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "showdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", + "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", + "requires": { + "commander": "^9.0.0" + } + }, "side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", diff --git a/package.json b/package.json index 1c7cf98..7b4a677 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "glob": "^10.4.2", "himalaya": "^1.1.0", "minify-html": "^0.0.2", + "showdown": "^2.1.0", "ws": "^8.16.0", "youtubei.js": "^9.0.2" } diff --git a/pageUpdater.js b/pageUpdater.js index 249f48d..498cfe5 100644 --- a/pageUpdater.js +++ b/pageUpdater.js @@ -89,7 +89,20 @@ function highlighter(json, full = true) { var element = json[i] if (element.type == "element") { if (element.children.length > 0) { - element.children = highlighter(element.children, full) + if (element.attributes) { + var valid = true + for (var x in element.attributes) { + var attribute = element.attributes[x] + if (attribute.key == "class" && attribute.value == "value") { + valid = false + break + } + } + } + + if (valid) { + element.children = highlighter(element.children, full) + } } } else if (element.type == "text") { var index = 0 @@ -291,6 +304,26 @@ function converter(html, dynamic = true) { } return html }, + "BLOG_POSTS": () => { + var addedHTML = "" + for (var i in api.blogPosts) { + var post = api.blogPosts[i] + addedHTML += + `
+ +

${post.title}

+

${post.desc}

+

Path: /${post.folder}/

+
+
` + } + if (!api.blogConnected) { + addedHTML += "

Not connected to blog server :(

" + } else if (addedHTML.length < 10) { + addedHTML += "

No blog posts found...
wait
huh ???
what???????
how ???????????????
WHY ?!
Violet must've fucked up like. REALLY bad.
We're so cooked

" + } + return addedHTML + } } var realtimeReplacers = { @@ -389,14 +422,13 @@ module.exports = { } res.send(data) - } else { - res.status(404).send(` - -

404

-

Uh oh... I think your lost? There's nothing here :P

- `) + } + else { + next() } - } + }, + + converter: converter } async function updateCommits() { @@ -438,6 +470,8 @@ pregenerate() api.events.on("lanyardConnect", pregenerate) +api.events.on("blogUpdate", pregenerate) + api.events.on("lanyardUpdate", async () => { if (!api.lanyard.activityChanged) { pregenerate() diff --git a/static/blog/index.html b/static/blog/index.html new file mode 100644 index 0000000..e1d2226 --- /dev/null +++ b/static/blog/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + Blog - Violet's Purgatory + + + + + + + + + + + {WEATHER_MODIFIER} + + {TOPBAR} +
+

Blog

+

Welcome to my blog! Where I go on nonsensical rants about uninteresting and unimportant topics. The blog just went through a MAJOR rewrite, so expect bugs!

+
+
+ {BLOG_POSTS} +
+
+ + + \ No newline at end of file diff --git a/static/blog/style.css b/static/blog/style.css new file mode 100644 index 0000000..af27a20 --- /dev/null +++ b/static/blog/style.css @@ -0,0 +1,147 @@ +@font-face { + font-display: swap; + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: url('../fonts/source-code-pro-v23-latin-regular.woff2') format('woff2'); +} + +@font-face { + font-display: swap; + font-family: 'Rubik'; + font-style: normal; + font-weight: 400; + src: url('../fonts/rubik-v28-latin-regular.woff2') format('woff2'); +} + +@font-face { + font-display: swap; + font-family: 'Encode Sans Expanded'; + font-style: normal; + font-weight: 400; + src: url('../fonts/encode-sans-expanded-v11-latin-regular.woff2') format('woff2'); +} + +* { + font-family: "Encode Sans Expanded", "Rubik", Verdana, Geneva, Tahoma, sans-serif; + padding: 0; + /* text-align: center; */ +} + +h1 { + color: rgb(0, 255, 0); + font-size: 2.5rem; + text-align: center; +} + +h2 { + color: rgb(0, 255, 0); +} + +li, +h3, h4, h5, h6 { + color: white; +} + +h3 { + font-size: 1.5rem; +} + +body, +html { + margin: auto; + background-color: rgb(10, 10, 10); + margin: 0; + padding: 0; +} + +a { + color: rgb(175, 225, 255); + display: inline-block; + transition: 1.5s all cubic-bezier(0.075, 0.82, 0.165, 1); +} + +.textBlock { + color: rgb(255, 255, 255); + white-space: pre-wrap; + background-color: rgb(20, 20, 20); + border: 2px lightgray solid; + padding: 0 10px; + font-style: italic; + font-family: 'Source Code Pro', sans-serif; + text-align: center; +} + +.post { + color: rgb(240, 240, 240); + background-color: rgb(5, 5, 5); + border: 2px gray solid; + padding: 10px; + padding-top: 0; + margin: 25px 10px; + text-align: center; +} + +a:hover { + color: white; + transition: 0.5s all cubic-bezier(0.075, 0.82, 0.165, 1); +} + +p, li { + color: white; + font-size: 1.2rem; + padding: 0; + margin: 10px; + line-height: 2rem; +} + +img { + width: 100%; + max-width: 135px; + transition: all 2s cubic-bezier(0.075, 0.82, 0.165, 1); +} + +hr { + color: white; + opacity: 0.25; + border-width: 2px; + margin: 15px 10%; +} + +ol, ul { + display: block; + width: 80%; + margin: auto; +} + +#topbar { + background-color: rgb(50, 125, 50, 0.5); + width: 100%; + padding: 0.5vh 0px; + margin-bottom: 1vh; + /* position: sticky; */ + left: 0px; + top: 0px; + z-index: 10; + /* opacity: 0.5; */ + transform: scale(1); + transition: all 2s cubic-bezier(0.075, 0.82, 0.165, 1); +} + +#topbar > * > * { + text-align: center; + display: inline-block; + margin: auto; + padding: 0 2%; +} + +#topbar > h3 { + display: block; + text-align: center; +} + +main:nth-of-type(1), .mainDiv { + width: 95%; + max-width: 1000px; + margin: auto; +} \ No newline at end of file diff --git a/static/index.html b/static/index.html index ffa41d8..688a5ba 100644 --- a/static/index.html +++ b/static/index.html @@ -58,7 +58,7 @@ Stats Nerd FAQ {BRANCH_NAME} site - Blog + Blog FileShare