2021-04-28 13:09:39 +00:00
|
|
|
import { MessageMentions } from "../structures/messageMentions.ts";
|
2021-04-28 10:43:16 +00:00
|
|
|
export type CommandArgumentMatchTypes = 'flag' | 'mention' | 'content' | 'rest'
|
2021-04-27 21:04:27 +00:00
|
|
|
|
|
|
|
export interface Args {
|
|
|
|
name: string
|
2021-04-28 10:43:16 +00:00
|
|
|
match: CommandArgumentMatchTypes
|
2021-04-28 13:09:39 +00:00
|
|
|
// Still needs to be implemented
|
|
|
|
// type?: unknown
|
|
|
|
defaultValue?: string;
|
2021-04-27 21:04:27 +00:00
|
|
|
flag?: string
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-04-28 09:52:05 +00:00
|
|
|
export function parseArgs(
|
|
|
|
commandArgs: Args[] | undefined,
|
2021-04-27 21:04:27 +00:00
|
|
|
messageArgs: string[]
|
2021-04-28 09:52:05 +00:00
|
|
|
): Record<string, unknown> | null {
|
2021-04-28 11:50:13 +00:00
|
|
|
if (commandArgs === undefined) return null
|
2021-04-27 21:04:27 +00:00
|
|
|
const messageArgsNullableCopy: Array<string | null> = [...messageArgs]
|
|
|
|
const args: Record<string, unknown> = {}
|
|
|
|
for (const entry of commandArgs) {
|
|
|
|
switch (entry.match) {
|
2021-04-28 11:50:13 +00:00
|
|
|
case 'flag':
|
2021-04-27 21:04:27 +00:00
|
|
|
parseFlags(args, entry, messageArgsNullableCopy)
|
|
|
|
break
|
2021-04-28 10:43:16 +00:00
|
|
|
case 'mention':
|
2021-04-27 21:04:27 +00:00
|
|
|
parseMention(args, entry, messageArgsNullableCopy)
|
|
|
|
break
|
2021-04-28 10:43:16 +00:00
|
|
|
case 'content':
|
2021-04-27 21:04:27 +00:00
|
|
|
parseContent(args, entry, messageArgs)
|
|
|
|
break
|
2021-04-28 10:43:16 +00:00
|
|
|
case 'rest':
|
2021-04-27 21:04:27 +00:00
|
|
|
parseRest(args, entry, messageArgsNullableCopy)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return args
|
|
|
|
}
|
|
|
|
|
|
|
|
function parseFlags(
|
|
|
|
args: Record<string, unknown>,
|
|
|
|
entry: Args,
|
|
|
|
argsNullable: Array<string | null>
|
|
|
|
): void {
|
|
|
|
for (let i = 0; i < argsNullable.length; i++) {
|
|
|
|
if (entry.flag === argsNullable[i]) {
|
|
|
|
argsNullable[i] = null
|
|
|
|
args[entry.name] = true
|
|
|
|
break
|
|
|
|
} else args[entry.name] = entry.defaultValue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function parseMention(
|
|
|
|
args: Record<string, unknown>,
|
|
|
|
entry: Args,
|
|
|
|
argsNullable: Array<string | null>
|
|
|
|
): void {
|
|
|
|
const index = argsNullable.findIndex((x) => typeof x === 'string')
|
2021-04-28 13:09:39 +00:00
|
|
|
const mention = MessageMentions.USER_MENTION.exec(argsNullable[index]!)![0]
|
2021-04-27 21:04:27 +00:00
|
|
|
argsNullable[index] = null
|
|
|
|
args[entry.name] = mention
|
|
|
|
}
|
|
|
|
|
|
|
|
function parseContent(
|
|
|
|
args: Record<string, unknown>,
|
|
|
|
entry: Args,
|
|
|
|
argsNonNullable: Array<string | null>
|
|
|
|
): void {
|
|
|
|
args[entry.name] =
|
|
|
|
argsNonNullable.length !== 0 ? argsNonNullable : entry.defaultValue
|
|
|
|
}
|
|
|
|
|
|
|
|
function parseRest(
|
|
|
|
args: Record<string, unknown>,
|
|
|
|
entry: Args,
|
|
|
|
argsNullable: Array<string | null>
|
|
|
|
): void {
|
|
|
|
args[entry.name] = argsNullable.filter((x) => typeof x === 'string')
|
|
|
|
}
|