Skip to content

Commit e4d300e

Browse files
authored
migrate to nonebot-plugin-uninfo (#8)
1 parent b425330 commit e4d300e

12 files changed

Lines changed: 1023 additions & 991 deletions

File tree

nonebot_plugin_memes_api/__init__.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33

44
require("nonebot_plugin_alconna")
55
require("nonebot_plugin_waiter")
6-
require("nonebot_plugin_session")
7-
require("nonebot_plugin_userinfo")
6+
require("nonebot_plugin_uninfo")
87
require("nonebot_plugin_localstore")
9-
require("nonebot_plugin_session_orm")
8+
require("nonebot_plugin_orm")
109

11-
from . import matchers, migrations # noqa
10+
from . import matchers as matchers
1211
from .config import Config, memes_config
1312

1413
memes_prefixes = memes_config.memes_command_prefixes
@@ -48,9 +47,6 @@
4847
homepage="https://github.com/noneplugin/nonebot-plugin-memes",
4948
config=Config,
5049
supported_adapters=inherit_supported_adapters(
51-
"nonebot_plugin_alconna",
52-
"nonebot_plugin_session",
53-
"nonebot_plugin_userinfo",
50+
"nonebot_plugin_alconna", "nonebot_plugin_uninfo"
5451
),
55-
extra={"orm_version_location": migrations},
5652
)
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
from . import info, manage, search, help, command, statistics # noqa
1+
from . import command as command
2+
from . import help as help
3+
from . import info as info
4+
from . import manage as manage
5+
from . import search as search
6+
from . import statistics as statistics

nonebot_plugin_memes_api/matchers/command.py

Lines changed: 94 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from arclet.alconna import config as alc_config
77
from nonebot import get_driver
88
from nonebot.adapters import Bot, Event
9-
from nonebot.compat import PYDANTIC_V2, ConfigDict
109
from nonebot.exception import AdapterException
1110
from nonebot.log import logger
1211
from nonebot.matcher import Matcher
@@ -25,8 +24,7 @@
2524
)
2625
from nonebot_plugin_alconna.builtins.extensions.reply import ReplyMergeExtension
2726
from nonebot_plugin_alconna.uniseg.tools import image_fetch
28-
from nonebot_plugin_session import EventSession, Session
29-
from nonebot_plugin_userinfo import ImageSource, UserInfo, get_user_info
27+
from nonebot_plugin_uninfo import Interface, QryItrface, Session, Uninfo, User
3028

3129
from ..config import memes_config
3230
from ..exception import MemeGeneratorException
@@ -40,38 +38,44 @@
4038

4139

4240
async def process(
41+
bot: Bot,
42+
event: Event,
43+
state: T_State,
4344
matcher: Matcher,
4445
session: Session,
4546
meme: MemeInfo,
46-
image_sources: list[ImageSource],
47+
images: list[Image],
4748
texts: list[str],
48-
user_infos: list[UserInfo],
49+
users: list[User],
4950
args: dict[str, Any] = {},
5051
show_info: bool = False,
5152
):
52-
images: list[bytes] = []
53+
image_contents: list[bytes] = []
5354

5455
try:
55-
for image_source in image_sources:
56-
images.append(await image_source.get_image())
56+
for image in images:
57+
result = await image_fetch(event, bot, state, image)
58+
if not isinstance(result, bytes):
59+
raise NotImplementedError
60+
image_contents.append(result)
5761
except NotImplementedError:
5862
await matcher.finish("当前平台可能不支持获取图片")
5963
except (NetworkError, AdapterException):
6064
logger.warning(traceback.format_exc())
6165
await matcher.finish("图片下载出错,请稍后再试")
6266

6367
args_user_infos = []
64-
for user_info in user_infos:
65-
name = user_info.user_displayname or user_info.user_name
66-
gender = str(user_info.user_gender)
68+
for user in users:
69+
name = user.nick or user.name
70+
gender = user.gender
6771
if gender not in ("male", "female"):
6872
gender = "unknown"
6973
args_user_infos.append({"name": name, "gender": gender})
7074
args["user_infos"] = args_user_infos
7175

