PttChrome icon indicating copy to clipboard operation
PttChrome copied to clipboard

熱訊(水球)的偵測有時會失敗

Open IepIweidieng opened this issue 3 years ago • 0 comments

問題描述

有時使用者送來熱訊時,並不會被正確偵測爲熱訊訊息,造成 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() 內的判斷邏輯,改爲偵測可能是熱訊的資料。 而當偵測到有熱訊送來,則從畫面擷取眞正的熱訊訊息。

IepIweidieng avatar Dec 16 '21 14:12 IepIweidieng