better __all__

This commit is contained in:
AF 2022-12-28 07:51:20 +00:00
parent c135af4293
commit 02f6bc97de
4 changed files with 106 additions and 25 deletions

@ -1 +1 @@
Subproject commit e09f773881751bde0b1daba4d626d681026c9c55 Subproject commit 27c18118c58abecf4a91e4bcab41099a54afeb5b

View File

@ -1,5 +1,5 @@
ptvp35 @ git+https://gitea.parrrate.ru/PTV/ptvp35.git@87ba808c2af1be87f4fbb9d9b3b97ba748cb9fae ptvp35 @ git+https://gitea.parrrate.ru/PTV/ptvp35.git@e760fca39e2070b9959aeb95b53e59e895f1ad57
v6d0auth @ git+https://gitea.parrrate.ru/PTV/v6d0auth.git@324236f435c92756aefe22877a97a906c462ef2c v6d0auth @ git+https://gitea.parrrate.ru/PTV/v6d0auth.git@c718d4d1422945a756213d22d9e26aa24babe0f6
v6d1tokens @ git+https://gitea.parrrate.ru/PTV/v6d1tokens.git@96567a0cb0c3cb60f20647518df5370df6dc6664 v6d1tokens @ git+https://gitea.parrrate.ru/PTV/v6d1tokens.git@9ada50f111bd6e9a49c9c6683fa7504fee030056
v6d2ctx @ git+https://gitea.parrrate.ru/PTV/v6d2ctx.git@4a821aa168a83924934b2ab833d283226eb307bb v6d2ctx @ git+https://gitea.parrrate.ru/PTV/v6d2ctx.git@18001ff3403646db46f36175a824e571c5734fd6
rainbowadn @ git+https://gitea.parrrate.ru/PTV/rainbowadn.git@e9fba7b064902ceedee0dd5578cb47030665a6aa rainbowadn @ git+https://gitea.parrrate.ru/PTV/rainbowadn.git@fc1d11f4b53ac4653ffac1bbcad130855e1b7f10

View File

@ -2,6 +2,8 @@ import os
from v6d0auth.config import root from v6d0auth.config import root
__all__ = ('guild', 'emoji', 'role', 'message', 'channel', 'role_channel', 'myroot')
guild = int(os.getenv('v6guild', 541241763042689025)) guild = int(os.getenv('v6guild', 541241763042689025))
emoji = int(os.getenv('v6emoji', 586669134406877270)) emoji = int(os.getenv('v6emoji', 586669134406877270))
role = int(os.getenv('v6role', 643896112977018880)) role = int(os.getenv('v6role', 643896112977018880))

View File

