Files
discord-aidolls/src/utils/configInterfaces.ts
Alex de413f90e1
Some checks failed
Builds / Discord-Node-Build (push) Has been cancelled
Builds / Discord-Ollama-Container-Build (push) Has been cancelled
Coverage / Discord-Node-Coverage (push) Has been cancelled
everything is broken yay
2025-05-21 07:18:28 -04:00

120 lines
4.8 KiB
TypeScript

import { TextChannel, ThreadChannel } from 'discord.js'
import { Channel, UserMessage } from '../index.js'
import fs from 'fs/promises'
import path from 'path'
/**
* Method to check if a thread history file exists
*
* @param channel parent thread of the requested thread (can be GuildText)
* @returns true if channel exists, false otherwise
*/
async function checkChannelInfoExists(channel: TextChannel, user: string) {
const doesExists: boolean = await new Promise((resolve) => {
getChannelInfo(`${channel.id}-${user}.json`, (channelInfo) => {
if (channelInfo?.messages) {
resolve(true)
} else {
resolve(false)
}
})
})
return doesExists
}
/**
* Method to clear channel history for requesting user
*
* @param filename guild id string
* @param channel the TextChannel in the Guild
* @param user username or ID of user
* @returns true if history was cleared, false if already empty or not found
*/
export async function clearChannelInfo(filename: string, channel: TextChannel, user: string): Promise<boolean> {
const channelInfoExists: boolean = await checkChannelInfoExists(channel, user)
// If thread does not exist, file can't be found
if (!channelInfoExists) return false
// Attempt to clear user channel history
const fullFileName = path.join('/app/data', `${filename}-${user}.json`)
try {
const data = await fs.readFile(fullFileName, 'utf8')
const object = JSON.parse(data)
if (object['messages'].length === 0) {
console.log(`[Util: clearChannelInfo] History already empty for ${fullFileName}`)
return false
}
object['messages'] = []
await fs.writeFile(fullFileName, JSON.stringify(object, null, 2), { flag: 'w', mode: 0o600 })
console.log(`[Util: clearChannelInfo] Cleared history for ${fullFileName}`)
return true
} catch (error) {
console.log(`[Util: clearChannelInfo] Failed to clear ${fullFileName}: ${error}`)
return false
}
}
/**
* Method to open the channel history
*
* @param filename name of the json file for the channel by user (without path)
* @param channel the text channel info
* @param user the user's ID or clientId for bots
* @param messages their messages
*/
export async function openChannelInfo(filename: string, channel: TextChannel | ThreadChannel, user: string, messages: UserMessage[] = []): Promise<void> {
const fullFileName = path.join('/app/data', `${filename}-${user}.json`)
console.log(`[Util: openChannelInfo] Attempting to create/open ${fullFileName}`)
try {
if (await fs.access(fullFileName).then(() => true).catch(() => false)) {
const data = await fs.readFile(fullFileName, 'utf8')
const object = JSON.parse(data)
if (messages.length > 0) {
object['messages'] = messages
}
await fs.writeFile(fullFileName, JSON.stringify(object, null, 2), { flag: 'w', mode: 0o600 })
console.log(`[Util: openChannelInfo] Updated ${fullFileName}`)
} else {
const object: Channel = {
id: channel?.id || filename,
name: channel?.name || 'unknown',
user,
messages: messages
}
const directory = path.dirname(fullFileName)
await fs.mkdir(directory, { recursive: true })
await fs.writeFile(fullFileName, JSON.stringify(object, null, 2), { flag: 'w', mode: 0o600 })
console.log(`[Util: openChannelInfo] Created '${fullFileName}' in working directory`)
}
} catch (error) {
console.log(`[Util: openChannelInfo] Failed to write ${fullFileName}: ${error}`)
throw error
}
}
/**
* Method to get the channel information/history
*
* @param filename name of the json file for the channel by user (without path)
* @param callback function to handle resolving message history
*/
export async function getChannelInfo(filename: string, callback: (config: Channel | undefined) => void): Promise<void> {
const fullFileName = path.join('/app/data', filename)
console.log(`[Util: getChannelInfo] Reading ${fullFileName}`)
try {
const data = await fs.readFile(fullFileName, 'utf8')
const config = JSON.parse(data)
if (!config || !Array.isArray(config.messages)) {
console.log(`[Util: getChannelInfo] Invalid or empty config in ${fullFileName}: ${JSON.stringify(config)}`)
callback(undefined)
} else {
console.log(`[Util: getChannelInfo] Successfully read ${fullFileName}`)
callback(config)
}
} catch (error) {
console.log(`[Util: getChannelInfo] Failed to read ${fullFileName}: ${error}`)
callback(undefined)
}
}