Removed test cron event and added guild log event
This commit is contained in:
137
src/events/cron/weeklyGexp.ts
Normal file
137
src/events/cron/weeklyGexp.ts
Normal file
@@ -0,0 +1,137 @@
|
||||
import {
|
||||
hypixelGuildID,
|
||||
guildLogChannel,
|
||||
color,
|
||||
devMessage
|
||||
} from "../../../config/options.json"
|
||||
import { getGuild, getIGN } from "../../utils/Hypixel"
|
||||
import { Cron, GuildData } from "../../interfaces"
|
||||
import Illegitimate from "../../utils/Illegitimate"
|
||||
import { GuildTextBasedChannel } from "discord.js"
|
||||
const client = Illegitimate.client
|
||||
|
||||
async function guildWeekly() {
|
||||
const channel = client.channels.cache.get(
|
||||
guildLogChannel,
|
||||
) as GuildTextBasedChannel
|
||||
|
||||
if (!channel) {
|
||||
console.log("Guild log channel not found")
|
||||
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({ forceStatic: false })!,
|
||||
},
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
|
||||
export = {
|
||||
time: {
|
||||
seconds: 0,
|
||||
minutes: 0,
|
||||
hours: 21,
|
||||
dayOfWeek: 7,
|
||||
dayOfMonth: "*",
|
||||
month: "*",
|
||||
},
|
||||
execute: guildWeekly,
|
||||
onComplete: null,
|
||||
start: true,
|
||||
timeZone: "Europe/Zagreb",
|
||||
} as Cron
|
||||
Reference in New Issue
Block a user