From 72845b5eaa1a7659b6f61216703a02c126a421f9 Mon Sep 17 00:00:00 2001 From: Saahil Date: Tue, 24 Sep 2024 08:39:01 -0400 Subject: [PATCH 01/37] chore: add webring (#1) --- pub/index.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pub/index.html b/pub/index.html index 7db1b25..07fb1c2 100644 --- a/pub/index.html +++ b/pub/index.html @@ -74,6 +74,12 @@ neon@saahild.com

saahild.com/retro +
+ + + + +
Hack Club From b8d37b28b1a8eeb969dd9955df4021a4cbe49c34 Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:39:04 +0000 Subject: [PATCH 02/37] enhancement(lint): Fix lint errors for pub/index.html Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- pub/index.html | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/pub/index.html b/pub/index.html index 07fb1c2..f90df2c 100644 --- a/pub/index.html +++ b/pub/index.html @@ -74,14 +74,43 @@ neon@saahild.com

saahild.com/retro -
- - - - -
+
+ + + + +
-Hack Club + Hack Club From ffb8ffcede1b84090848a29deaacab1b0aaffa28 Mon Sep 17 00:00:00 2001 From: Neon Date: Thu, 26 Sep 2024 16:27:10 +0000 Subject: [PATCH 03/37] chore: ssh updates --- .bash_history | 20 ++++++++++++++++++ .config/htop/htoprc | 6 +++--- ...af164955a7d3358174241c99-card-database.tdb | Bin 0 -> 696 bytes ...ab83faf164955a7d3358174241c99-default-sink | 1 + ...83faf164955a7d3358174241c99-default-source | 1 + ...f164955a7d3358174241c99-device-volumes.tdb | Bin 0 -> 8192 bytes ...f164955a7d3358174241c99-stream-volumes.tdb | Bin 0 -> 696 bytes .config/pulse/cookie | Bin 0 -> 256 bytes 8 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 .bash_history create mode 100644 .config/pulse/623ab83faf164955a7d3358174241c99-card-database.tdb create mode 100644 .config/pulse/623ab83faf164955a7d3358174241c99-default-sink create mode 100644 .config/pulse/623ab83faf164955a7d3358174241c99-default-source create mode 100644 .config/pulse/623ab83faf164955a7d3358174241c99-device-volumes.tdb create mode 100644 .config/pulse/623ab83faf164955a7d3358174241c99-stream-volumes.tdb create mode 100644 .config/pulse/cookie diff --git a/.bash_history b/.bash_history new file mode 100644 index 0000000..dea02af --- /dev/null +++ b/.bash_history @@ -0,0 +1,20 @@ +cat .config/systemd/user/caddy.service +screen +htop +free -m -h +quota +quota -h +ls +du -h +neofetch +ls -a +htop +free -m -h +ls +nest resources +ls +mutt +ls Mail/ +mutt +ls -a +exit diff --git a/.config/htop/htoprc b/.config/htop/htoprc index a6939b1..e1b1e58 100644 --- a/.config/htop/htoprc +++ b/.config/htop/htoprc @@ -18,7 +18,7 @@ highlight_changes=0 highlight_changes_delay_secs=5 find_comm_in_cmdline=1 strip_exe_from_cmdline=1 -show_merged_command=0 +show_merged_command=1 header_margin=1 screen_tabs=1 detailed_cpu_time=0 @@ -39,14 +39,14 @@ column_meter_modes_0=1 1 1 column_meters_1=RightCPUs4 Tasks LoadAverage Uptime column_meter_modes_1=1 2 2 2 tree_view=0 -sort_key=46 +sort_key=47 tree_sort_key=0 sort_direction=-1 tree_sort_direction=1 tree_view_always_by_pid=0 all_branches_collapsed=0 screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command -.sort_key=PERCENT_CPU +.sort_key=PERCENT_MEM .tree_sort_key=PID .tree_view=0 .tree_view_always_by_pid=0 diff --git a/.config/pulse/623ab83faf164955a7d3358174241c99-card-database.tdb b/.config/pulse/623ab83faf164955a7d3358174241c99-card-database.tdb new file mode 100644 index 0000000000000000000000000000000000000000..b768866fb1223950c92953d51eccc06385cb197d GIT binary patch literal 696 rcmWG>aZ*Uj%t_^9zz%XH8P%H6qaZ*Uj%t_^9zz%XH8P%H6q8hM$qAs&N>GeUQTt zB3rWWg9*-fyTj&Z~&?Y0Rtcw24aw#%HM_Qf%RwRWg}dK-z6SE ZeINkxA|DWg-0{vTHVV@mgzY9kH2{IINu2-y literal 0 HcmV?d00001 diff --git a/.config/pulse/623ab83faf164955a7d3358174241c99-stream-volumes.tdb b/.config/pulse/623ab83faf164955a7d3358174241c99-stream-volumes.tdb new file mode 100644 index 0000000000000000000000000000000000000000..b768866fb1223950c92953d51eccc06385cb197d GIT binary patch literal 696 rcmWG>aZ*Uj%t_^9zz%XH8P%H6q-!xvEQ3IN zvir;D@4#YMl;$PpJW0pX2|msR)OpQ5e+*ezcRBS3Rq*bw#W_eT_kQV%ZG=SfyTAO7 zaq@GS8bAn~=Pwiy$2hVp=+5$}UCy}&c*FNkBh6AOM6t>0!3J}$-U$Q Date: Thu, 26 Sep 2024 16:27:20 +0000 Subject: [PATCH 04/37] enhancement(lint): Fix lint errors for .bash_history Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- .bash_history | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.bash_history b/.bash_history index dea02af..17e76d8 100644 --- a/.bash_history +++ b/.bash_history @@ -1,11 +1,11 @@ -cat .config/systemd/user/caddy.service +cat .config/systemd/user/caddy.service screen htop free -m -h quota quota -h ls -du -h +du -h neofetch ls -a htop From f6ae4c2c9d9488b8f70f7a8d46838d21925982d3 Mon Sep 17 00:00:00 2001 From: Saahil Date: Thu, 3 Oct 2024 23:27:13 -0400 Subject: [PATCH 05/37] feat: scrapbook css --- pub/scrapbook.css | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 pub/scrapbook.css diff --git a/pub/scrapbook.css b/pub/scrapbook.css new file mode 100644 index 0000000..86263ca --- /dev/null +++ b/pub/scrapbook.css @@ -0,0 +1,46 @@ +:root { + --rosewater: #f5e0dc; + --flamingo: #f2cdcd; + --pink: #f5c2e7; + --mauve: #cba6f7; + --red: #f38ba8; + --maroon: #eba0ac; + --peach: #fab387; + --yellow: #f9e2af; + --green: #a6e3a1; + --teal: #94e2d5; + --sky: #89dceb; + --sapphire: #74c7ec; + --blue: #89b4fa; + --lavender: #b4befe; + --text: #cdd6f4; + --subtext1: #bac2de; + --subtext0: #a6adc8; + --overlay2: #9399b2; + --overlay1: #7f849c; + --overlay0: #6c7086; + --surface2: #585b70; + --surface1: #45475a; + --surface0: #313244; + --base: #1e1e2e; + --mantle: #181825; + --crust: #11111b; + } + +body,html { +background-color: var(--base); +color: var(--text); +} +.post { + color: var(--text); +background-color: var(--surface0); +} +.header-link { +color: var(--mauve); +} +.header-link:hover { +color: var(--mauve); +} +.post a { +color: var(--blue); +} From 170c4c4b4452be2489280ce016aad1910e445c20 Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Fri, 4 Oct 2024 03:27:16 +0000 Subject: [PATCH 06/37] enhancement(lint): Fix lint errors for pub/scrapbook.css Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- pub/scrapbook.css | 71 ++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/pub/scrapbook.css b/pub/scrapbook.css index 86263ca..63773eb 100644 --- a/pub/scrapbook.css +++ b/pub/scrapbook.css @@ -1,46 +1,47 @@ :root { - --rosewater: #f5e0dc; - --flamingo: #f2cdcd; - --pink: #f5c2e7; - --mauve: #cba6f7; - --red: #f38ba8; - --maroon: #eba0ac; - --peach: #fab387; - --yellow: #f9e2af; - --green: #a6e3a1; - --teal: #94e2d5; - --sky: #89dceb; - --sapphire: #74c7ec; - --blue: #89b4fa; - --lavender: #b4befe; - --text: #cdd6f4; - --subtext1: #bac2de; - --subtext0: #a6adc8; - --overlay2: #9399b2; - --overlay1: #7f849c; - --overlay0: #6c7086; - --surface2: #585b70; - --surface1: #45475a; - --surface0: #313244; - --base: #1e1e2e; - --mantle: #181825; - --crust: #11111b; - } + --rosewater: #f5e0dc; + --flamingo: #f2cdcd; + --pink: #f5c2e7; + --mauve: #cba6f7; + --red: #f38ba8; + --maroon: #eba0ac; + --peach: #fab387; + --yellow: #f9e2af; + --green: #a6e3a1; + --teal: #94e2d5; + --sky: #89dceb; + --sapphire: #74c7ec; + --blue: #89b4fa; + --lavender: #b4befe; + --text: #cdd6f4; + --subtext1: #bac2de; + --subtext0: #a6adc8; + --overlay2: #9399b2; + --overlay1: #7f849c; + --overlay0: #6c7086; + --surface2: #585b70; + --surface1: #45475a; + --surface0: #313244; + --base: #1e1e2e; + --mantle: #181825; + --crust: #11111b; +} -body,html { -background-color: var(--base); -color: var(--text); +body, +html { + background-color: var(--base); + color: var(--text); } .post { - color: var(--text); -background-color: var(--surface0); + color: var(--text); + background-color: var(--surface0); } .header-link { -color: var(--mauve); + color: var(--mauve); } .header-link:hover { -color: var(--mauve); + color: var(--mauve); } .post a { -color: var(--blue); + color: var(--blue); } From 26f5382fce48ebeab552c0a34ee60750370ab0ad Mon Sep 17 00:00:00 2001 From: Saahil Date: Thu, 10 Oct 2024 23:17:28 -0400 Subject: [PATCH 07/37] feat: spotify + slack --- hackclub-spotify-bot/.gitignore | 3 + hackclub-spotify-bot/package.json | 17 + hackclub-spotify-bot/src/TODO.md | 15 + hackclub-spotify-bot/src/index.js | 40 + hackclub-spotify-bot/src/public/hackclub.css | 589 +++++++++++++ hackclub-spotify-bot/src/spotify.js | 113 +++ hackclub-spotify-bot/src/views/index.ejs | 37 + hackclub-spotify-bot/yarn.lock | 870 +++++++++++++++++++ 8 files changed, 1684 insertions(+) create mode 100644 hackclub-spotify-bot/.gitignore create mode 100644 hackclub-spotify-bot/package.json create mode 100644 hackclub-spotify-bot/src/TODO.md create mode 100644 hackclub-spotify-bot/src/index.js create mode 100644 hackclub-spotify-bot/src/public/hackclub.css create mode 100644 hackclub-spotify-bot/src/spotify.js create mode 100644 hackclub-spotify-bot/src/views/index.ejs create mode 100644 hackclub-spotify-bot/yarn.lock diff --git a/hackclub-spotify-bot/.gitignore b/hackclub-spotify-bot/.gitignore new file mode 100644 index 0000000..1be5c96 --- /dev/null +++ b/hackclub-spotify-bot/.gitignore @@ -0,0 +1,3 @@ +node_modules +.env +db.json \ No newline at end of file diff --git a/hackclub-spotify-bot/package.json b/hackclub-spotify-bot/package.json new file mode 100644 index 0000000..a62b1c4 --- /dev/null +++ b/hackclub-spotify-bot/package.json @@ -0,0 +1,17 @@ +{ + "name": "hackclub-spotify-bot", + "version": "1.0.0", + "main": "src/index.js", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "dependencies": { + "@slack/oauth": "^3.0.1", + "@slack/web-api": "^7.6.0", + "dotenv": "^16.4.5", + "ejs": "^3.1.10", + "express": "^4.21.1", + "express-session": "^1.18.1" + } +} diff --git a/hackclub-spotify-bot/src/TODO.md b/hackclub-spotify-bot/src/TODO.md new file mode 100644 index 0000000..0a84465 --- /dev/null +++ b/hackclub-spotify-bot/src/TODO.md @@ -0,0 +1,15 @@ +- [ ] Slack stuff +- - [ ] web api [docs](https://tools.slack.dev/node-slack-sdk/web-api/) +- - [ ] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth) +- - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B) +- - - [ ] Add ping for new-song event & send message ovs +- [ ] Spotify +- - [ ] web api [docs](https://developer.spotify.com/documentation/web-api/) +- - [ ] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/) +- - [ ] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token) +- - [ ] playlist tools (creation,modifcation,deletion) +- [ ] keydb (quick db or smthing) +- [ ] express +- [ ] transparency of added songs +- - [ ] export db -> into csv with properties (slack_id, slack_name, spotify_id, spotify_url) + diff --git a/hackclub-spotify-bot/src/index.js b/hackclub-spotify-bot/src/index.js new file mode 100644 index 0000000..ce9cfc7 --- /dev/null +++ b/hackclub-spotify-bot/src/index.js @@ -0,0 +1,40 @@ +require('dotenv').config(); +const express = require('express'); +const session = require('express-session'); +const { WebClient } = require('@slack/web-api'); +const { Client } = require('@slack/oauth'); +const { getLoginUrl, refreshToken } = require('./spotify'); +const path = require('path'); + +const app = express(); +// Initialize +const web = new WebClient(process.env.SLACK_TOKEN); +const oauth = new Client({ + clientId: process.env.SLACK_CLIENT_ID, + clientSecret: process.env.SLACK_CLIENT_SECRET, + state: Math.random().toString(36).substring(2), +}); +app.use(express.json()); +app.use(express.static(path.join(__dirname, 'public'))); +app.set('view engine', 'ejs'); +app.set('views', 'src/views'); +app.use(express.urlencoded({ extended: true })); +app.use(session({ + secret: Math.random().toString(36).substring(2), + resave: false, + saveUninitialized: true, + cookie: { secure: true } +})); + +app.get('/', (req, res) => { +res.render('index', { title: 'Hack Club Spotify Bot', description: "Contribute to the hackclub spotify playlist!" }); +}); +app.get('/login', async (req, res) => { + if(req.session.token) { + + } +}) + +app.listen(process.env.PORT || 3000, () => { + console.log('Example app listening on port 3000!'); +}); \ No newline at end of file diff --git a/hackclub-spotify-bot/src/public/hackclub.css b/hackclub-spotify-bot/src/public/hackclub.css new file mode 100644 index 0000000..1816be0 --- /dev/null +++ b/hackclub-spotify-bot/src/public/hackclub.css @@ -0,0 +1,589 @@ +/* modified version of https://css.hackclub.com/theme.css */ +:root { + /* why are the css vars swapped with incorrect names? well im to lazy to fix it. */ + --darker: #121217; + --dark: #f9fafc; + --darkless: #e0e6ed; + --black: #fff; + --steel: #273444; + --slate: #3c4858; + --muted: #8492a6; + --smoke: #252429; + --snow: #17171d; + --white: #1f2d3d; + --red: #ec3750; + --orange: #ff8c37; + --yellow: #f1c40f; + --green: #33d6a6; + --cyan: #5bc0de; + --blue: #338eda; + --purple: #a633d6; + --text: var(--black); + --background: var(--white); + --elevated: var(--white); + --sheet: var(--snow); + --sunken: var(--smoke); + --border: var(--smoke); + --primary: #ec3750; + --secondary: #8492a6; + --accent: #5bc0de; + --twitter: #1da1f2; + --facebook: #3b5998; + --instagram: #e1306c; + --breakpoint-xs: 32em; + --breakpoint-s: 48em; + --breakpoint-m: 64em; + --breakpoint-l: 96em; + --breakpoint-xl: 128em; + --spacing-0: 0px; + --spacing-1: 4px; + --spacing-2: 8px; + --spacing-3: 16px; + --spacing-4: 32px; + --spacing-5: 64px; + --spacing-6: 128px; + --spacing-7: 256px; + --spacing-8: 512px; + --font-1: 12px; + --font-2: 16px; + --font-3: 20px; + --font-4: 24px; + --font-5: 32px; + --font-6: 48px; + --font-7: 64px; + --font-8: 96px; + --font-9: 128px; + --font-10: 160px; + --font-11: 192px; + --line-height-limit: 0.875; + --line-height-title: 1; + --line-height-heading: 1.125; + --line-height-subheading: 1.25; + --line-height-caption: 1.375; + --line-height-body: 1.5; + --font-weight-body: 400; + --font-weight-bold: 700; + --font-weight-heading: var(--font-weight-bold); + --letter-spacing-title: -0.009em; + --letter-spacing-headline: 0.009em; + --size-wide-plus: 2048px; + --size-wide: 1536px; + --size-layout-plus: 1200px; + --size-layout: 1024px; + --size-copy-ultra: 980px; + --size-copy-plus: 768px; + --size-copy: 680px; + --size-narrow-plus: 600px; + --size-narrow: 512px; + --radii-small: 4px; + --radii-default: 8px; + --radii-extra: 12px; + --radii-ultra: 16px; + --radii-circle: 99999px; + --shadow-text: 0 1px 2px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.125); + --shadow-small: 0 1px 2px rgba(0, 0, 0, 0.0625), + 0 2px 4px rgba(0, 0, 0, 0.0625); + --shadow-card: 0 4px 8px rgba(0, 0, 0, 0.125); + --shadow-elevated: 0 1px 2px rgba(0, 0, 0, 0.0625), + 0 8px 12px rgba(0, 0, 0, 0.125); + } + + body { + font-family: "Phantom Sans", system-ui, -apple-system, BlinkMacSystemFont, + "Segoe UI", Roboto, sans-serif; + line-height: var(--line-height-body); + font-weight: var(--font-weight-body); + margin: 0; + min-height: 100vh; + text-rendering: optimizeLegibility; + font-smooth: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + color: var(--text); + background-color: var(--background); + box-sizing: border-box; + } + + * { + box-sizing: border-box; + } + + .monospace { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; + } + + .heading { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + .ultratitle { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-limit); + letter-spacing: var(--letter-spacing-title); + } + + .title { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-title); + letter-spacing: var(--letter-spacing-title); + } + + .subtitle { + margin-top: var(--spacing-3); + font-weight: var(--font-weight-body); + line-height: var(--line-height-subheading); + letter-spacing: var(--letter-spacing-headline); + } + + .headline { + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); + font-size: var(--font-4); + line-height: var(--line-height-heading); + letter-spacing: var(--letter-spacing-headline); + } + + .subheadline { + margin-top: var(--spacing-0); + margin-bottom: var(--spacing-3); + font-size: var(--font-2); + line-height: var(--line-height-heading); + letter-spacing: var(--letter-spacing-headline); + } + + .eyebrow { + color: var(--muted); + font-weight: var(--font-weight-heading); + letter-spacing: var(--letter-spacing-headline); + line-height: var(--line-height-subheading); + text-transform: uppercase; + margin-top: var(--spacing-0); + margin-bottom: var(--spacing-2); + } + + .lead { + font-weight: var(--font-weight-body); + } + + .caption { + color: var(--muted); + font-weight: var(--font-weight-body); + letter-spacing: var(--letter-spacing-headline); + line-height: var(--line-height-caption); + } + + .pill { + border-radius: var(--radii-circle); + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); + padding-top: var(--spacing-1); + padding-bottom: var(--spacing-1); + font-size: var(--font-2); + background: var(--primary); + color: var(--background); + font-weight: var(--font-weight-bold); + } + + .outline-badge { + border-radius: var(--radii-circle); + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); + padding-top: var(--spacing-1); + padding-bottom: var(--spacing-1); + font-size: var(--font-2); + background: none; + color: var(--muted); + border: 1px solid currentcolor; + font-weight: var(--font-weight-body); + } + + button { + cursor: pointer; + font-family: inherit; + font-weight: var(--font-weight-bold); + border-radius: var(--radii-circle); + display: inline-flex; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-card); + letter-spacing: var(--letter-spacing-headline); + -webkit-tap-highlight-color: transparent; + transition: transform 0.125s ease-in-out, box-shadow 0.125s ease-in-out; + box-sizing: border-box; + margin: 0; + min-width: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + line-height: inherit; + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + padding-bottom: 8px; + color: var(--theme-ui-colors-white, #ffffff); + background-color: var(--theme-ui-colors-primary, #ec3750); + border: 0; + font-size: var(--font-2); + } + + button:focus, + button:hover { + box-shadow: var(--shadow-elevated); + transform: scale(1.0625); + } + + button.lg { + font-size: var(--font-3)!important; + line-height: var(--line-height-title); + padding-left: var(--spacing-4); + padding-right: var(--spacing-4); + padding-top: var(--spacing-3); + padding-bottom: var(--spacing-3); + } + + button.outline { + background: none; + color: var(--primary); + border: 2px solid currentcolor; + } + + button.cta { + font-size: var(--font-2); + background-image: radial-gradient( + ellipse farthest-corner at top left, + var(--orange), + var(--red) + ); + } + + .card { + background: var(--elevated); + color: var(--text); + border-radius: var(--radii-extra); + box-shadow: var(--shadow-card); + overflow: hidden; + } + + .card.sunken { + background: var(--sunken); + box-shadow: none; + } + + .card.interactive { + text-decoration: none; + -webkit-tap-highlight-color: transparent; + transition: transform 0.125s ease-in-out, box-shadow 0.125s ease-in-out; + } + + .card.interactive:hover, + .card.interactive:focus { + transform: scale(1.0625); + box-shadow: var(--shadow-elevated); + } + + input, + textarea, + select { + background: var(--elevated); + color: var(--text); + font-family: inherit; + border-radius: var(--radii-small); + border: 0; + font-size: inherit; + padding: var(--spacing-2); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } + + input::-webkit-input-placeholder, + input::-moz-placeholder, + input:-ms-input-placeholder, + textarea::-webkit-input-placeholder, + textarea::-moz-placeholder, + textarea:-ms-input-placeholder, + select::-webkit-input-placeholder, + select::-moz-placeholder, + select:-ms-input-placeholder { + color: var(--muted); + } + + input[type="search"]::-webkit-search-decoration, + textarea[type="search"]::-webkit-search-decoration, + select[type="search"]::-webkit-search-decoration { + display: none; + } + + input[type="checkbox"] { + -webkit-appearance: checkbox; + -moz-appearance: checkbox; + appearance: checkbox; + } + + label { + color: var(--text); + display: flex; + flex-direction: column; + text-align: left; + line-height: var(--line-height-caption); + font-size: var(--font-3); + } + + label.horizontal { + display: flex; + } + + .slider { + color: var(--primary); + } + + .form-hidden { + position: absolute; + height: 1px; + width: 1px; + clip: rect(1px, 1px, 1px, 1px); + white-space: nowrap; + } + + .container { + width: 100%; + margin: auto; + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); + } + + h1 { + font-size: var(--font-5); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h2 { + font-size: var(--font-4); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h3 { + font-size: var(--font-3); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h4 { + font-size: var(--font-2); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h5 { + font-size: var(--font-1); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h6 { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + p { + color: var(--text); + font-weight: var(--font-weight-body); + line-height: var(--line-height-body); + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); + } + + img { + max-width: 100%; + } + + hr { + border: 0; + border-bottom: 1px solid var(--border); + } + + a { + color: var(--primary); + text-decoration: underline; + text-underline-position: under; + } + + a:focus, + a:hover { + text-decoration-style: wavy; + text-decoration-skip-ink: none; + } + + pre { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; + font-size: var(--font-1); + padding: var(--spacing-3); + color: var(--text); + background: var(--sunken); + overflow: auto; + border-radius: var(--radii-default); + white-space: inherit; + } + + pre > code { + color: inherit; + margin-left: 0; + margin-right: 0; + padding-left: 0; + padding-right: 0; + } + + code { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; + font-size: inherit; + color: var(--purple); + background: var(--sunken); + overflow: auto; + border-radius: var(--radii-small); + margin-left: var(--spacing-1); + margin-right: var(--spacing-1); + padding-left: var(--spacing-1); + padding-right: var(--spacing-1); + } + + p > code, + li > code { + color: var(--blue); + font-size: 0.875em; + } + + p > a > code, + li > a > code { + color: var(--blue); + font-size: 0.875em; + } + + li { + margin-top: var(--spacing-2); + margin-bottom: var(--spacing-2); + } + + table { + width: 100%; + margin-top: var(--spacing-4); + margin-bottom: var(--spacing-4); + border-collapse: separate; + border-spacing: 0; + } + + table > th, + table > td { + text-align: left; + padding: 4px; + padding-left: 0px; + border-color: var(--border); + border-bottom-style: solid; + } + + th { + vertical-align: bottom; + border-bottom-width: 2px; + } + + td { + vertical-align: top; + border-bottom-width: 1px; + } + + + @media screen and (min-width: 32em) { + .ultratitle { + font-size: var(--font-5); + } + .title { + font-size: var(--font-4); + } + .subtitle { + font-size: var(--font-2); + } + .eyebrow { + font-size: var(--font-3); + } + .lead { + font-size: var(--font-2); + margin-top: var(--spacing-2); + margin-bottom: var(--spacing-2); + } + .card { + padding: var(--spacing-3); + } + .container { + max-width: var(--size-layout); + } + .container.copy { + max-width: var(--size-copy); + } + .container.narrow { + max-width: var(--size-narrow); + } + } + + @media screen and (min-width: 48em) { + .ultratitle { + font-size: var(--font-6); + } + .title { + font-size: var(--font-5); + } + .subtitle { + font-size: var(--font-3); + } + .eyebrow { + font-size: var(--font-4); + } + .lead { + font-size: var(--font-3); + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); + } + .card { + padding: var(--spacing-4); + } + } + + @media screen and (min-width: 64em) { + .ultratitle { + font-size: var(--font-7); + } + .title { + font-size: var(--font-6); + } + .container { + max-width: var(--size-layout-plus); + } + .container.wide { + max-width: var(--size-wide); + } + .container.copy { + max-width: var(--size-copy-plus); + } + .container.narrow { + max-width: var(--size-narrow-plus); + } + } + \ No newline at end of file diff --git a/hackclub-spotify-bot/src/spotify.js b/hackclub-spotify-bot/src/spotify.js new file mode 100644 index 0000000..4caa082 --- /dev/null +++ b/hackclub-spotify-bot/src/spotify.js @@ -0,0 +1,113 @@ + +let token = null; +let authStuff = null; +const client_id = process.env.SPOTIFY_CLIENT_ID; +const client_secret = process.env.SPOTIFY_CLIENT_SECRET; +const redirect_uri = process.env.SPOTIFY_REDIRECT_URI; +async function fetchWebApi(endpoint, method, body) { + const res = await fetch(`https://api.spotify.com/${endpoint}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + method, + body: JSON.stringify(body), + }); + const text = await res.text(); + // console.debug(text) + // abs nothing is wrong + return JSON.parse(text.trim()); + } + + function getLoginUrl() { + const state = generateRandomString(16); + const scope = [ + "ugc-image-upload", + "user-read-playback-state", + "user-modify-playback-state", + "user-read-currently-playing", + "app-remote-control", + "streaming", + "playlist-read-private", + "playlist-read-collaborative", + "playlist-modify-private", + "playlist-modify-public", + "user-follow-modify", + "user-follow-read", + "user-read-playback-position", + "user-top-read", + "user-read-recently-played", + "user-library-modify", + "user-library-read", + "user-read-email", + "user-read-private", + ].join(" "); + + return ( + "https://accounts.spotify.com/authorize?" + + `response_type=code&grant_type=client_credentials&client_id=${client_id}&scope=${scope}&redirect_uri=${redirect_uri}&state=${state}` + ); + } + + function generateRandomString(length) { + let result = ""; + const characters = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const charactersLength = characters.length; + let counter = 0; + while (counter < length) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + counter += 1; + } + return result; + } + async function refreshToken(refresh_token) { + try { + // var refresh_token = req.query.refresh_token; + const authOptions = { + url: "https://accounts.spotify.com/api/token", + headers: { + "content-type": "application/x-www-form-urlencoded", + Authorization: + "Basic " + + new Buffer.from(client_id + ":" + client_secret).toString("base64"), + }, + form: { + grant_type: "refresh_token", + refresh_token: refresh_token, + }, + json: true, + }; + console.log(authOptions); + const formdm = new URLSearchParams(); + + formdm.append("grant_type", "refresh_token"); + formdm.append("refresh_token", refresh_token); + + fetch(authOptions.url, { + body: formdm, + headers: authOptions.headers, + method: "POST", + }) + .then(async (r) => { + const text = await r.text(); + console.log(text); + return JSON.parse(text); + }) + .then((auth) => { + if (!auth.refresh_token) auth.refresh_token = refresh_token; + console.log(auth); + authStuff = auth; + token = auth.access_token; + if (auth.expires_in) { + setTimeout(() => { + refreshToken(auth.refresh_token); + }, auth.expires_in * 1000); + } + }); + } catch (e) { + console.error(`Welp it broke`); + // try again asap because we NEED THAT TOKEN + refreshToken(refresh_token); + } + } + \ No newline at end of file diff --git a/hackclub-spotify-bot/src/views/index.ejs b/hackclub-spotify-bot/src/views/index.ejs new file mode 100644 index 0000000..50d229e --- /dev/null +++ b/hackclub-spotify-bot/src/views/index.ejs @@ -0,0 +1,37 @@ + + + + + + <%= title %> + + + + + + + + + +
+
+
+

Hackclub spotify bot

+ +
+
+
+ +

+ This is a bot which will contribute to the spotify playlist which is for the hackclub community! +
+ Note: WIP +

+
+ +
+
+ + \ No newline at end of file diff --git a/hackclub-spotify-bot/yarn.lock b/hackclub-spotify-bot/yarn.lock new file mode 100644 index 0000000..88260d2 --- /dev/null +++ b/hackclub-spotify-bot/yarn.lock @@ -0,0 +1,870 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@slack/logger@^4", "@slack/logger@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@slack/logger/-/logger-4.0.0.tgz#788303ff1840be91bdad7711ef66ca0cbc7073d2" + integrity sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA== + dependencies: + "@types/node" ">=18.0.0" + +"@slack/oauth@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@slack/oauth/-/oauth-3.0.1.tgz#079cde13f998be2d458c20dfcae288067464536e" + integrity sha512-TuR9PI6bYKX6qHC7FQI4keMnhj45TNfSNQtTU3mtnHUX4XLM2dYLvRkUNADyiLTle2qu2rsOQtCIsZJw6H0sDA== + dependencies: + "@slack/logger" "^4" + "@slack/web-api" "^7.3.4" + "@types/jsonwebtoken" "^9" + "@types/node" ">=18" + jsonwebtoken "^9" + lodash.isstring "^4" + +"@slack/types@^2.9.0": + version "2.14.0" + resolved "https://registry.yarnpkg.com/@slack/types/-/types-2.14.0.tgz#913946b4bcb635dad1d39ceca73699215c38cf6f" + integrity sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA== + +"@slack/web-api@^7.3.4", "@slack/web-api@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-7.6.0.tgz#7bfa2e0da4fce934715b54e47305fd02e722c0aa" + integrity sha512-1u9JnP12RPk8ChF8RXKKoVtlox9HlZXhf+6lvvRORKxRd4+8ZQ41KskhPO6WiD0Q+wE6k/M6U627BXzVzBcVNA== + dependencies: + "@slack/logger" "^4.0.0" + "@slack/types" "^2.9.0" + "@types/node" ">=18.0.0" + "@types/retry" "0.12.0" + axios "^1.7.4" + eventemitter3 "^5.0.1" + form-data "^4.0.0" + is-electron "2.2.2" + is-stream "^2" + p-queue "^6" + p-retry "^4" + retry "^0.13.1" + +"@types/jsonwebtoken@^9": + version "9.0.7" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz#e49b96c2b29356ed462e9708fc73b833014727d2" + integrity sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=18", "@types/node@>=18.0.0": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.7.4: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie-signature@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== + +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + +cookie@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +express-session@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.18.1.tgz#88d0bbd41878882840f24ec6227493fcb167e8d5" + integrity sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA== + dependencies: + cookie "0.7.2" + cookie-signature "1.0.7" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.1" + uid-safe "~2.1.5" + +express@^4.21.1: + version "4.21.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" + integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-electron@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== + +is-stream@^2: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jsonwebtoken@^9: + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4, lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-queue@^6: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@^4: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +safe-buffer@5.2.1, safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== From fc0dc7cf16587047e1e1c4c1ec0bae8013798d0d Mon Sep 17 00:00:00 2001 From: Saahil Date: Fri, 11 Oct 2024 19:27:28 +0000 Subject: [PATCH 08/37] update: .env stuff --- hackclub-spotify-bot/src/.env.example | 6 +++ hackclub-spotify-bot/src/index.js | 59 +++++++++++++++------------ 2 files changed, 38 insertions(+), 27 deletions(-) create mode 100644 hackclub-spotify-bot/src/.env.example diff --git a/hackclub-spotify-bot/src/.env.example b/hackclub-spotify-bot/src/.env.example new file mode 100644 index 0000000..0b5bff2 --- /dev/null +++ b/hackclub-spotify-bot/src/.env.example @@ -0,0 +1,6 @@ +SLACK_CLIENT_ID= +SLACK_CLIENT_SECRET= +SLACK_TOKEN= +SPOTIFY_CLIENT_ID= +SPOTIFY_CLIENT_SECRET= +SPOTIFY_REDIRECT_URI= \ No newline at end of file diff --git a/hackclub-spotify-bot/src/index.js b/hackclub-spotify-bot/src/index.js index ce9cfc7..3d732ad 100644 --- a/hackclub-spotify-bot/src/index.js +++ b/hackclub-spotify-bot/src/index.js @@ -1,40 +1,45 @@ -require('dotenv').config(); -const express = require('express'); -const session = require('express-session'); -const { WebClient } = require('@slack/web-api'); -const { Client } = require('@slack/oauth'); -const { getLoginUrl, refreshToken } = require('./spotify'); -const path = require('path'); +const path = require("path"); +require("dotenv").config({ path: path.join(__dirname, ".env") }); +console.debug(process.env); +const express = require("express"); +const session = require("express-session"); +const { WebClient } = require("@slack/web-api"); +const { InstallProvider } = require("@slack/oauth"); +const { getLoginUrl, refreshToken } = require("./spotify"); const app = express(); // Initialize const web = new WebClient(process.env.SLACK_TOKEN); -const oauth = new Client({ +const oauth = new InstallProvider({ clientId: process.env.SLACK_CLIENT_ID, clientSecret: process.env.SLACK_CLIENT_SECRET, - state: Math.random().toString(36).substring(2), + stateSecret: Math.random().toString(36).substring(2), }); app.use(express.json()); -app.use(express.static(path.join(__dirname, 'public'))); -app.set('view engine', 'ejs'); -app.set('views', 'src/views'); +app.use(express.static(path.join(__dirname, "public"))); +app.set("view engine", "ejs"); +app.set("views", "src/views"); app.use(express.urlencoded({ extended: true })); -app.use(session({ - secret: Math.random().toString(36).substring(2), - resave: false, - saveUninitialized: true, - cookie: { secure: true } -})); +app.use( + session({ + secret: Math.random().toString(36).substring(2), + resave: false, + saveUninitialized: true, + cookie: { secure: true }, + }) +); -app.get('/', (req, res) => { -res.render('index', { title: 'Hack Club Spotify Bot', description: "Contribute to the hackclub spotify playlist!" }); +app.get("/", (req, res) => { + res.render("index", { + title: "Hack Club Spotify Bot", + description: "Contribute to the hackclub spotify playlist!", + }); +}); +app.get("/login", async (req, res) => { + if (req.session.token) { + } }); -app.get('/login', async (req, res) => { - if(req.session.token) { - - } -}) app.listen(process.env.PORT || 3000, () => { - console.log('Example app listening on port 3000!'); -}); \ No newline at end of file + console.log("Example app listening on port 3000!"); +}); From 0b6212d2403c9bc9500a39013b9008165817e75e Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 19:27:38 +0000 Subject: [PATCH 09/37] enhancement(lint): Fix lint errors for hackclub-spotify-bot/src/index.js Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- hackclub-spotify-bot/src/index.js | 90 +++++++++++++++---------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/hackclub-spotify-bot/src/index.js b/hackclub-spotify-bot/src/index.js index 3d732ad..81b86bd 100644 --- a/hackclub-spotify-bot/src/index.js +++ b/hackclub-spotify-bot/src/index.js @@ -1,45 +1,45 @@ -const path = require("path"); -require("dotenv").config({ path: path.join(__dirname, ".env") }); -console.debug(process.env); -const express = require("express"); -const session = require("express-session"); -const { WebClient } = require("@slack/web-api"); -const { InstallProvider } = require("@slack/oauth"); -const { getLoginUrl, refreshToken } = require("./spotify"); - -const app = express(); -// Initialize -const web = new WebClient(process.env.SLACK_TOKEN); -const oauth = new InstallProvider({ - clientId: process.env.SLACK_CLIENT_ID, - clientSecret: process.env.SLACK_CLIENT_SECRET, - stateSecret: Math.random().toString(36).substring(2), -}); -app.use(express.json()); -app.use(express.static(path.join(__dirname, "public"))); -app.set("view engine", "ejs"); -app.set("views", "src/views"); -app.use(express.urlencoded({ extended: true })); -app.use( - session({ - secret: Math.random().toString(36).substring(2), - resave: false, - saveUninitialized: true, - cookie: { secure: true }, - }) -); - -app.get("/", (req, res) => { - res.render("index", { - title: "Hack Club Spotify Bot", - description: "Contribute to the hackclub spotify playlist!", - }); -}); -app.get("/login", async (req, res) => { - if (req.session.token) { - } -}); - -app.listen(process.env.PORT || 3000, () => { - console.log("Example app listening on port 3000!"); -}); +const path = require("path"); +require("dotenv").config({ path: path.join(__dirname, ".env") }); +console.debug(process.env); +const express = require("express"); +const session = require("express-session"); +const { WebClient } = require("@slack/web-api"); +const { InstallProvider } = require("@slack/oauth"); +const { getLoginUrl, refreshToken } = require("./spotify"); + +const app = express(); +// Initialize +const web = new WebClient(process.env.SLACK_TOKEN); +const oauth = new InstallProvider({ + clientId: process.env.SLACK_CLIENT_ID, + clientSecret: process.env.SLACK_CLIENT_SECRET, + stateSecret: Math.random().toString(36).substring(2), +}); +app.use(express.json()); +app.use(express.static(path.join(__dirname, "public"))); +app.set("view engine", "ejs"); +app.set("views", "src/views"); +app.use(express.urlencoded({ extended: true })); +app.use( + session({ + secret: Math.random().toString(36).substring(2), + resave: false, + saveUninitialized: true, + cookie: { secure: true }, + }), +); + +app.get("/", (req, res) => { + res.render("index", { + title: "Hack Club Spotify Bot", + description: "Contribute to the hackclub spotify playlist!", + }); +}); +app.get("/login", async (req, res) => { + if (req.session.token) { + } +}); + +app.listen(process.env.PORT || 3000, () => { + console.log("Example app listening on port 3000!"); +}); From 8fb5236dc7ee099293755960009b68bfd545cedf Mon Sep 17 00:00:00 2001 From: Saahil Date: Fri, 11 Oct 2024 19:27:52 +0000 Subject: [PATCH 10/37] update: .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c17c45f..14bac7d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,6 @@ sent # all sent mail is there .cache/* .env .env.* +!.env.example .uptime-url main.cron From 3f409706fca4eade8cb4c8364b31c2ce734fb3fb Mon Sep 17 00:00:00 2001 From: Saahil Date: Sat, 12 Oct 2024 18:01:09 -0400 Subject: [PATCH 12/37] feat(batch): almost done zeon:ai_comment --- hackclub-spotify-bot/{src => }/.env.example | 3 +- hackclub-spotify-bot/.gitignore | 3 +- hackclub-spotify-bot/TODO.md | 16 + hackclub-spotify-bot/package.json | 10 +- hackclub-spotify-bot/src/TODO.md | 15 - hackclub-spotify-bot/src/index.js | 201 +++++- hackclub-spotify-bot/src/public/hackclub.css | 36 + hackclub-spotify-bot/src/spotify.js | 117 +++- hackclub-spotify-bot/src/views/home.ejs | 62 ++ hackclub-spotify-bot/src/views/index.ejs | 2 +- hackclub-spotify-bot/yarn.lock | 669 ++++++++++++++++++- 11 files changed, 1073 insertions(+), 61 deletions(-) rename hackclub-spotify-bot/{src => }/.env.example (69%) create mode 100644 hackclub-spotify-bot/TODO.md delete mode 100644 hackclub-spotify-bot/src/TODO.md create mode 100644 hackclub-spotify-bot/src/views/home.ejs diff --git a/hackclub-spotify-bot/src/.env.example b/hackclub-spotify-bot/.env.example similarity index 69% rename from hackclub-spotify-bot/src/.env.example rename to hackclub-spotify-bot/.env.example index 0b5bff2..7395f7d 100644 --- a/hackclub-spotify-bot/src/.env.example +++ b/hackclub-spotify-bot/.env.example @@ -3,4 +3,5 @@ SLACK_CLIENT_SECRET= SLACK_TOKEN= SPOTIFY_CLIENT_ID= SPOTIFY_CLIENT_SECRET= -SPOTIFY_REDIRECT_URI= \ No newline at end of file +SPOTIFY_REDIRECT_URI= +SLACK_REDIRECT_URI= \ No newline at end of file diff --git a/hackclub-spotify-bot/.gitignore b/hackclub-spotify-bot/.gitignore index 1be5c96..81e7c07 100644 --- a/hackclub-spotify-bot/.gitignore +++ b/hackclub-spotify-bot/.gitignore @@ -1,3 +1,4 @@ node_modules .env -db.json \ No newline at end of file +db.json +data/* \ No newline at end of file diff --git a/hackclub-spotify-bot/TODO.md b/hackclub-spotify-bot/TODO.md new file mode 100644 index 0000000..0ca49b5 --- /dev/null +++ b/hackclub-spotify-bot/TODO.md @@ -0,0 +1,16 @@ +- [ ] Slack stuff +- - ~~[ ] web api [docs](https://tools.slack.dev/node-slack-sdk/web-api/)~~ +- - [x] send messages thru zeon https://github.com/NeonGamerBot-QK/slack-zeon/blob/092d324c7c58d37e2165ecf0a6798a983c75e7d2/src/modules/slackapp.ts#L19-L53 +- - [x] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth) +- - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B) +- - - [x] Add ping for new-song event & send message ovs +- [ ] Spotify +- - [x] web api [docs](https://developer.spotify.com/documentation/web-api/) +- - [x] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/) +- - [x] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token) +- - [x] playlist tools (creation,modifcation,deletion) +- [x] keydb (quick db or smthing) +- [x] express +- [ ] transparency of added songs +- - [ ] export db -> into csv with properties (slack_id, url, added_at) + diff --git a/hackclub-spotify-bot/package.json b/hackclub-spotify-bot/package.json index a62b1c4..88833ad 100644 --- a/hackclub-spotify-bot/package.json +++ b/hackclub-spotify-bot/package.json @@ -8,10 +8,16 @@ }, "dependencies": { "@slack/oauth": "^3.0.1", - "@slack/web-api": "^7.6.0", + "better-sqlite3": "^11.3.0", "dotenv": "^16.4.5", "ejs": "^3.1.10", "express": "^4.21.1", - "express-session": "^1.18.1" + "express-session": "^1.18.1", + "quick.db": "^9.1.7", + "session-file-store": "^1.5.0", + "spotify-uri": "^4.1.0" + }, + "devDependencies": { + "express-status-monitor": "^1.3.4" } } diff --git a/hackclub-spotify-bot/src/TODO.md b/hackclub-spotify-bot/src/TODO.md deleted file mode 100644 index 0a84465..0000000 --- a/hackclub-spotify-bot/src/TODO.md +++ /dev/null @@ -1,15 +0,0 @@ -- [ ] Slack stuff -- - [ ] web api [docs](https://tools.slack.dev/node-slack-sdk/web-api/) -- - [ ] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth) -- - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B) -- - - [ ] Add ping for new-song event & send message ovs -- [ ] Spotify -- - [ ] web api [docs](https://developer.spotify.com/documentation/web-api/) -- - [ ] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/) -- - [ ] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token) -- - [ ] playlist tools (creation,modifcation,deletion) -- [ ] keydb (quick db or smthing) -- [ ] express -- [ ] transparency of added songs -- - [ ] export db -> into csv with properties (slack_id, slack_name, spotify_id, spotify_url) - diff --git a/hackclub-spotify-bot/src/index.js b/hackclub-spotify-bot/src/index.js index 81b86bd..72aa141 100644 --- a/hackclub-spotify-bot/src/index.js +++ b/hackclub-spotify-bot/src/index.js @@ -1,19 +1,48 @@ const path = require("path"); -require("dotenv").config({ path: path.join(__dirname, ".env") }); -console.debug(process.env); +require("dotenv").config(); const express = require("express"); const session = require("express-session"); -const { WebClient } = require("@slack/web-api"); -const { InstallProvider } = require("@slack/oauth"); -const { getLoginUrl, refreshToken } = require("./spotify"); +const FileStore = require('session-file-store')(session); +const { InstallProvider, FileInstallationStore } = require("@slack/oauth"); +const { getLoginUrl, refreshToken, getCredentials, saveCredentials, spotifyRoutes, addSongToPlaylist } = require("./spotify"); +const { QuickDB } = require("quick.db"); +const db = new QuickDB({ + filePath: "./data/songs.sqlite", +}); +let cacheDb = {}; const app = express(); +const userScopes = ['identity.avatar', 'identity.basic', 'identity.team'] // Initialize -const web = new WebClient(process.env.SLACK_TOKEN); const oauth = new InstallProvider({ clientId: process.env.SLACK_CLIENT_ID, clientSecret: process.env.SLACK_CLIENT_SECRET, - stateSecret: Math.random().toString(36).substring(2), + stateSecret: process.env.STATE_SECRET, + stateVerification: false, + stateStore: new FileInstallationStore(path.join(__dirname, '../data/states.json')), + installationStore: new FileInstallationStore(path.join(__dirname, '../data/installations.json')), + // installationStore: { + + //} + stateStore: { + generateStateParam: (installUrlOptions, date) => { + // generate a random string to use as state in the URL + const randomState = process.env.STATE_SECRET + Math.random().toString(36).substring(7); + // save installOptions to cache/db + cacheDb[randomState] = installUrlOptions; + // myDB.set(randomState, installUrlOptions); + // return a state string that references saved options in DB + return randomState; + }, + // verifyStateParam's first argument is a date object and the second argument is a string representing the state + // verifyStateParam is expected to return an object representing installUrlOptions + verifyStateParam: (date, state) => { + return cacheDb[state]; + // fetch saved installOptions from DB using state reference + const installUrlOptions = myDB.get(randomState); + return installUrlOptions; + }, + } }); app.use(express.json()); app.use(express.static(path.join(__dirname, "public"))); @@ -22,24 +51,164 @@ app.set("views", "src/views"); app.use(express.urlencoded({ extended: true })); app.use( session({ - secret: Math.random().toString(36).substring(2), - resave: false, + secret: process.env.STATE_SECRET, + resave: true, + store: new FileStore({ + path: path.join(__dirname, '../data/sessions'), + }), saveUninitialized: true, - cookie: { secure: true }, + cookie: { secure: "auto", maxAge: 1000 * 60 * 60 * 24 * 365 }, + }), ); +try { + const statusMonitor = require('express-status-monitor')({ + healthChecks: [{ + protocol: 'http', + host: 'localhost', + port: 3000, + path: '/', + timeout: 1000, + interval: 1000, + }] + }); +app.use(statusMonitor); +app.use((req,res,next) => { +// console.debug([req.headers, req.session]) + next() +}) +} catch (e) { + // we can ignore since this is an optional dependency +} + +app.get("/login", async (req, res) => { + if (req.session.token) { + res.redirect("/home"); + } else { + res.redirect(await oauth.generateInstallUrl({ + // Add the scopes your app needs + redirectUri: process.env.SLACK_REDIRECT_URI, + scopes: [], + + userScopes: userScopes + })) + } +}); +app.get('/slack/callback', (req, res) => { + // console.debug(req.headers, req.url) + oauth.handleCallback(req, res, { + success: async (install) => { + // typings + // user: { token:string , scopes: string[], id: string} + // console.log(install) + req.session.info = install + req.session.token = install.user.token +res.redirect('/home') + }, + failure: (err) => { + console.log(err); + res.send("Failed to install!, please contact neon in the slack!, \n" + err.stack); + }, + + }); +}); +app.get('/logout', (req,res) => { + req.session.destroy(); + res.redirect('/'); +}) app.get("/", (req, res) => { res.render("index", { title: "Hack Club Spotify Bot", description: "Contribute to the hackclub spotify playlist!", }); }); -app.get("/login", async (req, res) => { - if (req.session.token) { - } -}); +const errorStrings = [ + "Invalid CSRF Token!", // token = csrf token + "Song is not a track! (or not even a spotify song url)", + "Song already exists in the database! (its in the playlist or banned from the playlist)", +] +app.get('/home', async (req,res) => { + if(!req.session.info) return res.redirect('/login'); + let onetimetoken = Math.random().toString(36).substring(7); + cacheDb[onetimetoken] = true; + res.render("home", { + title: "Hack Club Spotify Bot", + description: "Contribute to the hackclub spotify playlist!", + userinfo: req.session.info, + onetimetoken, + error: errorStrings[req.query.error], + s: req.query.s + }); +}) +app.post('/spotify/submitsong', async (req,res) => { + if(!req.session.token) return res.redirect('/login'); +if(!cacheDb[req.query.token]) return res.redirect(`/home?error=0`); +delete cacheDb[req.query.token]; -app.listen(process.env.PORT || 3000, () => { - console.log("Example app listening on port 3000!"); +const songurl = req.body.songurl; + +const songuriinfo = require('spotify-uri').parse(songurl); +if(songuriinfo.type !== "track") return res.redirect(`/home?error=1`); +const alreadyExists = await db.has(songuriinfo.id); +if(alreadyExists) return res.redirect(`/home?error=2`); +const formattedURI = require('spotify-uri').formatURI(songuriinfo) +await db.set(songuriinfo.id, { + song_url: songurl, + added_by: req.session.info.user.id, + added_at: Date.now() +}); +addSongToPlaylist(formattedURI); +fetch("https://slack.mybot.saahild.com/send-private", { + method: "POST", + body: JSON.stringify({ + channel: "C07RE4N7S4B", + text: `:new_spotify: New Song: ${songurl} - added by <@${req.session.info.user.id}>`, + }), + headers: { + Authorization: process.env.AUTH_FOR_ZEON, + "Content-Type": "application/json", + }, +}).then(r=>r.json()).then(d => { + fetch("https://slack.mybot.saahild.com/send-private", { + method: "POST", + body: JSON.stringify({ + channel: "C07RE4N7S4B", + thread_ts: d.ts, + text: `:thread: Responses about new song here please!`, + }), + headers: { + Authorization: process.env.AUTH_FOR_ZEON, + "Content-Type": "application/json", + }, + }) +}); +if(!process.env.TESTING) { + fetch("https://slack.mybot.saahild.com/send-private", { + method: "POST", + body: JSON.stringify({ + channel: "C07RE4N7S4B", + text: ``, + }), + headers: { + Authorization: process.env.AUTH_FOR_ZEON, + "Content-Type": "application/json", + }, + }) +} +res.redirect('/home?s=1') +}) +app.get('/spotify/link', async (req,res) => { + if(!req.session.info) return res.redirect('/login'); + if(req.session.info.user.id !== "U07L45W79E1" ) return res.status(401).end("unauthorized"); + res.redirect(getLoginUrl()) +}) + +spotifyRoutes(app); + +app.listen(process.env.PORT || 3000, async () => { + console.log("Example app listening on port 3000!"); + // if(!await db.has()) + if(getCredentials() !== null) refreshToken(getCredentials().refresh_token); + }); diff --git a/hackclub-spotify-bot/src/public/hackclub.css b/hackclub-spotify-bot/src/public/hackclub.css index 1816be0..fb4c884 100644 --- a/hackclub-spotify-bot/src/public/hackclub.css +++ b/hackclub-spotify-bot/src/public/hackclub.css @@ -237,7 +237,43 @@ box-shadow: var(--shadow-elevated); transform: scale(1.0625); } + .button { + cursor: pointer; + font-family: inherit; + font-weight: var(--font-weight-bold); + border-radius: var(--radii-circle); + display: inline-flex; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-card); + letter-spacing: var(--letter-spacing-headline); + -webkit-tap-highlight-color: transparent; + transition: transform 0.125s ease-in-out, box-shadow 0.125s ease-in-out; + box-sizing: border-box; + margin: 0; + min-width: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + line-height: inherit; + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + padding-bottom: 8px; + color: var(--theme-ui-colors-white, #ffffff); + background-color: var(--theme-ui-colors-primary, #ec3750); + border: 0; + font-size: var(--font-2); + } + .button:focus, + .button:hover { + box-shadow: var(--shadow-elevated); + transform: scale(1.0625); + } button.lg { font-size: var(--font-3)!important; line-height: var(--line-height-title); diff --git a/hackclub-spotify-bot/src/spotify.js b/hackclub-spotify-bot/src/spotify.js index 4caa082..7f8ceb1 100644 --- a/hackclub-spotify-bot/src/spotify.js +++ b/hackclub-spotify-bot/src/spotify.js @@ -21,24 +21,24 @@ async function fetchWebApi(endpoint, method, body) { function getLoginUrl() { const state = generateRandomString(16); const scope = [ - "ugc-image-upload", - "user-read-playback-state", - "user-modify-playback-state", - "user-read-currently-playing", - "app-remote-control", - "streaming", + // "ugc-image-upload", + // "user-read-playback-state", + // "user-modify-playback-state", + // "user-read-currently-playing", + // "app-remote-control", + // "streaming", "playlist-read-private", "playlist-read-collaborative", "playlist-modify-private", "playlist-modify-public", - "user-follow-modify", - "user-follow-read", - "user-read-playback-position", - "user-top-read", - "user-read-recently-played", + // "user-follow-modify", + // "user-follow-read", + // "user-read-playback-position", + // "user-top-read", + // "user-read-recently-played", "user-library-modify", - "user-library-read", - "user-read-email", + // "user-library-read", + // "user-read-email", "user-read-private", ].join(" "); @@ -77,7 +77,6 @@ async function fetchWebApi(endpoint, method, body) { }, json: true, }; - console.log(authOptions); const formdm = new URLSearchParams(); formdm.append("grant_type", "refresh_token"); @@ -90,14 +89,15 @@ async function fetchWebApi(endpoint, method, body) { }) .then(async (r) => { const text = await r.text(); - console.log(text); + // console.log(text); return JSON.parse(text); }) .then((auth) => { if (!auth.refresh_token) auth.refresh_token = refresh_token; - console.log(auth); + // console.log(auth); authStuff = auth; token = auth.access_token; + saveCredentials(auth); if (auth.expires_in) { setTimeout(() => { refreshToken(auth.refresh_token); @@ -110,4 +110,87 @@ async function fetchWebApi(endpoint, method, body) { refreshToken(refresh_token); } } - \ No newline at end of file +function saveCredentials(creds) { +require('fs').writeFileSync('data/credentials.json', JSON.stringify(creds, null, 2)); +} +function getCredentials() { + try { + return JSON.parse(require('fs').readFileSync('data/credentials.json', 'utf8')); + } catch (e) { + return null; + } + +} +function spotifyRoutes(app) { + app.get('/spotify/callback', async (req,res) => { + const code = req.query.code || null; + const state = req.query.state || null; + + if (state === null) { + res.redirect( + "/#" + + querystring.stringify({ + error: "state_mismatch", + }), + ); + } else { + const authOptions = { + url: "https://accounts.spotify.com/api/token", + form: { + code: code, + redirect_uri: redirect_uri, + grant_type: "authorization_code", + }, + headers: { + "content-type": "application/x-www-form-urlencoded", + Authorization: + "Basic " + + new Buffer.from(client_id + ":" + client_secret).toString("base64"), + }, + json: true, + }; + const formdm = new URLSearchParams(); + // Object.entries(authOptions.form).forEach(([key, value]) => { + // formdm.append(key, value); + // }) + formdm.append("code", code); + formdm.append("redirect_uri", redirect_uri); + formdm.append("grant_type", "authorization_code"); + + fetch(authOptions.url, { + body: formdm, + headers: authOptions.headers, + method: "POST", + }) + .then((r) => r.json()) + .then((auth) => { + // console.log(auth); + authStuff = auth; + saveCredentials(auth) + token = auth.access_token; + if (auth.expires_in) { + setTimeout(() => { + refreshToken(auth.refresh_token); + }, auth.expires_in * 1000); + } + res.status(200).end("Successfully logged in!"); + }) + } + }) +} +function addSongToPlaylist(url) { + fetchWebApi('v1/playlists/3gRv97fvllFFLVdCH6XzsE/tracks', 'POST', { + uris: [url], + position: 0, + }) +} + module.exports = { + getLoginUrl, + refreshToken, + saveCredentials, + getCredentials, + spotifyRoutes, + addSongToPlaylist + + // getToken + } diff --git a/hackclub-spotify-bot/src/views/home.ejs b/hackclub-spotify-bot/src/views/home.ejs new file mode 100644 index 0000000..e3d4601 --- /dev/null +++ b/hackclub-spotify-bot/src/views/home.ejs @@ -0,0 +1,62 @@ + + + + + + <%= title %> + + + + + + + + + +
+
+
+

Hackclub spotify

+ +
+
+
+

Submit Song

+ +
+ +
+ + +
+
+ + <% if (s) { %> +
+

Success!

+

Your song has been added to the playlist!

+
+
+ <% } %> +<% if (error) { %> +
+ <%= error %> +
+
+ <% } %> +
+ + +
+ +
+ +

+
+ + +
+ + \ No newline at end of file diff --git a/hackclub-spotify-bot/src/views/index.ejs b/hackclub-spotify-bot/src/views/index.ejs index 50d229e..39698a6 100644 --- a/hackclub-spotify-bot/src/views/index.ejs +++ b/hackclub-spotify-bot/src/views/index.ejs @@ -16,7 +16,7 @@

-

Hackclub spotify bot

+

Hackclub spotify

diff --git a/hackclub-spotify-bot/yarn.lock b/hackclub-spotify-bot/yarn.lock index 88260d2..903ab61 100644 --- a/hackclub-spotify-bot/yarn.lock +++ b/hackclub-spotify-bot/yarn.lock @@ -26,7 +26,7 @@ resolved "https://registry.yarnpkg.com/@slack/types/-/types-2.14.0.tgz#913946b4bcb635dad1d39ceca73699215c38cf6f" integrity sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA== -"@slack/web-api@^7.3.4", "@slack/web-api@^7.6.0": +"@slack/web-api@^7.3.4": version "7.6.0" resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-7.6.0.tgz#7bfa2e0da4fce934715b54e47305fd02e722c0aa" integrity sha512-1u9JnP12RPk8ChF8RXKKoVtlox9HlZXhf+6lvvRORKxRd4+8ZQ41KskhPO6WiD0Q+wE6k/M6U627BXzVzBcVNA== @@ -63,7 +63,7 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -71,6 +71,11 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA== + ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -83,6 +88,21 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" @@ -93,6 +113,13 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +axios@0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928" + integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== + dependencies: + follow-redirects "^1.14.8" + axios@^1.7.4: version "1.7.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" @@ -102,11 +129,70 @@ axios@^1.7.4: form-data "^4.0.0" proxy-from-env "^1.1.0" +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== + +bagpipe@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/bagpipe/-/bagpipe-0.3.5.tgz#e341d164fcb24cdf04ea7e05b765ec10c8aea6a1" + integrity sha512-42sAlmPDKes1nLm/aly+0VdaopSU9br+jkRELedhQxI5uXHgtk47I83Mpmf4zoNTRMASdLFtUkimlu/Z9zQ8+g== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +better-sqlite3@^11.3.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.3.0.tgz#f10b32ddff665c33176d148e707bd1e57dfd0284" + integrity sha512-iHt9j8NPYF3oKCNOO5ZI4JwThjt3Z6J6XrcwG85VNMVzv1ByqrHWv5VILEbCMFWDsoHhXvQ7oC8vgRXFAKgl9w== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.1.1" + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +bn.js@^4.0.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + body-parser@1.20.3: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" @@ -145,6 +231,14 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -169,6 +263,11 @@ chalk@^4.0.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -188,6 +287,26 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw== + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA== + +component-emitter@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -225,6 +344,11 @@ cookie@0.7.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -232,6 +356,32 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@4.1.1, debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -256,6 +406,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + dotenv@^16.4.5: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" @@ -290,6 +445,53 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.5.0: + version "3.5.4" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.4.tgz#5b40d7381772ba05c0881be5735a318424a07fc6" + integrity sha512-ydc8uuMMDxC5KCKNJN3zZKYJk2sgyTuTZQ7Aj1DJSsLKAcizA/PzWivw8fZMIjJVBo2CJOYzntv4FSjY/Lr//g== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~7.5.10" + xmlhttprequest-ssl "~1.6.2" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.4" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.6.2.tgz#b5d0fffafdd8525dbcd10b3ab5d8337271c3c36b" + integrity sha512-C4JjGQZLY3kWlIDx0BQNKizbrfpb7NahxDztGdN5jrPK2ghmXiNDN+E/t0JzDeNRZxPVaszxEng42Pmj27X/0w== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "~7.5.10" + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -312,6 +514,13 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-loop-stats@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/event-loop-stats/-/event-loop-stats-1.2.0.tgz#20ef06af562f13d84f00bf0f1bac2c433315e709" + integrity sha512-h/leAlXqoEf+D9w1dnFG0srR5vfIq59rLm9PHzcl3/GwFppd+UR46UMuLdp/mvJvuA+MjSd/dNShmuM2/dPFFw== + dependencies: + nan "^2.14.0" + eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -322,6 +531,11 @@ eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + express-session@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.18.1.tgz#88d0bbd41878882840f24ec6227493fcb167e8d5" @@ -336,6 +550,20 @@ express-session@^1.18.1: safe-buffer "5.2.1" uid-safe "~2.1.5" +express-status-monitor@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/express-status-monitor/-/express-status-monitor-1.3.4.tgz#37a11aa450db2322307c28ea9c4781c8c46add45" + integrity sha512-EyqHvgX57ujN4fqfUT+x6Bv2xwRyzQdv3AJvWQxcG+jK4TcF9vhrKVqGcE0T6bhT4rstpvOKRuxHBwC/Q6AXQg== + dependencies: + axios "0.26.0" + debug "4.1.1" + handlebars "^4.7.7" + on-headers "1.0.2" + pidusage "2.0.18" + socket.io "^2.4.1" + optionalDependencies: + event-loop-stats "1.2.0" + express@^4.21.1: version "4.21.1" resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" @@ -373,6 +601,11 @@ express@^4.21.1: utils-merge "1.0.1" vary "~1.1.2" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -393,7 +626,7 @@ finalhandler@1.3.1: statuses "2.0.1" unpipe "~1.0.0" -follow-redirects@^1.15.6: +follow-redirects@^1.14.8, follow-redirects@^1.15.6: version "1.15.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== @@ -417,6 +650,20 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" @@ -433,6 +680,11 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -440,6 +692,35 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -487,11 +768,31 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -inherits@2.0.4: +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg== + +inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -507,6 +808,16 @@ is-stream@^2: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ== + jake@^10.8.5: version "10.9.2" resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" @@ -517,6 +828,13 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonwebtoken@^9: version "9.0.2" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" @@ -550,6 +868,13 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +kruptein@^2.0.4: + version "2.2.3" + resolved "https://registry.yarnpkg.com/kruptein/-/kruptein-2.2.3.tgz#e09a3942b8072ac71728d10fe089293e0b5e7d42" + integrity sha512-BTwprBPTzkFT9oTugxKd3WnWrX630MqUDsnmBuoa98eQs12oD4n4TeI0GbpdGcYn/73Xueg2rfnw+oK4dovnJg== + dependencies: + asn1.js "^5.4.1" + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -585,6 +910,11 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -617,6 +947,16 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -631,6 +971,16 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -641,11 +991,38 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nan@^2.14.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-abi@^3.3.0: + version "3.68.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.68.0.tgz#8f37fb02ecf4f43ebe694090dcb52e0c4cc4ba25" + integrity sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A== + dependencies: + semver "^7.3.5" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + object-inspect@^1.13.1: version "1.13.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" @@ -658,11 +1035,18 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-headers@~1.0.2: +on-headers@1.0.2, on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -691,6 +1075,16 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -701,6 +1095,31 @@ path-to-regexp@0.1.10: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +pidusage@2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/pidusage/-/pidusage-2.0.18.tgz#9ccef35df5508a5a4b0838c712ea9b79609aff34" + integrity sha512-Y/VfKfh3poHjMEINxU+gJTeVOBjiThQeFAmzR7z56HSNiMx+etl+yBhk42nRPciPYt/VZl8DQLVXNC6P5vH11A== + dependencies: + safe-buffer "^5.1.2" + +prebuild-install@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -714,6 +1133,14 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + qs@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" @@ -721,6 +1148,13 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" +quick.db@^9.1.7: + version "9.1.7" + resolved "https://registry.yarnpkg.com/quick.db/-/quick.db-9.1.7.tgz#65056bc2033780236855b9c7ea3b0081c387f76f" + integrity sha512-ZLPVLVFZtvFRLHqIK99iyrLDUznOTpnp5tB+QpGErT+reDSvgBELuVsMkGSSiqKT9R2YSOhO+096Wb0xTaOHMA== + dependencies: + lodash "^4.17.21" + random-bytes@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" @@ -741,22 +1175,46 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -safe-buffer@5.2.1, safe-buffer@^5.0.1: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^7.5.4: +semver@^7.3.5, semver@^7.5.4: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -790,6 +1248,18 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" +session-file-store@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/session-file-store/-/session-file-store-1.5.0.tgz#9faffc18c2e28f57fe7c4e4c84cdc92bb20833f4" + integrity sha512-60IZaJNzyu2tIeHutkYE8RiXVx3KRvacOxfLr2Mj92SIsRIroDsH0IlUUR6fJAjoTW4RQISbaOApa2IZpIwFdQ== + dependencies: + bagpipe "^0.3.5" + fs-extra "^8.0.1" + kruptein "^2.0.4" + object-assign "^4.1.1" + retry "^0.12.0" + write-file-atomic "3.0.3" + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -817,11 +1287,104 @@ side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-client@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.5.0.tgz#34f486f3640dde9c2211fce885ac2746f9baf5cb" + integrity sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw== + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.5.0" + has-binary2 "~1.0.2" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.4.tgz#ab84236b6d06eaf1fb68b179b3a7501195886cc3" + integrity sha512-z/pFQB3x+EZldRRzORYW1vwVO8m/3ILkswtnpoeU6Ve3cbMWkmHEWDAVJn4QJtchiiFTo5j7UG2QvwxvaA9vow== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.3.tgz#b19bdaad38ed39fd68fba3f9d86768f667df0c29" + integrity sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.5.1.tgz#224459ecf13ab66bfc7fb6dd0c6bf760a9895e7f" + integrity sha512-eaTE4tBKRD6RFoetquMbxgvcpvoDtRyIlkIMI/SMK2bsKvbENTsDeeu4GJ/z9c90yOWxB7b/eC+yKLPbHnH6bA== + dependencies: + debug "~4.1.0" + engine.io "~3.6.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.5.0" + socket.io-parser "~3.4.0" + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spotify-uri@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/spotify-uri/-/spotify-uri-4.1.0.tgz#d1286b1922055e2b0e37b773ef2bff2c40e71010" + integrity sha512-SFpBt8pQqO7DOFBsdUjv3GxGZAKYP7UqcTflfE7h3YL1lynl/6Motq7NERoJJR8eF9kXQRSpcdMmV5ou84rbng== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -829,11 +1392,44 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A== + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -842,6 +1438,18 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + uid-safe@~2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" @@ -854,11 +1462,21 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -868,3 +1486,38 @@ vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@~7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +xmlhttprequest-ssl@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" + integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg== From 2053af68396f082fd56bc7510ae93d22e3941f9d Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 22:01:20 +0000 Subject: [PATCH 13/37] enhancement(lint): Fix lint errors for hackclub-spotify-bot/.gitignore Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- hackclub-spotify-bot/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hackclub-spotify-bot/.gitignore b/hackclub-spotify-bot/.gitignore index 81e7c07..819e52e 100644 --- a/hackclub-spotify-bot/.gitignore +++ b/hackclub-spotify-bot/.gitignore @@ -1,4 +1,4 @@ node_modules .env db.json -data/* \ No newline at end of file +data/* From 27692957621ec0f37c8936ac311d11a251befc2d Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 22:01:20 +0000 Subject: [PATCH 14/37] enhancement(lint): Fix lint errors for hackclub-spotify-bot/TODO.md Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- hackclub-spotify-bot/TODO.md | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/hackclub-spotify-bot/TODO.md b/hackclub-spotify-bot/TODO.md index 0ca49b5..7bf6c50 100644 --- a/hackclub-spotify-bot/TODO.md +++ b/hackclub-spotify-bot/TODO.md @@ -1,16 +1,15 @@ -- [ ] Slack stuff -- - ~~[ ] web api [docs](https://tools.slack.dev/node-slack-sdk/web-api/)~~ -- - [x] send messages thru zeon https://github.com/NeonGamerBot-QK/slack-zeon/blob/092d324c7c58d37e2165ecf0a6798a983c75e7d2/src/modules/slackapp.ts#L19-L53 -- - [x] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth) -- - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B) -- - - [x] Add ping for new-song event & send message ovs -- [ ] Spotify -- - [x] web api [docs](https://developer.spotify.com/documentation/web-api/) -- - [x] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/) -- - [x] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token) -- - [x] playlist tools (creation,modifcation,deletion) -- [x] keydb (quick db or smthing) -- [x] express -- [ ] transparency of added songs -- - [ ] export db -> into csv with properties (slack_id, url, added_at) - +- [ ] Slack stuff +- - ~~[ ] web api [docs](https://tools.slack.dev/node-slack-sdk/web-api/)~~ +- - [x] send messages thru zeon https://github.com/NeonGamerBot-QK/slack-zeon/blob/092d324c7c58d37e2165ecf0a6798a983c75e7d2/src/modules/slackapp.ts#L19-L53 +- - [x] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth) +- - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B) +- - - [x] Add ping for new-song event & send message ovs +- [ ] Spotify +- - [x] web api [docs](https://developer.spotify.com/documentation/web-api/) +- - [x] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/) +- - [x] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token) +- - [x] playlist tools (creation,modifcation,deletion) +- [x] keydb (quick db or smthing) +- [x] express +- [ ] transparency of added songs +- - [ ] export db -> into csv with properties (slack_id, url, added_at) From 7499857a57d76482866f918b35356343918528df Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 22:01:21 +0000 Subject: [PATCH 15/37] enhancement(lint): Fix lint errors for hackclub-spotify-bot/src/index.js Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- hackclub-spotify-bot/src/index.js | 224 ++++++++++++++++-------------- 1 file changed, 121 insertions(+), 103 deletions(-) diff --git a/hackclub-spotify-bot/src/index.js b/hackclub-spotify-bot/src/index.js index 72aa141..98dca8d 100644 --- a/hackclub-spotify-bot/src/index.js +++ b/hackclub-spotify-bot/src/index.js @@ -2,9 +2,16 @@ const path = require("path"); require("dotenv").config(); const express = require("express"); const session = require("express-session"); -const FileStore = require('session-file-store')(session); +const FileStore = require("session-file-store")(session); const { InstallProvider, FileInstallationStore } = require("@slack/oauth"); -const { getLoginUrl, refreshToken, getCredentials, saveCredentials, spotifyRoutes, addSongToPlaylist } = require("./spotify"); +const { + getLoginUrl, + refreshToken, + getCredentials, + saveCredentials, + spotifyRoutes, + addSongToPlaylist, +} = require("./spotify"); const { QuickDB } = require("quick.db"); const db = new QuickDB({ @@ -12,22 +19,27 @@ const db = new QuickDB({ }); let cacheDb = {}; const app = express(); -const userScopes = ['identity.avatar', 'identity.basic', 'identity.team'] +const userScopes = ["identity.avatar", "identity.basic", "identity.team"]; // Initialize const oauth = new InstallProvider({ clientId: process.env.SLACK_CLIENT_ID, clientSecret: process.env.SLACK_CLIENT_SECRET, stateSecret: process.env.STATE_SECRET, stateVerification: false, - stateStore: new FileInstallationStore(path.join(__dirname, '../data/states.json')), - installationStore: new FileInstallationStore(path.join(__dirname, '../data/installations.json')), - // installationStore: { + stateStore: new FileInstallationStore( + path.join(__dirname, "../data/states.json"), + ), + installationStore: new FileInstallationStore( + path.join(__dirname, "../data/installations.json"), + ), + // installationStore: { - //} - stateStore: { + //} + stateStore: { generateStateParam: (installUrlOptions, date) => { // generate a random string to use as state in the URL - const randomState = process.env.STATE_SECRET + Math.random().toString(36).substring(7); + const randomState = + process.env.STATE_SECRET + Math.random().toString(36).substring(7); // save installOptions to cache/db cacheDb[randomState] = installUrlOptions; // myDB.set(randomState, installUrlOptions); @@ -36,13 +48,13 @@ const oauth = new InstallProvider({ }, // verifyStateParam's first argument is a date object and the second argument is a string representing the state // verifyStateParam is expected to return an object representing installUrlOptions - verifyStateParam: (date, state) => { + verifyStateParam: (date, state) => { return cacheDb[state]; // fetch saved installOptions from DB using state reference const installUrlOptions = myDB.get(randomState); return installUrlOptions; }, - } + }, }); app.use(express.json()); app.use(express.static(path.join(__dirname, "public"))); @@ -54,31 +66,32 @@ app.use( secret: process.env.STATE_SECRET, resave: true, store: new FileStore({ - path: path.join(__dirname, '../data/sessions'), + path: path.join(__dirname, "../data/sessions"), }), saveUninitialized: true, - cookie: { secure: "auto", maxAge: 1000 * 60 * 60 * 24 * 365 }, - + cookie: { secure: "auto", maxAge: 1000 * 60 * 60 * 24 * 365 }, }), ); try { - const statusMonitor = require('express-status-monitor')({ - healthChecks: [{ - protocol: 'http', - host: 'localhost', - port: 3000, - path: '/', - timeout: 1000, - interval: 1000, - }] + const statusMonitor = require("express-status-monitor")({ + healthChecks: [ + { + protocol: "http", + host: "localhost", + port: 3000, + path: "/", + timeout: 1000, + interval: 1000, + }, + ], }); -app.use(statusMonitor); -app.use((req,res,next) => { -// console.debug([req.headers, req.session]) - next() -}) -} catch (e) { + app.use(statusMonitor); + app.use((req, res, next) => { + // console.debug([req.headers, req.session]) + next(); + }); +} catch (e) { // we can ignore since this is an optional dependency } @@ -86,37 +99,40 @@ app.get("/login", async (req, res) => { if (req.session.token) { res.redirect("/home"); } else { - res.redirect(await oauth.generateInstallUrl({ - // Add the scopes your app needs - redirectUri: process.env.SLACK_REDIRECT_URI, - scopes: [], + res.redirect( + await oauth.generateInstallUrl({ + // Add the scopes your app needs + redirectUri: process.env.SLACK_REDIRECT_URI, + scopes: [], - userScopes: userScopes - })) + userScopes: userScopes, + }), + ); } }); -app.get('/slack/callback', (req, res) => { +app.get("/slack/callback", (req, res) => { // console.debug(req.headers, req.url) oauth.handleCallback(req, res, { - success: async (install) => { + success: async (install) => { // typings // user: { token:string , scopes: string[], id: string} // console.log(install) - req.session.info = install - req.session.token = install.user.token -res.redirect('/home') + req.session.info = install; + req.session.token = install.user.token; + res.redirect("/home"); }, failure: (err) => { console.log(err); - res.send("Failed to install!, please contact neon in the slack!, \n" + err.stack); + res.send( + "Failed to install!, please contact neon in the slack!, \n" + err.stack, + ); }, - }); }); -app.get('/logout', (req,res) => { +app.get("/logout", (req, res) => { req.session.destroy(); - res.redirect('/'); -}) + res.redirect("/"); +}); app.get("/", (req, res) => { res.render("index", { title: "Hack Club Spotify Bot", @@ -127,9 +143,9 @@ const errorStrings = [ "Invalid CSRF Token!", // token = csrf token "Song is not a track! (or not even a spotify song url)", "Song already exists in the database! (its in the playlist or banned from the playlist)", -] -app.get('/home', async (req,res) => { - if(!req.session.info) return res.redirect('/login'); +]; +app.get("/home", async (req, res) => { + if (!req.session.info) return res.redirect("/login"); let onetimetoken = Math.random().toString(36).substring(7); cacheDb[onetimetoken] = true; res.render("home", { @@ -138,77 +154,79 @@ app.get('/home', async (req,res) => { userinfo: req.session.info, onetimetoken, error: errorStrings[req.query.error], - s: req.query.s + s: req.query.s, }); -}) -app.post('/spotify/submitsong', async (req,res) => { - if(!req.session.token) return res.redirect('/login'); -if(!cacheDb[req.query.token]) return res.redirect(`/home?error=0`); -delete cacheDb[req.query.token]; - -const songurl = req.body.songurl; - -const songuriinfo = require('spotify-uri').parse(songurl); -if(songuriinfo.type !== "track") return res.redirect(`/home?error=1`); -const alreadyExists = await db.has(songuriinfo.id); -if(alreadyExists) return res.redirect(`/home?error=2`); -const formattedURI = require('spotify-uri').formatURI(songuriinfo) -await db.set(songuriinfo.id, { - song_url: songurl, - added_by: req.session.info.user.id, - added_at: Date.now() }); -addSongToPlaylist(formattedURI); -fetch("https://slack.mybot.saahild.com/send-private", { - method: "POST", - body: JSON.stringify({ - channel: "C07RE4N7S4B", - text: `:new_spotify: New Song: ${songurl} - added by <@${req.session.info.user.id}>`, - }), - headers: { - Authorization: process.env.AUTH_FOR_ZEON, - "Content-Type": "application/json", - }, -}).then(r=>r.json()).then(d => { +app.post("/spotify/submitsong", async (req, res) => { + if (!req.session.token) return res.redirect("/login"); + if (!cacheDb[req.query.token]) return res.redirect(`/home?error=0`); + delete cacheDb[req.query.token]; + + const songurl = req.body.songurl; + + const songuriinfo = require("spotify-uri").parse(songurl); + if (songuriinfo.type !== "track") return res.redirect(`/home?error=1`); + const alreadyExists = await db.has(songuriinfo.id); + if (alreadyExists) return res.redirect(`/home?error=2`); + const formattedURI = require("spotify-uri").formatURI(songuriinfo); + await db.set(songuriinfo.id, { + song_url: songurl, + added_by: req.session.info.user.id, + added_at: Date.now(), + }); + addSongToPlaylist(formattedURI); fetch("https://slack.mybot.saahild.com/send-private", { method: "POST", body: JSON.stringify({ channel: "C07RE4N7S4B", - thread_ts: d.ts, - text: `:thread: Responses about new song here please!`, - }), - headers: { - Authorization: process.env.AUTH_FOR_ZEON, - "Content-Type": "application/json", - }, - }) -}); -if(!process.env.TESTING) { - fetch("https://slack.mybot.saahild.com/send-private", { - method: "POST", - body: JSON.stringify({ - channel: "C07RE4N7S4B", - text: ``, + text: `:new_spotify: New Song: ${songurl} - added by <@${req.session.info.user.id}>`, }), headers: { Authorization: process.env.AUTH_FOR_ZEON, "Content-Type": "application/json", }, }) -} -res.redirect('/home?s=1') -}) -app.get('/spotify/link', async (req,res) => { - if(!req.session.info) return res.redirect('/login'); - if(req.session.info.user.id !== "U07L45W79E1" ) return res.status(401).end("unauthorized"); - res.redirect(getLoginUrl()) -}) + .then((r) => r.json()) + .then((d) => { + fetch("https://slack.mybot.saahild.com/send-private", { + method: "POST", + body: JSON.stringify({ + channel: "C07RE4N7S4B", + thread_ts: d.ts, + text: `:thread: Responses about new song here please!`, + }), + headers: { + Authorization: process.env.AUTH_FOR_ZEON, + "Content-Type": "application/json", + }, + }); + }); + if (!process.env.TESTING) { + fetch("https://slack.mybot.saahild.com/send-private", { + method: "POST", + body: JSON.stringify({ + channel: "C07RE4N7S4B", + text: ``, + }), + headers: { + Authorization: process.env.AUTH_FOR_ZEON, + "Content-Type": "application/json", + }, + }); + } + res.redirect("/home?s=1"); +}); +app.get("/spotify/link", async (req, res) => { + if (!req.session.info) return res.redirect("/login"); + if (req.session.info.user.id !== "U07L45W79E1") + return res.status(401).end("unauthorized"); + res.redirect(getLoginUrl()); +}); spotifyRoutes(app); app.listen(process.env.PORT || 3000, async () => { console.log("Example app listening on port 3000!"); // if(!await db.has()) - if(getCredentials() !== null) refreshToken(getCredentials().refresh_token); - + if (getCredentials() !== null) refreshToken(getCredentials().refresh_token); }); From 0bf03719c2661566e5184d79e448c957f6786ea9 Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 22:01:22 +0000 Subject: [PATCH 16/37] enhancement(lint): Fix lint errors for hackclub-spotify-bot/src/spotify.js Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- hackclub-spotify-bot/src/spotify.js | 395 ++++++++++++++-------------- 1 file changed, 199 insertions(+), 196 deletions(-) diff --git a/hackclub-spotify-bot/src/spotify.js b/hackclub-spotify-bot/src/spotify.js index 7f8ceb1..b444435 100644 --- a/hackclub-spotify-bot/src/spotify.js +++ b/hackclub-spotify-bot/src/spotify.js @@ -1,196 +1,199 @@ - -let token = null; -let authStuff = null; -const client_id = process.env.SPOTIFY_CLIENT_ID; -const client_secret = process.env.SPOTIFY_CLIENT_SECRET; -const redirect_uri = process.env.SPOTIFY_REDIRECT_URI; -async function fetchWebApi(endpoint, method, body) { - const res = await fetch(`https://api.spotify.com/${endpoint}`, { - headers: { - Authorization: `Bearer ${token}`, - }, - method, - body: JSON.stringify(body), - }); - const text = await res.text(); - // console.debug(text) - // abs nothing is wrong - return JSON.parse(text.trim()); - } - - function getLoginUrl() { - const state = generateRandomString(16); - const scope = [ - // "ugc-image-upload", - // "user-read-playback-state", - // "user-modify-playback-state", - // "user-read-currently-playing", - // "app-remote-control", - // "streaming", - "playlist-read-private", - "playlist-read-collaborative", - "playlist-modify-private", - "playlist-modify-public", - // "user-follow-modify", - // "user-follow-read", - // "user-read-playback-position", - // "user-top-read", - // "user-read-recently-played", - "user-library-modify", - // "user-library-read", - // "user-read-email", - "user-read-private", - ].join(" "); - - return ( - "https://accounts.spotify.com/authorize?" + - `response_type=code&grant_type=client_credentials&client_id=${client_id}&scope=${scope}&redirect_uri=${redirect_uri}&state=${state}` - ); - } - - function generateRandomString(length) { - let result = ""; - const characters = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - const charactersLength = characters.length; - let counter = 0; - while (counter < length) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - counter += 1; - } - return result; - } - async function refreshToken(refresh_token) { - try { - // var refresh_token = req.query.refresh_token; - const authOptions = { - url: "https://accounts.spotify.com/api/token", - headers: { - "content-type": "application/x-www-form-urlencoded", - Authorization: - "Basic " + - new Buffer.from(client_id + ":" + client_secret).toString("base64"), - }, - form: { - grant_type: "refresh_token", - refresh_token: refresh_token, - }, - json: true, - }; - const formdm = new URLSearchParams(); - - formdm.append("grant_type", "refresh_token"); - formdm.append("refresh_token", refresh_token); - - fetch(authOptions.url, { - body: formdm, - headers: authOptions.headers, - method: "POST", - }) - .then(async (r) => { - const text = await r.text(); - // console.log(text); - return JSON.parse(text); - }) - .then((auth) => { - if (!auth.refresh_token) auth.refresh_token = refresh_token; - // console.log(auth); - authStuff = auth; - token = auth.access_token; - saveCredentials(auth); - if (auth.expires_in) { - setTimeout(() => { - refreshToken(auth.refresh_token); - }, auth.expires_in * 1000); - } - }); - } catch (e) { - console.error(`Welp it broke`); - // try again asap because we NEED THAT TOKEN - refreshToken(refresh_token); - } - } -function saveCredentials(creds) { -require('fs').writeFileSync('data/credentials.json', JSON.stringify(creds, null, 2)); -} -function getCredentials() { - try { - return JSON.parse(require('fs').readFileSync('data/credentials.json', 'utf8')); - } catch (e) { - return null; - } - -} -function spotifyRoutes(app) { - app.get('/spotify/callback', async (req,res) => { - const code = req.query.code || null; - const state = req.query.state || null; - - if (state === null) { - res.redirect( - "/#" + - querystring.stringify({ - error: "state_mismatch", - }), - ); - } else { - const authOptions = { - url: "https://accounts.spotify.com/api/token", - form: { - code: code, - redirect_uri: redirect_uri, - grant_type: "authorization_code", - }, - headers: { - "content-type": "application/x-www-form-urlencoded", - Authorization: - "Basic " + - new Buffer.from(client_id + ":" + client_secret).toString("base64"), - }, - json: true, - }; - const formdm = new URLSearchParams(); - // Object.entries(authOptions.form).forEach(([key, value]) => { - // formdm.append(key, value); - // }) - formdm.append("code", code); - formdm.append("redirect_uri", redirect_uri); - formdm.append("grant_type", "authorization_code"); - - fetch(authOptions.url, { - body: formdm, - headers: authOptions.headers, - method: "POST", - }) - .then((r) => r.json()) - .then((auth) => { - // console.log(auth); - authStuff = auth; - saveCredentials(auth) - token = auth.access_token; - if (auth.expires_in) { - setTimeout(() => { - refreshToken(auth.refresh_token); - }, auth.expires_in * 1000); - } - res.status(200).end("Successfully logged in!"); - }) - } - }) -} -function addSongToPlaylist(url) { - fetchWebApi('v1/playlists/3gRv97fvllFFLVdCH6XzsE/tracks', 'POST', { - uris: [url], - position: 0, - }) -} - module.exports = { - getLoginUrl, - refreshToken, - saveCredentials, - getCredentials, - spotifyRoutes, - addSongToPlaylist - - // getToken - } +let token = null; +let authStuff = null; +const client_id = process.env.SPOTIFY_CLIENT_ID; +const client_secret = process.env.SPOTIFY_CLIENT_SECRET; +const redirect_uri = process.env.SPOTIFY_REDIRECT_URI; +async function fetchWebApi(endpoint, method, body) { + const res = await fetch(`https://api.spotify.com/${endpoint}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + method, + body: JSON.stringify(body), + }); + const text = await res.text(); + // console.debug(text) + // abs nothing is wrong + return JSON.parse(text.trim()); +} + +function getLoginUrl() { + const state = generateRandomString(16); + const scope = [ + // "ugc-image-upload", + // "user-read-playback-state", + // "user-modify-playback-state", + // "user-read-currently-playing", + // "app-remote-control", + // "streaming", + "playlist-read-private", + "playlist-read-collaborative", + "playlist-modify-private", + "playlist-modify-public", + // "user-follow-modify", + // "user-follow-read", + // "user-read-playback-position", + // "user-top-read", + // "user-read-recently-played", + "user-library-modify", + // "user-library-read", + // "user-read-email", + "user-read-private", + ].join(" "); + + return ( + "https://accounts.spotify.com/authorize?" + + `response_type=code&grant_type=client_credentials&client_id=${client_id}&scope=${scope}&redirect_uri=${redirect_uri}&state=${state}` + ); +} + +function generateRandomString(length) { + let result = ""; + const characters = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const charactersLength = characters.length; + let counter = 0; + while (counter < length) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + counter += 1; + } + return result; +} +async function refreshToken(refresh_token) { + try { + // var refresh_token = req.query.refresh_token; + const authOptions = { + url: "https://accounts.spotify.com/api/token", + headers: { + "content-type": "application/x-www-form-urlencoded", + Authorization: + "Basic " + + new Buffer.from(client_id + ":" + client_secret).toString("base64"), + }, + form: { + grant_type: "refresh_token", + refresh_token: refresh_token, + }, + json: true, + }; + const formdm = new URLSearchParams(); + + formdm.append("grant_type", "refresh_token"); + formdm.append("refresh_token", refresh_token); + + fetch(authOptions.url, { + body: formdm, + headers: authOptions.headers, + method: "POST", + }) + .then(async (r) => { + const text = await r.text(); + // console.log(text); + return JSON.parse(text); + }) + .then((auth) => { + if (!auth.refresh_token) auth.refresh_token = refresh_token; + // console.log(auth); + authStuff = auth; + token = auth.access_token; + saveCredentials(auth); + if (auth.expires_in) { + setTimeout(() => { + refreshToken(auth.refresh_token); + }, auth.expires_in * 1000); + } + }); + } catch (e) { + console.error(`Welp it broke`); + // try again asap because we NEED THAT TOKEN + refreshToken(refresh_token); + } +} +function saveCredentials(creds) { + require("fs").writeFileSync( + "data/credentials.json", + JSON.stringify(creds, null, 2), + ); +} +function getCredentials() { + try { + return JSON.parse( + require("fs").readFileSync("data/credentials.json", "utf8"), + ); + } catch (e) { + return null; + } +} +function spotifyRoutes(app) { + app.get("/spotify/callback", async (req, res) => { + const code = req.query.code || null; + const state = req.query.state || null; + + if (state === null) { + res.redirect( + "/#" + + querystring.stringify({ + error: "state_mismatch", + }), + ); + } else { + const authOptions = { + url: "https://accounts.spotify.com/api/token", + form: { + code: code, + redirect_uri: redirect_uri, + grant_type: "authorization_code", + }, + headers: { + "content-type": "application/x-www-form-urlencoded", + Authorization: + "Basic " + + new Buffer.from(client_id + ":" + client_secret).toString("base64"), + }, + json: true, + }; + const formdm = new URLSearchParams(); + // Object.entries(authOptions.form).forEach(([key, value]) => { + // formdm.append(key, value); + // }) + formdm.append("code", code); + formdm.append("redirect_uri", redirect_uri); + formdm.append("grant_type", "authorization_code"); + + fetch(authOptions.url, { + body: formdm, + headers: authOptions.headers, + method: "POST", + }) + .then((r) => r.json()) + .then((auth) => { + // console.log(auth); + authStuff = auth; + saveCredentials(auth); + token = auth.access_token; + if (auth.expires_in) { + setTimeout(() => { + refreshToken(auth.refresh_token); + }, auth.expires_in * 1000); + } + res.status(200).end("Successfully logged in!"); + }); + } + }); +} +function addSongToPlaylist(url) { + fetchWebApi("v1/playlists/3gRv97fvllFFLVdCH6XzsE/tracks", "POST", { + uris: [url], + position: 0, + }); +} +module.exports = { + getLoginUrl, + refreshToken, + saveCredentials, + getCredentials, + spotifyRoutes, + addSongToPlaylist, + + // getToken +}; From 140fa4201115f0b71d7ba6696ac92ecaa71a46a4 Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 22:01:23 +0000 Subject: [PATCH 17/37] enhancement(lint): Fix lint errors for hackclub-spotify-bot/src/public/hackclub.css Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- hackclub-spotify-bot/src/public/hackclub.css | 1260 +++++++++--------- 1 file changed, 635 insertions(+), 625 deletions(-) diff --git a/hackclub-spotify-bot/src/public/hackclub.css b/hackclub-spotify-bot/src/public/hackclub.css index fb4c884..feb83cb 100644 --- a/hackclub-spotify-bot/src/public/hackclub.css +++ b/hackclub-spotify-bot/src/public/hackclub.css @@ -1,625 +1,635 @@ -/* modified version of https://css.hackclub.com/theme.css */ -:root { - /* why are the css vars swapped with incorrect names? well im to lazy to fix it. */ - --darker: #121217; - --dark: #f9fafc; - --darkless: #e0e6ed; - --black: #fff; - --steel: #273444; - --slate: #3c4858; - --muted: #8492a6; - --smoke: #252429; - --snow: #17171d; - --white: #1f2d3d; - --red: #ec3750; - --orange: #ff8c37; - --yellow: #f1c40f; - --green: #33d6a6; - --cyan: #5bc0de; - --blue: #338eda; - --purple: #a633d6; - --text: var(--black); - --background: var(--white); - --elevated: var(--white); - --sheet: var(--snow); - --sunken: var(--smoke); - --border: var(--smoke); - --primary: #ec3750; - --secondary: #8492a6; - --accent: #5bc0de; - --twitter: #1da1f2; - --facebook: #3b5998; - --instagram: #e1306c; - --breakpoint-xs: 32em; - --breakpoint-s: 48em; - --breakpoint-m: 64em; - --breakpoint-l: 96em; - --breakpoint-xl: 128em; - --spacing-0: 0px; - --spacing-1: 4px; - --spacing-2: 8px; - --spacing-3: 16px; - --spacing-4: 32px; - --spacing-5: 64px; - --spacing-6: 128px; - --spacing-7: 256px; - --spacing-8: 512px; - --font-1: 12px; - --font-2: 16px; - --font-3: 20px; - --font-4: 24px; - --font-5: 32px; - --font-6: 48px; - --font-7: 64px; - --font-8: 96px; - --font-9: 128px; - --font-10: 160px; - --font-11: 192px; - --line-height-limit: 0.875; - --line-height-title: 1; - --line-height-heading: 1.125; - --line-height-subheading: 1.25; - --line-height-caption: 1.375; - --line-height-body: 1.5; - --font-weight-body: 400; - --font-weight-bold: 700; - --font-weight-heading: var(--font-weight-bold); - --letter-spacing-title: -0.009em; - --letter-spacing-headline: 0.009em; - --size-wide-plus: 2048px; - --size-wide: 1536px; - --size-layout-plus: 1200px; - --size-layout: 1024px; - --size-copy-ultra: 980px; - --size-copy-plus: 768px; - --size-copy: 680px; - --size-narrow-plus: 600px; - --size-narrow: 512px; - --radii-small: 4px; - --radii-default: 8px; - --radii-extra: 12px; - --radii-ultra: 16px; - --radii-circle: 99999px; - --shadow-text: 0 1px 2px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.125); - --shadow-small: 0 1px 2px rgba(0, 0, 0, 0.0625), - 0 2px 4px rgba(0, 0, 0, 0.0625); - --shadow-card: 0 4px 8px rgba(0, 0, 0, 0.125); - --shadow-elevated: 0 1px 2px rgba(0, 0, 0, 0.0625), - 0 8px 12px rgba(0, 0, 0, 0.125); - } - - body { - font-family: "Phantom Sans", system-ui, -apple-system, BlinkMacSystemFont, - "Segoe UI", Roboto, sans-serif; - line-height: var(--line-height-body); - font-weight: var(--font-weight-body); - margin: 0; - min-height: 100vh; - text-rendering: optimizeLegibility; - font-smooth: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - color: var(--text); - background-color: var(--background); - box-sizing: border-box; - } - - * { - box-sizing: border-box; - } - - .monospace { - font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; - } - - .heading { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; - } - - .ultratitle { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-limit); - letter-spacing: var(--letter-spacing-title); - } - - .title { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-title); - letter-spacing: var(--letter-spacing-title); - } - - .subtitle { - margin-top: var(--spacing-3); - font-weight: var(--font-weight-body); - line-height: var(--line-height-subheading); - letter-spacing: var(--letter-spacing-headline); - } - - .headline { - margin-top: var(--spacing-3); - margin-bottom: var(--spacing-3); - font-size: var(--font-4); - line-height: var(--line-height-heading); - letter-spacing: var(--letter-spacing-headline); - } - - .subheadline { - margin-top: var(--spacing-0); - margin-bottom: var(--spacing-3); - font-size: var(--font-2); - line-height: var(--line-height-heading); - letter-spacing: var(--letter-spacing-headline); - } - - .eyebrow { - color: var(--muted); - font-weight: var(--font-weight-heading); - letter-spacing: var(--letter-spacing-headline); - line-height: var(--line-height-subheading); - text-transform: uppercase; - margin-top: var(--spacing-0); - margin-bottom: var(--spacing-2); - } - - .lead { - font-weight: var(--font-weight-body); - } - - .caption { - color: var(--muted); - font-weight: var(--font-weight-body); - letter-spacing: var(--letter-spacing-headline); - line-height: var(--line-height-caption); - } - - .pill { - border-radius: var(--radii-circle); - padding-left: var(--spacing-3); - padding-right: var(--spacing-3); - padding-top: var(--spacing-1); - padding-bottom: var(--spacing-1); - font-size: var(--font-2); - background: var(--primary); - color: var(--background); - font-weight: var(--font-weight-bold); - } - - .outline-badge { - border-radius: var(--radii-circle); - padding-left: var(--spacing-3); - padding-right: var(--spacing-3); - padding-top: var(--spacing-1); - padding-bottom: var(--spacing-1); - font-size: var(--font-2); - background: none; - color: var(--muted); - border: 1px solid currentcolor; - font-weight: var(--font-weight-body); - } - - button { - cursor: pointer; - font-family: inherit; - font-weight: var(--font-weight-bold); - border-radius: var(--radii-circle); - display: inline-flex; - align-items: center; - justify-content: center; - box-shadow: var(--shadow-card); - letter-spacing: var(--letter-spacing-headline); - -webkit-tap-highlight-color: transparent; - transition: transform 0.125s ease-in-out, box-shadow 0.125s ease-in-out; - box-sizing: border-box; - margin: 0; - min-width: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - text-align: center; - line-height: inherit; - -webkit-text-decoration: none; - text-decoration: none; - padding-left: 16px; - padding-right: 16px; - padding-top: 8px; - padding-bottom: 8px; - color: var(--theme-ui-colors-white, #ffffff); - background-color: var(--theme-ui-colors-primary, #ec3750); - border: 0; - font-size: var(--font-2); - } - - button:focus, - button:hover { - box-shadow: var(--shadow-elevated); - transform: scale(1.0625); - } - .button { - cursor: pointer; - font-family: inherit; - font-weight: var(--font-weight-bold); - border-radius: var(--radii-circle); - display: inline-flex; - align-items: center; - justify-content: center; - box-shadow: var(--shadow-card); - letter-spacing: var(--letter-spacing-headline); - -webkit-tap-highlight-color: transparent; - transition: transform 0.125s ease-in-out, box-shadow 0.125s ease-in-out; - box-sizing: border-box; - margin: 0; - min-width: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - text-align: center; - line-height: inherit; - -webkit-text-decoration: none; - text-decoration: none; - padding-left: 16px; - padding-right: 16px; - padding-top: 8px; - padding-bottom: 8px; - color: var(--theme-ui-colors-white, #ffffff); - background-color: var(--theme-ui-colors-primary, #ec3750); - border: 0; - font-size: var(--font-2); - } - - .button:focus, - .button:hover { - box-shadow: var(--shadow-elevated); - transform: scale(1.0625); - } - button.lg { - font-size: var(--font-3)!important; - line-height: var(--line-height-title); - padding-left: var(--spacing-4); - padding-right: var(--spacing-4); - padding-top: var(--spacing-3); - padding-bottom: var(--spacing-3); - } - - button.outline { - background: none; - color: var(--primary); - border: 2px solid currentcolor; - } - - button.cta { - font-size: var(--font-2); - background-image: radial-gradient( - ellipse farthest-corner at top left, - var(--orange), - var(--red) - ); - } - - .card { - background: var(--elevated); - color: var(--text); - border-radius: var(--radii-extra); - box-shadow: var(--shadow-card); - overflow: hidden; - } - - .card.sunken { - background: var(--sunken); - box-shadow: none; - } - - .card.interactive { - text-decoration: none; - -webkit-tap-highlight-color: transparent; - transition: transform 0.125s ease-in-out, box-shadow 0.125s ease-in-out; - } - - .card.interactive:hover, - .card.interactive:focus { - transform: scale(1.0625); - box-shadow: var(--shadow-elevated); - } - - input, - textarea, - select { - background: var(--elevated); - color: var(--text); - font-family: inherit; - border-radius: var(--radii-small); - border: 0; - font-size: inherit; - padding: var(--spacing-2); - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - } - - input::-webkit-input-placeholder, - input::-moz-placeholder, - input:-ms-input-placeholder, - textarea::-webkit-input-placeholder, - textarea::-moz-placeholder, - textarea:-ms-input-placeholder, - select::-webkit-input-placeholder, - select::-moz-placeholder, - select:-ms-input-placeholder { - color: var(--muted); - } - - input[type="search"]::-webkit-search-decoration, - textarea[type="search"]::-webkit-search-decoration, - select[type="search"]::-webkit-search-decoration { - display: none; - } - - input[type="checkbox"] { - -webkit-appearance: checkbox; - -moz-appearance: checkbox; - appearance: checkbox; - } - - label { - color: var(--text); - display: flex; - flex-direction: column; - text-align: left; - line-height: var(--line-height-caption); - font-size: var(--font-3); - } - - label.horizontal { - display: flex; - } - - .slider { - color: var(--primary); - } - - .form-hidden { - position: absolute; - height: 1px; - width: 1px; - clip: rect(1px, 1px, 1px, 1px); - white-space: nowrap; - } - - .container { - width: 100%; - margin: auto; - padding-left: var(--spacing-3); - padding-right: var(--spacing-3); - } - - h1 { - font-size: var(--font-5); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; - } - - h2 { - font-size: var(--font-4); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; - } - - h3 { - font-size: var(--font-3); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; - } - - h4 { - font-size: var(--font-2); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; - } - - h5 { - font-size: var(--font-1); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; - } - - h6 { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; - } - - p { - color: var(--text); - font-weight: var(--font-weight-body); - line-height: var(--line-height-body); - margin-top: var(--spacing-3); - margin-bottom: var(--spacing-3); - } - - img { - max-width: 100%; - } - - hr { - border: 0; - border-bottom: 1px solid var(--border); - } - - a { - color: var(--primary); - text-decoration: underline; - text-underline-position: under; - } - - a:focus, - a:hover { - text-decoration-style: wavy; - text-decoration-skip-ink: none; - } - - pre { - font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; - font-size: var(--font-1); - padding: var(--spacing-3); - color: var(--text); - background: var(--sunken); - overflow: auto; - border-radius: var(--radii-default); - white-space: inherit; - } - - pre > code { - color: inherit; - margin-left: 0; - margin-right: 0; - padding-left: 0; - padding-right: 0; - } - - code { - font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; - font-size: inherit; - color: var(--purple); - background: var(--sunken); - overflow: auto; - border-radius: var(--radii-small); - margin-left: var(--spacing-1); - margin-right: var(--spacing-1); - padding-left: var(--spacing-1); - padding-right: var(--spacing-1); - } - - p > code, - li > code { - color: var(--blue); - font-size: 0.875em; - } - - p > a > code, - li > a > code { - color: var(--blue); - font-size: 0.875em; - } - - li { - margin-top: var(--spacing-2); - margin-bottom: var(--spacing-2); - } - - table { - width: 100%; - margin-top: var(--spacing-4); - margin-bottom: var(--spacing-4); - border-collapse: separate; - border-spacing: 0; - } - - table > th, - table > td { - text-align: left; - padding: 4px; - padding-left: 0px; - border-color: var(--border); - border-bottom-style: solid; - } - - th { - vertical-align: bottom; - border-bottom-width: 2px; - } - - td { - vertical-align: top; - border-bottom-width: 1px; - } - - - @media screen and (min-width: 32em) { - .ultratitle { - font-size: var(--font-5); - } - .title { - font-size: var(--font-4); - } - .subtitle { - font-size: var(--font-2); - } - .eyebrow { - font-size: var(--font-3); - } - .lead { - font-size: var(--font-2); - margin-top: var(--spacing-2); - margin-bottom: var(--spacing-2); - } - .card { - padding: var(--spacing-3); - } - .container { - max-width: var(--size-layout); - } - .container.copy { - max-width: var(--size-copy); - } - .container.narrow { - max-width: var(--size-narrow); - } - } - - @media screen and (min-width: 48em) { - .ultratitle { - font-size: var(--font-6); - } - .title { - font-size: var(--font-5); - } - .subtitle { - font-size: var(--font-3); - } - .eyebrow { - font-size: var(--font-4); - } - .lead { - font-size: var(--font-3); - margin-top: var(--spacing-3); - margin-bottom: var(--spacing-3); - } - .card { - padding: var(--spacing-4); - } - } - - @media screen and (min-width: 64em) { - .ultratitle { - font-size: var(--font-7); - } - .title { - font-size: var(--font-6); - } - .container { - max-width: var(--size-layout-plus); - } - .container.wide { - max-width: var(--size-wide); - } - .container.copy { - max-width: var(--size-copy-plus); - } - .container.narrow { - max-width: var(--size-narrow-plus); - } - } - \ No newline at end of file +/* modified version of https://css.hackclub.com/theme.css */ +:root { + /* why are the css vars swapped with incorrect names? well im to lazy to fix it. */ + --darker: #121217; + --dark: #f9fafc; + --darkless: #e0e6ed; + --black: #fff; + --steel: #273444; + --slate: #3c4858; + --muted: #8492a6; + --smoke: #252429; + --snow: #17171d; + --white: #1f2d3d; + --red: #ec3750; + --orange: #ff8c37; + --yellow: #f1c40f; + --green: #33d6a6; + --cyan: #5bc0de; + --blue: #338eda; + --purple: #a633d6; + --text: var(--black); + --background: var(--white); + --elevated: var(--white); + --sheet: var(--snow); + --sunken: var(--smoke); + --border: var(--smoke); + --primary: #ec3750; + --secondary: #8492a6; + --accent: #5bc0de; + --twitter: #1da1f2; + --facebook: #3b5998; + --instagram: #e1306c; + --breakpoint-xs: 32em; + --breakpoint-s: 48em; + --breakpoint-m: 64em; + --breakpoint-l: 96em; + --breakpoint-xl: 128em; + --spacing-0: 0px; + --spacing-1: 4px; + --spacing-2: 8px; + --spacing-3: 16px; + --spacing-4: 32px; + --spacing-5: 64px; + --spacing-6: 128px; + --spacing-7: 256px; + --spacing-8: 512px; + --font-1: 12px; + --font-2: 16px; + --font-3: 20px; + --font-4: 24px; + --font-5: 32px; + --font-6: 48px; + --font-7: 64px; + --font-8: 96px; + --font-9: 128px; + --font-10: 160px; + --font-11: 192px; + --line-height-limit: 0.875; + --line-height-title: 1; + --line-height-heading: 1.125; + --line-height-subheading: 1.25; + --line-height-caption: 1.375; + --line-height-body: 1.5; + --font-weight-body: 400; + --font-weight-bold: 700; + --font-weight-heading: var(--font-weight-bold); + --letter-spacing-title: -0.009em; + --letter-spacing-headline: 0.009em; + --size-wide-plus: 2048px; + --size-wide: 1536px; + --size-layout-plus: 1200px; + --size-layout: 1024px; + --size-copy-ultra: 980px; + --size-copy-plus: 768px; + --size-copy: 680px; + --size-narrow-plus: 600px; + --size-narrow: 512px; + --radii-small: 4px; + --radii-default: 8px; + --radii-extra: 12px; + --radii-ultra: 16px; + --radii-circle: 99999px; + --shadow-text: 0 1px 2px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.125); + --shadow-small: 0 1px 2px rgba(0, 0, 0, 0.0625), + 0 2px 4px rgba(0, 0, 0, 0.0625); + --shadow-card: 0 4px 8px rgba(0, 0, 0, 0.125); + --shadow-elevated: 0 1px 2px rgba(0, 0, 0, 0.0625), + 0 8px 12px rgba(0, 0, 0, 0.125); +} + +body { + font-family: + "Phantom Sans", + system-ui, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + sans-serif; + line-height: var(--line-height-body); + font-weight: var(--font-weight-body); + margin: 0; + min-height: 100vh; + text-rendering: optimizeLegibility; + font-smooth: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + color: var(--text); + background-color: var(--background); + box-sizing: border-box; +} + +* { + box-sizing: border-box; +} + +.monospace { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; +} + +.heading { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; +} + +.ultratitle { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-limit); + letter-spacing: var(--letter-spacing-title); +} + +.title { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-title); + letter-spacing: var(--letter-spacing-title); +} + +.subtitle { + margin-top: var(--spacing-3); + font-weight: var(--font-weight-body); + line-height: var(--line-height-subheading); + letter-spacing: var(--letter-spacing-headline); +} + +.headline { + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); + font-size: var(--font-4); + line-height: var(--line-height-heading); + letter-spacing: var(--letter-spacing-headline); +} + +.subheadline { + margin-top: var(--spacing-0); + margin-bottom: var(--spacing-3); + font-size: var(--font-2); + line-height: var(--line-height-heading); + letter-spacing: var(--letter-spacing-headline); +} + +.eyebrow { + color: var(--muted); + font-weight: var(--font-weight-heading); + letter-spacing: var(--letter-spacing-headline); + line-height: var(--line-height-subheading); + text-transform: uppercase; + margin-top: var(--spacing-0); + margin-bottom: var(--spacing-2); +} + +.lead { + font-weight: var(--font-weight-body); +} + +.caption { + color: var(--muted); + font-weight: var(--font-weight-body); + letter-spacing: var(--letter-spacing-headline); + line-height: var(--line-height-caption); +} + +.pill { + border-radius: var(--radii-circle); + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); + padding-top: var(--spacing-1); + padding-bottom: var(--spacing-1); + font-size: var(--font-2); + background: var(--primary); + color: var(--background); + font-weight: var(--font-weight-bold); +} + +.outline-badge { + border-radius: var(--radii-circle); + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); + padding-top: var(--spacing-1); + padding-bottom: var(--spacing-1); + font-size: var(--font-2); + background: none; + color: var(--muted); + border: 1px solid currentcolor; + font-weight: var(--font-weight-body); +} + +button { + cursor: pointer; + font-family: inherit; + font-weight: var(--font-weight-bold); + border-radius: var(--radii-circle); + display: inline-flex; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-card); + letter-spacing: var(--letter-spacing-headline); + -webkit-tap-highlight-color: transparent; + transition: + transform 0.125s ease-in-out, + box-shadow 0.125s ease-in-out; + box-sizing: border-box; + margin: 0; + min-width: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + line-height: inherit; + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + padding-bottom: 8px; + color: var(--theme-ui-colors-white, #ffffff); + background-color: var(--theme-ui-colors-primary, #ec3750); + border: 0; + font-size: var(--font-2); +} + +button:focus, +button:hover { + box-shadow: var(--shadow-elevated); + transform: scale(1.0625); +} +.button { + cursor: pointer; + font-family: inherit; + font-weight: var(--font-weight-bold); + border-radius: var(--radii-circle); + display: inline-flex; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-card); + letter-spacing: var(--letter-spacing-headline); + -webkit-tap-highlight-color: transparent; + transition: + transform 0.125s ease-in-out, + box-shadow 0.125s ease-in-out; + box-sizing: border-box; + margin: 0; + min-width: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + line-height: inherit; + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + padding-bottom: 8px; + color: var(--theme-ui-colors-white, #ffffff); + background-color: var(--theme-ui-colors-primary, #ec3750); + border: 0; + font-size: var(--font-2); +} + +.button:focus, +.button:hover { + box-shadow: var(--shadow-elevated); + transform: scale(1.0625); +} +button.lg { + font-size: var(--font-3) !important; + line-height: var(--line-height-title); + padding-left: var(--spacing-4); + padding-right: var(--spacing-4); + padding-top: var(--spacing-3); + padding-bottom: var(--spacing-3); +} + +button.outline { + background: none; + color: var(--primary); + border: 2px solid currentcolor; +} + +button.cta { + font-size: var(--font-2); + background-image: radial-gradient( + ellipse farthest-corner at top left, + var(--orange), + var(--red) + ); +} + +.card { + background: var(--elevated); + color: var(--text); + border-radius: var(--radii-extra); + box-shadow: var(--shadow-card); + overflow: hidden; +} + +.card.sunken { + background: var(--sunken); + box-shadow: none; +} + +.card.interactive { + text-decoration: none; + -webkit-tap-highlight-color: transparent; + transition: + transform 0.125s ease-in-out, + box-shadow 0.125s ease-in-out; +} + +.card.interactive:hover, +.card.interactive:focus { + transform: scale(1.0625); + box-shadow: var(--shadow-elevated); +} + +input, +textarea, +select { + background: var(--elevated); + color: var(--text); + font-family: inherit; + border-radius: var(--radii-small); + border: 0; + font-size: inherit; + padding: var(--spacing-2); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +input::-webkit-input-placeholder, +input::-moz-placeholder, +input:-ms-input-placeholder, +textarea::-webkit-input-placeholder, +textarea::-moz-placeholder, +textarea:-ms-input-placeholder, +select::-webkit-input-placeholder, +select::-moz-placeholder, +select:-ms-input-placeholder { + color: var(--muted); +} + +input[type="search"]::-webkit-search-decoration, +textarea[type="search"]::-webkit-search-decoration, +select[type="search"]::-webkit-search-decoration { + display: none; +} + +input[type="checkbox"] { + -webkit-appearance: checkbox; + -moz-appearance: checkbox; + appearance: checkbox; +} + +label { + color: var(--text); + display: flex; + flex-direction: column; + text-align: left; + line-height: var(--line-height-caption); + font-size: var(--font-3); +} + +label.horizontal { + display: flex; +} + +.slider { + color: var(--primary); +} + +.form-hidden { + position: absolute; + height: 1px; + width: 1px; + clip: rect(1px, 1px, 1px, 1px); + white-space: nowrap; +} + +.container { + width: 100%; + margin: auto; + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); +} + +h1 { + font-size: var(--font-5); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; +} + +h2 { + font-size: var(--font-4); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; +} + +h3 { + font-size: var(--font-3); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; +} + +h4 { + font-size: var(--font-2); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; +} + +h5 { + font-size: var(--font-1); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; +} + +h6 { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; +} + +p { + color: var(--text); + font-weight: var(--font-weight-body); + line-height: var(--line-height-body); + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); +} + +img { + max-width: 100%; +} + +hr { + border: 0; + border-bottom: 1px solid var(--border); +} + +a { + color: var(--primary); + text-decoration: underline; + text-underline-position: under; +} + +a:focus, +a:hover { + text-decoration-style: wavy; + text-decoration-skip-ink: none; +} + +pre { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; + font-size: var(--font-1); + padding: var(--spacing-3); + color: var(--text); + background: var(--sunken); + overflow: auto; + border-radius: var(--radii-default); + white-space: inherit; +} + +pre > code { + color: inherit; + margin-left: 0; + margin-right: 0; + padding-left: 0; + padding-right: 0; +} + +code { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; + font-size: inherit; + color: var(--purple); + background: var(--sunken); + overflow: auto; + border-radius: var(--radii-small); + margin-left: var(--spacing-1); + margin-right: var(--spacing-1); + padding-left: var(--spacing-1); + padding-right: var(--spacing-1); +} + +p > code, +li > code { + color: var(--blue); + font-size: 0.875em; +} + +p > a > code, +li > a > code { + color: var(--blue); + font-size: 0.875em; +} + +li { + margin-top: var(--spacing-2); + margin-bottom: var(--spacing-2); +} + +table { + width: 100%; + margin-top: var(--spacing-4); + margin-bottom: var(--spacing-4); + border-collapse: separate; + border-spacing: 0; +} + +table > th, +table > td { + text-align: left; + padding: 4px; + padding-left: 0px; + border-color: var(--border); + border-bottom-style: solid; +} + +th { + vertical-align: bottom; + border-bottom-width: 2px; +} + +td { + vertical-align: top; + border-bottom-width: 1px; +} + +@media screen and (min-width: 32em) { + .ultratitle { + font-size: var(--font-5); + } + .title { + font-size: var(--font-4); + } + .subtitle { + font-size: var(--font-2); + } + .eyebrow { + font-size: var(--font-3); + } + .lead { + font-size: var(--font-2); + margin-top: var(--spacing-2); + margin-bottom: var(--spacing-2); + } + .card { + padding: var(--spacing-3); + } + .container { + max-width: var(--size-layout); + } + .container.copy { + max-width: var(--size-copy); + } + .container.narrow { + max-width: var(--size-narrow); + } +} + +@media screen and (min-width: 48em) { + .ultratitle { + font-size: var(--font-6); + } + .title { + font-size: var(--font-5); + } + .subtitle { + font-size: var(--font-3); + } + .eyebrow { + font-size: var(--font-4); + } + .lead { + font-size: var(--font-3); + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); + } + .card { + padding: var(--spacing-4); + } +} + +@media screen and (min-width: 64em) { + .ultratitle { + font-size: var(--font-7); + } + .title { + font-size: var(--font-6); + } + .container { + max-width: var(--size-layout-plus); + } + .container.wide { + max-width: var(--size-wide); + } + .container.copy { + max-width: var(--size-copy-plus); + } + .container.narrow { + max-width: var(--size-narrow-plus); + } +} From 70d44be46308e1fdb4a3373363e056f3cae251a5 Mon Sep 17 00:00:00 2001 From: Saahil Date: Sat, 12 Oct 2024 23:30:33 -0400 Subject: [PATCH 19/37] update(project): finish up + ready for prod --- hackclub-spotify-bot/TODO.md | 6 ++-- hackclub-spotify-bot/src/index.js | 32 +++++++++++++++++++- hackclub-spotify-bot/src/public/hackclub.css | 9 ++++++ hackclub-spotify-bot/src/views/home.ejs | 21 +++++++++---- 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/hackclub-spotify-bot/TODO.md b/hackclub-spotify-bot/TODO.md index 7bf6c50..d3c0890 100644 --- a/hackclub-spotify-bot/TODO.md +++ b/hackclub-spotify-bot/TODO.md @@ -4,12 +4,12 @@ - - [x] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth) - - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B) - - - [x] Add ping for new-song event & send message ovs -- [ ] Spotify +- [x] Spotify - - [x] web api [docs](https://developer.spotify.com/documentation/web-api/) - - [x] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/) - - [x] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token) - - [x] playlist tools (creation,modifcation,deletion) - [x] keydb (quick db or smthing) - [x] express -- [ ] transparency of added songs -- - [ ] export db -> into csv with properties (slack_id, url, added_at) +- [x] transparency of added songs +- - [x] export db -> into csv with properties (slack_id, url, added_at) diff --git a/hackclub-spotify-bot/src/index.js b/hackclub-spotify-bot/src/index.js index 98dca8d..be64aaf 100644 --- a/hackclub-spotify-bot/src/index.js +++ b/hackclub-spotify-bot/src/index.js @@ -17,6 +17,17 @@ const { QuickDB } = require("quick.db"); const db = new QuickDB({ filePath: "./data/songs.sqlite", }); + +function arrayToCsv(data){ + return data.map(row => + row + .map(String) // convert every value to String + .map(v => v.replaceAll('"', '""')) // escape double quotes + .map(v => `"${v}"`) // quote it + .join(',') // comma-separated + ).join('\r\n'); // rows starting on new lines +} + let cacheDb = {}; const app = express(); const userScopes = ["identity.avatar", "identity.basic", "identity.team"]; @@ -69,7 +80,7 @@ app.use( path: path.join(__dirname, "../data/sessions"), }), saveUninitialized: true, - cookie: { secure: "auto", maxAge: 1000 * 60 * 60 * 24 * 365 }, + cookie: { secure: "auto", maxAge: 1000 * 60 * 60 * 24 * 7 }, }), ); @@ -157,6 +168,18 @@ app.get("/home", async (req, res) => { s: req.query.s, }); }); +app.get('/download/db', async (req,res) => { + if(!req.session.info) return res.redirect("/login") + const allSongs = await db.all(); +const csvData = arrayToCsv([["slack_id", "url","song_id", "added_at"], +...allSongs.map(d => { + return [d.value.added_by, d.value.song_url, d.id, d.value.added_at] +}) +]) +res.setHeader('Content-Type', 'text/csv'); +res.setHeader('Content-Disposition', 'attachment; filename="songs.csv"'); +res.send(csvData); +}) app.post("/spotify/submitsong", async (req, res) => { if (!req.session.token) return res.redirect("/login"); if (!cacheDb[req.query.token]) return res.redirect(`/home?error=0`); @@ -230,3 +253,10 @@ app.listen(process.env.PORT || 3000, async () => { // if(!await db.has()) if (getCredentials() !== null) refreshToken(getCredentials().refresh_token); }); + +process.on('uncaughtException', function(err) { + console.log(err); +}); +process.on('unhandledRejection', function(err) { + console.log(err); +}); \ No newline at end of file diff --git a/hackclub-spotify-bot/src/public/hackclub.css b/hackclub-spotify-bot/src/public/hackclub.css index feb83cb..ca397f2 100644 --- a/hackclub-spotify-bot/src/public/hackclub.css +++ b/hackclub-spotify-bot/src/public/hackclub.css @@ -633,3 +633,12 @@ td { max-width: var(--size-narrow-plus); } } +/* custom additions */ +.error { + color: var(--red); + font-weight: bold; +} +.success { + color: var(--green); + font-weight: bold; +} \ No newline at end of file diff --git a/hackclub-spotify-bot/src/views/home.ejs b/hackclub-spotify-bot/src/views/home.ejs index e3d4601..54fba58 100644 --- a/hackclub-spotify-bot/src/views/home.ejs +++ b/hackclub-spotify-bot/src/views/home.ejs @@ -23,18 +23,21 @@

Submit Song

-
+
- +
<% if (s) { %> + +

Success!

-

Your song has been added to the playlist!

+

Your song has been added to the playlist!

+

refreshing page in 5s


<% } %> @@ -46,16 +49,22 @@ <% } %>
- +

