Skip to content

Commit

Permalink
🐛 update lint configs
Browse files Browse the repository at this point in the history
  • Loading branch information
yanyongyu authored Oct 24, 2024
1 parent 26b3520 commit 1da0ca4
Show file tree
Hide file tree
Showing 23 changed files with 954 additions and 787 deletions.
17 changes: 5 additions & 12 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,23 @@ ci:
autoupdate_commit_msg: ":arrow_up: auto update by pre-commit hooks"
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.6.3
rev: v0.7.0
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
stages: [commit]
stages: [pre-commit]

- repo: https://github.com/pycqa/isort
rev: 5.13.2
hooks:
- id: isort
stages: [commit]
stages: [pre-commit]

- repo: https://github.com/psf/black
rev: 24.8.0
rev: 24.10.0
hooks:
- id: black
stages: [commit]

- repo: https://github.com/pre-commit/mirrors-prettier
rev: v4.0.0-alpha.8
hooks:
- id: prettier
types_or: [javascript, jsx, ts, tsx, markdown, yaml]
stages: [commit]
stages: [pre-commit]

- repo: https://github.com/nonebot/nonemoji
rev: v0.1.4
Expand Down
20 changes: 10 additions & 10 deletions nonebot/adapters/onebot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
description: onebot 模块
"""

from .v11 import Bot as V11Bot
from .v12 import Bot as V12Bot
from .v11 import event as V11Event
from .v12 import event as V12Event
from .v11 import Adapter as V11Adapter
from .v11 import Message as V11Message
from .v12 import Adapter as V12Adapter
from .v12 import Message as V12Message
from .v11 import MessageSegment as V11MessageSegment
from .v12 import MessageSegment as V12MessageSegment
from .v11 import Bot as V11Bot # noqa: F401
from .v12 import Bot as V12Bot # noqa: F401
from .v11 import event as V11Event # noqa: F401
from .v12 import event as V12Event # noqa: F401
from .v11 import Adapter as V11Adapter # noqa: F401
from .v11 import Message as V11Message # noqa: F401
from .v12 import Adapter as V12Adapter # noqa: F401
from .v12 import Message as V12Message # noqa: F401
from .v11 import MessageSegment as V11MessageSegment # noqa: F401
from .v12 import MessageSegment as V12MessageSegment # noqa: F401
26 changes: 13 additions & 13 deletions nonebot/adapters/onebot/collator.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"""

from typing_extensions import get_origin
from typing import Any, Dict, List, Type, Tuple, Union, Generic, TypeVar, Optional
from typing import Any, Union, Generic, TypeVar, Optional

from pygtrie import StringTrie
from nonebot.utils import logger_wrapper
Expand All @@ -23,8 +23,8 @@ class Collator(Generic[E]):
def __init__(
self,
name: str,
models: List[Type[E]],
keys: Tuple[Union[str, Tuple[str, ...]], ...],
models: list[type[E]],
keys: tuple[Union[str, tuple[str, ...]], ...],
):
self.name = name
self.logger = logger_wrapper(self.name)
Expand All @@ -35,11 +35,11 @@ def __init__(
self.tree = StringTrie(separator=SEPARATOR)
self._refresh_tree()

def add_model(self, *model: Type[E]):
def add_model(self, *model: type[E]):
self.models.extend(model)
self._refresh_tree()

def get_model(self, data: Dict[str, Any]) -> List[Type[E]]:
def get_model(self, data: dict[str, Any]) -> list[type[E]]:
key = self._key_from_dict(data)
return [model.value for model in self.tree.prefixes(key)][::-1]

Expand All @@ -54,8 +54,8 @@ def _refresh_tree(self):
)
self.tree[key] = model

