From 371ecdb897b8678ea29739a84ee65998219c40a4 Mon Sep 17 00:00:00 2001 From: Akis Date: Wed, 25 Jan 2023 16:50:03 +0200 Subject: [PATCH] a lot of stuff --- .dockerignore | 1 + package.json | 3 +- pnpm-lock.yaml | 143 +++++++++++++++++++++--- src/app.css | 6 +- src/app.html | 1 + src/hooks.server.ts | 33 +++++- src/lib/Hero.svelte | 9 ++ src/lib/PageTransition.svelte | 10 ++ src/lib/Projects.svelte | 26 +++-- src/lib/Services.svelte | 48 +++++++- src/routes/+layout.svelte | 34 +++--- src/routes/+layout.ts | 7 ++ src/routes/+page.server.ts | 8 +- src/routes/api/announcements/+server.ts | 12 ++ src/routes/api/projects/+server.ts | 2 +- src/routes/services/+page.server.ts | 14 +++ src/routes/services/+page.svelte | 5 +- 17 files changed, 305 insertions(+), 57 deletions(-) create mode 100644 .dockerignore create mode 100644 src/lib/PageTransition.svelte create mode 100644 src/routes/+layout.ts create mode 100644 src/routes/api/announcements/+server.ts create mode 100644 src/routes/services/+page.server.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/package.json b/package.json index f6dc1b5..2741322 100644 --- a/package.json +++ b/package.json @@ -17,13 +17,14 @@ "@sveltejs/adapter-node": "^1.1.3", "@sveltejs/kit": "^1.0.0", "@unocss/reset": "^0.48.4", + "axios": "^1.2.3", "prettier": "^2.8.0", "prettier-plugin-svelte": "^2.8.1", + "sanitize-html": "^2.8.1", "svelte": "^3.54.0", "svelte-check": "^3.0.1", "svelte-copy": "^1.3.0", "svelte-dark-mode": "^2.1.0", - "svelte-seo": "^1.4.1", "tslib": "^2.4.1", "typescript": "^4.9.3", "unocss": "^0.48.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3c6d84a..9eb00cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,13 +6,14 @@ specifiers: '@sveltejs/adapter-node': ^1.1.3 '@sveltejs/kit': ^1.0.0 '@unocss/reset': ^0.48.4 + axios: ^1.2.3 prettier: ^2.8.0 prettier-plugin-svelte: ^2.8.1 + sanitize-html: ^2.8.1 svelte: ^3.54.0 svelte-check: ^3.0.1 svelte-copy: ^1.3.0 svelte-dark-mode: ^2.1.0 - svelte-seo: ^1.4.1 tslib: ^2.4.1 typescript: ^4.9.3 unocss: ^0.48.4 @@ -24,13 +25,14 @@ devDependencies: '@sveltejs/adapter-node': 1.1.3_@sveltejs+kit@1.1.1 '@sveltejs/kit': 1.1.1_svelte@3.55.1+vite@4.0.4 '@unocss/reset': 0.48.4 + axios: 1.2.3 prettier: 2.8.3 prettier-plugin-svelte: 2.9.0_kdmmghgdi3ngrsq6otxkjilbry + sanitize-html: 2.8.1 svelte: 3.55.1 svelte-check: 3.0.2_svelte@3.55.1 svelte-copy: 1.3.0 svelte-dark-mode: 2.1.0 - svelte-seo: 1.4.1_typescript@4.9.4 tslib: 2.4.1 typescript: 4.9.4 unocss: 0.48.4_vite@4.0.4 @@ -674,6 +676,20 @@ packages: picomatch: 2.3.1 dev: true + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /axios/1.2.3: + resolution: {integrity: sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -748,6 +764,13 @@ packages: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + /commondir/1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true @@ -803,6 +826,11 @@ packages: resolution: {integrity: sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==} dev: true + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + /destr/1.2.2: resolution: {integrity: sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==} dev: true @@ -816,10 +844,42 @@ packages: resolution: {integrity: sha512-Pkwd8qrI9O20VJ14fBNHu+on99toTNZFbgWRpZbC0zbDXpnE2WHYcrC1fHhMsF/3Ee+2yaW7vEujAT7fCYgqrA==} dev: true + /dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + /duplexer/0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: true + /es6-promise/3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} dev: true @@ -854,6 +914,11 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + /esm-env/1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} dev: true @@ -909,6 +974,25 @@ packages: path-exists: 4.0.0 dev: true + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -985,6 +1069,15 @@ packages: function-bind: 1.1.1 dev: true + /htmlparser2/8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + dev: true + /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -1050,6 +1143,11 @@ packages: engines: {node: '>=0.12.0'} dev: true + /is-plain-object/5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + /is-reference/1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: @@ -1119,6 +1217,18 @@ packages: picomatch: 2.3.1 dev: true + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + /mime/3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} @@ -1238,6 +1348,10 @@ packages: callsites: 3.1.0 dev: true + /parse-srcset/1.0.2: + resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + dev: true + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1299,6 +1413,10 @@ packages: hasBin: true dev: true + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -1366,12 +1484,15 @@ packages: rimraf: 2.7.1 dev: true - /schema-dts/0.8.3_typescript@4.9.4: - resolution: {integrity: sha512-GSLeVkUgEe8DzS8/FGWou1wlC8tQ1KXA5amCqCIH/psUzF74fWswtT0QFlSoJLT08CYyixnc3S/lkAm+RExoLQ==} - peerDependencies: - typescript: '>=3.4.0' + /sanitize-html/2.8.1: + resolution: {integrity: sha512-qK5neD0SaMxGwVv5txOYv05huC3o6ZAA4h5+7nJJgWMNFUNRjcjLO6FpwAtKzfKCZ0jrG6xTk6eVFskbvOGblg==} dependencies: - typescript: 4.9.4 + deepmerge: 4.2.2 + escape-string-regexp: 4.0.0 + htmlparser2: 8.0.1 + is-plain-object: 5.0.0 + parse-srcset: 1.0.2 + postcss: 8.4.21 dev: true /set-cookie-parser/2.5.1: @@ -1537,14 +1658,6 @@ packages: typescript: 4.9.4 dev: true - /svelte-seo/1.4.1_typescript@4.9.4: - resolution: {integrity: sha512-ud0vdQrAVvZHLFsYznimlKdxWC47GqYWgOBBTr3mYDPouBPQHYDazEFredmwUm5boVoMRffu/aOJ5Yj1xQQibA==} - dependencies: - schema-dts: 0.8.3_typescript@4.9.4 - transitivePeerDependencies: - - typescript - dev: true - /svelte/3.55.1: resolution: {integrity: sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==} engines: {node: '>= 8'} diff --git a/src/app.css b/src/app.css index 4057b07..f048406 100644 --- a/src/app.css +++ b/src/app.css @@ -3,7 +3,7 @@ html, html.light { --secondary: #eeeeee; --tertiary: #141414; --grey: #444444; - --accent: #088058; + --accent: #009b50; color-scheme: light; } @@ -25,7 +25,7 @@ html, html.light { } body { - @apply bg-primary duration-400 font-primary text-grey transition; + @apply bg-primary duration-200 font-primary text-grey transition-colors; } .container { @@ -37,5 +37,5 @@ h1 { } a { - @apply text-accent underline underline-offset-4 transition-opacity hover:opacity-75; + @apply text-accent underline underline-offset-4 transition-filter hover:brightness-75; } diff --git a/src/app.html b/src/app.html index 7ae5908..bf84446 100644 --- a/src/app.html +++ b/src/app.html @@ -4,6 +4,7 @@ + %sveltekit.head% diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 7c53d57..dc432e1 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,10 +1,37 @@ import map from "$lib/map"; +import axios from "axios"; +import { Agent } from "https"; + +const agent = new Agent({ + family: 4 +}); const updateMap = async () => { - const res = await fetch("https://gh-pinned-repos.egoist.dev/?username=akisblack"); - const data = await res.json(); + try { + const announcements = await axios("https://status.akisblack.dev/api/status-page/akisblack", { httpsAgent: agent }); + + if (announcements.status === 200) { + map.set("announcements", announcements.data); + } else { + map.set("announcements", { error: true, message: "Error: " + announcements.status }); + } + + } catch (err) { + map.set("announcements", { error: true, message: "Error: " + err }); + } + + try { + const projects = await axios("https://gh-pinned-repos.egoist.dev/?username=akisblack", { httpsAgent: agent }); - map.set("data", data); + if (projects.status === 200) { + map.set("projects", projects.data); + } else { + map.set("projects", { error: true, message: "Error: " + projects.status }); + } + + } catch (err) { + map.set("projects", { error: true, message: "Error: " + err }); + } }; updateMap(); diff --git a/src/lib/Hero.svelte b/src/lib/Hero.svelte index 0e98b15..3a12ad3 100644 --- a/src/lib/Hero.svelte +++ b/src/lib/Hero.svelte @@ -33,6 +33,15 @@ {/if} Web developer, Linux enthusiast and average Greek. +
+
+
+
+
+
+
+
+

