feat: detect bots using http interactions (#515)

* feat: check if bot uses interactions over http

* chore: remove optional chainings

* fix: replace with falsy check

* chore: remove unnecessary operator

* fix: check flags properly
This commit is contained in:
SKINMAKER 2023-01-14 22:16:34 +09:00 committed by GitHub
parent 0dc1d99bda
commit ad12c4d55d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,7 +1,7 @@
import fetch from 'node-fetch'
import { TLRU } from 'tlru'
import DataLoader from 'dataloader'
import { ActivityType, GuildFeature, GuildMember, User as DiscordUser } from 'discord.js'
import { ActivityType, GuildFeature, GuildMember, User as DiscordUser, UserFlags } from 'discord.js'
import { Bot, Server, User, ListType, List, TokenRegister, BotFlags, DiscordUserFlags, SubmittedBot, DiscordTokenInfo, ServerData, ServerFlags, RawGuild, Nullable } from '@types'
import { botCategories, DiscordEnpoints, imageSafeHost, serverCategories, SpecialEndPoints, VOTE_COOLDOWN } from './Constants'
@ -49,17 +49,19 @@ async function getBot(id: string, topLevel=true):Promise<Bot> {
const discordBot = await DiscordBot.users.fetch(res[0].id).then(r=> r).catch(() => null) as DiscordUser
if(!discordBot) return null
const botMember = await getMainGuild()?.members?.fetch(res[0].id).catch(e=> e) as GuildMember
res[0].flags = res[0].flags | (discordBot.flags?.bitfield && DiscordUserFlags.VERIFIED_BOT ? BotFlags.verified : 0) | (res[0].trusted ? BotFlags.trusted : 0) | (res[0].partnered ? BotFlags.partnered : 0)
res[0].flags = res[0].flags | (discordBot.flags?.bitfield & DiscordUserFlags.VERIFIED_BOT ? BotFlags.verified : 0) | (res[0].trusted ? BotFlags.trusted : 0) | (res[0].partnered ? BotFlags.partnered : 0)
res[0].tag = discordBot.discriminator
res[0].avatar = discordBot.avatar
res[0].name = discordBot.username
res[0].category = JSON.parse(res[0].category)
res[0].owners = JSON.parse(res[0].owners)
if(botMember) {
if(botMember.presence === null) {
if(discordBot.flags.has(UserFlags.BotHTTPInteractions)) {
res[0].status = 'online'
} else if(!botMember.presence) {
res[0].status = 'offline'
} else {
res[0].status = botMember?.presence?.activities.find(r => r.type === ActivityType.Streaming) ? 'streaming' : botMember?.presence?.status || null
res[0].status = botMember.presence.activities.some(r => r.type === ActivityType.Streaming) ? 'streaming' : botMember.presence.status
}
} else {
res[0].status = null