Skip to content

示例插件

准备工作

下载本仓库

git clone https://github.com/bridgeL/ayaka.git

使用poetry安装依赖

poetry shell
poetry install

本页的示例均可在其example中找到

示例插件

赌石

# example/stone.py
from random import randint
from ayaka import AyakaCat

# 创建一只猫猫
cat = AyakaCat("赌石")

# 设置唤醒和休息命令
cat.set_wakeup_cmds(cmds=["赌石", "stone"])
cat.set_rest_cmds(cmds=["退出", "exit"])
# 编写业务逻辑
@cat.on_cmd(cmds=["敲", "hit"], states="idle")
async def hit():
    if randint(0, 1):
        return await cat.send("运气真好,开出了和田玉")
    await cat.send("只是一块破石头")

敲木鱼

# example/muyu.py
from ayaka import AyakaCat
from pydantic import BaseModel

# 创建一只猫猫
cat = AyakaCat("木鱼")

# 设置唤醒和休息命令
cat.set_wakeup_cmds(cmds=["木鱼", "muyu"])
cat.set_rest_cmds(cmds=["退出", "exit"])
# 创建数据对象
class User(BaseModel):
    id: str
    name: str
    cnt: int = 0


class Muyu(BaseModel):
    users: list[User] = []
    step: int = 1

    def get(self, user_id: str, user_name: str):
        for user in self.users:
            if user.id == user_id:
                return user
        else:
            user = User(id=user_id, name=user_name)
            self.users.append(user)
        return user

    def hit(self, user_id: str, user_name: str):
        user = self.get(user_id, user_name)
        user.cnt += self.step
# 编写业务逻辑
@cat.on_cmd(cmds=["敲", "hit"], states="idle")
async def hit():
    muyu = cat.get_data(Muyu)
    muyu.hit(cat.user.id, cat.user.name)
    await cat.send("笃")


@cat.on_cmd(cmds=["查询功德", "query"], states="idle")
async def query():
    muyu = cat.get_data(Muyu)
    user = muyu.get(cat.user.id, cat.user.name)
    await cat.send(f"[{user.name}] 现在的功德是 {user.cnt}")


@cat.on_cmd(cmds=["调整步进", "set step"], states="idle")
async def set_step():
    if not cat.nums:
        return await cat.send("没有输入数字")
    muyu = cat.get_data(Muyu)
    muyu.step = cat.nums[0]

人员登记

# example/input.py
from ayaka import AyakaCat
from pydantic import BaseModel

cat = AyakaCat("人员登记")
# 创建数据对象
class User(BaseModel):
    name: str = ""
    age: int = 0


class UserList(BaseModel):
    users: list[User] = []
# 编写业务逻辑
@cat.on_cmd(cmds="查看登记情况")
async def show():
    # 展示总表
    user_list = cat.get_data(UserList)
    items = [repr(u) for u in user_list.users]
    await cat.send_many(items)


@cat.on_cmd(cmds="我要登记")
async def start():
    # 下一阶段
    cat.sub_state = "name"
    await cat.send("姓名")


@cat.on_text(sub_states="name")
async def input_name():
    # 记录数据
    user = cat.user.get_data(User)
    user.name = cat.arg

    # 下一阶段
    cat.sub_state = "age"
    await cat.send("年龄")


@cat.on_text(sub_states="age")
async def input_age():
    # 从缓存中清除
    user = cat.user.pop_data(User)
    user.age = cat.arg

    # 复原状态
    cat.sub_state = ""

    # 记录到总表
    user_list = cat.get_data(UserList)
    user_list.users.append(user)

    # 展示
    await cat.send(f"登记完成 {user}")

离线调试

作为console程序运行

# run.py
import ayaka.adapters.console as cat

# 加载插件
from example import stone
from example import muyu
from example import input

if __name__ == "__main__":
    cat.run()
python run.py

编写测试脚本

# script/muyu.txt
# 测试木鱼 √

g 100 1 木鱼
g 100 1 敲
g 100 1 敲
g 100 1 查询功德
g 100 1 set step 1000
g 100 1 hit
g 100 1 query
g 100 1 exit
# script/stone.txt
# 测试赌石 √

# 设定默认角色
g 100 1 

# 接下来均以群聊100中的uid为1的角色来发言
赌石
敲
敲
hit
hit
exit
# script/input.txt
g 100 1 我要登记
g 100 1 江山
g 100 1 12
g 100 2 我要登记
g 100 2 明月
g 100 3 我要登记
g 100 1 查看登记情况
g 100 3 红袖 
g 100 2 100
g 100 3 18
g 100 1 查看登记情况
# script/0.txt
# 测试木鱼
s muyu

# 测试赌石
s stone

# 测试人员登记
s input

运行测试脚本

python run.py

然后

s 0

猫猫帮助

ayaka自动为以上三个插件生成了帮助

"user" 说:猫猫帮助 "Bot" 说:加载的猫猫列表 - [人员登记] - [木鱼] - [猫猫管理器] - [赌石] "Bot" 说:如果想获得进一步帮助请使用命令 - 猫猫帮助 - <猫猫名> - 全部猫猫帮助
"user" 说:猫猫帮助 赌石 "Bot" 说:[赌石] 猫猫插件:赌石 [*] - 退出/exit 猫猫休息 - 赌石/stone 唤醒猫猫 [idle] - 敲/hit
"user" 说:猫猫帮助 木鱼 "Bot" 说:[木鱼] 猫猫插件:木鱼 [*] - 退出/exit 猫猫休息 - 木鱼/muyu 唤醒猫猫 [idle] - 敲/hit - 查询功德/query - 调整步进/set step
"user" 说:猫猫帮助 人员登记 "Bot" 说:[人员登记] 猫猫插件:人员登记 - 查看登记情况 - 我要登记 [age] - <任意文字> [name] - <任意文字>

下一步

在这里~ ↘