绑定使用图片回复 #61 (#305)

* 🚧 查数据图初版测试

Co-authored-by: C1ystal <m17687496044@163.com>
Co-authored-by: C29H25N3O5 <michaelgu495@gmail.com>

* 🙈 添加一些 ignore 文件

* 🎨 格式化代码

* 🐛 修复格式化导致的样式爆炸

* 💄 优化曲线图观感

* 💄 将雷达图的指示器名称旋转显示

* 💄 查数据图第二版

Co-authored-by: C29H25N3O5 <michaelgu495@gmail.com>

* ✏️ 修复 typo

* 💄 把用户头像文件的引用放到 html 里

* 💄 账户绑定图第一版

Co-authored-by: C1ystal <m17687496044@163.com>
Co-authored-by: C29H25N3O5 <michaelgu495@gmail.com>

* 🚧 模板化测试

*  添加依赖 fastapi

*  通过 FastAPI 提供静态文件

*  添加依赖 jinja2

* 💄 更新数据图模板 (#291)

* feat(template): show actual value

* feat(template): add user avatar

* feat(template): fix radar

* feat(style): fix name container width fixed caused display misplacement

* feat(style): fix vs value wrap display

* feat(template): make check data length in template

* feat(template): update radar data

* feat(jinja): update data

* fix(template): fix typo

* feat(style): prevent sign too long

* feat(template): turn off echarts animation

* chore(deps): add identicon.js

* fix(template): fix typo

* 🙈 更新.gitignore

* 🏗️ 大部分重构为 flex 布局

---------

Co-authored-by: shoucandanghehe <wallfjjd@gmail.com>
Co-authored-by: 呵呵です <51957264+shoucandanghehe@users.noreply.github.com>

*  添加依赖 nonebot_plugin_userinfo

*  通过 FastAPI 托管渲染后的模板

*  新增头像 api 使用 playwright 生成

*  修正模板资源文件引用路径
被托管后的正确路径

* 💄 将绑定图模板化

* 💄 重命名变量

* 🚚 重命名资源

*  使用 jinja2 渲染模板

*  使用 playwright 渲染网页

* 🩹 渲染模板时对 IO 进行一些额外处理

*  添加依赖 pillow

* 🚚 修改托管页面的路由路径

* 💬 优化绑定图文案

*  新增获取自身网络位置的方法

* 🍱 更新 unknown.svg

*  新增获取用户头像的方法

*  绑定消息使用图片回复

*  为 identicon api 添加缓存

* 🔥 删除旧文件

* 🚚 重命名模板

* 📄 添加字体 License

* 🙈 更新.gitignore

---------

Co-authored-by: C1ystal <m17687496044@163.com>
Co-authored-by: C29H25N3O5 <michaelgu495@gmail.com>
Co-authored-by: 渣渣120 <WOSHIZHAZHA120@qq.com>
This commit is contained in:
呵呵です
2024-05-02 01:22:33 +08:00
committed by GitHub
parent 80f4316564
commit fd85140c99
62 changed files with 2302 additions and 48 deletions

11
.gitignore vendored
View File

@@ -8,3 +8,14 @@ Untitled*
*_cache*
*backup*
*.pyc
node_modules
.prettier*
package.json
pnpm-lock.yaml
*.drawio.svg
package-lock.json
*Zone.Identifier
.env*
bot.py
TODO
*.fish

View File

@@ -20,3 +20,4 @@ __plugin_meta__ = PluginMetadata(
)
from . import game_data_processor # noqa: F401, E402
from .utils import host # noqa: F401, E402

View File

@@ -1,3 +1,5 @@
from enum import StrEnum, auto
from nonebot_plugin_orm import AsyncSession
from sqlalchemy import select
@@ -5,6 +7,11 @@ from ..utils.typing import GameType
from .models import Bind
class BindStatus(StrEnum):
SUCCESS = auto()
UPDATE = auto()
async def query_bind_info(
session: AsyncSession,
chat_platform: str,
@@ -27,7 +34,7 @@ async def create_or_update_bind(
chat_account: str,
game_platform: GameType,
game_account: str,
) -> str:
) -> BindStatus:
bind = await query_bind_info(
session=session,
chat_platform=chat_platform,
@@ -42,9 +49,9 @@ async def create_or_update_bind(
game_account=game_account,
)
session.add(bind)
message = '绑定成功'
message = BindStatus.SUCCESS
else:
bind.game_account = game_account
message = '更新绑定成功'
message = BindStatus.UPDATE
await session.commit()
return message

View File

@@ -4,6 +4,8 @@ from typing import Any
from nonebot.matcher import Matcher
from nonebot_plugin_alconna import AlcMatches, AlconnaMatcher
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_userinfo import UserInfo # type: ignore[import-untyped]
from ..utils.exception import MessageFormatError
from ..utils.recorder import Recorder
@@ -41,7 +43,14 @@ class Processor(ABC):
raise NotImplementedError
@abstractmethod
async def handle_bind(self, platform: str, account: str) -> str:
async def handle_bind(
self,
platform: str,
account: str,
bot_info: UserInfo,
*args: Any, # noqa: ANN401
**kwargs: Any, # noqa: ANN401
) -> UniMessage:
"""处理绑定消息"""
raise NotImplementedError

View File

@@ -6,6 +6,7 @@ from nonebot.adapters import Bot, Event
from nonebot.matcher import Matcher
from nonebot_plugin_alconna import At, on_alconna
from nonebot_plugin_orm import get_session
from nonebot_plugin_userinfo import BotUserInfo, UserInfo # type: ignore[import-untyped]
from sqlalchemy import func, select
from ...db import query_bind_info
@@ -86,17 +87,16 @@ alc.shortcut('fkosk', {'command': 'io查', 'args': ['我']})
@alc.assign('bind')
async def _(bot: Bot, event: Event, matcher: Matcher, account: User):
proc = Processor(
event_id=id(event),
user=account,
command_args=[],
)
async def _(bot: Bot, event: Event, matcher: Matcher, account: User, bot_info: UserInfo = BotUserInfo()): # noqa: B008
proc = Processor(event_id=id(event), user=account, command_args=[])
try:
await matcher.finish(await proc.handle_bind(platform=get_platform(bot), account=event.get_user_id()))
await (
await proc.handle_bind(platform=get_platform(bot), account=event.get_user_id(), bot_info=bot_info)
).send()
except NeedCatchError as e:
await matcher.send(str(e))
raise HandleNotFinishedError from e
await matcher.finish()
@alc.assign('query')

View File

@@ -1,26 +1,33 @@
from collections import defaultdict
from collections.abc import Callable
from datetime import datetime, timedelta, timezone
from hashlib import sha512
from hashlib import md5, sha512
from math import floor
from re import match
from statistics import mean
from typing import Literal
from urllib.parse import urlunparse
from aiofiles import open
from nonebot import get_driver
from nonebot.compat import type_validate_json
from nonebot.utils import run_sync
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_apscheduler import scheduler # type: ignore[import-untyped]
from nonebot_plugin_localstore import get_data_file # type: ignore[import-untyped]
from nonebot_plugin_orm import get_session
from nonebot_plugin_userinfo import UserInfo as NBUserInfo # type: ignore[import-untyped]
from sqlalchemy import select
from zstandard import ZstdCompressor
from ...db import create_or_update_bind
from ...db import BindStatus, create_or_update_bind
from ...utils.avatar import get_avatar
from ...utils.exception import MessageFormatError, RequestError, WhatTheFuckError
from ...utils.host import HostPage, get_self_netloc
from ...utils.render import render
from ...utils.request import splice_url
from ...utils.retry import retry
from ...utils.screenshot import screenshot
from .. import Processor as ProcessorMeta
from .cache import Cache
from .constant import BASE_URL, GAME_TYPE, RANK_PERCENTILE
@@ -65,20 +72,43 @@ class Processor(ProcessorMeta):
def game_platform(self) -> Literal['IO']:
return GAME_TYPE
async def handle_bind(self, platform: str, account: str) -> str:
async def handle_bind(self, platform: str, account: str, bot_info: NBUserInfo) -> UniMessage:
"""处理绑定消息"""
self.command_type = 'bind'
await self.get_user()
if self.user.ID is None:
raise # FIXME: 不知道怎么才能把这类型给变过来了
async with get_session() as session:
return await create_or_update_bind(
bind_status = await create_or_update_bind(
session=session,
chat_platform=platform,
chat_account=account,
game_platform=GAME_TYPE,
game_account=self.user.ID,
)
bot_avatar = await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg')
user_info = await self.get_user_info()
if bind_status in (BindStatus.SUCCESS, BindStatus.UPDATE):
async with HostPage(
await render(
'bind.j2.html',
user_avatar=f'https://tetr.io/user-content/avatars/{user_info.data.user.id}.jpg?rv={user_info.data.user.avatar_revision}'
if user_info.data.user.avatar_revision is not None
else f'../../identicon?md5={md5(user_info.data.user.id.encode()).hexdigest()}', # noqa: S324
state='unknown',
bot_avatar=bot_avatar,
game_type=self.game_platform,
user_name=user_info.data.user.username.upper(),
bot_name=bot_info.user_name,
command='io查我',
)
) as page_hash:
message = UniMessage.image(
raw=await screenshot(
urlunparse(('http', get_self_netloc(), f'/host/page/{page_hash}.html', '', '', ''))
)
)
return message
async def handle_query(self) -> str:
"""处理查询消息"""

View File

@@ -3,6 +3,7 @@ from nonebot.adapters import Bot, Event
from nonebot.matcher import Matcher
from nonebot_plugin_alconna import At, on_alconna
from nonebot_plugin_orm import get_session
from nonebot_plugin_userinfo import BotUserInfo, EventUserInfo, UserInfo # type: ignore[import-untyped]
from ...db import query_bind_info
from ...utils.exception import HandleNotFinishedError, NeedCatchError
@@ -67,17 +68,29 @@ alc = on_alconna(
@alc.assign('bind')
async def _(bot: Bot, event: Event, matcher: Matcher, account: User):
async def _( # noqa: PLR0913
bot: Bot,
event: Event,
matcher: Matcher,
account: User,
bot_info: UserInfo = BotUserInfo(), # noqa: B008
user_info: UserInfo = EventUserInfo(), # noqa: B008
):
proc = Processor(
event_id=id(event),
user=account,
command_args=[],
)
try:
await matcher.finish(await proc.handle_bind(platform=get_platform(bot), account=event.get_user_id()))
await (
await proc.handle_bind(
platform=get_platform(bot), account=event.get_user_id(), bot_info=bot_info, user_info=user_info
)
).send()
except NeedCatchError as e:
await matcher.send(str(e))
raise HandleNotFinishedError from e
await matcher.finish()
@alc.assign('query')

View File

@@ -3,15 +3,21 @@ from dataclasses import dataclass
from io import StringIO
from re import match
from typing import Literal
from urllib.parse import urlencode
from urllib.parse import urlencode, urlunparse
from lxml import etree
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_orm import get_session
from nonebot_plugin_userinfo import UserInfo # type: ignore[import-untyped]
from pandas import read_html
from ...db import create_or_update_bind
from ...db import BindStatus, create_or_update_bind
from ...utils.avatar import get_avatar
from ...utils.exception import MessageFormatError, RequestError
from ...utils.host import HostPage, get_self_netloc
from ...utils.render import render
from ...utils.request import Request, splice_url
from ...utils.screenshot import screenshot
from .. import Processor as ProcessorMeta
from ..schemas import BaseUser
from .constant import BASE_URL, GAME_TYPE
@@ -60,18 +66,38 @@ class Processor(ProcessorMeta):
def game_platform(self) -> Literal['TOP']:
return GAME_TYPE
async def handle_bind(self, platform: str, account: str) -> str:
async def handle_bind(self, platform: str, account: str, bot_info: UserInfo, user_info: UserInfo) -> UniMessage:
"""处理绑定消息"""
self.command_type = 'bind'
await self.check_user()
async with get_session() as session:
return await create_or_update_bind(
bind_status = await create_or_update_bind(
session=session,
chat_platform=platform,
chat_account=account,
game_platform=GAME_TYPE,
game_account=self.user.name,
)
bot_avatar = await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg')
if bind_status in (BindStatus.SUCCESS, BindStatus.UPDATE):
async with HostPage(
await render(
'bind.j2.html',
user_avatar='../../static/static/logo/top.ico',
state='unknown',
bot_avatar=bot_avatar,
game_type=self.game_platform,
user_name=(await self.get_user_name()).upper(),
bot_name=bot_info.user_name,
command='top查我',
)
) as page_hash:
message = UniMessage.image(
raw=await screenshot(
urlunparse(('http', get_self_netloc(), f'/host/page/{page_hash}.html', '', '', ''))
)
)
return message
async def handle_query(self) -> str:
"""处理查询消息"""

View File

@@ -5,6 +5,7 @@ from nonebot.adapters import Bot, Event
from nonebot.matcher import Matcher
from nonebot_plugin_alconna import At, on_alconna
from nonebot_plugin_orm import get_session
from nonebot_plugin_userinfo import BotUserInfo, UserInfo # type: ignore[import-untyped]
from ...db import query_bind_info
from ...utils.exception import HandleNotFinishedError, NeedCatchError, RequestError
@@ -130,17 +131,20 @@ except ImportError:
@alc.assign('bind')
async def _(bot: Bot, event: Event, matcher: Matcher, account: User):
async def _(bot: Bot, event: Event, matcher: Matcher, account: User, bot_info: UserInfo = BotUserInfo()): # noqa: B008
proc = Processor(
event_id=id(event),
user=account,
command_args=[],
)
try:
await matcher.finish(await proc.handle_bind(platform=get_platform(bot), account=event.get_user_id()))
await (
await proc.handle_bind(platform=get_platform(bot), account=event.get_user_id(), bot_info=bot_info)
).send()
except NeedCatchError as e:
await matcher.send(str(e))
raise HandleNotFinishedError from e
await matcher.finish()
@alc.assign('query')

View File

@@ -1,15 +1,21 @@
from dataclasses import dataclass
from re import match
from typing import Literal
from urllib.parse import urlencode
from urllib.parse import urlencode, urlunparse
from httpx import TimeoutException
from nonebot.compat import type_validate_json
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_orm import get_session
from nonebot_plugin_userinfo import UserInfo as NBUserInfo # type: ignore[import-untyped]
from ...db import create_or_update_bind
from ...db import BindStatus, create_or_update_bind
from ...utils.avatar import get_avatar
from ...utils.exception import MessageFormatError, RequestError
from ...utils.host import HostPage, get_self_netloc
from ...utils.render import render
from ...utils.request import Request, splice_url
from ...utils.screenshot import screenshot
from .. import Processor as ProcessorMeta
from ..schemas import BaseUser
from .constant import BASE_URL, GAME_TYPE
@@ -73,18 +79,39 @@ class Processor(ProcessorMeta):
def game_platform(self) -> Literal['TOS']:
return GAME_TYPE
async def handle_bind(self, platform: str, account: str) -> str:
async def handle_bind(self, platform: str, account: str, bot_info: NBUserInfo) -> UniMessage:
"""处理绑定消息"""
self.command_type = 'bind'
await self.get_user()
async with get_session() as session:
return await create_or_update_bind(
bind_status = await create_or_update_bind(
session=session,
chat_platform=platform,
chat_account=account,
game_platform=GAME_TYPE,
game_account=self.user.unique_identifier,
)
bot_avatar = await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg')
user_info = await self.get_user_info()
if bind_status in (BindStatus.SUCCESS, BindStatus.UPDATE):
async with HostPage(
await render(
'bind.j2.html',
user_avatar='../../static/static/logo/tos.ico',
state='unknown',
bot_avatar=bot_avatar,
game_type=self.game_platform,
user_name=user_info.data.name.upper(),
bot_name=bot_info.user_name,
command='茶服查我',
)
) as page_hash:
message = UniMessage.image(
raw=await screenshot(
urlunparse(('http', get_self_netloc(), f'/host/page/{page_hash}.html', '', '', ''))
)
)
return message
async def handle_query(self) -> str:
"""处理查询消息"""

View File

@@ -0,0 +1,3 @@
from pathlib import Path
path = Path(__file__).absolute().parent

View File

@@ -0,0 +1,43 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="../../static/css/bind.css" rel="stylesheet" />
</head>
<body>
<div id="background">
<div id="main-content">
<div id="bind-subject">
<div id="bind-icons">
<img id="user-avatar" src="{{ user_avatar }}" />
<img id="state" src="../../static/static/bind/{{ state }}.svg" />
<img id="bot-avatar" src="{{ bot_avatar }}" />
</div>
<div id="command-result">
已将您在
<p id="game-type">{{ game_type }}</p>
上的账号
<br />
<p id="user-name">{{ user_name }}</p>
<br />
{% if state == 'success' %} 成功验证并绑定至
<p id="bot-name">{{ bot_name }}.</p>
{% elif state == 'unverified'%} 绑定至
<p id="bot-name">{{ bot_name }}</p>
, 但尚未通过验证. {% elif state == 'unknown' %} 绑定至
<p id="bot-name">{{ bot_name }}</p>
,<br />但是
<p id="bot-name">{{ bot_name }}</p>
暂时无法验证您的身份. {% elif state == 'unlink' %} 成功从
<p id="bot-name">{{ bot_name }}</p>
解绑. {% endif %}
</div>
</div>
<div id="extra-info">您可以输入 “{{ command }}” 命令来查找您在该平台上的统计数据.</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,118 @@
@font-face {
font-family: 'SourceHanSansSC-VF';
src: url('../static/fonts/SourceHanSans/SourceHanSansSC-VF.otf.woff2') format('woff2');
font-display: swap;
font-style: normal;
}
@font-face {
font-family: 'CabinetGrotesk-Variable';
src: url('../static/fonts/CabinetGrotesk/CabinetGrotesk-Variable.woff2') format('woff2');
font-display: swap;
font-style: normal;
}
* {
margin: 0;
padding: 0;
}
#background {
display: flex;
flex-direction: column;
align-items: flex-start;
padding: 30px;
gap: 10px;
width: 444px;
background: #f1f1f1;
font-family: 'CabinetGrotesk-Variable', 'SourceHanSansSC-VF';
}
#main-content {
display: flex;
flex-direction: column;
margin: 0 auto;
padding: 0px;
gap: 15px;
}
#bind-subject {
display: flex;
flex-direction: column;
align-items: center;
padding: 0px;
gap: 30px;
}
#bind-icons {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
padding: 0px;
gap: 32px;
}
#user-avatar {
width: 96px;
height: 96px;
filter: drop-shadow(0px 11px 23px rgba(0, 0, 0, 0.22));
border-radius: 20px;
}
#state {
width: 128px;
height: 56px;
}
#bot-avatar {
width: 96px;
height: 96px;
filter: drop-shadow(0px 11px 23px rgba(0, 0, 0, 0.22));
border-radius: 20px;
}
#command-result {
font-weight: 350;
font-size: 25px;
line-height: 36.2px;
text-align: center;
color: #000000;
}
#game-type {
display: inline;
font-weight: 800;
line-height: 31px;
}
#user-name {
display: inline;
font-weight: 800;
line-height: 31px;
white-space: nowrap;
text-overflow: ellipsis;
}
#bot-name {
display: inline;
font-weight: 400;
line-height: 31px;
}
#extra-info {
width: 324px;
margin: 0 auto;
font-weight: 400;
font-size: 16px;
line-height: 23px;
text-align: center;
color: #52525c;
}

