77 lines
2.1 KiB
Python
77 lines
2.1 KiB
Python
from dataclasses import dataclass
|
|
from math import ceil
|
|
from typing import Any, Callable
|
|
|
|
from nonebot_plugin_alconna import UniMessage
|
|
|
|
|
|
@dataclass
|
|
class PagerQuery:
|
|
page_index: int
|
|
page_size: int
|
|
|
|
def apply[T](self, ls: list[T]) -> "PagerResult[T]":
|
|
if self.page_size <= 0:
|
|
return PagerResult(
|
|
success=False,
|
|
message="每页元素数量应该大于 0",
|
|
data=[],
|
|
page_count=-1,
|
|
query=self,
|
|
)
|
|
page_count = ceil(len(ls) / self.page_size)
|
|
if self.page_index <= 0 or self.page_size <= 0:
|
|
return PagerResult(
|
|
success=False,
|
|
message="页数必须大于 0",
|
|
data=[],
|
|
page_count=page_count,
|
|
query=self,
|
|
)
|
|
data = ls[(self.page_index - 1) * self.page_size: self.page_index * self.page_size]
|
|
if len(data) > 0:
|
|
return PagerResult(
|
|
success=True,
|
|
message="",
|
|
data=data,
|
|
page_count=page_count,
|
|
query=self,
|
|
)
|
|
return PagerResult(
|
|
success=False,
|
|
message="指定的页数超过最大页数",
|
|
data=data,
|
|
page_count=page_count,
|
|
query=self,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class PagerResult[T]:
|
|
data: list[T]
|
|
success: bool
|
|
message: str
|
|
page_count: int
|
|
query: PagerQuery
|
|
|
|
def to_unimessage(
|
|
self,
|
|
formatter: Callable[[T], str | UniMessage[Any]] = str,
|
|
title: str = '查询结果',
|
|
list_indicator: str = '- ',
|
|
) -> UniMessage[Any]:
|
|
msg = UniMessage.text(f'===== {title} =====\n\n')
|
|
|
|
if not self.success:
|
|
msg = msg.text(f'⚠️ {self.message}\n')
|
|
else:
|
|
for obj in self.data:
|
|
msg = msg.text(list_indicator)
|
|
msg += formatter(obj)
|
|
msg += '\n'
|
|
|
|
msg = msg.text(f'\n===== 第 {self.query.page_index} 页,共 {self.page_count} 页 =====')
|
|
return msg
|
|
|
|
|