Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
IepIweidieng opened this issue Dec 16, 2021 · 0 comments
Open

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

IepIweidieng opened this issue Dec 16, 2021 · 0 comments

Comments

@IepIweidieng
Copy link
Contributor

IepIweidieng commented Dec 16, 2021

問題描述

有時使用者送來熱訊時,並不會被正確偵測爲熱訊訊息,造成 PttChrome 不送出通知。

相關 issues:#77 & #78

細節描述

parseWaterball() 的正規表示式:

export function parseWaterball(str) {
var regex = new RegExp(/\x1b\[1;33;46m\u2605(\w+)\x1b\[0;1;37;45m (.+) \x1b\[m\x1b\[K/g);
var result = regex.exec(str);
if (result && result.length == 3) {
return { userId: result[1], message: result[2] };
} else {
regex = new RegExp(/\x1b\[24;\d{2}H\x1b\[1;37;45m([^\x1b]+)(?:\x1b\[24;18H)?\x1b\[m/g);

/\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 IepIweidieng changed the title 熱訊`(水球) 熱訊(水球)的正規表示式不總是匹配成功 Dec 16, 2021
@IepIweidieng IepIweidieng changed the title 熱訊(水球)的正規表示式不總是匹配成功 熱訊(水球)的偵測有時會失敗 Dec 16, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant