Skip to content

Commit

Permalink
feat(channels): correctly process events
Browse files Browse the repository at this point in the history
feat(users): add ability to dm the user
chore(release): 0.11.1
  • Loading branch information
Mirdukkk committed Jul 11, 2022
1 parent a49e830 commit cb618dd
Show file tree
Hide file tree
Showing 38 changed files with 279 additions and 97 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "discordoo",
"version": "0.11.0",
"version": "0.11.1",
"description": "Discord bots. Simplified and boosted",
"main": "./dist/src/index.js",
"module": "./dist/src/index.js",
Expand Down
11 changes: 7 additions & 4 deletions src/api/entities/channel/DirectMessagesChannel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,30 @@ import { MessageContent } from '@src/api/entities/message/interfaces/MessageCont
import { MessageCreateOptions } from '@src/api/entities/message/interfaces/MessageCreateOptions'
import { Json, Message, ToJsonProperties } from '@src/api'
import { DirectMessagesChannelMessagesManager } from '@src/api/managers/messages/DirectMessagesChannelMessagesManager'
import { AbstractChannelData } from '@src/api/entities/channel/interfaces/AbstractChannelData'
import { attach } from '@src/utils'
import { ChannelTypes } from '@src/constants'
import { EntityInitOptions } from '@src/api/entities/EntityInitOptions'
import { RawDirectMessagesChannelData } from '@src/api/entities/channel/interfaces/RawDirectMessagesChannelData'
import { DirectMessagesChannelData } from '@src/api/entities/channel/interfaces/DirectMessagesChannelData'

