![](/img/trans.png)
[英]Discord.js How do I make my bot read an entire sentence for banned words?
[英]Discord.JS Customizable Banned Words/Filter
我正在嘗試制作一個 discord 禁用詞過濾器,該過濾器可按服務器自定義,類似於 MEE6、Dyno 等。
我目前將服務器和指定的單詞保存在數據庫中。 我目前要過濾這些詞是在發送的每條消息中查詢數據庫搜索,我相信這不是一個好主意。
示例代碼:
client.on("messageCreate", async message => {
sql.query(`SELECT * FROM words WHERE serverid = ${serverID}`, (err, res) => {
let words = res[0]
for (let i in words) {
if(message.content.includes(words[i])) return message.delete()
}
})
})
我認為當同時發送數千條消息時,這種方法會非常緩慢且效率低下,我想知道是否有更好的方法通過將單詞存儲在緩存/映射或其他東西中來做到這一點,謝謝。
我只會在機器人啟動時運行該查詢,並將它們存儲在客戶端 object 的 object 中,這樣就可以輕松訪問它,而不必依賴全局 object。
client.wordFilters = {}
// for every server id
sql.query(`SELECT * FROM words WHERE serverid = ${serverID}`, (err, res) => {
client.wordFilters[serverID] = [...res]
// assuming res is an array of banned words
// or you need to turn it into an array first
// or just use it as an object, use it as how you see fit
})
然后每次添加新的禁用詞時,不要忘記將其推送到client.wordFilters[serverID]
內部的數組中
client.on("messageCreate", async message => {
// assuming the res object above is an array
for (let i = 0; i < client.wordFilters[serverID]; i++){
let word = client.wordFilters[serverID][i]
if(message.content.includes(word)) return message.delete()
}
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.