diff --git a/package-lock.json b/package-lock.json index 599f8d6..60926d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "denim_3001", - "version": "3001.35.0", + "version": "3001.36.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "denim_3001", - "version": "3001.35.0", + "version": "3001.36.0", "license": "ISC", "dependencies": { "@discordjs/opus": "github:discordjs/opus", diff --git a/package.json b/package.json index 1bfb4f0..2264743 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "denim_3001", - "version": "3001.35.0", + "version": "3001.36.0", "description": "Toto je velmi kvalitní bot.", "repository": { "url": "https://github.com/Histmy/Denim-Bot/" diff --git a/src/modules/anketa.ts b/src/modules/anketa.ts new file mode 100644 index 0000000..8abd82e --- /dev/null +++ b/src/modules/anketa.ts @@ -0,0 +1,92 @@ +// Modul na komand "anketa" + +import { Message, MessageActionRow, MessageButton, MessageComponentInteraction, MessageEmbedOptions } from "discord.js"; +import { emouty } from "../utils/emotes"; +import { Modul } from "../utils/types"; +import { formatter } from "../utils/utils"; + +const exp: Modul = { + more_komandy: { + + anketa: { + arg: "nastavení asi IDK", + run: async (mes, arg) => { + const args = arg.toLocaleLowerCase().split(" "); + + let settings = { + time: 60, + immediateShow: true + }; + + switch (args[0]) { + case "custom": + case "vlastni": + return `tuto jeste neni implemenovany ${emouty.sjeta}`; + + case "start": + case "zapnout": + const temp = args.slice(1).join(" "); + const moznosti = temp.split(temp.indexOf("|") > -1 ? "|" : ",").reduce((acc, c) => { + if (c.length) acc.push(c.trim()); + return acc; + }, []); + if (moznosti.length < 2) return "zadej alespo%n dve moznosti"; + + const konec = new Date(); + konec.setSeconds(konec.getSeconds() + settings.time); + + const embed: MessageEmbedOptions = { + title: "Hlasování", + description: settings.immediateShow ? `Končí ${formatter(konec)}` : `Výsledky se zobrazí ${formatter(konec)}`, + fields: [] + }; + const radek = new MessageActionRow(); + const odpovedi: Record = {}; + + function prepocitat(): void; + function prepocitat(int: MessageComponentInteraction): void; + function prepocitat(int?: MessageComponentInteraction) { + const celkem = Object.keys(odpovedi).length; + embed.fields?.forEach((f, i) => { + const hovn = Object.values(odpovedi).filter(n => n == i); + const dylka = hovn.length; + const p = Math.floor(dylka / celkem * 10) || 0; + f.value = `${"█".repeat(p)}${"░".repeat(10 - p)} ${Math.round(dylka / celkem * 100) || 0}% (${dylka})`; + }); + int?.update({ embeds: [embed] }); + } + + moznosti.forEach((h, i) => { + if (settings.immediateShow) embed.fields?.push({ name: h, value: "" }); + radek.addComponents(new MessageButton({ customId: `${i}`, label: h, style: "PRIMARY" })); + }); + prepocitat(); + const zprava = await mes.channel.send({ embeds: [embed], components: [radek] }); + const collector = mes.channel.createMessageComponentCollector({ filter: i => i.message.id == zprava.id, time: settings.time * 1000 }); + + collector.on("collect", d => { + if (!(d.message instanceof Message)) return; + const i = Number(d.customId); + const prev = odpovedi[d.user.id]; + if (prev == i) return d.deferUpdate(); + odpovedi[d.user.id] = i; + if (!settings.immediateShow) return d.deferUpdate(); + prepocitat(d); + }); + + collector.on("end", () => { + embed.description = `Skončilo ${formatter(konec)}`; + if (!settings.immediateShow) prepocitat(); + zprava.edit({ components: [], embeds: [embed] }); + }); + break; + + default: + return `takovi to "${args[0]}" sem moc nepochitil`; + } + } + } + } +}; + +module.exports = exp; diff --git a/src/modules/komComplex.ts b/src/modules/komComplex.ts index 25da5c5..1de5b6b 100644 --- a/src/modules/komComplex.ts +++ b/src/modules/komComplex.ts @@ -24,26 +24,26 @@ const exp: Modul = { online: { als: ["onlajn", "zelenej"], - run: (mes) => changeStatus(mes, "online") + run: mes => changeStatus(mes, "online") }, idle: { als: ["zlutej", "afk", "idle", "nepritomnej"], - run: (mes) => changeStatus(mes, "idle") + run: mes => changeStatus(mes, "idle") }, dnd: { als: ["nerusit", "cervenej"], - run: (mes) => changeStatus(mes, "dnd") + run: mes => changeStatus(mes, "dnd") }, offline: { als: ["oflajn", "neviditelnej"], - run: (mes) => changeStatus(mes, "invisible") + run: mes => changeStatus(mes, "invisible") }, hraj: (mes, co) => changeActivity(mes, "PLAYING", co), sleduj: (mes, co) => changeActivity(mes, "WATCHING", co), poslouchej: (mes, co) => changeActivity(mes, "LISTENING", co), soutez: (mes, vcem) => changeActivity(mes, "COMPETING", vcem), - nedelej: (mes) => changeActivity(mes), + nedelej: mes => changeActivity(mes), fight: { als: ["figh", "fajt"],