-
From 7d50117f95c67139e5350d0f715f2417e8814c85 Mon Sep 17 00:00:00 2001 From: Saahil Date: Sat, 12 Oct 2024 23:32:22 -0400 Subject: [PATCH 20/37] qf: add playlist url --- hackclub-spotify-bot/src/views/home.ejs | 2 +- hackclub-spotify-bot/src/views/index.ejs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hackclub-spotify-bot/src/views/home.ejs b/hackclub-spotify-bot/src/views/home.ejs index 54fba58..75336fa 100644 --- a/hackclub-spotify-bot/src/views/home.ejs +++ b/hackclub-spotify-bot/src/views/home.ejs @@ -61,9 +61,9 @@ -

The "Download all song entries" button includes all songs submited thru the form (even if removed from the playlist)

+ Check out the playlist diff --git a/hackclub-spotify-bot/src/views/index.ejs b/hackclub-spotify-bot/src/views/index.ejs index 39698a6..2357ae7 100644 --- a/hackclub-spotify-bot/src/views/index.ejs +++ b/hackclub-spotify-bot/src/views/index.ejs @@ -30,6 +30,7 @@ From aa73856b49134a6156c0fd2ab188bee286405795 Mon Sep 17 00:00:00 2001 From: Zeon Date: Sun, 13 Oct 2024 04:08:44 +0000 Subject: [PATCH 21/37] chore(ci): automated push --- .bash_history | 20 - .config/caddy/autosave.json | 2 +- .gitignore | 2 + .lesshst | 1 + Caddyfile | 2 + Mail/Drafts/dovecot-uidlist | 1 + Mail/Drafts/dovecot.index.cache | Bin 0 -> 1520 bytes Mail/Drafts/dovecot.index.log | Bin 0 -> 1124 bytes Mail/Sent/dovecot-uidlist | 1 + Mail/Sent/dovecot.index.log | Bin 0 -> 336 bytes Mail/Trash/dovecot-uidlist | 1 + Mail/Trash/dovecot.index.log | Bin 0 -> 40 bytes .../1728622962.V801Ice2bb5M356397.nest:2,S | 66 +++ .../1728689485.V801Icf3e1cM345536.nest:2,S | 501 ++++++++++++++++++ Mail/dovecot-uidlist | 3 + Mail/dovecot-uidvalidity | 1 + Mail/dovecot-uidvalidity.670aa579 | 0 Mail/dovecot.index.cache | Bin 0 -> 2008 bytes Mail/dovecot.index.log | Bin 0 -> 480 bytes Mail/dovecot.list.index.log | Bin 0 -> 2372 bytes sent/cur/1728689575.2987466_1.nest:2,S | 157 ++++++ 21 files changed, 737 insertions(+), 21 deletions(-) delete mode 100644 .bash_history create mode 100644 .lesshst create mode 100644 Mail/Drafts/dovecot-uidlist create mode 100644 Mail/Drafts/dovecot.index.cache create mode 100644 Mail/Drafts/dovecot.index.log create mode 100644 Mail/Sent/dovecot-uidlist create mode 100644 Mail/Sent/dovecot.index.log create mode 100644 Mail/Trash/dovecot-uidlist create mode 100644 Mail/Trash/dovecot.index.log create mode 100644 Mail/cur/1728622962.V801Ice2bb5M356397.nest:2,S create mode 100644 Mail/cur/1728689485.V801Icf3e1cM345536.nest:2,S create mode 100644 Mail/dovecot-uidlist create mode 100644 Mail/dovecot-uidvalidity create mode 100644 Mail/dovecot-uidvalidity.670aa579 create mode 100644 Mail/dovecot.index.cache create mode 100644 Mail/dovecot.index.log create mode 100644 Mail/dovecot.list.index.log create mode 100644 sent/cur/1728689575.2987466_1.nest:2,S diff --git a/.bash_history b/.bash_history deleted file mode 100644 index 17e76d8..0000000 --- a/.bash_history +++ /dev/null @@ -1,20 +0,0 @@ -cat .config/systemd/user/caddy.service -screen -htop -free -m -h -quota -quota -h -ls -du -h -neofetch -ls -a -htop -free -m -h -ls -nest resources -ls -mutt -ls Mail/ -mutt -ls -a -exit diff --git a/.config/caddy/autosave.json b/.config/caddy/autosave.json index ba0a9ef..85bf901 100644 --- a/.config/caddy/autosave.json +++ b/.config/caddy/autosave.json @@ -1 +1 @@ -{"admin":{"listen":"unix//home/neon/caddy-admin.sock"},"apps":{"http":{"servers":{"srv0":{"automatic_https":{"skip":["neon.hackclub.app"]},"listen":["unix/.webserver.sock|777"],"routes":[{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"vars","root":"/home/neon/pub"},{"handler":"file_server","hide":[".git",".env","/home/neon/Caddyfile"]}]}]}],"match":[{"host":["neon.hackclub.app"]}],"terminal":true}]}}}}} \ No newline at end of file +{"admin":{"listen":"unix//home/neon/caddy-admin.sock"},"apps":{"http":{"servers":{"srv0":{"automatic_https":{"skip":["spotify.hackclub.app"]},"listen":["unix/.spotify.neon.hackclub.app.webserver.sock|777"],"routes":[{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"reverse_proxy","upstreams":[{"dial":"localhost:38275"}]}]}]}],"match":[{"host":["spotify.hackclub.app"]}],"terminal":true}]},"srv1":{"automatic_https":{"skip":["neon.hackclub.app"]},"listen":["unix/.webserver.sock|777"],"routes":[{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"vars","root":"/home/neon/pub"},{"handler":"file_server","hide":[".git",".env","/home/neon/Caddyfile"]}]}]}],"match":[{"host":["neon.hackclub.app"]}],"terminal":true}]}}}}} \ No newline at end of file diff --git a/.gitignore b/.gitignore index c17c45f..868d4f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ *.sock +.npm .config/git .config/pulse # tokens +.config/caddy Mail # mail sent to neon@hackclub.app is here sent # all sent mail is there .bun diff --git a/.lesshst b/.lesshst new file mode 100644 index 0000000..4d1c30b --- /dev/null +++ b/.lesshst @@ -0,0 +1 @@ +.less-history-file: diff --git a/Caddyfile b/Caddyfile index 12182d2..356ebc4 100644 --- a/Caddyfile +++ b/Caddyfile @@ -9,3 +9,5 @@ http://neon.hackclub.app { } } + + diff --git a/Mail/Drafts/dovecot-uidlist b/Mail/Drafts/dovecot-uidlist new file mode 100644 index 0000000..b953224 --- /dev/null +++ b/Mail/Drafts/dovecot-uidlist @@ -0,0 +1 @@ +3 V1728750967 N2 G18d9130f76a50a67b7da1e0005844d15 diff --git a/Mail/Drafts/dovecot.index.cache b/Mail/Drafts/dovecot.index.cache new file mode 100644 index 0000000000000000000000000000000000000000..c723581082d249b3010ed93d042d2175016ff2f2 GIT binary patch literal 1520 zcmdT^%Wl&^6umA5s)7WRcM)i078D6vw&Rw>LWneR(x5a&iMwDqv8Rc_PK-T?D61@3 z@FVQ`DZT^ljP15W?V?Mra^~FE+>Cu}D{BhOf3A<7Zrm8HKyKd^0Q|vXvG{@bJ;dNP z#-gWak+dA2t)1tuVsZ^3xb#K*XURluDJ8=zmc{GE#wMt6wy%z0p(23 z*o5a^%6t~iSy1HZoIw_TWBNQy`HV(+kc^MB(8nl@X`&CO!SSh=@pR_%S<3Pho6K1> zO&BE8q@vHlAj-XI8n6^bn1DEpnV!&;XD|#WG(9c@oU3P(Fi9APaggdwJZf=vaesvo zxdMDaF`l4b-s5E!ZDp?5BI(%~jYR!2C^ZpW`j^q?Jk2i3Eo-@YYKnaLKw021P-0a2 z#Qsl(h19!^hLpUZR{vmM#_j!jr>ix(9k=Ic&3?V*X`SXp6>qQa)|+KRr>FJZ58aQN zcOWu@@F>-qxm_`9 zrio{`hx=T_H8B9~oEhFYWi*hZc<$mftx~m2v$k#9R@JCk_I9OO!*Ot5P62pO@WX;1 z75o@kTxa>+9L$EFn9m)8n>UM|>&R_{%Gp=05_QbuNF`gUKc;EMMCQ2X2q^$5zQ}o0uorqALGOywhuVW2-p#CSnV*huB2@ggq~~lZWuWV3Ga{vvY~^ literal 0 HcmV?d00001 diff --git a/Mail/Drafts/dovecot.index.log b/Mail/Drafts/dovecot.index.log new file mode 100644 index 0000000000000000000000000000000000000000..a2f6427abd14c73845526442811b937806d58d42 GIT binary patch literal 1124 zcmb7DJxc>Y5S>ddcqWRcRS<;;7Dk9DT3B8!3KoK57n6`2#3o7<3pw!gh=>Gi6l_FN zi=Dq9Kf!-tXJH}go88+@Jd)xzBs(+vX5M_oNG?#blddMHcUU(^2y41B1=4GgFx=$9(@vO+@9^{d8d!zQAAQ5Hm|AodCOu zo8!YSc=seGaDag*PLEgk59FH#H-9^?FO%v%fVYb4Ncmqq9NfgmpcIvgrCLQ|d=K0l z1FH6ijb$JGv$WS9lpuVksf9J^=8&&B1q>Oqhvw&@XR1qx%ojzym+gmvy{C zW;o6H+Pm*|J5DN!Ox+72lcnn0Mv4cG)2B#56iH{-hn7L z>v!%}ei-*yQt$-r56L~(JzvTEJk;8S-EMt<<5}gfE%Ui{kh9u>u*_a?7lAc&6H)% TiF06i>GLTW{+BgR83X(SlS +X-Original-To: neon@hackclub.app +Delivered-To: neon@hackclub.app +Received: from m239-4.eu.mailgun.net (m239-4.eu.mailgun.net [185.250.239.4]) + (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) + key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) + (No client certificate requested) + by hackclub.app (Postfix) with UTF8SMTPS id 3F1BEE85D7 + for ; Fri, 11 Oct 2024 05:02:42 +0000 (UTC) +DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.weatherapi.com; q=dns/txt; s=k1; t=1728622961; x=1728630161; + h=Content-Transfer-Encoding: Content-Type: Subject: Subject: Date: To: To: From: From: MIME-Version: Message-Id: Sender: Sender; + bh=mSrv7WhQhngUfj566gxykiEIW79P17ej3NkcB5715no=; + b=cFopQ9YDTubNYFTgM8xu7fyzboD+B0nik+7y+nNTIfIG8s7loyd+9+FxAR9incN2M6YgJpsJN5uBXsI86fLlWBp9GE5rzCl4cm+2sCuXyYKVZG1vqQLq1J46HTKFN2tyz5W80837Hdt6sPbY9d1zCWEeZ3P+FXyOkvhQYGHAlOAendDT2Sot7D1+WZr+tWkF9Y5D+OoQcV6y9AmMlhR5i+wVfbzNs335C2T4xMKzZtCI8WbYnHMDH1N8kdD4N0Sj+0bhuq53SudkFilq/aZrUQTZRfCxQOdEgWJ5tk0waazOCgZz0GJKhHMxZAD3XDzud3MeYLrGDyIPIlKteVJEPQ== +X-Mailgun-Sending-Ip: 185.250.239.4 +X-Mailgun-Sending-Ip-Pool-Name: +X-Mailgun-Sending-Ip-Pool: +X-Mailgun-Sid: WyI4MTg0ZSIsIm5lb25AaGFja2NsdWIuYXBwIiwiYTY5ZWYiXQ== +Received: from dev-debian (83-136-248-35.uk-lon1.upcloud.host [83.136.248.35]) by + 5d4688fc3e3d with SMTP id 6708b170933e289d25aef24c; Fri, 11 Oct 2024 05:02:40 + GMT +Sender: support=weatherapi.com@mg.weatherapi.com +Message-Id: <20241011050240.947bcdb41ac1c8a5@mg.weatherapi.com> +MIME-Version: 1.0 +From: "WeatherAPI.com Team" +To: neon@hackclub.app +Date: 11 Oct 2024 05:00:10 +0000 +Subject: Weather API Trial Ended - WeatherAPI.com +Content-Type: text/html; charset=us-ascii +Content-Transfer-Encoding: quoted-printable + +
=0D=0A
Hello,
=0D=0A = +
=0D=0A
Your Weather API trial period has now come t= +o an end and therefore, your API key (listed below) has now been = +switched to Free plan.
=0D=0A
=0D=0A -----------= +-----------------------------------------------------------------= +--------=0D=0A
=0D=0A API Key: d4968db************=0D=0A= +
=0D=0A ---------------------------------------------= +---------------------------------------=0D=0A

