workspace
This commit is contained in:
38
packages/reacord/playground/command-handler.ts
Normal file
38
packages/reacord/playground/command-handler.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import type { Client, CommandInteraction } from "discord.js"
|
||||
|
||||
type Command = {
|
||||
name: string
|
||||
description: string
|
||||
run: (interaction: CommandInteraction) => unknown
|
||||
}
|
||||
|
||||
export function createCommandHandler(client: Client, commands: Command[]) {
|
||||
client.on("ready", async () => {
|
||||
for (const command of commands) {
|
||||
for (const guild of client.guilds.cache.values()) {
|
||||
await client.application?.commands.create(
|
||||
{
|
||||
name: command.name,
|
||||
description: command.description,
|
||||
},
|
||||
guild.id,
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
client.on("interactionCreate", async (interaction) => {
|
||||
if (!interaction.isCommand()) return
|
||||
|
||||
const command = commands.find(
|
||||
(command) => command.name === interaction.commandName,
|
||||
)
|
||||
if (command) {
|
||||
try {
|
||||
await command.run(interaction)
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
35
packages/reacord/playground/counter.tsx
Normal file
35
packages/reacord/playground/counter.tsx
Normal file
@@ -0,0 +1,35 @@
|
||||
import * as React from "react"
|
||||
import { Button, Embed, EmbedField, EmbedTitle } from "../library/main"
|
||||
|
||||
export function Counter(props: { onDeactivate: () => void }) {
|
||||
const [count, setCount] = React.useState(0)
|
||||
const [embedVisible, setEmbedVisible] = React.useState(false)
|
||||
|
||||
return (
|
||||
<>
|
||||
this button was clicked {count} times
|
||||
{embedVisible && (
|
||||
<Embed>
|
||||
<EmbedTitle>the counter</EmbedTitle>
|
||||
{count > 0 && (
|
||||
<EmbedField name="is it even?">
|
||||
{count % 2 === 0 ? "yes" : "no"}
|
||||
</EmbedField>
|
||||
)}
|
||||
</Embed>
|
||||
)}
|
||||
{embedVisible && (
|
||||
<Button label="hide embed" onClick={() => setEmbedVisible(false)} />
|
||||
)}
|
||||
<Button
|
||||
style="primary"
|
||||
label="clicc"
|
||||
onClick={() => setCount(count + 1)}
|
||||
/>
|
||||
{!embedVisible && (
|
||||
<Button label="show embed" onClick={() => setEmbedVisible(true)} />
|
||||
)}
|
||||
<Button style="danger" label="deactivate" onClick={props.onDeactivate} />
|
||||
</>
|
||||
)
|
||||
}
|
||||
31
packages/reacord/playground/fruit-select.tsx
Normal file
31
packages/reacord/playground/fruit-select.tsx
Normal file
@@ -0,0 +1,31 @@
|
||||
import React, { useState } from "react"
|
||||
import { Button, Option, Select } from "../library/main"
|
||||
|
||||
export function FruitSelect() {
|
||||
const [value, setValue] = useState<string>()
|
||||
const [finalChoice, setFinalChoice] = useState<string>()
|
||||
|
||||
if (finalChoice) {
|
||||
return <>you chose {finalChoice}</>
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{"_ _"}
|
||||
<Select
|
||||
placeholder="choose a fruit"
|
||||
value={value}
|
||||
onChangeValue={setValue}
|
||||
>
|
||||
<Option value="🍎" />
|
||||
<Option value="🍌" />
|
||||
<Option value="🍒" />
|
||||
</Select>
|
||||
<Button
|
||||
label="confirm"
|
||||
disabled={value == undefined}
|
||||
onClick={() => setFinalChoice(value)}
|
||||
/>
|
||||
</>
|
||||
)
|
||||
}
|
||||
90
packages/reacord/playground/main.tsx
Normal file
90
packages/reacord/playground/main.tsx
Normal file
@@ -0,0 +1,90 @@
|
||||
import { Client } from "discord.js"
|
||||
import "dotenv/config"
|
||||
import React from "react"
|
||||
import { Button, ReacordDiscordJs } from "../library/main"
|
||||
import { createCommandHandler } from "./command-handler"
|
||||
import { Counter } from "./counter"
|
||||
import { FruitSelect } from "./fruit-select"
|
||||
|
||||
const client = new Client({
|
||||
intents: ["GUILDS"],
|
||||
})
|
||||
|
||||
const reacord = new ReacordDiscordJs(client)
|
||||
|
||||
client.on("ready", () => {
|
||||
console.info("ready 💖")
|
||||
|
||||
// const now = new Date()
|
||||
|
||||
// function UptimeCounter() {
|
||||
// const [uptime, setUptime] = React.useState(0)
|
||||
|
||||
// React.useEffect(() => {
|
||||
// const interval = setInterval(() => {
|
||||
// setUptime(Date.now() - now.getTime())
|
||||
// }, 5000)
|
||||
// return () => clearInterval(interval)
|
||||
// }, [])
|
||||
|
||||
// return (
|
||||
// <Embed>this bot has been running for {prettyMilliseconds(uptime)}</Embed>
|
||||
// )
|
||||
// }
|
||||
|
||||
// reacord.send("671787605624487941", <UptimeCounter />)
|
||||
})
|
||||
|
||||
createCommandHandler(client, [
|
||||
{
|
||||
name: "button",
|
||||
description: "it's a button",
|
||||
run: (interaction) => {
|
||||
reacord.reply(
|
||||
interaction,
|
||||
<Button label="clic" onClick={() => console.info("was clic")} />,
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "counter",
|
||||
description: "shows a counter button",
|
||||
run: (interaction) => {
|
||||
const reply = reacord.reply(interaction)
|
||||
reply.render(<Counter onDeactivate={() => reply.destroy()} />)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "select",
|
||||
description: "shows a select",
|
||||
run: (interaction) => {
|
||||
reacord.reply(interaction, <FruitSelect />)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ephemeral-button",
|
||||
description: "button which shows ephemeral messages",
|
||||
run: (interaction) => {
|
||||
reacord.reply(
|
||||
interaction,
|
||||
<>
|
||||
<Button
|
||||
label="public clic"
|
||||
onClick={(event) =>
|
||||
reacord.reply(
|
||||
interaction,
|
||||
`${event.guild?.member.displayName} clic`,
|
||||
)
|
||||
}
|
||||
/>
|
||||
<Button
|
||||
label="clic"
|
||||
onClick={(event) => event.ephemeralReply("you clic")}
|
||||
/>
|
||||
</>,
|
||||
)
|
||||
},
|
||||
},
|
||||
])
|
||||
|
||||
await client.login(process.env.TEST_BOT_TOKEN)
|
||||
Reference in New Issue
Block a user