Привет, у меня проблема с этим простым маленьким модулем бота Python Discord. Всякий раз, когда я использую команду, кажется, что она возвращает 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 раза.
Редактировать:
Вот редактирование, которое я попытался вставить в свой код: проблема, с которой я сталкиваюсь - локальная переменная 'member', на которую ссылается перед присваиванием
@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!")