=0D=0A= +
If you would like to upgrade then please login into your= + account and choose a paid plan.
=0D=0A =0D=0A = +

=0D=0A
Thanks,
=0D=0A
=0D=0A = +
=0D=0A
WeatherAPI.com Team

=0D=0A <= +div>http= +s://www.weatherapi.com
=0D=0A
=0D=0A
Follow us:-
=0D=0A facebook: https://www.facebo= +ok.com/weatherapidev
=0D=0A twitter: https://twitter.= +com/weatherapidev
=0D=0A
=0D=0A
=0D=0A= +
=0D=0A The information contained in this message = +is confidential and may be legally privileged. The message is int= +ended solely for the addressee(s). If you are not the intended re= +cipient, you are hereby notified that any use, dissemination or r= +eproduction is strictly prohibited and may be unlawful. If you ar= +e not the intended recipient, please contact the sender by e-mail= + and destroy all copies of the original message.=0D=0A
=0D=0A= +

=0D=0A
=0D=0A WeatherAPI.com is a br= +and name of Oplao FZCO, Dubai Silicon Oasis, Dubai Digital Park, = +Building A1, Dubai. Registered in Dubai. License number 17552.=0D=0A= +
=0D=0A

=0D=0A
You are rece= +iving this email because you registered for an API account on our= + website WeatherAPI.com.
=0D=0A + diff --git a/Mail/cur/1728689485.V801Icf3e1cM345536.nest:2,S b/Mail/cur/1728689485.V801Icf3e1cM345536.nest:2,S new file mode 100644 index 0000000..f983189 --- /dev/null +++ b/Mail/cur/1728689485.V801Icf3e1cM345536.nest:2,S @@ -0,0 +1,501 @@ +Return-Path: +X-Original-To: neon@hackclub.app +Delivered-To: neon@hackclub.app +Received: from o32.em.spotify.com (o32.em.spotify.com [149.72.28.14]) + (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) + key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) + (No client certificate requested) + by hackclub.app (Postfix) with ESMTPS id B9ACEE85D6 + for ; Fri, 11 Oct 2024 23:31:24 +0000 (UTC) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spotify.com; + h=content-type:from:mime-version:subject:to:cc:content-type:from: + subject:to; + s=s1; bh=r+lS2/DldX/eY4WuLpzwPwVunbuCFxnVTWmLDwXYfHQ=; + b=D1PMPtDMP0CSyRIkE9GBOgNbDE+6zB5SMRnAMvvpfNbTW6yWlfbH1r5Bq0PEYj4r4/FM + w1nQtwVCNQ2lmwpZo7Ta2Hc4qQ2XesFXQJmUMIpVb1pZf+6nHTuNBRNLd8TJxPoc+DhMvd + hiSCZ0YgGdQiVj3FjI0g1OHB05lh/c818YwK9nG8slkuilYsfBvuOnnvF8r+9vLcey5WyU + jdvSEEeALhrg2KI4wa75pOSZQn3+3IVTPcuXcoZz2cWIAVQYHPbX78lwEP1xUoXKD9M2dv + MSaTAlY9KnDUXrgICObPVG14oNcKmOLMPqtX43f0CrZxkv86qZjGMaW2KwxySdow== +Received: by recvd-6b9dcc67d6-kltlw with SMTP id recvd-6b9dcc67d6-kltlw-1-6709B54A-28 + 2024-10-11 23:31:22.701905387 +0000 UTC m=+2525582.225999003 +Received: from NDgxNTgyMQ (unknown) + by geopod-ismtpd-3 (SG) with HTTP + id vk3fvwJtS5Ka5BO8SDrw-Q + Fri, 11 Oct 2024 23:31:22.695 +0000 (UTC) +Content-Type: multipart/alternative; boundary=a61f29a7f8e81fff39b4a1af2262619d30218c584e7e24e6e4c09e8d225f +Date: Fri, 11 Oct 2024 23:31:22 +0000 (UTC) +From: Spotify +Mime-Version: 1.0 +Message-ID: +Subject: Confirm your email address +X-SG-EID: + =?us-ascii?Q?u001=2EZD5aH33R6V7weoiTHIdZyDuP+A6pZLQL0nRW+xTj31Msb5xf5uAbZIKpG?= + =?us-ascii?Q?ToelTWVR8rVonvMrj0NERWIakIdZEPz=2F1M6Azre?= + =?us-ascii?Q?smHeeByKv03LkxdMR84frxMt2nKTxdmY2XT+k7c?= + =?us-ascii?Q?x5g8szn=2F1m1njDMMVZudL=2FdZjIA0lVAZvPeMGyX?= + =?us-ascii?Q?fpa9JRf0yRtWYwTXURO8G8PvAr0wgKYtZyG3hFb?= + =?us-ascii?Q?k9FJS+xNiF9dhS3WULlZjs=3D?= +X-SG-ID: + =?us-ascii?Q?u001=2ESdBcvi+Evd=2FbQef8eZF3BoMNuFmcP5rq+Py=2FzrrMdK5f10AXNJNhbm9x8?= + =?us-ascii?Q?lPhfP1ZAm3IL1nXkpx2GICRvSB73I6sRTx=2FkNDG?= + =?us-ascii?Q?V9zAkrUOW7eMBKsKMjmFFhZJoGGF2BuAYankN4C?= + =?us-ascii?Q?HVt6B6lYNEoFzacLUtYAZKFZrCiT6OgWpRTYMHy?= + =?us-ascii?Q?pIXvb2Xg+qDxWbvHC1stwWpUW7Hh0LLVPKdCLAp?= + =?us-ascii?Q?fX2tdDsF1tdVKQo3Bv+8UGZbAuP=2FACS+PrOM9Gk?= + =?us-ascii?Q?oAPmBqAyRnWW=2Fk1zRK59SWFtS7q4ugW7g1yb94V?= + =?us-ascii?Q?a6TNCt325Q0sIMuWGNOQPTVwmDyB1QTdO5TFW5Q?= + =?us-ascii?Q?+Kczy7iMjygq6uGH3UAsphCU9Vw46=2FsbjitZBam?= + =?us-ascii?Q?pA1Db=2FhmOxBAzWf?= +To: neon@hackclub.app +X-Entity-ID: u001.FPddaWwi2T+e322oHrHacg== + +--a61f29a7f8e81fff39b4a1af2262619d30218c584e7e24e6e4c09e8d225f +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; charset=us-ascii +Mime-Version: 1.0 + + +Keep your account secure. + + +Confirm your email address so you can always access your account and get im= +portant info from us. + + + +CONFIRM EMAIL ( https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4x= +JMKaKnYeEWqP80O6RX1DItCzt-2B8F-2FkNegH5Y5z0NFRkWYeaF90T91gX2FmXd-2BeE6e3vvG= +BIHluSK7CCr2uBMyW37kNSsb4CjXJHD-2FYnTalz2RweGJvSZhQBVvyZteskWjD-2BnCp9IzM20= +OHRbUcJHvvDbDFbEV-2Fcd9z-2BZXc0VZXVyH-2BX9JV-2FMWmenexEz43xqJz4vdw0A-3D-3DP= +DMC_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2h= +Z7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2= +Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJ= +AnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZ= +OMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4Adlhsv= +K0KqhZP51laajLwlUGaeXw-2B-2FcwkcYPIrqsd6LIowkZdqZfBMfipiOJPcOUBKGhx-2FkB6Bj= +PQsyTQLO6H8TFPfZYXRLSDUZT6CqbIq7disObe3fohzCCM0x11OlLnA7J5DAFwc0kj46FzfYDZm= +9q1nuxmiGcw-2FSFIVmPtz3Xcp-2FFdAHXyYW6CqeQOg7GtH01mfjVLhLId8u8TOYS-2BEmLaIx= +Adxw484u ) + + +If you're having trouble viewing the button above, please click this link i= +nstead. ( https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKn= +YeEWqP80O6RX1DItCzt-2B8F-2FkNegH5Y5z0NFRkWYeaF90T91gX2FmXd-2BeE6e3vvGBIHluS= +K7CCr2uBMyW37kNSsb4CjXJHD-2FYnTalz2RweGJvSZhQBVvyZteskWjD-2BnCp9IzM20OHRbUc= +JHvvDbDFbEV-2Fcd9z-2BZXc0VZXVyH-2BX9JV-2FMWmenexEz43xqJz4vdw0A-3D-3DTQu9_rS= +ILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJs= +OigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1= +FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPb= +l-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84p= +n2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZ= +P5I0VIkwlAd8hB5-2FAZs108-2F-2BGCOsj-2Bgykf-2Bvl4NcSV-2BIkeLt6IQVkyo58IkUZMS= +5eVW31OJ-2BhjrS9Rlappu4pZmT9DxQA4HWlRLw1sOWyQQQ7kqj5-2FS-2BQk-2B-2B1ygSlRLD= +MwZwzJHuYozvVBLrziN6mn4m-2B3QZXLB-2BgV4dGYISwLF-2FVzTxRpG6-2FYhzwZAVBZDmv0o= +lZvooy-2FhDbTs8RTY7kHW ) + + +------------- + +Get Spotify for: + * iPhone (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKa= +KnYXcWD5t7SznLQ7jbi9fm4wXE2-2FUTgChz-2B9dWj0RF4A-2B-2FPqhwDzYQ2q6L-2Fo36FWS= +MXw-3D-3D1-ZP_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb= +1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1s= +OGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2By= +yEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP= +8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23= +BQJ4AdlhsvK0KqhZP54mLf6z3-2F1obe9Fl1Pj7g6oHlAItNZbTFU2ICWavmAeMHSfKgZHmvA-2= +BRsAef5sc3yRP-2FJvrzov38hQXM9LLAUeT534f0w6URgv7QizPchQjtRcwMcBby7cjbDds-2Bp= +0nVic-2BgCmkg8o8-2B5nATceyuogBNkNcWcnIsCmguwV47RyG32f5deKB1tCQdzWS1mRL7SNbR= +-2FMBytJ1rWXqZ1pdsxg + * iPad (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKn= +YXcWD5t7SznLQ7jbi9fm4wXE2-2FUTgChz-2B9dWj0RF4A-2B-2FPqhwDzYQ2q6L-2Fo36FWSMX= +w-3D-3D82DE_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-= +2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOG= +aRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyE= +W7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U= +5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQ= +J4AdlhsvK0KqhZP4tmPAsUu4Q91Tn-2FOBIRUqk57farwnI2g702SZqoYIvCRhU-2FCou-2FR6t= +EwN35rWf2OqzCBZJXgOKPTnWD6xbzQgc2ybIuiTdmYI6dHn15vtqLlW62f2iAr-2FtsKbrQ89rc= +XsaLgRW-2FAuMKxGpEHNOlOiNYno2QK3mZliGdJUOntffnjEMJViCb-2FA0aosytRRXa9hhLt5d= +qe2ajkF-2F2XmdJATw + * Android (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMK= +aKnYZ7kDS6OqrlZhfX6g3CIsPG2xJ7qD5V6Nq-2Bj4HF0JYUDZLHZTku6CN8YeQdHLRil6nuNo0= +YpM2e5dOW9VCcVj98-3DBeEn_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5= +q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-= +2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3= +Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECf= +FkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf= +6X75OXhZo23BQJ4AdlhsvK0KqhZP5MBpTo-2FTlm1iqf0En0WVGqNR-2FojGGBDc11DQSNlfpyI= +jcHXDPVOObSu1mBJad-2Bx3f52L-2F0RQ7HKyssnChXIXRbQJMwlpBYgtEPrNXk0NcYjyhdEI4F= +FqDOxdIRAUHFf5j-2Fbcf1-2Bb6CjoLF-2B3N46KThUrzuMeYHqxcWGTpxC37oM8ntoaheGeI1y= +TrWKtHqJR1gKVYekypPx0ZcXVul1vT2 + * Other (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaK= +nYeEWqP80O6RX1DItCzt-2B8F-2F4J7cG5ag75VBZOT6AkehBbdKO_rSILTv32uut97hzOKlbLN= +gOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6= +jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47= +UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXp= +m-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anm= +ns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZP5mB4U9AlWbFoUiMUhU= +JP8anK3MNMJn2jrqTa06vXYsdZnDnEJeUurds4KZJBYhQ4fMHC0zNY-2FgTfJalcX-2BU7JYcSx= +RkfWSRIfFE6-2Fjtf0JOxc5b4bRQtsf7hoIB1qEMNb9Ooct1kdNZFzw5G4h00q4ipukfMhdCBO1= +NrWYshZ-2B3uSiJv3E3oihECUjlvMMzkWO6LbmFGAkzc-2FIOJRZ4cHP + +This message was sent to neon@hackclub.app. + +If you have questions or complaints, please contact us ( https://wl.spotify= +.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKnYeEWqP80O6RX1DItCzt-2B8F8yrw= +r9o-2FoLOV-2ByfejY7xYh8r0jlsi4Br2WmvP5pwqHWQ-3D-3DP2GX_rSILTv32uut97hzOKlbL= +NgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp= +6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn4= +7UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiX= +pm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8an= +mns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZP7aRU-2BF5PXBRrn8v= +0g5wsiu7d6Bb5AyYcWq60V00Uzsl4azqiGCrPglzJSsUnk2bUvc1riww02wBKkoHUFCiCzpFBCH= +e4ELxnWnhelldqpk-2Fey3FCOuC5z7JoDcn1pVHvGTHvCv0WT5kA2z9gp0CQa-2Bg-2B09lfG4c= +o3iSG5Xby5YNmc-2BQcuv-2FofttvEQ2yTnkk4Es0bnfL3pd2ARuKoddcCb ). + + * Terms of Use https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4= +xJMKaKnYeEWqP80O6RX1DItCzt-2B8F-2BpqUhahFK7joJQpeQ1u2ejlJfRzUqiLoD-2Bb-2BZa= +LwNvIA-3D-3DkJV__rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1Fg= +Ovb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHE= +v1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-= +2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLr= +ddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZ= +o23BQJ4AdlhsvK0KqhZP6TVjfnAtCpDnKbjIYi0FZd2hpdI2DcNudk4c-2BGmMoydGlVA-2Fser= +-2BDhYGMGlPTpE1UxWEJlUcQl70FTQhYbtiTj0PE4Ezr9IojurVL1BZ-2F7Vn24aFaRQivRiB2k= +FWlC8JaFrXVnC1umB2q8b-2BfKUkEwM-2FNdP4uWAGb1Llci4JUs37yeWTAJcbyregIY-2Ftpda= +IyjHWPmCx5FkaNhC7HVmem0 + * Privacy Policy https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tf= +D4xJMKaKnYeEWqP80O6RX1DItCzt-2B8F9Wk56egplPtaZ3gd3iEuluykuY18JS75vSYpyYsMRf= +fw-3D-3DSihG_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1= +-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sO= +GaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2Byy= +EW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8= +U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23B= +QJ4AdlhsvK0KqhZP5v8EDcTu0Tv7rrFHu7ac3HPVLzaDGGgr5l-2FrsanPGz2z7En4yafRBAqGK= +28EMIHvYrZY2bD-2FM0xDdMONtd8RcvSCcKXv1lhdxDnj7AHoYyFLSlSagYPNISJfqcnulwKvQR= +VirXH-2FZxga-2B6Irrs6VhT3BDf7E5IUqfMObyzQLpqLeKMM6iz12NxF6EVWILmP72GjoqAqwY= +xk8xewUXb6ju-2F + * Contact Us https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJ= +MKaKnYeEWqP80O6RX1DItCzt-2B8F8yrwr9o-2FoLOV-2ByfejY7xYh8r0jlsi4Br2WmvP5pwqH= +WQ-3D-3DXIt7_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1= +-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sO= +GaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2Byy= +EW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8= +U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23B= +QJ4AdlhsvK0KqhZP7-2BMrMlbp-2Bcr2Dfrh241h6ZTIpWhZdawIj26EjjVVybc6WsubqpxVpDf= +4OAzdzgrtr2eYyfbZu4cjKiqbG7yf8jPbuPCghhhx78YV232XW1SXquLTn6uPYhWsAAafIHz-2B= +zvf5IFd-2FygcunWiii16WsSmBWg0upSOYHL964Y5zDGnx2VFLrAitscuu2-2FbrBUaAB8VZAiA= +2dvsE5rCrgMM9R2 + + +Spotify USA Inc, 4 World Trade Center, 150 Greenwich Street, 62nd Floor, Ne= +w York, NY 10007, USA + +--a61f29a7f8e81fff39b4a1af2262619d30218c584e7e24e6e4c09e8d225f +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=us-ascii +Mime-Version: 1.0 + +Confirm your email addr= +ess
3D""
Keep your account s= +ecure. +
3D""