View File

@@ -0,0 +1,351 @@
@font-face {
font-family: 'CabinetGrotesk-Variable';
src: url('../static/fonts/CabinetGrotesk/CabinetGrotesk-Variable.woff2') format('woff2');
}
@font-face {
font-family: '26FGalaxySans-ObliqueVF';
src: url('../static/fonts/26FGalaxySans/26FGalaxySans-ObliqueVF.woff2') format('woff2');
}
* {
margin: 0;
padding: 0;
}
.flex-gap {
flex: 1;
}
.big-title {
margin-left: 25px;
margin-top: 22px;
font-weight: 900;
font-size: 35px;
line-height: 43px;
color: #000000;
}
.box-shadow {
box-shadow: 0px 9px 25px rgba(0, 0, 0, 0.15);
}
.chart-shadow {
box-shadow: 0px 15px 30px rgba(0, 0, 0, 0.3);
}
.box-rounded-corners {
border-radius: 30px;
}
.small-data-box {
position: relative;
width: 275px;
height: 125px;
}
.big-data-value {
position: absolute;
left: 24px;
top: 52px;
font-weight: 500;
font-size: 45px;
line-height: 56px;
}
.small-data-value {
position: absolute;
top: 79px;
right: 25px;
font-weight: 500;
font-size: 15px;
line-height: 19px;
text-align: right;
}
#main-content {
display: flex;
flex-direction: column;
width: 625px;
background: #f1f1f1;
font-family: 'CabinetGrotesk-Variable';
}
#account-box {
display: flex;
flex-direction: column;
}
#info-box {
display: flex;
justify-content: space-between;
margin-top: 10px;
}
#user-info-box {
display: flex;
flex-direction: column;
align-items: center;
padding: 25px;
gap: 10px;
width: 275px;
height: 275px;
background: #fafafa;
box-sizing: border-box;
}
#user-avatar {
width: 125px;
height: 125px;
filter: drop-shadow(0px 11px 23px rgba(0, 0, 0, 0.22));
border-radius: 65px;
}
#user-name {
font-weight: 800;
font-size: 25px;
line-height: 31px;
color: #000000;
}
#user-sign {
width: 225px;
height: 66px;
font-weight: 400;
font-size: 18px;
line-height: 22px;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
color: #000000;
}
#game-info-box {
display: flex;
flex-direction: column;
align-items: flex-start;
padding: 25px;
gap: 10px;
width: 275px;
height: 275px;
background: #fafafa;
box-sizing: border-box;
}
#game-type-box {
display: flex;
flex-direction: column;
}
#game-logo {
width: 60px;
height: 60px;
border-radius: 10px;
}
#game-name {
font-weight: 800;
font-size: 30px;
line-height: 37px;
color: #000000;
}
#game-info-dividing-line {
width: 225px;
border: 1px solid #bababa;
transform: rotate(0.25deg);
}
#ranking-info-box {
display: flex;
flex-direction: column;
}
#ranking-title {
font-weight: 800;
font-size: 25px;
line-height: 31px;
color: #000000;
}
#ranking {
font-weight: 400;
font-size: 50px;
line-height: 120%;
color: #000000;
}
#rd {
margin-top: -16px;
font-weight: 300;
font-size: 30px;
line-height: 120%;
color: #000000;
}
#TR-curve-chart {
align-self: center;
margin-top: 25px;
width: 575px;
height: 275px;
background: linear-gradient(222.34deg, #525252 11.97%, #1d1916 89.73%);
}
#TR-title {
position: absolute;
margin-left: 24px;
margin-top: 19px;
font-weight: 800;
font-size: 25px;
line-height: 31px;
white-space: nowrap;
color: #fafafa;
}
#rank-icon {
position: absolute;
margin-left: 27px;
margin-top: 90px;
width: 50px;
height: 50px;
}
#TR {
position: absolute;
margin-left: 24px;
margin-top: 143px;
font-weight: 800;
font-size: 45px;
line-height: 120%;
color: #fafafa;
}
#multiplayer-box {
display: flex;
flex-direction: row;
justify-content: space-between;
margin-top: 14px;
}
#multiplayer-data-box {
display: flex;
flex-direction: column;
}
.multiplayer-data {
margin-top: 25px;
}
.multiplayer-data:first-child {
margin-top: 0px;
}
#lpm-box {
background-image: url('../static/data/LPM.svg');
}
#lpm-value {
color: #4d7d0f;
}
#pps-value {
color: #4d7d0f;
}
#apm-box {
background-image: url('../static/data/APM.svg');
}
#apm-value {
color: #b5530a;
}
#apl-value {
color: #b5530a;
}
#adpm-box {
background-image: url('../static/data/ADPM.svg');
}
#adpm-value {
color: #235db4;
}
#vs-value {
top: 62px;
color: #4779c6;
}
#adpl-value {
color: #4779c6;
}
#radar-chart {
width: 275px;
height: 275px;
background: linear-gradient(222.34deg, #525252 11.97%, #1d1916 89.73%),
linear-gradient(222.34deg, #4f9dff 11.97%, #2563ea 89.73%);
}
#singleplayer-box {
display: flex;
flex-direction: row;
align-content: space-between;
margin-top: 14px;
}
#sprint-box {
background-image: url('../static/data/40L.svg');
}
#blitz-box {
background-image: url('../static/data/Blitz.svg');
}
#sprint-value {
color: #b42323;
}
#blitz-value {
color: #8e23b4;
}
#footer {
display: flex;
justify-content: center;
margin-top: 20px;
margin-bottom: 20px;
font-family: '26FGalaxySans-ObliqueVF';
font-size: 32px;
font-weight: 257;
text-align: center;
}

View File

@@ -0,0 +1,352 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="../../static/css/data.css" rel="stylesheet" />
</head>
<body>
<div id="main-content">
<span class="big-title">Account&Rankings</span>
<div id="account-box">
<div id="info-box">
<div class="flex-gap"></div>
<div class="box-shadow box-rounded-corners" id="user-info-box">
<img id="user-avatar" src="{{user_avatar}}" />
<div id="user-name">{{user_name}}</div>
<div id="user-sign">“{{user_sign}}”</div>
</div>
<div class="flex-gap"></div>
<div class="box-shadow box-rounded-corners" id="game-info-box">
<div id="game-type-box">
<img id="game-logo" src="../../static/static/logo/{{game_type}}.svg" />
<span id="game-name">{{game_type}}</span>
</div>
<div id="game-info-dividing-line"></div>
<div id="ranking-info-box">
<span id="ranking-title">Ranking</span>
<span id="ranking">{{ranking}}</span>
<span id="rd">±{{rd}}</span>
</div>
</div>
<div class="flex-gap"></div>
</div>
<div class="chart-shadow box-rounded-corners" id="TR-curve-chart">
<span id="TR-title">Tetra Rating (TR)</span>
<img id="rank-icon" src="../../static/static/rank/{{rank}}.svg" />
<span id="TR" style="display: flex; align-items: flex-end"
>{{TR}}&nbsp;
<p style="font-size: 30px; font-weight: 400; line-height: 47px">(#{{global_rank}})</p>
</span>
</div>
</div>
<span class="big-title">Multiplayer Stats</span>
<div id="multiplayer-box">
<div class="flex-gap"></div>
<div id="multiplayer-data-box">
<div class="multiplayer-data small-data-box box-shadow box-rounded-corners" id="lpm-box">
<span class="big-data-value" id="lpm-value">{{lpm}}</span>
<span class="small-data-value" id="pps-value">{{pps}} pps</span>
</div>
<div class="multiplayer-data small-data-box box-shadow box-rounded-corners" id="apm-box">
<span class="big-data-value" id="apm-value">{{apm}}</span>
<span class="small-data-value" id="apl-value">x{{apl}}</span>
</div>
<div class="multiplayer-data small-data-box box-shadow box-rounded-corners" id="adpm-box">
<span class="big-data-value" id="adpm-value">{{adpm}}</span>
<span class="small-data-value" id="adpl-value">x{{adpl}}</span>
<span class="small-data-value" id="vs-value">{{vs}} vs</span>
</div>
</div>
<div class="flex-gap"></div>
<div class="chart-shadow box-rounded-corners" id="radar-chart"></div>
<div class="flex-gap"></div>
</div>
<span class="big-title">Singleplayer Stats</span>
<div id="singleplayer-box">
<div class="flex-gap"></div>
<div class="small-data-box box-shadow box-rounded-corners" id="sprint-box">
<span class="big-data-value" id="sprint-value">{{sprint}}</span>
</div>
<div class="flex-gap"></div>
<div class="small-data-box box-shadow box-rounded-corners" id="blitz-box">
<span class="big-data-value" id="blitz-value">{{blitz}}</span>
</div>
<div class="flex-gap"></div>
</div>
<div id="footer">Powered by<br />Nonebot2 x nonebot-plugin-tetris-stats</div>
</div>
</body>
<script src="../../static/js/echarts.js"></script>
<script>
var data = {{data}}
// 曲线图
var lineChartDom = document.getElementById('TR-curve-chart');
var lineChart = echarts.init(lineChartDom, null, { renderer: 'svg' });
var option;
/** @type EChartsOption */
option = {
animation: false,
grid: {
left: '-5%',
bottom: '17%',
width: '90%',
height: '70%',
},
xAxis: {
type: 'time',
minInterval: 3600 * 48 * 1000,
axisTick: {
show: false,
},
axisLine: {
show: false,
},
axisLabel: {
formatter: function (value, index) {
var date = new Date(value);
var lst;
var ret;
function format_date() {
return new Intl.DateTimeFormat('en-US', {
month: '2-digit',
day: '2-digit',
})
.format(date)
.split('/');
}
switch (index) {
case 0:
case 6:
ret = '';
break;
default:
lst = format_date();
if (index === 5) {
ret = '{last_month|' + lst[0] + '}\n{last_day|' + lst[1] + '}';
break;
}
ret = '{month|' + lst[0] + '}\n{day|' + lst[1] + '}';
}
return ret;
},
rich: {
month: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 13,
fontWeight: '400',
color: 'rgba(255, 255, 255, 0.6)',
},
day: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 20,
fontWeight: '800',
color: 'rgba(255, 255, 255, 0.6)',
},
last_month: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 13,
fontWeight: '400',
color: '#373533',
backgroundColor: '#FAFAFA',
borderRadius: 6,
padding: [-10, 0, 10, 0],
width: 36,
height: 37,
lineHeight: 32,
},
last_day: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 20,
fontWeight: '800',
color: '#373533',
padding: [-18, 0, 0, 0],
lineHeight: 0,
},
},
},
zlevel: 1,
},
yAxis: {
type: 'value',
interval: {{split_value}},
position: 'right',
splitLine: {
show: false,
},
axisLine: {
show: false,
},
axisLabel: {
align: 'right',
formatter: function (value, index) {
return '{value|' + value.toLocaleString() + '}';
},
rich: {
value: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 15,
fontWeight: '500',
color: 'rgba(255, 255, 255, 0.6)',
},
},
},
offset: 70,
max: {{value_max+offset}},
min: {{value_min-offset}},
},
series: [
{
// 10天的数据最后一天只要第一条 (时间戳最少要多1ms)
data: data,
type: 'line',
smooth: true,
symbol: function (value, params) {
if (params.dataIndex === data.length - 1) {
return 'image://../../static/static/data/point.svg';
}
return 'none';
},
symbolSize: 75,
symbolOffset: [0.79, 0],
lineStyle: {
color: '#FAFAFA99',
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: 'rgba(250, 250, 250, 0.3)',
},
{
offset: 1,
color: 'rgba(250, 250, 250, 0)',
},
],
global: false,
},
},
markLine: {
data: [
{
xAxis: 'max',
y: 300,
},
],
label: {
show: false,
},
lineStyle: {
color: '#FAFAFA',
width: 3,
type: 'dashed',
cap: 'round',
},
symbol: 'none',
animation: false,
},
z: 5,
},
],
};
option && lineChart.setOption(option);
</script>
<script>
// 雷达图
var radarChartDom = document.getElementById('radar-chart');
var radarChart = echarts.init(radarChartDom, null, { renderer: 'svg' });
var option;
option = {
animation: false,
radar: [
{
indicator: [
{ name: 'PPS' },
{ name: 'APP', nameRotate: 60 },
{ name: 'DSPP', nameRotate: -60 },
{ name: 'OR' },
{ name: 'CI', nameRotate: 60 },
{ name: 'GE', nameRotate: -60 },
],
center: ['50%', '50%'],
radius: '65%',
startAngle: 90,
splitNumber: 4,
shape: 'circle',
silent: true,
axisName: {
color: '#FAFAFA',
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 15,
fontWeight: '800',
},
splitArea: {
show: false,
},
axisLine: {
lineStyle: {
color: 'rgba(250, 250, 250, 0.3)',
},
},
axisLabel: {
show: true,
rotate: 0,
margin: -1,
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 7,
fontWeight: '800',
color: '#FFFFFF',
},
splitLine: {
lineStyle: {
color: 'rgba(250, 250, 250, 0.3)',
},
},
},
],
series: [
{
type: 'radar',
symbol: 'none',
label: {
show: true,
},
emphasis: {
disabled: true,
},
lineStyle: {
color: '#FAFAFA',
width: 2.5,
shadowBlur: 20,
shadowColor: 'rgba(250, 250, 250, 1)',
},
areaStyle: {
color: 'rgba(250, 250, 250, 0.45)',
},
data: [
{
value: [{{pps}}, {{app}}, {{dspp}}, {{OR}}, {{ci}}, {{ge}}],
},
],
},
],
};
option && radarChart.setOption(option);
</script>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,205 @@
/**
* Identicon.js 2.3.3
* http://github.com/stewartlord/identicon.js
*
* PNGLib required for PNG output
* http://www.xarg.org/download/pnglib.js
*
* Copyright 2018, Stewart Lord
* Released under the BSD license
* http://www.opensource.org/licenses/bsd-license.php
*/
(function() {
var PNGlib;
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
PNGlib = require('./pnglib');
} else {
PNGlib = window.PNGlib;
}
var Identicon = function(hash, options){
if (typeof(hash) !== 'string' || hash.length < 15) {
throw 'A hash of at least 15 characters is required.';
}
this.defaults = {
background: [240, 240, 240, 255],
margin: 0.08,
size: 64,
saturation: 0.7,
brightness: 0.5,
format: 'png'
};
this.options = typeof(options) === 'object' ? options : this.defaults;
// backward compatibility with old constructor (hash, size, margin)
if (typeof(arguments[1]) === 'number') { this.options.size = arguments[1]; }
if (arguments[2]) { this.options.margin = arguments[2]; }
this.hash = hash
this.background = this.options.background || this.defaults.background;
this.size = this.options.size || this.defaults.size;
this.format = this.options.format || this.defaults.format;
this.margin = this.options.margin !== undefined ? this.options.margin : this.defaults.margin;
// foreground defaults to last 7 chars as hue at 70% saturation, 50% brightness
var hue = parseInt(this.hash.substr(-7), 16) / 0xfffffff;
var saturation = this.options.saturation || this.defaults.saturation;
var brightness = this.options.brightness || this.defaults.brightness;
this.foreground = this.options.foreground || this.hsl2rgb(hue, saturation, brightness);
};
Identicon.prototype = {
background: null,
foreground: null,
hash: null,
margin: null,
size: null,
format: null,
image: function(){
return this.isSvg()
? new Svg(this.size, this.foreground, this.background)
: new PNGlib(this.size, this.size, 256);
},
render: function(){
var image = this.image(),
size = this.size,
baseMargin = Math.floor(size * this.margin),
cell = Math.floor((size - (baseMargin * 2)) / 5),
margin = Math.floor((size - cell * 5) / 2),
bg = image.color.apply(image, this.background),
fg = image.color.apply(image, this.foreground);
// the first 15 characters of the hash control the pixels (even/odd)
// they are drawn down the middle first, then mirrored outwards
var i, color;
for (i = 0; i < 15; i++) {
color = parseInt(this.hash.charAt(i), 16) % 2 ? bg : fg;
if (i < 5) {
this.rectangle(2 * cell + margin, i * cell + margin, cell, cell, color, image);
} else if (i < 10) {
this.rectangle(1 * cell + margin, (i - 5) * cell + margin, cell, cell, color, image);
this.rectangle(3 * cell + margin, (i - 5) * cell + margin, cell, cell, color, image);
} else if (i < 15) {
this.rectangle(0 * cell + margin, (i - 10) * cell + margin, cell, cell, color, image);
this.rectangle(4 * cell + margin, (i - 10) * cell + margin, cell, cell, color, image);
}
}
return image;
},
rectangle: function(x, y, w, h, color, image){
if (this.isSvg()) {
image.rectangles.push({x: x, y: y, w: w, h: h, color: color});
} else {
var i, j;
for (i = x; i < x + w; i++) {
for (j = y; j < y + h; j++) {
image.buffer[image.index(i, j)] = color;
}
}
}
},
// adapted from: https://gist.github.com/aemkei/1325937
hsl2rgb: function(h, s, b){
h *= 6;
s = [
b += s *= b < .5 ? b : 1 - b,
b - h % 1 * s * 2,
b -= s *= 2,
b,
b + h % 1 * s,
b + s
];
return[
s[ ~~h % 6 ] * 255, // red
s[ (h|16) % 6 ] * 255, // green
s[ (h|8) % 6 ] * 255 // blue
];
},
toString: function(raw){
// backward compatibility with old toString, default to base64
if (raw) {
return this.render().getDump();
} else {
return this.render().getBase64();
}
},
isSvg: function(){
return this.format.match(/svg/i)
}
};
var Svg = function(size, foreground, background){
this.size = size;
this.foreground = this.color.apply(this, foreground);
this.background = this.color.apply(this, background);
this.rectangles = [];
};
Svg.prototype = {
size: null,
foreground: null,
background: null,
rectangles: null,
color: function(r, g, b, a){
var values = [r, g, b].map(Math.round);
values.push((a >= 0) && (a <= 255) ? a/255 : 1);
return 'rgba(' + values.join(',') + ')';
},
getDump: function(){
var i,
xml,
rect,
fg = this.foreground,
bg = this.background,
stroke = this.size * 0.005;
xml = "<svg xmlns='http://www.w3.org/2000/svg'"
+ " width='" + this.size + "' height='" + this.size + "'"
+ " style='background-color:" + bg + ";'>"
+ "<g style='fill:" + fg + "; stroke:" + fg + "; stroke-width:" + stroke + ";'>";
for (i = 0; i < this.rectangles.length; i++) {
rect = this.rectangles[i];
if (rect.color == bg) continue;
xml += "<rect "
+ " x='" + rect.x + "'"
+ " y='" + rect.y + "'"
+ " width='" + rect.w + "'"
+ " height='" + rect.h + "'"
+ "/>";
}
xml += "</g></svg>"
return xml;
},
getBase64: function(){
if ('function' === typeof btoa) {
return btoa(this.getDump());
} else if (Buffer) {
return new Buffer(this.getDump(), 'binary').toString('base64');
} else {
throw 'Cannot generate base64 output';
}
}
};
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
module.exports = Identicon;
} else {
window.Identicon = Identicon;
}
})();

View File

