ptt-client
Version:
A Node client for fetching data from ptt.cc.
1,437 lines (1,176 loc) • 45.7 kB
JavaScript
"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;