feat: add Dockerfile and .dockerignore; update index.js to use luxon for date handling

This commit is contained in:
Fd
2026-02-19 05:08:03 +07:00
parent 09bf752a9a
commit 811253dac1
5 changed files with 47 additions and 5 deletions
+2
View File
@@ -0,0 +1,2 @@
.env
node_modules
+27
View File
@@ -0,0 +1,27 @@
FROM node:20-bookworm-slim
# Install dependencies for canvas
RUN apt-get update && apt-get install -y \
build-essential \
libcairo2-dev \
libpango1.0-dev \
libjpeg-dev \
libgif-dev \
librsvg2-dev \
&& rm -rf /var/lib/apt/lists/*
# Install pnpm
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app
# Copy package files
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
# Install dependencies
RUN pnpm install --frozen-lockfile
# Copy application files
COPY . .
CMD ["pnpm", "start"]
+8 -5
View File
@@ -2,13 +2,15 @@ import "dotenv/config";
import cron from "node-cron"; import cron from "node-cron";
import { Client } from 'discord.js-selfbot-v13'; import { Client } from 'discord.js-selfbot-v13';
import { joinVoiceChannel } from "@discordjs/voice"; import { joinVoiceChannel } from "@discordjs/voice";
import { DateTime } from "luxon";
import generateMeme from "./meme.js"; import generateMeme from "./meme.js";
const TOKEN = process.env.TOKEN; const TOKEN = process.env.TOKEN;
const channelId = process.env.CHANNEL_ID; const channelId = process.env.CHANNEL_ID;
const TIMEZONE = "Asia/Jakarta";
// Ramadan 2026 start date (adjust as needed) // Ramadan 2026 start date - parsed with consistent timezone
const start = new Date(process.env.START_DATE); const start = DateTime.fromISO(process.env.START_DATE, { zone: TIMEZONE });
const days = { const days = {
1: "Pertama", 1: "Pertama",
@@ -63,14 +65,15 @@ client.on('ready', async () => {
cron.schedule(process.env.CRON, async () => { cron.schedule(process.env.CRON, async () => {
try { try {
console.log("Uploading...") console.log("Uploading...")
const now = new Date(); // Use luxon for timezone-aware day calculation
const diff = (Math.floor((now.getTime() - start.getTime())/(1000*60*60*24))) + 1; const now = DateTime.now().setZone(TIMEZONE);
const diff = Math.floor(now.startOf('day').diff(start.startOf('day'), 'days').days) + 1;
const image = await generateMeme("./assets/images/mr_crab.jpg", "SEMANGAT PUASA HARI " + (days[diff]?.toUpperCase() || "KE-" + diff), "YAA.... HARI " + (days[diff]?.toUpperCase() || "KE-" + diff)); const image = await generateMeme("./assets/images/mr_crab.jpg", "SEMANGAT PUASA HARI " + (days[diff]?.toUpperCase() || "KE-" + diff), "YAA.... HARI " + (days[diff]?.toUpperCase() || "KE-" + diff));
client.channels.fetch(process.env.CHANNEL_ID).then(channel => { client.channels.fetch(process.env.CHANNEL_ID).then(channel => {
channel.send({ channel.send({
files: [{ files: [{
attachment: image, attachment: image,
name: new Date().toLocaleDateString() + '.jpg' name: now.toFormat('dd-MM-yyyy') + '.jpg'
}] }]
}); });
}).catch(console.error); }).catch(console.error);
+1
View File
@@ -19,6 +19,7 @@
"debug": "^4.4.3", "debug": "^4.4.3",
"discord.js-selfbot-v13": "^3.7.1", "discord.js-selfbot-v13": "^3.7.1",
"dotenv": "^17.3.1", "dotenv": "^17.3.1",
"luxon": "^3.7.2",
"node-cron": "^4.2.1" "node-cron": "^4.2.1"
} }
} }
+9
View File
@@ -26,6 +26,9 @@ importers:
dotenv: dotenv:
specifier: ^17.3.1 specifier: ^17.3.1
version: 17.3.1 version: 17.3.1
luxon:
specifier: ^3.7.2
version: 3.7.2
node-cron: node-cron:
specifier: ^4.2.1 specifier: ^4.2.1
version: 4.2.1 version: 4.2.1
@@ -346,6 +349,10 @@ packages:
resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==}
engines: {node: '>= 0.6.0'} engines: {node: '>= 0.6.0'}
[email protected]:
resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==}
engines: {node: '>=12'}
[email protected]: [email protected]:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -896,6 +903,8 @@ snapshots:
[email protected]: {} [email protected]: {}
[email protected]: {}
[email protected]: {} [email protected]: {}
[email protected]: {} [email protected]: {}