commit 89ece17e0279d6bde205538e85abe76180c2d56a Author: Hare Date: Mon Oct 21 02:37:56 2024 +0900 lettia diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ceaea36 --- /dev/null +++ b/.gitignore @@ -0,0 +1,132 @@ +# ---> Node +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1612283 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM node:22-alpine + +WORKDIR /app + +COPY package.json /app +COPY package-lock.json /app +COPY .env /app +COPY tsconfig.json /app +COPY src /app/src + +RUN npm i + +CMD ["npm", "run", "start"] \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/config.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/default.env b/default.env new file mode 100644 index 0000000..d5b953c --- /dev/null +++ b/default.env @@ -0,0 +1,2 @@ +TOKEN = 0 # Your bot token +CLIENT_ID = 0 # Your bot client ID \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e514679 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,866 @@ +{ + "name": "discord-lettia", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "discord.js": "^14.16.3", + "dotenv": "^16.4.5" + }, + "devDependencies": { + "tsx": "^4.19.1", + "typescript": "^5.6.3" + } + }, + "node_modules/@discordjs/builders": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", + "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/formatters": "^0.5.0", + "@discordjs/util": "^1.1.1", + "@sapphire/shapeshift": "^4.0.0", + "discord-api-types": "0.37.97", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.4", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, + "node_modules/@discordjs/collection": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/formatters": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", + "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", + "license": "Apache-2.0", + "dependencies": { + "discord-api-types": "0.37.97" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/formatters/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, + "node_modules/@discordjs/rest": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", + "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.1.1", + "@discordjs/util": "^1.1.1", + "@sapphire/async-queue": "^1.5.3", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "0.37.97", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.19.8" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, + "node_modules/@discordjs/util": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", + "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "tslib": "^2.6.2", + "ws": "^8.16.0" + }, + "engines": { + "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws/node_modules/discord-api-types": { + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", + "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", + "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v16" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@types/node": { + "version": "22.7.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz", + "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", + "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/discord-api-types": { + "version": "0.37.100", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", + "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==", + "license": "MIT" + }, + "node_modules/discord.js": { + "version": "14.16.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", + "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/builders": "^1.9.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.5.0", + "@discordjs/rest": "^2.4.0", + "@discordjs/util": "^1.1.1", + "@discordjs/ws": "1.1.1", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.100", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "^2.6.3", + "undici": "6.19.8" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "license": "MIT" + }, + "node_modules/magic-bytes.js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==", + "license": "MIT" + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a2e53f5 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "scripts": { + "start": "tsx src/index.ts" + }, + "type": "module", + "dependencies": { + "discord.js": "^14.16.3", + "dotenv": "^16.4.5" + }, + "devDependencies": { + "tsx": "^4.19.1", + "typescript": "^5.6.3" + } +} diff --git a/src/context_commands.ts b/src/context_commands.ts new file mode 100644 index 0000000..655595b --- /dev/null +++ b/src/context_commands.ts @@ -0,0 +1,7 @@ +import { ApplicationCommandType, ContextMenuCommandBuilder, ContextMenuCommandType } from "discord.js"; + +export default [ + new ContextMenuCommandBuilder() + .setName("Fontify") + .setType(ApplicationCommandType.Message as ContextMenuCommandType) +] \ No newline at end of file diff --git a/src/font.ts b/src/font.ts new file mode 100644 index 0000000..8e05483 --- /dev/null +++ b/src/font.ts @@ -0,0 +1,34 @@ +export class Font { + preprocesser?: (text: string) => string + letters: { [key: string]: number } + constructor(patterns: { [key: string]: number | number[] }, preprocesser?: (text: string) => string) { + this.preprocesser = preprocesser; + this.letters = {}; + for (const [key, value] of Object.entries(patterns)) { + const keys = key.split("|").map((v) => { + if (v.length === 1) return v.charCodeAt(0); + const [start, end] = v.split("-"); + if (start === undefined || end === undefined || end.length !== 1 || start.length !== 1) + return + return [...Array(end.charCodeAt(0) - start.charCodeAt(0) + 1).keys()].map((i) => start.charCodeAt(0) + i); + }).filter((v) => v !== undefined); + + for (const key of keys) { + if (Array.isArray(key)) { + if (Array.isArray(value)) for (let [i, v] of key.entries()) { + if (value[i] === undefined) continue; + this.letters[String.fromCharCode(v)] = value[i]; + } + else for (let [i, v] of key.entries()) { + this.letters[String.fromCharCode(v)] = value + i; + } + } else { + let v = Array.isArray(value) ? value[0] : value; + this.letters[String.fromCharCode(key)] = v; + } + } + } + console.log(Object.entries(this.letters).map(([k, v]) => `${k}`).join("")); + console.log(Object.entries(this.letters).map(([k, v]) => `${String.fromCodePoint(v)}`).join("")); + } +} \ No newline at end of file diff --git a/src/fontlist.ts b/src/fontlist.ts new file mode 100644 index 0000000..abb45ef --- /dev/null +++ b/src/fontlist.ts @@ -0,0 +1,26 @@ +import { Font } from "./font.ts"; +import smallcaps from "./fonts/smallcaps.ts"; +import monoscape from "./fonts/monoscape.ts"; +import script from "./fonts/script.ts"; +import script_bold from "./fonts/script_bold.ts"; +import fraktor from "./fonts/fraktor.ts"; +import sansserif from "./fonts/sansserif.ts"; +import sansserif_bold from "./fonts/sansserif_bold.ts"; +import sansserif_italic from "./fonts/sansserif_italic.ts"; +import sansserif_bolditalic from "./fonts/sansserif_bolditalic.ts"; +import wide from "./fonts/wide.ts"; + +const fontlist: { label: string; value: string; font: Font }[] = [ + { label: 'Monospace', value: 'monospace', font: monoscape }, + { label: "Smallcaps", value: "smallcaps", font: smallcaps }, + { label: 'Scrpt', value: 'script', font: script }, + { label: 'Scrpt Bold', value: 'scriptbold', font: script_bold }, + { label: 'Fraktor', value: 'fraktor', font: fraktor }, + { label: 'Sans-serif', value: 'sansserif', font: sansserif }, + { label: 'Sans-serif Bold', value: 'sansserifbold', font: sansserif_bold }, + { label: 'Sans-serif Italic', value: 'sansserifitalic', font: sansserif_italic }, + { label: 'Sans-serif Bold Italic', value: 'sansserifbolditalic', font: sansserif_bolditalic }, + { label: 'Wide', value: 'wide', font: wide }, +]; + +export default fontlist; diff --git a/src/fonts/fraktor.ts b/src/fonts/fraktor.ts new file mode 100644 index 0000000..9a92dda --- /dev/null +++ b/src/fonts/fraktor.ts @@ -0,0 +1,11 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0x1D504, + 'a-z': 0x1D504 + 26, + 'C': 0x212D, + 'H': 0x210C, + 'I': 0x2111, + 'R': 0x211C, + 'Z': 0x2128, +}) diff --git a/src/fonts/monoscape.ts b/src/fonts/monoscape.ts new file mode 100644 index 0000000..722cf94 --- /dev/null +++ b/src/fonts/monoscape.ts @@ -0,0 +1,7 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0x1D670, + 'a-z': 0x1D670 + 26, + '0-9': 0x1D7F6, +}) diff --git a/src/fonts/sansserif.ts b/src/fonts/sansserif.ts new file mode 100644 index 0000000..e6f1b98 --- /dev/null +++ b/src/fonts/sansserif.ts @@ -0,0 +1,7 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0x1D5A0, + 'a-z': 0x1D5A0 + 26, + '0-9': 0x1D7E2, +}) \ No newline at end of file diff --git a/src/fonts/sansserif_bold.ts b/src/fonts/sansserif_bold.ts new file mode 100644 index 0000000..e9a8bbe --- /dev/null +++ b/src/fonts/sansserif_bold.ts @@ -0,0 +1,57 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0x1D5D4, + 'a-z': 0x1D5D4 + 26, + '0-9': 0x1D7EC, + 'Α': 0x1D756, + 'Β': 0x1D757, + 'Γ': 0x1D758, + 'Δ': 0x1D759, + 'Ε': 0x1D75A, + 'Ζ': 0x1D75B, + 'Η': 0x1D75C, + 'Θ': 0x1D75D, + 'Ι': 0x1D75E, + 'Κ': 0x1D75F, + 'Λ': 0x1D760, + 'Μ': 0x1D761, + 'Ν': 0x1D762, + 'Ξ': 0x1D763, + 'Ο': 0x1D764, + 'Π': 0x1D765, + 'Ρ': 0x1D766, + 'Σ': 0x1D768, + 'Τ': 0x1D769, + 'Υ': 0x1D76A, + 'Φ': 0x1D76B, + 'Χ': 0x1D76C, + 'Ψ': 0x1D76D, + 'Ω': 0x1D76E, + 'α': 0x1D770, + 'β': 0x1D771, + 'γ': 0x1D772, + 'δ': 0x1D773, + 'ε': 0x1D774, + 'ζ': 0x1D775, + 'η': 0x1D776, + 'θ': 0x1D777, + 'ι': 0x1D778, + 'κ': 0x1D779, + 'λ': 0x1D77A, + 'μ': 0x1D77B, + 'ν': 0x1D77C, + 'ξ': 0x1D77D, + 'ο': 0x1D77E, + 'π': 0x1D77F, + 'ρ': 0x1D780, + 'σ': 0x1D782, + 'ς': 0x1D781, + 'τ': 0x1D783, + 'υ': 0x1D784, + 'φ': 0x1D785, + 'χ': 0x1D786, + 'ψ': 0x1D787, + 'ω': 0x1D788, + '∇': 0x1D76F, +}) \ No newline at end of file diff --git a/src/fonts/sansserif_bolditalic.ts b/src/fonts/sansserif_bolditalic.ts new file mode 100644 index 0000000..5af0e0e --- /dev/null +++ b/src/fonts/sansserif_bolditalic.ts @@ -0,0 +1,56 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0x1D63C, + 'a-z': 0x1D63C + 26, + 'Α': 0x1D790, + 'Β': 0x1D791, + 'Γ': 0x1D792, + 'Δ': 0x1D793, + 'Ε': 0x1D794, + 'Ζ': 0x1D795, + 'Η': 0x1D796, + 'Θ': 0x1D797, + 'Ι': 0x1D798, + 'Κ': 0x1D799, + 'Λ': 0x1D79A, + 'Μ': 0x1D79B, + 'Ν': 0x1D79C, + 'Ξ': 0x1D79D, + 'Ο': 0x1D79E, + 'Π': 0x1D79F, + 'Ρ': 0x1D7A0, + 'Σ': 0x1D7A2, + 'Τ': 0x1D7A3, + 'Υ': 0x1D7A4, + 'Φ': 0x1D7A5, + 'Χ': 0x1D7A6, + 'Ψ': 0x1D7A7, + 'Ω': 0x1D7A8, + 'α': 0x1D7AA, + 'β': 0x1D7AB, + 'γ': 0x1D7AC, + 'δ': 0x1D7AD, + 'ε': 0x1D7AE, + 'ζ': 0x1D7AF, + 'η': 0x1D7B0, + 'θ': 0x1D7B1, + 'ι': 0x1D7B2, + 'κ': 0x1D7B3, + 'λ': 0x1D7B4, + 'μ': 0x1D7B5, + 'ν': 0x1D7B6, + 'ξ': 0x1D7B7, + 'ο': 0x1D7B8, + 'π': 0x1D7B9, + 'ρ': 0x1D7BA, + 'σ': 0x1D7BC, + 'ς': 0x1D7BB, + 'τ': 0x1D7BD, + 'υ': 0x1D7BE, + 'φ': 0x1D7BF, + 'χ': 0x1D7C0, + 'ψ': 0x1D7C1, + 'ω': 0x1D7C2, + '∇': 0x1D7A9, +}) \ No newline at end of file diff --git a/src/fonts/sansserif_italic.ts b/src/fonts/sansserif_italic.ts new file mode 100644 index 0000000..7583e44 --- /dev/null +++ b/src/fonts/sansserif_italic.ts @@ -0,0 +1,6 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0x1D608, + 'a-z': 0x1D608 + 26, +}) \ No newline at end of file diff --git a/src/fonts/script.ts b/src/fonts/script.ts new file mode 100644 index 0000000..086de7e --- /dev/null +++ b/src/fonts/script.ts @@ -0,0 +1,17 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0x1D49C, + 'a-z': 0x1D49C + 26, + 'B': 0x212C, + 'E': 0x2130, + 'F': 0x2131, + 'H': 0x210B, + 'I': 0x2110, + 'L': 0x2112, + 'M': 0x2133, + 'R': 0x211B, + 'e': 0x212F, + 'g': 0x210A, + 'o': 0x2134, +}) diff --git a/src/fonts/script_bold.ts b/src/fonts/script_bold.ts new file mode 100644 index 0000000..f4ab1a2 --- /dev/null +++ b/src/fonts/script_bold.ts @@ -0,0 +1,6 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0x1D4D0, + 'a-z': 0x1D4D0 + 26, +}) diff --git a/src/fonts/smallcaps.ts b/src/fonts/smallcaps.ts new file mode 100644 index 0000000..50c463d --- /dev/null +++ b/src/fonts/smallcaps.ts @@ -0,0 +1,32 @@ +import { Font } from "../font.ts" + +export default new Font({ + "A-Z|a-z": [ + 0x1D00, + 0x0299, + 0x1D04, + 0x1D05, + 0x1D07, + 0x0493, + 0x0262, + 0x029C, + 0x026A, + 0x1D0A, + 0x1D0B, + 0x029F, + 0x1D0D, + 0x0274, + 0x1D0F, + 0x1D18, + 0x01EB, + 0x0280, + 0x0073, + 0x1D1B, + 0x1D1C, + 0x1D20, + 0x1D21, + 0x0078, + 0x028F, + 0x1D22, + ] +}) \ No newline at end of file diff --git a/src/fonts/wide.ts b/src/fonts/wide.ts new file mode 100644 index 0000000..7745d38 --- /dev/null +++ b/src/fonts/wide.ts @@ -0,0 +1,7 @@ +import { Font } from "../font.ts" + +export default new Font({ + 'A-Z': 0xFF21, + 'a-z': 0xFF41, + '0-9': 0xFF10, +}) diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..700d508 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,47 @@ +import 'dotenv/config' +const TOKEN = process.env.TOKEN; +const CLIENT_ID = process.env.CLIENT_ID; +if (!TOKEN || !CLIENT_ID) { + console.error(`No ${TOKEN ? "CLIENT_ID" : "TOKEN"} provided`); + process.exit(); +} + +import { + REST, + Routes, + Client, + GatewayIntentBits, +} from "discord.js"; + +import commands from "./context_commands.ts"; +const rest = new REST({ version: "10" }).setToken(TOKEN); +try { + console.log("refreshing slash commands..."); + // await rest.put(Routes.applicationCommands(CLIENT_ID), { body: commands }); + console.log("OK"); +} catch (error) { + console.error(error); +} + +const client = new Client({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.GuildMessageReactions, + GatewayIntentBits.MessageContent, + ] +}); + +client.on("ready", () => { + if (!client.user) { + console.error("Failed to login"); + process.exit(); + } + console.log(`Logged in as ${client.user.tag}!`); + client.user.setActivity("kawaii fonts!"); +}); + +import interactionCreate from './listener/interaction_create.ts'; +client.on("interactionCreate", interactionCreate); + +client.login(TOKEN); diff --git a/src/listener/interaction_create.ts b/src/listener/interaction_create.ts new file mode 100644 index 0000000..d52a0b0 --- /dev/null +++ b/src/listener/interaction_create.ts @@ -0,0 +1,65 @@ +import { CacheType, Interaction } from "discord.js"; + +import selection_compoent from "../selection_compoent.ts"; +import list from "../fontlist.ts"; + +const proc_cache: { + [id: string]: { + resolve?: (value: string) => void, + text: string + } +} = {}; + +export default async (interaction: Interaction) => { + if (interaction.isMessageContextMenuCommand()) { + if (interaction.commandName === "Fontify") { + try { + await interaction.deferReply({ ephemeral: false }); + await interaction.followUp({ + content: "-# " + interaction.targetMessage.id, + components: [selection_compoent], + }) + proc_cache[interaction.targetMessage.id] = { text: interaction.targetMessage.content }; + new Promise((resolve) => { + proc_cache[interaction.targetMessage.id].resolve = resolve; + }).then((value) => { + interaction.editReply({ + content: "```\n" + value + "\n```", + components: [], + }); + }).catch((e) => { + console.error(e); + }); + } catch (e) { + console.error(e); + } + } + } else if (interaction.isStringSelectMenu()) { + if (interaction.customId === "font_selection") { + try { + await interaction.reply({ + content: "Processing...", + ephemeral: true, + }); + const selected = interaction.values[0]; + const font = list.find((f) => f.value === selected)?.font; + if (!font) { + await interaction.followUp({ + content: "Invalid font selected!", + }); + return; + } + const id = interaction.message.content.slice(3); + const text = proc_cache[id].text; + // console.log(text); + const result = text.split("").map((c) => font.letters[c] ? String.fromCodePoint(font.letters[c]) : c).join(""); + // console.log(result); + await interaction.deleteReply(); + if (proc_cache[id].resolve) proc_cache[id].resolve(result); + else console.error(`Resolve function not found for id: ${id}`); + } catch (e) { + console.error(e); + } + } + } +} \ No newline at end of file diff --git a/src/selection_compoent.ts b/src/selection_compoent.ts new file mode 100644 index 0000000..e3bfb41 --- /dev/null +++ b/src/selection_compoent.ts @@ -0,0 +1,10 @@ +import { ActionRowBuilder, StringSelectMenuBuilder } from 'discord.js'; + +import list from './fontlist.ts'; + +export default new ActionRowBuilder().addComponents( + new StringSelectMenuBuilder() + .setCustomId('font_selection') + .setPlaceholder('Select a font') + .addOptions(list.map(({ label, value }) => ({ label, value }))) +); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..08b0586 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": [ + "ES2023" + ], + "module": "node16", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "allowImportingTsExtensions": true, + "noEmit": true, + + "outDir": "./dist", + }, + "include": [ + "src/**/*.ts" +, "src/font_translater.js" ] +} \ No newline at end of file