@@ -0,0 +1,20 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM4.95385 13.5C5.78227 13.5 6.45385 12.8284 6.45385 12C6.45385 11.1716 5.78227 10.5 4.95385 10.5V13.5ZM11.8462 10.5C11.0177 10.5 10.3462 11.1716 10.3462 12C10.3462 12.8284 11.0177 13.5 11.8462 13.5V10.5ZM17.7538 13.5C18.5823 13.5 19.2538 12.8284 19.2538 12C19.2538 11.1716 18.5823 10.5 17.7538 10.5V13.5ZM24.6462 10.5C23.8177 10.5 23.1462 11.1716 23.1462 12C23.1462 12.8284 23.8177 13.5 24.6462 13.5V10.5ZM30.5538 13.5C31.3823 13.5 32.0538 12.8284 32.0538 12C32.0538 11.1716 31.3823 10.5 30.5538 10.5V13.5ZM37.4462 10.5C36.6177 10.5 35.9462 11.1716 35.9462 12C35.9462 12.8284 36.6177 13.5 37.4462 13.5V10.5ZM43.3538 13.5C44.1823 13.5 44.8538 12.8284 44.8538 12C44.8538 11.1716 44.1823 10.5 43.3538 10.5V13.5ZM50.2462 10.5C49.4177 10.5 48.7462 11.1716 48.7462 12C48.7462 12.8284 49.4177 13.5 50.2462 13.5V10.5ZM56.1538 13.5C56.9823 13.5 57.6538 12.8284 57.6538 12C57.6538 11.1716 56.9823 10.5 56.1538 10.5V13.5ZM63.0462 10.5C62.2177 10.5 61.5462 11.1716 61.5462 12C61.5462 12.8284 62.2177 13.5 63.0462 13.5V10.5ZM68.9538 13.5C69.7823 13.5 70.4538 12.8284 70.4538 12C70.4538 11.1716 69.7823 10.5 68.9538 10.5V13.5ZM75.8462 10.5C75.0177 10.5 74.3462 11.1716 74.3462 12C74.3462 12.8284 75.0177 13.5 75.8462 13.5V10.5ZM81.7539 13.5C82.5823 13.5 83.2539 12.8284 83.2539 12C83.2539 11.1716 82.5823 10.5 81.7539 10.5V13.5ZM88.6462 10.5C87.8177 10.5 87.1462 11.1716 87.1462 12C87.1462 12.8284 87.8177 13.5 88.6462 13.5V10.5ZM94.5539 13.5C95.3823 13.5 96.0539 12.8284 96.0539 12C96.0539 11.1716 95.3823 10.5 94.5539 10.5V13.5ZM101.446 10.5C100.618 10.5 99.9462 11.1716 99.9462 12C99.9462 12.8284 100.618 13.5 101.446 13.5V10.5ZM107.354 13.5C108.182 13.5 108.854 12.8284 108.854 12C108.854 11.1716 108.182 10.5 107.354 10.5V13.5ZM114.246 10.5C113.418 10.5 112.746 11.1716 112.746 12C112.746 12.8284 113.418 13.5 114.246 13.5V10.5ZM120.154 13.5C120.982 13.5 121.654 12.8284 121.654 12C121.654 11.1716 120.982 10.5 120.154 10.5V13.5ZM127.046 10.5C126.218 10.5 125.546 11.1716 125.546 12C125.546 12.8284 126.218 13.5 127.046 13.5V10.5ZM2 13.5H4.95385V10.5H2V13.5ZM11.8462 13.5H17.7538V10.5H11.8462V13.5ZM24.6462 13.5H30.5538V10.5H24.6462V13.5ZM37.4462 13.5H43.3538V10.5H37.4462V13.5ZM50.2462 13.5H56.1538V10.5H50.2462V13.5ZM63.0462 13.5H68.9538V10.5H63.0462V13.5ZM75.8462 13.5H81.7539V10.5H75.8462V13.5ZM88.6462 13.5H94.5539V10.5H88.6462V13.5ZM101.446 13.5H107.354V10.5H101.446V13.5ZM114.246 13.5H120.154V10.5H114.246V13.5ZM127.046 13.5H130V10.5H127.046V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM127.046 42.5C126.218 42.5 125.546 43.1716 125.546 44C125.546 44.8284 126.218 45.5 127.046 45.5V42.5ZM120.154 45.5C120.982 45.5 121.654 44.8284 121.654 44C121.654 43.1716 120.982 42.5 120.154 42.5V45.5ZM114.246 42.5C113.418 42.5 112.746 43.1716 112.746 44C112.746 44.8284 113.418 45.5 114.246 45.5V42.5ZM107.354 45.5C108.182 45.5 108.854 44.8284 108.854 44C108.854 43.1716 108.182 42.5 107.354 42.5V45.5ZM101.446 42.5C100.618 42.5 99.9462 43.1716 99.9462 44C99.9462 44.8284 100.618 45.5 101.446 45.5V42.5ZM94.5538 45.5C95.3823 45.5 96.0538 44.8284 96.0538 44C96.0538 43.1716 95.3823 42.5 94.5538 42.5V45.5ZM88.6462 42.5C87.8177 42.5 87.1462 43.1716 87.1462 44C87.1462 44.8284 87.8177 45.5 88.6462 45.5V42.5ZM81.7538 45.5C82.5823 45.5 83.2538 44.8284 83.2538 44C83.2538 43.1716 82.5823 42.5 81.7538 42.5V45.5ZM75.8462 42.5C75.0177 42.5 74.3462 43.1716 74.3462 44C74.3462 44.8284 75.0177 45.5 75.8462 45.5V42.5ZM68.9538 45.5C69.7823 45.5 70.4538 44.8284 70.4538 44C70.4538 43.1716 69.7823 42.5 68.9538 42.5V45.5ZM63.0462 42.5C62.2177 42.5 61.5462 43.1716 61.5462 44C61.5462 44.8284 62.2177 45.5 63.0462 45.5V42.5ZM56.1538 45.5C56.9823 45.5 57.6538 44.8284 57.6538 44C57.6538 43.1716 56.9823 42.5 56.1538 42.5V45.5ZM50.2461 42.5C49.4177 42.5 48.7461 43.1716 48.7461 44C48.7461 44.8284 49.4177 45.5 50.2461 45.5V42.5ZM43.3538 45.5C44.1823 45.5 44.8538 44.8284 44.8538 44C44.8538 43.1716 44.1823 42.5 43.3538 42.5V45.5ZM37.4461 42.5C36.6177 42.5 35.9461 43.1716 35.9461 44C35.9461 44.8284 36.6177 45.5 37.4461 45.5V42.5ZM30.5538 45.5C31.3823 45.5 32.0538 44.8284 32.0538 44C32.0538 43.1716 31.3823 42.5 30.5538 42.5V45.5ZM24.6461 42.5C23.8177 42.5 23.1461 43.1716 23.1461 44C23.1461 44.8284 23.8177 45.5 24.6461 45.5V42.5ZM17.7538 45.5C18.5823 45.5 19.2538 44.8284 19.2538 44C19.2538 43.1716 18.5823 42.5 17.7538 42.5V45.5ZM11.8461 42.5C11.0177 42.5 10.3461 43.1716 10.3461 44C10.3461 44.8284 11.0177 45.5 11.8461 45.5V42.5ZM4.95383 45.5C5.78225 45.5 6.45383 44.8284 6.45383 44C6.45383 43.1716 5.78225 42.5 4.95383 42.5V45.5ZM130 42.5H127.046V45.5H130V42.5ZM120.154 42.5H114.246V45.5H120.154V42.5ZM107.354 42.5H101.446V45.5H107.354V42.5ZM94.5538 42.5H88.6462V45.5H94.5538V42.5ZM81.7538 42.5H75.8462V45.5H81.7538V42.5ZM68.9538 42.5H63.0462V45.5H68.9538V42.5ZM56.1538 42.5H50.2461V45.5H56.1538V42.5ZM43.3538 42.5H37.4461V45.5H43.3538V42.5ZM30.5538 42.5H24.6461V45.5H30.5538V42.5ZM17.7538 42.5H11.8461V45.5H17.7538V42.5ZM4.95383 42.5H2V45.5H4.95383V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_503_299)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 48C77.0457 48 86 39.0457 86 28C86 16.9543 77.0457 8 66 8C54.9543 8 46 16.9543 46 28C46 39.0457 54.9543 48 66 48ZM59.6667 37.0667L66.2667 30.4667L72.8667 37.0667C73.1778 37.3778 73.5444 37.5333 73.9667 37.5333C74.3889 37.5333 74.7556 37.3778 75.0667 37.0667C75.3778 36.7556 75.5333 36.3889 75.5333 35.9667C75.5333 35.5444 75.3778 35.1778 75.0667 34.8667L68.4667 28.2667L75.0667 21.6667C75.3778 21.3556 75.5333 20.9889 75.5333 20.5667C75.5333 20.1444 75.3778 19.7778 75.0667 19.4667C74.7556 19.1556 74.3889 19 73.9667 19C73.5444 19 73.1778 19.1556 72.8667 19.4667L66.2667 26.0667L59.6667 19.4667C59.3556 19.1556 58.9889 19 58.5667 19C58.1444 19 57.7778 19.1556 57.4667 19.4667C57.1556 19.7778 57 20.1444 57 20.5667C57 20.9889 57.1556 21.3556 57.4667 21.6667L64.0667 28.2667L57.4667 34.8667C57.1556 35.1778 57 35.5444 57 35.9667C57 36.3889 57.1556 36.7556 57.4667 37.0667C57.7778 37.3778 58.1444 37.5333 58.5667 37.5333C58.9889 37.5333 59.3556 37.3778 59.6667 37.0667Z" fill="#F04444"/>
</g>
<defs>
<filter id="filter0_d_503_299" x="42" y="7" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_503_299"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_503_299" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -0,0 +1,20 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM2 13.5H130V10.5H2V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM130 42.5L2 42.5V45.5L130 45.5V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_503_333)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 48C77.0457 48 86 39.0457 86 28C86 16.9543 77.0457 8 66 8C54.9543 8 46 16.9543 46 28C46 39.0457 54.9543 48 66 48ZM62.0168 35.7834C62.2057 35.8611 62.4001 35.9 62.6001 35.9C62.8001 35.9 62.9945 35.8611 63.1834 35.7834C63.3723 35.7056 63.5334 35.5889 63.6668 35.4334L76.4334 22.6667C76.7445 22.3778 76.9001 22.0167 76.9001 21.5834C76.9001 21.15 76.7445 20.7778 76.4334 20.4667C76.1445 20.1556 75.789 20.0056 75.3668 20.0167C74.9445 20.0278 74.5779 20.1778 74.2668 20.4667L62.6001 32.1334L57.7334 27.2334C57.4223 26.9445 57.0501 26.8 56.6168 26.8C56.1834 26.8 55.8223 26.9445 55.5334 27.2334C55.2445 27.5222 55.1001 27.8889 55.1001 28.3334C55.1001 28.7778 55.2445 29.1445 55.5334 29.4334L61.5668 35.4334C61.6779 35.5889 61.8279 35.7056 62.0168 35.7834Z" fill="#23C55E"/>
</g>
<defs>
<filter id="filter0_d_503_333" x="42" y="7" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_503_333"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_503_333" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,20 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM2 13.5H130V10.5H2V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM130 42.5L2 42.5V45.5L130 45.5V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_1756_38)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 47.9998C77.0457 47.9998 86 39.0455 86 27.9998C86 16.9541 77.0457 7.99976 66 7.99976C54.9543 7.99976 46 16.9541 46 27.9998C46 39.0455 54.9543 47.9998 66 47.9998ZM63.555 32.7332H67.3209V32.0227C67.3209 31.2885 67.4749 30.6608 67.7828 30.1398C68.1144 29.595 68.5288 29.1095 69.0262 28.6832C69.5473 28.2331 70.092 27.8068 70.6605 27.4042C71.2289 26.9779 71.7618 26.516 72.2592 26.0186C72.7802 25.5212 73.1947 24.9528 73.5026 24.3133C73.8342 23.6502 74 22.8686 74 21.9685C74 19.9317 73.325 18.4277 71.975 17.4566C70.6486 16.4855 68.8486 16 66.5748 16C64.7985 16 63.2353 16.3316 61.8853 16.9948C60.5589 17.6579 59.5405 18.5698 58.83 19.7303C58.1431 20.8909 57.8826 22.2291 58.0484 23.7449L61.4234 26.1607C61.2339 24.716 61.3287 23.5199 61.7076 22.5725C62.1103 21.6251 62.7142 20.9264 63.5195 20.4764C64.3248 20.0027 65.2485 19.7659 66.2906 19.7659C67.4749 19.7659 68.3275 20.0146 68.8486 20.5119C69.3933 20.9856 69.6657 21.6014 69.6657 22.3593C69.6657 22.9751 69.5117 23.508 69.2038 23.9581C68.9196 24.4081 68.5407 24.8225 68.067 25.2015C67.617 25.5805 67.1314 25.9713 66.6104 26.3739C66.0893 26.7765 65.5919 27.2147 65.1182 27.6884C64.6682 28.1621 64.2893 28.7305 63.9814 29.3937C63.6972 30.0332 63.555 30.8029 63.555 31.703V32.7332ZM63.1287 40.1229H67.6762V35.078H63.1287V40.1229Z" fill="#E9B308"/>
</g>
<defs>
<filter id="filter0_d_1756_38" x="42" y="6.99976" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1756_38"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1756_38" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,20 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM4.95385 13.5C5.78227 13.5 6.45385 12.8284 6.45385 12C6.45385 11.1716 5.78227 10.5 4.95385 10.5V13.5ZM11.8462 10.5C11.0177 10.5 10.3462 11.1716 10.3462 12C10.3462 12.8284 11.0177 13.5 11.8462 13.5V10.5ZM17.7538 13.5C18.5823 13.5 19.2538 12.8284 19.2538 12C19.2538 11.1716 18.5823 10.5 17.7538 10.5V13.5ZM24.6462 10.5C23.8177 10.5 23.1462 11.1716 23.1462 12C23.1462 12.8284 23.8177 13.5 24.6462 13.5V10.5ZM30.5538 13.5C31.3823 13.5 32.0538 12.8284 32.0538 12C32.0538 11.1716 31.3823 10.5 30.5538 10.5V13.5ZM37.4462 10.5C36.6177 10.5 35.9462 11.1716 35.9462 12C35.9462 12.8284 36.6177 13.5 37.4462 13.5V10.5ZM43.3538 13.5C44.1823 13.5 44.8538 12.8284 44.8538 12C44.8538 11.1716 44.1823 10.5 43.3538 10.5V13.5ZM50.2462 10.5C49.4177 10.5 48.7462 11.1716 48.7462 12C48.7462 12.8284 49.4177 13.5 50.2462 13.5V10.5ZM56.1538 13.5C56.9823 13.5 57.6538 12.8284 57.6538 12C57.6538 11.1716 56.9823 10.5 56.1538 10.5V13.5ZM63.0462 10.5C62.2177 10.5 61.5462 11.1716 61.5462 12C61.5462 12.8284 62.2177 13.5 63.0462 13.5V10.5ZM68.9538 13.5C69.7823 13.5 70.4538 12.8284 70.4538 12C70.4538 11.1716 69.7823 10.5 68.9538 10.5V13.5ZM75.8462 10.5C75.0177 10.5 74.3462 11.1716 74.3462 12C74.3462 12.8284 75.0177 13.5 75.8462 13.5V10.5ZM81.7539 13.5C82.5823 13.5 83.2539 12.8284 83.2539 12C83.2539 11.1716 82.5823 10.5 81.7539 10.5V13.5ZM88.6462 10.5C87.8177 10.5 87.1462 11.1716 87.1462 12C87.1462 12.8284 87.8177 13.5 88.6462 13.5V10.5ZM94.5539 13.5C95.3823 13.5 96.0539 12.8284 96.0539 12C96.0539 11.1716 95.3823 10.5 94.5539 10.5V13.5ZM101.446 10.5C100.618 10.5 99.9462 11.1716 99.9462 12C99.9462 12.8284 100.618 13.5 101.446 13.5V10.5ZM107.354 13.5C108.182 13.5 108.854 12.8284 108.854 12C108.854 11.1716 108.182 10.5 107.354 10.5V13.5ZM114.246 10.5C113.418 10.5 112.746 11.1716 112.746 12C112.746 12.8284 113.418 13.5 114.246 13.5V10.5ZM120.154 13.5C120.982 13.5 121.654 12.8284 121.654 12C121.654 11.1716 120.982 10.5 120.154 10.5V13.5ZM127.046 10.5C126.218 10.5 125.546 11.1716 125.546 12C125.546 12.8284 126.218 13.5 127.046 13.5V10.5ZM2 13.5H4.95385V10.5H2V13.5ZM11.8462 13.5H17.7538V10.5H11.8462V13.5ZM24.6462 13.5H30.5538V10.5H24.6462V13.5ZM37.4462 13.5H43.3538V10.5H37.4462V13.5ZM50.2462 13.5H56.1538V10.5H50.2462V13.5ZM63.0462 13.5H68.9538V10.5H63.0462V13.5ZM75.8462 13.5H81.7539V10.5H75.8462V13.5ZM88.6462 13.5H94.5539V10.5H88.6462V13.5ZM101.446 13.5H107.354V10.5H101.446V13.5ZM114.246 13.5H120.154V10.5H114.246V13.5ZM127.046 13.5H130V10.5H127.046V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM127.046 42.5C126.218 42.5 125.546 43.1716 125.546 44C125.546 44.8284 126.218 45.5 127.046 45.5V42.5ZM120.154 45.5C120.982 45.5 121.654 44.8284 121.654 44C121.654 43.1716 120.982 42.5 120.154 42.5V45.5ZM114.246 42.5C113.418 42.5 112.746 43.1716 112.746 44C112.746 44.8284 113.418 45.5 114.246 45.5V42.5ZM107.354 45.5C108.182 45.5 108.854 44.8284 108.854 44C108.854 43.1716 108.182 42.5 107.354 42.5V45.5ZM101.446 42.5C100.618 42.5 99.9462 43.1716 99.9462 44C99.9462 44.8284 100.618 45.5 101.446 45.5V42.5ZM94.5538 45.5C95.3823 45.5 96.0538 44.8284 96.0538 44C96.0538 43.1716 95.3823 42.5 94.5538 42.5V45.5ZM88.6462 42.5C87.8177 42.5 87.1462 43.1716 87.1462 44C87.1462 44.8284 87.8177 45.5 88.6462 45.5V42.5ZM81.7538 45.5C82.5823 45.5 83.2538 44.8284 83.2538 44C83.2538 43.1716 82.5823 42.5 81.7538 42.5V45.5ZM75.8462 42.5C75.0177 42.5 74.3462 43.1716 74.3462 44C74.3462 44.8284 75.0177 45.5 75.8462 45.5V42.5ZM68.9538 45.5C69.7823 45.5 70.4538 44.8284 70.4538 44C70.4538 43.1716 69.7823 42.5 68.9538 42.5V45.5ZM63.0462 42.5C62.2177 42.5 61.5462 43.1716 61.5462 44C61.5462 44.8284 62.2177 45.5 63.0462 45.5V42.5ZM56.1538 45.5C56.9823 45.5 57.6538 44.8284 57.6538 44C57.6538 43.1716 56.9823 42.5 56.1538 42.5V45.5ZM50.2461 42.5C49.4177 42.5 48.7461 43.1716 48.7461 44C48.7461 44.8284 49.4177 45.5 50.2461 45.5V42.5ZM43.3538 45.5C44.1823 45.5 44.8538 44.8284 44.8538 44C44.8538 43.1716 44.1823 42.5 43.3538 42.5V45.5ZM37.4461 42.5C36.6177 42.5 35.9461 43.1716 35.9461 44C35.9461 44.8284 36.6177 45.5 37.4461 45.5V42.5ZM30.5538 45.5C31.3823 45.5 32.0538 44.8284 32.0538 44C32.0538 43.1716 31.3823 42.5 30.5538 42.5V45.5ZM24.6461 42.5C23.8177 42.5 23.1461 43.1716 23.1461 44C23.1461 44.8284 23.8177 45.5 24.6461 45.5V42.5ZM17.7538 45.5C18.5823 45.5 19.2538 44.8284 19.2538 44C19.2538 43.1716 18.5823 42.5 17.7538 42.5V45.5ZM11.8461 42.5C11.0177 42.5 10.3461 43.1716 10.3461 44C10.3461 44.8284 11.0177 45.5 11.8461 45.5V42.5ZM4.95383 45.5C5.78225 45.5 6.45383 44.8284 6.45383 44C6.45383 43.1716 5.78225 42.5 4.95383 42.5V45.5ZM130 42.5H127.046V45.5H130V42.5ZM120.154 42.5H114.246V45.5H120.154V42.5ZM107.354 42.5H101.446V45.5H107.354V42.5ZM94.5538 42.5H88.6462V45.5H94.5538V42.5ZM81.7538 42.5H75.8462V45.5H81.7538V42.5ZM68.9538 42.5H63.0462V45.5H68.9538V42.5ZM56.1538 42.5H50.2461V45.5H56.1538V42.5ZM43.3538 42.5H37.4461V45.5H43.3538V42.5ZM30.5538 42.5H24.6461V45.5H30.5538V42.5ZM17.7538 42.5H11.8461V45.5H17.7538V42.5ZM4.95383 42.5H2V45.5H4.95383V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_503_316)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 48C77.0457 48 86 39.0457 86 28C86 16.9543 77.0457 8 66 8C54.9543 8 46 16.9543 46 28C46 39.0457 54.9543 48 66 48ZM67.4585 27.0375L69.4418 29.05C69.714 29.05 69.9522 28.9479 70.1564 28.7438C70.3605 28.5396 70.4626 28.3014 70.4626 28.0292C70.4626 27.757 70.3605 27.5236 70.1564 27.3292C69.9522 27.1348 69.714 27.0375 69.4418 27.0375H67.4585ZM72.1835 31.8209L74.3418 33.9209C75.4112 33.4542 76.3251 32.6959 77.0835 31.6459C77.8418 30.5959 78.221 29.4098 78.221 28.0875C78.221 26.2403 77.589 24.6799 76.3251 23.4063C75.0612 22.1327 73.496 21.4959 71.6293 21.4959H68.8293C68.4404 21.4959 68.1147 21.632 67.8522 21.9042C67.5897 22.1764 67.4585 22.507 67.4585 22.8959C67.4585 23.2848 67.5897 23.6104 67.8522 23.8729C68.1147 24.1354 68.4404 24.2667 68.8293 24.2667H71.6585C72.7474 24.2667 73.6515 24.6264 74.371 25.3459C75.0904 26.0653 75.4501 26.9792 75.4501 28.0875C75.4501 29.0014 75.1487 29.8084 74.546 30.5084C73.9432 31.2084 73.1557 31.6459 72.1835 31.8209ZM63.9863 29.05L74.546 39.5792C74.7599 39.8125 75.0078 39.9292 75.2897 39.9292C75.5717 39.9292 75.8196 39.8125 76.0335 39.5792C76.2474 39.3653 76.3543 39.1271 76.3543 38.8646C76.3543 38.6021 76.2474 38.3639 76.0335 38.15L55.821 17.9375C55.5876 17.7236 55.3349 17.6167 55.0626 17.6167C54.7904 17.6167 54.5474 17.7236 54.3335 17.9375C54.1001 18.1709 53.9883 18.4236 53.998 18.6959C54.0078 18.9681 54.1196 19.2111 54.3335 19.425L57.1687 22.2521C56.3256 22.7064 55.609 23.3294 55.0189 24.1209C54.1925 25.2292 53.7793 26.5223 53.7793 28C53.7793 29.8473 54.4112 31.4028 55.6751 32.6667C56.939 33.9306 58.5043 34.5625 60.371 34.5625H63.6085C63.9974 34.5625 64.3279 34.4313 64.6001 34.1688C64.8724 33.9063 65.0085 33.5806 65.0085 33.1917C65.0085 32.8028 64.8724 32.4771 64.6001 32.2146C64.3279 31.9521 63.9974 31.8209 63.6085 31.8209H60.371C59.2626 31.8209 58.3487 31.4611 57.6293 30.7417C56.9099 30.0223 56.5501 29.1084 56.5501 28C56.5501 26.8917 56.9099 25.9778 57.6293 25.2584C58.0882 24.7995 58.6262 24.4869 59.2433 24.3207L62.0223 27.0916C61.9526 27.1327 61.8883 27.1827 61.8293 27.2417C61.6349 27.4361 61.5376 27.6889 61.5376 28C61.5376 28.3111 61.6397 28.5639 61.8439 28.7584C62.048 28.9528 62.296 29.05 62.5876 29.05H63.9863Z" fill="#71717B"/>
</g>
<defs>
<filter id="filter0_d_503_316" x="42" y="7" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_503_316"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_503_316" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -0,0 +1,20 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM2 13.5H130V10.5H2V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM130 42.5L2 42.5V45.5L130 45.5V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_505_398)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 48C77.0457 48 86 39.0457 86 28C86 16.9543 77.0457 8 66 8C54.9543 8 46 16.9543 46 28C46 39.0457 54.9543 48 66 48ZM67.5 17.75C67.5 18.7165 66.7165 19.5 65.75 19.5C64.7835 19.5 64 18.7165 64 17.75C64 16.7835 64.7835 16 65.75 16C66.7165 16 67.5 16.7835 67.5 17.75ZM65.75 23C66.5784 23 67.25 23.6716 67.25 24.5V38.5C67.25 39.3284 66.5784 40 65.75 40C64.9216 40 64.25 39.3284 64.25 38.5V24.5C64.25 23.6716 64.9216 23 65.75 23Z" fill="#E9B308"/>
</g>
<defs>
<filter id="filter0_d_505_398" x="42" y="7" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_505_398"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_505_398" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,27 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_45)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_601_45)"/>
<path d="M39.175 38.55H24.65V35.775L32.6 25.25H33.65V29.175H33.25L28.45 35.45H39.175V38.55ZM36.6 42H33.025V25.25H36.6V42ZM47.8797 42.225C46.2797 42.225 44.9297 41.8583 43.8297 41.125C42.7297 40.375 41.888 39.35 41.3047 38.05C40.738 36.75 40.4547 35.2667 40.4547 33.6C40.4547 31.9333 40.738 30.4583 41.3047 29.175C41.888 27.875 42.7297 26.8583 43.8297 26.125C44.9297 25.375 46.2797 25 47.8797 25C49.463 25 50.8047 25.375 51.9047 26.125C53.0214 26.8583 53.863 27.875 54.4297 29.175C54.9964 30.4583 55.2797 31.9333 55.2797 33.6C55.2797 35.2667 54.9964 36.75 54.4297 38.05C53.863 39.35 53.0214 40.375 51.9047 41.125C50.8047 41.8583 49.463 42.225 47.8797 42.225ZM47.8797 38.75C48.7464 38.75 49.4464 38.5417 49.9797 38.125C50.513 37.7083 50.9047 37.1083 51.1547 36.325C51.4047 35.5417 51.5297 34.6333 51.5297 33.6C51.5297 32.55 51.4047 31.6417 51.1547 30.875C50.9047 30.1083 50.513 29.5167 49.9797 29.1C49.4464 28.6667 48.7464 28.45 47.8797 28.45C47.013 28.45 46.313 28.6667 45.7797 29.1C45.2464 29.5167 44.8547 30.1083 44.6047 30.875C44.3547 31.6417 44.2297 32.55 44.2297 33.6C44.2297 34.6333 44.3547 35.5417 44.6047 36.325C44.8547 37.1083 45.2464 37.7083 45.7797 38.125C46.313 38.5417 47.013 38.75 47.8797 38.75ZM61.2248 42H57.6498V25.25H61.2248V42ZM69.5998 42H58.8998V38.825H69.5998V42Z" fill="#B42323"/>
<g style="mix-blend-mode:overlay" opacity="0.5">
<mask id="mask0_601_45" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="121" y="-51" width="226" height="226">
<rect x="121.584" y="-2.90686" width="183.584" height="183.584" transform="rotate(-15 121.584 -2.90686)" fill="url(#paint1_radial_601_45)"/>
</mask>
<g mask="url(#mask0_601_45)">
<path d="M237.048 132.458L230.578 78.757L204.717 85.6862C202.87 86.1812 201.598 85.9942 200.9 85.1251C200.208 84.2548 200.123 82.8256 200.646 80.8376L223.577 -6.47827L230.966 -8.45807L237.436 45.2426L263.296 38.3133C265.144 37.8184 266.413 38.0061 267.106 38.8764C267.803 39.7454 267.89 41.1739 267.367 43.1619L244.436 130.478L237.048 132.458Z" fill="#1C1B1F"/>
</g>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_601_45" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC7C7"/>
<stop offset="1" stop-color="#FA9C9C"/>
</linearGradient>
<radialGradient id="paint1_radial_601_45" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(213.376 88.8852) rotate(90) scale(97.5291)">
<stop offset="0.208333" stop-color="white" stop-opacity="0.78"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<clipPath id="clip0_601_45">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,33 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_13)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_601_13)"/>
<g style="mix-blend-mode:overlay" opacity="0.5">
<mask id="mask0_601_13" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="92" y="-32" width="209" height="208">
<rect x="92.9521" y="12.3839" width="169.169" height="169.169" transform="rotate(-15 92.9521 12.3839)" fill="url(#paint1_radial_601_13)"/>
</mask>
<g mask="url(#mask0_601_13)">
<rect x="201.286" y="49.032" width="42.2923" height="42.2923" transform="rotate(-15 201.286 49.032)" fill="black"/>
<rect x="115.499" y="72.0188" width="88.8138" height="42.2923" transform="rotate(-15 115.499 72.0188)" fill="url(#paint2_linear_601_13)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M204.462 106.925C216.305 116.473 229.328 121.132 243.531 120.903C255.945 114 264.896 103.454 270.383 89.2622C275.866 75.0756 276.667 60.738 272.785 46.2494L263.437 11.3625L212.882 6.51932L171.522 35.9911L175.681 51.5145L187.171 48.436L185.118 40.7764L216.138 18.6725L254.055 22.3049L261.295 49.328C264.386 60.8617 263.94 72.2191 259.958 83.4002C255.976 94.5814 249.427 103.079 240.313 108.892C229.512 108.415 219.593 104.33 210.553 96.6381C209.983 96.1531 209.425 95.6605 208.879 95.1602L195.757 98.6763C198.37 101.605 201.271 104.355 204.462 106.925Z" fill="black"/>
</g>
</g>
<path d="M27.925 42H24.125L30.4 25.25H35L41.275 42H37.35L33.65 31.65L32.65 28.1L31.65 31.65L27.925 42ZM37.125 38.275H27.625V35.25H37.125V38.275ZM48.8486 42H43.3236V38.825H48.5486C49.582 38.825 50.432 38.6333 51.0986 38.25C51.782 37.85 52.2903 37.2667 52.6236 36.5C52.957 35.7167 53.1236 34.7583 53.1236 33.625C53.1236 32.475 52.9486 31.5167 52.5986 30.75C52.2653 29.9833 51.757 29.4083 51.0736 29.025C50.3903 28.625 49.532 28.425 48.4986 28.425H43.3236V25.25H48.7986C50.4986 25.25 51.9486 25.6 53.1486 26.3C54.3653 27 55.2903 27.975 55.9236 29.225C56.557 30.475 56.8736 31.9417 56.8736 33.625C56.8736 35.2917 56.557 36.7583 55.9236 38.025C55.2903 39.275 54.3736 40.25 53.1736 40.95C51.9903 41.65 50.5486 42 48.8486 42ZM45.6486 42H42.0736V25.25H45.6486V42ZM65.9914 37.15H60.4414V33.975H65.8664C66.4831 33.975 67.0247 33.8833 67.4914 33.7C67.9747 33.5167 68.3497 33.225 68.6164 32.825C68.8997 32.425 69.0414 31.9 69.0414 31.25C69.0414 30.55 68.8997 30 68.6164 29.6C68.3497 29.1833 67.9747 28.8833 67.4914 28.7C67.0247 28.5167 66.4831 28.425 65.8664 28.425H60.4414V25.25H65.9914C67.2747 25.25 68.4247 25.4583 69.4414 25.875C70.4747 26.2917 71.2914 26.9417 71.8914 27.825C72.4914 28.6917 72.7914 29.8333 72.7914 31.25C72.7914 32.6333 72.4914 33.7583 71.8914 34.625C71.3081 35.4917 70.4997 36.1333 69.4664 36.55C68.4497 36.95 67.2914 37.15 65.9914 37.15ZM62.6164 42H59.0414V25.25H62.6164V42ZM78.1682 42H74.5932V25.25H79.3182L82.0432 31.475L83.6182 36.45L85.1932 31.475L87.9182 25.25H92.6432V42H89.0682V35.725L89.5682 28.975L87.5682 34.55L85.4932 39.1H81.7432L79.6682 34.55L77.6432 28.975L78.1682 35.725V42Z" fill="#235DB4"/>
</g>
<defs>
<linearGradient id="paint0_linear_601_13" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7DAFF"/>
<stop offset="1" stop-color="#9CBCFA"/>
</linearGradient>
<radialGradient id="paint1_radial_601_13" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(177.537 96.9684) rotate(90) scale(89.8711)">
<stop offset="0.208333" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint2_linear_601_13" x1="115.499" y1="72.0188" x2="204.313" y2="72.0188" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<clipPath id="clip0_601_13">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1,44 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_29)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_601_29)"/>
<path d="M27.925 42H24.125L30.4 25.25H35L41.275 42H37.35L33.65 31.65L32.65 28.1L31.65 31.65L27.925 42ZM37.125 38.275H27.625V35.25H37.125V38.275ZM49.0236 37.15H43.4736V33.975H48.8986C49.5153 33.975 50.057 33.8833 50.5236 33.7C51.007 33.5167 51.382 33.225 51.6486 32.825C51.932 32.425 52.0736 31.9 52.0736 31.25C52.0736 30.55 51.932 30 51.6486 29.6C51.382 29.1833 51.007 28.8833 50.5236 28.7C50.057 28.5167 49.5153 28.425 48.8986 28.425H43.4736V25.25H49.0236C50.307 25.25 51.457 25.4583 52.4736 25.875C53.507 26.2917 54.3236 26.9417 54.9236 27.825C55.5236 28.6917 55.8236 29.8333 55.8236 31.25C55.8236 32.6333 55.5236 33.7583 54.9236 34.625C54.3403 35.4917 53.532 36.1333 52.4986 36.55C51.482 36.95 50.3236 37.15 49.0236 37.15ZM45.6486 42H42.0736V25.25H45.6486V42ZM61.2004 42H57.6254V25.25H62.3504L65.0754 31.475L66.6504 36.45L68.2254 31.475L70.9504 25.25H75.6754V42H72.1004V35.725L72.6004 28.975L70.6004 34.55L68.5254 39.1H64.7754L62.7004 34.55L60.6754 28.975L61.2004 35.725V42Z" fill="#B5530A"/>
<g style="mix-blend-mode:overlay" opacity="0.8">
<mask id="mask0_601_29" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="122" y="-15" width="154" height="154">
<rect x="122" y="18" width="125" height="125" transform="rotate(-15 122 18)" fill="url(#paint1_radial_601_29)"/>
</mask>
<g mask="url(#mask0_601_29)">
<rect x="178.355" y="10.9877" width="31.25" height="31.25" transform="rotate(-15 178.355 10.9877)" fill="black"/>
<rect x="217.141" y="41.0355" width="31.25" height="31.25" transform="rotate(-15 217.141 41.0355)" fill="black"/>
<rect x="181.974" y="90.8991" width="31.25" height="31.25" transform="rotate(-15 181.974 90.8991)" fill="black"/>
<rect x="124.022" y="25.5463" width="56.25" height="31.25" transform="rotate(-15 124.022 25.5463)" fill="url(#paint2_linear_601_29)"/>
<rect x="144.242" y="101.009" width="39.0625" height="31.25" transform="rotate(-15 144.242 101.009)" fill="url(#paint3_linear_601_29)"/>
<rect x="134.132" y="63.2778" width="85.9375" height="31.25" transform="rotate(-15 134.132 63.2778)" fill="url(#paint4_linear_601_29)"/>
</g>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_601_29" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFEAC7"/>
<stop offset="1" stop-color="#FACF9C"/>
</linearGradient>
<radialGradient id="paint1_radial_601_29" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(184.5 80.5) rotate(90) scale(66.4062)">
<stop offset="0.208333" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint2_linear_601_29" x1="124.022" y1="25.5463" x2="180.272" y2="25.5463" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint3_linear_601_29" x1="144.242" y1="101.009" x2="183.305" y2="101.009" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint4_linear_601_29" x1="134.132" y1="63.2778" x2="220.07" y2="63.2778" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<clipPath id="clip0_601_29">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,27 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_51)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_601_51)"/>
<g style="mix-blend-mode:overlay">
<mask id="mask0_601_51" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="127" y="-29" width="195" height="196">
<rect x="127.168" y="12.7571" width="158.811" height="158.811" transform="rotate(-15 127.168 12.7571)" fill="url(#paint1_radial_601_51)"/>
</mask>
<g mask="url(#mask0_601_51)">
<path d="M189.83 16.5183L186.405 3.73504L224.755 -6.54079L228.18 6.24251L189.83 16.5183ZM221.453 83.4012L234.236 79.976L223.96 41.6261L211.177 45.0513L221.453 83.4012ZM241.545 132.822C233.662 134.934 225.825 135.408 218.032 134.245C210.242 133.076 203.038 130.58 196.42 126.759C189.801 122.938 184.039 117.947 179.131 111.785C174.227 105.619 170.719 98.5937 168.607 90.7107C166.495 82.8277 166.02 74.9898 167.184 67.1972C168.353 59.4077 170.848 52.2037 174.669 45.5852C178.491 38.9667 183.482 33.206 189.645 28.303C195.811 23.3946 202.835 19.8843 210.718 17.7721C217.323 16.0024 223.946 15.3693 230.589 15.8728C237.232 16.3764 243.759 17.9385 250.17 20.5594L256.721 9.21339L268.067 15.764L261.516 27.11C266.992 31.3517 271.608 36.2232 275.366 41.7244C279.123 47.2255 281.887 53.2785 283.657 59.8832C285.769 67.7662 286.243 75.6041 285.079 83.3967C283.91 91.1862 281.415 98.3902 277.594 105.009C273.773 111.627 268.781 117.39 262.62 122.297C256.453 127.201 249.428 130.71 241.545 132.822ZM238.12 120.039C250.477 116.727 259.853 109.534 266.248 98.4581C272.643 87.3822 274.184 75.6657 270.873 63.3085C267.562 50.9513 260.369 41.5754 249.293 35.1807C238.217 28.7861 226.5 27.2443 214.143 30.5554C201.786 33.8665 192.41 41.06 186.015 52.1358C179.621 63.2117 178.079 74.9282 181.39 87.2854C184.701 99.6426 191.895 109.019 202.971 115.413C214.046 121.808 225.763 123.35 238.12 120.039Z" fill="#1C1B1F"/>
</g>
</g>
<path d="M33.475 42H26.95V38.825H32.95C33.9 38.825 34.5917 38.6667 35.025 38.35C35.4583 38.0333 35.675 37.5333 35.675 36.85C35.675 36.4 35.5667 36.0333 35.35 35.75C35.15 35.4667 34.85 35.2583 34.45 35.125C34.05 34.975 33.5667 34.9 33 34.9H26.95V32.025H32.675C33.1417 32.025 33.5417 31.9667 33.875 31.85C34.225 31.7333 34.4917 31.55 34.675 31.3C34.875 31.0333 34.975 30.6833 34.975 30.25C34.975 29.7833 34.875 29.425 34.675 29.175C34.4917 28.9083 34.225 28.7167 33.875 28.6C33.525 28.4833 33.1083 28.425 32.625 28.425H26.95V25.25H33.575C34.8083 25.25 35.8 25.4417 36.55 25.825C37.3167 26.1917 37.875 26.7 38.225 27.35C38.575 28 38.75 28.7167 38.75 29.5C38.75 30.2167 38.6 30.825 38.3 31.325C38.0167 31.8083 37.6333 32.2 37.15 32.5C36.6667 32.7833 36.1167 33 35.5 33.15C34.8833 33.2833 34.25 33.3667 33.6 33.4C35.0167 33.45 36.1417 33.6583 36.975 34.025C37.825 34.3917 38.4333 34.8917 38.8 35.525C39.1667 36.1417 39.35 36.8417 39.35 37.625C39.35 38.675 39.1083 39.5167 38.625 40.15C38.1417 40.7833 37.4583 41.25 36.575 41.55C35.6917 41.85 34.6583 42 33.475 42ZM28.925 42H25.35V25.25H28.925V42ZM44.9871 42H41.4121V25.25H44.9871V42ZM51.0906 28.3H47.5156V25.25H51.0906V28.3ZM51.0906 42H47.5156V29.75H51.0906V42ZM58.4691 42.25C57.5691 42.25 56.8191 42.0833 56.2191 41.75C55.6358 41.4167 55.2025 40.9583 54.9191 40.375C54.6358 39.7917 54.4941 39.125 54.4941 38.375V28.3L58.0691 26.425V37.725C58.0691 38.225 58.1775 38.575 58.3941 38.775C58.6275 38.975 58.9191 39.075 59.2691 39.075C59.6525 39.075 60.0025 38.95 60.3191 38.7C60.6525 38.4333 60.9108 38.125 61.0941 37.775L62.1191 40.7C61.8525 41.0333 61.4108 41.375 60.7941 41.725C60.1775 42.075 59.4025 42.25 58.4691 42.25ZM61.4691 32.475H52.6691V29.75H61.4691V32.475ZM73.9848 42H62.7848V39.375L67.0348 34.725L69.6598 32.475L66.0348 32.65H63.1348V29.75H73.7348V32.375L69.4098 36.8L66.6348 39.25L70.4098 39.1H73.9848V42Z" fill="#8E23B4"/>
</g>
<defs>
<linearGradient id="paint0_linear_601_51" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#EAC7FF"/>
<stop offset="1" stop-color="#D19CFA"/>
</linearGradient>
<radialGradient id="paint1_radial_601_51" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(206.573 92.1626) rotate(90) scale(84.3683)">
<stop offset="0.208333" stop-color="white" stop-opacity="0.78"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<clipPath id="clip0_601_51">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,36 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_57)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_601_57)"/>
<g style="mix-blend-mode:overlay">
<mask id="mask0_601_57" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="122" y="-15" width="154" height="154">
<rect x="122" y="18" width="125" height="125" transform="rotate(-15 122 18)" fill="url(#paint1_radial_601_57)"/>
</mask>
<g mask="url(#mask0_601_57)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M190.033 96.8278L146.264 108.556L154.352 138.741L213.213 122.969L209.169 107.876L194.077 111.92L190.033 96.8278ZM275.093 106.388L231.324 118.116L223.236 87.9309L267.005 76.2032L275.093 106.388Z" fill="black"/>
<rect x="138.176" y="78.3704" width="45.3125" height="31.25" transform="rotate(-15 138.176 78.3704)" fill="black"/>
<rect x="215.148" y="57.7457" width="45.3125" height="31.25" transform="rotate(-15 215.148 57.7457)" fill="black"/>
<rect x="167.278" y="5.86786" width="31.25" height="62.5" transform="rotate(-15 167.278 5.86786)" fill="url(#paint2_linear_601_57)"/>
<rect x="198.547" y="62.1942" width="15.625" height="31.25" transform="rotate(-15 198.547 62.1942)" fill="black"/>
<rect x="179.41" y="51.1456" width="15.625" height="31.25" transform="rotate(-15 179.41 51.1456)" fill="black"/>
</g>
</g>
<path d="M28.925 42H25.35V25.25H28.925V42ZM37.3 42H26.6V38.825H37.3V42ZM37.685 32.425L36.985 30.625C37.4516 30.6083 37.8433 30.525 38.16 30.375C38.4933 30.225 38.66 29.9167 38.66 29.45V29.125H36.935V25.25H40.735V29.225C40.735 30.1917 40.4766 30.9417 39.96 31.475C39.46 32.0083 38.7016 32.325 37.685 32.425ZM49.8781 37.15H44.3281V33.975H49.7531C50.3698 33.975 50.9115 33.8833 51.3781 33.7C51.8615 33.5167 52.2365 33.225 52.5031 32.825C52.7865 32.425 52.9281 31.9 52.9281 31.25C52.9281 30.55 52.7865 30 52.5031 29.6C52.2365 29.1833 51.8615 28.8833 51.3781 28.7C50.9115 28.5167 50.3698 28.425 49.7531 28.425H44.3281V25.25H49.8781C51.1615 25.25 52.3115 25.4583 53.3281 25.875C54.3615 26.2917 55.1781 26.9417 55.7781 27.825C56.3781 28.6917 56.6781 29.8333 56.6781 31.25C56.6781 32.6333 56.3781 33.7583 55.7781 34.625C55.1948 35.4917 54.3865 36.1333 53.3531 36.55C52.3365 36.95 51.1781 37.15 49.8781 37.15ZM46.5031 42H42.9281V25.25H46.5031V42ZM62.0549 42H58.4799V25.25H63.2049L65.9299 31.475L67.5049 36.45L69.0799 31.475L71.8049 25.25H76.5299V42H72.9549V35.725L73.4549 28.975L71.4549 34.55L69.3799 39.1H65.6299L63.5549 34.55L61.5299 28.975L62.0549 35.725V42Z" fill="#4D7D0F"/>
</g>
<defs>
<linearGradient id="paint0_linear_601_57" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#EBFFC7"/>
<stop offset="1" stop-color="#D8FA9C"/>
</linearGradient>
<radialGradient id="paint1_radial_601_57" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(184.5 80.5) rotate(90) scale(66.4062)">
<stop offset="0.208333" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint2_linear_601_57" x1="182.903" y1="5.86786" x2="182.903" y2="68.3679" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<clipPath id="clip0_601_57">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,30 @@
<svg width="88" height="88" viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ddd_936_155)">
<circle cx="44" cy="44" r="10" fill="#4F9DFF"/>
<circle cx="44" cy="44" r="8.5" stroke="#FAFAFA" stroke-width="3"/>
</g>
<defs>
<filter id="filter0_ddd_936_155" x="0" y="0" width="88" height="88" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="12"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.309804 0 0 0 0 0.615686 0 0 0 0 1 0 0 0 1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_936_155"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="7"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.309804 0 0 0 0 0.615686 0 0 0 0 1 0 0 0 1 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_936_155" result="effect2_dropShadow_936_155"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="17"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.309804 0 0 0 0 0.615686 0 0 0 0 1 0 0 0 1 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_936_155" result="effect3_dropShadow_936_155"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect3_dropShadow_936_155" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,92 @@
(C) Copyright 20192022 26F Studio.
This Font Software is licensed under the SIL Open Font License,
Version 1.1. This license is copied below, and is also available at
https://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@@ -0,0 +1,58 @@
Fontshare EULA
---—---------------------------------—------------------------------
Free Font - End User License Agreement (FF EULA)
---—---------------------------------—------------------------------
Notice to User
Indian Type Foundry designs, produces and distributes font software as digital fonts to end users worldwide. In addition to commercial fonts that are available for a fee, ITF also offers several fonts which can be used free of charge. The free fonts are distributed through a dedicated platform called www.fontshare.com (“Fontshare”) to end users worldwide. These free fonts are subject to this legally binding EULA between the Indian Type Foundry (“Indian Type Foundry” or “Licensor”) and you (“Licensee”). 
You acknowledge that the Font Software and designs embodied therein are protected by the copyright, other intellectual property rights and industrial property rights and by international treaties. They are and remain at all times the intellectual property of the Indian Type Foundry.
In addition to direct download, Fontshare also offers these free fonts via Fonthsare API using a code. In this case, the Font Software is delivered directly from the servers used by Indian Type Foundry to the Licensee's website, without the Licensee having to download the Font Software.
By downloading, accessing the API, installing, storing, copying or using one of any Font Software, you agree to the following terms. 
Definitions
“Font Software” refers to the set of computer files or programs released under this license that instructs your computer to display and/or print each letters, characters, typographic designs, ornament and so forth. Font Software includes all bitmap and vector representations of fonts and typographic representations and embellishments created by or derived from the Font Software. 
“Original Version” refers to the Font Software as distributed by the Indian Type Foundry as the copyright holder. 
“Derivative Work” refers to the pictorial representation of the font created by the Font Software, including typographic characters such as letters, numerals, ornaments, symbols, or punctuation and special characters.
01. Grant of License
You are hereby granted a non-exclusive, non-assignable, non-transferrable, terminable license to access, download and use the Font Software for your personal or commercial use for an unlimited period of time for free of charge. 
You may use the font Software in any media (including Print, Web, Mobile, Digital, Apps, ePub, Broadcasting and OEM) at any scale, at any location worldwide. 
You may use the Font Software to create logos and other graphic elements, images on any surface, vector files or other scalable drawings and static images. 
You may use the Font Software on any number of devices (computer, tablet, phone). The number of output devices (Printers) is not restricted. 
You may make only such reasonable number of back-up copies suitable to your permitted use. 
You may but are not required to identify Indian Type Foundry Fonts in your work credits. 
02. Limitations of usage
You may not modify, edit, adapt, translate, reverse engineer, decompile or disassemble, alter or otherwise copy the Font Software or the designs embodied therein in whole or in part, without the prior written consent of the Licensor. 
The Fonts may not - beyond the permitted copies and the uses defined herein - be distributed, duplicated, loaned, resold or licensed in any way, whether by lending, donating or give otherwise to a person or entity. This includes the distribution of the Fonts by e-mail, on USB sticks, CD-ROMs, or other media, uploading them in a public server or making the fonts available on peer-to-peer networks. A passing on to external designers or service providers (design agencies, repro studios, printers, etc.) is also not permitted. 
You are not allowed to transmit the Font Software over the Internet in font serving or for font replacement by means of technologies such as but not limited to EOT, Cufon, sIFR or similar technologies that may be developed in the future without the prior written consent of the Licensor. 
03. Embedding
You may embed the Font Software in PDF and other digital documents provided that is done in a secured, read-only mode. It must be ensured beyond doubt that the recipient cannot use the Font Software to edit or to create new documents. The design data (PDFs) created in this way and under these created design data (PDFs) may be distributed in any number. 
The extraction of the Font Software in whole or in part is prohibited. 
04. Third party use, Commercial print service provider
You may include the Font Software in a non-editable electronic document solely for printing and display purposes and provide that electronic document to the commercial print service provider for the purpose of printing. If the print service needs to install the fonts, they too need to download the Font Software from the Licensor's website.
05. Derivative Work
You are allowed to make derivative works as far as you use them for your personal or commercial use. However, you cannot modify, make changes or reverse engineer the original font software provided to you. Any derivative works are the exclusive property of the Licensor and shall be subject to the terms and conditions of this EULA. Derivative works may not be sub-licensed, sold, leased, rented, loaned, or given away without the express written permission of the Licensor. 
06. Warranty and Liability
BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, INDIAN TYPE FOUNDRY MAKES NO WARRANTIES, EXPRESS OR IMPLIED AS TO THE MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR OTHERWISE. THE FONT SOFTWARE WAS NOT MANUFACTURED FOR USE IN MANUFACTURING CONTROL DEVICES OR NAVIGATION DEVICES OR IN CIRCUMSTANCES THAT COULD RESULT IN ENVIRONMENTAL DAMAGE OR PERSONAL INJURY. WITHOUT LIMITING THE FOREGOING, INDIAN TYPE FOUNDRY SHALL IN NO EVENT BE LIABLE TO THE LICENSED USER OR ANY OTHER THIRD PARTY FOR ANY DIRECT, CONSEQUENTIAL OR INCIDENTAL DAMAGES, INCLUDING DAMAGES FROM LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION NOR FOR LOST PROFITS OR SAVINGS ARISING OUT OF THE USE OR INABILITY TO USE THE PRODUCT EVEN IF NOTIFIED IN ADVANCE, UNDER NO CIRCUMSTANCES SHALL INDIAN TYPE FOUNDRYS LIABILITY EXCEED THE REPLACEMENT COST OF THE SOFTWARE. 
IF LICENSEE CHOOSES TO ACCESS THE FONT SOFTWARE THROUGH A CODE (API), IT MAY HAVE A DIRECT IMPACT ON LICENSEE'S WEBSITE OR APPLICATIONS. INDIAN TYPE FOUNDRY IS NOT RESPONSIBLE OR LIABLE FOR ANY INTERRUPTION, MALFUNCTION, DOWNTIME OR OTHER FAILURE OF THE WEBSITE OR ITS API.
07. Updates, Maintenance and Support Services
Licensor will not provide you with any support services for the Software under this Agreement.
08. Termination 
Any breach of the terms of this agreement shall be a cause for termination, provided that such breach is notified in writing to the Licensee by the Licensor and the Licensee failed to rectify the breach within 30 days of the receipt of such notification. 
In the event of termination and without limitation of any remedies under law or equity, you must delete the Font Software and all copies thereof. Proof of this must be provided upon request of the Licensor.  
We reserve the right to claim damages for the violation of the conditions. 
09. Final Provisions
If individual provisions of this agreement are or become invalid, the validity of the remaining provisions shall remain unaffected. Invalid provisions shall be replaced by mutual agreement by such provisions that are suitable to achieve the desired economic purpose, taking into account the interests of both parties. The same shall apply mutatis mutandis to the filling of any gaps which may arise in this agreement.
This contract is subject to laws of the Republic of India. Place of performance and exclusive place of jurisdiction for all disputes between the parties arising out of or in connection with this contract is, as far as legally permissible, Ahmedabad, India.
- 
Last Updated on 22 March 2021
Copyright 2021 Indian Type Foundry. All rights reserved. 