diff --git a/src/lib/PageTransition.svelte b/src/lib/PageTransition.svelte new file mode 100644 index 0000000..0a718c1 --- /dev/null +++ b/src/lib/PageTransition.svelte @@ -0,0 +1,10 @@ + + +{#key pathname} +
+ +
+{/key} \ No newline at end of file diff --git a/src/lib/Projects.svelte b/src/lib/Projects.svelte index 6411c82..83d66d2 100644 --- a/src/lib/Projects.svelte +++ b/src/lib/Projects.svelte @@ -7,14 +7,18 @@ export let projects: any = []; -
-

Projects

- {#each projects as { link, owner, repo, description, languageColor }} - - - {description} - - - {/each} -
-
\ No newline at end of file +{#if !projects.error} +
+

Projects

+ {#each projects as { link, owner, repo, description, languageColor }} + + + {description} + + + {/each} +
+
+{:else} +

{projects.message}

+{/if} \ No newline at end of file diff --git a/src/lib/Services.svelte b/src/lib/Services.svelte index b456b6e..8dc5f98 100644 --- a/src/lib/Services.svelte +++ b/src/lib/Services.svelte @@ -1,14 +1,60 @@ -
+

Services

I host a bunch of public services on a VPS and the Project Segfault pubnix.

+{#if !data.announcements.error} + {#if data.announcements.incident} +
+ {#if data.announcements.incident.title} + {data.announcements.incident.title} + {/if} + + {#if data.announcements.incident.content} +

{@html sanitizeHtml(data.announcements.incident.content.replace(/\n/g, "
"))}

+ {/if} + + Created - {data.announcements.incident.createdDate} + {#if data.announcements.incident.lastUpdatedDate} + Updated - {data.announcements.incident.lastUpdatedDate} + {/if} +
+ {/if} +{:else} +

{data.announcements.message}

+{/if} + +

But where are the instances!!!????

You can find a list of all services/instances hosted on the VPS on the status page.

diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 1449772..992b314 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,33 +1,27 @@ - + + {$page.data.title} | akisblack + {#if $page.data.description} + + {/if} +
- + + +
\ No newline at end of file diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..072b464 --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1,7 @@ +import type { LayoutLoad } from "./$types"; + +export const load = (async ({ url: { pathname } }) => { + return { + pathname + } +}) satisfies LayoutLoad \ No newline at end of file diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 7dde704..28b87ba 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,9 +1,15 @@ import type { PageServerLoad } from "./$types"; export const load: PageServerLoad = async ({ fetch }) => { + const meta = { + title: "Home", + description: "Web developer, Linux enthusiast and average Greek." + } + return { projects: await fetch("/api/projects").then( (res) => res.json() - ) + ), + ...meta }; }; \ No newline at end of file diff --git a/src/routes/api/announcements/+server.ts b/src/routes/api/announcements/+server.ts new file mode 100644 index 0000000..4e9b888 --- /dev/null +++ b/src/routes/api/announcements/+server.ts @@ -0,0 +1,12 @@ +import type { RequestHandler } from './$types'; +import map from "$lib/map"; + +export const GET = (() => { + const data = map.get("announcements"); + + return new Response(JSON.stringify(data), { + headers: { + "content-type": "application/json; charset=utf-8" + } + }); +}) satisfies RequestHandler; \ No newline at end of file diff --git a/src/routes/api/projects/+server.ts b/src/routes/api/projects/+server.ts index f6ac558..631c009 100644 --- a/src/routes/api/projects/+server.ts +++ b/src/routes/api/projects/+server.ts @@ -2,7 +2,7 @@ import type { RequestHandler } from './$types'; import map from "$lib/map"; export const GET = (() => { - const data = map.get("data"); + const data = map.get("projects"); return new Response(JSON.stringify(data), { headers: { diff --git a/src/routes/services/+page.server.ts b/src/routes/services/+page.server.ts new file mode 100644 index 0000000..cb2af84 --- /dev/null +++ b/src/routes/services/+page.server.ts @@ -0,0 +1,14 @@ +import type { PageServerLoad } from "./$types"; + +export const load: PageServerLoad = async ({ fetch }) => { + const meta = { + title: "Services" + } + + return { + announcements: await fetch("/api/announcements").then( + (res) => res.json() + ), + ...meta + }; +}; \ No newline at end of file diff --git a/src/routes/services/+page.svelte b/src/routes/services/+page.svelte index d7732ec..283d6ef 100644 --- a/src/routes/services/+page.svelte +++ b/src/routes/services/+page.svelte @@ -1,5 +1,8 @@ - +