获取Discord Bot检查它是否对自己的帖子有反应

时间:2019-06-03 01:35:25

标签: discord discord.js google-translation-api

我正在使用discord.js编写一个discord机器人,并且最近添加了// translate命令,该命令利用Google Translate API在Google Translate支持的所有语言之间进行翻译。我想添加使用反应将翻译快速重新翻译成英语的功能,并且我希望机器人检查是否有1个人对提供的反应对帖子做出了反应,如果有,请将该翻译重新翻译回到英语。

我真的很接近,但是我遇到了一个问题,我无法让机器人检查它本身是否发送了反应,因此它会自动重新翻译回英语,因为它检测到它是自己的反应。我希望它仅在一个人做出反应时才重新翻译,并且只有一次。

我对discord.js的这一领域还不是很熟悉,所以我真的不知道该怎么做。

代码如下:

@SuppressLint("CommitPrefEdits")
public DrawView(Context context) {
    super(context);
    setFocusable(true);
    setFocusableInTouchMode(true);
    setOnTouchListener(this);
    this.paint.setColor(Color.TRANSPARENT);
    this.paint.setAntiAlias(true);
    this.mContext = context;
    this.prefs = this.mContext.getSharedPreferences("MyGamePreferences", 0);
    this.prefEditor = this.prefs.edit();
    this.prefEditor.putString("font", "f");
    this.prefEditor.apply();
}

public void onDraw(Canvas canvas) {
    this.ch = getHeight();
    this.cw = getWidth();
    if (!erase)
        for (Point point : this.points) {
            canvas.drawBitmap(point.bt, point.x, point.y, null);
        }

}

public void drawSingleEmoji(MotionEvent motionEvent, Bitmap singleBitmap) {
    this.bt1 = singleBitmap;
    this.bt2 = Bitmap.createScaledBitmap(bt1, w, h, true);
    Point point = new Point();
    point.x = motionEvent.getX() - ((float) (this.bt2.getWidth() / 2));
    point.y = motionEvent.getY() - ((float) (this.bt2.getHeight() / 2));
    point.bt = this.bt2;
    this.points.add(point);
    invalidate();
}

public boolean onTouch(View view, MotionEvent motionEvent) {
    String str = "grpEmoji";
    this.s = this.prefs.getString("font", str);
    String str2 = this.s;
    float x, y = 0, x1, y1;
    if ((motionEvent.getAction() == MotionEvent.ACTION_DOWN)) {
        x = motionEvent.getX();
        y = motionEvent.getY();
    } else if ((motionEvent.getAction() == MotionEvent.ACTION_UP)) {
        x1 = motionEvent.getX();
        y1 = motionEvent.getY();
        if (y1 > y) {
            if (str2 != null) {
                if (str2.equals("grpEmoji")) {
                     drawSingleEmoji(motionEvent, bitSingle);
                } else if (str2.equals("generatedEmoji")) {
                     drawSingleEmoji(motionEvent, bitSingle);
                } else {
                    if (bitSingle != null)
                        drawSingleEmoji(motionEvent, bitSingle);
                }
            }
        }
    }
    return true;

}

public void enableErase(boolean isEraseEnabled, float x, float y, Bitmap bitmap) {
    erase = isEraseEnabled;
    bitmap.eraseColor(Color.TRANSPARENT);
    invalidate();
}

预期结果:如果用户对所提供的反应有任何反应,则Bot会重新翻译回英语,并且只有一次。

实际结果:机器人没有采取任何措施,或者,如果我删除了if (msg.content.startsWith(`${prefix}translate`) || msg.content.startsWith(`${prefix}t`)) { const text = args.slice(1).join(` `); if (!text) return msg.channel.send(`Nothing to translate provided! Languages codes are at https://cloud.google.com/translate/docs/languages !\n Command syntax: \`${prefix}translate\` or \`${prefix}t\` [text] [language code]`); const text1 = text.substring(0, text.length - 2) const target = text.substring(text.length - 2, text.length) || languages translate .translate(text1, target) .then(results => { const translation = results[0]; msg.channel.send(`Translation: ${translation}`).then(sentText => { sentText.react(`?`); const filter = (reaction, user) => { return ['?'].includes(reaction.emoji.name); }; sentText.awaitReactions(filter, { max: 2, time: 5000, errors: ['time'] }) .then(collected => { const reaction = collected.first(); if (reaction.emoji.name === '?' && sentText.react.me === false) { const target = `en` translate .translate(text1, target) .then(results => { const translation = results[0]; msg.channel.send(`Translation: ${translation}`); }) .catch(err => { console.log(err); }) } }) }) }) //code for command continues below this line, but it is irrelevant to what I'm trying to achieve ,则该机器人会因为检测到自己的反应而重新翻译回英语。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

在您的过滤器中,您可以检查以确保用户不是客户端,就像这样...

const filter = (reaction, user) => reaction.emoji.name === '?' && user.id !== client.user.id;

这样,仅收集客户端未添加 的反应。

您将不得不在收集器中将max选项更改为1,因为将不会收集客户自己的反应。您还可以删除与if比较的reaction.emoji.name语句。