x
This commit is contained in:
parent
fee3e0cfa0
commit
e8371408e2
10 changed files with 250 additions and 49 deletions
|
@ -38,7 +38,7 @@ export interface ClientOptions {
|
||||||
/** Token of the Bot/User */
|
/** Token of the Bot/User */
|
||||||
token?: string
|
token?: string
|
||||||
/** Gateway Intents */
|
/** Gateway Intents */
|
||||||
intents?: GatewayIntents[]
|
intents?: Array<GatewayIntents | keyof typeof GatewayIntents>
|
||||||
/** Cache Adapter to use, defaults to Collections one */
|
/** Cache Adapter to use, defaults to Collections one */
|
||||||
cache?: ICacheAdapter
|
cache?: ICacheAdapter
|
||||||
/** Force New Session and don't use cached Session (by persistent caching) */
|
/** Force New Session and don't use cached Session (by persistent caching) */
|
||||||
|
@ -77,10 +77,29 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
|
||||||
rest: RESTManager
|
rest: RESTManager
|
||||||
/** User which Client logs in to, undefined until logs in */
|
/** User which Client logs in to, undefined until logs in */
|
||||||
user?: User
|
user?: User
|
||||||
|
|
||||||
|
#token?: string
|
||||||
|
|
||||||
/** Token of the Bot/User */
|
/** Token of the Bot/User */
|
||||||
token?: string
|
get token(): string | undefined {
|
||||||
|
return this.#token
|
||||||
|
}
|
||||||
|
|
||||||
|
set token(val: string | undefined) {
|
||||||
|
this.#token = val
|
||||||
|
}
|
||||||
|
|
||||||
/** Cache Adapter */
|
/** Cache Adapter */
|
||||||
cache: ICacheAdapter = new DefaultCacheAdapter()
|
get cache(): ICacheAdapter {
|
||||||
|
return this.#cache
|
||||||
|
}
|
||||||
|
|
||||||
|
set cache(val: ICacheAdapter) {
|
||||||
|
this.#cache = val
|
||||||
|
}
|
||||||
|
|
||||||
|
#cache: ICacheAdapter = new DefaultCacheAdapter()
|
||||||
|
|
||||||
/** Gateway Intents */
|
/** Gateway Intents */
|
||||||
intents?: GatewayIntents[]
|
intents?: GatewayIntents[]
|
||||||
/** Whether to force new session or not */
|
/** Whether to force new session or not */
|
||||||
|
@ -91,21 +110,23 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
|
||||||
reactionCacheLifetime: number = 3600000
|
reactionCacheLifetime: number = 3600000
|
||||||
/** Whether to fetch Uncached Message of Reaction or not? */
|
/** Whether to fetch Uncached Message of Reaction or not? */
|
||||||
fetchUncachedReactions: boolean = false
|
fetchUncachedReactions: boolean = false
|
||||||
|
|
||||||
/** Client Properties */
|
/** Client Properties */
|
||||||
clientProperties: ClientProperties
|
readonly clientProperties!: ClientProperties
|
||||||
|
|
||||||
/** Slash-Commands Management client */
|
/** Slash-Commands Management client */
|
||||||
slash: SlashClient
|
slash: SlashClient
|
||||||
/** Whether to fetch Gateway info or not */
|
/** Whether to fetch Gateway info or not */
|
||||||
fetchGatewayInfo: boolean = true
|
fetchGatewayInfo: boolean = true
|
||||||
|
|
||||||
/** Users Manager, containing all Users cached */
|
/** Users Manager, containing all Users cached */
|
||||||
users: UsersManager = new UsersManager(this)
|
readonly users: UsersManager = new UsersManager(this)
|
||||||
/** Guilds Manager, providing cache & API interface to Guilds */
|
/** Guilds Manager, providing cache & API interface to Guilds */
|
||||||
guilds: GuildManager = new GuildManager(this)
|
readonly guilds: GuildManager = new GuildManager(this)
|
||||||
/** Channels Manager, providing cache interface to Channels */
|
/** Channels Manager, providing cache interface to Channels */
|
||||||
channels: ChannelsManager = new ChannelsManager(this)
|
readonly channels: ChannelsManager = new ChannelsManager(this)
|
||||||
/** Channels Manager, providing cache interface to Channels */
|
/** Channels Manager, providing cache interface to Channels */
|
||||||
emojis: EmojisManager = new EmojisManager(this)
|
readonly emojis: EmojisManager = new EmojisManager(this)
|
||||||
|
|
||||||
/** Last READY timestamp */
|
/** Last READY timestamp */
|
||||||
upSince?: Date
|
upSince?: Date
|
||||||
|
@ -146,7 +167,9 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
|
||||||
super()
|
super()
|
||||||
this._id = options.id
|
this._id = options.id
|
||||||
this.token = options.token
|
this.token = options.token
|
||||||
this.intents = options.intents
|
this.intents = options.intents?.map((e) =>
|
||||||
|
typeof e === 'string' ? GatewayIntents[e] : e
|
||||||
|
)
|
||||||
this.shards = new ShardManager(this)
|
this.shards = new ShardManager(this)
|
||||||
this.forceNewSession = options.forceNewSession
|
this.forceNewSession = options.forceNewSession
|
||||||
if (options.cache !== undefined) this.cache = options.cache
|
if (options.cache !== undefined) this.cache = options.cache
|
||||||
|
@ -172,14 +195,17 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
|
||||||
;(this as any)._decoratedEvents = undefined
|
;(this as any)._decoratedEvents = undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
this.clientProperties =
|
Object.defineProperty(this, 'clientProperties', {
|
||||||
|
value:
|
||||||
options.clientProperties === undefined
|
options.clientProperties === undefined
|
||||||
? {
|
? {
|
||||||
os: Deno.build.os,
|
os: Deno.build.os,
|
||||||
browser: 'harmony',
|
browser: 'harmony',
|
||||||
device: 'harmony'
|
device: 'harmony'
|
||||||
}
|
}
|
||||||
: options.clientProperties
|
: options.clientProperties,
|
||||||
|
enumerable: false
|
||||||
|
})
|
||||||
|
|
||||||
if (options.shard !== undefined) this.shard = options.shard
|
if (options.shard !== undefined) this.shard = options.shard
|
||||||
if (options.shardCount !== undefined) this.shardCount = options.shardCount
|
if (options.shardCount !== undefined) this.shardCount = options.shardCount
|
||||||
|
|
|
@ -62,7 +62,7 @@ export class Gateway extends HarmonyEventEmitter<GatewayTypedEvents> {
|
||||||
lastPingTimestamp = 0
|
lastPingTimestamp = 0
|
||||||
sessionID?: string
|
sessionID?: string
|
||||||
private heartbeatServerResponded = false
|
private heartbeatServerResponded = false
|
||||||
client: Client
|
client!: Client
|
||||||
cache: GatewayCache
|
cache: GatewayCache
|
||||||
private timedIdentify: number | null = null
|
private timedIdentify: number | null = null
|
||||||
shards?: number[]
|
shards?: number[]
|
||||||
|
@ -70,7 +70,7 @@ export class Gateway extends HarmonyEventEmitter<GatewayTypedEvents> {
|
||||||
|
|
||||||
constructor(client: Client, shards?: number[]) {
|
constructor(client: Client, shards?: number[]) {
|
||||||
super()
|
super()
|
||||||
this.client = client
|
Object.defineProperty(this, 'client', { value: client, enumerable: false })
|
||||||
this.cache = new GatewayCache(client)
|
this.cache = new GatewayCache(client)
|
||||||
this.shards = shards
|
this.shards = shards
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,11 +47,21 @@ export type SlashClientEvents = {
|
||||||
export class SlashClient extends HarmonyEventEmitter<SlashClientEvents> {
|
export class SlashClient extends HarmonyEventEmitter<SlashClientEvents> {
|
||||||
id: string | (() => string)
|
id: string | (() => string)
|
||||||
client?: Client
|
client?: Client
|
||||||
token?: string
|
|
||||||
|
#token?: string
|
||||||
|
|
||||||
|
get token(): string | undefined {
|
||||||
|
return this.#token
|
||||||
|
}
|
||||||
|
|
||||||
|
set token(val: string | undefined) {
|
||||||
|
this.#token = val
|
||||||
|
}
|
||||||
|
|
||||||
enabled: boolean = true
|
enabled: boolean = true
|
||||||
commands: SlashCommandsManager
|
commands: SlashCommandsManager
|
||||||
handlers: SlashCommandHandler[] = []
|
handlers: SlashCommandHandler[] = []
|
||||||
rest: RESTManager
|
readonly rest!: RESTManager
|
||||||
modules: SlashModule[] = []
|
modules: SlashModule[] = []
|
||||||
publicKey?: string
|
publicKey?: string
|
||||||
|
|
||||||
|
@ -62,7 +72,14 @@ export class SlashClient extends HarmonyEventEmitter<SlashClientEvents> {
|
||||||
if (id === undefined)
|
if (id === undefined)
|
||||||
throw new Error('ID could not be found. Pass at least client or token')
|
throw new Error('ID could not be found. Pass at least client or token')
|
||||||
this.id = id
|
this.id = id
|
||||||
this.client = options.client
|
|
||||||
|
if (options.client !== undefined) {
|
||||||
|
Object.defineProperty(this, 'client', {
|
||||||
|
value: options.client,
|
||||||
|
enumerable: false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
this.token = options.token
|
this.token = options.token
|
||||||
this.publicKey = options.publicKey
|
this.publicKey = options.publicKey
|
||||||
|
|
||||||
|
@ -85,14 +102,17 @@ export class SlashClient extends HarmonyEventEmitter<SlashClientEvents> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
this.rest =
|
Object.defineProperty(this, 'rest', {
|
||||||
|
value:
|
||||||
options.client === undefined
|
options.client === undefined
|
||||||
? options.rest === undefined
|
? options.rest === undefined
|
||||||
? new RESTManager({
|
? new RESTManager({
|
||||||
token: this.token
|
token: this.token
|
||||||
})
|
})
|
||||||
: options.rest
|
: options.rest
|
||||||
: options.client.rest
|
: options.client.rest,
|
||||||
|
enumerable: false
|
||||||
|
})
|
||||||
|
|
||||||
this.client?.on(
|
this.client?.on(
|
||||||
'interactionCreate',
|
'interactionCreate',
|
||||||
|
|
|
@ -198,12 +198,15 @@ export class SlashBuilder {
|
||||||
|
|
||||||
/** Manages Slash Commands, allows fetching/modifying/deleting/creating Slash Commands. */
|
/** Manages Slash Commands, allows fetching/modifying/deleting/creating Slash Commands. */
|
||||||
export class SlashCommandsManager {
|
export class SlashCommandsManager {
|
||||||
slash: SlashClient
|
readonly slash!: SlashClient
|
||||||
rest: RESTManager
|
readonly rest!: RESTManager
|
||||||
|
|
||||||
constructor(client: SlashClient) {
|
constructor(client: SlashClient) {
|
||||||
this.slash = client
|
Object.defineProperty(this, 'slash', { value: client, enumerable: false })
|
||||||
this.rest = client.rest
|
Object.defineProperty(this, 'rest', {
|
||||||
|
enumerable: false,
|
||||||
|
value: client.rest
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get all Global Slash Commands */
|
/** Get all Global Slash Commands */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import type { Client } from '../client/mod.ts'
|
import type { Client } from '../client/mod.ts'
|
||||||
|
import { Base } from '../structures/base.ts'
|
||||||
import { Collection } from '../utils/collection.ts'
|
import { Collection } from '../utils/collection.ts'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -6,15 +7,14 @@ import { Collection } from '../utils/collection.ts'
|
||||||
*
|
*
|
||||||
* You should not be making Managers yourself.
|
* You should not be making Managers yourself.
|
||||||
*/
|
*/
|
||||||
export class BaseManager<T, T2> {
|
export class BaseManager<T, T2> extends Base {
|
||||||
client: Client
|
|
||||||
/** Caches Name or Key used to differentiate caches */
|
/** Caches Name or Key used to differentiate caches */
|
||||||
cacheName: string
|
cacheName: string
|
||||||
/** Which data type does this cache have */
|
/** Which data type does this cache have */
|
||||||
DataType: any
|
DataType: any
|
||||||
|
|
||||||
constructor(client: Client, cacheName: string, DataType: any) {
|
constructor(client: Client, cacheName: string, DataType: any) {
|
||||||
this.client = client
|
super(client)
|
||||||
this.cacheName = cacheName
|
this.cacheName = cacheName
|
||||||
this.DataType = DataType
|
this.DataType = DataType
|
||||||
}
|
}
|
||||||
|
@ -87,4 +87,8 @@ export class BaseManager<T, T2> {
|
||||||
flush(): any {
|
flush(): any {
|
||||||
return this.client.cache.deleteCache(this.cacheName)
|
return this.client.cache.deleteCache(this.cacheName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Deno.customInspect](): string {
|
||||||
|
return `Manager(${this.cacheName})`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
import type { Client } from '../client/mod.ts'
|
import type { Client } from '../client/mod.ts'
|
||||||
|
import { Base } from '../structures/base.ts'
|
||||||
import { Collection } from '../utils/collection.ts'
|
import { Collection } from '../utils/collection.ts'
|
||||||
import { BaseManager } from './base.ts'
|
import { BaseManager } from './base.ts'
|
||||||
|
|
||||||
/** Child Managers validate data from their parents i.e. from Managers */
|
/** Child Managers validate data from their parents i.e. from Managers */
|
||||||
export class BaseChildManager<T, T2> {
|
export class BaseChildManager<T, T2> extends Base {
|
||||||
client: Client
|
|
||||||
/** Parent Manager */
|
/** Parent Manager */
|
||||||
parent: BaseManager<T, T2>
|
parent: BaseManager<T, T2>
|
||||||
|
|
||||||
constructor(client: Client, parent: BaseManager<T, T2>) {
|
constructor(client: Client, parent: BaseManager<T, T2>) {
|
||||||
this.client = client
|
super(client)
|
||||||
this.parent = parent
|
this.parent = parent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,4 +62,8 @@ export class BaseChildManager<T, T2> {
|
||||||
if (fetchValue !== undefined) return fetchValue
|
if (fetchValue !== undefined) return fetchValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Deno.customInspect](): string {
|
||||||
|
return `ChildManager(${this.parent.cacheName})`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,8 +103,18 @@ export class RESTManager {
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
api: APIMap
|
api: APIMap
|
||||||
|
|
||||||
|
#token?: string | (() => string | undefined)
|
||||||
|
|
||||||
/** Token being used for Authorization */
|
/** Token being used for Authorization */
|
||||||
token?: string | (() => string | undefined)
|
get token(): string | (() => string | undefined) | undefined {
|
||||||
|
return this.#token
|
||||||
|
}
|
||||||
|
|
||||||
|
set token(val: string | (() => string | undefined) | undefined) {
|
||||||
|
this.#token = val
|
||||||
|
}
|
||||||
|
|
||||||
/** Token Type of the Token if any */
|
/** Token Type of the Token if any */
|
||||||
tokenType: TokenType = TokenType.Bot
|
tokenType: TokenType = TokenType.Bot
|
||||||
/** Headers object which patch the current ones */
|
/** Headers object which patch the current ones */
|
||||||
|
@ -114,13 +124,13 @@ export class RESTManager {
|
||||||
/** Whether REST Manager is using Canary API */
|
/** Whether REST Manager is using Canary API */
|
||||||
canary?: boolean
|
canary?: boolean
|
||||||
/** Optional Harmony Client object */
|
/** Optional Harmony Client object */
|
||||||
client?: Client
|
readonly client?: Client
|
||||||
endpoints: RESTEndpoints
|
endpoints: RESTEndpoints
|
||||||
requestTimeout = 30000
|
requestTimeout = 30000
|
||||||
timers: Set<number> = new Set()
|
readonly timers!: Set<number>
|
||||||
apiURL = Constants.DISCORD_API_URL
|
apiURL = Constants.DISCORD_API_URL
|
||||||
|
|
||||||
handlers = new Collection<string, BucketHandler>()
|
readonly handlers!: Collection<string, BucketHandler>
|
||||||
globalLimit = Infinity
|
globalLimit = Infinity
|
||||||
globalRemaining = this.globalLimit
|
globalRemaining = this.globalLimit
|
||||||
globalReset: number | null = null
|
globalReset: number | null = null
|
||||||
|
@ -136,11 +146,28 @@ export class RESTManager {
|
||||||
if (options?.tokenType !== undefined) this.tokenType = options.tokenType
|
if (options?.tokenType !== undefined) this.tokenType = options.tokenType
|
||||||
if (options?.userAgent !== undefined) this.userAgent = options.userAgent
|
if (options?.userAgent !== undefined) this.userAgent = options.userAgent
|
||||||
if (options?.canary !== undefined) this.canary = options.canary
|
if (options?.canary !== undefined) this.canary = options.canary
|
||||||
if (options?.client !== undefined) this.client = options.client
|
|
||||||
if (options?.retryLimit !== undefined) this.retryLimit = options.retryLimit
|
if (options?.retryLimit !== undefined) this.retryLimit = options.retryLimit
|
||||||
if (options?.requestTimeout !== undefined)
|
if (options?.requestTimeout !== undefined)
|
||||||
this.requestTimeout = options.requestTimeout
|
this.requestTimeout = options.requestTimeout
|
||||||
|
|
||||||
|
if (options?.client !== undefined) {
|
||||||
|
Object.defineProperty(this, 'client', {
|
||||||
|
value: options.client,
|
||||||
|
enumerable: false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
this.endpoints = new RESTEndpoints(this)
|
this.endpoints = new RESTEndpoints(this)
|
||||||
|
|
||||||
|
Object.defineProperty(this, 'timers', {
|
||||||
|
value: new Set(),
|
||||||
|
enumerable: false
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.defineProperty(this, 'handlers', {
|
||||||
|
value: new Collection<string, BucketHandler>(),
|
||||||
|
enumerable: false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(fn: (...args: any[]) => any, ms: number): number {
|
setTimeout(fn: (...args: any[]) => any, ms: number): number {
|
||||||
|
|
30
test/eval.ts
Normal file
30
test/eval.ts
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/* eslint-disable no-eval */
|
||||||
|
import * as discord from '../mod.ts'
|
||||||
|
import { TOKEN } from './config.ts'
|
||||||
|
|
||||||
|
const client = new discord.Client({
|
||||||
|
token: TOKEN,
|
||||||
|
intents: ['GUILD_MESSAGES', 'GUILDS']
|
||||||
|
})
|
||||||
|
|
||||||
|
client.on('messageCreate', async (msg) => {
|
||||||
|
if (msg.author.id !== '422957901716652033') return
|
||||||
|
|
||||||
|
if (msg.content.startsWith('.eval') === true) {
|
||||||
|
let code = msg.content.slice(5).trim()
|
||||||
|
if (code.startsWith('```') === true) code = code.slice(3).trim()
|
||||||
|
if (code.endsWith('```') === true) code = code.substr(0, code.length - 3)
|
||||||
|
try {
|
||||||
|
const result = await eval(code)
|
||||||
|
msg.reply(
|
||||||
|
`\`\`\`js\n${Deno.inspect(result).substr(0, 2000 - 20)}\n\`\`\``
|
||||||
|
)
|
||||||
|
} catch (e) {
|
||||||
|
msg.reply(`\`\`\`js\n${e}\n\`\`\``, {
|
||||||
|
allowedMentions: { replied_user: false }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
client.connect().then(() => console.log('Ready!'))
|
|
@ -8,12 +8,12 @@ import {
|
||||||
CommandContext,
|
CommandContext,
|
||||||
Extension,
|
Extension,
|
||||||
Collection,
|
Collection,
|
||||||
GuildTextChannel
|
GuildTextChannel,
|
||||||
} from '../../mod.ts'
|
Interaction,
|
||||||
|
slash
|
||||||
|
} from '../mod.ts'
|
||||||
import { LL_IP, LL_PASS, LL_PORT, TOKEN } from './config.ts'
|
import { LL_IP, LL_PASS, LL_PORT, TOKEN } from './config.ts'
|
||||||
import { Manager, Player } from 'https://deno.land/x/lavadeno/mod.ts'
|
import { Manager, Player } from 'https://deno.land/x/lavadeno/mod.ts'
|
||||||
import { Interaction } from '../structures/slash.ts'
|
|
||||||
import { slash } from '../client/mod.ts'
|
|
||||||
// import { SlashCommandOptionType } from '../types/slash.ts'
|
// import { SlashCommandOptionType } from '../types/slash.ts'
|
||||||
|
|
||||||
export const nodes = [
|
export const nodes = [
|
||||||
|
|
87
test/trigger.ts
Normal file
87
test/trigger.ts
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/* eslint-disable @typescript-eslint/strict-boolean-expressions */
|
||||||
|
/* eslint-disable no-control-regex */
|
||||||
|
import { Client, Embed } from '../mod.ts'
|
||||||
|
import { TOKEN } from './config.ts'
|
||||||
|
|
||||||
|
const client = new Client({
|
||||||
|
token: TOKEN,
|
||||||
|
intents: ['GUILDS', 'GUILD_MESSAGES']
|
||||||
|
})
|
||||||
|
|
||||||
|
const NAME_MATCH = /[^a-zA-Z0-9_]/
|
||||||
|
const STD_REGEX = /\/?std(@[\x00-\x2e\x30-\xff]+)?\/([a-zA-Z0-9]+)(\/[\S\s]+)?/
|
||||||
|
const X_REGEX = /\/?x\/([a-zA-Z0-9]+)(@[\x00-\x2e\x30-\xff]+)?(\/[\S\s]+)?/
|
||||||
|
|
||||||
|
export async function fetchModule(name: string): Promise<any> {
|
||||||
|
if (name.match(NAME_MATCH) !== null) return null
|
||||||
|
return fetch(`https://api.deno.land/modules/${name}`, {
|
||||||
|
credentials: 'omit',
|
||||||
|
headers: {
|
||||||
|
'User-Agent':
|
||||||
|
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0',
|
||||||
|
Accept: 'application/json',
|
||||||
|
'Accept-Language': 'en-US,en;q=0.5',
|
||||||
|
Pragma: 'no-cache',
|
||||||
|
'Cache-Control': 'no-cache'
|
||||||
|
},
|
||||||
|
referrer: 'https://deno.land/x',
|
||||||
|
mode: 'cors'
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
if (res.status !== 200) throw new Error('not found')
|
||||||
|
return res
|
||||||
|
})
|
||||||
|
.then((r) => r.json())
|
||||||
|
.then((json) => {
|
||||||
|
if (!json.success) throw new Error('failed')
|
||||||
|
return json
|
||||||
|
})
|
||||||
|
.then((data) => data.data)
|
||||||
|
.catch(() => null)
|
||||||
|
}
|
||||||
|
|
||||||
|
client.on('messageCreate', async (msg) => {
|
||||||
|
if (msg.author.bot === true) return
|
||||||
|
|
||||||
|
let match
|
||||||
|
if (
|
||||||
|
(match = msg.content.match(STD_REGEX)) ||
|
||||||
|
(match = msg.content.match(X_REGEX))
|
||||||
|
) {
|
||||||
|
let x = match[0].trim()
|
||||||
|
|
||||||
|
if (!x.startsWith('/')) x = `/${x}`
|
||||||
|
|
||||||
|
let type
|
||||||
|
if (x.startsWith('/std')) {
|
||||||
|
x = x.slice(4)
|
||||||
|
type = 'std'
|
||||||
|
} else {
|
||||||
|
x = x.slice(3)
|
||||||
|
type = 'x'
|
||||||
|
}
|
||||||
|
|
||||||
|
x = x.trim()
|
||||||
|
const name = x.split('/')[0].split('@')[0]
|
||||||
|
const mod = await fetchModule(type === 'std' ? 'std' : name)
|
||||||
|
if (mod === null) return
|
||||||
|
|
||||||
|
msg.channel.send(
|
||||||
|
new Embed()
|
||||||
|
.setColor('#7289DA')
|
||||||
|
.setURL(
|
||||||
|
`https://deno.land/${type}${
|
||||||
|
x.startsWith('/') || x.startsWith('@') ? '' : '/'
|
||||||
|
}${x}`
|
||||||
|
)
|
||||||
|
.setTitle(
|
||||||
|
`${type}${x.startsWith('/') || x.startsWith('@') ? '' : '/'}${x}`
|
||||||
|
)
|
||||||
|
.setDescription(mod.description ?? 'No description.')
|
||||||
|
.setFooter(`${mod.star_count ?? 0}`, 'https://kokoro.pw/colleague.png')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('Connecting...')
|
||||||
|
client.connect().then(() => console.log('Ready!'))
|
Loading…
Reference in a new issue