mirror of
				https://github.com/keanuplayz/TravBot-v3.git
				synced 2024-08-15 02:33:12 +00:00 
			
		
		
		
	Move poll command to slash
This commit is contained in:
		
							parent
							
								
									457de774ce
								
							
						
					
					
						commit
						a8cc1b4dad
					
				
					 2 changed files with 76 additions and 2 deletions
				
			
		|  | @ -1,7 +1,24 @@ | |||
| import {MessageEmbed, Message, User} from "discord.js"; | ||||
| import {MessageEmbed, Message, User, MessageActionRow, MessageButton} from "discord.js"; | ||||
| import {NamedCommand, RestCommand, poll, CHANNEL_TYPE, SendFunction, Command} from "onion-lasers"; | ||||
| import {SlashCommandBuilder} from "@discordjs/builders"; | ||||
| import {CommandInteraction} from "discord.js"; | ||||
| import {pluralise} from "../../lib"; | ||||
| 
 | ||||
| export const header = new SlashCommandBuilder() | ||||
|     .setDescription("Create a poll.") | ||||
|     .addStringOption((option) => option.setName("question").setDescription("Question for the poll").setRequired(true)) | ||||
|     .addIntegerOption((option) => | ||||
|         option.setName("duration").setDescription("Duration of the poll in seconds.").setRequired(false) | ||||
|     ); | ||||
| 
 | ||||
| export async function handler(interaction: CommandInteraction) { | ||||
|     const {options} = interaction; | ||||
|     const question = options.getString("question", true); | ||||
|     const duration = options.getInteger("duration", false); | ||||
| 
 | ||||
|     execSlashPoll(interaction, question, duration || 60000); | ||||
| } | ||||
| 
 | ||||
| export default new NamedCommand({ | ||||
|     description: "Create a poll.", | ||||
|     usage: "(<seconds>) <question>", | ||||
|  | @ -27,6 +44,63 @@ export default new NamedCommand({ | |||
| const AGREE = "✅"; | ||||
| const DISAGREE = "⛔"; | ||||
| 
 | ||||
| async function execSlashPoll(interaction: CommandInteraction, question: string, duration = 60000) { | ||||
|     const responseButtons = new MessageActionRow().addComponents( | ||||
|         new MessageButton().setCustomId("agree").setLabel(AGREE).setStyle("SUCCESS"), | ||||
|         new MessageButton().setCustomId("disagree").setLabel(DISAGREE).setStyle("DANGER") | ||||
|     ); | ||||
| 
 | ||||
|     const icon = | ||||
|         interaction.user.avatarURL({ | ||||
|             dynamic: true, | ||||
|             size: 2048 | ||||
|         }) || interaction.user.defaultAvatarURL; | ||||
|     const embed = new MessageEmbed() | ||||
|         .setAuthor(`Poll created by ${interaction.user.username}`, icon) | ||||
|         .setColor(0xffffff) | ||||
|         .setFooter("Click the buttons to vote.") | ||||
|         .setDescription(question) | ||||
|         .addField(`${AGREE} -`, `${pluralise(0, "", "people have voted")}\n`) | ||||
|         .addField(`${DISAGREE} -`, `${pluralise(0, "", "people have voted")}\n`); | ||||
|     const msg = await interaction.reply({ | ||||
|         embeds: [embed], | ||||
|         components: [responseButtons] | ||||
|     }); | ||||
|     var idsArray: string[] = []; | ||||
|     const collector = interaction.channel?.createMessageComponentCollector({time: duration}); | ||||
|     collector?.on("collect", async (i) => { | ||||
|         if (i.customId === "agree") { | ||||
|             if (idsArray.includes(i.user.id)) { | ||||
|                 i.reply({content: "You have already voted!", ephemeral: true}); | ||||
|             } else { | ||||
|                 idsArray.push(i.user.id); | ||||
|                 var agree = +1; | ||||
|                 embed.fields[0].value = `${pluralise(agree, "", "people who agree", "person who agrees")}\n`; | ||||
|                 interaction.editReply({embeds: [embed]}); | ||||
|                 i.reply({content: "You picked ✅!", ephemeral: true}); | ||||
|             } | ||||
|         } | ||||
|         if (i.customId === "disagree") { | ||||
|             if (idsArray.includes(i.user.id)) { | ||||
|                 i.reply({content: "You have already voted!", ephemeral: true}); | ||||
|             } else { | ||||
|                 idsArray.push(i.user.id); | ||||
|                 var disagree = +1; | ||||
|                 embed.fields[1].value = `${pluralise(disagree, "", "people who disagree", "person who disagrees")}\n`; | ||||
|                 interaction.editReply({embeds: [embed]}); | ||||
|                 i.reply({content: "You picked ⛔!", ephemeral: true}); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
|     //This solution looks messy but works really well and stops from stuff like vote fraud happening.
 | ||||
|     //I'm not sure if it's the best solution but if you have a better idea then please let me know.
 | ||||
| 
 | ||||
|     collector?.on("end", async (collected) => { | ||||
|         embed.setTitle(`The results of ${interaction.user.username}'s poll:`); | ||||
|         interaction.editReply({embeds: [embed]}); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| async function execPoll(send: SendFunction, message: Message, user: User, question: string, duration = 60000) { | ||||
|     const icon = | ||||
|         user.avatarURL({ | ||||
|  |  | |||
|  | @ -42,7 +42,7 @@ export async function handler(interaction: CommandInteraction) { | |||
| 
 | ||||
|     interaction.reply(transform(response)); | ||||
|     // You might notice the remove message code is missing here. It's because reactions collectors are
 | ||||
|     //not a thing in interactions. The best alternative would buttons
 | ||||
|     //not a thing in interactions. The best alternative would be buttons
 | ||||
| } | ||||
| 
 | ||||
| let phrase = "I have no currently set phrase!"; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue