feat: add Dockerfile and .dockerignore; update index.js to use luxon for date handling
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
.env
|
||||||
|
node_modules
|
||||||
+27
@@ -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"]
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+9
@@ -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]: {}
|
||||||
|
|||||||
Reference in New Issue
Block a user