【问题标题】:Discord.py bot returning multiple messagesDiscord.py 机器人返回多条消息
【发布时间】:2018-09-05 03:08:35
【问题描述】:

您好,这个简单的小 Python 不和谐机器人模块有问题。每当我使用命令时,它似乎返回 4 或 5 个响应,即使它被编码为只返回一个。我忽略了一些东西,有一个简单的解决方法吗?

这是我正在使用的代码

import discord
import os
import logging as log
from datetime import datetime,timedelta
from discord.ext import commands
from discord import Forbidden, HTTPException

from .utils.dataIO import dataIO
from .utils import checks


import asyncio

class lurkout:
"""
add roles to new members after x amount of time
"""

def __init__(self, bot):
    self.bot = bot

@commands.command(pass_context=True, no_pm=True)
@checks.is_owner()
async def huntlurkers(self, ctx, *_):
    """Look for lurkers"""

    serverid = '465536300452151298'
    server = self.bot.get_server(serverid)

    for member in server.members:
        lurker_role = discord.utils.get(member.server.roles, name="Lurker")
        if lurker_role not in member.roles:
            await self.bot.say("No lurkers seen within the last 3 days.")
        else:
            await self.check_roles(serverid, member)
            await self.bot.say("Success! You have manually added the Lurker role to those who haven't received a members role in 3 days.")
            return


@commands.command(pass_context=True, no_pm=True)
@checks.is_owner()
async def kicklurkers(self, ctx, *_):
    """Mass kick lurkers"""

    serverid = '465536300452151298'
    server = self.bot.get_server(serverid)

    for member in server.members:
        lurker_role = discord.utils.get(member.server.roles, name="Lurker")
        if lurker_role not in member.roles:
            await self.bot.send_message("There are no lurkers to kick.")
        else:
            if lurker_role in member.roles:
                await self.check_lurkers(serverid, member)
                await self.bot.send_message("Kicked some lurkers :D.")
                return


async def check_roles(self, serverid, member: discord.Member, *_):

    serverid = '465536300452151298'
    server = self.bot.get_server(serverid)
    lurker_role = discord.utils.get(member.server.roles, name="Lurker")
    members_role = discord.utils.get(member.server.roles, name="Members")

    for member in server.members:
         if member.joined_at + timedelta(days=3) <= datetime.today():
            if members_role not in member.roles:    
                try:
                    await self.bot.add_roles(member, lurker_role)
                    log.info("[SUCCESS] Changing role of "+str(member)+" succeeded")
                except (Forbidden, HTTPException) as e:
                    log.info("[FAILURE] Changing role of "+str(member)+" failed")


async def check_lurkers(self, serverid, member: discord.Member, *_):

    serverid = '465536300452151298'
    server = self.bot.get_server(serverid)
    lurker_role = discord.utils.get(member.server.roles, name="Lurker")
    members_role = discord.utils.get(member.server.roles, name="Members")

    for member in list(self.bot.get_all_members()):
         if member.joined_at + timedelta(days=0) <= datetime.today():
            if lurker_role in member.roles:    
                try:
                    await self.bot.kick(member)
                    log.info("[SUCCESS] Changing role of "+str(member)+" succeeded")
                except (Forbidden, HTTPException) as e:
                    log.info("[FAILURE] Changing role of "+str(member)+" failed")


async def check_day(self):
    tomorrow = datetime.now()+timedelta(days=1)
    midnight = datetime(year=tomorrow.year, month=tomorrow.month, 
                    day=tomorrow.day, hour=0, minute=0, second=0)

    await asyncio.sleep((midnight - datetime.now()).seconds)
    print("About to start")
    while self is self.bot.get_cog("check_roles"):

        await self.autoaddrole_update()

        await asyncio.sleep(86400) # Wait 24 hours



def setup(bot):
    q = lurkout(bot)
    loop = asyncio.get_event_loop()
    loop.create_task(q.check_day())
    bot.add_cog(q)

使用async def huntlurkers(self, ctx, *_):async def kicklurkers(self, ctx, *_): 命令时问题仍然存在,await 语句返回大约 4 次。

编辑:

这是我尝试对代码进行的编辑,我得到的问题是在赋值之前引用了局部变量“成员”

@commands.command(pass_context=True, no_pm=True)
@checks.is_owner()
async def kicklurkers(self, ctx, *_):
    """Mass kick lurkers"""

    serverid = '465536300452151298'
    server = self.bot.get_server(serverid) # This could probably be ctx.message.server
    lurker_role = discord.utils.get(server.roles, name="Lurker")
    member_role = discord.utils.get(server.roles, name="Members")
    any_lurkers = False
    if member_role not in member.roles:
        for member in server.members:
            if lurker_role in member.roles:
                if member.joined_at + timedelta(days=3) <= datetime.today():
                    await self.bot.kick(member)
                    any_lurkers=True
            if any_lurkers:
                await self.bot.say("Kicked all lurkers!")
            else:
                await self.bot.say("No lurkers to kick!")

【问题讨论】:

  • 你的 if member_role not in member.roles 检查应该在 for 循环内,if any_lurkers: 检查应该在 for 循环外

标签: python discord discord.py


【解决方案1】:

您的命令会遍历服务器的成员。 对于每个成员,如果他们不是潜伏者,则发送消息。如果他们是潜伏者,你对那个成员做一些事情,然后停止处理。从您发送的消息来看,您似乎希望处理所有用户,然后根据您是否发现任何潜伏者来打印两条消息之一。

@commands.command(pass_context=True, no_pm=True)
@checks.is_owner()
async def kicklurkers(self, ctx, *_):
    """Mass kick lurkers"""

    serverid = '465536300452151298'
    server = self.bot.get_server(serverid) # This could probably be ctx.message.server
    lurker_role = discord.utils.get(server.roles, name="Lurker")
    member_role = discord.utils.get(server.roles, name="Members")
    any_lurkers = False
    for member in server.members:
        if member_role not in member.roles and lurker_role in member.roles:
            if member.joined_at + timedelta(days=3) <= datetime.today():
                await self.bot.kick(member)
                any_lurkers=True
    if any_lurkers:
        await self.bot.say("Kicked all lurkers!")
    else:
        await self.bot.say("No lurkers to kick!")

我不明白你的 check_lurkers 协程试图完成什么。是检查特定的Member 是否是潜伏者,将所有潜伏者踢出服务器,还是改变角色?

【讨论】:

  • check_lurkers 协程试图在应用 lurker 角色之前完成成员在服务器上的时间。 :)
  • 那么你为什么在kicklurkers 中调用它,为什么它会遍历机器人可以看到的所有成员?
  • 嘿@PatrickHaugh 感谢您的回复我已经对您的回答进行了编辑,显示了我是如何尝试实现这个问题的,我想做以下任务:在他们之后踢用户已加入服务器,但检查他们是否拥有 member_role 并检查他们是否确实拥有 lurker_role。在我的编辑中,我收到错误 local variable 'member' referenced before assignment 但是定义为 member_role 但我不想将其添加为签名,否则会在命令后给我一个
  • @ShanJameson 我已经编辑了我的答案,以反映您应该对新代码进行的更改。
  • 谢谢你 我遇到了一个问题RuntimeError: dictionary changed size during iteration 你会建议for member in list(self.bot.get_all_members()): 还是会发送太多等待?
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多