136 lines
3.9 KiB
TypeScript
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
|