248 lines
8.2 KiB
Python
248 lines
8.2 KiB
Python
import io
|
|
import secrets
|
|
|
|
import aiofiles
|
|
from nonebot import get_driver
|
|
from nonebot.adapters import Event
|
|
from nonebot.log import logger
|
|
from nonebot.permission import SUPERUSER
|
|
from nonebot_plugin_alconna import Alconna, Args, Match, on_alconna
|
|
from nonebot_plugin_alconna.uniseg import Image, Text, UniMessage
|
|
from nonebot_plugin_alconna.uniseg.tools import image_fetch
|
|
from nonebot_plugin_apscheduler import scheduler
|
|
|
|
from .check_user_data import check_iscd, check_ismax
|
|
from .files import delete_pic, save_pic
|
|
from .menu import Menu
|
|
from .random_pic import random_pic
|
|
|
|
NICKNAME = list(get_driver().config.nickname)
|
|
BOT_NAME = NICKNAME[0] if NICKNAME else "脑积水"
|
|
|
|
TIME = 0.0
|
|
USER_DATA = {}
|
|
MAX_MSG = [
|
|
"你今天吃的够多了!不许再吃了(´-ωก`)",
|
|
"吃吃吃,就知道吃,你都吃饱了!明天再来(▼皿▼#)",
|
|
"(*`へ´*)你猜我会不会再给你发好吃的图片",
|
|
f"没得吃的了,{BOT_NAME}的食物都被你这坏蛋吃光了!",
|
|
"你在等我给你发好吃的?做梦哦!你都吃那么多了,不许再吃了!ヽ(≧Д≦)ノ",
|
|
]
|
|
|
|
eat_pic_matcher = on_alconna(
|
|
Alconna("今天吃什么"),
|
|
use_cmd_start=True,
|
|
)
|
|
|
|
drink_pic_matcher = on_alconna(
|
|
Alconna("今天喝什么"),
|
|
use_cmd_start=True,
|
|
)
|
|
|
|
me_pic_matcher = on_alconna(
|
|
Alconna("今天蜜什么"),
|
|
use_cmd_start=True,
|
|
)
|
|
|
|
view_menu_matcher = on_alconna(
|
|
Alconna("全部菜单", Args["img_type?", str]),
|
|
use_cmd_start=True,
|
|
aliases=("查看菜单", "查看菜品"),
|
|
)
|
|
|
|
add_menu_matcher = on_alconna(
|
|
Alconna(
|
|
"添加菜单", Args["name?", str], Args["img_type?", str], Args["img?", Image]
|
|
),
|
|
use_cmd_start=True,
|
|
permission=SUPERUSER,
|
|
)
|
|
|
|
del_menu_matcher = on_alconna(
|
|
Alconna("删除菜单", Args["name?", str], Args["img_type?", str]),
|
|
use_cmd_start=True,
|
|
permission=SUPERUSER,
|
|
)
|
|
|
|
|
|
eat_pic_matcher.shortcut(
|
|
r"^[今|明|后]?[天|日]?(早|中|晚)?(上|午|餐|饭|夜宵|宵夜|早|晚)吃(什么|啥|点啥)$",
|
|
fuzzy=False,
|
|
prefix=True,
|
|
)
|
|
drink_pic_matcher.shortcut(
|
|
r"^[今|明|后]?[天|日]?(早|中|晚)?(上|午|餐|饭|夜宵|宵夜|早|晚)喝(什么|啥|点啥)$",
|
|
fuzzy=False,
|
|
prefix=True,
|
|
)
|
|
me_pic_matcher.shortcut(
|
|
r"^(我要蜜)?[今|明|后]?[天|日]?(早|中|晚)?(上|午|餐|饭|夜宵|宵夜|早|晚)蜜(什么|啥|点啥)$",
|
|
fuzzy=False,
|
|
prefix=True,
|
|
)
|
|
|
|
|
|
@eat_pic_matcher.handle()
|
|
async def handle_eat_pic(event: Event):
|
|
global TIME
|
|
global USER_DATA
|
|
check_max_result, USER_DATA = check_ismax(event, USER_DATA)
|
|
check_result, remain_time, TIME = check_iscd(TIME)
|
|
if check_max_result:
|
|
await UniMessage.text(secrets.choice(MAX_MSG)).finish()
|
|
elif check_result:
|
|
await UniMessage.text(f"cd冷却中,还有{remain_time:.2f}秒").finish()
|
|
else:
|
|
pic_path, pic_name = random_pic("eat")
|
|
send_msg: UniMessage = UniMessage(Text(f"🎉{BOT_NAME}建议你吃🎉\n{pic_name}"))
|
|
async with aiofiles.open(pic_path, "rb") as f:
|
|
send_msg.append(Image(raw=await f.read()))
|
|
await send_msg.finish()
|
|
|
|
|
|
@drink_pic_matcher.handle()
|
|
async def handle_drink_pic(event: Event):
|
|
global TIME
|
|
global USER_DATA
|
|
check_max_result, USER_DATA = check_ismax(event, USER_DATA)
|
|
check_result, remain_time, TIME = check_iscd(TIME)
|
|
if check_max_result:
|
|
await UniMessage.text(secrets.choice(MAX_MSG)).finish()
|
|
elif check_result:
|
|
await UniMessage.text(f"cd冷却中,还有{remain_time:.2f}秒").finish()
|
|
else:
|
|
pic_path, pic_name = random_pic("drink")
|
|
send_msg: UniMessage = UniMessage(Text(f"🎉{BOT_NAME}建议你喝🎉\n{pic_name}"))
|
|
async with aiofiles.open(pic_path, "rb") as f:
|
|
send_msg.append(Image(raw=await f.read()))
|
|
await send_msg.finish()
|
|
|
|
|
|
@me_pic_matcher.handle()
|
|
async def handle_me_pic(event: Event):
|
|
global TIME
|
|
global USER_DATA
|
|
check_max_result, USER_DATA = check_ismax(event, USER_DATA)
|
|
check_result, remain_time, TIME = check_iscd(TIME)
|
|
if check_max_result:
|
|
await UniMessage.text(secrets.choice(MAX_MSG)).finish()
|
|
elif check_result:
|
|
await UniMessage.text(f"cd冷却中,还有{remain_time:.2f}秒").finish()
|
|
else:
|
|
pic_path, pic_name = random_pic("me")
|
|
send_msg: UniMessage = UniMessage(Text(f"🎉{BOT_NAME}建议你喝🎉\n{pic_name}"))
|
|
async with aiofiles.open(pic_path, "rb") as f:
|
|
send_msg.append(Image(raw=await f.read()))
|
|
await send_msg.finish()
|
|
|
|
|
|
@view_menu_matcher.handle()
|
|
async def handle_view_menu(img_type: Match[str]):
|
|
if img_type.available:
|
|
view_menu_matcher.set_path_arg("img_type", img_type.result)
|
|
|
|
|
|
@view_menu_matcher.got_path("img_type", prompt=f"请告诉{BOT_NAME}具体菜单类型吧")
|
|
async def _(img_type: str):
|
|
menu_type = img_type.strip()
|
|
if menu_type in ["菜单", "菜品"]:
|
|
menu_type = "eat"
|
|
elif menu_type in ["饮料", "饮品"]:
|
|
menu_type = "drink"
|
|
elif menu_type in ["蜜雪", "蜜", "蜜雪冰城"]:
|
|
menu_type = "me"
|
|
else:
|
|
await UniMessage.text("菜单类型错误,请重新输入").finish()
|
|
|
|
try:
|
|
menu = Menu(menu_type)
|
|
send_msg_list = UniMessage(Text("菜单如下:"))
|
|
for img in menu.draw_menu():
|
|
img_bytesio = io.BytesIO()
|
|
img.save(img_bytesio, format="JPEG")
|
|
send_msg_list.append(Image(raw=img_bytesio)) # type: ignore
|
|
await send_msg_list.finish()
|
|
except OSError as e:
|
|
await UniMessage.text(f"没有找到菜单,请稍后重试\n{e}").finish()
|
|
|
|
|
|
@add_menu_matcher.handle()
|
|
async def _(name: Match[str], img_type: Match[str]):
|
|
if name.available:
|
|
add_menu_matcher.set_path_arg("name", name.result)
|
|
if img_type.available:
|
|
add_menu_matcher.set_path_arg("img_type", img_type.result)
|
|
|
|
|
|
@add_menu_matcher.got_path("name", prompt=f"请告诉{BOT_NAME}具体菜名或者饮品名吧")
|
|
async def _(name: str):
|
|
if not name:
|
|
await UniMessage.text("菜名不能为空,请重新输入").finish()
|
|
|
|
|
|
@add_menu_matcher.got_path("img_type", prompt=f"请告诉{BOT_NAME}具体菜单类型吧")
|
|
async def _(img_type: str):
|
|
if img_type in ["菜品", "菜单"]:
|
|
add_menu_matcher.set_path_arg("img_type", "eat")
|
|
elif img_type in ["饮料", "饮品"]:
|
|
add_menu_matcher.set_path_arg("img_type", "drink")
|
|
elif img_type in ["蜜雪", "蜜", "蜜雪冰城"]:
|
|
add_menu_matcher.set_path_arg("img_type", "me")
|
|
else:
|
|
await UniMessage.text("菜单类型错误,请重新输入").finish()
|
|
|
|
|
|
@add_menu_matcher.got_path(
|
|
"img", prompt=f"请告诉{BOT_NAME}图片吧", middleware=image_fetch
|
|
)
|
|
async def _(
|
|
name: str,
|
|
img_type: str,
|
|
img: bytes,
|
|
):
|
|
if not img:
|
|
await UniMessage.text("图片不能为空,请重新输入").finish()
|
|
try:
|
|
save_pic(img, img_type=img_type, name=name)
|
|
await UniMessage.text(f"成功添加{name}").finish()
|
|
except OSError as e:
|
|
await UniMessage.text(f"添加失败,请稍后重试\n{e}").finish()
|
|
|
|
|
|
@del_menu_matcher.handle()
|
|
async def _(name: Match[str], img_type: Match[str]):
|
|
if name.available:
|
|
del_menu_matcher.set_path_arg("name", name.result)
|
|
if img_type.available:
|
|
del_menu_matcher.set_path_arg("img_type", img_type.result)
|
|
|
|
|
|
@del_menu_matcher.got_path("name", prompt=f"请告诉{BOT_NAME}具体菜名或者饮品名吧")
|
|
async def _(name: str):
|
|
if not name:
|
|
await UniMessage.text("菜名不能为空,请重新输入").finish()
|
|
|
|
|
|
@del_menu_matcher.got_path("img_type", prompt=f"请告诉{BOT_NAME}具体菜单类型吧")
|
|
async def _(img_type: str, name: str):
|
|
if img_type in ["菜品", "菜单"]:
|
|
img_type = "eat"
|
|
elif img_type in ["饮料", "饮品"]:
|
|
img_type = "drink"
|
|
elif img_type in ["蜜雪", "蜜", "蜜雪冰城"]:
|
|
img_type = "me"
|
|
else:
|
|
await UniMessage.text("菜单类型错误,请重新输入").finish()
|
|
try:
|
|
delete_pic(img_type, name) # type: ignore
|
|
await UniMessage.text(f"成功删除{name}").finish()
|
|
except FileNotFoundError as e:
|
|
await UniMessage.text(f"删除失败, {e}").finish()
|
|
|
|
|
|
# 每日8点清空用户数据
|
|
@scheduler.scheduled_job("cron", hour=8)
|
|
async def _():
|
|
USER_DATA.clear()
|
|
logger.info("已清空用户数据")
|