103 lines
3.4 KiB
TypeScript
103 lines
3.4 KiB
TypeScript
import { hypixelGuildID, guildLogChannel, embedColor, devMessage } from "config/options"
|
|
import color from "utils/functions/colors"
|
|
import { getGuild, getIGN } from "utils/Hypixel"
|
|
import { Cron, GuildData } from "interfaces"
|
|
import { client } from "utils/Illegitimate"
|
|
import { TextChannel } from "discord.js"
|
|
|
|
async function guildWeekly() {
|
|
const channel = client.channels.cache.get(guildLogChannel) as TextChannel
|
|
|
|
if (!channel) {
|
|
console.log(color("Guild log channel not found", "red"))
|
|
return
|
|
}
|
|
|
|
const message = await channel.send({
|
|
embeds: [{
|
|
description: "Starting to fetch guild data...",
|
|
color: embedColor
|
|
}]
|
|
})
|
|
|
|
const guild = (await getGuild(hypixelGuildID, "id")) as GuildData
|
|
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 = new Intl.NumberFormat("en-US").format(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 = new Intl.NumberFormat("en-US").format(totalGuildMembersWeeklyXPUnformatted)
|
|
const averageGuildMembersWeeklyXP = new Intl.NumberFormat("en-US").format(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 = {
|
|
time: {
|
|
seconds: 0,
|
|
minutes: 0,
|
|
hours: 21,
|
|
dayOfWeek: 7,
|
|
dayOfMonth: "*",
|
|
month: "*"
|
|
},
|
|
execute: guildWeekly,
|
|
onComplete: null,
|
|
start: true,
|
|
timeZone: "Europe/Zagreb"
|
|
} as Cron
|