From f67432ba9a26b453e616bcb0e1c5030487f235ca Mon Sep 17 00:00:00 2001 From: SrIzan10 <66965250+SrIzan10@users.noreply.github.com> Date: Tue, 8 Nov 2022 20:03:28 +0100 Subject: [PATCH] feat: birthdays system --- .prettierrc | 3 +- commands/misc/cumple.ts | 61 ++++++++++++++++++++++++++++++++++++ index.ts | 8 ++++- package-lock.json | 11 +++++++ package.json | 1 + schemas/birthdays.js | 8 +++++ util/birthdays.ts | 26 +++++++++++++++ util/daysinyear.txt | 1 + util/nowplayingradio.ts | 8 ++--- util/youtubenotifications.ts | 2 +- 10 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 commands/misc/cumple.ts create mode 100644 schemas/birthdays.js create mode 100644 util/birthdays.ts create mode 100644 util/daysinyear.txt diff --git a/.prettierrc b/.prettierrc index 29a8d4e..bca636c 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,4 +1,5 @@ { "tabWidth": 2, - "useTabs": true + "useTabs": true, + "singleQuote": true } \ No newline at end of file diff --git a/commands/misc/cumple.ts b/commands/misc/cumple.ts new file mode 100644 index 0000000..a2aad12 --- /dev/null +++ b/commands/misc/cumple.ts @@ -0,0 +1,61 @@ +import { commandModule, CommandType } from "@sern/handler"; +import { publish } from "../../src/plugins/publish.js"; +import { ApplicationCommandOptionType } from "discord.js"; +import { readFileSync } from "node:fs"; +import birthdays from "../../schemas/birthdays.js"; +/* +import { publish } from "../../src/plugins/publish.js"; +import { ownerOnly } from "../../src/plugins/ownerOnly.js" +*/ + +export default commandModule({ + name: "cumple", + type: CommandType.Slash, + plugins: [publish({ guildIds: ['1000400148289036298' , '928018226330337280'] })], + description: "Pon tu cumpleaños en la base de datos para ser felicitado!", + //alias : [], + options: [ + { + name: "fecha", + description: "La fecha de tu cumple (elige en el autocompletado)", + type: ApplicationCommandOptionType.String, + autocomplete: true, + required: true, + command: { + onEvent: [], + execute: async (autocomplete) => { + const focusedValue = autocomplete.options.getFocused(); + let choices = JSON.parse( + String(readFileSync("./util/daysinyear.txt")) + ) as Array; + choices = choices.filter((choice) => + choice.toString().startsWith(focusedValue) + ); + choices = choices.slice(0, 25); + await autocomplete.respond( + choices.map((choice) => ({ + name: choice.toString(), + value: choice, + })) + ); + }, + }, + }, + ], + execute: async (ctx, options) => { + await ctx.interaction.deferReply({ephemeral: true}) + const option = ctx.interaction.options.getString("fecha") + const array = JSON.parse( + String(readFileSync("./util/daysinyear.txt")) + ) as Array; + if (!array.includes(option!)) return await ctx.interaction.editReply('Asegúrate que estás eligiendo una fecha del autocompletado!') + if (await birthdays.exists({id: ctx.user.id})) return await ctx.interaction.editReply('No puedes poner tu fecha de nuevo!') + const db = new birthdays({ + id: ctx.user.id, + date: option, + alreadysent: false + }); + await db.save(); + await ctx.interaction.editReply('Ok, guardado correctamente. No puedes volver a cambiar la fecha.') + }, +}); diff --git a/index.ts b/index.ts index 201f64b..8547bed 100644 --- a/index.ts +++ b/index.ts @@ -7,6 +7,7 @@ import mongoose from 'mongoose' import express from 'express' import youtubenotifications from "./util/youtubenotifications.js"; import { setIntervalAsync } from "set-interval-async"; +import birthdays from "./util/birthdays.js"; const app = express(); const client = new Client({ @@ -58,4 +59,9 @@ client.login(process.env.TOKEN); setIntervalAsync(async () => { await youtubenotifications(client) -}, 120_000); \ No newline at end of file +}, 120_000); + +setIntervalAsync(async () => { + await birthdays(client) +}, 100); +// 3_600_000 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5039371..335fcc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@sern/handler": "^1.2.1", "@xmldom/xmldom": "^0.8.5", "axios": "^1.0.0", + "dayjs": "^1.11.6", "discord-bot-youtube-notifications": "^1.1.4", "discord-tictactoe": "^4.0.0", "discord.js": "^14.5.0", @@ -659,6 +660,11 @@ "dev": true, "license": "MIT" }, + "node_modules/dayjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz", + "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==" + }, "node_modules/debug": { "version": "2.6.9", "license": "MIT", @@ -3263,6 +3269,11 @@ "version": "1.1.1", "dev": true }, + "dayjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz", + "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==" + }, "debug": { "version": "2.6.9", "requires": { diff --git a/package.json b/package.json index 35105b5..782433e 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@sern/handler": "^1.2.1", "@xmldom/xmldom": "^0.8.5", "axios": "^1.0.0", + "dayjs": "^1.11.6", "discord-bot-youtube-notifications": "^1.1.4", "discord-tictactoe": "^4.0.0", "discord.js": "^14.5.0", diff --git a/schemas/birthdays.js b/schemas/birthdays.js new file mode 100644 index 0000000..9e6c066 --- /dev/null +++ b/schemas/birthdays.js @@ -0,0 +1,8 @@ +import mongoose from 'mongoose' +const schema = new mongoose.Schema({ + id: {type: String, required: true}, + date: {type: String, required: true}, + alreadysent: {type: Boolean, required: true}, +}); +const db = mongoose.model('birthday', schema, 'birthdays'); +export default db \ No newline at end of file diff --git a/util/birthdays.ts b/util/birthdays.ts new file mode 100644 index 0000000..fa35306 --- /dev/null +++ b/util/birthdays.ts @@ -0,0 +1,26 @@ +import dayjs from "dayjs"; +import { Client, TextChannel } from "discord.js"; +import db from "../schemas/birthdays.js"; + +export default async function birthdays(client: Client) { + const fetchallusers = await db.find(); + const filtered = fetchallusers.map((user) => user.id); + for (const user of filtered) { + const finduser = await db.findOne({ id: user }); + async function saveit() { + finduser!.alreadysent = false + await finduser!.save() + } + if (finduser!.date === dayjs().format("D-M")) {} else return + if (finduser!.alreadysent === true && dayjs().format('D-M') !== finduser!.date) return saveit() + if (finduser!.alreadysent === true && dayjs().format('D-M') === finduser!.date) return + const sendtochannel = (await ( + await client.guilds.fetch("1000400148289036298") + ).channels.fetch("1037760113219469403")) as TextChannel; + const message = await sendtochannel.send({ content: `Es el cumpleaños de <@${finduser!.id}> 🎉🎉🎉\nMuchas felicidades!` }) + message.react('🎉') + message.react('<:Pog:1030169609178976346>') + finduser!.alreadysent = true + await finduser?.save() + } +} diff --git a/util/daysinyear.txt b/util/daysinyear.txt new file mode 100644 index 0000000..d0f17c6 --- /dev/null +++ b/util/daysinyear.txt @@ -0,0 +1 @@ +["1-1","2-1","3-1","4-1","5-1","6-1","7-1","8-1","9-1","10-1","11-1","12-1","13-1","14-1","15-1","16-1","17-1","18-1","19-1","20-1","21-1","22-1","23-1","24-1","25-1","26-1","27-1","28-1","29-1","30-1","31-1","1-2","2-2","3-2","4-2","5-2","6-2","7-2","8-2","9-2","10-2","11-2","12-2","13-2","14-2","15-2","16-2","17-2","18-2","19-2","20-2","21-2","22-2","23-2","24-2","25-2","26-2","27-2","28-2","1-3","2-3","3-3","4-3","5-3","6-3","7-3","8-3","9-3","10-3","11-3","12-3","13-3","14-3","15-3","16-3","17-3","18-3","19-3","20-3","21-3","22-3","23-3","24-3","25-3","26-3","27-3","28-3","29-3","30-3","31-3","1-4","2-4","3-4","4-4","5-4","6-4","7-4","8-4","9-4","10-4","11-4","12-4","13-4","14-4","15-4","16-4","17-4","18-4","19-4","20-4","21-4","22-4","23-4","24-4","25-4","26-4","27-4","28-4","29-4","30-4","1-5","2-5","3-5","4-5","5-5","6-5","7-5","8-5","9-5","10-5","11-5","12-5","13-5","14-5","15-5","16-5","17-5","18-5","19-5","20-5","21-5","22-5","23-5","24-5","25-5","26-5","27-5","28-5","29-5","30-5","31-5","1-6","2-6","3-6","4-6","5-6","6-6","7-6","8-6","9-6","10-6","11-6","12-6","13-6","14-6","15-6","16-6","17-6","18-6","19-6","20-6","21-6","22-6","23-6","24-6","25-6","26-6","27-6","28-6","29-6","30-6","1-7","2-7","3-7","4-7","5-7","6-7","7-7","8-7","9-7","10-7","11-7","12-7","13-7","14-7","15-7","16-7","17-7","18-7","19-7","20-7","21-7","22-7","23-7","24-7","25-7","26-7","27-7","28-7","29-7","30-7","31-7","1-8","2-8","3-8","4-8","5-8","6-8","7-8","8-8","9-8","10-8","11-8","12-8","13-8","14-8","15-8","16-8","17-8","18-8","19-8","20-8","21-8","22-8","23-8","24-8","25-8","26-8","27-8","28-8","29-8","30-8","31-8","1-9","2-9","3-9","4-9","5-9","6-9","7-9","8-9","9-9","10-9","11-9","12-9","13-9","14-9","15-9","16-9","17-9","18-9","19-9","20-9","21-9","22-9","23-9","24-9","25-9","26-9","27-9","28-9","29-9","30-9","1-10","2-10","3-10","4-10","5-10","6-10","7-10","8-10","9-10","10-10","11-10","12-10","13-10","14-10","15-10","16-10","17-10","18-10","19-10","20-10","21-10","22-10","23-10","24-10","25-10","26-10","27-10","28-10","29-10","30-10","31-10","1-11","2-11","3-11","4-11","5-11","6-11","7-11","8-11","9-11","10-11","11-11","12-11","13-11","14-11","15-11","16-11","17-11","18-11","19-11","20-11","21-11","22-11","23-11","24-11","25-11","26-11","27-11","28-11","29-11","30-11","1-12","2-12","3-12","4-12","5-12","6-12","7-12","8-12","9-12","10-12","11-12","12-12","13-12","14-12","15-12","16-12","17-12","18-12","19-12","20-12","21-12","22-12","23-12","24-12","25-12","26-12","27-12","28-12","29-12","30-12","31-12"] \ No newline at end of file diff --git a/util/nowplayingradio.ts b/util/nowplayingradio.ts index 8097a02..f85118a 100644 --- a/util/nowplayingradio.ts +++ b/util/nowplayingradio.ts @@ -7,11 +7,11 @@ export async function nowPlayingRadio(client: Client) { var XMLDoc = parser.parseFromString(getAPI, "text/xml"); let getsong, getartist; try { - getsong = XMLDoc.getElementsByTagName("current_song").item(0)!.textContent - getartist = XMLDoc.getElementsByTagName("current_artist").item(0)!.textContent + getsong = XMLDoc.getElementsByTagName("current_song").item(0)!.textContent + getartist = XMLDoc.getElementsByTagName("current_artist").item(0)!.textContent } catch (err) { - getsong = "Anuncios o cambio de canción" - getartist = "catJAM" + getsong = "Anuncios o cambio de canción" + getartist = "catJAM" } const embed = new EmbedBuilder() .setColor("Blurple") diff --git a/util/youtubenotifications.ts b/util/youtubenotifications.ts index 98db2bb..f1f9b3e 100644 --- a/util/youtubenotifications.ts +++ b/util/youtubenotifications.ts @@ -25,7 +25,7 @@ export default async function youtubenotifications(client: Client) { iconURL: "https://yt3.ggpht.com/ytc/AMLnZu8rf3ZxWKKv9Dr6UjmWiDuKkaK06J5lDZ8WwwCg=s88-c-k-c0x00ffffff-no-rj", }) - .setColor("Random") + .setColor("Red") .setTitle(`${noembed.title}`) .setURL("https://youtu.be/" + request) .setImage(`${noembed.thumbnail_url}`);