View File

@@ -0,0 +1,96 @@
Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font
Name 'Source'. Source is a trademark of Adobe in the United States
and/or other countries.
This Font Software is licensed under the SIL Open Font License,
Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font
creation efforts of academic and linguistic communities, and to
provide a free and open framework in which fonts may be shared and
improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply to
any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software
components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to,
deleting, or substituting -- in part or in whole -- any of the
components of the Original Version, by changing formats or by porting
the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed,
modify, redistribute, and sell modified and unmodified copies of the
Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in
Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the
corresponding Copyright Holder. This restriction only applies to the
primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created using
the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -0,0 +1,7 @@
<svg width="71" height="71" viewBox="0 0 71 71" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M53.1133 39.2642L42.3935 49.9446C41.8086 50.5274 41.5161 50.8188 41.1788 50.928C40.8822 51.024 40.5626 51.024 40.2659 50.928C39.9287 50.8188 39.6362 50.5274 39.0512 49.9446L30.2776 41.2032L21.5041 49.9446C20.9191 50.5274 20.6266 50.8188 20.2893 50.928C19.9927 51.024 19.6731 51.024 19.3764 50.928C19.0392 50.8188 18.7467 50.5274 18.1617 49.9446L16.1772 47.9673L30.2776 33.9187L39.2299 42.8381C40.0952 43.7002 41.498 43.7002 42.3633 42.8381L53.1133 32.1276V39.2642Z" fill="#EA5252"/>
<path d="M57.5446 34.8491L59.9407 32.4618C60.5256 31.879 60.8181 31.5876 60.9277 31.2516C61.0241 30.956 61.0241 30.6376 60.9277 30.342C60.8181 30.006 60.5256 29.7146 59.9407 29.1318L57.5439 26.7438C57.5444 26.7619 57.5446 26.78 57.5446 26.7982L57.5446 34.8491Z" fill="#EA5252"/>
<path d="M55.3835 24.5913C55.3653 24.5908 55.3472 24.5906 55.3289 24.5906L46.9514 24.5906L49.4959 22.0554C50.0809 21.4726 50.3734 21.1812 50.7107 21.072C51.0073 20.976 51.3269 20.976 51.6236 21.072C51.9608 21.1812 52.2533 21.4726 52.8383 22.0554L55.3835 24.5913Z" fill="#EA5252"/>
<path d="M42.5201 29.0057L40.7224 30.7968L31.9488 22.0554C31.3638 21.4726 31.0714 21.1812 30.7341 21.072C30.4374 20.976 30.1179 20.976 29.8212 21.072C29.4839 21.1812 29.1914 21.4726 28.6065 22.0554L11.0593 39.5382C10.4744 40.121 10.1819 40.4124 10.0723 40.7484C9.9759 41.044 9.9759 41.3624 10.0723 41.658C10.1819 41.994 10.4744 42.2854 11.0593 42.8682L13.0438 44.8454L28.7109 29.2358C29.5762 28.3737 30.9791 28.3737 31.8443 29.2358L40.7966 38.1552L49.9799 29.0057H42.5201Z" fill="#EA5252"/>
<circle cx="35.5" cy="35.5" r="29.5" stroke="#EA5252" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M50 160V200H0V0H120V20H85V50H50V108L120 95V115H180V80H200V200H150V142L50 160ZM135 100V65H100V35H135V0H165V35H200V65H165V100H135Z" fill="#D8FA9C"/>
</svg>

