cwadayi commited on
Commit
d087979
·
verified ·
1 Parent(s): e9a6115

Update command_handler.py

Browse files
Files changed (1) hide show
  1. command_handler.py +10 -68
command_handler.py CHANGED
@@ -3,7 +3,7 @@ import pandas as pd
3
  from linebot.v3.messaging import TextMessage, ImageMessage
4
 
5
  # 匯入服務函式
6
- from cwa_service import fetch_cwa_alarm_list, fetch_significant_earthquakes
7
  from usgs_service import fetch_global_last24h_text, fetch_taiwan_df_this_year
8
  from plotting_service import create_and_save_map
9
  from ai_service import generate_ai_text
@@ -18,7 +18,8 @@ def get_help_message() -> TextMessage:
18
  "• /taiwan - 顯示今年台灣顯著地震列表\n"
19
  "• /map - 繪製台灣顯著地震地圖\n"
20
  "• /alert - 獲取 CWA 最新地震預警\n"
21
- "• /significant - CWA 最新顯著有感地震\n\n"
 
22
  "【AI 與工具】\n"
23
  "• /ai <問題> - 與 AI 助理對話\n\n"
24
  "【基本指令】\n"
@@ -27,67 +28,13 @@ def get_help_message() -> TextMessage:
27
  )
28
  return TextMessage(text=text)
29
 
30
- def get_info_message() -> TextMessage:
31
- """回傳機器人資訊。"""
32
- text = (
33
- "🤖 關於我\n\n"
34
- "我是一個多功能助理機器人,提供地震查詢與 AI 對話功能。\n\n"
35
- "• 版本: 2.2\n"
36
- "• 資料來源: CWA, USGS, Hugging Face\n"
37
- "• 開發者: dayichen"
38
- )
39
- return TextMessage(text=text)
40
-
41
- def get_taiwan_earthquake_list() -> TextMessage:
42
- """回傳近期的台灣地震文字列表。"""
43
- result = fetch_taiwan_df_this_year()
44
- if isinstance(result, pd.DataFrame):
45
- count = len(result)
46
- lines = [f"🇹🇼 今年 ({CURRENT_YEAR} 年) 台灣區域顯著地震 (M≥5.0),共 {count} 筆:", "-" * 20]
47
- for _, row in result.head(15).iterrows():
48
- t = row["time_utc"].strftime("%Y-%m-%d %H:%M")
49
- lines.append(
50
- f"震級: {row['magnitude']:.1f} | 日期時間: {t} (UTC)\n"
51
- f"地點: {row['place']}\n"
52
- f"報告連結: {row.get('url', '無')}"
53
- )
54
- if count > 15:
55
- lines.append(f"... (還有 {count - 15} 筆,請用 /map 查看全部)")
56
- reply_text = "\n\n".join(lines)
57
- else:
58
- reply_text = result
59
- return TextMessage(text=reply_text)
60
-
61
- def get_taiwan_earthquake_map(base_url: str) -> list:
62
- """[修改] 產生地震地圖,並回傳包含連結的文字訊息。"""
63
- result = fetch_taiwan_df_this_year()
64
- if isinstance(result, pd.DataFrame):
65
- filename = create_and_save_map(result)
66
- image_url = f"{(HF_SPACE_URL or base_url)}/static/{filename}"
67
-
68
- # 將回覆內容從圖片訊息改為包含連結的文字訊息
69
- reply_text = (
70
- "🗺️ 已為您繪製地震分佈圖。\n\n"
71
- "請點擊以下連結查看圖片:\n"
72
- f"{image_url}"
73
- )
74
- return [TextMessage(text=reply_text)]
75
- else:
76
- return [TextMessage(text=result)]
77
 
78
  def process_message(user_message_raw: str, request_base_url: str) -> list:
79
  """處理使用者的文字訊息並回傳一個包含回覆訊息的列表。"""
80
  user_message = (user_message_raw or "").strip()
81
 
82
- # 將舊指令對應到新指令,提供向下相容
83
- if user_message.lower() in ["地震", "quake"]:
84
- user_message = "/global"
85
- elif user_message.lower() in ["台灣地震", "臺灣地震"]:
86
- user_message = "/taiwan"
87
- elif user_message.lower() in ["台灣地震畫圖", "臺灣地震畫圖"]:
88
- user_message = "/map"
89
- elif user_message.lower() == "地震預警":
90
- user_message = "/alert"
91
 
92
  if user_message.startswith('/'):
93
  parts = user_message.split(' ', 1)
@@ -96,18 +43,13 @@ def process_message(user_message_raw: str, request_base_url: str) -> list:
96
 
97
  if command == '/help':
98
  return [get_help_message()]
99
- elif command == '/info':
100
- return [get_info_message()]
101
- elif command == '/global':
102
- return [TextMessage(text=fetch_global_last24h_text())]
103
- elif command == '/taiwan':
104
- return [get_taiwan_earthquake_list()]
105
- elif command == '/map':
106
- return get_taiwan_earthquake_map(request_base_url)
107
- elif command == '/alert':
108
- return [TextMessage(text=fetch_cwa_alarm_list(limit=5))]
109
  elif command == '/significant':
110
  return [TextMessage(text=fetch_significant_earthquakes(limit=5))]
 
 
 
 
111
  elif command == '/ai':
112
  if not arg:
113
  return [TextMessage(text="請輸入問題,例如:/ai 台灣最高的山是哪座?")]
 
3
  from linebot.v3.messaging import TextMessage, ImageMessage
4
 
5
  # 匯入服務函式
6
+ from cwa_service import fetch_cwa_alarm_list, fetch_significant_earthquakes, fetch_local_earthquakes # [新增]
7
  from usgs_service import fetch_global_last24h_text, fetch_taiwan_df_this_year
8
  from plotting_service import create_and_save_map
9
  from ai_service import generate_ai_text
 
18
  "• /taiwan - 顯示今年台灣顯著地震列表\n"
19
  "• /map - 繪製台灣顯著地震地圖\n"
20
  "• /alert - 獲取 CWA 最新地震預警\n"
21
+ "• /significant - CWA 最新顯著有感地震\n"
22
+ "• /local <縣市> - 指定縣市的小區域地震\n\n" # [新增]
23
  "【AI 與工具】\n"
24
  "• /ai <問題> - 與 AI 助理對話\n\n"
25
  "【基本指令】\n"
 
28
  )
29
  return TextMessage(text=text)
30
 
31
+ # ... (get_info_message 和其他 get_ 函式不變) ...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
  def process_message(user_message_raw: str, request_base_url: str) -> list:
34
  """處理使用者的文字訊息並回傳一個包含回覆訊息的列表。"""
35
  user_message = (user_message_raw or "").strip()
36
 
37
+ # ... (舊指令相容性轉換不變) ...
 
 
 
 
 
 
 
 
38
 
39
  if user_message.startswith('/'):
40
  parts = user_message.split(' ', 1)
 
43
 
44
  if command == '/help':
45
  return [get_help_message()]
46
+ # ... (其他 command 判斷不變) ...
 
 
 
 
 
 
 
 
 
47
  elif command == '/significant':
48
  return [TextMessage(text=fetch_significant_earthquakes(limit=5))]
49
+ elif command == '/local': # [新增]
50
+ if not arg:
51
+ return [TextMessage(text="請輸入縣市名稱,例如:/local 新北市")]
52
+ return [TextMessage(text=fetch_local_earthquakes(area_name=arg))]
53
  elif command == '/ai':
54
  if not arg:
55
  return [TextMessage(text="請輸入問題,例如:/ai 台灣最高的山是哪座?")]