【问题标题】:Having problems with if & else for Spotify discord.py apiSpotify discord.py api 的 if & else 有问题
【发布时间】:2021-06-17 13:39:04
【问题描述】:

对于代码的最后一点elif isinstance(activity == None, Spotify) & await ctx.send(f'{user.name} is not listening to anything :shrug:') 运行时没有错误代码,但是如果我的 spotify 没有播放它在我输入命令时不会打印它

完整代码如下:

@commands.command()
    async def spot(self, ctx, user: discord.Member = None):
        if user == None:
            user = ctx.author
            pass
        if user.activities:
            for activity in user.activities:
                if isinstance(activity, Spotify):

                    embed = discord.Embed(
                        title=f"{user.name}'s Spotify",
                        description="Currently listening to {}".format(activity.title),
                        color=user.color)

                    embed.set_thumbnail(url=activity.album_cover_url)
                    embed.add_field(name="Artist", 
                                    value=activity.artist,
                                    inline=False)
                    embed.add_field(name="Album", 
                                    value=activity.album,
                                    inline=False)
                    
                    m1, s1 = divmod(int(activity.duration.seconds), 60)
                    song_length = f'{m1}:{s1}'
                    embed.add_field(name="Song Duration",
                                    value=song_length,
                                    inline=True)                   
                    embed.add_field(name="Track Link", 
                                    value=f"[{activity.title}](https://open.spotify.com/track/{activity.track_id})",
                                    inline=True)

                    embed.set_footer(text=f'Requested by : {ctx.author}',
                                    icon_url=ctx.author.avatar_url)
                    await ctx.send(embed=embed)

                elif isinstance(activity == None, Spotify):
                    await ctx.send(f'{user.name} is not listening to anything :shrug:')

【问题讨论】:

  • 当然,isinstance 将始终返回 False,因为您正在检查评估为布尔值的语句是否属于 Spotify 类型。
  • 你可以把整个 elif 换成一个 else,对吧?
  • @4RJ 即使删除了 isinstance 机器人仍然保持不变,我有什么遗漏的吗?
  • @4RJ else: 由于两个if 给了我一个双重响应,它还在歌曲播放时嵌入的 Spotify 活动下方响应
  • 有一个名为sent 或类似名称的临时变量。在您的“if isinstance(activity, Spotify):` 中将其设置为 True。然后在您的循环之外,如果它仍然是 False,则发送未监听的嵌入。这应该是一个快速的解决方案。

标签: python discord discord.py spotify


【解决方案1】:

我复制了您的代码并亲自尝试过。 将行 elif isinstance(activity == None, Spotify): 更改为 else: 为我修复了它。

但我注意到您的代码中有一个错误,它会检查用户的每项活动,并为每项活动发送一条消息。因此,当您收听 Spotify 时,它会说您正在收听而不是同时收听。因此,我重新编写了您的代码,因此它首先检查是否存在 Spotify 活动,然后根据该活动发送消息。

这是修改后的代码:

@commands.command()
  async def spot(self, ctx, user: discord.Member=None):
    user = user if user else ctx.author

    activity = None

    for act in user.activities:
      if isinstance(act, Spotify):
        activity = act
        break
      
    if activity:
      embed = discord.Embed(
        title=f"{user.name}'s Spotify",
        description="Currently listening to {}".format(activity.title),
        color=user.color
      )

      embed.set_thumbnail(url=activity.album_cover_url)

      embed.add_field(
        name="Artist", 
        value=activity.artist,
        inline=False
      )

      embed.add_field(
        name="Album", 
        value=activity.album,
        inline=False
      )
      
      m1, s1 = divmod(int(activity.duration.seconds), 60)

      song_length = f'{m1}:{s1}'

      embed.add_field(
        name="Song Duration",
        value=song_length,
        inline=True
      )                   
      embed.add_field(
        name="Track Link", 
        value=f"[{activity.title}](https://open.spotify.com/track/{activity.track_id})",
        inline=True
      )

      embed.set_footer(text=f'Requested by : {ctx.author}', icon_url=ctx.author.avatar_url)
      
      await ctx.send(embed=embed)

    else:
      await ctx.send(f'{user.name} is not listening to anything :shrug:')

【讨论】:

  • 您好,非常感谢!它终于起作用了。
【解决方案2】:

您可以完全删除elif,您会将味精保存在变量中,然后检查是否发送了消息。此方法即使用户没有user.activities也有效

@commands.command()
    async def spot(self, ctx, user: discord.Member = None):
        if user == None:
            user = ctx.author
            pass
        if user.activities:
            for activity in user.activities:
                if isinstance(activity, Spotify):

                    embed = discord.Embed(
                        title=f"{user.name}'s Spotify",
                        description="Currently listening to {}".format(activity.title),
                        color=user.color)

                    # add fields here

                    msg = await ctx.send(embed=embed)
                    break

        if not msg:
            await ctx.send('nothing')

【讨论】:

  • 我尝试了你的方法,但是它在服务器中返回了两条消息
  • @angy 我在发送第一条消息时添加了一个中断
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多