Files
illegitimate-bot/src/events/cron/weeklyGexp.ts
2024-01-19 21:36:01 +01:00

136 lines
3.9 KiB
TypeScript

import {
hypixelGuildID,
guildLogChannel,
color,
devMessage
} from "config/options.json"
import colorLog from "utils/functions/colors"
import { getGuild, getIGN } from "utils/Hypixel"
import { Cron, GuildData } from "interfaces"
import Illegitimate from "utils/Illegitimate"
import { TextChannel } from "discord.js"
const client = Illegitimate.client
async function guildWeekly() {
const channel = client.channels.cache.get(guildLogChannel) as TextChannel
if (!channel) {
console.log(colorLog("Guild log channel not found", "red"))
return
}
const embedColor = Number(color.replace("#", "0x"))
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