/
user.ts
128 lines (112 loc) · 3.55 KB
/
user.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import type { Client } from '../client/mod.ts'
import type { UserPayload } from '../types/user.ts'
import { UserFlagsManager } from '../utils/userFlags.ts'
import { SnowflakeBase } from './base.ts'
import { ImageURL } from './cdn.ts'
import type { ImageSize, ImageFormats } from '../types/cdn.ts'
import { DEFAULT_USER_AVATAR, USER_AVATAR } from '../types/endpoint.ts'
import type { DMChannel } from './dmChannel.ts'
import { AllMessageOptions } from './textChannel.ts'
import { Message } from './message.ts'
import { IResolvable } from './resolvable.ts'
export class User extends SnowflakeBase {
id: string
username!: string
discriminator!: string
avatar?: string
bot?: boolean
system?: boolean
mfaEnabled?: boolean
locale?: string
verified?: boolean
email?: string
flags!: UserFlagsManager
/**
* Nitro type of the User.
*
* 0 = No Nitro
* 1 = Classic Nitro
* 2 = Regular Nitro
*/
premiumType?: 0 | 1 | 2
publicFlags!: UserFlagsManager
get tag(): string {
return `${this.username}#${this.discriminator}`
}
get nickMention(): string {
return `<@!${this.id}>`
}
get mention(): string {
return `<@${this.id}>`
}
avatarURL(format: ImageFormats = 'png', size: ImageSize = 512): string {
return this.avatar != null
? `${ImageURL(USER_AVATAR(this.id, this.avatar), format, size)}`
: this.defaultAvatarURL
}
get defaultAvatarURL(): string {
return `${DEFAULT_USER_AVATAR(String(Number(this.discriminator) % 5))}.png`
}
constructor(client: Client, data: UserPayload) {
super(client, data)
this.id = data.id
this.readFromData(data)
}
readFromData(data: UserPayload): void {
this.username = data.username ?? this.username
this.discriminator = data.discriminator ?? this.discriminator
this.avatar = data.avatar ?? this.avatar
this.bot = data.bot ?? this.bot
this.system = data.system ?? this.system
this.mfaEnabled = data.mfa_enabled ?? this.mfaEnabled
this.locale = data.locale ?? this.locale
this.verified = data.verified ?? this.verified
this.email = data.email ?? this.email
this.flags =
data.flags !== undefined ? new UserFlagsManager(data.flags) : this.flags
this.premiumType = data.premium_type ?? this.premiumType
this.publicFlags =
data.public_flags !== undefined
? new UserFlagsManager(data.public_flags)
: this.publicFlags
}
toString(): string {
return this.mention
}
async createDM(): Promise<DMChannel> {
return this.client.createDM(this)
}
async resolveDM(): Promise<DMChannel> {
const dmID = await this.client.channels.getUserDM(this.id)
const dm =
(dmID !== undefined
? await this.client.channels.get<DMChannel>(dmID)
: undefined) ??
(await this.createDM().then((chan) =>
this.client.channels.setUserDM(this.id, chan.id).then(() => chan)
))
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
return dm!
}
async send(
content: string | AllMessageOptions,
options?: AllMessageOptions
): Promise<Message> {
const dm = await this.resolveDM()
return dm.send(content, options)
}
}
export class UserResolvable extends SnowflakeBase implements IResolvable<User> {
constructor(client: Client, public id: string) {
super(client)
}
async get(): Promise<User | undefined> {
return this.client.users.get(this.id)
}
async fetch(): Promise<User> {
return this.client.users.fetch(this.id)
}
async resolve(): Promise<User | undefined> {
return this.client.users.resolve(this.id)
}
}