tag matching game role in event reminders

This commit is contained in:
Justin Oros
2026-09-14 11:14:16 -07:00
parent 4601e34e93
commit 20b3e514a0
2 changed files with 11 additions and 4 deletions
+1 -1
View File
@@ -80,7 +80,7 @@ To change the token or key later, edit `.env` directly, then run the installer a
- To add, remove, or change greetings, edit `greetings.yaml`. Use `{user}` anywhere in a greeting and it gets replaced with a mention of the person who joined.
- Same for goodbyes: edit `goodbyes.yaml`. Use `{user}` there too, it gets replaced with the username of whoever left (a plain name, not a mention, since Discord can't ping someone no longer in the server).
- The join greeting posts to whichever channel is named `general` in your server. To use a different channel, change `GREETING_CHANNEL_NAME` near the top of `index.js` to that channel's name (no `#`) and restart it (re-run the installer, or `pm2 restart discord-bot`). If no channel with that name exists, nothing posts and `bot.error.log` will note it.
- Any Discord Scheduled Event on your server gets an automatic reminder posted to that same channel 5 minutes before it starts, like "EVENT: Movie Night starting soon!" Each event only gets reminded once. To change how far ahead it reminds, edit `EVENT_REMINDER_MINUTES` near the top of `index.js` and restart it.
- Any Discord Scheduled Event on your server gets an automatic reminder posted to that same channel 5 minutes before it starts, like "EVENT: Movie Night starting soon!" If the event's title matches an existing game role, that role gets tagged too, like "@The Forest EVENT: The Forest starting soon!" Each event only gets reminded once. To change how far ahead it reminds, edit `EVENT_REMINDER_MINUTES` near the top of `index.js` and restart it.
- `!info` gets platforms and Multiplayer/Co-Op/Cross-Play from that game's Steam store page when it has one. For non-Steam games (GOG/Epic exclusives etc.) there is no such lookup available, so "not listed" there means "couldn't confirm it," not "definitely single-player only."
- The ownership count on `!info` combines two sources: anyone who ran `!own` for that game, plus anyone who linked their Steam profile with `!my-steam-profile` and actually owns it there. Discord itself has no concept of game ownership, so there is no fully automatic way to get this - `!own` needs people to mark their own games by hand, and `!my-steam-profile` only auto-detects Steam copies (not GOG/Epic) and only if that person's Steam profile has "game details" set to public. Everything self-reported through `!own` is stored in `owned.json`; Steam profile links are stored in `steamlinks.json`, both in this folder, in plain text.
- `!popular` combines both sources across every game, not just one at a time: anything self-reported with `!own`, plus a full scan of every Steam-linked member's library (Steam already hands back the game name with that lookup, so no extra API calls are needed). The same game reported through `!own` and detected in someone's Steam library counts as one shared total, not two. Games with only one confirmed owner are left out, and everything is sorted most-owned first.
+10 -3
View File
@@ -2201,7 +2201,11 @@ async function checkUpcomingEvents(client) {
}
try {
await channel.send("EVENT: " + event.name + " starting soon!");
const roles = loadRoles();
const match = findGameRole(roles, event.name);
const role = match && guild.roles.cache.get(match.entry.roleId);
const mention = role ? role.toString() + " " : "";
await channel.send(mention + "EVENT: " + event.name + " starting soon!");
} catch (err) {
console.error("Could not send event reminder:", err.message);
}
@@ -2337,8 +2341,11 @@ async function handleRoleInteraction(interaction, roleId) {
const entries = sortedRoleEntries();
const counts = roleMemberCounts(interaction.guild, entries);
if (counts[roleId] !== undefined) {
counts[roleId] = Math.max(0, counts[roleId] + (hadRole ? -1 : 1));
const role = interaction.guild.roles.cache.get(roleId);
const cacheHasMember = role ? role.members.has(interaction.member.id) : false;
const shouldHaveMember = !hadRole;
if (counts[roleId] !== undefined && cacheHasMember !== shouldHaveMember) {
counts[roleId] = Math.max(0, counts[roleId] + (shouldHaveMember ? 1 : -1));
}
const picker = buildRolePickerComponents(entries, counts);
try {