def _key_from_dict(self, data: Dict[str, Any]) -> str:
keys: List[Optional[str]] = []
def _key_from_dict(self, data: dict[str, Any]) -> str:
keys: list[Optional[str]] = []
for key in self.keys:
if isinstance(key, tuple):
fields = list(filter(None, (data.get(k, None) for k in key)))
Expand All @@ -67,8 +67,8 @@ def _key_from_dict(self, data: Dict[str, Any]) -> str:
keys.append(field)
return self._generate_key(keys)

def _key_from_model(self, model: Type[E]) -> str:
keys: List[Optional[str]] = []
def _key_from_model(self, model: type[E]) -> str:
keys: list[Optional[str]] = []
for key in self.keys:
if isinstance(key, tuple):
fields = list(
Expand All @@ -82,20 +82,20 @@ def _key_from_model(self, model: Type[E]) -> str:
keys.append(field and self._get_literal_field_default(field))
return self._generate_key(keys)

def _generate_key(self, keys: List[Optional[str]]) -> str:
def _generate_key(self, keys: list[Optional[str]]) -> str:
if not self._check_key_list(keys):
raise ValueError(
"Invalid model with incorrect prefix "
f"keys: {dict(zip(self.keys, keys))}"
)
tree_keys = [""] + list(filter(None, keys))
tree_keys = ["", *list(filter(None, keys))]
return SEPARATOR.join(tree_keys)

def _check_key_list(self, keys: List[Optional[str]]) -> bool:
def _check_key_list(self, keys: list[Optional[str]]) -> bool:
truthy = tuple(map(bool, keys))
return all(truthy) or not any(truthy[truthy.index(False) :])

def _get_model_field(self, model: Type[E], field: str) -> Optional[ModelField]:
def _get_model_field(self, model: type[E], field: str) -> Optional[ModelField]:
return next((f for f in model_fields(model) if f.name == field), None)

def _get_literal_field_default(self, field: ModelField) -> Optional[str]:
Expand Down
8 changes: 4 additions & 4 deletions nonebot/adapters/onebot/store.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@

import sys
import asyncio
from typing import Any, Dict, Optional
from typing import Any, Optional


class ResultStore:
def __init__(self) -> None:
self._seq: int = 1
self._futures: Dict[int, asyncio.Future] = {}
self._futures: dict[int, asyncio.Future] = {}

@property
def current_seq(self) -> int:
Expand All @@ -24,13 +24,13 @@ def get_seq(self) -> int:
self._seq = (self._seq + 1) % sys.maxsize
return s

def add_result(self, result: Dict[str, Any]):
def add_result(self, result: dict[str, Any]):
echo = result.get("echo")
if isinstance(echo, str) and echo.isdecimal():
if future := self._futures.get(int(echo)):
future.set_result(result)

async def fetch(self, seq: int, timeout: Optional[float]) -> Dict[str, Any]:
async def fetch(self, seq: int, timeout: Optional[float]) -> dict[str, Any]:
future = asyncio.get_event_loop().create_future()
self._futures[seq] = future
try:
Expand Down
8 changes: 4 additions & 4 deletions nonebot/adapters/onebot/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from io import BytesIO
from pathlib import Path
from base64 import b64encode
from typing_extensions import Annotated
from typing import Tuple, Union, Iterable, Optional
from collections.abc import Iterable
from typing import Union, Optional, Annotated

from pydantic import AnyUrl
from nonebot.utils import escape_tag
Expand Down Expand Up @@ -56,7 +56,7 @@ def rich_unescape(s: str) -> str:
)


