we do a little tracing
This commit is contained in:
parent
b05346fb95
commit
ff7263b764
@ -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
2
base.requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
aiohttp~=3.7.4.post0
|
||||||
|
discord.py~=1.7.3
|
@ -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
|
||||||
|
@ -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__':
|
||||||
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')
|
||||||
|
Loading…
Reference in New Issue
Block a user