開發者文件¶
專案架構¶
PTT backend: 負責處理與批踢踢伺服器的通訊,包括登入、獲取文章列表、發送文章等操作。
MQ server: 提供消息佇列服務,用於元件之間的非同步通訊,實現解耦和增加系統的彈性。
System tray: 顯示系統列圖示,提供用戶快速使用系統功能的表單。
Chat window: 用戶之間的即時聊天界面。
Login window: 用於用戶登入批踢踢帳號的界面。
專案架構¶
未來專案架構¶
Message queue¶
採用 Message queue 架構是為了實現元件之間的非同步通訊並帶來以下優勢:
技術堆疊靈活:不同元件之間可以自由採用不同的技術堆疊,如程式語言、框架等。
方便替換:同一個功能的元件,可以由不同開發者各自開發,當目前採用的開發者無法持續開發時,可由熟悉不同技術的開發者開發功能相同的元件。
Message queue structure¶
Channels¶
Channels¶
發送訊息¶
{
"channel": "the channel you want to send",
"message": "{ ... Your msg here ... "reply_channel": "the channel you can receive"}"
}
請注意,message 中的 json 訊息有被打包成字串的形式。
接著就是發送訊息。
response = requests.post("http://127.0.0.1:16180//push/", json=msg)
接收訊息¶
params = {
"channel": "the channel you want to receive"
}
while True:
response = requests.get(
"http://127.0.0.1:16180/pull/",
json=params,
timeout=5 + 1)
實際用來接收訊息的程式碼你可以在 receive_message_forever 找到。
那實際收到的訊息都會是以矩陣的形式並按照時間排序。
程式碼流程¶
登入¶
這裡將描述登入溝通的過程。
使用者在 Login Window 輸入批踢踢帳號和密碼後,Login Window 將透過 Message queue server 發送登入訊息給 PTT backend,請求執行登入操作。
{
"channel": "to_backend",
"message": "{\"category\": \"login\", \"username\": \"PTT ID\", \"password\": \"PTT PW\", \"reply_channel\": \"to_ui\"}"
}
PTT backend 收到登入訊息後,執行登入操作並將結果發送回 UI 元件,報告登入成功或失敗。
以剛剛 PTT backend 收到的訊息為例,取得的登入訊息,應該會長這樣。
{
"messages": [
{"category": "login", "username": "PTT ID", "password": "PTT PW", "reply_channel": "to_ui"}
]
}
執行登入之後,PTT backend 理當會回覆兩種訊息,登入成功與登入失敗。
以下是登入成功的範例訊息。
{
"messages": [
{"category": "status", "action": "login", "state": "SUCCESS", "message": "login success", "reply_channel": "to_backend"}
]
}
以下是登入失敗的範例訊息。
{
"messages": [
{"category": "status", "action": "login", "state": "FAILURE", "message": "wrong id or password", "reply_channel": "to_backend"}
]
}
至此,整個登入流程就算完成了。
登出¶
如果成功登入了,那麼登出的流程就會是這樣。
使用者在點選登出後,UI 發送登出訊息給 PTT backend,請求執行登出操作。
{
"channel": "to_backend",
"message": "{\"category\": \"logout\", \"reply_channel\": \"to_ui\"}"
}