PttChrome
PttChrome copied to clipboard
熱訊(水球)的偵測有時會失敗
問題描述
有時使用者送來熱訊時,並不會被正確偵測爲熱訊訊息,造成 PttChrome 不送出通知。
相關 issues:#77 & #78
細節描述
見 parseWaterball()
的正規表示式:
https://github.com/robertabcd/PttChrome/blob/88e3562e6536cc0a91dbbb9f65e59036e4b73b79/src/js/string_util.js#L154-L160
/\x1b\[1;33;46m\u2605(\w+)\x1b\[0;1;37;45m (.+) \x1b\[m\x1b\[K/g
這是在清除畫面底部後,某個使用者第一次送過來的熱訊的正規表示式。
/\x1b\[24;\d{2}H\x1b\[1;37;45m([^\x1b]+)(?:\x1b\[24;18H)?\x1b\[m/g
這是未清除畫面底部時,同一個使用者連續送過來的熱訊的正規表示式。
注意使用者代號被跳過。這是由於 pfterm 對輸出畫面資料的最佳化。
其中 \x1b\[24;\d{2}H
所匹配的,是設定游標位置的控制碼(屬於「移位碼」):
-
24
是畫面底部的橫行的編號 (最上方的橫行的編號是 1)。- 但畫面高度可能超過 24 個橫行,造成匹配失敗。
-
\d{2}
是跳過了使用者代號後,熱訊內文的開頭所在的縱列的編號 (最左方的縱列的編號是 1)。- 但使用者代號可能很短,使熱訊內文開頭處所在的縱列編號 < 10,造成匹配失敗。
然而,由於 pfterm 的輸出最佳化,使用者端所接收到的熱訊訊息的格式,實際上不一定會符合以上任一狀況。 比如:如果有兩個代號前幾字相同的使用者送來熱訊,那麼輸出時就會從使用者代號不相同的部分開始輸出,這時就不會被以上兩個正規表示式匹配。
可能解法
將 App.prototype.onData()
內的判斷邏輯,改爲偵測可能是熱訊的資料。
而當偵測到有熱訊送來,則從畫面擷取眞正的熱訊訊息。