Fix managers' array function

This commit is contained in:
Helloyunho 2020-12-19 16:58:40 +09:00
parent 920cf133bc
commit a04f6ab973
8 changed files with 126 additions and 6 deletions

View File

@ -42,7 +42,7 @@ export class BaseManager<T, T2> {
}
/** Gets an Array of values from Cache */
async array(): Promise<undefined | T2[]> {
async array(): Promise<T2[]> {
let arr = await (this.client.cache.array(this.cacheName) as T[])
if (arr === undefined) arr = []
return arr.map((e) => new this.DataType(this.client, e)) as any

View File

@ -25,7 +25,7 @@ export class ChannelsManager extends BaseManager<ChannelPayload, Channel> {
return res as any
}
async array(): Promise<undefined | Channel[]> {
async array(): Promise<Channel[]> {
const arr = await (this.client.cache.array(
this.cacheName
) as ChannelPayload[])

View File

@ -29,7 +29,7 @@ export class GuildVoiceStatesManager extends BaseManager<
return new VoiceState(this.client, raw, {
user: ((await this.client.users.get(raw.user_id)) as unknown) as User,
channel:
raw.channel_id == null
raw.channel_id === null
? null
: (((await this.client.channels.get<VoiceChannel>(
raw.channel_id
@ -40,6 +40,37 @@ export class GuildVoiceStatesManager extends BaseManager<
})
}
async array(): Promise<VoiceState[]> {
let arr = await (this.client.cache.array(
this.cacheName
) as VoiceStatePayload[])
if (arr === undefined) arr = []
return await Promise.all(
arr.map(async (raw) => {
const guild =
raw.guild_id === undefined
? undefined
: await this.client.guilds.get(raw.guild_id)
return new VoiceState(this.client, raw, {
user: ((await this.client.users.get(raw.user_id)) as unknown) as User,
channel:
raw.channel_id === null
? null
: (((await this.client.channels.get<VoiceChannel>(
raw.channel_id
)) as unknown) as VoiceChannel),
guild,
member:
guild === undefined
? undefined
: await guild.members.get(raw.user_id)
})
})
)
}
async fromPayload(d: VoiceStatePayload[]): Promise<void> {
for (const data of d) {
await this.set(data.user_id, data)

View File

@ -37,6 +37,27 @@ export class MembersManager extends BaseManager<MemberPayload, Member> {
return res
}
async array(): Promise<Member[]> {
let arr = await (this.client.cache.array(this.cacheName) as MemberPayload[])
if (arr === undefined) arr = []
return await Promise.all(
arr.map(async (raw) => {
const user = new User(this.client, raw.user)
const roles = await this.guild.roles.array()
let permissions = new Permissions(Permissions.DEFAULT)
if (roles !== undefined) {
const mRoles = roles.filter(
(r) =>
(raw.roles.includes(r.id) as boolean) || r.id === this.guild.id
)
permissions = new Permissions(mRoles.map((r) => r.permissions))
}
return new Member(this.client, raw, user, this.guild, permissions)
})
)
}
async fetch(id: string): Promise<Member> {
return await new Promise((resolve, reject) => {
this.client.rest

View File

@ -37,6 +37,20 @@ export class MessageReactionsManager extends BaseManager<
)
}
async array(): Promise<MessageReaction[]> {
let arr = await (this.client.cache.array(this.cacheName) as Reaction[])
if (arr === undefined) arr = []
return await Promise.all(
arr.map(async (raw) => {
let emoji = await this.client.emojis.get(raw.emoji.id)
if (emoji === undefined) emoji = new Emoji(this.client, raw.emoji)
return new MessageReaction(this.client, raw, this.message, emoji)
})
)
}
async flush(): Promise<any> {
await this.client.cache.deleteCache(`reaction_users:${this.message.id}`)
return this.client.cache.deleteCache(this.cacheName)

View File

@ -44,6 +44,42 @@ export class MessagesManager extends BaseManager<MessagePayload, Message> {
)
}
async array(): Promise<Message[]> {
let arr = await (this.client.cache.array(
this.cacheName
) as MessagePayload[])
if (arr === undefined) arr = []
const result: Message[] = []
await Promise.all(
arr.map(async (raw) => {
if (raw.author === undefined) return
let channel = await this.client.channels.get(raw.channel_id)
if (channel === undefined)
channel = await this.client.channels.fetch(raw.channel_id)
if (channel === undefined) return
let author = ((await this.client.users.get(
raw.author.id
)) as unknown) as User
if (author === undefined) author = new User(this.client, raw.author)
const res = new Message(
this.client,
raw,
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
channel as TextChannel,
author
)
await res.mentions.fromPayload(raw)
result.push(res)
})
)
return result
}
async fetch(id: string): Promise<Message> {
return await new Promise((resolve, reject) => {
this.client.rest

View File

@ -27,6 +27,25 @@ export class GuildPresencesManager extends BaseManager<
return presence
}
async array(): Promise<Presence[]> {
let arr = await (this.client.cache.array(
this.cacheName
) as PresenceUpdatePayload[])
if (arr === undefined) arr = []
const result: Presence[] = []
await Promise.all(
arr.map(async (raw) => {
let user = await this.client.users.get(raw.user.id)
if (user === undefined) user = new User(this.client, raw.user)
const guild = await this.client.guilds.get(raw.guild_id)
if (guild === undefined) return
result.push(new Presence(this.client, raw, user, guild))
})
)
return result
}
async fromPayload(
data: PresenceUpdatePayload[]
): Promise<GuildPresencesManager> {

View File

@ -59,10 +59,9 @@ client.on('messageCreate', async (msg: Message) => {
if (msg.content === '!ping') {
msg.reply(`Pong! Ping: ${client.ping}ms`)
} else if (msg.content === '!members') {
const col = await msg.guild?.members.collection()
const col = await msg.guild?.members.array()
const data = col
?.array()
.map((c: Member, i: number) => {
?.map((c: Member, i: number) => {
return `${i + 1}. ${c.user.tag}`
})
.join('\n') as string