Spikers
Spikers
Explore posts from servers
SIASapphire - Imagine a framework
Created by Spikers on 10/26/2023 in #sapphire-support
Upgrading from djs v12 (commando) to djs v14 (and sapphire framework) - Unsure on how to Parse Types
My solution:
const valueType = (serializer.type as any)
try {
args.restore()
value = await args.rest(valueType)
} catch (e) {
value = null
}
const valueType = (serializer.type as any)
try {
args.restore()
value = await args.rest(valueType)
} catch (e) {
value = null
}
And I did end up having to create three custom arguments (I was referencing the guidelines prior to opening this, and couldn't figure out how to create one or at least export it, but I then realized it was some caching issue which was resolved with me deleting all my compiled files and recompiling). Thank you again!
10 replies
SIASapphire - Imagine a framework
Created by Spikers on 10/26/2023 in #sapphire-support
Upgrading from djs v12 (commando) to djs v14 (and sapphire framework) - Unsure on how to Parse Types
Thank you for your input and guidance, I now have it working!!
10 replies
SIASapphire - Imagine a framework
Created by Spikers on 10/26/2023 in #sapphire-support
Upgrading from djs v12 (commando) to djs v14 (and sapphire framework) - Unsure on how to Parse Types
I don't know how I only thought of this now (I've been trying to figure it out for the past two days), but would it be possible to have a switch case, manually going through all of the configurable options / keys, and depending on what it needs have it set const argsValue = args.next(); to argsValue = args.pick('type');? (ex: if argsKey = councilorRole it would argsValue = args.pick('role');)
10 replies
SIASapphire - Imagine a framework
Created by Spikers on 10/26/2023 in #sapphire-support
Upgrading from djs v12 (commando) to djs v14 (and sapphire framework) - Unsure on how to Parse Types
My Sapphire.js styled ConfigCommand:
import { Message } from "discord.js"
import { Args, PieceContext } from "@sapphire/framework"
import { ConfigurableCouncilData, ConfigurableCouncilDataSerializers, OptionalCouncilData } from "../../CouncilData"
import { getDefaultValue, getProps, parseType, response, ResponseType } from "../../Util"
import ICommand from "../ICommand"

const makeDisplay = (displayer?: (value: any) => string) => (value: any) => {
if (value === undefined || value === null) {
return "None"
} else if (displayer) {
return displayer(value)
} else {
return value.toString()
}
}

export default class ConfigCommand extends ICommand {
constructor(client: PieceContext) {
super(client, {
name: "config",
aliases: ["votumconfig", "cfg", "vconfig", "vcfg", "councilconfig"],
description: "Designates a specific role for councilors.",
adminOnly: true,
})
}

async execute(msg: Message, args: Args): Promise<Message | Message[]> {
const argsKey = args.next();
const argsValue = args.next();
if (argsKey == null || argsKey.length === 0) {
return msg.reply({
embeds: [response(
ResponseType.Neutral,
`Available configuration points are:\n${Object.keys(
getProps(ConfigurableCouncilData),
)
.map((n) => `~${n}~`)
.join(",\n ")}.`,
).embed],
})
}

const key = argsKey.replace(/\.([a-z0-9])/g, (_, l) =>
l.toUpperCase(),
) as keyof ConfigurableCouncilData

if (!(key in getProps(ConfigurableCouncilData))) {
return msg.reply({
embeds: [response(
ResponseType.Bad,
`:x: \`${key}\` is not a valid configuration point.`,
).embed],
})
}

const serializer = ConfigurableCouncilDataSerializers[key]
const display = makeDisplay(serializer.display)

if (argsValue == null || argsValue.length === 0) {
return msg.reply({
embeds: [response(
ResponseType.Neutral,
`Configuration point ${argsKey} is currently set to ~${display(
this.council.getConfig(key),
)}~.`,
).embed],
})
}

if (argsValue === "$remove" && key in getProps(OptionalCouncilData)) {
this.council.setConfig(key, getDefaultValue(key, OptionalCouncilData))
return msg.reply({
embeds: [response(
ResponseType.Neutral,
`Set configuration point ~${key}~ back to default state.`,
).embed],
})
}

// Line & function in question
const value = await parseType(this.client, msg, argsValue, serializer)
console.log(value)

if (value !== null) {
const serializedValue = serializer.serialize(value)

this.council.setConfig(key, serializedValue)

return msg.reply({
embeds: [response(
ResponseType.Good,
`Set configuration point ~${key}~ to ${display(value)}`,
).embed],
})
} else {
return msg.reply({
embeds: [response(
ResponseType.Bad,
`~${argsValue}~ is not a valid **${serializer.type}**`,
).embed],
})
}
}
}
import { Message } from "discord.js"
import { Args, PieceContext } from "@sapphire/framework"
import { ConfigurableCouncilData, ConfigurableCouncilDataSerializers, OptionalCouncilData } from "../../CouncilData"
import { getDefaultValue, getProps, parseType, response, ResponseType } from "../../Util"
import ICommand from "../ICommand"

const makeDisplay = (displayer?: (value: any) => string) => (value: any) => {
if (value === undefined || value === null) {
return "None"
} else if (displayer) {
return displayer(value)
} else {
return value.toString()
}
}

export default class ConfigCommand extends ICommand {
constructor(client: PieceContext) {
super(client, {
name: "config",
aliases: ["votumconfig", "cfg", "vconfig", "vcfg", "councilconfig"],
description: "Designates a specific role for councilors.",
adminOnly: true,
})
}

async execute(msg: Message, args: Args): Promise<Message | Message[]> {
const argsKey = args.next();
const argsValue = args.next();
if (argsKey == null || argsKey.length === 0) {
return msg.reply({
embeds: [response(
ResponseType.Neutral,
`Available configuration points are:\n${Object.keys(
getProps(ConfigurableCouncilData),
)
.map((n) => `~${n}~`)
.join(",\n ")}.`,
).embed],
})
}

const key = argsKey.replace(/\.([a-z0-9])/g, (_, l) =>
l.toUpperCase(),
) as keyof ConfigurableCouncilData

if (!(key in getProps(ConfigurableCouncilData))) {
return msg.reply({
embeds: [response(
ResponseType.Bad,
`:x: \`${key}\` is not a valid configuration point.`,
).embed],
})
}

const serializer = ConfigurableCouncilDataSerializers[key]
const display = makeDisplay(serializer.display)

if (argsValue == null || argsValue.length === 0) {
return msg.reply({
embeds: [response(
ResponseType.Neutral,
`Configuration point ${argsKey} is currently set to ~${display(
this.council.getConfig(key),
)}~.`,
).embed],
})
}

if (argsValue === "$remove" && key in getProps(OptionalCouncilData)) {
this.council.setConfig(key, getDefaultValue(key, OptionalCouncilData))
return msg.reply({
embeds: [response(
ResponseType.Neutral,
`Set configuration point ~${key}~ back to default state.`,
).embed],
})
}

// Line & function in question
const value = await parseType(this.client, msg, argsValue, serializer)
console.log(value)

if (value !== null) {
const serializedValue = serializer.serialize(value)

this.council.setConfig(key, serializedValue)

return msg.reply({
embeds: [response(
ResponseType.Good,
`Set configuration point ~${key}~ to ${display(value)}`,
).embed],
})
} else {
return msg.reply({
embeds: [response(
ResponseType.Bad,
`~${argsValue}~ is not a valid **${serializer.type}**`,
).embed],
})
}
}
}
10 replies