2023-09-04 10:21:04 -04:00
import Discord from 'discord.js' ;
import TClient from '../client.js' ;
import { writeFileSync , existsSync , mkdirSync } from 'node:fs' ;
export default {
async run ( client : TClient , interaction : Discord.ChatInputCommandInteraction < 'cached' > ) {
if ( client . config . mainServer . id === interaction . guildId ) {
if ( ! interaction . member . roles . cache . has ( client . config . mainServer . roles . mpmod ) && ! interaction . member . roles . cache . has ( client . config . mainServer . roles . bottech ) ) return client . youNeedRole ( interaction , 'mpmod' ) ;
}
const channelId = '1084864116776251463' ; // #mp-announcements
( {
start : async ( ) = > {
const map_names = interaction . options . getString ( 'map_names' , true ) . split ( '|' ) ;
if ( map_names . length > 10 ) return interaction . reply ( 'You can only have up to 10 maps in a poll!' ) ;
const msg = await ( interaction . guild . channels . cache . get ( channelId ) as Discord . TextChannel ) . send ( { embeds : [
new client . embed ( )
. setColor ( client . config . embedColor )
2023-09-04 11:18:37 -04:00
. setTitle ( 'Vote for next map!' )
2023-09-04 10:21:04 -04:00
. setDescription ( map_names . map ( ( map , i ) = > ` ${ i + 1 } . ** ${ map } ** ` ) . join ( '\n' ) )
. setFooter ( { text : ` Poll started by ${ interaction . user . tag } ` , iconURL : interaction.member.displayAvatarURL ( { extension : 'webp' , size : 1024 } ) } )
] } ) ;
await interaction . reply ( ` Successfully created a poll in <# ${ channelId } > ` )
const numbers = [ '1️ ⃣' , '2️ ⃣' , '3️ ⃣' , '4️ ⃣' , '5️ ⃣' , '6️ ⃣' , '7️ ⃣' , '8️ ⃣' , '9️ ⃣' , '🔟' ] ;
for ( let i = 0 ; i < map_names . length ; i ++ ) await msg . react ( numbers [ i ] )
} ,
end : async ( ) = > {
const msg = await ( interaction . guild . channels . cache . get ( channelId ) as Discord . TextChannel ) . messages . fetch ( interaction . options . getString ( 'message_id' , true ) ) ;
if ( ! msg ) return interaction . reply ( 'Message not found, please make sure you have the correct message ID.' ) ;
2023-09-04 11:18:37 -04:00
if ( msg . embeds [ 0 ] . title !== 'Vote for next map!' ) return interaction . reply ( 'This message is not a poll!' ) ;
2023-09-04 10:21:04 -04:00
if ( msg . embeds [ 0 ] . footer ? . text ? . startsWith ( 'Poll ended by' ) ) return interaction . reply ( 'This poll has already ended!' ) ;
if ( msg . reactions . cache . size < 2 ) return interaction . reply ( 'This poll has not been voted on yet!' ) ;
if ( ! existsSync ( 'src/database/polls' ) ) mkdirSync ( 'src/database/polls' ) ;
writeFileSync ( ` src/database/polls/pollResults- ${ msg . id } .json ` , JSON . stringify ( {
map_names : msg.embeds [ 0 ] . description . split ( '\n' ) . map ( x = > x . slice ( 3 ) ) ,
votes : msg.reactions.cache.map ( x = > x . count )
} ) ) ;
( client . channels . cache . get ( '516344221452599306' ) as Discord . TextChannel ) . send ( { files : [ ` src/database/polls/pollResults- ${ msg . id } .json ` ] } ) ;
msg . edit ( { embeds : [ new client . embed ( ) . setColor ( client . config . embedColor ) . setTitle ( 'Voting has ended!' ) . setDescription ( 'The next map will be ' + msg . embeds [ 0 ] . description . split ( '\n' ) [ msg . reactions . cache . map ( x = > x . count ) . indexOf ( Math . max ( . . . msg . reactions . cache . map ( x = > x . count ) ) ) ] . slice ( 3 ) ) . setFooter ( { text : ` Poll ended by ${ interaction . user . tag } ` , iconURL : interaction.member.displayAvatarURL ( { extension : 'webp' , size : 1024 } ) } ) ] } ) ;
await interaction . reply ( ` Successfully ended the [poll](<https://discord.com/channels/ ${ interaction . guildId } / ${ channelId } / ${ msg . id } >) in <# ${ channelId } > ` )
}
} ) [ interaction . options . getSubcommand ( ) ] ( ) ;
} ,
data : new Discord . SlashCommandBuilder ( )
. setName ( 'poll' )
. setDescription ( 'Poll system for FSMP server' )
. addSubcommand ( x = > x
. setName ( 'start' )
. setDescription ( 'Start a poll' )
. addStringOption ( x = > x
. setName ( 'map_names' )
. setDescription ( 'Map names separated by |\'s, up to 10 maps' )
. setRequired ( true ) ) )
. addSubcommand ( x = > x
. setName ( 'end' )
. setDescription ( 'End a poll' )
. addStringOption ( x = > x
. setName ( 'message_id' )
. setDescription ( 'Message ID of the poll' )
. setRequired ( true ) ) )
}