discord.js 12 任何方式将数据从 json 文件发送到通道?

Posted

技术标签:

【中文标题】discord.js 12 任何方式将数据从 json 文件发送到通道?【英文标题】:discord.js 12 any way to send data from json file to channel? 【发布时间】:2021-03-29 17:05:15 【问题描述】:

我有一个 json 文件,其中包含一些玩家的信息,看起来像这样


    "208505383361314816": 
        "warns": 8,
        "reason": "test"
    ,
    "776387838350196756": 
        "warns": 99,
        "reason": ""
    

然后我按警告数对信息进行排序。它工作得很好,但我不知道如何发送消息。

client.on('message', message => 
    if (message.content.startsWith('>topw')) 
        const sorted = [];
        const keys = Object.keys(warns)

        for (let user in warns) 
            const warny = warn[user].warns;

            const entry = 
                [keys[sorted.length]]: warns[user]
            

            if (sorted.length === 0) 
                sorted.push(entry);

                continue;
            
            let i = 0;
            while (sorted[i] !== undefined && sorted[i][Object.keys(sorted[i])].warns > warny) 
                i++;
            

            sorted.splice(i, 0, entry)
        
        console.log(sorted)

    
)

它应该看起来像一个“排行榜”,但带有大量警告

e.g: 
name: Bob
warns: 20
reason: test

【问题讨论】:

【参考方案1】:

欢迎来到 ***! :)

关于您的 JSON 文件

首先,关于您存储数据的方式的快速建议:您确实应该将用户信息存储在一个数组中,它看起来像这样:

[
    
        "id": "00000000",
        "warns": 10,
        "reason": "test"
    
]

准备好数据

话虽如此,让我们回答您的问题。 我想你会喜欢使用MessageEmbeds,在阅读代码之前先看看文档,它可能会有所帮助。我也会重写一点你的代码。

重新格式化

为了让我们的生活更轻松,我们将重新格式化数据以便对其进行排序。

// It's just your JSON file here
const oldWarns = 
  "208505383361314816": 
    "warns": 8,
    "reason": "test"
  ,
  "776387838350196756": 
    "warns": 99,
    "reason": ""
  


let newWarns = Object.keys(oldWarns).map((e) => (
  id: e,
  warns: oldWarns[e].warns,
  reason: oldWarns[e].reason
))

console.log(newWarns)

排序

现在我们已经有了这个漂亮的数组,让我们对其进行排序。它比你想象的要简单得多!

// Precedently generated data
let newWarns = [
    "id": "208505383361314816",
    "warns": 8,
    "reason": "test"
  ,
  
    "id": "776387838350196756",
    "warns": 99,
    "reason": ""
  
]

newWarns.sort((a, b) => (a.warns > b.warns ? 1 : -1))
console.log(newWarns)

发送数据

你实际要求的。

用嵌入渲染它

好的,一切都设置好了,我们可以发送数据了。以下是在 Discord.js 中使用嵌入的方法。

const warnBoard = new Discord.MessageEmbed()
  .setTitle("Warnboard")
  .setColor("#FF0000")
  .addFields(newWarns.flatMap((e, i) => ( // flatMap will delete all the [] of the array after mapping it
    i >= 25 ? [] :  // the max number of fields in embeds is 25
      name: e.id,
      value: e.warns,
      inline: true // changes the layout
    
  )))

我只是使用了一些 MessageEmbed 的功能。它们看起来真的很漂亮,所以随意摆弄它的道具!

让它变得尽可能简单

嵌入太多了?你也可以只发送一个字符串。

const stringifiedData = JSON.stringify(newWarns, null, 4)
const warnBoard = "```json\n"+ stringifiedData +"\n```"

发送

无论您选择的解决方案是字符串还是嵌入,这都是您要发送数据的方式。

message.channel.send(warnBoard)

【讨论】:

以上是关于discord.js 12 任何方式将数据从 json 文件发送到通道?的主要内容,如果未能解决你的问题,请参考以下文章

从数组 discord.js v12 访问项目

从函数中导出数据 [mysql, node.js, discord.js]

Discord.js 机器人审计日志问题 (v12)

使用 discord.js 从不同服务器向多个频道 ID 发送消息

MySQL 数据库 discord.js

如何从用户 discord.js v12 中删除所有角色?