we do a little tracing

This commit is contained in:
AF 2022-11-04 09:10:18 +00:00
parent b05346fb95
commit ff7263b764
4 changed files with 43 additions and 11 deletions

View File

@ -2,6 +2,8 @@
FROM python:3.10
WORKDIR /v6
ENV v6root=/v6data
COPY base.requirements.txt base.requirements.txt
RUN pip install -r base.requirements.txt
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY v6d3vote v6d3vote

2
base.requirements.txt Normal file
View File

@ -0,0 +1,2 @@
aiohttp~=3.7.4.post0
discord.py~=1.7.3

View File

@ -1,4 +1,5 @@
aiohttp~=3.7.4.post0
discord.py~=1.7.3
git+https://gitea.parrrate.ru/PTV/v6d1tokens.git@c4c6cf43b1082c666e6891f73df825acee6ae86d
git+https://gitea.parrrate.ru/PTV/v6d2ctx.git@096314b9bbb6153a9a75afcc16ddf7833384df18
ptvp35 @ git+https://gitea.parrrate.ru/PTV/ptvp35.git@c9cdbf86a67eaf817baf0bc23e0440b54c070362
v6d0auth @ git+https://gitea.parrrate.ru/PTV/v6d0auth.git@c4b7a4900d36cb74b5aa544864cbbd3125415bb4
v6d1tokens @ git+https://gitea.parrrate.ru/PTV/v6d1tokens.git@22c9784d20d6d9d860d4f1c0da41254db17ab9a2
v6d2ctx @ git+https://gitea.parrrate.ru/PTV/v6d2ctx.git@2f0ac33c0228d43b9263ca31f584be2f96ad84eb
rainbowadn @ git+https://gitea.parrrate.ru/PTV/rainbowadn.git@add1e7cdbf817811d4b85baec63ed0b87ae96dae

View File

@ -1,6 +1,6 @@
import asyncio
import os
from typing import Optional
from typing import Optional, TypedDict
import discord
from ptvp35 import Db, KVJson
@ -8,6 +8,7 @@ from v6d1tokens.client import request_token
from v6d2ctx.context import Context, at, monitor, Explicit
from v6d2ctx.handle_content import handle_content
from v6d2ctx.lock_for import lock_for
from v6d2ctx.pain import ALog, SLog
from v6d2ctx.serve import serve
from v6d3vote.config import prefix, myroot
@ -48,6 +49,13 @@ async def help_(ctx: Context, args: list[str]) -> None:
await ctx.reply(f'help for {name}: `{name} help`')
class SavedPoll(TypedDict):
votes: dict[str, str]
emojis: dict[str, str]
options: list[str]
title: str
class Poll:
def __init__(
self,
@ -128,10 +136,10 @@ class Poll:
@classmethod
async def load(cls, message: discord.Message) -> Optional['Poll']:
saved: Optional[dict[str, dict[str, str] | list[str]]] = vote_db.get(message.id, None)
saved: Optional[SavedPoll] = vote_db.get(message.id, None)
if saved is None:
return None
# noinspection PyTypeChecker
assert message.guild is not None
guild: discord.Guild = message.guild
return cls(
message,
@ -143,11 +151,16 @@ class Poll:
@classmethod
async def global_vote(cls, rrae: discord.RawReactionActionEvent):
assert client.user is not None
if rrae.user_id == client.user.id:
return
assert rrae.guild_id is not None
assert rrae.channel_id is not None
guild: discord.Guild = client.get_guild(rrae.guild_id) or await client.fetch_guild(rrae.guild_id)
member: discord.Member = guild.get_member(rrae.user_id) or await guild.fetch_member(rrae.user_id)
channel: discord.TextChannel = guild.get_channel(rrae.channel_id)
_channel = guild.get_channel(rrae.channel_id)
assert isinstance(_channel, discord.TextChannel)
channel: discord.TextChannel = _channel
message: discord.Message = await channel.fetch_message(rrae.message_id)
if message.author != client.user:
return
@ -158,7 +171,7 @@ class Poll:
await poll.vote(member, rrae.emoji, rrae.event_type == 'REACTION_REMOVE')
await poll.save()
async def vote(self, member: discord.Member, emoji: discord.Emoji | str, remove: bool):
async def vote(self, member: discord.Member, emoji: discord.PartialEmoji | str, remove: bool):
if str(emoji) in self.reverse:
option = self.reverse[str(emoji)]
if remove:
@ -197,7 +210,7 @@ async def create_poll(ctx: Context, args: list[str]) -> None:
await ctx.reply('`poll emoji option [emoji option ...]` (reply fork)')
case []:
raise Explicit('no options')
case [*args] if ctx.message.reference is not None and ctx.message.reference.resolved is not None:
case [*args] if ctx.message.reference is not None and isinstance(ctx.message.reference.resolved, discord.Message):
refd: discord.Message = ctx.message.reference.resolved
poll = await Poll.load(refd)
if poll is None:
@ -228,7 +241,21 @@ async def main():
if os.getenv('v6monitor'):
loop.create_task(monitor())
await client.connect()
print('exited')
if __name__ == '__main__':
serve(main(), client, loop)
from contextlib import ExitStack
with ExitStack() as es:
ALog(client, 'connect').enter(es)
ALog(client, 'close').enter(es)
ALog(Db, '__aenter__').enter(es)
ALog(Db, '__aexit__').enter(es)
ALog(Db, 'aclose').enter(es)
ALog(Db, '_build_file').enter(es)
SLog(Db, '_build_file_sync').enter(es)
SLog(Db, '_finish_recovery_sync').enter(es)
SLog(Db, '_copy_sync').enter(es)
ALog(loop, 'run_in_executor').enter(es)
serve(main(), client, loop)
print('after serve')