After

Width:  |  Height:  |  Size: 303 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M50 160V200H0V0H160L178 18H95V50H50V108L150 90V78H200V200H150V142L50 160ZM200 33V63H110V33H200Z" fill="#D8FA9C"/>
</svg>

After

Width:  |  Height:  |  Size: 270 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M50 160V200H0V0H160L200 40V200H150V142L50 160ZM150 50H50V108L150 90V50Z" fill="#D8FA9C"/>
</svg>

After

Width:  |  Height:  |  Size: 246 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160V115L185 100L200 85V80H180V115H120V80H85V75H50V50H85V20H120V0H0V200H160L200 160ZM49.9998 125H150V150H49.9998V125ZM135 100V65H99.9998V35H135V1.03335e-05H165V35H200V65H165V100H135Z" fill="#B9E6FD"/>
</svg>

After

Width:  |  Height:  |  Size: 361 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160V115L185 100L200 85V80H95V75H50V50H95V20H180L160 0H0V200H160L200 160ZM50 125H150V150H50V125ZM110 35H200V65H110V35Z" fill="#B9E6FD"/>
</svg>

After

Width:  |  Height:  |  Size: 297 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160L160 200H0V0H160L200 40V85L185 100L200 115V160ZM50 50H150V75H50V50ZM50 125H150V150H50V125Z" fill="#B9E6FD"/>
</svg>

