commit
09072071ca
@ -15,12 +15,3 @@ repos:
|
||||
rev: 5.10.1
|
||||
hooks:
|
||||
- id: isort
|
||||
|
||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||
rev: v0.942
|
||||
hooks:
|
||||
- id: mypy
|
||||
additional_dependencies:
|
||||
- types-requests
|
||||
- types-setuptools
|
||||
- types-toml
|
||||
|
@ -20,10 +20,10 @@ class ChatManager:
|
||||
channel=self.channel, uid=ChatID("__error_chat__"), name="Chat Missing"
|
||||
)
|
||||
|
||||
def build_efb_chat_as_private(self, context):
|
||||
async def build_efb_chat_as_private(self, context):
|
||||
uid = context["user_id"]
|
||||
if "sender" not in context or "nickname" not in context["sender"]:
|
||||
i: dict = self.channel.QQClient.get_stranger_info(uid)
|
||||
i: dict = await self.channel.QQClient.get_stranger_info(uid)
|
||||
chat_name = ""
|
||||
if i:
|
||||
chat_name = i["nickname"]
|
||||
@ -37,13 +37,13 @@ class ChatManager:
|
||||
)
|
||||
return efb_chat
|
||||
|
||||
def build_or_get_efb_member(self, chat: Chat, context):
|
||||
async def build_or_get_efb_member(self, chat: Chat, context):
|
||||
member_uid = context["user_id"]
|
||||
with contextlib.suppress(KeyError):
|
||||
return chat.get_member(str(member_uid))
|
||||
chat_name = ""
|
||||
if "nickname" not in context:
|
||||
i: dict = self.channel.QQClient.get_stranger_info(member_uid)
|
||||
i: dict = await self.channel.QQClient.get_stranger_info(member_uid)
|
||||
chat_name = ""
|
||||
if i:
|
||||
chat_name = i["nickname"]
|
||||
@ -55,20 +55,20 @@ class ChatManager:
|
||||
uid=str(member_uid),
|
||||
)
|
||||
|
||||
def build_efb_chat_as_group(self, context, update_member=False): # Should be cached
|
||||
async def build_efb_chat_as_group(self, context, update_member=False): # Should be cached
|
||||
is_discuss = False if context["message_type"] == "group" else True
|
||||
chat_uid = context["discuss_id"] if is_discuss else context["group_id"]
|
||||
efb_chat = GroupChat(channel=self.channel, uid=str(chat_uid))
|
||||
if not is_discuss:
|
||||
efb_chat.uid = "group" + "_" + str(chat_uid)
|
||||
i = self.channel.QQClient.get_group_info(chat_uid)
|
||||
i = await self.channel.QQClient.get_group_info(chat_uid)
|
||||
if i is not None:
|
||||
efb_chat.name = str(i["group_name"]) if "group_name" not in context else str(context["group_name"])
|
||||
else:
|
||||
efb_chat.name = str(chat_uid)
|
||||
efb_chat.vendor_specific = {"is_discuss": False}
|
||||
if update_member:
|
||||
members = self.channel.QQClient.get_group_member_list(chat_uid, False)
|
||||
members = await self.channel.QQClient.get_group_member_list(chat_uid, False)
|
||||
if members:
|
||||
for member in members:
|
||||
efb_chat.add_member(
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,4 @@
|
||||
import asyncio
|
||||
import base64
|
||||
import html
|
||||
import json
|
||||
@ -218,14 +219,14 @@ class QQMsgProcessor:
|
||||
else:
|
||||
return self.qq_text_simple_wrapper(text, at_list)
|
||||
except Exception:
|
||||
return self.qq_group_broadcast_alternative_wrapper(data, chat)
|
||||
return asyncio.run(self.qq_group_broadcast_alternative_wrapper(data, chat))
|
||||
|
||||
def qq_group_broadcast_alternative_wrapper(self, data, chat: Chat):
|
||||
async def qq_group_broadcast_alternative_wrapper(self, data, chat: Chat):
|
||||
try:
|
||||
at_list = {}
|
||||
content_data = json.loads(data["content"])
|
||||
group_id = content_data["mannounce"]["gc"]
|
||||
notice_raw_data = self.inst.coolq_api_query("_get_group_notice", group_id=group_id)
|
||||
notice_raw_data = await self.inst.coolq_api_query("_get_group_notice", group_id=group_id)
|
||||
notice_data = json.loads(notice_raw_data)
|
||||
title_data = html.unescape(notice_data[0]["msg"]["title"])
|
||||
text_data = html.unescape(notice_data[0]["msg"]["text"])
|
||||
|
@ -1,14 +1,13 @@
|
||||
import logging
|
||||
import tempfile
|
||||
import urllib.request
|
||||
from gettext import translation
|
||||
from typing import IO, Optional
|
||||
from urllib.error import ContentTooShortError, HTTPError, URLError
|
||||
|
||||
import pilk
|
||||
import pydub
|
||||
import requests
|
||||
from ehforwarderbot import Message, coordinator
|
||||
from pkg_resources import resource_filename
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# created by JogleLew and jqqqqqqqqqq, optimized based on Tim's emoji support, updated by xzsk2 to mobileqq v8.8.11
|
||||
qq_emoji_list = {
|
||||
@ -640,34 +639,30 @@ qq_sface_list = {
|
||||
39: "[赞]",
|
||||
40: "[眨眼]",
|
||||
}
|
||||
translator = translation(
|
||||
"efb_qq_slave",
|
||||
resource_filename("efb_qq_slave", "Clients/CoolQ/locale"),
|
||||
fallback=True,
|
||||
)
|
||||
_ = translator.gettext
|
||||
ngettext = translator.ngettext
|
||||
|
||||
|
||||
def cq_get_image(image_link: str) -> Optional[IO]: # Download image from QQ
|
||||
file = tempfile.NamedTemporaryFile()
|
||||
try:
|
||||
urllib.request.urlretrieve(image_link, file.name)
|
||||
except (URLError, HTTPError, ContentTooShortError) as e:
|
||||
logging.getLogger(__name__).warning("Image download failed.")
|
||||
logging.getLogger(__name__).warning(str(e))
|
||||
return None
|
||||
else:
|
||||
resp = requests.get(image_link)
|
||||
file = tempfile.NamedTemporaryFile()
|
||||
file.write(resp.content)
|
||||
if file.seek(0, 2) <= 0:
|
||||
raise EOFError("File downloaded is Empty")
|
||||
file.seek(0)
|
||||
return file
|
||||
except Exception as e:
|
||||
file.close()
|
||||
logger.warning("File download failed.")
|
||||
logger.warning(str(e))
|
||||
return None
|
||||
return file
|
||||
|
||||
|
||||
def async_send_messages_to_master(msg: Message):
|
||||
coordinator.send_message(msg)
|
||||
if msg.file:
|
||||
msg.file.close()
|
||||
try:
|
||||
coordinator.send_message(msg)
|
||||
finally:
|
||||
if msg.file:
|
||||
msg.file.close()
|
||||
|
||||
|
||||
def process_quote_text(text, max_length): # Simple wrapper for processing quoted text
|
||||
@ -708,81 +703,76 @@ def param_spliter(str_param):
|
||||
|
||||
|
||||
def download_file(download_url):
|
||||
file = tempfile.NamedTemporaryFile()
|
||||
try:
|
||||
opener = urllib.request.build_opener()
|
||||
urllib.request.install_opener(opener)
|
||||
urllib.request.urlretrieve(download_url, file.name)
|
||||
except (URLError, HTTPError, ContentTooShortError) as e:
|
||||
logging.getLogger(__name__).warning("Error occurs when downloading files: " + str(e))
|
||||
return _("Error occurs when downloading files: ") + str(e)
|
||||
else:
|
||||
resp = requests.get(download_url)
|
||||
file = tempfile.NamedTemporaryFile()
|
||||
file.write(resp.content)
|
||||
if file.seek(0, 2) <= 0:
|
||||
raise EOFError("File downloaded is Empty")
|
||||
file.seek(0)
|
||||
return file
|
||||
except Exception as e:
|
||||
file.close()
|
||||
logger.warning("Error occurs when downloading files: " + str(e))
|
||||
return ("Error occurs when downloading files: ") + str(e)
|
||||
return file
|
||||
|
||||
|
||||
def download_user_avatar(uid: str):
|
||||
file = tempfile.NamedTemporaryFile()
|
||||
url = "https://q1.qlogo.cn/g?b=qq&nk={}&s=0".format(uid)
|
||||
try:
|
||||
opener = urllib.request.build_opener()
|
||||
urllib.request.install_opener(opener)
|
||||
urllib.request.urlretrieve(url, file.name)
|
||||
except (URLError, HTTPError, ContentTooShortError) as e:
|
||||
logging.getLogger(__name__).warning("Error occurs when downloading files: " + str(e))
|
||||
return _("Error occurs when downloading files: ") + str(e)
|
||||
if file.seek(0, 2) <= 0:
|
||||
raise EOFError("File downloaded is Empty")
|
||||
file.seek(0)
|
||||
resp = requests.get(url)
|
||||
file = tempfile.NamedTemporaryFile()
|
||||
file.write(resp.content)
|
||||
if file.seek(0, 2) <= 0:
|
||||
raise EOFError("File downloaded is Empty")
|
||||
file.seek(0)
|
||||
except Exception as e:
|
||||
file.close()
|
||||
logger.warning("Error occurs when downloading files: " + str(e))
|
||||
raise
|
||||
return file
|
||||
|
||||
|
||||
def download_group_avatar(uid: str):
|
||||
file = tempfile.NamedTemporaryFile()
|
||||
url = "https://p.qlogo.cn/gh/{}/{}/".format(uid, uid)
|
||||
try:
|
||||
opener = urllib.request.build_opener()
|
||||
urllib.request.install_opener(opener)
|
||||
urllib.request.urlretrieve(url, file.name)
|
||||
except (URLError, HTTPError, ContentTooShortError) as e:
|
||||
logging.getLogger(__name__).warning("Error occurs when downloading files: " + str(e))
|
||||
return _("Error occurs when downloading files: ") + str(e)
|
||||
if file.seek(0, 2) <= 0:
|
||||
raise EOFError("File downloaded is Empty")
|
||||
file.seek(0)
|
||||
resp = requests.get(url)
|
||||
file = tempfile.NamedTemporaryFile()
|
||||
file.write(resp.content)
|
||||
if file.seek(0, 2) <= 0:
|
||||
raise EOFError("File downloaded is Empty")
|
||||
file.seek(0)
|
||||
except Exception as e:
|
||||
file.close()
|
||||
logger.warning("Error occurs when downloading files: " + str(e))
|
||||
raise
|
||||
return file
|
||||
|
||||
|
||||
def download_voice(voice_url: str):
|
||||
origin_file = tempfile.NamedTemporaryFile()
|
||||
try:
|
||||
opener = urllib.request.build_opener()
|
||||
urllib.request.install_opener(opener)
|
||||
urllib.request.urlretrieve(voice_url, origin_file.name)
|
||||
resp = requests.get(voice_url)
|
||||
origin_file = tempfile.NamedTemporaryFile()
|
||||
origin_file.write(resp.content)
|
||||
if origin_file.seek(0, 2) <= 0:
|
||||
raise EOFError("File downloaded is Empty")
|
||||
origin_file.seek(0)
|
||||
silk_header = origin_file.read(10)
|
||||
origin_file.seek(0)
|
||||
if b"#!SILK_V3" in silk_header:
|
||||
with tempfile.NamedTemporaryFile() as pcm_file:
|
||||
pilk.decode(origin_file.name, pcm_file.name)
|
||||
audio_file = tempfile.NamedTemporaryFile()
|
||||
pydub.AudioSegment.from_raw(file=pcm_file, sample_width=2, frame_rate=24000, channels=1).export(
|
||||
audio_file, format="ogg", codec="libopus", parameters=["-vbr", "on"]
|
||||
)
|
||||
else:
|
||||
audio_file = origin_file
|
||||
except Exception as e:
|
||||
logging.getLogger(__name__).warning("Error occurs when downloading files: " + str(e))
|
||||
origin_file.close()
|
||||
raise e
|
||||
finally:
|
||||
opener.close()
|
||||
if origin_file.seek(0, 2) <= 0:
|
||||
origin_file.close()
|
||||
raise EOFError("File downloaded is Empty")
|
||||
origin_file.seek(0)
|
||||
silk_header = origin_file.read(10)
|
||||
origin_file.seek(0)
|
||||
if b"#!SILK_V3" in silk_header:
|
||||
with tempfile.NamedTemporaryFile() as pcm_file:
|
||||
pilk.decode(origin_file.name, pcm_file.name)
|
||||
origin_file.close()
|
||||
audio_file = tempfile.NamedTemporaryFile()
|
||||
pydub.AudioSegment.from_raw(file=pcm_file, sample_width=2, frame_rate=24000, channels=1).export(
|
||||
audio_file, format="ogg", codec="libopus", parameters=["-vbr", "on"]
|
||||
)
|
||||
else:
|
||||
audio_file = origin_file
|
||||
audio_file.close()
|
||||
logger.warning("Error occurs when downloading files: " + str(e))
|
||||
raise
|
||||
return audio_file
|
||||
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
from . import GoCQHttp # noqa: F401
|
||||
|
||||
__version__ = "2.2.3"
|
||||
__version__ = "3.0.0"
|
||||
|
228
pdm.lock
228
pdm.lock
@ -1,3 +1,30 @@
|
||||
[[package]]
|
||||
name = "aiocqhttp"
|
||||
version = "1.4.3"
|
||||
requires_python = ">=3.7"
|
||||
summary = "A Python SDK with async I/O for OneBot (CQHTTP)."
|
||||
dependencies = [
|
||||
"Quart<1.0,>=0.17",
|
||||
"httpx<1.0,>=0.11",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "aiofiles"
|
||||
version = "0.8.0"
|
||||
requires_python = ">=3.6,<4.0"
|
||||
summary = "File support for asyncio."
|
||||
|
||||
[[package]]
|
||||
name = "anyio"
|
||||
version = "3.5.0"
|
||||
requires_python = ">=3.6.2"
|
||||
summary = "High level compatibility layer for multiple asynchronous event loop implementations"
|
||||
dependencies = [
|
||||
"idna>=2.8",
|
||||
"sniffio>=1.1",
|
||||
"typing-extensions; python_version < \"3.8\"",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "apscheduler"
|
||||
version = "3.6.3"
|
||||
@ -15,6 +42,11 @@ version = "0.2.1"
|
||||
requires_python = ">=3.6"
|
||||
summary = "Backport of the standard library zoneinfo module"
|
||||
|
||||
[[package]]
|
||||
name = "blinker"
|
||||
version = "1.4"
|
||||
summary = "Fast, simple object-to-object and broadcast signaling"
|
||||
|
||||
[[package]]
|
||||
name = "bullet"
|
||||
version = "2.2.0"
|
||||
@ -171,6 +203,53 @@ version = "0.18.2"
|
||||
requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
summary = "Clean single-source support for Python 3 and 2"
|
||||
|
||||
[[package]]
|
||||
name = "h11"
|
||||
version = "0.12.0"
|
||||
requires_python = ">=3.6"
|
||||
summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "4.1.0"
|
||||
requires_python = ">=3.6.1"
|
||||
summary = "HTTP/2 State-Machine based protocol implementation"
|
||||
dependencies = [
|
||||
"hpack<5,>=4.0",
|
||||
"hyperframe<7,>=6.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hpack"
|
||||
version = "4.0.0"
|
||||
requires_python = ">=3.6.1"
|
||||
summary = "Pure-Python HPACK header compression"
|
||||
|
||||
[[package]]
|
||||
name = "httpcore"
|
||||
version = "0.14.7"
|
||||
requires_python = ">=3.6"
|
||||
summary = "A minimal low-level HTTP client."
|
||||
dependencies = [
|
||||
"anyio==3.*",
|
||||
"certifi",
|
||||
"h11<0.13,>=0.11",
|
||||
"sniffio==1.*",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "httpx"
|
||||
version = "0.22.0"
|
||||
requires_python = ">=3.6"
|
||||
summary = "The next generation HTTP client."
|
||||
dependencies = [
|
||||
"certifi",
|
||||
"charset-normalizer",
|
||||
"httpcore<0.15.0,>=0.14.5",
|
||||
"rfc3986[idna2008]<2,>=1.3",
|
||||
"sniffio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "humanize"
|
||||
version = "4.0.0"
|
||||
@ -180,6 +259,26 @@ dependencies = [
|
||||
"importlib-metadata; python_version < \"3.8\"",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hypercorn"
|
||||
version = "0.13.2"
|
||||
requires_python = ">=3.7"
|
||||
summary = "A ASGI Server based on Hyper libraries and inspired by Gunicorn"
|
||||
dependencies = [
|
||||
"h11",
|
||||
"h2>=3.1.0",
|
||||
"priority",
|
||||
"toml",
|
||||
"typing-extensions>=3.7.4; python_version < \"3.8\"",
|
||||
"wsproto>=0.14.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyperframe"
|
||||
version = "6.0.1"
|
||||
requires_python = ">=3.6.1"
|
||||
summary = "HTTP/2 framing layer for Python"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "3.3"
|
||||
@ -308,6 +407,12 @@ dependencies = [
|
||||
"tempora>=1.8",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "priority"
|
||||
version = "2.0.0"
|
||||
requires_python = ">=3.6.1"
|
||||
summary = "A pure-Python implementation of the HTTP/2 priority tree"
|
||||
|
||||
[[package]]
|
||||
name = "pydub"
|
||||
version = "0.25.1"
|
||||
@ -358,6 +463,25 @@ version = "6.0"
|
||||
requires_python = ">=3.6"
|
||||
summary = "YAML parser and emitter for Python"
|
||||
|
||||
[[package]]
|
||||
name = "quart"
|
||||
version = "0.17.0"
|
||||
requires_python = ">=3.7"
|
||||
summary = "A Python ASGI web microframework with the same API as Flask"
|
||||
dependencies = [
|
||||
"aiofiles",
|
||||
"blinker",
|
||||
"click",
|
||||
"hypercorn>=0.11.2",
|
||||
"importlib-metadata; python_version < \"3.8\"",
|
||||
"itsdangerous",
|
||||
"jinja2",
|
||||
"markupsafe",
|
||||
"toml",
|
||||
"typing-extensions; python_version < \"3.8\"",
|
||||
"werkzeug>=2.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "requests"
|
||||
version = "2.27.1"
|
||||
@ -378,6 +502,21 @@ dependencies = [
|
||||
"six>=1.7.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rfc3986"
|
||||
version = "1.5.0"
|
||||
summary = "Validating URI References per RFC 3986"
|
||||
|
||||
[[package]]
|
||||
name = "rfc3986"
|
||||
version = "1.5.0"
|
||||
extras = ["idna2008"]
|
||||
summary = "Validating URI References per RFC 3986"
|
||||
dependencies = [
|
||||
"idna",
|
||||
"rfc3986<2,>=1.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ruamel.yaml"
|
||||
version = "0.17.20"
|
||||
@ -405,6 +544,12 @@ version = "1.16.0"
|
||||
requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
summary = "Python 2 and 3 compatibility utilities"
|
||||
|
||||
[[package]]
|
||||
name = "sniffio"
|
||||
version = "1.2.0"
|
||||
requires_python = ">=3.5"
|
||||
summary = "Sniff out which async library your code is running under"
|
||||
|
||||
[[package]]
|
||||
name = "tempora"
|
||||
version = "5.0.1"
|
||||
@ -415,6 +560,12 @@ dependencies = [
|
||||
"pytz",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.10.2"
|
||||
requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
summary = "Python Library for Tom's Obvious, Minimal Language"
|
||||
|
||||
[[package]]
|
||||
name = "tornado"
|
||||
version = "6.1"
|
||||
@ -456,6 +607,15 @@ version = "2.0.2"
|
||||
requires_python = ">=3.6"
|
||||
summary = "The comprehensive WSGI web application library."
|
||||
|
||||
[[package]]
|
||||
name = "wsproto"
|
||||
version = "1.1.0"
|
||||
requires_python = ">=3.7.0"
|
||||
summary = "WebSockets state-machine based protocol implementation"
|
||||
dependencies = [
|
||||
"h11<1,>=0.9.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zc.lockfile"
|
||||
version = "2.0"
|
||||
@ -472,9 +632,20 @@ summary = "Backport of pathlib-compatible object wrapper for zip files"
|
||||
|
||||
[metadata]
|
||||
lock_version = "3.1"
|
||||
content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c274b984cc"
|
||||
content_hash = "sha256:31a92e98cb57c2c24915316aca43a1756ad1d0ad8d5ffdd78631463724d61bd5"
|
||||
|
||||
[metadata.files]
|
||||
"aiocqhttp 1.4.3" = [
|
||||
{file = "aiocqhttp-1.4.3.tar.gz", hash = "sha256:197de394f97b798515d643814660a41d5ec470bd0b0608682d1e4b553e486768"},
|
||||
]
|
||||
"aiofiles 0.8.0" = [
|
||||
{file = "aiofiles-0.8.0-py3-none-any.whl", hash = "sha256:7a973fc22b29e9962d0897805ace5856e6a566ab1f0c8e5c91ff6c866519c937"},
|
||||
{file = "aiofiles-0.8.0.tar.gz", hash = "sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59"},
|
||||
]
|
||||
"anyio 3.5.0" = [
|
||||
{file = "anyio-3.5.0-py3-none-any.whl", hash = "sha256:b5fa16c5ff93fa1046f2eeb5bbff2dad4d3514d6cda61d02816dba34fa8c3c2e"},
|
||||
{file = "anyio-3.5.0.tar.gz", hash = "sha256:a0aeffe2fb1fdf374a8e4b471444f0f3ac4fb9f5a5b542b48824475e0042a5a6"},
|
||||
]
|
||||
"apscheduler 3.6.3" = [
|
||||
{file = "APScheduler-3.6.3-py2.py3-none-any.whl", hash = "sha256:e8b1ecdb4c7cb2818913f766d5898183c7cb8936680710a4d3a966e02262e526"},
|
||||
{file = "APScheduler-3.6.3.tar.gz", hash = "sha256:3bb5229eed6fbbdafc13ce962712ae66e175aa214c69bed35a06bffcf0c5e244"},
|
||||
@ -497,6 +668,9 @@ content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c27
|
||||
{file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"},
|
||||
{file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"},
|
||||
]
|
||||
"blinker 1.4" = [
|
||||
{file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"},
|
||||
]
|
||||
"bullet 2.2.0" = [
|
||||
{file = "bullet-2.2.0-py3-none-any.whl", hash = "sha256:d22528deb914ce3ff20a4a000fa5ba37179697f384a0748f90691de8a74cf006"},
|
||||
{file = "bullet-2.2.0.tar.gz", hash = "sha256:dfa0fa81810ad1a9e688815ca04f24af87ff5cdbe803b42fa634b1f50fc9d887"},
|
||||
@ -555,10 +729,38 @@ content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c27
|
||||
"future 0.18.2" = [
|
||||
{file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"},
|
||||
]
|
||||
"h11 0.12.0" = [
|
||||
{file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"},
|
||||
{file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"},
|
||||
]
|
||||
"h2 4.1.0" = [
|
||||
{file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"},
|
||||
{file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"},
|
||||
]
|
||||
"hpack 4.0.0" = [
|
||||
{file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"},
|
||||
{file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"},
|
||||
]
|
||||
"httpcore 0.14.7" = [
|
||||
{file = "httpcore-0.14.7-py3-none-any.whl", hash = "sha256:47d772f754359e56dd9d892d9593b6f9870a37aeb8ba51e9a88b09b3d68cfade"},
|
||||
{file = "httpcore-0.14.7.tar.gz", hash = "sha256:7503ec1c0f559066e7e39bc4003fd2ce023d01cf51793e3c173b864eb456ead1"},
|
||||
]
|
||||
"httpx 0.22.0" = [
|
||||
{file = "httpx-0.22.0-py3-none-any.whl", hash = "sha256:e35e83d1d2b9b2a609ef367cc4c1e66fd80b750348b20cc9e19d1952fc2ca3f6"},
|
||||
{file = "httpx-0.22.0.tar.gz", hash = "sha256:d8e778f76d9bbd46af49e7f062467e3157a5a3d2ae4876a4bbfd8a51ed9c9cb4"},
|
||||
]
|
||||
"humanize 4.0.0" = [
|
||||
{file = "humanize-4.0.0-py3-none-any.whl", hash = "sha256:8d86333b8557dacffd4dce1dbe09c81c189e2caf7bb17a970b2212f0f58f10f2"},
|
||||
{file = "humanize-4.0.0.tar.gz", hash = "sha256:ee1f872fdfc7d2ef4a28d4f80ddde9f96d36955b5d6b0dac4bdeb99502bddb00"},
|
||||
]
|
||||
"hypercorn 0.13.2" = [
|
||||
{file = "Hypercorn-0.13.2-py3-none-any.whl", hash = "sha256:ca18f91ab3fa823cbe9e949738f9f2cc07027cd647c80d8f93e4b1a2a175f112"},
|
||||
{file = "Hypercorn-0.13.2.tar.gz", hash = "sha256:6307be5cbdf6ba411967d4661202dc4f79bd511b5d318bc4eed88b09418427f8"},
|
||||
]
|
||||
"hyperframe 6.0.1" = [
|
||||
{file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"},
|
||||
{file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"},
|
||||
]
|
||||
"idna 3.3" = [
|
||||
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
||||
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
||||
@ -730,6 +932,10 @@ content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c27
|
||||
{file = "portend-3.1.0-py3-none-any.whl", hash = "sha256:9e735cee3a5c1961f09e3f3ba6dc498198c2d70b473d98d0d1504b8d1e7a3d61"},
|
||||
{file = "portend-3.1.0.tar.gz", hash = "sha256:239e3116045ea823f6df87d6168107ad75ccc0590e37242af0cc1e98c5d224e4"},
|
||||
]
|
||||
"priority 2.0.0" = [
|
||||
{file = "priority-2.0.0-py3-none-any.whl", hash = "sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa"},
|
||||
{file = "priority-2.0.0.tar.gz", hash = "sha256:c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0"},
|
||||
]
|
||||
"pydub 0.25.1" = [
|
||||
{file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"},
|
||||
{file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"},
|
||||
@ -799,6 +1005,10 @@ content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c27
|
||||
{file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
|
||||
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
|
||||
]
|
||||
"quart 0.17.0" = [
|
||||
{file = "Quart-0.17.0-py3-none-any.whl", hash = "sha256:69480e7384935feff1f50293a8cb70c5d31f568af94ed792d043bb368b50bd50"},
|
||||
{file = "Quart-0.17.0.tar.gz", hash = "sha256:2cf213d8b83fa701a83e3b3125e9102a937cefd1e97e9583f22ee2fa79139640"},
|
||||
]
|
||||
"requests 2.27.1" = [
|
||||
{file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"},
|
||||
{file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"},
|
||||
@ -806,6 +1016,10 @@ content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c27
|
||||
"retrying 1.3.3" = [
|
||||
{file = "retrying-1.3.3.tar.gz", hash = "sha256:08c039560a6da2fe4f2c426d0766e284d3b736e355f8dd24b37367b0bb41973b"},
|
||||
]
|
||||
"rfc3986 1.5.0" = [
|
||||
{file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
|
||||
{file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
|
||||
]
|
||||
"ruamel.yaml 0.17.20" = [
|
||||
{file = "ruamel.yaml-0.17.20-py3-none-any.whl", hash = "sha256:810eef9c46523a3f77479c66267a4708255ebe806a2d540078408c2227f011af"},
|
||||
{file = "ruamel.yaml-0.17.20.tar.gz", hash = "sha256:4b8a33c1efb2b443a93fcaafcfa4d2e445f8e8c29c528d9f5cdafb7cc9e4004c"},
|
||||
@ -845,10 +1059,18 @@ content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c27
|
||||
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
||||
]
|
||||
"sniffio 1.2.0" = [
|
||||
{file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"},
|
||||
{file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"},
|
||||
]
|
||||
"tempora 5.0.1" = [
|
||||
{file = "tempora-5.0.1-py3-none-any.whl", hash = "sha256:fbca6a229af666ea4ea8b2f9f80ac9a074f7cf53a97987855b1d15b6e93fd63b"},
|
||||
{file = "tempora-5.0.1.tar.gz", hash = "sha256:cba0f197a64883bf3e73657efbc0324d5bf17179e7769b1385b4d75d26cd9127"},
|
||||
]
|
||||
"toml 0.10.2" = [
|
||||
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
||||
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
||||
]
|
||||
"tornado 6.1" = [
|
||||
{file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"},
|
||||
{file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"},
|
||||
@ -912,6 +1134,10 @@ content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c27
|
||||
{file = "Werkzeug-2.0.2-py3-none-any.whl", hash = "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f"},
|
||||
{file = "Werkzeug-2.0.2.tar.gz", hash = "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a"},
|
||||
]
|
||||
"wsproto 1.1.0" = [
|
||||
{file = "wsproto-1.1.0-py3-none-any.whl", hash = "sha256:2218cb57952d90b9fca325c0dcfb08c3bda93e8fd8070b0a17f048e2e47a521b"},
|
||||
{file = "wsproto-1.1.0.tar.gz", hash = "sha256:a2e56bfd5c7cd83c1369d83b5feccd6d37798b74872866e62616e0ecf111bda8"},
|
||||
]
|
||||
"zc.lockfile 2.0" = [
|
||||
{file = "zc.lockfile-2.0-py2.py3-none-any.whl", hash = "sha256:cc33599b549f0c8a248cb72f3bf32d77712de1ff7ee8814312eb6456b42c015f"},
|
||||
{file = "zc.lockfile-2.0.tar.gz", hash = "sha256:307ad78227e48be260e64896ec8886edc7eae22d8ec53e4d528ab5537a83203b"},
|
||||
|
@ -9,8 +9,9 @@ dependencies = [
|
||||
"requests~=2.27.1",
|
||||
"python-magic~=0.4.25",
|
||||
"Pillow~=9.0.1",
|
||||
"cqhttp~=1.3.1",
|
||||
"CherryPy~=18.6.1",
|
||||
"aiocqhttp~=1.4.3",
|
||||
"quart~=0.17.0",
|
||||
"hypercorn~=0.13.2",
|
||||
"pilk~=0.0.2",
|
||||
"pydub~=0.25.1",
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user