export class DirectMessagesChannel extends AbstractChannel implements WritableChannel {
public declare messages: DirectMessagesChannelMessagesManager
public declare type: ChannelTypes.DM
public lastMessageId?: string
public lastPinTimestamp?: number
public recipients: string[] = []

async init(data: AbstractChannelData, options?: EntityInitOptions): Promise<this> {
async init(data: RawDirectMessagesChannelData | DirectMessagesChannelData, options?: EntityInitOptions): Promise<this> {
await super.init(data, options)

attach(this, data, {
props: [
[ 'lastMessageId', 'last_message_id' ],
[ 'lastPinTimestamp', 'last_pin_timestamp' ]
[ 'lastPinTimestamp', 'last_pin_timestamp' ],
'recipients'
],
disabled: options?.ignore,
enabled: [ 'lastMessageId' ]
enabled: [ 'lastMessageId' ],
})

if (this.lastPinTimestamp) { // discord sends timestamp in string
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { AbstractGuildChannelData } from '@src/api/entities/channel/interfaces/AbstractGuildChannelData'
import { WritableChannelData } from '@src/api/entities/channel/interfaces/WritableChannelData'

export interface AbstractGuildTextChannelData extends AbstractGuildChannelData {
export interface AbstractGuildTextChannelData extends AbstractGuildChannelData, WritableChannelData {
topic?: string
nsfw?: boolean
lastMessageId?: string
lastPinTimestamp?: string
defaultAutoArchiveDuration?: number
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { AbstractChannelData } from '@src/api/entities/channel/interfaces/AbstractChannelData'
import { ThreadMemberData } from '@src/api/entities/member/interfaces/ThreadMemberData'
import { ThreadMetadata } from '@src/api/entities/channel/interfaces/ThreadMetadata'
import { WritableChannelData } from '@src/api/entities/channel/interfaces/WritableChannelData'

export interface AbstractThreadChannelData extends AbstractChannelData {
export interface AbstractThreadChannelData extends AbstractChannelData, WritableChannelData {
guildId: string
parentId?: string
ownerId?: string
lastMessageId?: string
lastPinTimestamp?: number
rateLimitPerUser?: number
messageCount?: number
memberCount?: number
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import { RawAbstractGuildChannelData } from '@src/api/entities/channel/interface
import { RawAbstractGuildTextChannelData } from '@src/api/entities/channel/interfaces/RawAbstractGuildTextChannelData'
import { RawGuildTextChannelData } from '@src/api/entities/channel/interfaces/RawGuildTextChannelData'
import { RawGuildStoreChannelData } from '@src/api/entities/channel/interfaces/RawGuildStoreChannelData'
import { RawDirectMessagesChannelData } from '@src/api/entities/channel/interfaces/RawDirectMessagesChannelData'

export type AnyRawGuildChannelData = RawAbstractGuildChannelData
| RawAbstractGuildTextChannelData | RawGuildTextChannelData | RawGuildStoreChannelData
| RawAbstractGuildTextChannelData | RawGuildTextChannelData | RawGuildStoreChannelData

export type AnyRawChannelData = AnyRawGuildChannelData | RawDirectMessagesChannelData
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { AnyChannel } from '@src/api/entities/channel/interfaces/AnyChannel'

export interface GuildChannelDeleteOptions {
export interface ChannelDeleteOptions {
reason?: string
patchEntity?: AnyChannel
isDm?: boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { AbstractChannelData } from '@src/api'
import { WritableChannelData } from '@src/api/entities/channel/interfaces/WritableChannelData'

export interface DirectMessagesChannelData extends AbstractChannelData, WritableChannelData {
recipientId: string
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { RawAbstractGuildChannelData } from '@src/api/entities/channel/interfaces/RawAbstractGuildChannelData'
import { RawWritableChannelData } from '@src/api/entities/channel/interfaces/RawWritableChannelData'

export interface RawAbstractGuildTextChannelData extends RawAbstractGuildChannelData {
export interface RawAbstractGuildTextChannelData extends RawAbstractGuildChannelData, RawWritableChannelData {
topic?: string
nsfw?: boolean
last_message_id?: string
last_pin_timestamp?: string
default_auto_archive_duration?: number
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { AbstractChannelData } from '@src/api/entities/channel/interfaces/AbstractChannelData'
import { RawThreadMetadata } from '@src/api/entities/channel/interfaces/RawThreadMetadata'
import { RawThreadMemberData } from '@src/api/entities/member/interfaces/RawThreadMemberData'
import { RawWritableChannelData } from '@src/api/entities/channel/interfaces/RawWritableChannelData'

export interface RawAbstractThreadChannelData extends AbstractChannelData {
export interface RawAbstractThreadChannelData extends AbstractChannelData, RawWritableChannelData {
guild_id: string
parent_id?: string
owner_id?: string
last_message_id?: string
last_pin_timestamp?: string
rate_limit_per_user?: number
message_count?: number
member_count?: number
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { RawAbstractGuildTextChannelData, RawUserData } from '@src/api'
import { RawWritableChannelData } from '@src/api/entities/channel/interfaces/RawWritableChannelData'

export interface RawDirectMessagesChannelData extends RawAbstractGuildTextChannelData, RawWritableChannelData {
recipients: RawUserData[]
}
4 changes: 4 additions & 0 deletions src/api/entities/channel/interfaces/RawWritableChannelData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export interface RawWritableChannelData {
last_message_id?: string
last_pin_timestamp?: string
}
4 changes: 4 additions & 0 deletions src/api/entities/channel/interfaces/WritableChannelData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export interface WritableChannelData {
lastMessageId?: string
lastPinTimestamp?: number
}
2 changes: 1 addition & 1 deletion src/api/entities/channel/interfaces/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export { AbstractGuildTextChannelData } from '@src/api/entities/channel/interfac
export { RawAbstractGuildChannelData } from '@src/api/entities/channel/interfaces/RawAbstractGuildChannelData'
export { RawThreadChannelCreateData } from '@src/api/entities/channel/interfaces/RawThreadChannelCreateData'
export { RawGuildChannelCreateData } from '@src/api/entities/channel/interfaces/RawGuildChannelCreateData'
export { GuildChannelDeleteOptions } from '@src/api/entities/channel/interfaces/GuildChannelDeleteOptions'
export { ChannelDeleteOptions } from '@src/api/entities/channel/interfaces/ChannelDeleteOptions'
export { AbstractThreadChannelData } from '@src/api/entities/channel/interfaces/AbstractThreadChannelData'
export { ThreadChannelEditOptions } from '@src/api/entities/channel/interfaces/ThreadChannelEditOptions'
export { AbstractGuildChannelData } from '@src/api/entities/channel/interfaces/AbstractGuildChannelData'
Expand Down
2 changes: 1 addition & 1 deletion src/api/entities/interaction/Interaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export class Interaction extends AbstractEntity {
async channel(options?: CacheManagerGetOptions): Promise<AnyWritableChannel | undefined> {
if (this.channelId) {
return this.client.internals.cache.get(
Keyspaces.CHANNELS, this.guildId ?? this.userId!, 'channelEntityKey', this.channelId, options
Keyspaces.CHANNELS, this.guildId ?? 'dm', 'channelEntityKey', this.channelId, options
)
}
}
Expand Down
Empty file.
Empty file.
29 changes: 27 additions & 2 deletions src/api/entities/member/GuildMember.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
import { AbstractEntity } from '@src/api/entities/AbstractEntity'
import { Guild, GuildMemberData, Json, RawGuildMemberData, ReadonlyPermissions, ToJsonProperties, User } from '@src/api'
import {
DirectMessagesChannel,
Guild,
GuildMemberData,
Json, Message,
MessageContent,
MessageCreateOptions,
RawGuildMemberData,
ReadonlyPermissions,
ToJsonProperties,
User
} from '@src/api'
import { Keyspaces, PermissionFlags, ToJsonOverrideSymbol } from '@src/constants'
import { attach, DiscordooError, ImageUrlOptions, WebSocketUtils } from '@src/utils'
import { filterAndMap } from '@src/utils/filterAndMap'
Expand Down Expand Up @@ -107,10 +118,24 @@ export class GuildMember extends AbstractEntity {
return this
}

async user(options?: CacheManagerGetOptions): Promise<User | undefined> {
async send(content: MessageContent, options?: MessageCreateOptions): Promise<Message | undefined> {
const dm = await this.dm()
if (!dm) return undefined
return dm.send(content, options)
}

user(options?: CacheManagerGetOptions): Promise<User | undefined> {
return this.client.users.cache.get(this.userId, options)
}

async dm(options?: CacheManagerGetOptions): Promise<DirectMessagesChannel | undefined> {
let channel = await this.client.dms.cache.get(this.userId, options)
if (!channel) {
channel = await this.client.dms.fetch(this.userId)
}
return channel
}

async guild(options?: CacheManagerGetOptions): Promise<Guild | undefined> {
return this.client.guilds.cache.get(this.guildId, options)
}
Expand Down
25 changes: 24 additions & 1 deletion src/api/entities/member/ThreadMember.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
import { AbstractEntity } from '@src/api/entities/AbstractEntity'
import { ThreadMemberData } from '@src/api/entities/member/interfaces/ThreadMemberData'
import { Guild, GuildMember, Json, ReadonlyThreadMemberFlagsUtil, ToJsonProperties, User } from '@src/api'
import {
DirectMessagesChannel,
Guild,
GuildMember,
Json, Message,
MessageContent,
MessageCreateOptions,
ReadonlyThreadMemberFlagsUtil,
ToJsonProperties,
User
} from '@src/api'
import { RawThreadMemberData } from '@src/api/entities/member/interfaces/RawThreadMemberData'
import { attach } from '@src/utils'
import { CacheManagerGetOptions } from '@src/cache'
Expand Down Expand Up @@ -41,11 +51,24 @@ export class ThreadMember extends AbstractEntity implements ThreadMemberData {
get joinDate(): Date {
return new Date(this.joinTimestamp)
}
async send(content: MessageContent, options?: MessageCreateOptions): Promise<Message | undefined> {
const dm = await this.dm()
if (!dm) return undefined
return dm.send(content, options)
}

user(options?: CacheManagerGetOptions): Promise<User | undefined> {
return this.client.users.cache.get(this.userId, options)
}

async dm(options?: CacheManagerGetOptions): Promise<DirectMessagesChannel | undefined> {
let channel = await this.client.dms.cache.get(this.userId, options)
if (!channel) {
channel = await this.client.dms.fetch(this.userId)
}
return channel
}

guild(options?: CacheManagerGetOptions): Promise<Guild | undefined> {
return this.client.guilds.cache.get(this.guildId, options)
}
Expand Down
7 changes: 4 additions & 3 deletions src/api/entities/message/Message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,10 @@ export class Message extends AbstractEntity {
}

async channel(options?: CacheManagerGetOptions): Promise<AnyWritableChannel | undefined> {
return this.client.internals.cache.get(
Keyspaces.CHANNELS, this.guildId ?? this.authorId, 'channelEntityKey', this.channelId, options
)
return this.client.channels.cache.get(this.channelId, {
...options,
storage: this.guildId ?? 'dm'
})
}

async member(options?: CacheManagerGetOptions): Promise<GuildMember | undefined> {
Expand Down
18 changes: 16 additions & 2 deletions src/api/entities/user/User.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import { RawUserData } from '@src/api/entities/user/interfaces/RawUserData'
import { Json } from '@src/api/entities/interfaces/Json'
import { ToJsonProperties } from '@src/api/entities/interfaces/ToJsonProperties'
import { UserFlagsUtil } from '@src/api/entities/bitfield'
import { GuildResolvable, Presence } from '@src/api'
import { DirectMessagesChannel, GuildResolvable, Message, MessageContent, MessageCreateOptions, Presence } from '@src/api'
import { CacheManagerFilterOptions, CacheManagerGetOptions } from '@src/cache'
import { EntityInitOptions } from '@src/api/entities/EntityInitOptions'

export class User extends AbstractEntity implements UserData { // TODO: implements WritableChannel
export class User extends AbstractEntity implements UserData {
public accentColor?: number
public avatar?: string
public banner?: string
Expand Down Expand Up @@ -57,6 +57,20 @@ export class User extends AbstractEntity implements UserData { // TODO: implemen
return this
}

async send(content: MessageContent, options?: MessageCreateOptions): Promise<Message | undefined> {
const dm = await this.dm()
if (!dm) return undefined
return dm.send(content, options)
}

async dm(options?: CacheManagerGetOptions): Promise<DirectMessagesChannel | undefined> {
let channel = await this.client.dms.cache.get(this.id, options)
if (!channel) {
channel = await this.client.dms.fetch(this.id)
}
return channel
}

async presence(guild: GuildResolvable, options?: CacheManagerGetOptions): Promise<Presence | undefined> {
const guildId = resolveGuildId(guild)
if (!guildId) throw new DiscordooError('User#presence', 'Cannot get presence without guild id.')
Expand Down
23 changes: 22 additions & 1 deletion src/api/managers/UsersManager.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { EntitiesCacheManager } from '@src/api/managers'
import { Client } from '@src/core'
import { User } from '@src/api/entities/user'
import { User, UserResolvable } from '@src/api/entities/user'
import { Keyspaces } from '@src/constants'
import { EntitiesManager } from '@src/api/managers/EntitiesManager'
import { DiscordooError, resolveUserId } from '@src/utils'
import { DirectMessagesChannel, EntitiesUtil } from '@src/api'

export class UsersManager extends EntitiesManager {
public cache: EntitiesCacheManager<User>
Expand All @@ -17,4 +19,23 @@ export class UsersManager extends EntitiesManager {
policy: 'users'
})
}

async fetch(user: UserResolvable): Promise<User | undefined> {
const userId = resolveUserId(user)

if (!userId) throw new DiscordooError('UsersManager#fetch', 'Cannot fetch user without user id.')

const response = await this.client.internals.actions.getUser(userId)
const User = EntitiesUtil.get('User')

if (response.success) {
const cached = await this.cache.get(userId)
const user = cached ? await cached.init(response.result) : await new User(this.client).init(response.result)
await this.cache.set(user.id, user)
return user
}

return undefined
}

}
6 changes: 3 additions & 3 deletions src/api/managers/channels/ClientChannelsManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import {
resolveMessageId,
resolvePermissionOverwriteToRaw
} from '@src/utils'
import { GuildChannelDeleteOptions } from '@src/api/entities/channel/interfaces/GuildChannelDeleteOptions'
import { ChannelDeleteOptions } from '@src/api/entities/channel/interfaces/ChannelDeleteOptions'
import { EntitiesManager } from '@src/api/managers/EntitiesManager'
import { Keyspaces } from '@src/constants'
import { ChannelTypes, Keyspaces } from '@src/constants'
import { AnyChannel } from '@src/api/entities/channel/interfaces/AnyChannel'
import { GuildChannelEditData } from '@src/api/entities/channel/interfaces/GuildChannelEditData'
import { RawGuildChannelEditData } from '@src/api/entities/channel/interfaces/RawGuildChannelEditData'
Expand Down Expand Up @@ -191,7 +191,7 @@ export class ClientChannelsManager extends EntitiesManager {
)
}

async delete<R = AnyChannel>(channel: ChannelResolvable, options: GuildChannelDeleteOptions = {}): Promise<R | undefined> {
async delete<R = AnyChannel>(channel: ChannelResolvable, options: ChannelDeleteOptions = {}): Promise<R | undefined> {
const channelId = resolveChannelId(channel)

if (!channelId) {
Expand Down
Loading

0 comments on commit cb618dd

Please sign in to comment.