我正在使用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
,则该机器人会因为检测到自己的反应而重新翻译回英语。
任何帮助将不胜感激!
答案 0 :(得分:1)
在您的过滤器中,您可以检查以确保用户不是客户端,就像这样...
const filter = (reaction, user) => reaction.emoji.name === '?' && user.id !== client.user.id;
这样,仅收集客户端未添加 的反应。
您将不得不在收集器中将max
选项更改为1,因为将不会收集客户自己的反应。您还可以删除与if
比较的reaction.emoji.name
语句。