hopefully fixed long punish/isolates not working, python event loops sug

This commit is contained in:
brandons209 2021-02-06 02:49:21 -05:00
parent 1cea09b55b
commit 3c5b7141a7
2 changed files with 26 additions and 17 deletions

View file

@ -843,6 +843,9 @@ class Isolate(commands.Cog):
async def on_load(self):
await self.bot.wait_until_ready()
_guilds = [g for g in self.bot.guilds if g.large and not (g.chunked or g.unavailable)]
await self.bot.request_offline_members(*_guilds)
for guild in self.bot.guilds:
me = guild.me
role = await self.get_role(guild, quiet=True, create=True)
@ -857,7 +860,7 @@ class Isolate(commands.Cog):
for member_id, data in isolated.items():
until = data["until"]
member = guild.get_member(member_id)
member = guild.get_member(int(member_id))
if until and (until - time.time()) < 0:
if member:
@ -868,7 +871,7 @@ class Isolate(commands.Cog):
await self._unisolate(member, reason=reason)
else: # member disappeared
del isolated[str(member_id)]
del isolated[member_id]
elif member:
# re-check roles
user_roles = set(member.roles)
@ -944,9 +947,9 @@ class Isolate(commands.Cog):
self.enqueued.add(args)
if diff < 0:
self.execute_queue_event(*args)
await self.execute_queue_event(0, *args)
elif run_at - time.time() < QUEUE_TIME_CUTOFF:
self.pending[args] = asyncio.get_event_loop().call_later(diff, self.execute_queue_event, *args)
self.pending[args] = asyncio.create_task(self.execute_queue_event(diff, *args))
else:
await self.queue.put((run_at, *args))
@ -961,16 +964,18 @@ class Isolate(commands.Cog):
diff = next_time - now
if diff < 0:
if self.execute_queue_event(*args):
if await self.execute_queue_event(0, *args):
return
elif diff < QUEUE_TIME_CUTOFF:
self.pending[args] = asyncio.get_event_loop().call_later(diff, self.execute_queue_event, *args)
self.pending[args] = asyncio.create_task(self.execute_queue_event(diff, *args))
return True
await self.queue.put(item)
return False
def execute_queue_event(self, *args) -> bool:
async def execute_queue_event(self, diff, *args) -> bool:
# delays then executes queue event
await asyncio.sleep(diff)
self.enqueued.discard(args)
try:

View file

@ -304,7 +304,7 @@ class Punish(commands.Cog):
[
"**Reason:** %s" % (data.get("reason") or "no reason set"),
"**Time remaining:** %s" % remaining,
"**Moderator**: %s" % (user.guild.get_member(data.get("by")) or "Missing ID#%s" % data.get("by")),
"**Moderator**: %s" % (user.guild.get_member(int(data.get("by"))) or "Missing ID#%s" % data.get("by")),
]
)
del punished[str(user.id)]
@ -502,7 +502,7 @@ class Punish(commands.Cog):
for member_id, member_data in punished.items():
member = guild.get_member(member_id)
member = guild.get_member(int(member_id))
if not member:
continue
@ -911,6 +911,9 @@ class Punish(commands.Cog):
async def on_load(self):
await self.bot.wait_until_ready()
_guilds = [g for g in self.bot.guilds if g.large and not (g.chunked or g.unavailable)]
await self.bot.request_offline_members(*_guilds)
for guild in self.bot.guilds:
me = guild.me
role = await self.get_role(guild, quiet=True, create=True)
@ -925,7 +928,7 @@ class Punish(commands.Cog):
for member_id, data in punished.items():
until = data["until"]
member = guild.get_member(member_id)
member = guild.get_member(int(member_id))
if until and (until - time.time()) < 0:
if member:
@ -1012,9 +1015,9 @@ class Punish(commands.Cog):
self.enqueued.add(args)
if diff < 0:
self.execute_queue_event(*args)
await self.execute_queue_event(0, *args)
elif run_at - time.time() < QUEUE_TIME_CUTOFF:
self.pending[args] = asyncio.get_event_loop().call_later(diff, self.execute_queue_event, *args)
self.pending[args] = asyncio.create_task(self.execute_queue_event(diff, *args))
else:
await self.queue.put((run_at, *args))
@ -1029,16 +1032,17 @@ class Punish(commands.Cog):
diff = next_time - now
if diff < 0:
if self.execute_queue_event(*args):
if await self.execute_queue_event(0, *args):
return
elif diff < QUEUE_TIME_CUTOFF:
self.pending[args] = asyncio.get_event_loop().call_later(diff, self.execute_queue_event, *args)
self.pending[args] = asyncio.create_task(self.execute_queue_event(diff, *args))
return True
await self.queue.put(item)
return False
def execute_queue_event(self, *args) -> bool:
async def execute_queue_event(self, diff, *args) -> bool:
await asyncio.sleep(diff)
self.enqueued.discard(args)
try:
@ -1286,7 +1290,7 @@ class Punish(commands.Cog):
if not guild:
return False
member = guild.get_member(member_id)
member = guild.get_member(int(member_id))
if member:
asyncio.create_task(self._unpunish(member))
@ -1327,7 +1331,7 @@ class Punish(commands.Cog):
if update and caseno:
until = member_data.get("until") or False
# fallback gracefully
moderator = moderator or guild.get_member(member_data.get("by")) or guild.me
moderator = moderator or guild.get_member(int(member_data.get("by"))) or guild.me
if until:
until = datetime.utcfromtimestamp(until).timestamp()