Merge remote-tracking branch 'origin/rewrite' into pillow

This commit is contained in:
2023-09-24 11:37:55 +03:00
4 changed files with 39 additions and 18 deletions

View File

@@ -10,6 +10,7 @@ from io import StringIO
from functools import wraps from functools import wraps
from contextvars import ContextVar from contextvars import ContextVar
import discord
from discord import Webhook, File from discord import Webhook, File
import aiohttp import aiohttp
@@ -304,6 +305,10 @@ class WebHookHandler(logging.StreamHandler):
self.webhook = Webhook.from_url(self.webhook_url, session=self.session) self.webhook = Webhook.from_url(self.webhook_url, session=self.session)
async def post(self, record): async def post(self, record):
if record.context == 'Webhook Logger':
# Don't livelog livelog errors
# Otherwise we recurse and Cloudflare hates us
return
log_context.set("Webhook Logger") log_context.set("Webhook Logger")
log_action_stack.set(("Logging",)) log_action_stack.set(("Logging",))
log_app.set(record.app) log_app.set(record.app)
@@ -371,7 +376,7 @@ class WebHookHandler(logging.StreamHandler):
except BucketFull: except BucketFull:
logger.warning( logger.warning(
"Can't keep up! " "Can't keep up! "
"Ignoring records on live-logger {self.webhook.id}." f"Ignoring records on live-logger {self.webhook.id}."
) )
self.ignored += 1 self.ignored += 1
return return
@@ -383,6 +388,7 @@ class WebHookHandler(logging.StreamHandler):
) )
self.ignored = 0 self.ignored = 0
try:
if as_file or len(message) > 1900: if as_file or len(message) > 1900:
with StringIO(message) as fp: with StringIO(message) as fp:
fp.seek(0) fp.seek(0)
@@ -393,6 +399,11 @@ class WebHookHandler(logging.StreamHandler):
) )
else: else:
await self.webhook.send(self.prefix + '\n' + message, username=log_app.get()) await self.webhook.send(self.prefix + '\n' + message, username=log_app.get())
except discord.HTTPException:
logger.exception(
"Live logger errored. Slowing down live logger."
)
self.bucket.fill()
handlers = [] handlers = []

View File

@@ -622,7 +622,7 @@ class RankCog(LionCog):
error = t(_p( error = t(_p(
'rank_refresh|error:unassignable_roles|desc', 'rank_refresh|error:unassignable_roles|desc',
"I have insufficient permissions to assign the following role(s):\n{roles}" "I have insufficient permissions to assign the following role(s):\n{roles}"
)).format(roles='\n'.join(role.mention for role in failing)), )).format(roles='\n'.join(role.mention for role in failing))
await ui.set_error(error) await ui.set_error(error)
return return
@@ -707,8 +707,8 @@ class RankCog(LionCog):
'rank_refresh|remove_roles|small_error', 'rank_refresh|remove_roles|small_error',
"*Could not remove ranks from {member}*" "*Could not remove ranks from {member}*"
)).format(member=to_remove[index][0].mention) )).format(member=to_remove[index][0].mention)
self.ui.errors.append(error) ui.errors.append(error)
if len(self.ui.errors) > 10: if len(ui.errors) > 10:
await ui.set_error( await ui.set_error(
t(_p( t(_p(
'rank_refresh|remove_roles|error:too_many_issues', 'rank_refresh|remove_roles|error:too_many_issues',
@@ -742,8 +742,8 @@ class RankCog(LionCog):
'rank_refresh|add_roles|small_error', 'rank_refresh|add_roles|small_error',
"*Could not add {role} to {member}*" "*Could not add {role} to {member}*"
)).format(member=to_add[index][0].mention, role=to_add[index][1].mention) )).format(member=to_add[index][0].mention, role=to_add[index][1].mention)
self.ui.errors.append(error) ui.errors.append(error)
if len(self.ui.errors) > 10: if len(ui.errors) > 10:
await ui.set_error( await ui.set_error(
t(_p( t(_p(
'rank_refresh|add_roles|error:too_many_issues', 'rank_refresh|add_roles|error:too_many_issues',

View File

@@ -24,6 +24,9 @@ _p = babel._p
class RankRefreshUI(MessageUI): class RankRefreshUI(MessageUI):
# Cache of live rank UIs, mainly for introspection
_running = set()
def __init__(self, bot: LionBot, guild: discord.Guild, **kwargs): def __init__(self, bot: LionBot, guild: discord.Guild, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
self.bot = bot self.bot = bot
@@ -66,6 +69,7 @@ class RankRefreshUI(MessageUI):
def start(self): def start(self):
self._loop_task = asyncio.create_task(self._refresh_loop(), name='Rank RefreshUI Monitor') self._loop_task = asyncio.create_task(self._refresh_loop(), name='Rank RefreshUI Monitor')
self._running.add(self)
async def run(self, *args, **kwargs): async def run(self, *args, **kwargs):
await super().run(*args, **kwargs) await super().run(*args, **kwargs)
@@ -74,6 +78,7 @@ class RankRefreshUI(MessageUI):
async def cleanup(self): async def cleanup(self):
if self._loop_task and not self._loop_task.done(): if self._loop_task and not self._loop_task.done():
self._loop_task.cancel() self._loop_task.cancel()
self._running.discard(self)
await super().cleanup() await super().cleanup()
def progress_bar(self, value, minimum, maximum, width=10) -> str: def progress_bar(self, value, minimum, maximum, width=10) -> str:
@@ -107,12 +112,13 @@ class RankRefreshUI(MessageUI):
# Join all the sections together and return # Join all the sections together and return
return ''.join(bar) return ''.join(bar)
@log_wrap('refresh ui loop') @log_wrap(action='refresh ui loop')
async def _refresh_loop(self): async def _refresh_loop(self):
while True: while True:
try: try:
await asyncio.sleep(1) await asyncio.sleep(5)
await self._wakeup.wait() await self._wakeup.wait()
self._wakeup.clear()
await self.refresh() await self.refresh()
except asyncio.CancelledError: except asyncio.CancelledError:
break break

View File

@@ -80,6 +80,10 @@ class Bucket:
self._last_full = False self._last_full = False
self._level += 1 self._level += 1
def fill(self):
self._leak()
self._level = max(self._level, self.max_level + 1)
async def wait(self): async def wait(self):
""" """
Wait until the bucket has room. Wait until the bucket has room.