Discord机器人在ios上的功能与android和桌面上的不同

Discord机器人在ios上的功能与android和桌面上的不同,android,ios,node.js,discord.js,Android,Ios,Node.js,Discord.js,我有一个机器人,可以完美地在桌面应用程序上运行,在我的个人安卓手机/手机上实现Discord和Discord。。。但在IPhone/IOS上执行相同的步骤是行不通的。由于我从未拥有过苹果的产品,所以我对IOS与安卓或Windows的区别几乎没有任何背景 这主要与查询转义值的时间有关。有人输入一个值(我正在制作的TCG机器人的卡名),比如“Drago's Fury”。在桌面和安卓系统上,卡片标题被转义为双引号,而在IOS版本中,卡片标题被保留为单引号。因此,当将该卡的名称与主卡列表进行比较时,无法

我有一个机器人,可以完美地在桌面应用程序上运行,在我的个人安卓手机/手机上实现Discord和Discord。。。但在IPhone/IOS上执行相同的步骤是行不通的。由于我从未拥有过苹果的产品,所以我对IOS与安卓或Windows的区别几乎没有任何背景

这主要与查询转义值的时间有关。有人输入一个值(我正在制作的TCG机器人的卡名),比如“Drago's Fury”。在桌面和安卓系统上,卡片标题被转义为双引号,而在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!`)
 }
异步函数addToDeckQuestion(){ const agree=”✅" 常量不同意=”❌" let msg=wait message.author.send(`您想将卡片添加到${userdeckname}吗?请使用以下选项之一作出反应…`) 等待消息。反应(同意) 等待消息。反应(不同意) 常量过滤器=(反应,用户)=>{ 返回✅', '❌'].包括(reaction.emoji.name)&&user.id==message.author.id; }; const reply=await msg.await反应(过滤器,{max:1}) .catch(控制台错误); const addtodeck=reply.first() 返回addtodeck } 让addtodeck=等待addToDeckQuestion(); if(addtodeck.emoji.name==同意){ message.author.send(“您已同意将卡片添加到此新卡片组。”) 异步函数cardExists(){ let msg=wait message.author.send(`请提供您要添加到${userdeckname}中的卡片名'。\n\n**注意:*请用逗号和空格分隔每张卡片,如“黑暗契约、阿奎斯猛击、业力平衡”`) const filter=m=>m.author.id==message.author.id const reply=await msg.channel.await消息(过滤器,{max:1}) .catch(控制台错误); 让cardsToAdd=等待回复。first() 让usercardnamearray=等待cardsToAdd.content.split(“,”) 让匹配的卡片=[] 让不匹配的卡片=[] for(设i=0;i=0){ 匹配的卡片。推送(usercardnamearray[i]) }else if(找到==-1){ 不匹配的cards.push(usercardnamearray[i]) } } console.log('Finished!') 返回等待[匹配的卡片,不匹配的卡片] } 让卡片=等待卡片存在(); 让matchedcards=等待卡片[0] 让不匹配的卡片=等待卡片[1] 如果(unmatchedcards.length>=1){ message.author.send(等待“卡片**${unmatchedcards.join(“,”)}**无法**添加。请检查拼写、大小写并再次输入这些卡片名称!`) } 因此,例如,Android桌面上的用户将遵循图中所示的步骤

下面的图片来自控制台,在上面的代码中记录“found”变量

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

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

我希望这两个版本对javascript的反应都是一样的,但这方面的一些东西在IOS上并不好用。我注意到的唯一区别是,Drago的愤怒在桌面和Android上被双引号引用,但在IOS上却没有。我不确定如何着手解决这个问题,这样我的IOS用户就不会被完全排除在使用机器人的范围之外


关于为什么同一信息在IOS中的解释与其他信息不同,您有什么想法吗?请提前感谢您的帮助!

自从IOS 11以来,默认情况下,单引号和双引号会被做成卷曲的替代品。例如,默认的ASCII单引号字符
'
被键入为
'
这取决于位置。但是,用户可以在设置中关闭此功能,因此并非所有苹果用户都可以使用此功能

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

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

const str='Drago's Fury';
console.log(str);
const corrected=str.replace(/'|'/g,'\'');

console.log(已更正)
我想,插入替换行也不会影响android和Windows对事物的解释。IOS需要如此复杂,不是吗?哈哈,我会尝试插入替换行,看看测试是如何进行的。在使用卷曲单引号的任何地方,它们都会被解释为默认的ASCII单引号字符。Generally说它只会影响iOS用户,但实际上您可以在Windows和Android上键入替代项。我在这一行中添加了
usercardnamearray[I]=usercardnamearray[I]。replace(/'|'/gi,'\'')
就在我在上面发布的代码中的另一个替换行的正下方,它似乎没有修复任何问题。可能我把它放错了位置或做了什么错误的事情?我用gi尝试过,也用g尝试过,没有骰子。你能登录
usercardnamearray[I]吗
更换前后?我发现我把它放在了错误的代码部分,而不是测试它时运行的代码部分。一旦我把它放在正确的位置,它就工作得很好!感谢你继续帮助我解决问题。