After

Width:  |  Height:  |  Size: 273 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 200V150H50V50H85V20H120V0H40L0 40V160L40 200H200ZM135 65V100H165V65H200V35H165V0H135V35H100V65H135ZM200 0V20H180V0H200Z" fill="#DDD6FF"/>
</svg>

After

Width:  |  Height:  |  Size: 299 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 200H40L0 160V40L40 0H200V20H95V50H50V150H200V200ZM200 35V65H110V35H200Z" fill="#DDD6FF"/>
</svg>

After

Width:  |  Height:  |  Size: 251 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M40 200H200V150H50V50H200V0H40L0 40V160L40 200Z" fill="#DDD6FF"/>
</svg>

After

Width:  |  Height:  |  Size: 182 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 80V160L160 200H0V0H120V20H85V50H50V150H150V115H180V80H200ZM135 100V65H100V35H135V0H165V35H200V65H165V100H135Z" fill="#F5CFFE"/>
</svg>

After

Width:  |  Height:  |  Size: 289 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M160 200H0V0H160L200 40V160L160 200ZM150 50H50V150H150V50Z" fill="#F5CFFE"/>
</svg>

After

Width:  |  Height:  |  Size: 233 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160V115L180 95V115H120V80H85V75H50V50H85V20H120V0H40L0 40V85L40 125H150V150H0V200H160L200 160ZM135 65V100H165V65H200V35H165V0H135V35H100V65H135ZM200 0V20H180V0H200Z" fill="#FEF18B"/>
</svg>

After

Width:  |  Height:  |  Size: 344 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160L160 200H0V150H150V125H40L0 85V40L40 0H200V18H95V50H50V75H95V78H163L200 115V160ZM200 33V63H110V33H200Z" fill="#FEF18B"/>
</svg>

After

Width:  |  Height:  |  Size: 285 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M160 200L200 160V115L160 75H50V50H200V0H40L0 40V85L40 125H150V150H0V200H160Z" fill="#FEF18B"/>
</svg>

After

Width:  |  Height:  |  Size: 211 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M100 200L140 160V115L100 75H50V50H140V0H40L0 40V85L40 125H90V150H0V200H100ZM160 200L200 160V115L160 75H121L155 109V166L121 200H160ZM200 0V50H155V0H200Z" fill="#FEF18B"/>
</svg>

After

Width:  |  Height:  |  Size: 326 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M40 200H160L200 160V0H150V150H50V0H0V160L40 200Z" fill="#FECBCA"/>
</svg>

After

Width:  |  Height:  |  Size: 183 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M139 200H200L62 0H0L139 200ZM61 200L91 157L44 90H34L55 120L0 200H61ZM166 109H156L109 42L138 0H200L145 79L166 109Z" fill="#F5CFFE"/>
</svg>

After

Width:  |  Height:  |  Size: 288 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M61 200H0L138 0H200L61 200Z" fill="#D7D3D0"/>
</svg>

After

Width:  |  Height:  |  Size: 162 B

View File

@@ -0,0 +1,81 @@
from base64 import b64decode, b64encode
from io import BytesIO
from typing import Literal, overload
from nonebot_plugin_userinfo import UserInfo # type: ignore[import-untyped]
from PIL import Image
from ..templates import path
from .browser import BrowserManager
@overload
async def get_avatar(user: UserInfo, scheme: Literal['Data URI'], default: str | None) -> str:
"""获取用户头像的指定格式
Args:
user (UserInfo): 要获取的用户
scheme (Literal[&#39;Data URI&#39;]): 格式
default (str | None): 获取不到时的默认值
Raises:
TypeError: Can't get avatar: 当获取不到头像并且没有设置默认值时抛出
TypeError: Can't get avatar format: 当获取到的头像无法识别格式时抛出
Returns:
str: Data URI 格式的头像
"""
@overload
async def get_avatar(user: UserInfo, scheme: Literal['bytes'], default: str | None) -> bytes:
"""获取用户头像的指定格式
Args:
user (UserInfo): 要获取的用户
scheme (Literal[&#39;bytes&#39;]): 格式
default (str | None): 获取不到时的默认值
Returns:
bytes: bytes 格式的头像
"""
async def get_avatar(user: UserInfo, scheme: Literal['Data URI', 'bytes'], default: str | None) -> str | bytes:
if user.user_avatar is None:
if default is None:
raise TypeError("Can't get avatar")
return default
bot_avatar = await user.user_avatar.get_image()
if scheme == 'Data URI':
avatar_format = Image.open(BytesIO(bot_avatar)).format
if avatar_format is None:
raise TypeError("Can't get avatar format")
return f'data:{Image.MIME[avatar_format]};base64,{b64encode(bot_avatar).decode()}'
return bot_avatar
async def generate_identicon(hash: str) -> bytes: # noqa: A002
"""使用 identicon 生成头像
Args:
hash (str): 提交给 identicon 的 hash 值
Returns:
bytes: identicon 生成的 svg 的二进制数据
"""
browser = await BrowserManager.get_browser()
async with await browser.new_page() as page:
await page.add_script_tag(path=path / 'js/identicon.js')
return b64decode(
await page.evaluate(rf"""
new Identicon('{hash}', {{
background: [0x08, 0x0a, 0x06, 255],
margin: 0.15,
size: 300,
brightness: 0.48,
saturation: 0.65,
format: 'svg',
}}).toString();
""")
)

View File

