66from arclet .alconna import config as alc_config
77from nonebot import get_driver
88from nonebot .adapters import Bot , Event
9- from nonebot .compat import PYDANTIC_V2 , ConfigDict
109from nonebot .exception import AdapterException
1110from nonebot .log import logger
1211from nonebot .matcher import Matcher
2524)
2625from nonebot_plugin_alconna .builtins .extensions .reply import ReplyMergeExtension
2726from 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
3129from ..config import memes_config
3230from ..exception import MemeGeneratorException
4038
4139
4240async 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-
10892T_MemeParams = Union [Text , Image , At ]
10993meme_params_key = "meme_params"
11094arg_meme_params = Args [meme_params_key , MultiVar (T_MemeParams , "*" )]
11195
11296
11397async 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
152164matchers : 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
273290def 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
0 commit comments