代码之家  ›  专栏  ›  技术社区  ›  Pierrick Rambaud

如何使用discord bot自动删除频道

  •  0
  • Pierrick Rambaud  · 技术社区  · 6 年前

    我正在为discord制作python机器人。它根据播放器的指示创建一个删除频道。 我想创建一个测试所有服务器的垃圾收集器。频道并删除过期的频道。

    我会:

    async def waitTimer():
        while True:
            await asyncio.sleep(10)
    
            regex = re.compile(r"[0-9]*_[a-z0-9]*-[0-9]*") #nom des channels de raid
    
            for cCurrent in client.get_all_channels():
                if regex.match(cCurrent.name):
                    numRaid = int(cCurrent.name[0])
                    cRaidCurrent = cRaids[numRaid]
                    date = datetime.datetime.now()
                    print (cRaidCurrent.raid.fin.timestamp())
                    print (date.timestamp())
                    if cRaidCurrent.raid.fin < date:
                        if cRaidCurrent.retirerRaid():
                            cId = cRaidCurrent.com.id
                            await removeFromListe(cRaidCurrent)
                            await client.delete_channel(client.get_channel(cId))
                            cCurrent = 0
    

    有时它会通过,有时我会出现以下错误:

        for cCurrent in client.get_all_channels():
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/client.py", line 581,
     in get_all_channels
        for channel in server.channels:
    RuntimeError: dictionary changed size during iteration
    

    如果我明白了 client.get_all_channels 是一个字典,我无法在迭代过程中删除通道。。。所以问题是,我还有什么其他可能删除这些频道?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Pierrick Rambaud    6 年前

    谢谢 Patrick Haugh 为了找到完美的答案。

    最后,删除操作需要在2次内完成。如果有人需要,下面是代码:

    for cCurrent in client.get_all_channels():
        if regex.match(cCurrent.name):
            numRaid = getNumChannel(cCurrent.name)
            cRaidCurrent = cRaids[numRaid]
            now = datetime.datetime.now()
            if cRaidCurrent.raid.fin < now:
                toDelete.append(cRaidCurrent)
    
    for cRaidCurrent in toDelete:
        cId = cRaidCurrent.id
        cRaidCurrent.retirerRaid()
        await removeCRaid(cRaidCurrent)
        del cRaids[cId]