From 7376c7ddd98209746d9062adc7704b21b313338c Mon Sep 17 00:00:00 2001 From: Taken Date: Fri, 29 Dec 2023 01:42:03 +0100 Subject: [PATCH] Added cron event handler --- package.json | 1 + src/interfaces/Cron.ts | 19 ++ src/interfaces/TimeZones.ts | 430 ++++++++++++++++++++++++++++++++++++ src/interfaces/index.ts | 5 + src/utils/Cron.ts | 20 ++ src/utils/Illegitimate.ts | 5 +- yarn.lock | 18 ++ 7 files changed, 495 insertions(+), 3 deletions(-) create mode 100644 src/interfaces/Cron.ts create mode 100644 src/interfaces/TimeZones.ts create mode 100644 src/utils/Cron.ts diff --git a/package.json b/package.json index e8ee55b..990462c 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "license": "GPL-3.0-only", "dependencies": { "axios": "^1.3.4", + "cron": "^3.1.6", "discord.js": "^14.8.0", "dotenv": "^16.0.3", "ioredis": "^5.3.2", diff --git a/src/interfaces/Cron.ts b/src/interfaces/Cron.ts new file mode 100644 index 0000000..f456337 --- /dev/null +++ b/src/interfaces/Cron.ts @@ -0,0 +1,19 @@ +import { CronCommand } from "cron" +import { TimeZones } from "." + +interface TimeFormat { + seconds: "*" | number + minutes: "*" | number + hours: "*" | number + dayOfMonth: "*" | number + month: "*" | number + dayOfWeek: "*" | number +} + +export default interface Cron { + time: TimeFormat + execute: () => void + onComplete?: null | undefined + start?: boolean | null | undefined + timeZone: keyof TimeZones +} \ No newline at end of file diff --git a/src/interfaces/TimeZones.ts b/src/interfaces/TimeZones.ts new file mode 100644 index 0000000..2f3be7c --- /dev/null +++ b/src/interfaces/TimeZones.ts @@ -0,0 +1,430 @@ +export default interface TimeZones { + "Africa/Abidjan": string + "Africa/Accra": string + "Africa/Addis_Ababa": string + "Africa/Algiers": string + "Africa/Asmera": string + "Africa/Bamako": string + "Africa/Bangui": string + "Africa/Banjul": string + "Africa/Bissau": string + "Africa/Blantyre": string + "Africa/Brazzaville": string + "Africa/Bujumbura": string + "Africa/Cairo": string + "Africa/Casablanca": string + "Africa/Ceuta": string + "Africa/Conakry": string + "Africa/Dakar": string + "Africa/Dar_es_Salaam": string + "Africa/Djibouti": string + "Africa/Douala": string + "Africa/El_Aaiun": string + "Africa/Freetown": string + "Africa/Gaborone": string + "Africa/Harare": string + "Africa/Johannesburg": string + "Africa/Juba": string + "Africa/Kampala": string + "Africa/Khartoum": string + "Africa/Kigali": string + "Africa/Kinshasa": string + "Africa/Lagos": string + "Africa/Libreville": string + "Africa/Lome": string + "Africa/Luanda": string + "Africa/Lubumbashi": string + "Africa/Lusaka": string + "Africa/Malabo": string + "Africa/Maputo": string + "Africa/Maseru": string + "Africa/Mbabane": string + "Africa/Mogadishu": string + "Africa/Monrovia": string + "Africa/Nairobi": string + "Africa/Ndjamena": string + "Africa/Niamey": string + "Africa/Nouakchott": string + "Africa/Ouagadougou": string + "Africa/Porto-Novo": string + "Africa/Sao_Tome": string + "Africa/Tripoli": string + "Africa/Tunis": string + "Africa/Windhoek": string + "America/Adak": string + "America/Anchorage": string + "America/Anguilla": string + "America/Antigua": string + "America/Araguaina": string + "America/Argentina/La_Rioja": string + "America/Argentina/Rio_Gallegos": string + "America/Argentina/Salta": string + "America/Argentina/San_Juan": string + "America/Argentina/San_Luis": string + "America/Argentina/Tucuman": string + "America/Argentina/Ushuaia": string + "America/Aruba": string + "America/Asuncion": string + "America/Bahia": string + "America/Bahia_Banderas": string + "America/Barbados": string + "America/Belem": string + "America/Belize": string + "America/Blanc-Sablon": string + "America/Boa_Vista": string + "America/Bogota": string + "America/Boise": string + "America/Buenos_Aires": string + "America/Cambridge_Bay": string + "America/Campo_Grande": string + "America/Cancun": string + "America/Caracas": string + "America/Catamarca": string + "America/Cayenne": string + "America/Cayman": string + "America/Chicago": string + "America/Chihuahua": string + "America/Ciudad_Juarez": string + "America/Coral_Harbour": string + "America/Cordoba": string + "America/Costa_Rica": string + "America/Creston": string + "America/Cuiaba": string + "America/Curacao": string + "America/Danmarkshavn": string + "America/Dawson": string + "America/Dawson_Creek": string + "America/Denver": string + "America/Detroit": string + "America/Dominica": string + "America/Edmonton": string + "America/Eirunepe": string + "America/El_Salvador": string + "America/Fort_Nelson": string + "America/Fortaleza": string + "America/Glace_Bay": string + "America/Godthab": string + "America/Goose_Bay": string + "America/Grand_Turk": string + "America/Grenada": string + "America/Guadeloupe": string + "America/Guatemala": string + "America/Guayaquil": string + "America/Guyana": string + "America/Halifax": string + "America/Havana": string + "America/Hermosillo": string + "America/Indiana/Knox": string + "America/Indiana/Marengo": string + "America/Indiana/Petersburg": string + "America/Indiana/Tell_City": string + "America/Indiana/Vevay": string + "America/Indiana/Vincennes": string + "America/Indiana/Winamac": string + "America/Indianapolis": string + "America/Inuvik": string + "America/Iqaluit": string + "America/Jamaica": string + "America/Jujuy": string + "America/Juneau": string + "America/Kentucky/Monticello": string + "America/Kralendijk": string + "America/La_Paz": string + "America/Lima": string + "America/Los_Angeles": string + "America/Louisville": string + "America/Lower_Princes": string + "America/Maceio": string + "America/Managua": string + "America/Manaus": string + "America/Marigot": string + "America/Martinique": string + "America/Matamoros": string + "America/Mazatlan": string + "America/Mendoza": string + "America/Menominee": string + "America/Merida": string + "America/Metlakatla": string + "America/Mexico_City": string + "America/Miquelon": string + "America/Moncton": string + "America/Monterrey": string + "America/Montevideo": string + "America/Montserrat": string + "America/Nassau": string + "America/New_York": string + "America/Nipigon": string + "America/Nome": string + "America/Noronha": string + "America/North_Dakota/Beulah": string + "America/North_Dakota/Center": string + "America/North_Dakota/New_Salem": string + "America/Ojinaga": string + "America/Panama": string + "America/Pangnirtung": string + "America/Paramaribo": string + "America/Phoenix": string + "America/Port-au-Prince": string + "America/Port_of_Spain": string + "America/Porto_Velho": string + "America/Puerto_Rico": string + "America/Punta_Arenas": string + "America/Rainy_River": string + "America/Rankin_Inlet": string + "America/Recife": string + "America/Regina": string + "America/Resolute": string + "America/Rio_Branco": string + "America/Santa_Isabel": string + "America/Santarem": string + "America/Santiago": string + "America/Santo_Domingo": string + "America/Sao_Paulo": string + "America/Scoresbysund": string + "America/Sitka": string + "America/St_Barthelemy": string + "America/St_Johns": string + "America/St_Kitts": string + "America/St_Lucia": string + "America/St_Thomas": string + "America/St_Vincent": string + "America/Swift_Current": string + "America/Tegucigalpa": string + "America/Thule": string + "America/Thunder_Bay": string + "America/Tijuana": string + "America/Toronto": string + "America/Tortola": string + "America/Vancouver": string + "America/Whitehorse": string + "America/Winnipeg": string + "America/Yakutat": string + "America/Yellowknife": string + "Antarctica/Casey": string + "Antarctica/Davis": string + "Antarctica/DumontDUrville": string + "Antarctica/Macquarie": string + "Antarctica/Mawson": string + "Antarctica/McMurdo": string + "Antarctica/Palmer": string + "Antarctica/Rothera": string + "Antarctica/Syowa": string + "Antarctica/Troll": string + "Antarctica/Vostok": string + "Arctic/Longyearbyen": string + "Asia/Aden": string + "Asia/Almaty": string + "Asia/Amman": string + "Asia/Anadyr": string + "Asia/Aqtau": string + "Asia/Aqtobe": string + "Asia/Ashgabat": string + "Asia/Atyrau": string + "Asia/Baghdad": string + "Asia/Bahrain": string + "Asia/Baku": string + "Asia/Bangkok": string + "Asia/Barnaul": string + "Asia/Beirut": string + "Asia/Bishkek": string + "Asia/Brunei": string + "Asia/Calcutta": string + "Asia/Chita": string + "Asia/Choibalsan": string + "Asia/Colombo": string + "Asia/Damascus": string + "Asia/Dhaka": string + "Asia/Dili": string + "Asia/Dubai": string + "Asia/Dushanbe": string + "Asia/Famagusta": string + "Asia/Gaza": string + "Asia/Hebron": string + "Asia/Hong_Kong": string + "Asia/Hovd": string + "Asia/Irkutsk": string + "Asia/Jakarta": string + "Asia/Jayapura": string + "Asia/Jerusalem": string + "Asia/Kabul": string + "Asia/Kamchatka": string + "Asia/Karachi": string + "Asia/Katmandu": string + "Asia/Khandyga": string + "Asia/Krasnoyarsk": string + "Asia/Kuala_Lumpur": string + "Asia/Kuching": string + "Asia/Kuwait": string + "Asia/Macau": string + "Asia/Magadan": string + "Asia/Makassar": string + "Asia/Manila": string + "Asia/Muscat": string + "Asia/Nicosia": string + "Asia/Novokuznetsk": string + "Asia/Novosibirsk": string + "Asia/Omsk": string + "Asia/Oral": string + "Asia/Phnom_Penh": string + "Asia/Pontianak": string + "Asia/Pyongyang": string + "Asia/Qatar": string + "Asia/Qostanay": string + "Asia/Qyzylorda": string + "Asia/Rangoon": string + "Asia/Riyadh": string + "Asia/Saigon": string + "Asia/Sakhalin": string + "Asia/Samarkand": string + "Asia/Seoul": string + "Asia/Shanghai": string + "Asia/Singapore": string + "Asia/Srednekolymsk": string + "Asia/Taipei": string + "Asia/Tashkent": string + "Asia/Tbilisi": string + "Asia/Tehran": string + "Asia/Thimphu": string + "Asia/Tokyo": string + "Asia/Tomsk": string + "Asia/Ulaanbaatar": string + "Asia/Urumqi": string + "Asia/Ust-Nera": string + "Asia/Vientiane": string + "Asia/Vladivostok": string + "Asia/Yakutsk": string + "Asia/Yekaterinburg": string + "Asia/Yerevan": string + "Atlantic/Azores": string + "Atlantic/Bermuda": string + "Atlantic/Canary": string + "Atlantic/Cape_Verde": string + "Atlantic/Faeroe": string + "Atlantic/Madeira": string + "Atlantic/Reykjavik": string + "Atlantic/South_Georgia": string + "Atlantic/St_Helena": string + "Atlantic/Stanley": string + "Australia/Adelaide": string + "Australia/Brisbane": string + "Australia/Broken_Hill": string + "Australia/Currie": string + "Australia/Darwin": string + "Australia/Eucla": string + "Australia/Hobart": string + "Australia/Lindeman": string + "Australia/Lord_Howe": string + "Australia/Melbourne": string + "Australia/Perth": string + "Australia/Sydney": string + "Europe/Amsterdam": string + "Europe/Andorra": string + "Europe/Astrakhan": string + "Europe/Athens": string + "Europe/Belgrade": string + "Europe/Berlin": string + "Europe/Bratislava": string + "Europe/Brussels": string + "Europe/Bucharest": string + "Europe/Budapest": string + "Europe/Busingen": string + "Europe/Chisinau": string + "Europe/Copenhagen": string + "Europe/Dublin": string + "Europe/Gibraltar": string + "Europe/Guernsey": string + "Europe/Helsinki": string + "Europe/Isle_of_Man": string + "Europe/Istanbul": string + "Europe/Jersey": string + "Europe/Kaliningrad": string + "Europe/Kiev": string + "Europe/Kirov": string + "Europe/Lisbon": string + "Europe/Ljubljana": string + "Europe/London": string + "Europe/Luxembourg": string + "Europe/Madrid": string + "Europe/Malta": string + "Europe/Mariehamn": string + "Europe/Minsk": string + "Europe/Monaco": string + "Europe/Moscow": string + "Europe/Oslo": string + "Europe/Paris": string + "Europe/Podgorica": string + "Europe/Prague": string + "Europe/Riga": string + "Europe/Rome": string + "Europe/Samara": string + "Europe/San_Marino": string + "Europe/Sarajevo": string + "Europe/Saratov": string + "Europe/Simferopol": string + "Europe/Skopje": string + "Europe/Sofia": string + "Europe/Stockholm": string + "Europe/Tallinn": string + "Europe/Tirane": string + "Europe/Ulyanovsk": string + "Europe/Uzhgorod": string + "Europe/Vaduz": string + "Europe/Vatican": string + "Europe/Vienna": string + "Europe/Vilnius": string + "Europe/Volgograd": string + "Europe/Warsaw": string + "Europe/Zagreb": string + "Europe/Zaporozhye": string + "Europe/Zurich": string + "Indian/Antananarivo": string + "Indian/Chagos": string + "Indian/Christmas": string + "Indian/Cocos": string + "Indian/Comoro": string + "Indian/Kerguelen": string + "Indian/Mahe": string + "Indian/Maldives": string + "Indian/Mauritius": string + "Indian/Mayotte": string + "Indian/Reunion": string + "Pacific/Apia": string + "Pacific/Auckland": string + "Pacific/Bougainville": string + "Pacific/Chatham": string + "Pacific/Easter": string + "Pacific/Efate": string + "Pacific/Enderbury": string + "Pacific/Fakaofo": string + "Pacific/Fiji": string + "Pacific/Funafuti": string + "Pacific/Galapagos": string + "Pacific/Gambier": string + "Pacific/Guadalcanal": string + "Pacific/Guam": string + "Pacific/Honolulu": string + "Pacific/Johnston": string + "Pacific/Kiritimati": string + "Pacific/Kosrae": string + "Pacific/Kwajalein": string + "Pacific/Majuro": string + "Pacific/Marquesas": string + "Pacific/Midway": string + "Pacific/Nauru": string + "Pacific/Niue": string + "Pacific/Norfolk": string + "Pacific/Noumea": string + "Pacific/Pago_Pago": string + "Pacific/Palau": string + "Pacific/Pitcairn": string + "Pacific/Ponape": string + "Pacific/Port_Moresby": string + "Pacific/Rarotonga": string + "Pacific/Saipan": string + "Pacific/Tahiti": string + "Pacific/Tarawa": string + "Pacific/Tongatapu": string + "Pacific/Truk": string + "Pacific/Wake": string + "Pacific/Wallis": string +} \ No newline at end of file diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 8ab85ad..92b117b 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -4,13 +4,18 @@ import Command from "./Command" import ContextMenu from "./ContextMenu" import Event from "./Event" import Modal from "./Modal" + import Config from "./Config" +import Cron from "./Cron" +import TimeZones from "./TimeZones" import { Guild, GuildData } from "./Guild" import { Player, PlayerData } from "./Player" export { Config, + Cron, + TimeZones, Autocomplete, Button, Command, diff --git a/src/utils/Cron.ts b/src/utils/Cron.ts new file mode 100644 index 0000000..a39cd87 --- /dev/null +++ b/src/utils/Cron.ts @@ -0,0 +1,20 @@ +import { CronJob } from "cron" +import path from "path" +import fs from "fs" +import { Cron } from "../interfaces" + +function loadCronEvents() { + const cronPath = path.join(__dirname, "..", "events", "cron") + const cronFiles = fs.readdirSync(cronPath).filter(file => file.endsWith(".js")) + + for (const file of cronFiles) { + const filePath = path.join(cronPath, file) + const cron: Cron = require(filePath) + + const time = cron.time.seconds + " " + cron.time.minutes + " " + cron.time.hours + " " + cron.time.dayOfMonth + " " + cron.time.month + " " + cron.time.dayOfWeek + + new CronJob(time, cron.execute, cron.onComplete, cron.start, cron.timeZone).start() + } +} + +export { loadCronEvents } \ No newline at end of file diff --git a/src/utils/Illegitimate.ts b/src/utils/Illegitimate.ts index 316a765..6927de1 100644 --- a/src/utils/Illegitimate.ts +++ b/src/utils/Illegitimate.ts @@ -3,6 +3,7 @@ import config from "./Config" import { redis } from "./Redis" import { connect } from "mongoose" import init from "./Init" +import { loadCronEvents } from "./Cron" const client = new Client() export default class Illegitimate { @@ -10,13 +11,11 @@ export default class Illegitimate { async start() { init() - client.start() - + loadCronEvents() redis.on("ready", () => { console.log("Connected to Redis") }) - connect(config.prod.mongoURI!, {}).then(() => { console.log("Connected to MongoDB") }) diff --git a/yarn.lock b/yarn.lock index 701e5a6..d79defb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -147,6 +147,11 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@types/luxon@~3.3.0": + version "3.3.7" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.3.7.tgz#043d413b6492a012de47503907bdf3ec4f827933" + integrity sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ== + "@types/ms@^0.7.34": version "0.7.34" resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" @@ -242,6 +247,14 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cron@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/cron/-/cron-3.1.6.tgz#e7e1798a468e017c8d31459ecd7c2d088f97346c" + integrity sha512-cvFiQCeVzsA+QPM6fhjBtlKGij7tLLISnTSvFxVdnFGLdz+ZdXN37kNe0i2gefmdD17XuZA6n2uPVwzl4FxW/w== + dependencies: + "@types/luxon" "~3.3.0" + luxon "~3.4.0" + debug@4.x, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" @@ -358,6 +371,11 @@ lodash@^4.17.21: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +luxon@~3.4.0: + version "3.4.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" + integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + magic-bytes.js@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz"