如何在 Discord.js 中按名称查找表情符号

Posted

技术标签:

【中文标题】如何在 Discord.js 中按名称查找表情符号【英文标题】:How Find Emojis By Name In Discord.js 【发布时间】:2019-02-04 02:02:05 【问题描述】:

所以过去几天我一直非常沮丧,因为我无法在网上找到一个资源,该资源正确地记录了在用 javascript 编写不和谐机器人时如何找到表情符号。我一直在参考本指南,其有关表情符号的文档似乎是错误的或过时的:

https://anidiots.guide/coding-guides/using-emojis

我需要的很简单;只是能够使用.find() 函数引用表情符号并将其存储在变量中。这是我当前的代码:

const Discord = require("discord.js");
const config = require("./config.json");
const fs = require("fs");
const client = new Discord.Client();
const guild = new Discord.Guild();
const bean = client.emojis.find("name", "bean");

client.on("message", (message) => 
    if (bean) 
      if (!message.content.startsWith("@"))
        if (message.channel.name == "bean" || message.channel.id == "478206289961418756") 
            if (message.content.startsWith("<:bean:" + bean.id + ">")) 
                message.react(bean.id);
            
        
      
    
    else 
      console.error("Error: Unable to find bean emoji");
    
);

附言整个 bean 只是一个测试

但是每次我运行这段代码时,它都会返回这个错误并死掉:

(node:3084) DeprecationWarning: Collection#find: pass a function instead

有什么我错过的吗?我好难过……

【问题讨论】:

从警告中我会说你需要做类似client.emojis.find(emoji =&gt; emoji.name === "bean")的事情。我从未使用过 discord.js,所以我可能完全错了 @jonatjano 所以我尝试了你在那里写的内容,错误似乎消失了,但它仍在死亡:/ 您可能需要在您的活动中设置它,我不认为这些集合是动态的,这意味着 bean var 不会在新值出现时获得新值,而是保留初始值只有 【参考方案1】:

我从未使用过discord.js,所以我可能完全错了

从警告中我会说你需要做类似的事情

client.emojis.find(emoji => emoji.name === "bean") 

另外,在查看Discord.js Doc 之后,这似乎是要走的路。但是文档从来没有说过 client.emojis.find("name", "bean") 是错误的

【讨论】:

好吧,所以我使用了两个答案中的代码组合,它终于奏效了,但您似乎无法同时将正确答案授予 2 个人。但是因为你帮我解决了最初的错误,所以我把它授予了你 以防万一有人稍后通过并添加新答案:OP所说的另一个答案是@BaderH.'s answer【参考方案2】:

我已对您的代码进行了更改。

希望对你有帮助!

const Discord = require("discord.js");
const client = new Discord.Client();


client.on('ready', () => 
	console.log('ready');
);


client.on('message', message => 
	var bean = message.guild.emojis.find(emoji => emoji.name == 'bean');
	// By guild id 
	if(message.guild.id == 'your guild id') 
	if(bean) 
    		if(message.content.startsWith("<:bean:" + bean.id + ">")) 
    			message.react(bean.id);
    		
    	

);

【讨论】:

【参考方案3】:

请查看switching to v12 discord.js guide

v12 引入了管理器的概念,你将不能再对Client#users 这样的数据结构直接使用Collection#get 这样的收集方法。在尝试使用收集方法之前,您现在必须直接请求管理器上的缓存。任何直接在管理器上调用的方法都会调用 API,例如 GuildMemberManager#fetchMessageManager#delete

在这种特定情况下,您需要将缓存对象添加到您的表达式中:

var bean = message.guild.emojis.cache?.find(emoji => emoji.name == 'bean');

【讨论】:

我有一个问题,因为意图发生了。有时 find 函数会在缓存中检索 undefined。【参考方案4】:

如果像我这样的人在寻找答案时发现了这个,在 v12 中你将不得不添加缓存,使它看起来像这样:

var bean = message.guild.emojis.cache.find(emoji => emoji.name == 'bean');

而不是:

var bean = message.guild.emojis.find(emoji =&gt; emoji.name == 'bean');

【讨论】:

以上是关于如何在 Discord.js 中按名称查找表情符号的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 发送表情符号

如何在 discord.js 中获取消息中某个表情符号反应的计数

从 discord.js 中的消息中获取 Emoji url

收到表情符号反应后的 Discord.js 消息

Discord.js ReactionCollector 帮助菜单 - 重置表情符号

Discord.js v13 机器人显示未定义而不是表情符号