cwadayi commited on
Commit
89c2715
·
verified ·
1 Parent(s): 79f2ada

Update command_handler.py

Browse files
Files changed (1) hide show
  1. command_handler.py +52 -33
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, fetch_local_earthquakes, fetch_latest_significant_earthquake
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
@@ -12,20 +12,19 @@ from config import CURRENT_YEAR, HF_SPACE_URL
12
  def get_help_message() -> TextMessage:
13
  """回傳包含所有可用指令的說明訊息。"""
14
  text = (
15
- "📖 指令列表\n\n"
16
  "【地震資訊】\n"
17
- "• /latest - 查詢最新一筆顯著地震(含圖)\n"
18
- "• /global - 查詢全球近24小時顯著地震\n"
19
- "• /taiwan - 顯示今年台灣顯著地震列表\n"
20
- "• /map - 取得台灣顯著地震地圖連結\n"
21
- "• /alert - 獲取 CWA 最新地震預警\n"
22
- "• /significant - CWA 最新顯著有感地震\n"
23
- "• /local <縣市> - 小區域地震 (可選填縣市)\n\n"
24
  "【AI 與工具】\n"
25
- "• /ai <問題> - 與 AI 助理對話\n\n"
26
  "【基本指令】\n"
27
- "• /info - 關於此機器人\n"
28
- "• /help - 顯示此說明"
29
  )
30
  return TextMessage(text=text)
31
 
@@ -34,7 +33,7 @@ def get_info_message() -> TextMessage:
34
  text = (
35
  "🤖 關於我\n\n"
36
  "我是一個多功能助理機器人,提供地震查詢與 AI 對話功能。\n\n"
37
- "• 版本: 2.5\n"
38
  "• 資料來源: CWA, USGS, Hugging Face\n"
39
  "• 開發者: dayichen"
40
  )
@@ -109,25 +108,46 @@ def process_message(user_message_raw: str, request_base_url: str) -> list:
109
  """處理使用者的文字訊息並回傳一個包含回覆訊息的列表。"""
110
  user_message = (user_message_raw or "").strip()
111
 
112
- # 將舊指令對應到新指令,提供向下相容
113
- if user_message.lower() in ["地震", "quake"]:
114
- user_message = "/global"
115
- elif user_message.lower() in ["台灣地震", "臺灣地震"]:
116
- user_message = "/taiwan"
117
- elif user_message.lower() in ["台灣地震畫圖", "臺灣地震畫圖"]:
118
- user_message = "/map"
119
- elif user_message.lower() == "地震預警":
120
- user_message = "/alert"
 
 
121
 
122
- if user_message.startswith('/'):
 
 
 
 
 
 
 
 
 
 
 
 
123
  parts = user_message.split(' ', 1)
124
  command = parts[0].lower()
125
  arg = parts[1] if len(parts) > 1 else ""
 
 
 
 
 
 
 
126
 
127
- if command == '/help':
128
- return [get_help_message()]
129
- elif command == '/info':
130
- return [get_info_message()]
131
  elif command == '/latest':
132
  return get_latest_earthquake_reply()
133
  elif command == '/global':
@@ -140,12 +160,11 @@ def process_message(user_message_raw: str, request_base_url: str) -> list:
140
  return [TextMessage(text=fetch_cwa_alarm_list(limit=5))]
141
  elif command == '/significant':
142
  return [TextMessage(text=fetch_significant_earthquakes(limit=5))]
143
- elif command == '/local':
144
- return [TextMessage(text=fetch_local_earthquakes(area_name=arg))]
145
  elif command == '/ai':
146
- if not arg:
147
- return [TextMessage(text="請輸入問題,例如:/ai 台灣最高的山是哪座?")]
148
- return [TextMessage(text=generate_ai_text(arg))]
 
149
 
150
- # 若非指令,則預設交給 AI 處理 (作為備援)
151
  return [TextMessage(text=generate_ai_text(user_message))]
 
3
  from linebot.v3.messaging import TextMessage, ImageMessage
4
 
5
  # 匯入服務函式
