vibego 0.2.36__py3-none-any.whl → 0.2.38__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vibego might be problematic. Click here for more details.

bot.py CHANGED
@@ -482,7 +482,6 @@ _ESCAPED_CODE_BLOCK_PATTERN = re.compile(
482
482
  re.DOTALL
483
483
  )
484
484
 
485
-
486
485
  def _is_already_escaped(text: str) -> bool:
487
486
  """检测文本是否已经包含 MarkdownV2 转义字符。
488
487
 
@@ -583,6 +582,25 @@ def _prepare_model_payload(text: str) -> str:
583
582
  return text
584
583
 
585
584
 
585
+ def _optimize_markdown_v2_payload(payload: str) -> str:
586
+ """占位函数:保留严格转义版本,确保 MarkdownV2 合规。"""
587
+
588
+ return payload
589
+
590
+
591
+ def _prepare_model_payload_variants(text: str) -> tuple[str, Optional[str]]:
592
+ """返回首选与备用的 MarkdownV2 内容,首选尽量减少转义。"""
593
+
594
+ strict_payload = _prepare_model_payload(text)
595
+ if not _IS_MARKDOWN_V2:
596
+ return strict_payload, None
597
+
598
+ optimized_payload = _optimize_markdown_v2_payload(strict_payload)
599
+ if optimized_payload != strict_payload:
600
+ return optimized_payload, strict_payload
601
+ return strict_payload, None
602
+
603
+
586
604
  def _extract_bad_request_message(exc: TelegramBadRequest) -> str:
587
605
  message = getattr(exc, "message", None)
588
606
  if not message:
@@ -636,6 +654,7 @@ async def _send_with_markdown_guard(
636
654
  sender: Callable[[str], Awaitable[None]],
637
655
  *,
638
656
  raw_sender: Optional[Callable[[str], Awaitable[None]]] = None,
657
+ fallback_payload: Optional[str] = None,
639
658
  ) -> str:
640
659
  try:
641
660
  await sender(text)
@@ -644,6 +663,19 @@ async def _send_with_markdown_guard(
644
663
  if not _is_markdown_parse_error(exc):
645
664
  raise
646
665
 
666
+ if fallback_payload and fallback_payload != text:
667
+ try:
668
+ await sender(fallback_payload)
669
+ worker_log.debug(
670
+ "Markdown 优化回退为严格转义版本",
671
+ extra={"length": len(fallback_payload)},
672
+ )
673
+ return fallback_payload
674
+ except TelegramBadRequest as fallback_exc:
675
+ if not _is_markdown_parse_error(fallback_exc):
676
+ raise
677
+ exc = fallback_exc
678
+
647
679
  sanitized: Optional[str]
648
680
  if _IS_MARKDOWN_V2:
649
681
  sanitized = _escape_markdown_v2(text)
@@ -740,7 +772,11 @@ async def reply_large_text(
740
772
  """
741
773
  bot = current_bot()
742
774
  parse_mode_value = parse_mode if parse_mode is not None else _parse_mode_value()
743
- prepared = text if preformatted else _prepare_model_payload(text)
775
+ if preformatted:
776
+ prepared = text
777
+ fallback_payload = None
778
+ else:
779
+ prepared, fallback_payload = _prepare_model_payload_variants(text)
744
780
 
745
781
  async def _send_formatted_message(payload: str) -> None:
