diff --git a/konabot/plugins/solar_terms/__init__.py b/konabot/plugins/solar_terms/__init__.py new file mode 100644 index 0000000..3e20d2e --- /dev/null +++ b/konabot/plugins/solar_terms/__init__.py @@ -0,0 +1,101 @@ +from borax.calendars import LunarDate +from nonebot import on_command +from nonebot.internal.adapter.event import Event +from nonebot_plugin_alconna import UniMessage +from nonebot_plugin_apscheduler import scheduler + +from konabot.plugins.poster.poster_info import PosterInfo, register_poster_info +from konabot.plugins.poster.service import broadcast + +register_poster_info( + "二十四节气", + PosterInfo( + {"节气", "24节气"}, + "当有新的节气时,报告节气信息", + ), +) + +# 二十四节气的内置口号 +# Generated by claude-opus-4.6 +SOLAR_TERM_SLOGANS: dict[str, str] = { + "立春": "春回大地,万物复苏!", + "雨水": "春雨绵绵,润物无声!", + "惊蛰": "春雷惊蛰,万物生长!", + "春分": "昼夜平分,春意盎然!", + "清明": "清明时节,踏青赏春!", + "谷雨": "谷雨时节,播种希望!", + "立夏": "立夏之日,夏意渐浓!", + "小满": "小满时节,麦穗渐满!", + "芒种": "芒种农忙,收获在望!", + "夏至": "夏至日长,骄阳似火!", + "小暑": "小暑炎炎,清凉为伴!", + "大暑": "大暑酷热,防暑降温!", + "立秋": "立秋时节,暑去凉来!", + "处暑": "处暑时节,秋高气爽!", + "白露": "白露降临,秋意渐浓!", + "秋分": "秋分时节,硕果累累!", + "寒露": "寒露凝结,秋意正浓!", + "霜降": "霜降时节,秋收冬藏!", + "立冬": "立冬之日,冬意渐起!", + "小雪": "小雪飘飘,寒意渐浓!", + "大雪": "大雪纷飞,银装素裹!", + "冬至": "冬至日短,数九寒天!", + "小寒": "小寒时节,天寒地冻!", + "大寒": "大寒岁末,辞旧迎新!", +} + + +@scheduler.scheduled_job("cron", hour="8") +async def _(): + today = LunarDate.today() + term: str | None = today.term + + if term is not None: + slogan = SOLAR_TERM_SLOGANS.get(term, "") + await broadcast( + "二十四节气", UniMessage.text(f"【今日节气】今天是 {term} 哦!{slogan}") + ) + + +cmd_next_term = on_command("下一个节气") + + +@cmd_next_term.handle() +async def _(event: Event): + date = LunarDate.today() + day_counter = 0 + + while date.term is None: + date = date.after(day_delta=1) + day_counter += 1 + if day_counter > 365: + await UniMessage.text("哇呀...查询出错了!").send(event) + return + + d_cn_format = date.strftime("%M月%D") # 相当于正月初一这样的格式 + date_solar = date.to_solar_date() + d_glob_format = f"{date_solar.month} 月 {date_solar.day} 日" + msg = UniMessage.text( + f"下一个节气是{date.term},在 {day_counter} 天后的 {d_glob_format}(农历{d_cn_format})" + ) + await msg.send(event) + + +cmd_current_term = on_command("当前节气", aliases={"获取节气", "节气"}) + + +@cmd_current_term.handle() +async def _(event: Event): + date = LunarDate.today() + day_counter = 0 + + while date.term is None: + date = date.before(day_delta=1) + day_counter += 1 + if day_counter > 365: + await UniMessage.text("哇呀...查询出错了!").send(event) + return + + msg = UniMessage.text(f"现在的节气是{date.term}") + await msg.send(event) + diff --git a/poetry.lock b/poetry.lock index 7aad563..87aba8a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -750,6 +750,22 @@ type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" reference = "mirrors" +[[package]] +name = "borax" +version = "4.1.3" +description = "A tool collections.(Chinese-Lunar-Calendars/Python-Patterns)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "borax-4.1.3-py3-none-any.whl", hash = "sha256:bdba9abe1c3be4ba1b6a014b3b4a97a7ba254a08c7f40cd4428a13b84db02558"}, +] + +[package.source] +type = "legacy" +url = "https://pypi.tuna.tsinghua.edu.cn/simple" +reference = "mirrors" + [[package]] name = "brotli" version = "1.2.0" @@ -5126,4 +5142,4 @@ reference = "mirrors" [metadata] lock-version = "2.1" python-versions = ">=3.12,<4.0" -content-hash = "4caff431bad39bc7fb0dd2685ed64394f2bf960660b017897b8d00a8137d32f5" +content-hash = "15e51d7d14d091295e7d0ecabaa601fd65ae392fce28f90d5f3deb4718544e17" diff --git a/pyproject.toml b/pyproject.toml index efcb8ae..5071753 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ dependencies = [ "pypinyin (>=0.55.0,<0.56.0)", "shapely (>=2.1.2,<3.0.0)", "mcstatus (>=12.2.1,<13.0.0)", + "borax (>=4.1.3,<5.0.0)", ] [tool.poetry]