forked from bot/app
103 lines
4.1 KiB
Python
103 lines
4.1 KiB
Python
from nonebot import require, on_endswith
|
|
from nonebot.adapters import satori
|
|
from nonebot.adapters.onebot.v11 import MessageSegment
|
|
from nonebot.internal.matcher import Matcher
|
|
|
|
from liteyuki.utils.base.config import get_config
|
|
from liteyuki.utils.base.ly_typing import T_MessageEvent
|
|
|
|
from .qw_api import *
|
|
from liteyuki.utils.base.data_manager import User, user_db
|
|
from liteyuki.utils.base.language import Language, get_user_lang
|
|
from liteyuki.utils.base.resource import get_path
|
|
from liteyuki.utils.message.html_tool import template2image
|
|
from liteyuki.utils import event as event_utils
|
|
|
|
require("nonebot_plugin_alconna")
|
|
from nonebot_plugin_alconna import on_alconna, Alconna, Args, MultiVar, Arparma, UniMessage
|
|
|
|
wx_alc = on_alconna(
|
|
aliases={"天气"},
|
|
command=Alconna(
|
|
"weather",
|
|
Args["keywords", MultiVar(str), []],
|
|
),
|
|
)
|
|
|
|
|
|
@wx_alc.handle()
|
|
async def _(result: Arparma, event: T_MessageEvent, matcher: Matcher):
|
|
"""await alconna.send("weather", city)"""
|
|
kws = result.main_args.get("keywords")
|
|
image = await get_weather_now_card(matcher, event, kws)
|
|
await wx_alc.finish(UniMessage.image(raw=image))
|
|
|
|
|
|
@on_endswith(("天气", "weather")).handle()
|
|
async def _(event: T_MessageEvent, matcher: Matcher):
|
|
"""await alconna.send("weather", city)"""
|
|
# kws = event.message.extract_plain_text()
|
|
kws = event.get_plaintext()
|
|
image = await get_weather_now_card(matcher, event, [kws.replace("天气", "").replace("weather", "")], False)
|
|
if isinstance(event, satori.event.Event):
|
|
await matcher.finish(satori.MessageSegment.image(raw=image, mime="image/png"))
|
|
else:
|
|
await matcher.finish(MessageSegment.image(image))
|
|
|
|
|
|
async def get_weather_now_card(matcher: Matcher, event: T_MessageEvent, keyword: list[str], tip: bool = True):
|
|
ulang = get_user_lang(event_utils.get_user_id(event))
|
|
qw_lang = get_qw_lang(ulang.lang_code)
|
|
key = get_config("weather_key")
|
|
is_dev = get_memory_data("weather.is_dev", True)
|
|
user: User = user_db.where_one(User(), "user_id = ?", event_utils.get_user_id(event), default=User())
|
|
# params
|
|
unit = user.profile.get("unit", "m")
|
|
stored_location = user.profile.get("location", None)
|
|
|
|
if not key:
|
|
await matcher.finish(ulang.get("weather.no_key") if tip else None)
|
|
|
|
if keyword:
|
|
if len(keyword) >= 2:
|
|
adm = keyword[0]
|
|
city = keyword[-1]
|
|
else:
|
|
adm = ""
|
|
city = keyword[0]
|
|
city_info = await city_lookup(city, key, adm=adm, lang=qw_lang)
|
|
city_name = " ".join(keyword)
|
|
else:
|
|
if not stored_location:
|
|
await matcher.finish(ulang.get("liteyuki.invalid_command", TEXT="location") if tip else None)
|
|
city_info = await city_lookup(stored_location, key, lang=qw_lang)
|
|
city_name = stored_location
|
|
if city_info.code == "200":
|
|
location_data = city_info.location[0]
|
|
else:
|
|
await matcher.finish(ulang.get("weather.city_not_found", CITY=city_name) if tip else None)
|
|
weather_now = await get_weather_now(key, location_data.id, lang=qw_lang, unit=unit, dev=is_dev)
|
|
weather_daily = await get_weather_daily(key, location_data.id, lang=qw_lang, unit=unit, dev=is_dev)
|
|
weather_hourly = await get_weather_hourly(key, location_data.id, lang=qw_lang, unit=unit, dev=is_dev)
|
|
aqi = await get_airquality(key, location_data.id, lang=qw_lang, dev=is_dev)
|
|
|
|
image = await template2image(
|
|
template=get_path("templates/weather_now.html", abs_path=True),
|
|
templates={
|
|
"data": {
|
|
"params" : {
|
|
"unit": unit,
|
|
"lang": ulang.lang_code,
|
|
},
|
|
"weatherNow" : weather_now,
|
|
"weatherDaily" : weather_daily,
|
|
"weatherHourly": weather_hourly,
|
|
"aqi" : aqi,
|
|
"location" : location_data.dump(),
|
|
"localization" : get_local_data(ulang.lang_code)
|
|
}
|
|
},
|
|
wait=1
|
|
)
|
|
return image
|