feat: filter-servers (#564)

* chore: update query

* feat: filter outdated servers
This commit is contained in:
SKINMAKER 2023-05-29 22:19:24 +09:00 committed by GitHub
parent 2b3fe7da80
commit 013b9b7183
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -105,8 +105,9 @@ async function getServer(id: string, topLevel=true): Promise<Server> {
.orWhereRaw(`(flags & ${ServerFlags.partnered}) and vanity=?`, [id]) .orWhereRaw(`(flags & ${ServerFlags.partnered}) and vanity=?`, [id])
if (res[0]) { if (res[0]) {
const data = await getServerData(res[0].id) const data = await getServerData(res[0].id)
if(!data || (+new Date() - +new Date(data.updatedAt)) > 3 * 60 * 1000) res[0].state = 'unreachable' if(!data || (+new Date() - +new Date(data.updatedAt)) > 3 * 60 * 1000) {
else { if(res[0].state === 'ok') res[0].state = 'unreachable'
} else {
res[0].flags = res[0].flags | (data.features.includes(GuildFeature.Partnered) && ServerFlags.discord_partnered) | (data.features.includes(GuildFeature.Verified) && ServerFlags.verified) res[0].flags = res[0].flags | (data.features.includes(GuildFeature.Partnered) && ServerFlags.discord_partnered) | (data.features.includes(GuildFeature.Verified) && ServerFlags.verified)
if(res[0].owners !== JSON.stringify([data.owner, ...data.admins]) || res[0].name !== data.name) if(res[0].owners !== JSON.stringify([data.owner, ...data.admins]) || res[0].name !== data.name)
await knex('servers').update({ name: data.name, owners: JSON.stringify([data.owner, ...data.admins]) }) await knex('servers').update({ name: data.name, owners: JSON.stringify([data.owner, ...data.admins]) })
@ -245,8 +246,8 @@ async function getBotList(type: ListType, page = 1, query?: string):Promise<List
.select(['id']) .select(['id'])
} else if (type === 'SEARCH') { } else if (type === 'SEARCH') {
if (!query) throw new Error('쿼리가 누락되었습니다.') if (!query) throw new Error('쿼리가 누락되었습니다.')
count = (await knex.raw('SELECT count(*) FROM bots WHERE MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode)', [decodeURI(query) + '*']))[0][0]['count(*)'] count = (await knex.raw('SELECT count(*) FROM bots WHERE `state` != "blocked" AND MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode)', [decodeURI(query) + '*']))[0][0]['count(*)']
res = (await knex.raw('SELECT id, votes, MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode) as relevance FROM bots WHERE MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode) ORDER BY relevance DESC, votes DESC LIMIT 16 OFFSET ?', [decodeURI(query) + '*', decodeURI(query) + '*', ((page ? Number(page) : 1) - 1) * 16]))[0] res = (await knex.raw('SELECT id, votes, MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode) as relevance FROM bots WHERE `state` != "blocked" AND MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode) ORDER BY relevance DESC, votes DESC LIMIT 16 OFFSET ?', [decodeURI(query) + '*', decodeURI(query) + '*', ((page ? Number(page) : 1) - 1) * 16]))[0]
} else { } else {
count = 1 count = 1
res = [] res = []
@ -265,12 +266,14 @@ async function getServerList(type: ListType, page = 1, query?: string):Promise<L
.limit(16) .limit(16)
.offset(((page ? Number(page) : 1) - 1) * 16) .offset(((page ? Number(page) : 1) - 1) * 16)
.select(['id']) .select(['id'])
.where('last_updated', '>=', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString())
.whereNot({ state: 'blocked' }) .whereNot({ state: 'blocked' })
} else if (type === 'TRUSTED') { } else if (type === 'TRUSTED') {
count = ( count = (
await knex('servers') await knex('servers')
.whereRaw(`flags & ${ServerFlags.trusted}`) .whereRaw(`flags & ${ServerFlags.trusted}`)
.count() .count()
.where('last_updated', '>=', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString())
.whereNot({ state: 'blocked' }) .whereNot({ state: 'blocked' })
)[0]['count(*)'] )[0]['count(*)']
res = await knex('servers').whereNot({ state: 'blocked' }) res = await knex('servers').whereNot({ state: 'blocked' })
@ -279,6 +282,7 @@ async function getServerList(type: ListType, page = 1, query?: string):Promise<L
.limit(16) .limit(16)
.offset(((page ? Number(page) : 1) - 1) * 16) .offset(((page ? Number(page) : 1) - 1) * 16)
.select(['id']) .select(['id'])
.where('last_updated', '>=', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString())
.whereNot({ state: 'blocked' }) .whereNot({ state: 'blocked' })
} else if (type === 'NEW') { } else if (type === 'NEW') {
count = ( count = (
@ -290,16 +294,17 @@ async function getServerList(type: ListType, page = 1, query?: string):Promise<L
.limit(16) .limit(16)
.offset(((page ? Number(page) : 1) - 1) * 16) .offset(((page ? Number(page) : 1) - 1) * 16)
.select(['id']) .select(['id'])
.where('last_updated', '>=', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString())
.whereNot({ state: 'blocked' }) .whereNot({ state: 'blocked' })
} else if (type === 'PARTNERED') { } else if (type === 'PARTNERED') {
count = ( count = (
await knex('servers') await knex('servers')
.whereRaw(`flags & ${ServerFlags.partnered}`) .whereRaw(`flags & ${ServerFlags.partnered} AND last_updated >= ?`, [new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString()])
.andWhereNot({ state: 'blocked' }) .andWhereNot({ state: 'blocked' })
.count() .count()
)[0]['count(*)'] )[0]['count(*)']
res = await knex('servers') res = await knex('servers')
.whereRaw(`flags & ${ServerFlags.partnered}`) .whereRaw(`flags & ${ServerFlags.partnered} AND last_updated >= ?`, [new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString()])
.andWhereNot({ state: 'blocked' }) .andWhereNot({ state: 'blocked' })
.orderByRaw('RAND()') .orderByRaw('RAND()')
.limit(16) .limit(16)
@ -310,12 +315,14 @@ async function getServerList(type: ListType, page = 1, query?: string):Promise<L
if (!serverCategories.includes(query)) throw new Error('알 수 없는 카테고리입니다.') if (!serverCategories.includes(query)) throw new Error('알 수 없는 카테고리입니다.')
count = ( count = (
await knex('servers') await knex('servers')
.where('last_updated', '>=', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString())
.where('category', 'like', `%${decodeURI(query)}%`) .where('category', 'like', `%${decodeURI(query)}%`)
.andWhereNot({ state: 'blocked' }) .andWhereNot({ state: 'blocked' })
.count() .count()
)[0]['count(*)'] )[0]['count(*)']
res = await knex('servers') res = await knex('servers')
.where('category', 'like', `%${decodeURI(query)}%`) .where('category', 'like', `%${decodeURI(query)}%`)
.where('last_updated', '>=', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString())
.andWhereNot({ state: 'blocked' }) .andWhereNot({ state: 'blocked' })
.orderBy('votes', 'desc') .orderBy('votes', 'desc')
.limit(16) .limit(16)
@ -323,8 +330,8 @@ async function getServerList(type: ListType, page = 1, query?: string):Promise<L
.select(['id']) .select(['id'])
} else if (type === 'SEARCH') { } else if (type === 'SEARCH') {
if (!query) throw new Error('쿼리가 누락되었습니다.') if (!query) throw new Error('쿼리가 누락되었습니다.')
count = (await knex.raw('SELECT count(*) FROM servers WHERE MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode)', [decodeURI(query) + '*']))[0][0]['count(*)'] count = (await knex.raw('SELECT count(*) FROM servers WHERE `state` != "blocked" AND last_updated >= ? AND MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode)', [new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(), decodeURI(query) + '*']))[0][0]['count(*)']
res = (await knex.raw('SELECT id, votes, MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode) as relevance FROM servers WHERE MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode) ORDER BY relevance DESC, votes DESC LIMIT 16 OFFSET ?', [decodeURI(query) + '*', decodeURI(query) + '*', ((page ? Number(page) : 1) - 1) * 16]))[0] res = (await knex.raw('SELECT id, votes, MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode) as relevance FROM servers WHERE `state` != "blocked" AND last_updated >= ? AND MATCH(`name`, `intro`, `desc`) AGAINST(? in boolean mode) ORDER BY relevance DESC, votes DESC LIMIT 16 OFFSET ?', [decodeURI(query) + '*', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(), decodeURI(query) + '*', ((page ? Number(page) : 1) - 1) * 16]))[0]
} else { } else {
count = 1 count = 1
res = [] res = []
@ -470,6 +477,7 @@ async function submitServer(userID: string, id: string, data: AddServerSubmit):
category: JSON.stringify(data.category), category: JSON.stringify(data.category),
invite: data.invite, invite: data.invite,
token: sign({ id }), token: sign({ id }),
last_updated: new Date().toISOString()
}) })
get.server.clear(id) get.server.clear(id)
return true return true