7276
try:
7377
result = await generate_meme(
74-
meme_key=meme.key, images=images, texts=texts, args=args
78+
meme_key=meme.key, images=image_contents, texts=texts, args=args
7579
)
7680
await record_meme_generation(session, meme.key)
7781
except MemeGeneratorException as e:
@@ -85,68 +89,76 @@ async def process(
8589
await msg.send()
8690

8791

88-
class AlcImage(ImageSource):
89-
bot: Bot
90-
event: Event
91-
state: T_State
92-
img: Image
93-
94-
if PYDANTIC_V2:
95-
model_config: ConfigDict = ConfigDict(arbitrary_types_allowed=True)
96-
else:
97-
98-
class Config:
99-
arbitrary_types_allowed: bool = True
100-
101-
async def get_image(self) -> bytes:
102-
result = await image_fetch(self.event, self.bot, self.state, self.img)
103-
if isinstance(result, bytes):
104-
return result
105-
raise NotImplementedError("image fetch not implemented")
106-
107-
10892
T_MemeParams = Union[Text, Image, At]
10993
meme_params_key = "meme_params"
11094
arg_meme_params = Args[meme_params_key, MultiVar(T_MemeParams, "*")]
11195

11296

11397
async def handle_params(
114-
bot: Bot, event: Event, state: T_State, meme_params: list[T_MemeParams]
98+
matcher: Matcher,
99+
session: Session,
100+
interface: Interface,
101+
meme_params: list[T_MemeParams],
115102
):
116103
texts: list[str] = []
117-
image_sources: list[ImageSource] = []
118-
user_infos: list[UserInfo] = []
104+
images: list[Image] = []
105+
users: list[User] = []
119106

120107
for msg_seg in meme_params:
121108
if isinstance(msg_seg, At):
122-
if user_info := await get_user_info(bot, event, msg_seg.target):
123-
if image_source := user_info.user_avatar:
124-
image_sources.append(image_source)
125-
user_infos.append(user_info)
109+
try:
110+
user = None
111+
if session.scene.type > 0:
112+
try:
113+
if member := await interface.get_member(
114+
session.scene.type, session.scene.id, msg_seg.target
115+
):
116+
user = member.user
117+
if member.nick:
118+
user.nick = member.nick
119+
except (NotImplementedError, NetworkError, AdapterException):
120+
pass
121+
if not user:
122+
user = await interface.get_user(msg_seg.target)
123+
if user:
124+
if image_url := user.avatar:
125+
images.append(Image(url=image_url))
126+
users.append(user)
127+
except NotImplementedError:
128+
await matcher.finish("当前平台可能不支持获取用户信息")
129+
except (NetworkError, AdapterException):
130+
logger.warning(traceback.format_exc())
131+
await matcher.finish("用户信息获取出错,请稍后再试")
126132

127133
elif isinstance(msg_seg, Image):
128-
image_sources.append(
129-
AlcImage(bot=bot, event=event, state=state, img=msg_seg)
130-
)
134+
images.append(msg_seg)
131135

132136
elif isinstance(msg_seg, Text):
133137
text = msg_seg.text
134138
if text.startswith("@") and (user_id := text[1:]):
135-
if user_info := await get_user_info(bot, event, user_id):
136-
if image_source := user_info.user_avatar:
137-
image_sources.append(image_source)
138-
user_infos.append(user_info)
139+
try:
140+
if user := await interface.get_user(user_id):
141+
if image_url := user.avatar:
142+
images.append(Image(url=image_url))
143+
users.append(user)
144+
except NotImplementedError:
145+
await matcher.finish("当前平台可能不支持获取用户信息")
146+
except (NetworkError, AdapterException):
147+
logger.warning(traceback.format_exc())
148+
await matcher.finish("用户信息获取出错,请检查用户 id 或稍后再试")
139149

140150
elif text == "自己":
141-
if user_info := await get_user_info(bot, event, event.get_user_id()):
142-
if image_source := user_info.user_avatar:
143-
image_sources.append(image_source)
144-
user_infos.append(user_info)
151+
user = session.user
152+
if image_url := user.avatar:
153+
images.append(Image(url=image_url))
154+
if (member := session.member) and member.nick:
155+
user.nick = member.nick
156+
users.append(user)
145157

146158
elif text:
147159
texts.append(text)
148160

149-
return texts, image_sources, user_infos
161+
return texts, images, users
150162

151163

152164
matchers: list[type[Matcher]] = []
@@ -194,7 +206,8 @@ async def _(
194206
state: T_State,
195207
matcher: Matcher,
196208
user_id: UserId,
197-
session: EventSession,
209+
session: Uninfo,
210+
interface: QryItrface,
198211
alc_matches: AlcMatches,
199212
):
200213
if not meme_manager.check(user_id, meme.key):
@@ -210,25 +223,29 @@ async def _(
210223
args[option] = option_result.value
211224

212225
meme_params: list[T_MemeParams] = list(alc_matches.query(meme_params_key, ()))
213-
texts, image_sources, user_infos = await handle_params(
214-
bot, event, state, meme_params
226+
texts, images, users = await handle_params(
227+
matcher, session, interface, meme_params
215228
)
216229

217230
# 当所需图片数为 2 且已指定图片数为 1 时,使用发送者的头像作为第一张图
218-
if meme.params_type.min_images == 2 and len(image_sources) == 1:
219-
if user_info := await get_user_info(bot, event, event.get_user_id()):
220-
if image_source := user_info.user_avatar:
221-
image_sources.insert(0, image_source)
222-
user_infos.insert(0, user_info)
231+
if meme.params_type.min_images == 2 and len(images) == 1:
232+
user = session.user
233+
if image_url := user.avatar:
234+
images.insert(0, Image(url=image_url))
235+
if (member := session.member) and member.nick:
236+
user.nick = member.nick
237+
users.insert(0, user)
223238

224239
# 当所需图片数为 1 且没有已指定图片时,使用发送者的头像
225240
if memes_config.memes_use_sender_when_no_image and (
226-
meme.params_type.min_images == 1 and len(image_sources) == 0
241+
meme.params_type.min_images == 1 and len(images) == 0
227242
):
228-
if user_info := await get_user_info(bot, event, event.get_user_id()):
229-
if image_source := user_info.user_avatar:
230-
image_sources.append(image_source)
231-
user_infos.append(user_info)
243+
user = session.user
244+
if image_url := user.avatar:
245+
images.append(Image(url=image_url))
246+
if (member := session.member) and member.nick:
247+
user.nick = member.nick
248+
users.append(user)
232249

233250
# 当所需文字数 >0 且没有输入文字时,使用默认文字
234251
if memes_config.memes_use_default_when_no_text and (
@@ -244,9 +261,7 @@ async def finish(msg: str) -> NoReturn:
244261
await matcher.finish()
245262

246263
if not (
247-
meme.params_type.min_images
248-
<= len(image_sources)
249-
<= meme.params_type.max_images
264+
meme.params_type.min_images <= len(images) <= meme.params_type.max_images
250265
):
251266
await finish(
252267
f"输入图片数量不符,图片数量应为 {meme.params_type.min_images}"
@@ -267,7 +282,9 @@ async def finish(msg: str) -> NoReturn:
267282
)
268283

269284
matcher.stop_propagation()
270-
await process(matcher, session, meme, image_sources, texts, user_infos, args)
285+
await process(
286+
bot, event, state, matcher, session, meme, images, texts, users, args
287+
)
271288

272289

273290
def create_matchers():
@@ -297,24 +314,19 @@ async def _(
297314
state: T_State,
298315
matcher: Matcher,
299316
user_id: UserId,
300-
session: EventSession,
317+
session: Uninfo,
318+
interface: QryItrface,
301319
alc_matches: AlcMatches,
302320
):
303321
meme_params: list[T_MemeParams] = list(alc_matches.query(meme_params_key, ()))
304-
texts, image_sources, user_infos = await handle_params(
305-
bot, event, state, meme_params
306-
)
322+
texts, images, users = await handle_params(matcher, session, interface, meme_params)
307323

308324
available_memes = [
309325
meme
310326
for meme in meme_manager.get_memes()
311327
if meme_manager.check(user_id, meme.key)
312328
and (
313-
(
314-
meme.params_type.min_images
315-
<= len(image_sources)
316-
<= meme.params_type.max_images
317-
)
329+
(meme.params_type.min_images <= len(images) <= meme.params_type.max_images)
318330
and (meme.params_type.min_texts <= len(texts) <= meme.params_type.max_texts)
319331
)
320332
]
@@ -323,12 +335,15 @@ async def _(
323335

324336
random_meme = random.choice(available_memes)
325337
await process(
338+
bot,
339+
event,
340+
state,
326341
matcher,
327342
session,
328343
random_meme,
329-
image_sources,
344+
images,
330345
texts,
331-
user_infos,
346+
users,
332347
show_info=memes_config.memes_random_meme_show_info,
333348
)
334349

nonebot_plugin_memes_api/matchers/help.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
from nonebot_plugin_alconna import Image, Text, on_alconna
66
from nonebot_plugin_localstore import get_cache_dir
7-
from nonebot_plugin_session import EventSession, SessionIdType
7+
from nonebot_plugin_uninfo import Uninfo
88
from pypinyin import Style, pinyin
99

1010
from ..config import memes_config
1111
from ..manager import meme_manager
12-
from ..recorder import get_meme_generation_keys
12+
from ..recorder import SessionIdType, get_meme_generation_keys
1313
from ..request import MemeKeyWithProperties, render_meme_list
1414
from .utils import UserId
1515

@@ -25,7 +25,7 @@
2525

2626

2727
@help_matcher.handle()
28-
async def _(user_id: UserId, session: EventSession):
28+
async def _(user_id: UserId, session: Uninfo):
2929
memes = meme_manager.get_memes()
3030
list_image_config = memes_config.memes_list_image_config
3131

0 commit comments

Comments
 (0)