From 31ad8dac3e8db6808480db82358a2ca056fb860b Mon Sep 17 00:00:00 2001 From: passthem Date: Sat, 21 Feb 2026 22:43:09 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8A=82=E6=B0=94?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/plugins/solar_terms/__init__.py | 31 +++++++++++++++++++++++++ poetry.lock | 18 +++++++++++++- pyproject.toml | 1 + 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 konabot/plugins/solar_terms/__init__.py diff --git a/konabot/plugins/solar_terms/__init__.py b/konabot/plugins/solar_terms/__init__.py new file mode 100644 index 0000000..cb34105 --- /dev/null +++ b/konabot/plugins/solar_terms/__init__.py @@ -0,0 +1,31 @@ +from borax.calendars import LunarDate +from nonebot_plugin_alconna import UniMessage +from nonebot_plugin_apscheduler import scheduler + +from konabot.common.llm import get_llm +from konabot.plugins.poster.poster_info import PosterInfo, register_poster_info +from konabot.plugins.poster.service import broadcast + +register_poster_info("二十四节气", PosterInfo( + {"节气", "24节气"}, + "当有新的节气时,报告节气信息", +)) + + +@scheduler.scheduled_job("cron", hour="8") +async def _(): + today = LunarDate.today() + term: str | None = today.term + + if term is not None: + llm = get_llm("qwen3-max") + prompt = f"请写两个四字词语,讲讲节气:{term}。以感叹号结尾,格式是「某某某某,某某某某!」,不要带有其他内容。" + result = await llm.chat([{ + "role": "user", "content": prompt, + }]) + result = result.content + if result is None: + result = "" + + await broadcast("二十四节气", UniMessage.text(f"【今日节气】今天是 {term} 哦!{result}")) + 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] From 74052594c326b155baa1f2ac55568fa7d180406c Mon Sep 17 00:00:00 2001 From: passthem Date: Sat, 21 Feb 2026 23:36:42 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8A=82=E6=B0=94?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/plugins/solar_terms/__init__.py | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/konabot/plugins/solar_terms/__init__.py b/konabot/plugins/solar_terms/__init__.py index cb34105..83891ed 100644 --- a/konabot/plugins/solar_terms/__init__.py +++ b/konabot/plugins/solar_terms/__init__.py @@ -1,4 +1,6 @@ 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 @@ -29,3 +31,35 @@ async def _(): await broadcast("二十四节气", UniMessage.text(f"【今日节气】今天是 {term} 哦!{result}")) + +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 + + 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() + while date.term is None: + date = date.before(day_delta=1) + + msg = UniMessage.text(f"现在的节气是{date.term}") + await msg.send(event) + From 9210f8530098c61814b36380d74133ad3edf94e5 Mon Sep 17 00:00:00 2001 From: passthem Date: Sat, 21 Feb 2026 23:45:01 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E8=AE=A9=E8=8A=82=E6=B0=94=E9=9D=99?= =?UTF-8?q?=E6=80=81=E5=86=85=E7=BD=AE=E8=80=8C=E4=B8=8D=E6=98=AF=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=20LLM=20=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/plugins/solar_terms/__init__.py | 57 ++++++++++++++++++------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/konabot/plugins/solar_terms/__init__.py b/konabot/plugins/solar_terms/__init__.py index 83891ed..c39721b 100644 --- a/konabot/plugins/solar_terms/__init__.py +++ b/konabot/plugins/solar_terms/__init__.py @@ -4,14 +4,45 @@ from nonebot.internal.adapter.event import Event from nonebot_plugin_alconna import UniMessage from nonebot_plugin_apscheduler import scheduler -from konabot.common.llm import get_llm from konabot.plugins.poster.poster_info import PosterInfo, register_poster_info from konabot.plugins.poster.service import broadcast -register_poster_info("二十四节气", PosterInfo( - {"节气", "24节气"}, - "当有新的节气时,报告节气信息", -)) +register_poster_info( + "二十四节气", + PosterInfo( + {"节气", "24节气"}, + "当有新的节气时,报告节气信息", + ), +) + +# 二十四节气的内置口号 +# Generated by claude-opus-4.6 +SOLAR_TERM_SLOGANS: dict[str, str] = { + "立春": "春回大地,万物复苏!", + "雨水": "春雨绵绵,润物无声!", + "惊蛰": "春雷惊蛰,万物生长!", + "春分": "昼夜平分,春意盎然!", + "清明": "清明时节,踏青赏春!", + "谷雨": "谷雨时节,播种希望!", + "立夏": "立夏之日,夏意渐浓!", + "小满": "小满时节,麦穗渐满!", + "芒种": "芒种农忙,收获在望!", + "夏至": "夏至日长,骄阳似火!", + "小暑": "小暑炎炎,清凉为伴!", + "大暑": "大暑酷热,防暑降温!", + "立秋": "立秋时节,暑去凉来!", + "处暑": "处暑时节,秋高气爽!", + "白露": "白露降临,秋意渐浓!", + "秋分": "秋分时节,硕果累累!", + "寒露": "寒露凝结,秋意正浓!", + "霜降": "霜降时节,秋收冬藏!", + "立冬": "立冬之日,冬意渐起!", + "小雪": "小雪飘飘,寒意渐浓!", + "大雪": "大雪纷飞,银装素裹!", + "冬至": "冬至日短,数九寒天!", + "小寒": "小寒时节,天寒地冻!", + "大寒": "大寒岁末,辞旧迎新!", +} @scheduler.scheduled_job("cron", hour="8") @@ -20,20 +51,15 @@ async def _(): term: str | None = today.term if term is not None: - llm = get_llm("qwen3-max") - prompt = f"请写两个四字词语,讲讲节气:{term}。以感叹号结尾,格式是「某某某某,某某某某!」,不要带有其他内容。" - result = await llm.chat([{ - "role": "user", "content": prompt, - }]) - result = result.content - if result is None: - result = "" - - await broadcast("二十四节气", UniMessage.text(f"【今日节气】今天是 {term} 哦!{result}")) + 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() @@ -54,6 +80,7 @@ async def _(event: Event): cmd_current_term = on_command("当前节气", aliases={"获取节气", "节气"}) + @cmd_current_term.handle() async def _(event: Event): date = LunarDate.today() From 19e83dea01efe6960fcb3aaa5d6e8babcd8f6f5c Mon Sep 17 00:00:00 2001 From: passthem Date: Sat, 21 Feb 2026 23:51:03 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=80=83=E8=99=91=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E8=BE=B9=E7=95=8C=E6=9D=A1=E4=BB=B6=E7=9A=84=E9=A3=8E=E9=99=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/plugins/solar_terms/__init__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/konabot/plugins/solar_terms/__init__.py b/konabot/plugins/solar_terms/__init__.py index c39721b..3e20d2e 100644 --- a/konabot/plugins/solar_terms/__init__.py +++ b/konabot/plugins/solar_terms/__init__.py @@ -68,6 +68,9 @@ async def _(event: Event): 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() @@ -84,8 +87,14 @@ 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)