Merge pull request #64 from Helloyunho/fix-managers

Fix managers' array function
This commit is contained in:
Helloyunho 2020-12-19 19:15:06 +09:00 committed by GitHub
commit b0da81f308
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
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 */ /** 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[]) let arr = await (this.client.cache.array(this.cacheName) as T[])
if (arr === undefined) arr = [] if (arr === undefined) arr = []
return arr.map((e) => new this.DataType(this.client, e)) as any 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 return res as any
} }
async array(): Promise<undefined | Channel[]> { async array(): Promise<Channel[]> {
const arr = await (this.client.cache.array( const arr = await (this.client.cache.array(
this.cacheName this.cacheName
) as ChannelPayload[]) ) as ChannelPayload[])

View file

@ -29,7 +29,7 @@ export class GuildVoiceStatesManager extends BaseManager<
return new VoiceState(this.client, raw, { return new VoiceState(this.client, raw, {
user: ((await this.client.users.get(raw.user_id)) as unknown) as User, user: ((await this.client.users.get(raw.user_id)) as unknown) as User,
channel: channel:
raw.channel_id == null raw.channel_id === null
? null ? null
: (((await this.client.channels.get<VoiceChannel>( : (((await this.client.channels.get<VoiceChannel>(
raw.channel_id 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> { async fromPayload(d: VoiceStatePayload[]): Promise<void> {
for (const data of d) { for (const data of d) {
await this.set(data.user_id, data) await this.set(data.user_id, data)

View file

@ -37,6 +37,27 @@ export class MembersManager extends BaseManager<MemberPayload, Member> {
return res 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> { async fetch(id: string): Promise<Member> {
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
this.client.rest 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> { async flush(): Promise<any> {
await this.client.cache.deleteCache(`reaction_users:${this.message.id}`) await this.client.cache.deleteCache(`reaction_users:${this.message.id}`)
return this.client.cache.deleteCache(this.cacheName) 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> { async fetch(id: string): Promise<Message> {
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
this.client.rest this.client.rest

View file

@ -27,6 +27,25 @@ export class GuildPresencesManager extends BaseManager<
return presence 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( async fromPayload(
data: PresenceUpdatePayload[] data: PresenceUpdatePayload[]
): Promise<GuildPresencesManager> { ): Promise<GuildPresencesManager> {

View file

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