v2.4.0 push 5 (almost the last one)

This commit is contained in:
DJj123dj
2022-07-29 19:41:25 +02:00
parent a69f2ee5a1
commit 210923d29e
18 changed files with 218 additions and 13 deletions
+14
View File
@@ -6,6 +6,8 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"add")) return if (!msg.content.startsWith(config.prefix+"add")) return
@@ -29,6 +31,12 @@ module.exports = () => {
var loguser = msg.mentions.users.first() var loguser = msg.mentions.users.first()
log("command","someone used the 'add' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'add' command",[{key:"user",value:msg.author.tag}])
log("system","user added to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.tag}]) log("system","user added to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.tag}])
const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1]
const ticketData = require("../core/getoptions").getOptionsById("newT"+ticketId)
APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
}) })
@@ -57,6 +65,12 @@ module.exports = () => {
var loguser = user var loguser = user
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}])
log("system","user added to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.tag}]) log("system","user added to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.tag}])
const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1]
const ticketData = require("../core/getoptions").getOptionsById("newT"+ticketId)
APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
+4
View File
@@ -6,6 +6,8 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"close")) return if (!msg.content.startsWith(config.prefix+"close")) return
@@ -28,6 +30,7 @@ module.exports = () => {
msg.channel.send({embeds:[bot.errorLog.success(l.commands.closeTitle,l.commands.closeDescription)],components:[closebutton]}) msg.channel.send({embeds:[bot.errorLog.success(l.commands.closeTitle,l.commands.closeDescription)],components:[closebutton]})
log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date())
}) })
@@ -57,6 +60,7 @@ module.exports = () => {
interaction.reply({embeds:[bot.errorLog.success(l.commands.closeTitle,l.commands.closeDescription)],components:[closebutton]}) interaction.reply({embeds:[bot.errorLog.success(l.commands.closeTitle,l.commands.closeDescription)],components:[closebutton]})
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
+4 -1
View File
@@ -6,6 +6,8 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"delete")) return if (!msg.content.startsWith(config.prefix+"delete")) return
@@ -33,7 +35,7 @@ module.exports = () => {
msg.channel.send({embeds:[bot.errorLog.success(l.commands.deleteTitle,l.commands.deleteDescription)],components:[closebutton]}) msg.channel.send({embeds:[bot.errorLog.success(l.commands.deleteTitle,l.commands.deleteDescription)],components:[closebutton]})
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
@@ -68,6 +70,7 @@ module.exports = () => {
interaction.reply({embeds:[bot.errorLog.success(l.commands.deleteTitle,l.commands.deleteDescription)],components:[closebutton]}) interaction.reply({embeds:[bot.errorLog.success(l.commands.deleteTitle,l.commands.deleteDescription)],components:[closebutton]})
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
+5
View File
@@ -5,6 +5,8 @@ const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
const helpEmbed = new discord.EmbedBuilder() const helpEmbed = new discord.EmbedBuilder()
.setColor(config.main_color) .setColor(config.main_color)
@@ -24,6 +26,7 @@ module.exports = () => {
if (!args[1]){ if (!args[1]){
msg.channel.send({embeds:[helpEmbed]}) msg.channel.send({embeds:[helpEmbed]})
log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date())
return return
} }
@@ -31,6 +34,7 @@ module.exports = () => {
msg.channel.send({embeds:[helpEmbed]}) msg.channel.send({embeds:[helpEmbed]})
log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date())
} }
}) })
@@ -40,5 +44,6 @@ module.exports = () => {
interaction.reply({embeds:[helpEmbed]}) interaction.reply({embeds:[helpEmbed]})
log("command","someone used the 'help' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'help' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("help",true,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+12
View File
@@ -6,6 +6,8 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"remove")) return if (!msg.content.startsWith(config.prefix+"remove")) return
@@ -32,6 +34,11 @@ module.exports = () => {
log("command","someone used the 'remove' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'remove' command",[{key:"user",value:msg.author.tag}])
log("system","user removed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.tag}]) log("system","user removed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.tag}])
const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1]
const ticketData = require("../core/getoptions").getOptionsById("newT"+ticketId)
APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
}) })
@@ -61,6 +68,11 @@ module.exports = () => {
log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.tag}])
log("system","user removed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.tag}]) log("system","user removed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.tag}])
const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1]
const ticketData = require("../core/getoptions").getOptionsById("newT"+ticketId)
APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("remove",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
+4 -1
View File
@@ -6,6 +6,8 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"rename")) return if (!msg.content.startsWith(config.prefix+"rename")) return
@@ -41,7 +43,7 @@ module.exports = () => {
log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}])
log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
@@ -82,6 +84,7 @@ module.exports = () => {
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}])
log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
} }
+4
View File
@@ -6,6 +6,8 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
var reopenCommandBar = new discord.ActionRowBuilder() var reopenCommandBar = new discord.ActionRowBuilder()
.addComponents( .addComponents(
@@ -28,6 +30,7 @@ module.exports = () => {
log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date())
}) })
}) })
@@ -51,6 +54,7 @@ module.exports = () => {
log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
+7 -2
View File
@@ -6,6 +6,8 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
/**@type {String[]} */ /**@type {String[]} */
var msgIds = [] var msgIds = []
@@ -33,7 +35,8 @@ module.exports = () => {
msg.channel.send({embeds:[embed],components:componentRows}) msg.channel.send({embeds:[embed],components:componentRows})
log("command","someone used the 'msg' command",[{key:"user",value:msg.author.tag},{key:"id",value:id}]) log("command","someone used the 'message' command",[{key:"user",value:msg.author.tag},{key:"id",value:id}])
APIEvents.onCommand("message",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
} }
}) })
@@ -56,7 +59,9 @@ module.exports = () => {
interaction.reply({content:l.commands.ticketWarning}) interaction.reply({content:l.commands.ticketWarning})
interaction.channel.send({embeds:[embed],components:componentRows}) interaction.channel.send({embeds:[embed],components:componentRows})
log("command","someone used the 'msg' command",[{key:"user",value:interaction.user.tag},{key:"id",value:id}]) log("command","someone used the 'message' command",[{key:"user",value:interaction.user.tag},{key:"id",value:id}])
APIEvents.onCommand("message",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+2
View File
@@ -14,6 +14,8 @@ const storage = bot.storage
//used when creating plugins! //used when creating plugins!
exports.enableApiLogs = false exports.enableApiLogs = false
//DOESN'T WORK YET
//this is used when embedding open ticket into another bot //this is used when embedding open ticket into another bot
exports.embeddedMode = false exports.embeddedMode = false
exports.clientLocation = require("../../../index").client exports.clientLocation = require("../../../index").client
+109 -5
View File
@@ -13,6 +13,10 @@ const ticketCloseListeners = []
const ticketDeleteListeners = [] const ticketDeleteListeners = []
const ticketReopenListeners = [] const ticketReopenListeners = []
const ticketAddListeners = []
const ticketRemoveListeners = []
const transcriptCreationListeners = [] const transcriptCreationListeners = []
const commandListeners = [] const commandListeners = []
const reactionRoleListeners = [] const reactionRoleListeners = []
@@ -97,6 +101,48 @@ exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
} }
/**
*
* @param {discord.User} user
* @param {discord.User} editeduser
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
*/
exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => {
//system
bot.errorLog.log("api","user added to ticket",[{key:"userid",value:user.id},{key:"editeduser",value:editeduser.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
ticketAddListeners.forEach((func) => {
try {
func(user,editeduser,channel,guild,date,ticketdata)
}catch{}
})
}
/**
*
* @param {discord.User} user
* @param {discord.User} editeduser
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
*/
exports.onTicketRemove = (user,editeduser,channel,guild,date,ticketdata) => {
//system
bot.errorLog.log("api","user removed from ticket",[{key:"userid",value:user.id},{key:"editeduser",value:editeduser.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
ticketRemoveListeners.forEach((func) => {
try {
func(user,editeduser,channel,guild,date,ticketdata)
}catch{}
})
}
/** /**
* *
* @param {discord.Message[]} messages * @param {discord.Message[]} messages
@@ -104,7 +150,7 @@ exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
*/ */
exports.transcriptCreation = (messages,channel,guild,date) => { exports.onTranscriptCreation = (messages,channel,guild,date) => {
//system //system
bot.errorLog.log("api","transcript created",[{key:"messages",value:JSON.stringify(messages)},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}]) bot.errorLog.log("api","transcript created",[{key:"messages",value:JSON.stringify(messages)},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}])
@@ -116,9 +162,29 @@ exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
} }
//onTicketAdd /**@typedef {"help"|"message"|"close"|"delete"|"reopen"|"rename"|"add"|"remove"} OTCommandType */
//onTicketRemove
//command /**
*
* @param {OTCommandType} type
* @param {Boolean} hasPerms
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
*/
exports.onCommand = (type,hasPerms,user,channel,guild,date) => {
//system
bot.errorLog.log("api","someone used a command",[{key:"type",value:type},{key:"hasPerms",value:hasPerms},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}])
commandListeners.forEach((func) => {
try {
func(type,hasPerms,user,channel,guild,date)
}catch{}
})
}
//reactionrole //reactionrole
//error //error
@@ -141,6 +207,26 @@ exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
* @param {Date} date * @param {Date} date
*/ */
/**
* @callback TicketUserChangeEvent
* @param {discord.User} user
* @param {discord.User} editeduser
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
*/
/**
* @callback CommandEvent
* @param {OTCommandType} type
* @param {Boolean} hasPerms
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
*/
//EVENT EXPORT: //EVENT EXPORT:
/**@param {TicketActionEvent} callback */ /**@param {TicketActionEvent} callback */
@@ -163,15 +249,33 @@ const onTicketReopen = (callback) => {
ticketReopenListeners.push(callback) ticketReopenListeners.push(callback)
} }
/**@param {TicketUserChangeEvent} callback */
const onTicketAdd = (callback) => {
ticketAddListeners.push(callback)
}
/**@param {TicketUserChangeEvent} callback */
const onTicketRemove = (callback) => {
ticketRemoveListeners.push(callback)
}
/**@param {TranscriptCreationEvent} callback */ /**@param {TranscriptCreationEvent} callback */
const onTranscriptCreation = (callback) => { const onTranscriptCreation = (callback) => {
transcriptCreationListeners.push(callback) transcriptCreationListeners.push(callback)
} }
/**@param {CommandEvent} callback */
const onCommand = (callback) => {
commandListeners.push(callback)
}
exports.events = { exports.events = {
onTicketOpen, onTicketOpen,
onTicketClose, onTicketClose,
onTicketDelete, onTicketDelete,
onTicketReopen, onTicketReopen,
onTranscriptCreation onTicketAdd,
onTicketRemove,
onTranscriptCreation,
onCommand
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 KiB

+49
View File
@@ -137,6 +137,55 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => {
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel] deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
}) })
//add main adminroles
config.main_adminroles.forEach((role,index) => {
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
})
}catch{
log("system","invalid role! At 'config.json => main_adminroles:"+index)
}
})
//add ticket adminroles
await channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1]
const ticketData = require("./getoptions").getOptionsById("newT"+ticketId)
if (!ticketData) return
/**
* @type {String[]}
*/
const ticketadmin = ticketData.adminroles
ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.ViewChannel],
deny:[pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
})
}catch{
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
}
}
})
})
channel.permissionOverwrites.set(permissionArray) channel.permissionOverwrites.set(permissionArray)
//message //message
+1 -1
View File
@@ -45,7 +45,7 @@ const getUserInfo = (channel) => {
exports.createTranscript = async (messagecollection,channel) => { exports.createTranscript = async (messagecollection,channel) => {
const ticketuserdata = await getUserInfo(channel) const ticketuserdata = await getUserInfo(channel)
require("./api/modules/events").transcriptCreation(messagecollection,channel,channel.guild,new Date()) require("./api/modules/events").onTranscriptCreation(messagecollection,channel,channel.guild,new Date())
try { try {
const cd = new Date() const cd = new Date()
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"] const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]