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 FROM python:3.10
WORKDIR /v6 WORKDIR /v6
ENV v6root=/v6data ENV v6root=/v6data
COPY base.requirements.txt base.requirements.txt
RUN pip install -r base.requirements.txt
COPY requirements.txt requirements.txt COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt RUN pip install -r requirements.txt
COPY v6d3vote v6d3vote 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 ptvp35 @ git+https://gitea.parrrate.ru/PTV/ptvp35.git@c9cdbf86a67eaf817baf0bc23e0440b54c070362
discord.py~=1.7.3 v6d0auth @ git+https://gitea.parrrate.ru/PTV/v6d0auth.git@c4b7a4900d36cb74b5aa544864cbbd3125415bb4
git+https://gitea.parrrate.ru/PTV/v6d1tokens.git@c4c6cf43b1082c666e6891f73df825acee6ae86d v6d1tokens @ git+https://gitea.parrrate.ru/PTV/v6d1tokens.git@22c9784d20d6d9d860d4f1c0da41254db17ab9a2
git+https://gitea.parrrate.ru/PTV/v6d2ctx.git@096314b9bbb6153a9a75afcc16ddf7833384df18 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 asyncio
import os import os
from typing import Optional from typing import Optional, TypedDict
import discord import discord
from ptvp35 import Db, KVJson 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.context import Context, at, monitor, Explicit
from v6d2ctx.handle_content import handle_content from v6d2ctx.handle_content import handle_content
from v6d2ctx.lock_for import lock_for from v6d2ctx.lock_for import lock_for
from v6d2ctx.pain import ALog, SLog
from v6d2ctx.serve import serve from v6d2ctx.serve import serve
from v6d3vote.config import prefix, myroot 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`') 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: class Poll:
def __init__( def __init__(
self, self,
@ -128,10 +136,10 @@ class Poll:
@classmethod @classmethod
async def load(cls, message: discord.Message) -> Optional['Poll']: 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: if saved is None:
return None return None
# noinspection PyTypeChecker assert message.guild is not None
guild: discord.Guild = message.guild guild: discord.Guild = message.guild
return cls( return cls(
message, message,
@ -143,11 +151,16 @@ class Poll:
@classmethod @classmethod
async def global_vote(cls, rrae: discord.RawReactionActionEvent): async def global_vote(cls, rrae: discord.RawReactionActionEvent):
assert client.user is not None
if rrae.user_id == client.user.id: if rrae.user_id == client.user.id:
return 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) 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) 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) message: discord.Message = await channel.fetch_message(rrae.message_id)
if message.author != client.user: if message.author != client.user:
return return
@ -158,7 +171,7 @@ class Poll:
await poll.vote(member, rrae.emoji, rrae.event_type == 'REACTION_REMOVE') await poll.vote(member, rrae.emoji, rrae.event_type == 'REACTION_REMOVE')
await poll.save() 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: if str(emoji) in self.reverse:
option = self.reverse[str(emoji)] option = self.reverse[str(emoji)]
if remove: 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)') await ctx.reply('`poll emoji option [emoji option ...]` (reply fork)')
case []: case []:
raise Explicit('no options') 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 refd: discord.Message = ctx.message.reference.resolved
poll = await Poll.load(refd) poll = await Poll.load(refd)
if poll is None: if poll is None:
@ -228,7 +241,21 @@ async def main():
if os.getenv('v6monitor'): if os.getenv('v6monitor'):
loop.create_task(monitor()) loop.create_task(monitor())
await client.connect() await client.connect()
print('exited')
if __name__ == '__main__': if __name__ == '__main__':
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) serve(main(), client, loop)
print('after serve')