ayaka.extension.user_input

 1import re
 2from typing import Optional
 3from pydantic import BaseModel, Field
 4from ..ayaka import AyakaApp
 5from ..depend import AyakaInput
 6from ..driver import MessageSegment
 7
 8
 9def find_user_by_uid(users: list, uid: int):
10    for user in users:
11        if uid == user["user_id"]:
12            return user
13
14
15def find_user_by_uname(users: list, uname: str):
16    for user in users:
17        _uname = user["card"] or user["nickname"]
18        if _uname == uname:
19            return user
20
21
22async def get_user(app: AyakaApp, at: MessageSegment):
23    str_at = str(at)
24    users = await app.bot.get_group_member_list(group_id=app.group_id)
25
26    if at.type == "at":
27        user = find_user_by_uid(users, int(at.data["qq"]))
28    elif at.type != "text":
29        return
30    elif re.search(r"^\d+$", str_at):
31        user = find_user_by_uid(users, int(str_at))
32    elif str_at.startswith("@"):
33        user = find_user_by_uname(users, str_at[1:])
34    else:
35        user = find_user_by_uname(users, str_at)
36
37    if user:
38        uid = user["user_id"]
39        uname = user["card"] or user["nickname"]
40        return User(id=uid, name=uname)
41
42
43class User(BaseModel):
44    id: int
45    name: str
46
47
48class UserInput(AyakaInput):
49    '''将用户输入的第一个参数(QQ号/群名片/@xxx)自动转换为User对象'''
50    user: Optional[User] = Field(description="查询目标的QQ号/名称/@xx")
51
52    @classmethod
53    async def create_by_app_get_params(cls, app: AyakaApp):
54        args = app.args
55        props = cls.props()
56        params = {k: v for k, v in zip(props, args)}
57        if args:
58            params["user"] = await get_user(app, args[0])
59        return params
def find_user_by_uid(users: list, uid: int):
10def find_user_by_uid(users: list, uid: int):
11    for user in users:
12        if uid == user["user_id"]:
13            return user
def find_user_by_uname(users: list, uname: str):
16def find_user_by_uname(users: list, uname: str):
17    for user in users:
18        _uname = user["card"] or user["nickname"]
19        if _uname == uname:
20            return user
async def get_user( app: ayaka.ayaka.AyakaApp, at: nonebot.adapters.onebot.v11.message.MessageSegment):
23async def get_user(app: AyakaApp, at: MessageSegment):
24    str_at = str(at)
25    users = await app.bot.get_group_member_list(group_id=app.group_id)
26
27    if at.type == "at":
28        user = find_user_by_uid(users, int(at.data["qq"]))
29    elif at.type != "text":
30        return
31    elif re.search(r"^\d+$", str_at):
32        user = find_user_by_uid(users, int(str_at))
33    elif str_at.startswith("@"):
34        user = find_user_by_uname(users, str_at[1:])
35    else:
36        user = find_user_by_uname(users, str_at)
37
38    if user:
39        uid = user["user_id"]
40        uname = user["card"] or user["nickname"]
41        return User(id=uid, name=uname)
class User(pydantic.main.BaseModel):
44class User(BaseModel):
45    id: int
46    name: str
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
class UserInput(ayaka.depend.input.AyakaInput):
49class UserInput(AyakaInput):
50    '''将用户输入的第一个参数(QQ号/群名片/@xxx)自动转换为User对象'''
51    user: Optional[User] = Field(description="查询目标的QQ号/名称/@xx")
52
53    @classmethod
54    async def create_by_app_get_params(cls, app: AyakaApp):
55        args = app.args
56        props = cls.props()
57        params = {k: v for k, v in zip(props, args)}
58        if args:
59            params["user"] = await get_user(app, args[0])
60        return params

将用户输入的第一个参数(QQ号/群名片/@xxx)自动转换为User对象

@classmethod
async def create_by_app_get_params(cls, app: ayaka.ayaka.AyakaApp):
53    @classmethod
54    async def create_by_app_get_params(cls, app: AyakaApp):
55        args = app.args
56        props = cls.props()
57        params = {k: v for k, v in zip(props, args)}
58        if args:
59            params["user"] = await get_user(app, args[0])
60        return params

可用于重构

Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
ayaka.depend.input.AyakaInput
create_by_app
create_by_app_deal_exc
help
ayaka.depend.depend.AyakaDepend
props