Skip to content
This repository has been archived by the owner on Jan 15, 2024. It is now read-only.

Commit

Permalink
fix #3 メッセージを削除するコマンドを追加
Browse files Browse the repository at this point in the history
  • Loading branch information
yogarasu committed Aug 16, 2022
1 parent 9c40ce8 commit 37c25f5
Show file tree
Hide file tree
Showing 2 changed files with 184 additions and 2 deletions.
78 changes: 78 additions & 0 deletions command/destroy/message.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { Command } from "commander"
import dotenv from "dotenv"
import { resolve, join } from "node:path"
import { Spinner } from "../../libs/util/spinner.mjs"
import { createDiscordGuild } from "../../libs/client.mjs"
import { getChannelFile } from "../../libs/channel.mjs"
import { deleteAllMessage } from "../../libs/message.mjs"

const __dirname = new URL(import.meta.url).pathname
const distDirPath = resolve(__dirname, "../../../.dist/")
const distChannelFilePath = join(distDirPath, "channel.json")

dotenv.config({ path: "./.envrc" })
const spinner = new Spinner()

interface Options {
discordBotToken?: string
discordServerId?: string
}

;(async () => {
const program = new Command()
program
.description("Delete message command")
.requiredOption(
"-dt, --discord-bot-token [string]",
"DiscordBot OAuth Token",
process.env.DISCORD_BOT_TOKEN
)
.requiredOption(
"-ds, --discord-server-id [string]",
"Discord Server ID",
process.env.DISCORD_SERVER_ID
)
.parse(process.argv)

// パラメーターの取得
spinner.loading("Check parameter")
const options: Options = program.opts()
const { discordBotToken, discordServerId } = options
if (discordBotToken === undefined || discordServerId === undefined) {
spinner.failed(null, "Required parameter is not found")
process.exit(0)
}
spinner.success()

// Discordのギルドを作成する
spinner.loading("Create discord guild")
const { discordGuild, ...createDiscordGuildResult } =
await createDiscordGuild(discordBotToken, discordServerId)
if (!discordGuild || createDiscordGuildResult.status === "failed") {
spinner.failed(null, createDiscordGuildResult.message)
process.exit(0)
}
spinner.success()

// チャンネルを取得する
spinner.loading("Get channel")
const { channels, ...getChannelFileResult } = await getChannelFile(
distChannelFilePath
)
if (getChannelFileResult.status === "failed") {
spinner.failed(null, getChannelFileResult.message)
process.exit(0)
}
spinner.success()

// メッセージを削除する
spinner.loading("Delete message")
const deleteAllMessageResult = await deleteAllMessage(discordGuild, channels)
if (deleteAllMessageResult.status === "failed") {
spinner.failed(null, deleteAllMessageResult.message)
process.exit(0)
}
spinner.success()

process.exit(0)
})()
108 changes: 106 additions & 2 deletions libs/message.mts
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ export const createMessage = async (
message?: any
}> => {
try {
// チャンネルを作成
// メッセージを作成
const channelGuild = discordGuild.channels.cache.get(channelId)
const newMessages: Message[] = []
if (channelGuild && channelGuild.type === ChannelType.GuildText) {
Expand All @@ -251,7 +251,7 @@ export const createMessage = async (
}
}

// チャンネルファイルを更新
// メッセージファイルを更新
const createMessageFileResult = await createMessageFile(
distMessageFilePath,
newMessages
Expand Down Expand Up @@ -307,3 +307,107 @@ export const createAllMessage = async (
return { status: "failed", message: error }
}
}

/**
* Delete message
* @param discordGuild
* @param channelId
* @param distMessageFilePath
* @param messages
*/
export const deleteMessage = async (
discordGuild: Guild,
messages: Message[],
channelId: string,
distMessageFilePath: string
): Promise<{
messages: Message[]
status: "success" | "failed"
message?: any
}> => {
try {
// メッセージを削除
const channelGuild = discordGuild.channels.cache.get(channelId)
const newMessages: Message[] = []
if (channelGuild && channelGuild.type === ChannelType.GuildText) {
for (const message of messages) {
if (message.message_id) {
const result = await channelGuild.messages.cache
.get(message.message_id)
?.delete()
newMessages.push({
...message,
...{
message_id: result?.id,
channel_id: result?.channelId,
guild_id: result?.guildId ? result?.guildId : undefined,
timestamp: result?.editedTimestamp
? result?.editedTimestamp
: undefined,
anthor: {
id: result?.author.id,
is_bot: result?.author.bot,
name: result?.author.username,
},
},
})
}
}
}

// メッセージファイルを更新
const createMessageFileResult = await createMessageFile(
distMessageFilePath,
newMessages
)
if (createMessageFileResult.status === "failed") {
return {
messages: [],
status: "failed",
message: createMessageFileResult.message,
}
}

return { messages: newMessages, status: "success" }
} catch (error) {
return { messages: [], status: "failed", message: error }
}
}

/**
* Delete all message
*/
export const deleteAllMessage = async (
discordGuild: Guild,
channels: Channel[]
): Promise<{
status: "success" | "failed"
message?: any
}> => {
try {
await Promise.all(
channels.map(async (channel) => {
await Promise.all(
channel.discord.message_file_paths.map(async (messageFilePath) => {
const getMessageFileResult = await getMessageFile(messageFilePath)
if (getMessageFileResult.status === "failed") {
throw new Error(getMessageFileResult.message)
}
const deleteMessageResult = await deleteMessage(
discordGuild,
getMessageFileResult.messages,
channel.discord.channel_id,
messageFilePath
)
if (deleteMessageResult.status === "failed") {
throw new Error(deleteMessageResult.message)
}
})
)
})
)
return { status: "success" }
} catch (error) {
return { status: "failed", message: error }
}
}

0 comments on commit 37c25f5

Please sign in to comment.