@ -1,14 +1,15 @@
import asyncio import asyncio
import json
import re import re
from io import StringIO from io import StringIO
from pathlib import Path from pathlib import Path
from typing import Optional, Union from typing import AsyncIterable, Iterable, Optional, Union
import discord import discord
from ptvp35 import Db, KVJson from ptvp35 import *
from v6d1tokens.client import request_token from v6d1tokens.client import *
from v6d2ctx.serve import serve from v6d2ctx.serve import *
from v6d3losyash import config from v6d3losyash import config
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
@ -27,6 +28,7 @@ client = discord.Client(
) )
ESCAPED = '`_*\'"\\' ESCAPED = '`_*\'"\\'
nest_db = Db(config.myroot / 'nest.db', kvfactory=KVJson()) nest_db = Db(config.myroot / 'nest.db', kvfactory=KVJson())
spam_db = Db(config.myroot / 'spam.db', kvfactory=KVJson())
def escape(s: str): def escape(s: str):
@ -39,11 +41,14 @@ def escape(s: str):
class Spam: class Spam:
def __init__(self) -> None: def __init__(self, mode: str, channel: int) -> None:
self.spammed = False self.spammed = False
self.root = Path(__file__).parent / '../constitution' self.root = Path(__file__).parent / '../constitution'
self.path = self.root / f'{mode}.md'
self.channel = channel
self.lock = asyncio.Lock()
def format_segment(self, segment: str) -> str: def _format_segment(self, segment: str) -> str:
segment = re.sub( segment = re.sub(
r'\[[\d.xX]*?\]', r'\[[\d.xX]*?\]',
lambda m: f'\u001b[0;1;36m{m[0]}\u001b[0m', lambda m: f'\u001b[0;1;36m{m[0]}\u001b[0m',
@ -69,22 +74,85 @@ class Spam:
lambda m: f'\u001b[0;{m[1]}m{m[2]}\u001b[0m', lambda m: f'\u001b[0;{m[1]}m{m[2]}\u001b[0m',
segment, segment,
) )
return segment.strip() return segment
def ru_segments(self) -> list[str]: def format_segment(self, segment: str) -> tuple[str, list[discord.Embed], dict]:
return list(map(self.format_segment, (self.root / 'ru.md').read_text().split('=' * 80))) segment, *sflagsl = segment.split('+flags')
flags = {}
for sflags in sflagsl:
flags.update(json.loads(sflags))
segment, *esegments = segment.split('+embed')
segment = self._format_segment(segment)
embeds = []
for esegment in esegments:
ejson: dict = json.loads(esegment)
embed = discord.Embed(
colour=ejson.get('colour'),
title=ejson.get('title'),
type=ejson.get('type', 'rich'),
url=ejson.get('url'),
description=ejson.get('description'),
)
embeds.append(embed)
fjson: dict
for fjson in ejson.get('fields', []):
embed.add_field(name=fjson['name'], value=fjson['value'], inline=fjson.get('inline', False))
return segment.strip(), embeds, flags
async def spam(self) -> None: def _ru_segments(self) -> Iterable[tuple[str, list[discord.Embed], dict]]:
return map(self.format_segment, self.path.read_text().split('=' * 80))
async def _ru_segments_checked(self) -> AsyncIterable[tuple[str, list[discord.Embed], dict]]:
for i, (segment, embeds, flags) in enumerate(await asyncio.to_thread(self._ru_segments)):
match flags:
case {'fix': int() as fix}:
assert i == fix, (i, fix)
yield segment, embeds, flags
async def ru_segments(self) -> Iterable[tuple[str, list[discord.Embed], dict]]:
return [t async for t in self._ru_segments_checked()]
async def _spam(self) -> None:
if self.spammed: if self.spammed:
return return
try: try:
print('spamming') print('spamming')
guild = await client.fetch_guild(config.guild) guild = await client.fetch_guild(config.guild)
channel = await guild.fetch_channel(1056432869834240080) for role in await guild.fetch_roles():
print(role.colour, role)
channel = await guild.fetch_channel(self.channel)
assert isinstance(channel, discord.abc.Messageable) assert isinstance(channel, discord.abc.Messageable)
segments = await asyncio.to_thread(self.ru_segments)
for segment in segments: async def fetch(msid: int) -> discord.Message | None:
await channel.send(segment.strip()) try:
return await channel.fetch_message(msid)
except discord.NotFound:
return None
broken_order = False
for i, (segment, embeds, flags) in enumerate(await self.ru_segments()):
dbkey = (channel.id, i)
message = None
messageid: int | None
if (
(messageid := spam_db.get(dbkey, None)) is None
or
(message := await fetch(messageid)) is None
or broken_order
):
if broken_order and message is not None:
await message.delete()
message = await channel.send(content=segment.strip(), embeds=embeds)
await spam_db.set(dbkey, message.id)
broken_order = True
else:
await message.edit(content=segment.strip(), embeds=embeds)
emojiid: int
for emojiid in flags.get('emojis', []):
emoji = await guild.fetch_emoji(emojiid)
await message.add_reaction(emoji)
if (custom_key := flags.get('key', None)) is not None:
await spam_db.set(custom_key, message.id)
except: except:
from traceback import print_exc from traceback import print_exc
print_exc() print_exc()
@ -92,9 +160,14 @@ class Spam:
print('spammed') print('spammed')
self.spammed = True self.spammed = True
async def spam(self) -> None:
async with self.lock:
await self._spam()
lock = asyncio.Lock() lock = asyncio.Lock()
spam = Spam() spam_ru = Spam('ru', 1056432869834240080)
spam_en = Spam('en', 1057006937360842942)
@client.event @client.event
@ -103,10 +176,12 @@ async def on_ready():
await client.change_presence(activity=discord.Game( await client.change_presence(activity=discord.Game(
name='феноменально', name='феноменально',
)) ))
task = asyncio.create_task(spam.spam()) task_ru = asyncio.create_task(spam_ru.spam())
task_en = asyncio.create_task(spam_en.spam())
async with lock: async with lock:
await state.reload() await state.reload()
await task await task_ru
await task_en
class SimpleEmoji: class SimpleEmoji:
@ -321,7 +396,11 @@ async def on_raw_reaction_add(payload: discord.RawReactionActionEvent):
if payload.user_id == client.user.id: if payload.user_id == client.user.id:
return return
emoji: discord.PartialEmoji = payload.emoji emoji: discord.PartialEmoji = payload.emoji
if emoji.id == config.emoji and payload.message_id == config.message: if emoji.id == config.emoji and payload.message_id in [
config.message,
spam_db.get('jesus', 'not an id'),
spam_db.get('jensus', 'not an id'),
]:
await grant_citizenship(payload.user_id) await grant_citizenship(payload.user_id)
if payload.message_id in state.defrev: if payload.message_id in state.defrev:
await state.role_grant(payload.message_id, payload.user_id, SimpleEmoji.of(emoji)) await state.role_grant(payload.message_id, payload.user_id, SimpleEmoji.of(emoji))
@ -372,7 +451,7 @@ async def on_member_remove(member: discord.Member):
async def main(): async def main():
async with nest_db: async with nest_db, spam_db:
await client.login(token) await client.login(token)
await client.connect() await client.connect()