python - Discord.py 机器人返回多条消息
问题描述
嗨,这个简单的小 python discord bot 模块有问题。每当我使用命令时,它似乎会返回 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!")
解决方案
您的命令会遍历服务器的成员。对于每个成员,如果他们不是潜伏者,您发送消息。如果他们是潜伏者,你对那个成员做一些事情,然后停止处理。从您发送的消息中,您似乎希望处理所有用户,然后根据您是否发现任何潜伏者来打印两条消息之一。
@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
是否是一个潜伏者,从服务器中踢出所有的潜伏者,还是改变他们的角色?
推荐阅读
- node.js - Node-soap - 添加具有多个命名空间的标头
- python - 结果立即消失-python中的SNAP
- python - FuzzyWuzzy 错误:警告:根:应用处理器将输入查询减少为空字符串,所有比较的分数都为 0。[查询:'/']
- java - 如何在 Java 应用程序中联系没有证书的 ssl 安全 Web 服务?
- algorithm - 以紧凑的方式对带有后缀或前缀的数字进行编码
- python - 如何找到两个不同比例和大小的图像之间的差异?
- batch-file - 通过批处理文件 (.bat) 编译 Inno Setup 项目
- javascript - Javascript提示保存到c#中的变量,单击相同的按钮
- php - 我的 wordpress 简码不起作用并输出“未知”
- sorting - Woocommerce / 按价格对相关产品进行排序