@@ -0,0 +1,82 @@
from hashlib import sha256
from ipaddress import IPv4Address, IPv6Address
from typing import ClassVar
from aiofiles import open
from fastapi import FastAPI, Query, Response, status
from fastapi.responses import FileResponse, HTMLResponse
from fastapi.staticfiles import StaticFiles
from nonebot import get_app, get_driver
from nonebot.log import logger
from nonebot_plugin_localstore import get_cache_dir # type: ignore[import-untyped]
from pydantic import IPvAnyAddress
from ..templates import path
from .avatar import generate_identicon
app = get_app()
driver = get_driver()
global_config = driver.config
cache_dir = get_cache_dir('nonebot_plugin_tetris_stats')
if not isinstance(app, FastAPI):
raise RuntimeError('本插件需要 FastAPI 驱动器才能运行') # noqa: TRY004
NOT_FOUND = HTMLResponse('404 Not Found', status_code=status.HTTP_404_NOT_FOUND)
class HostPage:
pages: ClassVar[dict[str, str]] = {}
def __init__(self, page: str) -> None:
self.page_hash = sha256(page.encode()).hexdigest()
self.pages[self.page_hash] = page
async def __aenter__(self) -> str:
return self.page_hash
async def __aexit__(self, exc_type, exc, tb) -> None: # noqa: ANN001
self.pages.pop(self.page_hash, None)
app.mount(
'/static',
StaticFiles(directory=path),
name='static',
)
@app.get('/host/page/{page_hash}.html', status_code=status.HTTP_200_OK)
async def _(page_hash: str) -> HTMLResponse:
if page_hash in HostPage.pages:
return HTMLResponse(HostPage.pages[page_hash])
return NOT_FOUND
@app.get('/identicon')
async def _(md5: str = Query(regex=r'^[a-fA-F0-9]{32}$')):
identicon_path = cache_dir / 'identicon' / f'{md5}.svg'
if identicon_path.exists() is False:
identicon_path.parent.mkdir(parents=True, exist_ok=True)
result = await generate_identicon(md5)
async with open(identicon_path, mode='xb') as file:
await file.write(result)
return Response(result, media_type='image/svg+xml')
logger.debug('Identicon Cache hit!')
return FileResponse(identicon_path, media_type='image/svg+xml')
def get_self_netloc() -> str:
host: IPv4Address | IPv6Address | IPvAnyAddress = global_config.host
if isinstance(host, IPv4Address):
if host == IPv4Address('0.0.0.0'): # noqa: S104
host = IPv4Address('127.0.0.1')
netloc = f'{host}:{global_config.port}'
else:
if host == IPv6Address('::'):
host = IPv6Address('::1')
netloc = f'[{host}]:{global_config.port}'
return netloc

View File

@@ -0,0 +1,69 @@
from typing import Any, Literal, overload
from jinja2 import Environment, FileSystemLoader
from ..game_data_processor.io_data_processor.typing import Rank
from ..templates import path
from .typing import GameType
Bind = Literal['bind.j2.html']
Data = Literal['data.j2.html']
env = Environment(
loader=FileSystemLoader(path), autoescape=True, trim_blocks=True, lstrip_blocks=True, enable_async=True
)
@overload
async def render(
template: Bind,
*,
user_avatar: str,
state: Literal['error', 'success', 'unknown', 'unlink', 'unverified'],
bot_avatar: str,
game_type: GameType,
user_name: str,
bot_name: str,
command: str,
) -> str: ...
@overload
async def render(
template: Data,
*,
user_avatar: str,
user_name: str,
user_sign: str,
game_type: Literal['TETR.IO'],
ranking: str | float,
rd: str | float,
rank: Rank,
TR: str | float, # noqa: N803
global_rank: str | int,
lpm: str | float,
pps: str | float,
apm: str | float,
apl: str | float,
adpm: str | float,
adpl: str | float,
vs: str | float,
sprint: str,
blitz: str,
data: list[list[int]],
split_value: int,
value_max: int,
value_min: int,
offset: int,
app: str | float,
dspp: str | float,
OR: str | float, # noqa: N803
ci: str | float,
ge: str | float,
) -> str: ...
async def render(template: Bind | Data, **kwargs: Any) -> str:
if kwargs['game_type'] == 'IO':
kwargs['game_type'] = 'TETR.IO'
return await env.get_template(template).render_async(**kwargs)

View File

@@ -0,0 +1,10 @@
from .browser import BrowserManager
async def screenshot(url: str) -> bytes:
browser = await BrowserManager.get_browser()
async with (
await browser.new_page(no_viewport=True, viewport={'width': 0, 'height': 0}) as page,
):
await page.goto(url)
return await page.screenshot(full_page=True, type='png')

234
poetry.lock generated
View File

@@ -127,13 +127,13 @@ zookeeper = ["kazoo"]
[[package]]
name = "arclet-alconna"
version = "1.8.10"
version = "1.8.11"
description = "A High-performance, Generality, Humane Command Line Arguments Parser Library."
optional = false
python-versions = ">=3.8"
files = [
{file = "arclet_alconna-1.8.10-py3-none-any.whl", hash = "sha256:6c4d464e3c1b3c03bce301f51370648fd006df2b820e6f926cb410ced97f0c2f"},
{file = "arclet_alconna-1.8.10.tar.gz", hash = "sha256:379e824919a2750f43a2b87a4a523bf06386b4469c5ace859d47213857606c3e"},
{file = "arclet_alconna-1.8.11-py3-none-any.whl", hash = "sha256:8a0c188400214abe2b72b2e6f4f23ed8d3021270654c15bc46cad62b725b7a44"},
{file = "arclet_alconna-1.8.11.tar.gz", hash = "sha256:3fed5e946709d63b9d7ee7cddf32b145e1f931b8ea9d0b8174cac753d965e9c8"},
]
[package.dependencies]
@@ -159,6 +159,17 @@ files = [
arclet-alconna = ">=1.8.10"
nepattern = ">=0.7.0,<1.0.0"
[[package]]
name = "cachetools"
version = "5.3.3"
description = "Extensible memoizing collections and decorators"
optional = false
python-versions = ">=3.7"
files = [
{file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"},
{file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"},
]
[[package]]
name = "certifi"
version = "2024.2.2"
@@ -270,6 +281,20 @@ files = [
{file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"},
]
[[package]]
name = "emoji"
version = "2.11.1"
description = "Emoji for Python"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
files = [
{file = "emoji-2.11.1-py2.py3-none-any.whl", hash = "sha256:b7ba25299bbf520cc8727848ae66b986da32aee27dc2887eaea2bff07226ce49"},
{file = "emoji-2.11.1.tar.gz", hash = "sha256:062ff0b3154b6219143f8b9f4b3e5c64c35bc2b146e6e2349ab5f29e218ce1ee"},
]
[package.extras]
dev = ["coverage", "coveralls", "pytest"]
[[package]]
name = "exceptiongroup"
version = "1.2.1"
@@ -286,13 +311,13 @@ test = ["pytest (>=6)"]
[[package]]
name = "fastapi"
version = "0.110.2"
version = "0.110.3"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false
python-versions = ">=3.8"
files = [
{file = "fastapi-0.110.2-py3-none-any.whl", hash = "sha256:239403f2c0a3dda07a9420f95157a7f014ddb2b770acdbc984f9bdf3ead7afdb"},
{file = "fastapi-0.110.2.tar.gz", hash = "sha256:b53d673652da3b65e8cd787ad214ec0fe303cad00d2b529b86ce7db13f17518d"},
{file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"},
{file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"},
]
[package.dependencies]
@@ -301,7 +326,7 @@ starlette = ">=0.37.2,<0.38.0"
typing-extensions = ">=4.8.0"
[package.extras]
all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
[[package]]
name = "greenlet"
@@ -489,6 +514,25 @@ files = [
{file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
]
[[package]]
name = "importlib-metadata"
version = "7.1.0"
description = "Read metadata from Python packages"
optional = false
python-versions = ">=3.8"
files = [
{file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"},
{file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"},
]
[package.dependencies]
zipp = ">=0.5"
[package.extras]
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
perf = ["ipython"]
testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"]
[[package]]
name = "importlib-resources"
version = "6.4.0"
@@ -504,6 +548,23 @@ files = [
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"]
testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"]
[[package]]
name = "jinja2"
version = "3.1.3"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
files = [
{file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"},
{file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"},
]
[package.dependencies]
MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
[[package]]
name = "loguru"
version = "0.7.2"
@@ -621,6 +682,7 @@ files = [
{file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"},
{file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"},
{file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"},
{file = "lxml-5.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5"},
{file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"},
{file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"},
{file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"},
@@ -1004,13 +1066,13 @@ files = [
[[package]]
name = "nepattern"
version = "0.7.1"
version = "0.7.2"
description = "a complex pattern, support typing"
optional = false
python-versions = ">=3.8"
files = [
{file = "nepattern-0.7.1-py3-none-any.whl", hash = "sha256:e5190a79d398dce72f972ffafc413653414cca12a1dac56d38fcf070d2f034bc"},
{file = "nepattern-0.7.1.tar.gz", hash = "sha256:14bae0dfa93241f3c2d8371cfc5e51072a186a295a7d35fbd7a60b08e83b2605"},
{file = "nepattern-0.7.2-py3-none-any.whl", hash = "sha256:75406623a4a533628a6fb1996a7cc79d7b535a268e2a8bf4b405197175baecca"},
{file = "nepattern-0.7.2.tar.gz", hash = "sha256:7869e7998d870c920611b7a25649fb451c57bf2de450fb5d2e87408ff2917885"},
]
[package.dependencies]
@@ -1079,20 +1141,21 @@ nonebot2 = ">=2.2.0"
[[package]]
name = "nonebot-plugin-alconna"
version = "0.45.0"
version = "0.45.2"
description = "Alconna Adapter for Nonebot"
optional = false
python-versions = ">=3.9"
files = [
{file = "nonebot_plugin_alconna-0.45.0-py3-none-any.whl", hash = "sha256:3394961dc27f2322e8ebb8e5f700b567b3749262689c3a0f85fab55112bc050e"},
{file = "nonebot_plugin_alconna-0.45.0.tar.gz", hash = "sha256:6fa530ef6df02c3b8c2a67979ac55d6978cc647df2ce5a393c87f42e919be641"},
{file = "nonebot_plugin_alconna-0.45.2-py3-none-any.whl", hash = "sha256:38461346f52479c3133d9a789cca1d280a05834790dbadeecfc88639a1e326a2"},
{file = "nonebot_plugin_alconna-0.45.2.tar.gz", hash = "sha256:a54bd294c0a829fcd344a3d3f5b9b040c1dcdbe739245557037cca019187d031"},
]
[package.dependencies]
arclet-alconna = ">=1.8.10"
arclet-alconna = ">=1.8.11"
arclet-alconna-tools = ">=0.7.3"
nepattern = ">=0.7.0"
nonebot2 = ">=2.2.1"
importlib-metadata = ">=4.13.0"
nepattern = ">=0.7.2"
nonebot2 = ">=2.3.0"
[[package]]
name = "nonebot-plugin-apscheduler"
@@ -1160,6 +1223,24 @@ postgresql = ["sqlalchemy[postgresql-psycopgbinary]"]
psycopg = ["sqlalchemy[postgresql-psycopgbinary]"]
sqlite = ["sqlalchemy[aiosqlite]"]
[[package]]
name = "nonebot-plugin-userinfo"
version = "0.2.4"
description = "Nonebot2 用户信息获取插件"
optional = false
python-versions = "<4.0,>=3.8"
files = [
{file = "nonebot_plugin_userinfo-0.2.4-py3-none-any.whl", hash = "sha256:f08dac58759b859f8bf1d1c17e96cdcee92b10613631a430405364a40181f9e4"},
{file = "nonebot_plugin_userinfo-0.2.4.tar.gz", hash = "sha256:1d49ff00ce38c856be4388fc2a954656f07cc529ce38ef9593e3a0ea40f26b6a"},
]
[package.dependencies]
cachetools = ">=5.0.0,<6.0.0"
emoji = ">=2.0.0,<3.0.0"
httpx = ">=0.20.0,<1.0.0"
nonebot2 = ">=2.0.0,<3.0.0"
strenum = ">=0.4.8,<0.5.0"
[[package]]
name = "nonebot2"
version = "2.3.0"
@@ -1254,7 +1335,6 @@ optional = false
python-versions = ">=3.9"
files = [
{file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"},
{file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"},
{file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"},
{file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"},
{file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"},
@@ -1275,7 +1355,6 @@ files = [
{file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"},
{file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"},
{file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"},
{file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"},
{file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"},
{file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"},
{file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"},
@@ -1334,6 +1413,92 @@ files = [
numpy = {version = ">=1.26.0", markers = "python_version < \"3.13\""}
types-pytz = ">=2022.1.1"
[[package]]
name = "pillow"
version = "10.3.0"
description = "Python Imaging Library (Fork)"
optional = false
python-versions = ">=3.8"
files = [
{file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"},
{file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"},
{file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"},
{file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"},
{file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"},
{file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"},
{file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"},
{file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"},
{file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"},
{file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"},
{file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"},
{file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"},
{file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"},
{file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"},
{file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"},
{file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"},
{file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"},
{file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"},
{file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"},
{file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"},
{file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"},
{file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"},
{file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"},
{file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"},
{file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"},
{file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"},
{file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"},
{file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"},
{file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"},
{file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"},
{file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"},
{file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"},
{file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"},
{file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"},
{file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"},
]
[package.extras]
docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
fpx = ["olefile"]
mic = ["olefile"]
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
typing = ["typing-extensions"]
xmp = ["defusedxml"]
[[package]]
name = "playwright"
version = "1.43.0"
@@ -1755,6 +1920,22 @@ anyio = ">=3.4.0,<5"
[package.extras]
full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"]
[[package]]
name = "strenum"
version = "0.4.15"
description = "An Enum that inherits from str."
optional = false
python-versions = "*"
files = [
{file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"},
{file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"},
]
[package.extras]
docs = ["myst-parser[linkify]", "sphinx", "sphinx-rtd-theme"]
release = ["twine"]
test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"]
[[package]]
name = "tarina"
version = "0.4.4"
@@ -2419,6 +2600,21 @@ files = [
idna = ">=2.0"
multidict = ">=4.0"
[[package]]
name = "zipp"
version = "3.18.1"
description = "Backport of pathlib-compatible object wrapper for zip files"
optional = false
python-versions = ">=3.8"
files = [
{file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"},
{file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"},
]
[package.extras]
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"]
[[package]]
name = "zstandard"
version = "0.22.0"
@@ -2483,4 +2679,4 @@ cffi = ["cffi (>=1.11)"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "78b446052e80cf2d35175fbd319184c1911abeda7924f3e51bfc8d7520308950"
content-hash = "c568aeaa3fa7dc9049bb95fb3f682754aff0be497fa7e097c51d1becb90a84a5"

View File

@@ -10,7 +10,7 @@ license = 'AGPL-3.0'
[tool.poetry.dependencies]
python = '^3.10'
nonebot2 = '^2.3.0'
nonebot2 = { extras = ["fastapi"], version = "^2.3.0" }
lxml = '^5.1.0'
pandas = '>=1.4.3,<3.0.0'
playwright = '^1.41.2'
@@ -23,6 +23,9 @@ nonebot-plugin-alconna = ">=0.40"
nonebot-plugin-apscheduler = "^0.4.0"
aiocache = "^0.12.2"
zstandard = "^0.22.0"
jinja2 = "^3.1.3"
nonebot-plugin-userinfo = "^0.2.4"
pillow = "^10.3.0"
[tool.poetry.group.dev.dependencies]
mypy = '>=1.9'
@@ -30,7 +33,6 @@ types-ujson = '^5.9.0'
pandas-stubs = '>=1.5.2,<3.0.0'
ruff = '>=0.3.0'
types-aiofiles = "^23.2.0.20240106"
nonebot2 = { extras = ["fastapi"], version = "^2.3.0" }
types-lxml = "^2024.2.9"
nonebot-plugin-orm = { extras = ["default"], version = ">=0.3,<0.8" }
nonebot-adapter-onebot = "^2.4.1"