746
782
  await bot.send_message(
@@ -757,6 +793,7 @@ async def reply_large_text(
757
793
  prepared,
758
794
  _send_formatted_message,
759
795
  raw_sender=_send_raw_message,
796
+ fallback_payload=fallback_payload,
760
797
  )
761
798
 
762
799
  worker_log.info(
@@ -775,10 +812,12 @@ async def reply_large_text(
775
812
  f"内容较长,已生成附件 `{attachment_name}`,请下载查看全文。"
776
813
  )
777
814
 
815
+ summary_prepared, summary_fallback = _prepare_model_payload_variants(summary_text)
778
816
  delivered_summary = await _send_with_markdown_guard(
779
- summary_text,
817
+ summary_prepared,
780
818
  _send_formatted_message,
781
819
  raw_sender=_send_raw_message,
820
+ fallback_payload=summary_fallback,
782
821
  )
783
822
 
784
823
  document = BufferedInputFile(text.encode("utf-8"), filename=attachment_name)
@@ -1492,7 +1531,7 @@ async def _broadcast_worker_keyboard(bot: Bot) -> None:
1492
1531
  continue
1493
1532
 
1494
1533
  parse_mode = _parse_mode_value()
1495
- prepared = _prepare_model_payload(text)
1534
+ prepared, fallback_payload = _prepare_model_payload_variants(text)
1496
1535
 
1497
1536
  async def _send_formatted(payload: str) -> None:
1498
1537
  await bot.send_message(
@@ -1515,6 +1554,7 @@ async def _broadcast_worker_keyboard(bot: Bot) -> None:
1515
1554
  prepared,
1516
1555
  _send_formatted,
1517
1556
  raw_sender=_send_raw,
1557
+ fallback_payload=fallback_payload,
1518
1558
  )
1519
1559
  except TelegramForbiddenError as exc:
1520
1560
  worker_log.warning("推送任务列表被拒绝:%s", exc, extra={**_session_extra(), "chat": chat_id})
@@ -2598,7 +2638,7 @@ def _build_status_buttons(task_id: str, current_status: str) -> list[list[Inline
2598
2638
  for status in STATUS_DISPLAY_ORDER:
2599
2639
  text = _format_status(status)
2600
2640
  if status == current_status:
2601
- text = f"👉 {text} (当前)"
2641
+ text = f"{text} (当前)"
2602
2642
  row.append(
2603
2643
  InlineKeyboardButton(
2604
2644
  text=text,
@@ -2772,13 +2812,32 @@ async def _answer_with_markdown(
2772
2812
  *,
2773
2813
  reply_markup: InlineKeyboardMarkup | ReplyKeyboardMarkup | None = None,
2774
2814
  ) -> Optional[Message]:
2775
- prepared = _prepare_model_payload(text)
2776
- try:
2777
- sent = await message.answer(
2778
- prepared,
2815
+ prepared, fallback_payload = _prepare_model_payload_variants(text)
2816
+ sent_message: Optional[Message] = None
2817
+
2818
+ async def _send(payload: str) -> None:
2819
+ nonlocal sent_message
2820
+ sent_message = await message.answer(
2821
+ payload,
2779
2822
  parse_mode=_parse_mode_value(),
2780
2823
  reply_markup=reply_markup,
2781
2824
  )
2825
+
2826
+ async def _send_raw(payload: str) -> None:
2827
+ nonlocal sent_message
2828
+ sent_message = await message.answer(
2829
+ payload,
2830
+ parse_mode=None,
2831
+ reply_markup=reply_markup,
2832
+ )
2833
+
2834
+ try:
2835
+ await _send_with_markdown_guard(
2836
+ prepared,
2837
+ _send,
2838
+ raw_sender=_send_raw,
2839
+ fallback_payload=fallback_payload,
2840
+ )
2782
2841
  except TelegramBadRequest as exc:
2783
2842
  worker_log.warning(
2784
2843
  "发送消息失败:%s",
@@ -2786,7 +2845,7 @@ async def _answer_with_markdown(
2786
2845
  extra={"chat": getattr(message.chat, "id", None)},
2787
2846
  )
2788
2847
  return None
2789
- return sent
2848
+ return sent_message
2790
2849
 
2791
2850
 
2792
2851
  async def _edit_message_with_markdown(
@@ -2795,11 +2854,27 @@ async def _edit_message_with_markdown(
2795
2854
  *,
2796
2855
  reply_markup: InlineKeyboardMarkup | None = None,
2797
2856
  ) -> None:
2798
- prepared = _prepare_model_payload(text)
2799
- await callback.message.edit_text(
2857
+ prepared, fallback_payload = _prepare_model_payload_variants(text)
2858
+
2859
+ async def _send(payload: str) -> None:
2860
+ await callback.message.edit_text(
2861
+ payload,
2862
+ parse_mode=_parse_mode_value(),
2863
+ reply_markup=reply_markup,
2864
+ )
2865
+
2866
+ async def _send_raw(payload: str) -> None:
2867
+ await callback.message.edit_text(
2868
+ payload,
2869
+ parse_mode=None,
2870
+ reply_markup=reply_markup,
2871
+ )
2872
+
2873
+ await _send_with_markdown_guard(
2800
2874
  prepared,
2801
- parse_mode=_parse_mode_value(),
2802
- reply_markup=reply_markup,
2875
+ _send,
2876
+ raw_sender=_send_raw,
2877
+ fallback_payload=fallback_payload,
2803
2878
  )
2804
2879
 
2805
2880
 
@@ -2811,13 +2886,29 @@ async def _try_edit_message(
2811
2886
  ) -> bool:
2812
2887
  if message is None:
2813
2888
  return False
2814
- prepared = _prepare_model_payload(text)
2815
- try:
2889
+ prepared, fallback_payload = _prepare_model_payload_variants(text)
2890
+
2891
+ async def _send(payload: str) -> None:
2816
2892
  await message.edit_text(
2817
- prepared,
2893
+ payload,
2818
2894
  parse_mode=_parse_mode_value(),
2819
2895
  reply_markup=reply_markup,
2820
2896
  )
2897
+
2898
+ async def _send_raw(payload: str) -> None:
2899
+ await message.edit_text(
2900
+ payload,
2901
+ parse_mode=None,
2902
+ reply_markup=reply_markup,
2903
+ )
2904
+
2905
+ try:
2906
+ await _send_with_markdown_guard(
2907
+ prepared,
2908
+ _send,
2909
+ raw_sender=_send_raw,
2910
+ fallback_payload=fallback_payload,
2911
+ )
2821
2912
  return True
2822
2913
  except TelegramBadRequest as exc:
2823
2914
  worker_log.info(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibego
3
- Version: 0.2.36
3
+ Version: 0.2.38
4
4
  Summary: vibego CLI:用于初始化与管理 Telegram Master Bot 的工具
5
5
  Author: Hypha
6
6
  License-Expression: LicenseRef-Proprietary
@@ -1,4 +1,4 @@
1
- bot.py,sha256=jVPxYu3rUCFmypgJzgc8iy97zOXidhvCnlZNwFtkxv4,270454
1
+ bot.py,sha256=YDLAFxvh0YfCDScoADirJlzlGlc_-8BdnOIzLNVPrRc,273403
2
2
  logging_setup.py,sha256=gvxHi8mUwK3IhXJrsGNTDo-DR6ngkyav1X-tvlBF_IE,4613
3
3
  master.py,sha256=ZW4A3Gh0MUKFnfZX-VJ7OCNnBzlEcOWkPKYH92OfyKA,112967
4
4
  project_repository.py,sha256=UcthtSGOJK0cTE5bQCneo3xkomRG-kyc1N1QVqxeHIs,17577
@@ -427,14 +427,14 @@ tasks/fsm.py,sha256=rKXXLEieQQU4r2z_CZUvn1_70FXiZXBBugF40gpe_tQ,1476
427
427
  tasks/models.py,sha256=N_qqRBo9xMSV0vbn4k6bLBXT8C_dp_oTFUxvdx16ZQM,2459
428
428
  tasks/service.py,sha256=w_S_aWiVqRXzXEpimLDsuCCCX2lB5uDkff9aKThBw9c,41916
429
429
  telegram_markdown/__init__.py,sha256=bG3H9fWn5GfTqC6xvd49xbVdYWfSFeaX2nefweOYcWY,9757
430
- vibego_cli/__init__.py,sha256=p-CPmV5XSaL8LOoFcrAi-ds8pvLeygAon4JKakgK7MY,311
430
+ vibego_cli/__init__.py,sha256=TIfBvbASwv0PjEHa0uOiVJkU2YO8pvPm9O9aRMy5kDE,311
431
431
  vibego_cli/__main__.py,sha256=qqTrYmRRLe4361fMzbI3-CqpZ7AhTofIHmfp4ykrrBY,158
432
432
  vibego_cli/config.py,sha256=VxkPJMq01tA3h3cOkH-z_tiP7pMgfSGGicRvUnCWkhI,3054
433
433
  vibego_cli/deps.py,sha256=1nRXI7Dd-S1hYE8DligzK5fIluQWETRUj4_OKL0DikQ,1419
434
434
  vibego_cli/main.py,sha256=X__NXwZnIDIFbdKSTbNyZgZHKcPlN0DQz9sqTI1aQ9E,12158
435
435
  vibego_cli/data/worker_requirements.txt,sha256=QSt30DSSSHtfucTFPpc7twk9kLS5rVLNTcvDiagxrZg,62
436
- vibego-0.2.36.dist-info/METADATA,sha256=MP9mOr2c7s7mckhdVFBeVeHx0MQH0VKuZqRPSFUoshE,10519
437
- vibego-0.2.36.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
438
- vibego-0.2.36.dist-info/entry_points.txt,sha256=Lsy_zm-dlyxt8-9DL9blBReIwU2k22c8-kifr46ND1M,48
439
- vibego-0.2.36.dist-info/top_level.txt,sha256=rWDj9KERtbJL6Lar9Xa0O6dthaFSY_jc1WNpQgUrXCM,87
440
- vibego-0.2.36.dist-info/RECORD,,
436
+ vibego-0.2.38.dist-info/METADATA,sha256=IPvXXUHPNJdwkvrsJi4Tuau4VmgFCxMWShPYspWpWVE,10519
437
+ vibego-0.2.38.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
438
+ vibego-0.2.38.dist-info/entry_points.txt,sha256=Lsy_zm-dlyxt8-9DL9blBReIwU2k22c8-kifr46ND1M,48
439
+ vibego-0.2.38.dist-info/top_level.txt,sha256=rWDj9KERtbJL6Lar9Xa0O6dthaFSY_jc1WNpQgUrXCM,87
440
+ vibego-0.2.38.dist-info/RECORD,,
vibego_cli/__init__.py CHANGED
@@ -7,6 +7,6 @@ from __future__ import annotations
7
7
 
8
8
  __all__ = ["main", "__version__"]
9
9
 
10
- __version__ = "0.2.36"
10
+ __version__ = "0.2.38"
11
11
 
12
12
  from .main import main # noqa: E402