【发布时间】: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