Discord bot在ios,Android和台式机上的功能有所不同

时间:2019-07-02 16:10:37

标签: android ios node.js discord.js

我有一个机器人可以在我的Android手机/手机上的Discord和Discord的桌面应用程序上完美运行...但是在iPhone / IOS上执行的完全相同的步骤不起作用。关于IOS与Android或Windows有何不同,我几乎没有背景,因为我从未拥有过Apple产品...

从根本上讲,这与查询转义了值有关。有人输入“ Drago's Fury”之类的值(我正在制作的TCG机器人的卡名)。 '在台式机和android上都转义了,卡标题在IOS版本上用双引号引起来,而不是在单引号中引起来。因此,将该卡名与卡主列表进行比较时,找不到该卡。

这是我通过循环获取所有卡名称匹配的主列表的方式...

 var sql = `SELECT * FROM ??`
  var inserts = ['cardsmaster']
  con.query(sql, inserts, (error, rows, fields) => { 

  let cardsList = []
  for (var i in rows) {
       cardsList.push(rows[i].name)
  }

当询问用户要添加哪些卡时,将运行以下代码。答复被接收并循环运行以匹配主列表...

async function addToDeckQuestion(){

     const agree = "✅"
     const disagree = "❌"
     let msg = await message.author.send(`Would you like to add cards to ${userdeckname}? Please react with one of the following...`)
     await msg.react(agree)
     await msg.react(disagree)

     const filter = (reaction, user) => {
      return ['✅', '❌'].includes(reaction.emoji.name) && user.id === message.author.id;
      };

     const reply = await msg.awaitReactions(filter, { max: 1 })
     .catch(console.error);

     const addtodeck = reply.first()
     return addtodeck
     }

     let addtodeck = await addToDeckQuestion();

     if (addtodeck.emoji.name == agree){

     message.author.send("You have agreed to add cards to this new deck.")

     async function cardExists() {

     let msg = await message.author.send(`Please provide the cardnames that you would like to add to '${userdeckname}'.\n\n**NOTE:** Please separate each card with a comma and space, like so "Pact of Darkness, Aquos Slam, Karmic Balance"`)

       const filter = m => m.author.id === message.author.id
       const reply = await msg.channel.awaitMessages(filter, { max: 1 })
       .catch(console.error);

       let cardsToAdd = await reply.first()

       let usercardnamearray = await cardsToAdd.content.split(", ")

       let matchedcards = []
       let unmatchedcards = []

       for (let i = 0; i < usercardnamearray.length; i++) {

       usercardnamearray[i] = usercardnamearray[i].replace(/'/gi, "\'"); 

       let found = cardsList.indexOf(`${usercardnamearray[i]}`)
       console.log(found)

       if (found >= 0) {                                             
matchedcards.push(usercardnamearray[i])
     } else if (found == -1){
unmatchedcards.push(usercardnamearray[i])
     }     
  }
   console.log('Finished!')
   return await [matchedcards, unmatchedcards]
}

let cards = await cardExists();  

let matchedcards = await cards[0]      
let unmatchedcards = await cards[1]


if (unmatchedcards.length >= 1){ 

message.author.send(await `The card **${unmatchedcards.join(", ")}** could **NOT** be added. Please check your spelling, capitalization and enter just these card names again!`)
 }

例如,Android桌面上的用户将遵循此图像here

中描述的步骤

下面的图像来自控制台,其中记录了上面代码中的“ found”变量。

这是在台式机和Android上控制台登录命令的方式: here

这是在IOS上控制台登录命令的方式: here

我希望两个版本对javascript的反应都一样,但是与此相关的一些事情在IOS上效果不佳。我注意到的唯一区别是,Drago的Fury在台式机和Android中用双引号引起来,但在IOS上没有。我不确定如何解决此问题,因此不会阻止我的IOS用户完全使用该机器人。

有什么想法可以解释为什么在IOS中对相同信息的解释不同于对其他任何东西的解释?预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

从iOS 11开始,默认情况下将单引号和双引号设置为大写替代。例如,根据位置,默认的ASCII单引号字符'键入为。但是,用户可以在“设置”中将其关闭,因此在所有Apple用户中并不一致。

这对您的代码意味着,搜索字符串对Drago's Fury中的撇号使用其他字符。因此,搜索不会返回,因为这两个字符实际上是不同的。

一种简单的解决方案是将这些字符替换为名称中使用的默认ASCII字符。

const str = 'Drago’s Fury';
console.log(str);

const corrected = str.replace(/‘|’/g, '\'');
console.log(corrected);