UNPKG

ptt-client

Version:

A Node client for fetching data from ptt.cc.

1,437 lines (1,176 loc) 45.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper")); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _eventemitter = _interopRequireDefault(require("eventemitter3")); var _sleepPromise = _interopRequireDefault(require("sleep-promise")); var _terminal = _interopRequireDefault(require("terminal.js")); var _socket = _interopRequireDefault(require("../../socket")); var _utils = require("../../utils"); var _char = require("../../utils/char"); var _config = _interopRequireDefault(require("./config")); var _model = require("./model"); function _wrapRegExp(re, groups) { _wrapRegExp = function _wrapRegExp(re, groups) { return new BabelRegExp(re, groups); }; var _RegExp = (0, _wrapNativeSuper2["default"])(RegExp); var _super = RegExp.prototype; var _groups = new WeakMap(); function BabelRegExp(re, groups) { var _this = _RegExp.call(this, re); _groups.set(_this, groups); return _this; } (0, _inherits2["default"])(BabelRegExp, _RegExp); BabelRegExp.prototype.exec = function (str) { var result = _super.exec.call(this, str); if (result) result.groups = buildGroups(result, this); return result; }; BabelRegExp.prototype[Symbol.replace] = function (str, substitution) { if (typeof substitution === "string") { var groups = _groups.get(this); return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) { return "$" + groups[name]; })); } else if (typeof substitution === "function") { var _this = this; return _super[Symbol.replace].call(this, str, function () { var args = []; args.push.apply(args, arguments); if ((0, _typeof2["default"])(args[args.length - 1]) !== "object") { args.push(buildGroups(args, _this)); } return substitution.apply(this, args); }); } else { return _super[Symbol.replace].call(this, str, substitution); } }; function buildGroups(result, re) { var g = _groups.get(re); return Object.keys(g).reduce(function (groups, name) { groups[name] = result[g[name]]; return groups; }, Object.create(null)); } return _wrapRegExp.apply(this, arguments); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var Condition = /*#__PURE__*/ function () { function Condition(type, criteria) { (0, _classCallCheck2["default"])(this, Condition); (0, _defineProperty2["default"])(this, "typeWord", void 0); (0, _defineProperty2["default"])(this, "criteria", void 0); switch (type) { case 'push': this.typeWord = 'Z'; break; case 'author': this.typeWord = 'a'; break; case 'title': this.typeWord = '/'; break; default: throw new Error("Invalid condition: ".concat(type)); } this.criteria = criteria; } (0, _createClass2["default"])(Condition, [{ key: "toSearchString", value: function toSearchString() { return "".concat(this.typeWord).concat(this.criteria); } }]); return Condition; }(); var Bot = /*#__PURE__*/ function (_EventEmitter) { (0, _inherits2["default"])(Bot, _EventEmitter); function Bot(config) { var _this; (0, _classCallCheck2["default"])(this, Bot); _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(Bot).call(this)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "searchCondition", { conditions: null, init: function init() { this.conditions = []; }, add: function add(type, criteria) { this.conditions.push(new Condition(type, criteria)); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "config", void 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "term", void 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_state", void 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "currentCharset", void 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "socket", void 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "preventIdleHandler", void 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getLine", function (n) { return _this.term.state.getLine(n); }); _this.config = _objectSpread({}, _config["default"], {}, config); _this.init(); return _this; } (0, _createClass2["default"])(Bot, [{ key: "init", value: function () { var _init = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee() { var _this2 = this; var config, socket; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: config = this.config; this.term = new _terminal["default"](config.terminal); this._state = _objectSpread({}, Bot.initialState); this.term.state.setMode('stringWidth', 'dbcs'); this.currentCharset = 'big5'; _context.t0 = config.protocol.toLowerCase(); _context.next = _context.t0 === 'websocket' ? 8 : _context.t0 === 'ws' ? 8 : _context.t0 === 'wss' ? 8 : _context.t0 === 'telnet' ? 9 : _context.t0 === 'ssh' ? 9 : 9; break; case 8: return _context.abrupt("break", 11); case 9: throw new Error("Invalid protocol: ".concat(config.protocol)); case 11: socket = new _socket["default"](config); socket.connect(); Bot.forwardEvents.forEach(function (e) { socket.on(e, _this2.emit.bind(_this2, e)); }); socket.on('connect', function () { _this2._state.connect = true; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this2.emit.apply(_this2, ['connect'].concat(args)); _this2.emit('stateChange', _this2.state); }).on('disconnect', function (closeEvent) { _this2._state.connect = false; for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } _this2.emit.apply(_this2, ['disconnect', closeEvent].concat(args)); _this2.emit('stateChange', _this2.state); }).on('message', function (data) { if (_this2.currentCharset !== _this2.config.charset && !_this2.state.login && (0, _utils.decode)(data, 'utf8').includes('登入中,請稍候...')) { _this2.currentCharset = _this2.config.charset; } var msg = (0, _utils.decode)(data, _this2.currentCharset); _this2.term.write(msg); _this2.emit('redraw', _this2.term.toString()); }).on('error', function (err) {}); this.socket = socket; case 16: case "end": return _context.stop(); } } }, _callee, this); })); function init() { return _init.apply(this, arguments); } return init; }() }, { key: "getLines", value: function () { var _getLines = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee2() { var getLine, lines, sentPgDown, i, lastLine, _i, j; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: getLine = this.getLine; lines = []; lines.push(getLine(0).str); sentPgDown = false; case 4: if (!(!getLine(23).str.includes('100%') && !getLine(23).str.includes('此文章無內容'))) { _context2.next = 11; break; } for (i = 1; i < 23; i++) { lines.push(getLine(i).str); } _context2.next = 8; return this.send(_utils.keymap.PgDown); case 8: sentPgDown = true; _context2.next = 4; break; case 11: lastLine = lines[lines.length - 1]; _i = 0; case 13: if (!(_i < 23)) { _context2.next = 20; break; } if (!(getLine(_i).str === lastLine)) { _context2.next = 17; break; } for (j = _i + 1; j < 23; j++) { lines.push(getLine(j).str); } return _context2.abrupt("break", 20); case 17: _i++; _context2.next = 13; break; case 20: while (lines.length > 0 && lines[lines.length - 1] === '') { lines.pop(); } if (!sentPgDown) { _context2.next = 24; break; } _context2.next = 24; return this.send(_utils.keymap.Home); case 24: return _context2.abrupt("return", lines); case 25: case "end": return _context2.stop(); } } }, _callee2, this); })); function getLines() { return _getLines.apply(this, arguments); } return getLines; }() }, { key: "send", value: function send(msg) { var _this3 = this; if (this.config.preventIdleTimeout) { this.preventIdle(this.config.preventIdleTimeout); } return new Promise(function (resolve, reject) { var autoResolveHandler; var cb = function cb(message) { clearTimeout(autoResolveHandler); resolve(true); }; if (_this3.state.connect) { if (msg.length > 0) { _this3.socket.send((0, _utils.encode)(msg, _this3.currentCharset)); _this3.once('message', cb); autoResolveHandler = setTimeout(function () { _this3.removeListener('message', cb); resolve(false); }, _this3.config.timeout * 10); } else { console.warn("Sending message with 0-length"); resolve(true); } } else { reject(); } }); } }, { key: "preventIdle", value: function preventIdle(timeout) { var _this4 = this; clearTimeout(this.preventIdleHandler); if (this.state.login) { this.preventIdleHandler = setTimeout( /*#__PURE__*/ (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee3() { return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return _this4.send(_utils.keymap.CtrlU); case 2: _context3.next = 4; return _this4.send(_utils.keymap.ArrowLeft); case 4: case "end": return _context3.stop(); } } }, _callee3); })), timeout * 1000); } } }, { key: "login", value: function () { var _login = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee4(username, password) { var kick, ret, state, _args4 = arguments; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: kick = _args4.length > 2 && _args4[2] !== undefined ? _args4[2] : true; if (!this.state.login) { _context4.next = 3; break; } return _context4.abrupt("return"); case 3: username = username.replace(/,/g, ''); if (this.config.charset === 'utf8') { username += ','; } _context4.next = 7; return this.send("".concat(username).concat(_utils.keymap.Enter).concat(password).concat(_utils.keymap.Enter)); case 7: _context4.next = 9; return this.checkLogin(kick); case 9: _context4.t0 = ret = _context4.sent; if (!(_context4.t0 === null)) { _context4.next = 15; break; } _context4.next = 13; return (0, _sleepPromise["default"])(400); case 13: _context4.next = 7; break; case 15: if (ret) { state = this._state; state.login = true; state.position = { boardname: '' }; this.searchCondition.init(); this.emit('stateChange', this.state); } return _context4.abrupt("return", ret); case 17: case "end": return _context4.stop(); } } }, _callee4, this); })); function login(_x, _x2) { return _login.apply(this, arguments); } return login; }() }, { key: "logout", value: function () { var _logout = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee5() { return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: if (this.state.login) { _context5.next = 2; break; } return _context5.abrupt("return"); case 2: _context5.next = 4; return this.send("G".concat(_utils.keymap.Enter, "Y").concat(_utils.keymap.Enter)); case 4: this._state.login = false; this.emit('stateChange', this.state); this.send(_utils.keymap.Enter); return _context5.abrupt("return", true); case 8: case "end": return _context5.stop(); } } }, _callee5, this); })); function logout() { return _logout.apply(this, arguments); } return logout; }() }, { key: "checkLogin", value: function () { var _checkLogin = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee6(kick) { var getLine; return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: getLine = this.getLine; if (!getLine(21).str.includes('密碼不對或無此帳號')) { _context6.next = 6; break; } this.emit('login.failed'); return _context6.abrupt("return", false); case 6: if (!getLine(23).str.includes('請稍後再試')) { _context6.next = 11; break; } this.emit('login.failed'); return _context6.abrupt("return", false); case 11: if (!getLine(22).str.includes('您想刪除其他重複登入的連線嗎')) { _context6.next = 16; break; } _context6.next = 14; return this.send("".concat(_utils.keymap.Backspace).concat(kick ? 'y' : 'n').concat(_utils.keymap.Enter)); case 14: _context6.next = 43; break; case 16: if (!getLine(23).str.includes('請勿頻繁登入以免造成系統過度負荷')) { _context6.next = 21; break; } _context6.next = 19; return this.send("".concat(_utils.keymap.Enter)); case 19: _context6.next = 43; break; case 21: if (!getLine(23).str.includes('按任意鍵繼續')) { _context6.next = 26; break; } _context6.next = 24; return this.send("".concat(_utils.keymap.Enter)); case 24: _context6.next = 43; break; case 26: if (!getLine(23).str.includes('您要刪除以上錯誤嘗試的記錄嗎')) { _context6.next = 31; break; } _context6.next = 29; return this.send("".concat(_utils.keymap.Backspace, "y").concat(_utils.keymap.Enter)); case 29: _context6.next = 43; break; case 31: if (!(getLine(22).str + getLine(23).str).toLowerCase().includes('y/n')) { _context6.next = 36; break; } _context6.next = 34; return this.send("".concat(_utils.keymap.Backspace, "y").concat(_utils.keymap.Enter)); case 34: _context6.next = 43; break; case 36: if (!getLine(23).str.includes('我是')) { _context6.next = 41; break; } this.emit('login.success'); return _context6.abrupt("return", true); case 41: _context6.next = 43; return this.send("q"); case 43: return _context6.abrupt("return", null); case 44: case "end": return _context6.stop(); } } }, _callee6, this); })); function checkLogin(_x3) { return _checkLogin.apply(this, arguments); } return checkLogin; }() }, { key: "checkArticleWithHeader", value: function checkArticleWithHeader() { var authorArea = (0, _char.substrWidth)('dbcs', this.getLine(0).str, 0, 6).trim(); return authorArea === '作者'; } }, { key: "select", value: function select(model) { return model.select(this); } /** * @deprecated */ }, { key: "setSearchCondition", value: function setSearchCondition(type, criteria) { this.searchCondition.add(type, criteria); } /** * @deprecated */ }, { key: "resetSearchCondition", value: function resetSearchCondition() { this.searchCondition.init(); } /** * @deprecated */ }, { key: "isSearchConditionSet", value: function isSearchConditionSet() { return this.searchCondition.conditions.length !== 0; } /** * @deprecated */ }, { key: "getArticles", value: function () { var _getArticles = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee7(boardname) { var offset, searchString, getLine, articles, i, line, article, _i2, _i3, _args7 = arguments; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: offset = _args7.length > 1 && _args7[1] !== undefined ? _args7[1] : 0; _context7.next = 3; return this.enterBoard(boardname); case 3: if (!this.isSearchConditionSet()) { _context7.next = 7; break; } searchString = this.searchCondition.conditions.map(function (condition) { return condition.toSearchString(); }).join(_utils.keymap.Enter); _context7.next = 7; return this.send("".concat(searchString).concat(_utils.keymap.Enter)); case 7: if (!(offset > 0)) { _context7.next = 11; break; } offset = Math.max(offset - 9, 1); _context7.next = 11; return this.send("".concat(_utils.keymap.End).concat(_utils.keymap.End).concat(offset).concat(_utils.keymap.Enter)); case 11: getLine = this.getLine; articles = []; for (i = 3; i <= 22; i++) { line = getLine(i).str; article = _model.Article.fromLine(line); article.boardname = boardname; articles.push(article); } // fix id if (!(articles.length >= 2 && articles[0].id === 0)) { _context7.next = 23; break; } _i2 = 1; case 16: if (!(_i2 < articles.length)) { _context7.next = 23; break; } if (!(articles[_i2].id !== 0)) { _context7.next = 20; break; } articles[0].id = articles[_i2].id - _i2; return _context7.abrupt("break", 23); case 20: _i2++; _context7.next = 16; break; case 23: for (_i3 = 1; _i3 < articles.length; _i3++) { articles[_i3].id = articles[_i3 - 1].id + 1; } _context7.next = 26; return this.enterIndex(); case 26: return _context7.abrupt("return", articles.reverse()); case 27: case "end": return _context7.stop(); } } }, _callee7, this); })); function getArticles(_x4) { return _getArticles.apply(this, arguments); } return getArticles; }() /** * @deprecated */ }, { key: "getArticle", value: function () { var _getArticle = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee8(boardname, id) { var article, searchString, getLine, hasHeader, _args8 = arguments; return _regenerator["default"].wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: article = _args8.length > 2 && _args8[2] !== undefined ? _args8[2] : new _model.Article(); _context8.next = 3; return this.enterBoard(boardname); case 3: if (!this.isSearchConditionSet()) { _context8.next = 7; break; } searchString = this.searchCondition.conditions.map(function (condition) { return condition.toSearchString(); }).join(_utils.keymap.Enter); _context8.next = 7; return this.send("".concat(searchString).concat(_utils.keymap.Enter)); case 7: getLine = this.getLine; _context8.next = 10; return this.send("".concat(id).concat(_utils.keymap.Enter).concat(_utils.keymap.Enter)); case 10: hasHeader = this.checkArticleWithHeader(); article.id = id; article.boardname = boardname; if (hasHeader) { article.author = (0, _char.substrWidth)('dbcs', getLine(0).str, 7, 50).trim(); article.title = (0, _char.substrWidth)('dbcs', getLine(1).str, 7).trim(); article.timestamp = (0, _char.substrWidth)('dbcs', getLine(2).str, 7).trim(); } _context8.next = 16; return this.getLines(); case 16: article.lines = _context8.sent; _context8.next = 19; return this.enterIndex(); case 19: return _context8.abrupt("return", article); case 20: case "end": return _context8.stop(); } } }, _callee8, this); })); function getArticle(_x5, _x6) { return _getArticle.apply(this, arguments); } return getArticle; }() /** * @deprecated */ }, { key: "getFavorite", value: function () { var _getFavorite = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee9() { var offsets, getLine, favorites, stopLoop, i, line, favorite, _args9 = arguments; return _regenerator["default"].wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: offsets = _args9.length > 0 && _args9[0] !== undefined ? _args9[0] : []; if (typeof offsets === 'number') { offsets = [offsets]; } _context9.next = 4; return this.enterFavorite(offsets); case 4: getLine = this.getLine; favorites = []; case 6: if (!true) { _context9.next = 28; break; } stopLoop = false; i = 3; case 9: if (!(i < 23)) { _context9.next = 22; break; } line = getLine(i).str; if (!(line.trim() === '')) { _context9.next = 14; break; } stopLoop = true; return _context9.abrupt("break", 22); case 14: favorite = _model.Board.fromLine(line); if (!(favorite.id !== favorites.length + 1)) { _context9.next = 18; break; } stopLoop = true; return _context9.abrupt("break", 22); case 18: favorites.push(favorite); case 19: i++; _context9.next = 9; break; case 22: if (!stopLoop) { _context9.next = 24; break; } return _context9.abrupt("break", 28); case 24: _context9.next = 26; return this.send(_utils.keymap.PgDown); case 26: _context9.next = 6; break; case 28: _context9.next = 30; return this.enterIndex(); case 30: return _context9.abrupt("return", favorites); case 31: case "end": return _context9.stop(); } } }, _callee9, this); })); function getFavorite() { return _getFavorite.apply(this, arguments); } return getFavorite; }() }, { key: "getMails", value: function () { var _getMails = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee10() { var offset, getLine, mails, i, line, mail, _args10 = arguments; return _regenerator["default"].wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: offset = _args10.length > 0 && _args10[0] !== undefined ? _args10[0] : 0; _context10.next = 3; return this.enterMail(); case 3: if (!(offset > 0)) { _context10.next = 7; break; } offset = Math.max(offset - 9, 1); _context10.next = 7; return this.send("".concat(_utils.keymap.End).concat(_utils.keymap.End).concat(offset).concat(_utils.keymap.Enter)); case 7: getLine = this.getLine; mails = []; for (i = 3; i <= 22; i++) { line = getLine(i).str; mail = { sn: +(0, _char.substrWidth)('dbcs', line, 1, 5).trim(), date: (0, _char.substrWidth)('dbcs', line, 9, 5).trim(), author: (0, _char.substrWidth)('dbcs', line, 15, 12).trim(), status: (0, _char.substrWidth)('dbcs', line, 30, 2).trim(), title: (0, _char.substrWidth)('dbcs', line, 33).trim() }; mails.push(mail); } _context10.next = 12; return this.enterIndex(); case 12: return _context10.abrupt("return", mails.reverse()); case 13: case "end": return _context10.stop(); } } }, _callee10, this); })); function getMails() { return _getMails.apply(this, arguments); } return getMails; }() }, { key: "getMail", value: function () { var _getMail = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee11(sn) { var getLine, hasHeader, mail; return _regenerator["default"].wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: _context11.next = 2; return this.enterMail(); case 2: getLine = this.getLine; _context11.next = 5; return this.send("".concat(sn).concat(_utils.keymap.Enter).concat(_utils.keymap.Enter)); case 5: hasHeader = this.checkArticleWithHeader(); mail = { sn: sn, author: '', title: '', timestamp: '', lines: [] }; if (this.checkArticleWithHeader()) { mail.author = (0, _char.substrWidth)('dbcs', getLine(0).str, 7, 50).trim(); mail.title = (0, _char.substrWidth)('dbcs', getLine(1).str, 7).trim(); mail.timestamp = (0, _char.substrWidth)('dbcs', getLine(2).str, 7).trim(); } _context11.next = 10; return this.getLines(); case 10: mail.lines = _context11.sent; _context11.next = 13; return this.enterIndex(); case 13: return _context11.abrupt("return", mail); case 14: case "end": return _context11.stop(); } } }, _callee11, this); })); function getMail(_x7) { return _getMail.apply(this, arguments); } return getMail; }() }, { key: "enterIndex", value: function () { var _enterIndex = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee12() { return _regenerator["default"].wrap(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: _context12.next = 2; return this.send("".concat(_utils.keymap.ArrowLeft.repeat(10))); case 2: return _context12.abrupt("return", true); case 3: case "end": return _context12.stop(); } } }, _callee12, this); })); function enterIndex() { return _enterIndex.apply(this, arguments); } return enterIndex; }() }, { key: "enterBoard", /** * @deprecated */ value: function enterBoard(boardname) { return this.enterBoardByName(boardname); } }, { key: "enterBoardByName", value: function () { var _enterBoardByName = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee13(boardname) { return _regenerator["default"].wrap(function _callee13$(_context13) { while (1) { switch (_context13.prev = _context13.next) { case 0: _context13.next = 2; return this.send("s".concat(boardname).concat(_utils.keymap.Enter, " ").concat(_utils.keymap.Home).concat(_utils.keymap.End)); case 2: if (!(this.currentBoardname.toLowerCase() === boardname.toLowerCase())) { _context13.next = 8; break; } this._state.position.boardname = this.currentBoardname; this.emit('stateChange', this.state); return _context13.abrupt("return", true); case 8: _context13.next = 10; return this.enterIndex(); case 10: return _context13.abrupt("return", false); case 11: case "end": return _context13.stop(); } } }, _callee13, this); })); function enterBoardByName(_x8) { return _enterBoardByName.apply(this, arguments); } return enterBoardByName; }() }, { key: "enterByOffset", value: function () { var _enterByOffset = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee15() { var _this5 = this; var offsets, getLine, result, _args15 = arguments; return _regenerator["default"].wrap(function _callee15$(_context15) { while (1) { switch (_context15.prev = _context15.next) { case 0: offsets = _args15.length > 0 && _args15[0] !== undefined ? _args15[0] : []; getLine = this.getLine; result = true; offsets.forEach( /*#__PURE__*/ function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee14(offset) { var i, lastOffset; return _regenerator["default"].wrap(function _callee14$(_context14) { while (1) { switch (_context14.prev = _context14.next) { case 0: if (offset === 0) { result = false; } if (!(offset < 0)) { _context14.next = 15; break; } i = 22; case 3: if (!(i >= 3)) { _context14.next = 15; break; } lastOffset = (0, _char.substrWidth)('dbcs', getLine(i).str, 3, 4).trim(); if (!(lastOffset.length > 0)) { _context14.next = 8; break; } offset += +lastOffset + 1; return _context14.abrupt("break", 15); case 8: lastOffset = (0, _char.substrWidth)('dbcs', getLine(i).str, 15, 2).trim(); if (!(lastOffset.length > 0)) { _context14.next = 12; break; } offset += +lastOffset + 1; return _context14.abrupt("break", 15); case 12: i--; _context14.next = 3; break; case 15: if (offset < 0) { result = false; } if (result) { _context14.next = 18; break; } return _context14.abrupt("return"); case 18: _context14.next = 20; return _this5.send("".concat(offset).concat(_utils.keymap.Enter.repeat(2), " ").concat(_utils.keymap.Home).concat(_utils.keymap.End)); case 20: case "end": return _context14.stop(); } } }, _callee14); })); return function (_x9) { return _ref2.apply(this, arguments); }; }()); if (!result) { _context15.next = 12; break; } this._state.position.boardname = this.currentBoardname; this.emit('stateChange', this.state); _context15.next = 9; return this.send(_utils.keymap.Home); case 9: return _context15.abrupt("return", true); case 12: _context15.next = 14; return this.enterIndex(); case 14: return _context15.abrupt("return", false); case 15: case "end": return _context15.stop(); } } }, _callee15, this); })); function enterByOffset() { return _enterByOffset.apply(this, arguments); } return enterByOffset; }() }, { key: "enterBoardByOffset", value: function () { var _enterBoardByOffset = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee16() { var offsets, _args16 = arguments; return _regenerator["default"].wrap(function _callee16$(_context16) { while (1) { switch (_context16.prev = _context16.next) { case 0: offsets = _args16.length > 0 && _args16[0] !== undefined ? _args16[0] : []; _context16.next = 3; return this.send("C".concat(_utils.keymap.Enter)); case 3: _context16.next = 5; return this.enterByOffset(offsets); case 5: return _context16.abrupt("return", _context16.sent); case 6: case "end": return _context16.stop(); } } }, _callee16, this); })); function enterBoardByOffset() { return _enterBoardByOffset.apply(this, arguments); } return enterBoardByOffset; }() }, { key: "enterFavorite", value: function () { var _enterFavorite = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee17() { var offsets, _args17 = arguments; return _regenerator["default"].wrap(function _callee17$(_context17) { while (1) { switch (_context17.prev = _context17.next) { case 0: offsets = _args17.length > 0 && _args17[0] !== undefined ? _args17[0] : []; _context17.next = 3; return this.send("F".concat(_utils.keymap.Enter)); case 3: _context17.next = 5; return this.enterByOffset(offsets); case 5: return _context17.abrupt("return", _context17.sent); case 6: case "end": return _context17.stop(); } } }, _callee17, this); })); function enterFavorite() { return _enterFavorite.apply(this, arguments); } return enterFavorite; }() }, { key: "enterMail", value: function () { var _enterMail = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee18() { return _regenerator["default"].wrap(function _callee18$(_context18) { while (1) { switch (_context18.prev = _context18.next) { case 0: _context18.next = 2; return this.send("M".concat(_utils.keymap.Enter, "R").concat(_utils.keymap.Enter).concat(_utils.keymap.Home).concat(_utils.keymap.End)); case 2: return _context18.abrupt("return", true); case 3: case "end": return _context18.stop(); } } }, _callee18, this); })); function enterMail() { return _enterMail.apply(this, arguments); } return enterMail; }() }, { key: "state", get: function get() { return _objectSpread({}, this._state); } }, { key: "currentBoardname", get: function get() { var boardRe = _wrapRegExp(/【(?!看板列表).*】.*《(.*)》/, { boardname: 1 }); var match = boardRe.exec(this.getLine(0).str); if (match) { return match.groups.boardname; } else { return void 0; } } }]); return Bot; }(_eventemitter["default"]); (0, _defineProperty2["default"])(Bot, "initialState", { connect: false, login: false }); (0, _defineProperty2["default"])(Bot, "forwardEvents", ['message', 'error']); var _default = Bot; exports["default"] = _default;