From 3143463edc6fe4afd113718e735a88e150457da8 Mon Sep 17 00:00:00 2001 From: echo Date: Sun, 13 Jul 2025 16:28:16 +0800 Subject: [PATCH 1/3] update api version and remove full space --- .../tests/__snapshots__/test_toilet.ambr | 2 +- api/commands/toilet.py | 3 + api/index.py | 2 +- api/line_handler.py | 109 +++++++++++------- 4 files changed, 75 insertions(+), 41 deletions(-) diff --git a/api/commands/tests/__snapshots__/test_toilet.ambr b/api/commands/tests/__snapshots__/test_toilet.ambr index ab79d10..1d8e789 100644 --- a/api/commands/tests/__snapshots__/test_toilet.ambr +++ b/api/commands/tests/__snapshots__/test_toilet.ambr @@ -3,7 +3,7 @@ tuple( 0.29190466703318296, dict({ - 'address': '新竹市東\u3000區關東里光復路一段268巷41弄', + 'address': '新竹市東區關東里光復路一段268巷41弄', 'administration': '新竹市公園及觀光區設施維護管理中心', 'city': '1001801', 'country': '10018', diff --git a/api/commands/toilet.py b/api/commands/toilet.py index cab634a..55801b4 100644 --- a/api/commands/toilet.py +++ b/api/commands/toilet.py @@ -59,6 +59,9 @@ def read_toilet_data() -> list[dict]: rows = csv.DictReader(filep) for row in rows: + # remove \u3000 space + for key in row: + row[key]=row[key].replace("\u3000","") toilet_data.append(row) return toilet_data diff --git a/api/index.py b/api/index.py index 8139409..d4d46c7 100644 --- a/api/index.py +++ b/api/index.py @@ -1,5 +1,5 @@ from fastapi import FastAPI, HTTPException, Request -from linebot.exceptions import InvalidSignatureError +from linebot.v3.exceptions import InvalidSignatureError from api.line_handler import line_handler diff --git a/api/line_handler.py b/api/line_handler.py index 65a1df3..f5ba4b8 100644 --- a/api/line_handler.py +++ b/api/line_handler.py @@ -1,12 +1,19 @@ import re -from linebot import LineBotApi, WebhookHandler -from linebot.models import ( - FlexSendMessage, - LocationMessage, - MessageEvent, +from linebot.v3 import WebhookHandler +from linebot.v3.messaging import ( + ApiClient, + Configuration, + FlexContainer, + FlexMessage, + MessagingApi, + ReplyMessageRequest, TextMessage, - TextSendMessage, +) +from linebot.v3.webhooks import ( + LocationMessageContent, + MessageEvent, + TextMessageContent, ) from api.commands import ( @@ -22,8 +29,8 @@ LINE_CHANNEL_SECRET, ) -line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN) -line_handler = WebhookHandler(LINE_CHANNEL_SECRET) +configuration = Configuration(access_token=LINE_CHANNEL_ACCESS_TOKEN) +line_handler = WebhookHandler(channel_secret=LINE_CHANNEL_SECRET) def handle_message(message: str) -> str: @@ -49,63 +56,87 @@ def handle_message(message: str) -> str: return print_usage() -@line_handler.add(MessageEvent, message=TextMessage) +@line_handler.add(MessageEvent, message=TextMessageContent) def handling_text_message(event: MessageEvent): - replyToken = event.reply_token - if event.message: - message: str = event.message.text - if message.startswith("@LineGPT"): - result = handle_message(message=message) - if result: - echoMessages = TextSendMessage(text=result) - line_bot_api.reply_message( - reply_token=replyToken, messages=echoMessages + if not event.message: + return + + message: str = event.message.text + if not message.startswith("@LineGPT"): + return + + result = handle_message(message=message) + if result: + with ApiClient(configuration) as api_client: + line_bot_api = MessagingApi(api_client) + line_bot_api.reply_message_with_http_info( + ReplyMessageRequest( + reply_token=event.reply_token, + messages=[TextMessage(text=result)], ) + ) -@line_handler.add(MessageEvent, message=LocationMessage) +@line_handler.add(MessageEvent, message=LocationMessageContent) def handling_location_message(event: MessageEvent): replyToken = event.reply_token - location_message: LocationMessage = event.message + location_message: LocationMessageContent = event.message if event.message: + messages = [] if ( toilet.GOOGLE_MAP_SESSION.is_expired() is False and eat.GOOGLE_MAP_SESSION.is_expired() is False ): - echoMessages = TextSendMessage( - text="The sessions of both eat and toilet are existing. Please stop one of them." - ) - line_bot_api.reply_message( - reply_token=replyToken, messages=echoMessages - ) + messages = [ + TextMessage( + text="The sessions of both eat and toilet are existing. " + "Please stop one of them." + ) + ] if ( toilet.GOOGLE_MAP_SESSION.is_expired() is True and eat.GOOGLE_MAP_SESSION.is_expired() is True ): - echoMessages = TextSendMessage( - text="No session is running. Please type '@LineGPT eat start' or '@LineGPT toilet start' to start a location Session." - ) - line_bot_api.reply_message( - reply_token=replyToken, messages=echoMessages - ) + messages = [ + TextMessage( + text="No session is running. " + "Please type '@LineGPT eat start' or '@LineGPT toilet start' to start a location Session." + ) + ] if eat.GOOGLE_MAP_SESSION.is_expired() is False: result = eat.what_to_eat( latitude=location_message.latitude, longitude=location_message.longitude, ) - flex_message = FlexSendMessage("restaurant cards", result) - line_bot_api.reply_message( - reply_token=replyToken, messages=flex_message - ) + messages = [ + FlexMessage( + altText="restaurant cards", + contents=FlexContainer.from_dict(result), + ) + ] if toilet.GOOGLE_MAP_SESSION.is_expired() is False: result = toilet.where_to_pee( latitude=location_message.latitude, longitude=location_message.longitude, ) - flex_message = FlexSendMessage("toilet cards", result) - line_bot_api.reply_message( - reply_token=replyToken, messages=flex_message + messages = [ + FlexMessage( + altText="toilet cards", + contents=FlexContainer.from_dict(result), + ) + ] + + else: + # This should not happed + messages = [TextMessage(text="Unexpected error.")] + + with ApiClient(configuration) as api_client: + line_bot_api = MessagingApi(api_client) + line_bot_api.reply_message_with_http_info( + ReplyMessageRequest( + reply_token=event.reply_token, messages=messages + ) ) From 26a3fd822838501b785a2cbfdc304758810bdee6 Mon Sep 17 00:00:00 2001 From: echo Date: Sun, 13 Jul 2025 16:31:22 +0800 Subject: [PATCH 2/3] upgrade linter --- .github/workflows/linter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index a8729f4..ed7011f 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -9,7 +9,7 @@ jobs: ref: ${{ github.event.pull_request.head.ref }} - uses: actions/setup-python@v1 with: - python-version: "3.9" + python-version: "3.12" - name: Install Dependencies run: | python -m pip install isort black autoflake From 021325b818f4634abcf35137da6c254f38e550ff Mon Sep 17 00:00:00 2001 From: echo Date: Sun, 13 Jul 2025 08:31:48 +0000 Subject: [PATCH 3/3] Commit changes from formatter --- api/commands/toilet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/commands/toilet.py b/api/commands/toilet.py index 55801b4..471ac03 100644 --- a/api/commands/toilet.py +++ b/api/commands/toilet.py @@ -61,7 +61,7 @@ def read_toilet_data() -> list[dict]: for row in rows: # remove \u3000 space for key in row: - row[key]=row[key].replace("\u3000","") + row[key] = row[key].replace("\u3000", "") toilet_data.append(row) return toilet_data