【问题标题】:Discord.JS Customizable Banned Words/FilterDiscord.JS 可定制的禁用词/过滤器
【发布时间】:2022-01-24 23:20:21
【问题描述】:

我正在尝试制作一个可根据服务器自定义的不和谐禁止词过滤器,类似于 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()
    }
  })
})

我认为当同时发送数千条消息时,这种方法会非常缓慢且效率低下,我想知道是否有更好的方法通过将单词存储在缓存/地图或其他东西中来做到这一点,谢谢.

【问题讨论】:

    标签: javascript node.js discord discord.js


    【解决方案1】:

    我只会在机器人启动时运行该查询,并将它们存储在客户端对象的一个​​对象中,这样就可以轻松访问它,而不必依赖全局对象。

    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()
      }
    })
    

    【讨论】:

    • 您对让机器人每隔 10 秒更新一次数据库中的对象有何想法?
    • @Prism 在我看来似乎很浪费。它当然可以工作,但它对需要获取的更多对象和实体的性能产生了很大的影响,因为 SQL 也不是最好的性能。老实说,我看不出有任何理由用数据库更新对象,除非有另一个数据源可以操纵会影响过滤器的表
    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 2021-05-31
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多