def iter_rich_message(msg: str) -> Iterable[Tuple[str, str]]:
def iter_rich_message(msg: str) -> Iterable[tuple[str, str]]:
text_begin = 0
for segment in re.finditer(RICH_REGEX, msg):
if pre_text := msg[text_begin : segment.pos + segment.start()]:
Expand Down Expand Up @@ -133,4 +133,4 @@ def truncate(
class WSUrl(AnyUrl):
"""ws或wss url"""

allow_schemes = {"ws", "wss"}
allow_schemes = {"ws", "wss"} # noqa: RUF012
4 changes: 2 additions & 2 deletions nonebot/adapters/onebot/v11/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
description: onebot.v11 模块
"""

from .event import *
from .permission import *
from .bot import Bot as Bot
from .utils import log as log
from .event import * # noqa: F403
from .utils import escape as escape
from .adapter import Adapter as Adapter
from .message import Message as Message
from .permission import * # noqa: F403
from .utils import unescape as unescape
from .exception import ActionFailed as ActionFailed
from .exception import NetworkError as NetworkError
Expand Down
77 changes: 45 additions & 32 deletions nonebot/adapters/onebot/v11/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
import asyncio
import inspect
import contextlib
from collections.abc import Generator
from typing_extensions import override
from typing import Any, Dict, List, Type, Union, Callable, Optional, Generator, cast
from typing import Any, Union, Callable, Optional, cast

from nonebot.exception import WebSocketClosed
from nonebot.compat import type_validate_python
Expand Down Expand Up @@ -44,7 +45,7 @@
from .exception import NetworkError, ApiNotAvailable, OneBotV11AdapterException

RECONNECT_INTERVAL = 3.0
DEFAULT_MODELS: List[Type[Event]] = []
DEFAULT_MODELS: list[type[Event]] = []
for model_name in dir(event):
model = getattr(event, model_name)
if not inspect.isclass(model) or not issubclass(model, Event):
Expand All @@ -70,8 +71,8 @@ def __init__(self, driver: Driver, **kwargs: Any):
super().__init__(driver, **kwargs)
self.onebot_config: Config = get_plugin_config(Config)
"""OneBot V11 配置"""
self.connections: Dict[str, WebSocket] = {}
self.tasks: List["asyncio.Task"] = []
self.connections: dict[str, WebSocket] = {}
self.tasks: set["asyncio.Task"] = set()
self._setup()

@classmethod
Expand Down Expand Up @@ -128,7 +129,34 @@ def _setup(self) -> None:
)
else:
self.on_ready(self._start_forward)
self.driver.on_shutdown(self._stop_forward)

self.driver.on_shutdown(self._stop)

async def _start_forward(self) -> None:
for url in self.onebot_config.onebot_ws_urls:
url = str(url)
try:
ws_url = URL(url)
task = asyncio.create_task(self._forward_ws(ws_url))
task.add_done_callback(self.tasks.discard)
self.tasks.add(task)
except Exception as e:
log(
"ERROR",
f"<r><bg #f8bbd0>Bad url {escape_tag(url)} "
"in onebot forward websocket config</bg #f8bbd0></r>",
e,
)

async def _stop(self) -> None:
for task in self.tasks:
if not task.done():
task.cancel()

await asyncio.gather(
*(asyncio.wait_for(task, timeout=10) for task in self.tasks),
return_exceptions=True,
)

@override
async def _call_api(self, bot: Bot, api: str, **data: Any) -> Any:
Expand Down Expand Up @@ -209,7 +237,9 @@ async def _handle_http(self, request: Request) -> Response:
self.bot_connect(bot)
log("INFO", f"<y>Bot {escape_tag(self_id)}</y> connected")
bot = cast(Bot, bot)
asyncio.create_task(bot.handle_event(event))
task = asyncio.create_task(bot.handle_event(event))
task.add_done_callback(self.tasks.discard)
self.tasks.add(task)
else:
return Response(400, content="Invalid request body")
return Response(204)
Expand Down Expand Up @@ -246,7 +276,9 @@ async def _handle_ws(self, websocket: WebSocket) -> None:
data = await websocket.receive()
json_data = json.loads(data)
if event := self.json_to_event(json_data):
asyncio.create_task(bot.handle_event(event))
task = asyncio.create_task(bot.handle_event(event))
task.add_done_callback(self.tasks.discard)
self.tasks.add(task)
except WebSocketClosed:
log("WARNING", f"WebSocket for Bot {escape_tag(self_id)} closed by peer")
except Exception as e:
Expand Down Expand Up @@ -296,27 +328,6 @@ def _check_access_token(self, request: Request) -> Optional[Response]:
log("WARNING", msg)
return Response(403, content=msg)

async def _start_forward(self) -> None:
for url in self.onebot_config.onebot_ws_urls:
url = str(url)
try:
ws_url = URL(url)
self.tasks.append(asyncio.create_task(self._forward_ws(ws_url)))
except Exception as e:
log(
"ERROR",
f"<r><bg #f8bbd0>Bad url {escape_tag(url)} "
"in onebot forward websocket config</bg #f8bbd0></r>",
e,
)

async def _stop_forward(self) -> None:
for task in self.tasks:
if not task.done():
task.cancel()

await asyncio.gather(*self.tasks, return_exceptions=True)

async def _forward_ws(self, url: URL) -> None:
headers = {}
if self.onebot_config.onebot_access_token:
Expand Down Expand Up @@ -355,7 +366,9 @@ async def _forward_ws(self, url: URL) -> None:
"INFO",
f"<y>Bot {escape_tag(str(self_id))}</y> connected",
)
asyncio.create_task(bot.handle_event(event))
task = asyncio.create_task(bot.handle_event(event))
task.add_done_callback(self.tasks.discard)
self.tasks.add(task)
except WebSocketClosed as e:
log(
"ERROR",
Expand Down Expand Up @@ -390,7 +403,7 @@ async def _forward_ws(self, url: URL) -> None:
await asyncio.sleep(RECONNECT_INTERVAL)

@classmethod
def add_custom_model(cls, *model: Type[Event]) -> None:
def add_custom_model(cls, *model: type[Event]) -> None:
"""插入或覆盖一个自定义的 Event 类型。
参数:
Expand All @@ -400,8 +413,8 @@ def add_custom_model(cls, *model: Type[Event]) -> None:

@classmethod
def get_event_model(
cls, data: Dict[str, Any]
) -> Generator[Type[Event], None, None]:
cls, data: dict[str, Any]
) -> Generator[type[Event], None, None]:
"""根据事件获取对应 `Event Model` 及 `FallBack Event Model` 列表。"""
yield from cls.event_models.get_model(data)