Keep your account secure.

Confirm your email address = +so you can always access your account and get important info from us. +

+ +
CONFIRM E= +MAIL
+
<= +tr>

If you're h= +aving trouble viewing the button above, please click this link instead.<= +/a>

<= +td colspan=3D"3" style=3D"height:25px;padding:6.25px"><= +/tr>= +
3D"Spotify

Get Spotify for:  iPhone iPad Android Other
This message was sent to neon@hackclub.app. If you = +have questions or complaints, please contact us.
Terms of Use Privacy Policy Contact Us
Spotify USA Inc, 4 World T= +rade Center, 150 Greenwich Street, 62nd Floor, New York, NY 10007, USA
+ +--a61f29a7f8e81fff39b4a1af2262619d30218c584e7e24e6e4c09e8d225f-- diff --git a/Mail/dovecot-uidlist b/Mail/dovecot-uidlist new file mode 100644 index 0000000..2a147cb --- /dev/null +++ b/Mail/dovecot-uidlist @@ -0,0 +1,3 @@ +3 V1728750966 N1 G3f89f90476a50a67b7da1e0005844d15 +1 :1728622962.V801Ice2bb5M356397.nest +2 :1728689485.V801Icf3e1cM345536.nest diff --git a/Mail/dovecot-uidvalidity b/Mail/dovecot-uidvalidity new file mode 100644 index 0000000..67c2bd3 --- /dev/null +++ b/Mail/dovecot-uidvalidity @@ -0,0 +1 @@ +670aa579 \ No newline at end of file diff --git a/Mail/dovecot-uidvalidity.670aa579 b/Mail/dovecot-uidvalidity.670aa579 new file mode 100644 index 0000000..e69de29 diff --git a/Mail/dovecot.index.cache b/Mail/dovecot.index.cache new file mode 100644 index 0000000000000000000000000000000000000000..f3672093f7a6b77a56f53c31d4125099095c46cf GIT binary patch literal 2008 zcmbVN%Wm676s6n%b&LXir|)7)bYUSOK~j?SfLlnG=tQYyJCcGR%Mm%0Cgv-{pXL=6U(lib6 zBmRJ0TwHvI{21bofUyVT6>s{RIn1LiR6qJye-T`RG1~y-m5=e?R}5=cQZF370&~F5 z!L+SXsdR0_wzLw~N*CAwykS8|r{Ph8UKcvb1q~~!y-s$ zi;Q~^@rb78B=HyjdYKftCv(Ay6pQC9Oj4$$Nm?;;?uUh!2%iaU3JERZ5i?UNWTs7c zOvPdqz`SM_^E72roB6^#=ysQ^sMi_0%lL43GFUpd2c76>>Q4be((P( z<2ysQ(_1z4kBy;wdi2m3pDYIq+|j6W+g+81?x8z$kGt+@S-sRcx_@xj?T(iP7_IDg zcUW;D{tewL?cB4qo#sM3^U^-G-RZ8iQK#qTP<0elC5j5c6dMyJf^ z`z^AMYqBldwrb#5X0uwKc>bhnQ_uDqwAPNM=GDJ?ub5`N-VY#d0r38zjq=GO=E)XO zJ0P$HG8UYM#EpIC6Ju3TdxOQ}^ZFEkbD@os7KvFBw`bHl^TK>$(lo_Qf)T*0fCm6w zvah91^qGu8o$Tt~jEan5CeI9-d7SHIa@;>!LVuhmlKDm|cr588WIAywb%#{;)-9@a z`Hm64ZZF>@KftYemd;i9|I0cb3V!R7*iNNYv0IK)h)s6ykGtg^)Y|~8o>!swC`}{} z7Gyt848hWH(aws@bLorc=Mw9Jqbk7c) zCanhz*06&hs5B>4YSX}R_MAPt=~pbrZg{mumDQP3WqYjZSxwgP9j6v-oLM-K_^BH_ zy*~XGJ|sVZ{~7>4dL2NZ?!?cE|H>c<_B1aT$Ku_8qUw)|v=%G=<+H*m>ji%gg#CY_ t@L;?kEmHj3Y2o~Fui%@Y9e#@&5aPOa0XTku7ZmJFF}YsEJ;k3x_z&GU>1+T1 literal 0 HcmV?d00001 diff --git a/Mail/dovecot.index.log b/Mail/dovecot.index.log new file mode 100644 index 0000000000000000000000000000000000000000..5a18b9f0413f63a4ec5976e973b5b8325b5a7239 GIT binary patch literal 480 zcmZQ%)?g@G%9YN`n&;27&)T08*v`B7lIAft?{Y zF*7G6vk0W72Phx_k_DO9zLhim%Z2wW=`5Zv@`(iDF^xi$OY*^*5B>`6a%>pCJ)gMR@Vk{EJ$t&kOsNCh6SPD0>}rN Wg-?GANE1jO2RrHdK=v*G>H`3x*u)i-kF0TphBDe3|y8j4w1oqx~NT~qJ zI(Kj<57r0JP>$8hsxg!$hqs)Y2Y>S9{QB#XtPJj+59=MW-j-Yy`L-JQ;$B)%hX=e5 zT^@+>tiCq@#_xR}dzNRuSs!}?=Q*dA@vM1ADR~~&T)#AL=<+Vad&O~VwyV!N0e&#Z z&;Hn)@SM8KXm5x$eC6l4wUpjOUe5ps&J(>(@TYqH>~tn{`Jpb{$baa(UOB<* zGEfietq##+&s=37Kfw)_DbK_je)ObNndO;4aQ1nw)8^|Z`BOa~12d^>BJaKPd?U*< zU!bjaHQ2>n1H3wOZZIVeE0G2@=X5#f>ZrJn3JF9ix*?^ePb=~MQ3U|#=n6i z>?P*sgM;ru{LFH8ycm=7>pK3#cY(OFa^$5M>;$aA?}Bk~pAptL@Bz2)7T1gTmy?3* zHlNpm`U`4&WBKM2Ys2Y0>Mlv6RjYTs;C1V%`ipW$;C|)wrqpC^L7LUZUaiqi)I^#F zYDRthw4&U7p3};leVp~~hq`nY=8;8RAGMbD(7qi`QPe}ti|@G}j{S4bc;Q3w@p%*_ znz{Ci_z|x4v!{7}6mMr3%b3tKo@Z_HynR2V8njP8kY`+`gHI(GOF^I2;|I5={W2}Yr_IB(&8zhYgx43)%2|ZoBCXrSvDQWA jK@S%6Wty`*+L_#=;-t0Mma5wc)R literal 0 HcmV?d00001 diff --git a/sent/cur/1728689575.2987466_1.nest:2,S b/sent/cur/1728689575.2987466_1.nest:2,S new file mode 100644 index 0000000..e3e2e4b --- /dev/null +++ b/sent/cur/1728689575.2987466_1.nest:2,S @@ -0,0 +1,157 @@ +Date: Fri, 11 Oct 2024 23:32:55 +0000 +From: neon +To: neon@saahild.com +Subject: [no-reply@spotify.com: Confirm your email address] +Message-ID: +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline +Content-Transfer-Encoding: quoted-printable + +----- Forwarded message from Spotify ----- + +Date: Fri, 11 Oct 2024 23:31:22 +0000 (UTC) +=46rom: Spotify +To: neon@hackclub.app +Subject: Confirm your email address + + +Keep your account secure. + + +Confirm your email address so you can always access your account and get im= +portant info from us. + + + +CONFIRM EMAIL ( https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4x= +JMKaKnYeEWqP80O6RX1DItCzt-2B8F-2FkNegH5Y5z0NFRkWYeaF90T91gX2FmXd-2BeE6e3vvG= +BIHluSK7CCr2uBMyW37kNSsb4CjXJHD-2FYnTalz2RweGJvSZhQBVvyZteskWjD-2BnCp9IzM20= +OHRbUcJHvvDbDFbEV-2Fcd9z-2BZXc0VZXVyH-2BX9JV-2FMWmenexEz43xqJz4vdw0A-3D-3DP= +DMC_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2h= +Z7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2= +Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJ= +AnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZ= +OMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4Adlhsv= +K0KqhZP51laajLwlUGaeXw-2B-2FcwkcYPIrqsd6LIowkZdqZfBMfipiOJPcOUBKGhx-2FkB6Bj= +PQsyTQLO6H8TFPfZYXRLSDUZT6CqbIq7disObe3fohzCCM0x11OlLnA7J5DAFwc0kj46FzfYDZm= +9q1nuxmiGcw-2FSFIVmPtz3Xcp-2FFdAHXyYW6CqeQOg7GtH01mfjVLhLId8u8TOYS-2BEmLaIx= +Adxw484u ) + + +If you're having trouble viewing the button above, please click this link i= +nstead. ( https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKn= +YeEWqP80O6RX1DItCzt-2B8F-2FkNegH5Y5z0NFRkWYeaF90T91gX2FmXd-2BeE6e3vvGBIHluS= +K7CCr2uBMyW37kNSsb4CjXJHD-2FYnTalz2RweGJvSZhQBVvyZteskWjD-2BnCp9IzM20OHRbUc= +JHvvDbDFbEV-2Fcd9z-2BZXc0VZXVyH-2BX9JV-2FMWmenexEz43xqJz4vdw0A-3D-3DTQu9_rS= +ILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJs= +OigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1= +FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPb= +l-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84p= +n2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZ= +P5I0VIkwlAd8hB5-2FAZs108-2F-2BGCOsj-2Bgykf-2Bvl4NcSV-2BIkeLt6IQVkyo58IkUZMS= +5eVW31OJ-2BhjrS9Rlappu4pZmT9DxQA4HWlRLw1sOWyQQQ7kqj5-2FS-2BQk-2B-2B1ygSlRLD= +MwZwzJHuYozvVBLrziN6mn4m-2B3QZXLB-2BgV4dGYISwLF-2FVzTxRpG6-2FYhzwZAVBZDmv0o= +lZvooy-2FhDbTs8RTY7kHW ) + + +------------- + +Get Spotify for: + * iPhone (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKa= +KnYXcWD5t7SznLQ7jbi9fm4wXE2-2FUTgChz-2B9dWj0RF4A-2B-2FPqhwDzYQ2q6L-2Fo36FWS= +MXw-3D-3D1-ZP_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb= +1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1s= +OGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2By= +yEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP= +8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23= +BQJ4AdlhsvK0KqhZP54mLf6z3-2F1obe9Fl1Pj7g6oHlAItNZbTFU2ICWavmAeMHSfKgZHmvA-2= +BRsAef5sc3yRP-2FJvrzov38hQXM9LLAUeT534f0w6URgv7QizPchQjtRcwMcBby7cjbDds-2Bp= +0nVic-2BgCmkg8o8-2B5nATceyuogBNkNcWcnIsCmguwV47RyG32f5deKB1tCQdzWS1mRL7SNbR= +-2FMBytJ1rWXqZ1pdsxg + * iPad (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKn= +YXcWD5t7SznLQ7jbi9fm4wXE2-2FUTgChz-2B9dWj0RF4A-2B-2FPqhwDzYQ2q6L-2Fo36FWSMX= +w-3D-3D82DE_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-= +2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOG= +aRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyE= +W7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U= +5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQ= +J4AdlhsvK0KqhZP4tmPAsUu4Q91Tn-2FOBIRUqk57farwnI2g702SZqoYIvCRhU-2FCou-2FR6t= +EwN35rWf2OqzCBZJXgOKPTnWD6xbzQgc2ybIuiTdmYI6dHn15vtqLlW62f2iAr-2FtsKbrQ89rc= +XsaLgRW-2FAuMKxGpEHNOlOiNYno2QK3mZliGdJUOntffnjEMJViCb-2FA0aosytRRXa9hhLt5d= +qe2ajkF-2F2XmdJATw + * Android (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMK= +aKnYZ7kDS6OqrlZhfX6g3CIsPG2xJ7qD5V6Nq-2Bj4HF0JYUDZLHZTku6CN8YeQdHLRil6nuNo0= +YpM2e5dOW9VCcVj98-3DBeEn_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5= +q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-= +2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3= +Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECf= +FkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf= +6X75OXhZo23BQJ4AdlhsvK0KqhZP5MBpTo-2FTlm1iqf0En0WVGqNR-2FojGGBDc11DQSNlfpyI= +jcHXDPVOObSu1mBJad-2Bx3f52L-2F0RQ7HKyssnChXIXRbQJMwlpBYgtEPrNXk0NcYjyhdEI4F= +FqDOxdIRAUHFf5j-2Fbcf1-2Bb6CjoLF-2B3N46KThUrzuMeYHqxcWGTpxC37oM8ntoaheGeI1y= +TrWKtHqJR1gKVYekypPx0ZcXVul1vT2 + * Other (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaK= +nYeEWqP80O6RX1DItCzt-2B8F-2F4J7cG5ag75VBZOT6AkehBbdKO_rSILTv32uut97hzOKlbLN= +gOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6= +jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47= +UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXp= +m-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anm= +ns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZP5mB4U9AlWbFoUiMUhU= +JP8anK3MNMJn2jrqTa06vXYsdZnDnEJeUurds4KZJBYhQ4fMHC0zNY-2FgTfJalcX-2BU7JYcSx= +RkfWSRIfFE6-2Fjtf0JOxc5b4bRQtsf7hoIB1qEMNb9Ooct1kdNZFzw5G4h00q4ipukfMhdCBO1= +NrWYshZ-2B3uSiJv3E3oihECUjlvMMzkWO6LbmFGAkzc-2FIOJRZ4cHP + +This message was sent to neon@hackclub.app. + +If you have questions or complaints, please contact us ( https://wl.spotify= +=2Ecom/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKnYeEWqP80O6RX1DItCzt-2B8F8y= +rwr9o-2FoLOV-2ByfejY7xYh8r0jlsi4Br2WmvP5pwqHWQ-3D-3DP2GX_rSILTv32uut97hzOKl= +bLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmd= +kp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmR= +n47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZw= +iXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8= +anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZP7aRU-2BF5PXBRrn= +8v0g5wsiu7d6Bb5AyYcWq60V00Uzsl4azqiGCrPglzJSsUnk2bUvc1riww02wBKkoHUFCiCzpFB= +CHe4ELxnWnhelldqpk-2Fey3FCOuC5z7JoDcn1pVHvGTHvCv0WT5kA2z9gp0CQa-2Bg-2B09lfG= +4co3iSG5Xby5YNmc-2BQcuv-2FofttvEQ2yTnkk4Es0bnfL3pd2ARuKoddcCb ). + + * Terms of Use https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4= +xJMKaKnYeEWqP80O6RX1DItCzt-2B8F-2BpqUhahFK7joJQpeQ1u2ejlJfRzUqiLoD-2Bb-2BZa= +LwNvIA-3D-3DkJV__rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1Fg= +Ovb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHE= +v1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-= +2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLr= +ddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZ= +o23BQJ4AdlhsvK0KqhZP6TVjfnAtCpDnKbjIYi0FZd2hpdI2DcNudk4c-2BGmMoydGlVA-2Fser= +-2BDhYGMGlPTpE1UxWEJlUcQl70FTQhYbtiTj0PE4Ezr9IojurVL1BZ-2F7Vn24aFaRQivRiB2k= +FWlC8JaFrXVnC1umB2q8b-2BfKUkEwM-2FNdP4uWAGb1Llci4JUs37yeWTAJcbyregIY-2Ftpda= +IyjHWPmCx5FkaNhC7HVmem0 + * Privacy Policy https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tf= +D4xJMKaKnYeEWqP80O6RX1DItCzt-2B8F9Wk56egplPtaZ3gd3iEuluykuY18JS75vSYpyYsMRf= +fw-3D-3DSihG_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1= +-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sO= +GaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2Byy= +EW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8= +U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23B= +QJ4AdlhsvK0KqhZP5v8EDcTu0Tv7rrFHu7ac3HPVLzaDGGgr5l-2FrsanPGz2z7En4yafRBAqGK= +28EMIHvYrZY2bD-2FM0xDdMONtd8RcvSCcKXv1lhdxDnj7AHoYyFLSlSagYPNISJfqcnulwKvQR= +VirXH-2FZxga-2B6Irrs6VhT3BDf7E5IUqfMObyzQLpqLeKMM6iz12NxF6EVWILmP72GjoqAqwY= +xk8xewUXb6ju-2F + * Contact Us https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJ= +MKaKnYeEWqP80O6RX1DItCzt-2B8F8yrwr9o-2FoLOV-2ByfejY7xYh8r0jlsi4Br2WmvP5pwqH= +WQ-3D-3DXIt7_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1= +-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sO= +GaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2Byy= +EW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8= +U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23B= +QJ4AdlhsvK0KqhZP7-2BMrMlbp-2Bcr2Dfrh241h6ZTIpWhZdawIj26EjjVVybc6WsubqpxVpDf= +4OAzdzgrtr2eYyfbZu4cjKiqbG7yf8jPbuPCghhhx78YV232XW1SXquLTn6uPYhWsAAafIHz-2B= +zvf5IFd-2FygcunWiii16WsSmBWg0upSOYHL964Y5zDGnx2VFLrAitscuu2-2FbrBUaAB8VZAiA= +2dvsE5rCrgMM9R2 + + +Spotify USA Inc, 4 World Trade Center, 150 Greenwich Street, 62nd Floor, Ne= +w York, NY 10007, USA + +----- End forwarded message ----- From 38c3ed19678f0d574741b19c1cad8f1344861fdc Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:08:48 +0000 Subject: [PATCH 22/37] enhancement(lint): Fix lint errors for .config/caddy/autosave.json Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- .config/caddy/autosave.json | 61 ++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/.config/caddy/autosave.json b/.config/caddy/autosave.json index 85bf901..37939fc 100644 --- a/.config/caddy/autosave.json +++ b/.config/caddy/autosave.json @@ -1 +1,60 @@ -{"admin":{"listen":"unix//home/neon/caddy-admin.sock"},"apps":{"http":{"servers":{"srv0":{"automatic_https":{"skip":["spotify.hackclub.app"]},"listen":["unix/.spotify.neon.hackclub.app.webserver.sock|777"],"routes":[{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"reverse_proxy","upstreams":[{"dial":"localhost:38275"}]}]}]}],"match":[{"host":["spotify.hackclub.app"]}],"terminal":true}]},"srv1":{"automatic_https":{"skip":["neon.hackclub.app"]},"listen":["unix/.webserver.sock|777"],"routes":[{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"vars","root":"/home/neon/pub"},{"handler":"file_server","hide":[".git",".env","/home/neon/Caddyfile"]}]}]}],"match":[{"host":["neon.hackclub.app"]}],"terminal":true}]}}}}} \ No newline at end of file +{ + "admin": { "listen": "unix//home/neon/caddy-admin.sock" }, + "apps": { + "http": { + "servers": { + "srv0": { + "automatic_https": { "skip": ["spotify.hackclub.app"] }, + "listen": ["unix/.spotify.neon.hackclub.app.webserver.sock|777"], + "routes": [ + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "handler": "reverse_proxy", + "upstreams": [{ "dial": "localhost:38275" }] + } + ] + } + ] + } + ], + "match": [{ "host": ["spotify.hackclub.app"] }], + "terminal": true + } + ] + }, + "srv1": { + "automatic_https": { "skip": ["neon.hackclub.app"] }, + "listen": ["unix/.webserver.sock|777"], + "routes": [ + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { "handler": "vars", "root": "/home/neon/pub" }, + { + "handler": "file_server", + "hide": [".git", ".env", "/home/neon/Caddyfile"] + } + ] + } + ] + } + ], + "match": [{ "host": ["neon.hackclub.app"] }], + "terminal": true + } + ] + } + } + } + } +} From 1cf2d561a485b055822514d234168fb8486d08cf Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:08:49 +0000 Subject: [PATCH 23/37] enhancement(lint): Fix lint errors for .gitignore Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 868d4f5..f6d4b93 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ .config/git .config/pulse # tokens .config/caddy -Mail # mail sent to neon@hackclub.app is here -sent # all sent mail is there +Mail # mail sent to neon@hackclub.app is here +sent # all sent mail is there .bun .local .nix-profile From a8409d6bf4030057c7fa9cfa68d4dbda4bf98ea5 Mon Sep 17 00:00:00 2001 From: Saahil Date: Sun, 13 Oct 2024 00:12:33 -0400 Subject: [PATCH 24/37] fix: mail keeps being uploaded --- .gitignore | 3 +- Mail/.gitignore | 1 + Mail/Drafts/dovecot-uidlist | 1 - Mail/Drafts/dovecot.index.cache | Bin 1520 -> 0 bytes Mail/Drafts/dovecot.index.log | Bin 1124 -> 0 bytes Mail/Sent/dovecot-uidlist | 1 - Mail/Sent/dovecot.index.log | Bin 336 -> 0 bytes Mail/Trash/dovecot-uidlist | 1 - Mail/Trash/dovecot.index.log | Bin 40 -> 0 bytes .../1728622962.V801Ice2bb5M356397.nest:2,S | 66 --- .../1728689485.V801Icf3e1cM345536.nest:2,S | 501 ------------------ Mail/dovecot-uidlist | 3 - Mail/dovecot-uidvalidity | 1 - Mail/dovecot-uidvalidity.670aa579 | 0 Mail/dovecot.index.cache | Bin 2008 -> 0 bytes Mail/dovecot.index.log | Bin 480 -> 0 bytes Mail/dovecot.list.index.log | Bin 2372 -> 0 bytes sent/.gitignore | 1 + sent/cur/1726191712.1475017_1.nest:2,S | 10 - sent/cur/1728689575.2987466_1.nest:2,S | 157 ------ 20 files changed, 3 insertions(+), 743 deletions(-) create mode 100644 Mail/.gitignore delete mode 100644 Mail/Drafts/dovecot-uidlist delete mode 100644 Mail/Drafts/dovecot.index.cache delete mode 100644 Mail/Drafts/dovecot.index.log delete mode 100644 Mail/Sent/dovecot-uidlist delete mode 100644 Mail/Sent/dovecot.index.log delete mode 100644 Mail/Trash/dovecot-uidlist delete mode 100644 Mail/Trash/dovecot.index.log delete mode 100644 Mail/cur/1728622962.V801Ice2bb5M356397.nest:2,S delete mode 100644 Mail/cur/1728689485.V801Icf3e1cM345536.nest:2,S delete mode 100644 Mail/dovecot-uidlist delete mode 100644 Mail/dovecot-uidvalidity delete mode 100644 Mail/dovecot-uidvalidity.670aa579 delete mode 100644 Mail/dovecot.index.cache delete mode 100644 Mail/dovecot.index.log delete mode 100644 Mail/dovecot.list.index.log create mode 100644 sent/.gitignore delete mode 100644 sent/cur/1726191712.1475017_1.nest:2,S delete mode 100644 sent/cur/1728689575.2987466_1.nest:2,S diff --git a/.gitignore b/.gitignore index f6d4b93..bf31f6b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,7 @@ .config/git .config/pulse # tokens .config/caddy -Mail # mail sent to neon@hackclub.app is here -sent # all sent mail is there + .bun .local .nix-profile diff --git a/Mail/.gitignore b/Mail/.gitignore new file mode 100644 index 0000000..f59ec20 --- /dev/null +++ b/Mail/.gitignore @@ -0,0 +1 @@ +* \ No newline at end of file diff --git a/Mail/Drafts/dovecot-uidlist b/Mail/Drafts/dovecot-uidlist deleted file mode 100644 index b953224..0000000 --- a/Mail/Drafts/dovecot-uidlist +++ /dev/null @@ -1 +0,0 @@ -3 V1728750967 N2 G18d9130f76a50a67b7da1e0005844d15 diff --git a/Mail/Drafts/dovecot.index.cache b/Mail/Drafts/dovecot.index.cache deleted file mode 100644 index c723581082d249b3010ed93d042d2175016ff2f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1520 zcmdT^%Wl&^6umA5s)7WRcM)i078D6vw&Rw>LWneR(x5a&iMwDqv8Rc_PK-T?D61@3 z@FVQ`DZT^ljP15W?V?Mra^~FE+>Cu}D{BhOf3A<7Zrm8HKyKd^0Q|vXvG{@bJ;dNP z#-gWak+dA2t)1tuVsZ^3xb#K*XURluDJ8=zmc{GE#wMt6wy%z0p(23 z*o5a^%6t~iSy1HZoIw_TWBNQy`HV(+kc^MB(8nl@X`&CO!SSh=@pR_%S<3Pho6K1> zO&BE8q@vHlAj-XI8n6^bn1DEpnV!&;XD|#WG(9c@oU3P(Fi9APaggdwJZf=vaesvo zxdMDaF`l4b-s5E!ZDp?5BI(%~jYR!2C^ZpW`j^q?Jk2i3Eo-@YYKnaLKw021P-0a2 z#Qsl(h19!^hLpUZR{vmM#_j!jr>ix(9k=Ic&3?V*X`SXp6>qQa)|+KRr>FJZ58aQN zcOWu@@F>-qxm_`9 zrio{`hx=T_H8B9~oEhFYWi*hZc<$mftx~m2v$k#9R@JCk_I9OO!*Ot5P62pO@WX;1 z75o@kTxa>+9L$EFn9m)8n>UM|>&R_{%Gp=05_QbuNF`gUKc;EMMCQ2X2q^$5zQ}o0uorqALGOywhuVW2-p#CSnV*huB2@ggq~~lZWuWV3Ga{vvY~^ diff --git a/Mail/Drafts/dovecot.index.log b/Mail/Drafts/dovecot.index.log deleted file mode 100644 index a2f6427abd14c73845526442811b937806d58d42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1124 zcmb7DJxc>Y5S>ddcqWRcRS<;;7Dk9DT3B8!3KoK57n6`2#3o7<3pw!gh=>Gi6l_FN zi=Dq9Kf!-tXJH}go88+@Jd)xzBs(+vX5M_oNG?#blddMHcUU(^2y41B1=4GgFx=$9(@vO+@9^{d8d!zQAAQ5Hm|AodCOu zo8!YSc=seGaDag*PLEgk59FH#H-9^?FO%v%fVYb4Ncmqq9NfgmpcIvgrCLQ|d=K0l z1FH6ijb$JGv$WS9lpuVksf9J^=8&&B1q>Oqhvw&@XR1qx%ojzym+gmvy{C zW;o6H+Pm*|J5DN!Ox+72lcnn0Mv4cG)2B#56iH{-hn7L z>v!%}ei-*yQt$-r56L~(JzvTEJk;8S-EMt<<5}gfE%Ui{kh9u>u*_a?7lAc&6H)% TiF06i>GLTW{+BgR83X(SlS -X-Original-To: neon@hackclub.app -Delivered-To: neon@hackclub.app -Received: from m239-4.eu.mailgun.net (m239-4.eu.mailgun.net [185.250.239.4]) - (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) - key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) - (No client certificate requested) - by hackclub.app (Postfix) with UTF8SMTPS id 3F1BEE85D7 - for ; Fri, 11 Oct 2024 05:02:42 +0000 (UTC) -DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.weatherapi.com; q=dns/txt; s=k1; t=1728622961; x=1728630161; - h=Content-Transfer-Encoding: Content-Type: Subject: Subject: Date: To: To: From: From: MIME-Version: Message-Id: Sender: Sender; - bh=mSrv7WhQhngUfj566gxykiEIW79P17ej3NkcB5715no=; - b=cFopQ9YDTubNYFTgM8xu7fyzboD+B0nik+7y+nNTIfIG8s7loyd+9+FxAR9incN2M6YgJpsJN5uBXsI86fLlWBp9GE5rzCl4cm+2sCuXyYKVZG1vqQLq1J46HTKFN2tyz5W80837Hdt6sPbY9d1zCWEeZ3P+FXyOkvhQYGHAlOAendDT2Sot7D1+WZr+tWkF9Y5D+OoQcV6y9AmMlhR5i+wVfbzNs335C2T4xMKzZtCI8WbYnHMDH1N8kdD4N0Sj+0bhuq53SudkFilq/aZrUQTZRfCxQOdEgWJ5tk0waazOCgZz0GJKhHMxZAD3XDzud3MeYLrGDyIPIlKteVJEPQ== -X-Mailgun-Sending-Ip: 185.250.239.4 -X-Mailgun-Sending-Ip-Pool-Name: -X-Mailgun-Sending-Ip-Pool: -X-Mailgun-Sid: WyI4MTg0ZSIsIm5lb25AaGFja2NsdWIuYXBwIiwiYTY5ZWYiXQ== -Received: from dev-debian (83-136-248-35.uk-lon1.upcloud.host [83.136.248.35]) by - 5d4688fc3e3d with SMTP id 6708b170933e289d25aef24c; Fri, 11 Oct 2024 05:02:40 - GMT -Sender: support=weatherapi.com@mg.weatherapi.com -Message-Id: <20241011050240.947bcdb41ac1c8a5@mg.weatherapi.com> -MIME-Version: 1.0 -From: "WeatherAPI.com Team" -To: neon@hackclub.app -Date: 11 Oct 2024 05:00:10 +0000 -Subject: Weather API Trial Ended - WeatherAPI.com -Content-Type: text/html; charset=us-ascii -Content-Transfer-Encoding: quoted-printable - -
=0D=0A
Hello,
=0D=0A = -
=0D=0A
Your Weather API trial period has now come t= -o an end and therefore, your API key (listed below) has now been = -switched to Free plan.
=0D=0A
=0D=0A -----------= ------------------------------------------------------------------= ---------=0D=0A
=0D=0A API Key: d4968db************=0D=0A= -
=0D=0A ---------------------------------------------= ----------------------------------------=0D=0A

=0D=0A= -
If you would like to upgrade then please login into your= - account and choose a paid plan.
=0D=0A =0D=0A = -

=0D=0A
Thanks,
=0D=0A
=0D=0A = -
=0D=0A
WeatherAPI.com Team

=0D=0A <= -div>http= -s://www.weatherapi.com
=0D=0A
=0D=0A
Follow us:-
=0D=0A facebook: https://www.facebo= -ok.com/weatherapidev
=0D=0A twitter: https://twitter.= -com/weatherapidev
=0D=0A
=0D=0A
=0D=0A= -
=0D=0A The information contained in this message = -is confidential and may be legally privileged. The message is int= -ended solely for the addressee(s). If you are not the intended re= -cipient, you are hereby notified that any use, dissemination or r= -eproduction is strictly prohibited and may be unlawful. If you ar= -e not the intended recipient, please contact the sender by e-mail= - and destroy all copies of the original message.=0D=0A
=0D=0A= -

=0D=0A
=0D=0A WeatherAPI.com is a br= -and name of Oplao FZCO, Dubai Silicon Oasis, Dubai Digital Park, = -Building A1, Dubai. Registered in Dubai. License number 17552.=0D=0A= -
=0D=0A

=0D=0A
You are rece= -iving this email because you registered for an API account on our= - website WeatherAPI.com.
=0D=0A - diff --git a/Mail/cur/1728689485.V801Icf3e1cM345536.nest:2,S b/Mail/cur/1728689485.V801Icf3e1cM345536.nest:2,S deleted file mode 100644 index f983189..0000000 --- a/Mail/cur/1728689485.V801Icf3e1cM345536.nest:2,S +++ /dev/null @@ -1,501 +0,0 @@ -Return-Path: -X-Original-To: neon@hackclub.app -Delivered-To: neon@hackclub.app -Received: from o32.em.spotify.com (o32.em.spotify.com [149.72.28.14]) - (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) - key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) - (No client certificate requested) - by hackclub.app (Postfix) with ESMTPS id B9ACEE85D6 - for ; Fri, 11 Oct 2024 23:31:24 +0000 (UTC) -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spotify.com; - h=content-type:from:mime-version:subject:to:cc:content-type:from: - subject:to; - s=s1; bh=r+lS2/DldX/eY4WuLpzwPwVunbuCFxnVTWmLDwXYfHQ=; - b=D1PMPtDMP0CSyRIkE9GBOgNbDE+6zB5SMRnAMvvpfNbTW6yWlfbH1r5Bq0PEYj4r4/FM - w1nQtwVCNQ2lmwpZo7Ta2Hc4qQ2XesFXQJmUMIpVb1pZf+6nHTuNBRNLd8TJxPoc+DhMvd - hiSCZ0YgGdQiVj3FjI0g1OHB05lh/c818YwK9nG8slkuilYsfBvuOnnvF8r+9vLcey5WyU - jdvSEEeALhrg2KI4wa75pOSZQn3+3IVTPcuXcoZz2cWIAVQYHPbX78lwEP1xUoXKD9M2dv - MSaTAlY9KnDUXrgICObPVG14oNcKmOLMPqtX43f0CrZxkv86qZjGMaW2KwxySdow== -Received: by recvd-6b9dcc67d6-kltlw with SMTP id recvd-6b9dcc67d6-kltlw-1-6709B54A-28 - 2024-10-11 23:31:22.701905387 +0000 UTC m=+2525582.225999003 -Received: from NDgxNTgyMQ (unknown) - by geopod-ismtpd-3 (SG) with HTTP - id vk3fvwJtS5Ka5BO8SDrw-Q - Fri, 11 Oct 2024 23:31:22.695 +0000 (UTC) -Content-Type: multipart/alternative; boundary=a61f29a7f8e81fff39b4a1af2262619d30218c584e7e24e6e4c09e8d225f -Date: Fri, 11 Oct 2024 23:31:22 +0000 (UTC) -From: Spotify -Mime-Version: 1.0 -Message-ID: -Subject: Confirm your email address -X-SG-EID: - =?us-ascii?Q?u001=2EZD5aH33R6V7weoiTHIdZyDuP+A6pZLQL0nRW+xTj31Msb5xf5uAbZIKpG?= - =?us-ascii?Q?ToelTWVR8rVonvMrj0NERWIakIdZEPz=2F1M6Azre?= - =?us-ascii?Q?smHeeByKv03LkxdMR84frxMt2nKTxdmY2XT+k7c?= - =?us-ascii?Q?x5g8szn=2F1m1njDMMVZudL=2FdZjIA0lVAZvPeMGyX?= - =?us-ascii?Q?fpa9JRf0yRtWYwTXURO8G8PvAr0wgKYtZyG3hFb?= - =?us-ascii?Q?k9FJS+xNiF9dhS3WULlZjs=3D?= -X-SG-ID: - =?us-ascii?Q?u001=2ESdBcvi+Evd=2FbQef8eZF3BoMNuFmcP5rq+Py=2FzrrMdK5f10AXNJNhbm9x8?= - =?us-ascii?Q?lPhfP1ZAm3IL1nXkpx2GICRvSB73I6sRTx=2FkNDG?= - =?us-ascii?Q?V9zAkrUOW7eMBKsKMjmFFhZJoGGF2BuAYankN4C?= - =?us-ascii?Q?HVt6B6lYNEoFzacLUtYAZKFZrCiT6OgWpRTYMHy?= - =?us-ascii?Q?pIXvb2Xg+qDxWbvHC1stwWpUW7Hh0LLVPKdCLAp?= - =?us-ascii?Q?fX2tdDsF1tdVKQo3Bv+8UGZbAuP=2FACS+PrOM9Gk?= - =?us-ascii?Q?oAPmBqAyRnWW=2Fk1zRK59SWFtS7q4ugW7g1yb94V?= - =?us-ascii?Q?a6TNCt325Q0sIMuWGNOQPTVwmDyB1QTdO5TFW5Q?= - =?us-ascii?Q?+Kczy7iMjygq6uGH3UAsphCU9Vw46=2FsbjitZBam?= - =?us-ascii?Q?pA1Db=2FhmOxBAzWf?= -To: neon@hackclub.app -X-Entity-ID: u001.FPddaWwi2T+e322oHrHacg== - ---a61f29a7f8e81fff39b4a1af2262619d30218c584e7e24e6e4c09e8d225f -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; charset=us-ascii -Mime-Version: 1.0 - - -Keep your account secure. - - -Confirm your email address so you can always access your account and get im= -portant info from us. - - - -CONFIRM EMAIL ( https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4x= -JMKaKnYeEWqP80O6RX1DItCzt-2B8F-2FkNegH5Y5z0NFRkWYeaF90T91gX2FmXd-2BeE6e3vvG= -BIHluSK7CCr2uBMyW37kNSsb4CjXJHD-2FYnTalz2RweGJvSZhQBVvyZteskWjD-2BnCp9IzM20= -OHRbUcJHvvDbDFbEV-2Fcd9z-2BZXc0VZXVyH-2BX9JV-2FMWmenexEz43xqJz4vdw0A-3D-3DP= -DMC_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2h= -Z7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2= -Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJ= -AnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZ= -OMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4Adlhsv= -K0KqhZP51laajLwlUGaeXw-2B-2FcwkcYPIrqsd6LIowkZdqZfBMfipiOJPcOUBKGhx-2FkB6Bj= -PQsyTQLO6H8TFPfZYXRLSDUZT6CqbIq7disObe3fohzCCM0x11OlLnA7J5DAFwc0kj46FzfYDZm= -9q1nuxmiGcw-2FSFIVmPtz3Xcp-2FFdAHXyYW6CqeQOg7GtH01mfjVLhLId8u8TOYS-2BEmLaIx= -Adxw484u ) - - -If you're having trouble viewing the button above, please click this link i= -nstead. ( https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKn= -YeEWqP80O6RX1DItCzt-2B8F-2FkNegH5Y5z0NFRkWYeaF90T91gX2FmXd-2BeE6e3vvGBIHluS= -K7CCr2uBMyW37kNSsb4CjXJHD-2FYnTalz2RweGJvSZhQBVvyZteskWjD-2BnCp9IzM20OHRbUc= -JHvvDbDFbEV-2Fcd9z-2BZXc0VZXVyH-2BX9JV-2FMWmenexEz43xqJz4vdw0A-3D-3DTQu9_rS= -ILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJs= -OigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1= -FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPb= -l-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84p= -n2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZ= -P5I0VIkwlAd8hB5-2FAZs108-2F-2BGCOsj-2Bgykf-2Bvl4NcSV-2BIkeLt6IQVkyo58IkUZMS= -5eVW31OJ-2BhjrS9Rlappu4pZmT9DxQA4HWlRLw1sOWyQQQ7kqj5-2FS-2BQk-2B-2B1ygSlRLD= -MwZwzJHuYozvVBLrziN6mn4m-2B3QZXLB-2BgV4dGYISwLF-2FVzTxRpG6-2FYhzwZAVBZDmv0o= -lZvooy-2FhDbTs8RTY7kHW ) - - -------------- - -Get Spotify for: - * iPhone (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKa= -KnYXcWD5t7SznLQ7jbi9fm4wXE2-2FUTgChz-2B9dWj0RF4A-2B-2FPqhwDzYQ2q6L-2Fo36FWS= -MXw-3D-3D1-ZP_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb= -1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1s= -OGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2By= -yEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP= -8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23= -BQJ4AdlhsvK0KqhZP54mLf6z3-2F1obe9Fl1Pj7g6oHlAItNZbTFU2ICWavmAeMHSfKgZHmvA-2= -BRsAef5sc3yRP-2FJvrzov38hQXM9LLAUeT534f0w6URgv7QizPchQjtRcwMcBby7cjbDds-2Bp= -0nVic-2BgCmkg8o8-2B5nATceyuogBNkNcWcnIsCmguwV47RyG32f5deKB1tCQdzWS1mRL7SNbR= --2FMBytJ1rWXqZ1pdsxg - * iPad (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKn= -YXcWD5t7SznLQ7jbi9fm4wXE2-2FUTgChz-2B9dWj0RF4A-2B-2FPqhwDzYQ2q6L-2Fo36FWSMX= -w-3D-3D82DE_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-= -2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOG= -aRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyE= -W7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U= -5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQ= -J4AdlhsvK0KqhZP4tmPAsUu4Q91Tn-2FOBIRUqk57farwnI2g702SZqoYIvCRhU-2FCou-2FR6t= -EwN35rWf2OqzCBZJXgOKPTnWD6xbzQgc2ybIuiTdmYI6dHn15vtqLlW62f2iAr-2FtsKbrQ89rc= -XsaLgRW-2FAuMKxGpEHNOlOiNYno2QK3mZliGdJUOntffnjEMJViCb-2FA0aosytRRXa9hhLt5d= -qe2ajkF-2F2XmdJATw - * Android (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMK= -aKnYZ7kDS6OqrlZhfX6g3CIsPG2xJ7qD5V6Nq-2Bj4HF0JYUDZLHZTku6CN8YeQdHLRil6nuNo0= -YpM2e5dOW9VCcVj98-3DBeEn_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5= -q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-= -2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3= -Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECf= -FkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf= -6X75OXhZo23BQJ4AdlhsvK0KqhZP5MBpTo-2FTlm1iqf0En0WVGqNR-2FojGGBDc11DQSNlfpyI= -jcHXDPVOObSu1mBJad-2Bx3f52L-2F0RQ7HKyssnChXIXRbQJMwlpBYgtEPrNXk0NcYjyhdEI4F= -FqDOxdIRAUHFf5j-2Fbcf1-2Bb6CjoLF-2B3N46KThUrzuMeYHqxcWGTpxC37oM8ntoaheGeI1y= -TrWKtHqJR1gKVYekypPx0ZcXVul1vT2 - * Other (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaK= -nYeEWqP80O6RX1DItCzt-2B8F-2F4J7cG5ag75VBZOT6AkehBbdKO_rSILTv32uut97hzOKlbLN= -gOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6= -jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47= -UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXp= -m-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anm= -ns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZP5mB4U9AlWbFoUiMUhU= -JP8anK3MNMJn2jrqTa06vXYsdZnDnEJeUurds4KZJBYhQ4fMHC0zNY-2FgTfJalcX-2BU7JYcSx= -RkfWSRIfFE6-2Fjtf0JOxc5b4bRQtsf7hoIB1qEMNb9Ooct1kdNZFzw5G4h00q4ipukfMhdCBO1= -NrWYshZ-2B3uSiJv3E3oihECUjlvMMzkWO6LbmFGAkzc-2FIOJRZ4cHP - -This message was sent to neon@hackclub.app. - -If you have questions or complaints, please contact us ( https://wl.spotify= -.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKnYeEWqP80O6RX1DItCzt-2B8F8yrw= -r9o-2FoLOV-2ByfejY7xYh8r0jlsi4Br2WmvP5pwqHWQ-3D-3DP2GX_rSILTv32uut97hzOKlbL= -NgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp= -6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn4= -7UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiX= -pm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8an= -mns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZP7aRU-2BF5PXBRrn8v= -0g5wsiu7d6Bb5AyYcWq60V00Uzsl4azqiGCrPglzJSsUnk2bUvc1riww02wBKkoHUFCiCzpFBCH= -e4ELxnWnhelldqpk-2Fey3FCOuC5z7JoDcn1pVHvGTHvCv0WT5kA2z9gp0CQa-2Bg-2B09lfG4c= -o3iSG5Xby5YNmc-2BQcuv-2FofttvEQ2yTnkk4Es0bnfL3pd2ARuKoddcCb ). - - * Terms of Use https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4= -xJMKaKnYeEWqP80O6RX1DItCzt-2B8F-2BpqUhahFK7joJQpeQ1u2ejlJfRzUqiLoD-2Bb-2BZa= -LwNvIA-3D-3DkJV__rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1Fg= -Ovb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHE= -v1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-= -2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLr= -ddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZ= -o23BQJ4AdlhsvK0KqhZP6TVjfnAtCpDnKbjIYi0FZd2hpdI2DcNudk4c-2BGmMoydGlVA-2Fser= --2BDhYGMGlPTpE1UxWEJlUcQl70FTQhYbtiTj0PE4Ezr9IojurVL1BZ-2F7Vn24aFaRQivRiB2k= -FWlC8JaFrXVnC1umB2q8b-2BfKUkEwM-2FNdP4uWAGb1Llci4JUs37yeWTAJcbyregIY-2Ftpda= -IyjHWPmCx5FkaNhC7HVmem0 - * Privacy Policy https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tf= -D4xJMKaKnYeEWqP80O6RX1DItCzt-2B8F9Wk56egplPtaZ3gd3iEuluykuY18JS75vSYpyYsMRf= -fw-3D-3DSihG_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1= --2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sO= -GaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2Byy= -EW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8= -U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23B= -QJ4AdlhsvK0KqhZP5v8EDcTu0Tv7rrFHu7ac3HPVLzaDGGgr5l-2FrsanPGz2z7En4yafRBAqGK= -28EMIHvYrZY2bD-2FM0xDdMONtd8RcvSCcKXv1lhdxDnj7AHoYyFLSlSagYPNISJfqcnulwKvQR= -VirXH-2FZxga-2B6Irrs6VhT3BDf7E5IUqfMObyzQLpqLeKMM6iz12NxF6EVWILmP72GjoqAqwY= -xk8xewUXb6ju-2F - * Contact Us https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJ= -MKaKnYeEWqP80O6RX1DItCzt-2B8F8yrwr9o-2FoLOV-2ByfejY7xYh8r0jlsi4Br2WmvP5pwqH= -WQ-3D-3DXIt7_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1= --2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sO= -GaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2Byy= -EW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8= -U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23B= -QJ4AdlhsvK0KqhZP7-2BMrMlbp-2Bcr2Dfrh241h6ZTIpWhZdawIj26EjjVVybc6WsubqpxVpDf= -4OAzdzgrtr2eYyfbZu4cjKiqbG7yf8jPbuPCghhhx78YV232XW1SXquLTn6uPYhWsAAafIHz-2B= -zvf5IFd-2FygcunWiii16WsSmBWg0upSOYHL964Y5zDGnx2VFLrAitscuu2-2FbrBUaAB8VZAiA= -2dvsE5rCrgMM9R2 - - -Spotify USA Inc, 4 World Trade Center, 150 Greenwich Street, 62nd Floor, Ne= -w York, NY 10007, USA - ---a61f29a7f8e81fff39b4a1af2262619d30218c584e7e24e6e4c09e8d225f -Content-Transfer-Encoding: quoted-printable -Content-Type: text/html; charset=us-ascii -Mime-Version: 1.0 - -Confirm your email addr= -ess
3D""
Keep your account s= -ecure. -
3D""

Keep your account secure.

Confirm your email address = -so you can always access your account and get important info from us. -

- -
CONFIRM E= -MAIL
-
<= -tr>

If you're h= -aving trouble viewing the button above, please click this link instead.<= -/a>

<= -td colspan=3D"3" style=3D"height:25px;padding:6.25px"><= -/tr>= -
3D"Spotify

Get Spotify for:  iPhone iPad Android Other
This message was sent to neon@hackclub.app. If you = -have questions or complaints, please contact us.
Terms of Use Privacy Policy Contact Us
Spotify USA Inc, 4 World T= -rade Center, 150 Greenwich Street, 62nd Floor, New York, NY 10007, USA
- ---a61f29a7f8e81fff39b4a1af2262619d30218c584e7e24e6e4c09e8d225f-- diff --git a/Mail/dovecot-uidlist b/Mail/dovecot-uidlist deleted file mode 100644 index 2a147cb..0000000 --- a/Mail/dovecot-uidlist +++ /dev/null @@ -1,3 +0,0 @@ -3 V1728750966 N1 G3f89f90476a50a67b7da1e0005844d15 -1 :1728622962.V801Ice2bb5M356397.nest -2 :1728689485.V801Icf3e1cM345536.nest diff --git a/Mail/dovecot-uidvalidity b/Mail/dovecot-uidvalidity deleted file mode 100644 index 67c2bd3..0000000 --- a/Mail/dovecot-uidvalidity +++ /dev/null @@ -1 +0,0 @@ -670aa579 \ No newline at end of file diff --git a/Mail/dovecot-uidvalidity.670aa579 b/Mail/dovecot-uidvalidity.670aa579 deleted file mode 100644 index e69de29..0000000 diff --git a/Mail/dovecot.index.cache b/Mail/dovecot.index.cache deleted file mode 100644 index f3672093f7a6b77a56f53c31d4125099095c46cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2008 zcmbVN%Wm676s6n%b&LXir|)7)bYUSOK~j?SfLlnG=tQYyJCcGR%Mm%0Cgv-{pXL=6U(lib6 zBmRJ0TwHvI{21bofUyVT6>s{RIn1LiR6qJye-T`RG1~y-m5=e?R}5=cQZF370&~F5 z!L+SXsdR0_wzLw~N*CAwykS8|r{Ph8UKcvb1q~~!y-s$ zi;Q~^@rb78B=HyjdYKftCv(Ay6pQC9Oj4$$Nm?;;?uUh!2%iaU3JERZ5i?UNWTs7c zOvPdqz`SM_^E72roB6^#=ysQ^sMi_0%lL43GFUpd2c76>>Q4be((P( z<2ysQ(_1z4kBy;wdi2m3pDYIq+|j6W+g+81?x8z$kGt+@S-sRcx_@xj?T(iP7_IDg zcUW;D{tewL?cB4qo#sM3^U^-G-RZ8iQK#qTP<0elC5j5c6dMyJf^ z`z^AMYqBldwrb#5X0uwKc>bhnQ_uDqwAPNM=GDJ?ub5`N-VY#d0r38zjq=GO=E)XO zJ0P$HG8UYM#EpIC6Ju3TdxOQ}^ZFEkbD@os7KvFBw`bHl^TK>$(lo_Qf)T*0fCm6w zvah91^qGu8o$Tt~jEan5CeI9-d7SHIa@;>!LVuhmlKDm|cr588WIAywb%#{;)-9@a z`Hm64ZZF>@KftYemd;i9|I0cb3V!R7*iNNYv0IK)h)s6ykGtg^)Y|~8o>!swC`}{} z7Gyt848hWH(aws@bLorc=Mw9Jqbk7c) zCanhz*06&hs5B>4YSX}R_MAPt=~pbrZg{mumDQP3WqYjZSxwgP9j6v-oLM-K_^BH_ zy*~XGJ|sVZ{~7>4dL2NZ?!?cE|H>c<_B1aT$Ku_8qUw)|v=%G=<+H*m>ji%gg#CY_ t@L;?kEmHj3Y2o~Fui%@Y9e#@&5aPOa0XTku7ZmJFF}YsEJ;k3x_z&GU>1+T1 diff --git a/Mail/dovecot.index.log b/Mail/dovecot.index.log deleted file mode 100644 index 5a18b9f0413f63a4ec5976e973b5b8325b5a7239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmZQ%)?g@G%9YN`n&;27&)T08*v`B7lIAft?{Y zF*7G6vk0W72Phx_k_DO9zLhim%Z2wW=`5Zv@`(iDF^xi$OY*^*5B>`6a%>pCJ)gMR@Vk{EJ$t&kOsNCh6SPD0>}rN Wg-?GANE1jO2RrHdK=v*G>H`3x*u)i-kF0TphBDe3|y8j4w1oqx~NT~qJ zI(Kj<57r0JP>$8hsxg!$hqs)Y2Y>S9{QB#XtPJj+59=MW-j-Yy`L-JQ;$B)%hX=e5 zT^@+>tiCq@#_xR}dzNRuSs!}?=Q*dA@vM1ADR~~&T)#AL=<+Vad&O~VwyV!N0e&#Z z&;Hn)@SM8KXm5x$eC6l4wUpjOUe5ps&J(>(@TYqH>~tn{`Jpb{$baa(UOB<* zGEfietq##+&s=37Kfw)_DbK_je)ObNndO;4aQ1nw)8^|Z`BOa~12d^>BJaKPd?U*< zU!bjaHQ2>n1H3wOZZIVeE0G2@=X5#f>ZrJn3JF9ix*?^ePb=~MQ3U|#=n6i z>?P*sgM;ru{LFH8ycm=7>pK3#cY(OFa^$5M>;$aA?}Bk~pAptL@Bz2)7T1gTmy?3* zHlNpm`U`4&WBKM2Ys2Y0>Mlv6RjYTs;C1V%`ipW$;C|)wrqpC^L7LUZUaiqi)I^#F zYDRthw4&U7p3};leVp~~hq`nY=8;8RAGMbD(7qi`QPe}ti|@G}j{S4bc;Q3w@p%*_ znz{Ci_z|x4v!{7}6mMr3%b3tKo@Z_HynR2V8njP8kY`+`gHI(GOF^I2;|I5={W2}Yr_IB(&8zhYgx43)%2|ZoBCXrSvDQWA jK@S%6Wty`*+L_#=;-t0Mma5wc)R diff --git a/sent/.gitignore b/sent/.gitignore new file mode 100644 index 0000000..f59ec20 --- /dev/null +++ b/sent/.gitignore @@ -0,0 +1 @@ +* \ No newline at end of file diff --git a/sent/cur/1726191712.1475017_1.nest:2,S b/sent/cur/1726191712.1475017_1.nest:2,S deleted file mode 100644 index ffffb97..0000000 --- a/sent/cur/1726191712.1475017_1.nest:2,S +++ /dev/null @@ -1,10 +0,0 @@ -Date: Fri, 13 Sep 2024 01:41:52 +0000 -From: neon -To: neon@saahild.com -Subject: Hi -Message-ID: -MIME-Version: 1.0 -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline - -Hello World! diff --git a/sent/cur/1728689575.2987466_1.nest:2,S b/sent/cur/1728689575.2987466_1.nest:2,S deleted file mode 100644 index e3e2e4b..0000000 --- a/sent/cur/1728689575.2987466_1.nest:2,S +++ /dev/null @@ -1,157 +0,0 @@ -Date: Fri, 11 Oct 2024 23:32:55 +0000 -From: neon -To: neon@saahild.com -Subject: [no-reply@spotify.com: Confirm your email address] -Message-ID: -MIME-Version: 1.0 -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline -Content-Transfer-Encoding: quoted-printable - ------ Forwarded message from Spotify ----- - -Date: Fri, 11 Oct 2024 23:31:22 +0000 (UTC) -=46rom: Spotify -To: neon@hackclub.app -Subject: Confirm your email address - - -Keep your account secure. - - -Confirm your email address so you can always access your account and get im= -portant info from us. - - - -CONFIRM EMAIL ( https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4x= -JMKaKnYeEWqP80O6RX1DItCzt-2B8F-2FkNegH5Y5z0NFRkWYeaF90T91gX2FmXd-2BeE6e3vvG= -BIHluSK7CCr2uBMyW37kNSsb4CjXJHD-2FYnTalz2RweGJvSZhQBVvyZteskWjD-2BnCp9IzM20= -OHRbUcJHvvDbDFbEV-2Fcd9z-2BZXc0VZXVyH-2BX9JV-2FMWmenexEz43xqJz4vdw0A-3D-3DP= -DMC_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2h= -Z7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2= -Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJ= -AnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZ= -OMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4Adlhsv= -K0KqhZP51laajLwlUGaeXw-2B-2FcwkcYPIrqsd6LIowkZdqZfBMfipiOJPcOUBKGhx-2FkB6Bj= -PQsyTQLO6H8TFPfZYXRLSDUZT6CqbIq7disObe3fohzCCM0x11OlLnA7J5DAFwc0kj46FzfYDZm= -9q1nuxmiGcw-2FSFIVmPtz3Xcp-2FFdAHXyYW6CqeQOg7GtH01mfjVLhLId8u8TOYS-2BEmLaIx= -Adxw484u ) - - -If you're having trouble viewing the button above, please click this link i= -nstead. ( https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKn= -YeEWqP80O6RX1DItCzt-2B8F-2FkNegH5Y5z0NFRkWYeaF90T91gX2FmXd-2BeE6e3vvGBIHluS= -K7CCr2uBMyW37kNSsb4CjXJHD-2FYnTalz2RweGJvSZhQBVvyZteskWjD-2BnCp9IzM20OHRbUc= -JHvvDbDFbEV-2Fcd9z-2BZXc0VZXVyH-2BX9JV-2FMWmenexEz43xqJz4vdw0A-3D-3DTQu9_rS= -ILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJs= -OigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1= -FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPb= -l-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84p= -n2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZ= -P5I0VIkwlAd8hB5-2FAZs108-2F-2BGCOsj-2Bgykf-2Bvl4NcSV-2BIkeLt6IQVkyo58IkUZMS= -5eVW31OJ-2BhjrS9Rlappu4pZmT9DxQA4HWlRLw1sOWyQQQ7kqj5-2FS-2BQk-2B-2B1ygSlRLD= -MwZwzJHuYozvVBLrziN6mn4m-2B3QZXLB-2BgV4dGYISwLF-2FVzTxRpG6-2FYhzwZAVBZDmv0o= -lZvooy-2FhDbTs8RTY7kHW ) - - -------------- - -Get Spotify for: - * iPhone (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKa= -KnYXcWD5t7SznLQ7jbi9fm4wXE2-2FUTgChz-2B9dWj0RF4A-2B-2FPqhwDzYQ2q6L-2Fo36FWS= -MXw-3D-3D1-ZP_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb= -1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1s= -OGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2By= -yEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP= -8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23= -BQJ4AdlhsvK0KqhZP54mLf6z3-2F1obe9Fl1Pj7g6oHlAItNZbTFU2ICWavmAeMHSfKgZHmvA-2= -BRsAef5sc3yRP-2FJvrzov38hQXM9LLAUeT534f0w6URgv7QizPchQjtRcwMcBby7cjbDds-2Bp= -0nVic-2BgCmkg8o8-2B5nATceyuogBNkNcWcnIsCmguwV47RyG32f5deKB1tCQdzWS1mRL7SNbR= --2FMBytJ1rWXqZ1pdsxg - * iPad (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKn= -YXcWD5t7SznLQ7jbi9fm4wXE2-2FUTgChz-2B9dWj0RF4A-2B-2FPqhwDzYQ2q6L-2Fo36FWSMX= -w-3D-3D82DE_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-= -2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOG= -aRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyE= -W7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U= -5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQ= -J4AdlhsvK0KqhZP4tmPAsUu4Q91Tn-2FOBIRUqk57farwnI2g702SZqoYIvCRhU-2FCou-2FR6t= -EwN35rWf2OqzCBZJXgOKPTnWD6xbzQgc2ybIuiTdmYI6dHn15vtqLlW62f2iAr-2FtsKbrQ89rc= -XsaLgRW-2FAuMKxGpEHNOlOiNYno2QK3mZliGdJUOntffnjEMJViCb-2FA0aosytRRXa9hhLt5d= -qe2ajkF-2F2XmdJATw - * Android (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMK= -aKnYZ7kDS6OqrlZhfX6g3CIsPG2xJ7qD5V6Nq-2Bj4HF0JYUDZLHZTku6CN8YeQdHLRil6nuNo0= -YpM2e5dOW9VCcVj98-3DBeEn_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5= -q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-= -2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3= -Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECf= -FkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf= -6X75OXhZo23BQJ4AdlhsvK0KqhZP5MBpTo-2FTlm1iqf0En0WVGqNR-2FojGGBDc11DQSNlfpyI= -jcHXDPVOObSu1mBJad-2Bx3f52L-2F0RQ7HKyssnChXIXRbQJMwlpBYgtEPrNXk0NcYjyhdEI4F= -FqDOxdIRAUHFf5j-2Fbcf1-2Bb6CjoLF-2B3N46KThUrzuMeYHqxcWGTpxC37oM8ntoaheGeI1y= -TrWKtHqJR1gKVYekypPx0ZcXVul1vT2 - * Other (https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaK= -nYeEWqP80O6RX1DItCzt-2B8F-2F4J7cG5ag75VBZOT6AkehBbdKO_rSILTv32uut97hzOKlbLN= -gOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6= -jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47= -UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXp= -m-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anm= -ns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZP5mB4U9AlWbFoUiMUhU= -JP8anK3MNMJn2jrqTa06vXYsdZnDnEJeUurds4KZJBYhQ4fMHC0zNY-2FgTfJalcX-2BU7JYcSx= -RkfWSRIfFE6-2Fjtf0JOxc5b4bRQtsf7hoIB1qEMNb9Ooct1kdNZFzw5G4h00q4ipukfMhdCBO1= -NrWYshZ-2B3uSiJv3E3oihECUjlvMMzkWO6LbmFGAkzc-2FIOJRZ4cHP - -This message was sent to neon@hackclub.app. - -If you have questions or complaints, please contact us ( https://wl.spotify= -=2Ecom/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJMKaKnYeEWqP80O6RX1DItCzt-2B8F8y= -rwr9o-2FoLOV-2ByfejY7xYh8r0jlsi4Br2WmvP5pwqHWQ-3D-3DP2GX_rSILTv32uut97hzOKl= -bLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmd= -kp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmR= -n47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZw= -iXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8= -anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23BQJ4AdlhsvK0KqhZP7aRU-2BF5PXBRrn= -8v0g5wsiu7d6Bb5AyYcWq60V00Uzsl4azqiGCrPglzJSsUnk2bUvc1riww02wBKkoHUFCiCzpFB= -CHe4ELxnWnhelldqpk-2Fey3FCOuC5z7JoDcn1pVHvGTHvCv0WT5kA2z9gp0CQa-2Bg-2B09lfG= -4co3iSG5Xby5YNmc-2BQcuv-2FofttvEQ2yTnkk4Es0bnfL3pd2ARuKoddcCb ). - - * Terms of Use https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4= -xJMKaKnYeEWqP80O6RX1DItCzt-2B8F-2BpqUhahFK7joJQpeQ1u2ejlJfRzUqiLoD-2Bb-2BZa= -LwNvIA-3D-3DkJV__rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1Fg= -Ovb1-2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHE= -v1sOGaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-= -2ByyEW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLr= -ddP8U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZ= -o23BQJ4AdlhsvK0KqhZP6TVjfnAtCpDnKbjIYi0FZd2hpdI2DcNudk4c-2BGmMoydGlVA-2Fser= --2BDhYGMGlPTpE1UxWEJlUcQl70FTQhYbtiTj0PE4Ezr9IojurVL1BZ-2F7Vn24aFaRQivRiB2k= -FWlC8JaFrXVnC1umB2q8b-2BfKUkEwM-2FNdP4uWAGb1Llci4JUs37yeWTAJcbyregIY-2Ftpda= -IyjHWPmCx5FkaNhC7HVmem0 - * Privacy Policy https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tf= -D4xJMKaKnYeEWqP80O6RX1DItCzt-2B8F9Wk56egplPtaZ3gd3iEuluykuY18JS75vSYpyYsMRf= -fw-3D-3DSihG_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1= --2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sO= -GaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2Byy= -EW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8= -U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23B= -QJ4AdlhsvK0KqhZP5v8EDcTu0Tv7rrFHu7ac3HPVLzaDGGgr5l-2FrsanPGz2z7En4yafRBAqGK= -28EMIHvYrZY2bD-2FM0xDdMONtd8RcvSCcKXv1lhdxDnj7AHoYyFLSlSagYPNISJfqcnulwKvQR= -VirXH-2FZxga-2B6Irrs6VhT3BDf7E5IUqfMObyzQLpqLeKMM6iz12NxF6EVWILmP72GjoqAqwY= -xk8xewUXb6ju-2F - * Contact Us https://wl.spotify.com/ls/click?upn=3Du001.cl-2BALPAc5tfD4xJ= -MKaKnYeEWqP80O6RX1DItCzt-2B8F8yrwr9o-2FoLOV-2ByfejY7xYh8r0jlsi4Br2WmvP5pwqH= -WQ-3D-3DXIt7_rSILTv32uut97hzOKlbLNgOi3oQwqd7b7TRgxrTnZBv1STIEl5q7VsV1FgOvb1= --2BNTmo2hZ7IfJsOigOcLxvHN0ajcmdkp6jyOYM1RBCS6iN4Va-2FCaqt8D7VK-2BwvSFHEv1sO= -GaRNi5b-2Brivk1FEyY8PSKRm2MrxmRn47UWYeWKE9Hc7jQb0hnobwxwDZLeby3Q7Wbs3S-2Byy= -EW7JASIjJAnxrPbl-2BI3dT0WdaCjZwiXpm-2FnHEBk1kBXOXbQi-2Fvv2FNECfFkecqsLrddP8= -U5OgM6aXZOMH84pn2FsA1BKoztt5Nx8anmns10k1R5DAP2K0yc6TdFEhlP0lKBf6X75OXhZo23B= -QJ4AdlhsvK0KqhZP7-2BMrMlbp-2Bcr2Dfrh241h6ZTIpWhZdawIj26EjjVVybc6WsubqpxVpDf= -4OAzdzgrtr2eYyfbZu4cjKiqbG7yf8jPbuPCghhhx78YV232XW1SXquLTn6uPYhWsAAafIHz-2B= -zvf5IFd-2FygcunWiii16WsSmBWg0upSOYHL964Y5zDGnx2VFLrAitscuu2-2FbrBUaAB8VZAiA= -2dvsE5rCrgMM9R2 - - -Spotify USA Inc, 4 World Trade Center, 150 Greenwich Street, 62nd Floor, Ne= -w York, NY 10007, USA - ------ End forwarded message ----- From 98b3cf258bfdb1cf2ab8e52a5fe6527a7e48f93d Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:12:36 +0000 Subject: [PATCH 25/37] enhancement(lint): Fix lint errors for Mail/.gitignore Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- Mail/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mail/.gitignore b/Mail/.gitignore index f59ec20..72e8ffc 100644 --- a/Mail/.gitignore +++ b/Mail/.gitignore @@ -1 +1 @@ -* \ No newline at end of file +* From 7ef5256e6309fc5d4f8d681effab32639de52a21 Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:12:38 +0000 Subject: [PATCH 27/37] enhancement(lint): Fix lint errors for sent/.gitignore Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- sent/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sent/.gitignore b/sent/.gitignore index f59ec20..72e8ffc 100644 --- a/sent/.gitignore +++ b/sent/.gitignore @@ -1 +1 @@ -* \ No newline at end of file +* From 8c24a2760f2edc3386b77ed26ec7592e1a1c170e Mon Sep 17 00:00:00 2001 From: Saahil Date: Sun, 13 Oct 2024 00:12:54 -0400 Subject: [PATCH 28/37] chore(.gitignore): update to ignore mail (i think) --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bf31f6b..430d3bb 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,10 @@ .config/git .config/pulse # tokens .config/caddy - +Mail +sent +Mail/* # mail sent to neon@hackclub.app is here +sent/* # all sent mail is there .bun .local .nix-profile From 1282743295115d9bd2a4f1d9bb95513f478f7675 Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:12:57 +0000 Subject: [PATCH 29/37] enhancement(lint): Fix lint errors for .gitignore Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 430d3bb..825f613 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ .config/git .config/pulse # tokens .config/caddy -Mail +Mail sent Mail/* # mail sent to neon@hackclub.app is here sent/* # all sent mail is there From a93103d996c9fdd052e9dc6e91478f68fb22a85a Mon Sep 17 00:00:00 2001 From: Saahil Date: Sun, 13 Oct 2024 00:16:35 -0400 Subject: [PATCH 30/37] update: add domain to caddy --- Caddyfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Caddyfile b/Caddyfile index 12182d2..ee5c743 100644 --- a/Caddyfile +++ b/Caddyfile @@ -9,3 +9,7 @@ http://neon.hackclub.app { } } +http://spotify.hackclub.app { + bind unix/.spotify.sock|777 + reverse_proxy localhost:378625 +} From fdd184a8eb991ded20da2af678b673fcd9ec9820 Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:16:44 +0000 Subject: [PATCH 32/37] enhancement(lint): Fix lint errors for hackclub-spotify-bot/src/index.js Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- hackclub-spotify-bot/src/index.js | 48 +++++++++++++++++-------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/hackclub-spotify-bot/src/index.js b/hackclub-spotify-bot/src/index.js index be64aaf..1b2b721 100644 --- a/hackclub-spotify-bot/src/index.js +++ b/hackclub-spotify-bot/src/index.js @@ -18,14 +18,17 @@ const db = new QuickDB({ filePath: "./data/songs.sqlite", }); -function arrayToCsv(data){ - return data.map(row => - row - .map(String) // convert every value to String - .map(v => v.replaceAll('"', '""')) // escape double quotes - .map(v => `"${v}"`) // quote it - .join(',') // comma-separated - ).join('\r\n'); // rows starting on new lines +function arrayToCsv(data) { + return data + .map( + (row) => + row + .map(String) // convert every value to String + .map((v) => v.replaceAll('"', '""')) // escape double quotes + .map((v) => `"${v}"`) // quote it + .join(","), // comma-separated + ) + .join("\r\n"); // rows starting on new lines } let cacheDb = {}; @@ -168,18 +171,19 @@ app.get("/home", async (req, res) => { s: req.query.s, }); }); -app.get('/download/db', async (req,res) => { - if(!req.session.info) return res.redirect("/login") +app.get("/download/db", async (req, res) => { + if (!req.session.info) return res.redirect("/login"); const allSongs = await db.all(); -const csvData = arrayToCsv([["slack_id", "url","song_id", "added_at"], -...allSongs.map(d => { - return [d.value.added_by, d.value.song_url, d.id, d.value.added_at] -}) -]) -res.setHeader('Content-Type', 'text/csv'); -res.setHeader('Content-Disposition', 'attachment; filename="songs.csv"'); -res.send(csvData); -}) + const csvData = arrayToCsv([ + ["slack_id", "url", "song_id", "added_at"], + ...allSongs.map((d) => { + return [d.value.added_by, d.value.song_url, d.id, d.value.added_at]; + }), + ]); + res.setHeader("Content-Type", "text/csv"); + res.setHeader("Content-Disposition", 'attachment; filename="songs.csv"'); + res.send(csvData); +}); app.post("/spotify/submitsong", async (req, res) => { if (!req.session.token) return res.redirect("/login"); if (!cacheDb[req.query.token]) return res.redirect(`/home?error=0`); @@ -254,9 +258,9 @@ app.listen(process.env.PORT || 3000, async () => { if (getCredentials() !== null) refreshToken(getCredentials().refresh_token); }); -process.on('uncaughtException', function(err) { +process.on("uncaughtException", function (err) { console.log(err); }); -process.on('unhandledRejection', function(err) { +process.on("unhandledRejection", function (err) { console.log(err); -}); \ No newline at end of file +}); From 8848d40b68bd952ac1d2f8d14a55d240675d34c2 Mon Sep 17 00:00:00 2001 From: "zeon-neon[bot]" <136533918+zeon-neon[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:16:45 +0000 Subject: [PATCH 33/37] enhancement(lint): Fix lint errors for hackclub-spotify-bot/src/public/hackclub.css Co-authored-by: NeonGamerBot-QK Signed-off-by: zeon-neon[bot] <136533918+zeon-neon[bot]@users.noreply.github.com> --- hackclub-spotify-bot/src/public/hackclub.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hackclub-spotify-bot/src/public/hackclub.css b/hackclub-spotify-bot/src/public/hackclub.css index ca397f2..2c85c22 100644 --- a/hackclub-spotify-bot/src/public/hackclub.css +++ b/hackclub-spotify-bot/src/public/hackclub.css @@ -641,4 +641,4 @@ td { .success { color: var(--green); font-weight: bold; -} \ No newline at end of file +}