6
+ from cwa_service import fetch_cwa_alarm_list, fetch_significant_earthquakes, fetch_latest_significant_earthquake
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
 
12
  def get_help_message() -> TextMessage:
13
  """回傳包含所有可用指令的說明訊息。"""
14
  text = (
15
+ "📖 指令列表 (輸入 #數字 即可)\n\n"
16
  "【地震資訊】\n"
17
+ "• #1 - 最新顯著地震 (含圖)\n"
18
+ "• #2 - 全球近24小時顯著地震\n"
19
+ "• #3 - 今年台灣顯著地震列表\n"
20
+ "• #4 - 台灣顯著地震地圖連結\n"
21
+ "• #5 - CWA 最新地震預警\n"
22
+ "• #6 - CWA 最新顯著有感地震\n\n"
 
23
  "【AI 與工具】\n"
24
+ "• #7 <問題> - 與 AI 助理對話\n\n"
25
  "【基本指令】\n"
26
+ "• #8 - 關於此機器人\n"
27
+ "• #9 - 顯示此說明"
28
  )
29
  return TextMessage(text=text)
30
 
 
33
  text = (
34
  "🤖 關於我\n\n"
35
  "我是一個多功能助理機器人,提供地震查詢與 AI 對話功能。\n\n"
36
+ "• 版本: 3.0\n"
37
  "• 資料來源: CWA, USGS, Hugging Face\n"
38
  "• 開發者: dayichen"
39
  )
 
108
  """處理使用者的文字訊息並回傳一個包含回覆訊息的列表。"""
109
  user_message = (user_message_raw or "").strip()
110
 
111
+ # --- 指令對應 ---
112
+ cmd_map = {
113
+ '#1': '/latest', '#2': '/global', '#3': '/taiwan',
114
+ '#4': '/map', '#5': '/alert', '#6': '/significant',
115
+ '#7': '/ai', '#8': '/info', '#9': '/help',
116
+ '地震': '/global', 'quake': '/global',
117
+ '台灣地震': '/taiwan', '臺灣地震': '/taiwan',
118
+ '台灣地震畫圖': '/map', '臺灣地震畫圖': '/map',
119
+ '地震預警': '/alert',
120
+ '/help': '/help'
121
+ }
122
 
123
+ command = ""
124
+ arg = ""
125
+
126
+ # 檢查是否為數字指令 (e.g., #7 你好)
127
+ if user_message.startswith('#') and len(user_message) > 1:
128
+ parts = user_message.split(' ', 1)
129
+ key = parts[0]
130
+ if key in cmd_map:
131
+ command = cmd_map[key]
132
+ arg = parts[1] if len(parts) > 1 else ""
133
+
134
+ # 檢查是否為斜線指令 (e.g., /ai 你好)
135
+ elif user_message.startswith('/'):
136
  parts = user_message.split(' ', 1)
137
  command = parts[0].lower()
138
  arg = parts[1] if len(parts) > 1 else ""
139
+
140
+ # 檢查是否為中文關鍵字指令
141
+ else:
142
+ for key, value in cmd_map.items():
143
+ if user_message.lower() == key:
144
+ command = value
145
+ break
146
 
147
+ # --- 指令處理 ---
148
+ if command:
149
+ if command == '/help' or command == '/info':
150
+ return [get_info_message()] if command == '/info' else [get_help_message()]
151
  elif command == '/latest':
152
  return get_latest_earthquake_reply()
153
  elif command == '/global':
 
160
  return [TextMessage(text=fetch_cwa_alarm_list(limit=5))]
161
  elif command == '/significant':
162
  return [TextMessage(text=fetch_significant_earthquakes(limit=5))]
 
 
163
  elif command == '/ai':
164
+ prompt = arg or user_message[2:].lstrip() # 處理 '#7 ...' 和 '/ai ...'
165
+ if not prompt:
166
+ return [TextMessage(text="請輸入問題,例如:#7 台灣最高的山是哪座?")]
167
+ return [TextMessage(text=generate_ai_text(prompt))]
168
 
169
+ # 若非任何指令,則預設交給 AI 處理 (作為備援)
170
  return [TextMessage(text=generate_ai_text(user_message))]