102 lines
3.4 KiB
TypeScript
102 lines
3.4 KiB
TypeScript
import { TextChannel } from "discord.js"
|
|
import { devMessage, embedColor, guildLogChannel, hypixelGuildID } from "~/config/options.js"
|
|
import { ICron, IGuildData } from "~/interfaces"
|
|
import { numberFormatter } from "~/utils/Functions/intlFormaters.js"
|
|
import { getGuild, getIGN } from "~/utils/Hypixel.js"
|
|
import { client } from "~/utils/Illegitimate.js"
|
|
import { log } from "~/utils/Logger.js"
|
|
|
|
async function guildWeekly() {
|
|
const channel = client.channels.cache.get(guildLogChannel) as TextChannel
|
|
|
|
if (!channel) {
|
|
log("Guild log channel not found", "error")
|
|
return
|
|
}
|
|
|
|
const message = await channel.send({
|
|
embeds: [{
|
|
description: "Starting to fetch guild data...",
|
|
color: embedColor
|
|
}]
|
|
})
|
|
|
|
const guild = (await getGuild(hypixelGuildID, "id")) as IGuildData
|
|
const guildMembersList: string[] = []
|
|
const topWeeklyMembers: { name: string, value: string, inline: boolean }[] = []
|
|
|
|
const guildName = guild.name
|
|
const guildMembers = guild.members
|
|
|
|
const sliceSize = guildMembers.length / 4
|
|
|
|
// top weekly members
|
|
const allMembersGexpSorted = guildMembers.map(member => {
|
|
return {
|
|
uuid: member.uuid,
|
|
exp: Object.values(member.expHistory).reduce((a, b) => a + b, 0)
|
|
}
|
|
}).sort((a, b) => b.exp - a.exp)
|
|
|
|
for (let i = 0; i < allMembersGexpSorted.length; i++) {
|
|
const ign = await getIGN(allMembersGexpSorted[i].uuid)
|
|
const gexp = numberFormatter(allMembersGexpSorted[i].exp)
|
|
const position = i + 1
|
|
guildMembersList.push("**#" + position + " " + ign + ":** `" + gexp + "`")
|
|
}
|
|
|
|
const list = Array.from({ length: sliceSize }, (_, i) => guildMembersList.slice(i * sliceSize, (i + 1) * sliceSize))
|
|
|
|
list.forEach((item, index) => {
|
|
if (item.length === 0) return
|
|
|
|
topWeeklyMembers[index] = {
|
|
name: "",
|
|
value: item.join("\n"),
|
|
inline: false
|
|
}
|
|
})
|
|
|
|
// combined weekly gexp
|
|
const allGuildMembersWeeklyXP = guildMembers.map(member => member.expHistory)
|
|
const guildMembersWeeklyXP = allGuildMembersWeeklyXP.map(member => {
|
|
return Object.values(member).reduce((a, b) => a + b, 0)
|
|
})
|
|
const totalGuildMembersWeeklyXPUnformatted = guildMembersWeeklyXP.reduce((a, b) => a + b, 0)
|
|
const averageGuildMembersDailyXPUnformatted = totalGuildMembersWeeklyXPUnformatted / 7
|
|
|
|
// final values
|
|
const totalGuildMembersWeeklyXP = numberFormatter(totalGuildMembersWeeklyXPUnformatted)
|
|
const averageGuildMembersWeeklyXP = numberFormatter(averageGuildMembersDailyXPUnformatted)
|
|
|
|
await message.edit({
|
|
embeds: [{
|
|
title: "**Weekly Guild XP for " + guildName + "**",
|
|
description: "**Total weekly guild XP:** `" + totalGuildMembersWeeklyXP +
|
|
"`\n**Average daily guild XP:** `" + averageGuildMembersWeeklyXP + "`",
|
|
color: embedColor,
|
|
fields: topWeeklyMembers,
|
|
timestamp: new Date().toISOString(),
|
|
footer: {
|
|
text: channel.guild.name + " | " + devMessage,
|
|
icon_url: channel.guild.iconURL() || undefined
|
|
}
|
|
}]
|
|
})
|
|
}
|
|
|
|
export default {
|
|
time: {
|
|
seconds: 0,
|
|
minutes: 0,
|
|
hours: 21,
|
|
dayOfWeek: 7,
|
|
dayOfMonth: "*",
|
|
month: "*"
|
|
},
|
|
execute: guildWeekly,
|
|
onComplete: null,
|
|
start: true,
|
|
timeZone: "Europe/Zagreb"
|
|
} as ICron
|