Expand Down
2 changes: 1 addition & 1 deletion nonebot/adapters/onebot/v11/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ async def _check_reply(bot: "Bot", event: MessageEvent) -> None:
Reply, await bot.get_msg(message_id=int(msg_seg.data["id"]))
)
except Exception as e:
log("WARNING", f"Error when getting message reply info: {repr(e)}")
log("WARNING", f"Error when getting message reply info: {e!r}")
return

if event.reply.sender.user_id is not None:
Expand Down
6 changes: 3 additions & 3 deletions nonebot/adapters/onebot/v11/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
description: onebot.v11.config 模块
"""

from typing import Set, Dict, Optional
from typing import Optional

from pydantic import Field, AnyUrl, BaseModel
from nonebot.compat import PYDANTIC_V2, ConfigDict
Expand All @@ -22,9 +22,9 @@ class Config(BaseModel):
"""OneBot 协议授权令牌"""
onebot_secret: Optional[str] = Field(default=None, alias="onebot_v11_secret")
"""OneBot HTTP 上报数据签名口令"""
onebot_ws_urls: Set[WSUrl] = Field(default_factory=set, alias="onebot_v11_ws_urls")
onebot_ws_urls: set[WSUrl] = Field(default_factory=set, alias="onebot_v11_ws_urls")
"""OneBot 正向 Websocket 连接目标 URL 集合"""
onebot_api_roots: Dict[str, AnyUrl] = Field(
onebot_api_roots: dict[str, AnyUrl] = Field(
default_factory=dict, alias="onebot_v11_api_roots"
)
"""OneBot HTTP API 请求地址字典"""
Expand Down
Loading

0 comments on commit 1da0ca4

Please sign in to comment.