Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 24 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { Action, Actions } from "./types/action";
import { handleVcJoin } from "./handlers/events/vc/join";
import { handleVcLeave } from "./handlers/events/vc/leave";
import { handleVcLogger } from "./handlers/events/vc/logger";
import { updateMemberCount } from "./jobs/updateMemberCount";
import { updateMemberCount, firstJob } from "./jobs/updateMemberCount";
import { loadCommands, loadActions } from "./utils/loader";
import dotenv from "dotenv";
import noticeNewRecruit from "./jobs/noticeNewRecruit";
Expand Down Expand Up @@ -53,6 +53,7 @@ client.once("clientReady", async () => {
console.log("Bot is ready!");
console.log("");

await firstJob(client);
await updateMemberCount(client);

return client.user?.setActivity("with Discord.js", { type: 0 });
Expand Down Expand Up @@ -150,7 +151,6 @@ client.on("voiceStateUpdate", handleVcLogger);
client.on("voiceStateUpdate", handleVcJoin);
client.on("voiceStateUpdate", handleVcLeave);

// メンバー数更新
client.on("guildMemberAdd", async (member) => {
const time = Date.now();
const date = new Date(time);
Expand All @@ -169,8 +169,6 @@ client.on("guildMemberAdd", async (member) => {
} else if (date.getFullYear() == 2026) {
member.roles.add("1455864840630308925");
}

await updateMemberCount(client);
});

// メンバー数更新
Expand All @@ -185,5 +183,27 @@ client.on("threadCreate", async (thread, newlyCreated) => {
}
});

client.on("guildMemberUpdate", async (oldMember, newMember) => {
console.log("[INFO] Detect guildMemberUpdate");
console.log("-> NEW MEMBER");
console.log(
` -> hasStudentRole: ${newMember.roles.cache.has("1454446371221536788")}`,
);
console.log("-> OLD MEMBER");
console.log(
` -> hasStudentRole: ${oldMember.roles.cache.has("1454446371221536788")}`,
);

// 学生ロールの付与、剥奪を検知して学生数カウントを更新
if (
(!oldMember.roles.cache.has("1454446371221536788") &&
newMember.roles.cache.has("1454446371221536788")) ||
(oldMember.roles.cache.has("1454446371221536788") &&
!newMember.roles.cache.has("1454446371221536788"))
) {
await updateMemberCount(client);
}
});

export { FILE_TYPE, client, commands, actions };
client.login(process.env.DISCORD_TOKEN);
49 changes: 39 additions & 10 deletions src/jobs/updateMemberCount.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,55 @@
import { Client } from "discord.js";
import { getMemberStatus } from "../utils/getMemberStatus";

export async function updateMemberCount(client: Client) {
const CHANNEL_ID = "1454473598973509697";
const GUILD_ID = "1452263053180534806";
const CHANNEL_ID = "1454473598973509697";
const GUILD_ID = "1452263053180534806";

let membersFetched = false;

console.log("Starting member count job...");
export async function updateMemberCount(client: Client) {
console.log("[INFO] Starting member count job...");

try {
console.log("Updating member count...");
console.log("[INFO] Updating member count...");

const guild = client.guilds.cache.get(GUILD_ID);
if (!guild) return;
if (!guild) {
console.error("[ERROR] Guild not found");
return;
}

const channel = guild.channels.cache.get(CHANNEL_ID);
if (!channel || !channel.isVoiceBased()) return;
if (!channel || !channel.isTextBased()) {
console.error("[ERROR] Channel not found or not a text channel");
return;
}

const studentRole = guild.roles.cache.get("1454446371221536788");
if (!studentRole) {
console.error("[ERROR] Student role not found");
return;
}

if (!membersFetched) {
console.log("[INFO] Member cache is not fetched. Creating...");
await firstJob(client);
}

const { humans: memberCount } = await getMemberStatus(guild);
const memberCount = studentRole.members.size;

await channel.setName(`学生数: ${memberCount}`);
console.log(`Updated member count in ${channel.name}`);
console.log(`[INFO] Updated member count in ${channel.name}`);
} catch (error) {
console.error(`Error updating member count: ${error}`);
console.error(`[ERROR] Updating member count: ${error}`);
}
}

export async function firstJob(client: Client) {
console.log("[INFO] Starting first job...");

const guild = await client.guilds.fetch(GUILD_ID);
await guild.members.fetch();
membersFetched = true;

console.log("[INFO] First job completed");
}