import type { Client, Message } from 'discord.js' import database, { LearnData, ResponseData } from './database' import { TextChannel } from 'discord.js' import config from '../../config.json' import { NODE_ENV } from '.' export default class ChatBot { get db() { return this.#db } #db = database public async getResponse(msg: Message): Promise { const db = await this.db.getConnection() const [rows] = await db.execute('SELECT * FROM statement;') const args = msg.content.slice('머핀아 '.length).trim().split(/ +/g) const [learn] = await db.execute('SELECT * from learn;') const a = Math.round(Math.random() * (2 - 1) + 1) if (NODE_ENV === 'development') { console.log(a) console.log(args) } if (a === 1) { if (args[0].startsWith(learn[0].command)) { return `${learn[0].command}\n\`${(await msg.client.users.fetch(msg.author.id)).username}님이 알려주셨어요.\`` } } let response: string if ((msg.channel as TextChannel).nsfw) { const [rows1] = await db.execute( 'SELECT * FROM nsfw_content;', ) const rows2 = [...rows, ...rows1] response = rows2[Math.floor(Math.random() * rows2.length)].text } else { response = rows[Math.floor(Math.random() * rows.length)].text } if (!response) response = '살ㄹ려주세요' db.release() return response } public async train(client: Client): Promise { const db = await this.db.getConnection() client.on('messageCreate', async msg => { if (msg.author.bot) return if (msg.author.id === config.train.user_ID) { const response = await this.getResponse(msg) const [rows] = await db.execute( 'SELECT * FROM statement;', ) try { await db.beginTransaction() await db.execute( 'INSERT INTO statement (id, text, persona, in_response_to) VALUES (?, ?, ?, ?);', [++rows[rows.length - 1].id, msg.content, 'muffin', response], ) await db.commit() } catch (err) { console.log(err) await db.rollback() } } else { if (!(msg.channel as TextChannel).nsfw) return if (!msg.content.startsWith('머핀아 ')) return const user = `user:${msg.author.username.slice(0, 50).toLowerCase()}` const text = msg.content.replace('머핀아 ', '') const [rows] = await db.execute( 'SELECT * FROM nsfw_content;', ) try { await db.beginTransaction() await db.execute( `INSERT INTO nsfw_content (id, text, persona) VALUES (?, ?, ?);`, [++rows[rows.length - 1].id, text, user], ) await db.commit() } catch (err) { console.log(err) await db.rollback() } } }) db.release() setInterval(async () => { const db = await database.getConnection() await db.ping() db.release() }, 60000) return this } }