【问题标题】:Discord bot functions differently on ios versus android and desktopDiscord bot 在 ios 与 android 和桌面上的功能不同
【发布时间】:2019-07-03 04:24:19
【问题描述】:

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

这主要与查询转义值有关。有人输入了一个值(我正在制作的 TCG 机器人的卡名),例如“Drago's Fury”。 ' 在桌面和 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 桌面用户将按照此图像中描述的步骤

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

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

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

我希望两个版本都能以相同的方式对 javascript 做出反应,但是这方面的某些东西不能很好地与 IOS 配合使用。我注意到的唯一区别是 Drago's Fury 在桌面和 Android 中被放在双引号中,但在 IOS 上没有。我不确定如何解决这个问题,所以我的 IOS 用户不会完全被排除在使用机器人之外。

关于为什么相同的信息在 IOS 中的解释与其他任何内容不同的任何想法?提前感谢您的帮助!

【问题讨论】:

    标签: android ios node.js discord.js


    【解决方案1】:

    从 iOS 11 开始,默认情况下,单引号和双引号会成为它们的卷曲替代项。例如,默认的 ASCII 单引号字符 ' 键入为 ,具体取决于位置。但是,用户可以在“设置”中关闭此功能,因此并非所有 Apple 用户都一致。

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

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

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

    【讨论】:

    • 我假设,放入该替换行也不会影响 android 和 Windows 解释事物的方式。 IOS需要这么复杂,不是吗?大声笑,我会试着把线放进去,看看测试是如何进行的。
    • 在任何使用单引号的地方,它们都将被解释为默认的 ASCII 单引号字符。一般来说,它只会影响 iOS 用户,但您实际上可以在 Windows 和 Android 上键入替代项。
    • 我在此行中添加了usercardnamearray[i] = usercardnamearray[i].replace(/‘|’/gi, '\'');,就在我在上面发布的代码中的另一个替换行的下方,它似乎没有解决任何问题。也许我把它放在错误的地方或做错了什么?我用 gi 和 g 也试过了,没有骰子。
    • 这次更换前后可以登录usercardnamearray[i]吗?
    • 我发现我把它放在了我的代码的错误部分,而不是我测试它时正在运行的部分。一旦我把它放在正确的位置,它就完美地工作了!感谢您对我的问题的持续帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2021-07-15
    • 2022-01-04
    • 2022-07-05
    相关资源
    最近更新 更多