UNPKG

ptt-client

Version:

A Node client for fetching data from ptt.cc.

548 lines (434 loc) 16 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.BoardSelectQueryBuilder = exports.Entry = exports.WhereType = exports.Board = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _SelectQueryBuilder2 = require("../../../utils/query-builder/SelectQueryBuilder"); var _utils = require("../../../utils"); var _char = require("../../../utils/char"); var Board = /*#__PURE__*/ function () { (0, _createClass2["default"])(Board, [{ key: "bn", /** * @deprecated */ get: function get() { return this.id; } /** * @deprecated */ }, { key: "boardname", get: function get() { return this.name; } /** * @deprecated */ }, { key: "read", get: function get() { return !this.unread; } }]); function Board() { var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; (0, _classCallCheck2["default"])(this, Board); (0, _defineProperty2["default"])(this, "name", ''); (0, _defineProperty2["default"])(this, "id", 0); (0, _defineProperty2["default"])(this, "unread", false); (0, _defineProperty2["default"])(this, "category", ''); (0, _defineProperty2["default"])(this, "flag", ''); (0, _defineProperty2["default"])(this, "title", ''); (0, _defineProperty2["default"])(this, "users", ''); (0, _defineProperty2["default"])(this, "admin", ''); (0, _defineProperty2["default"])(this, "folder", false); (0, _defineProperty2["default"])(this, "divider", false); this.name = name; } (0, _createClass2["default"])(Board, null, [{ key: "fromLine", value: function fromLine(line) { var board = new Board(); board.id = +(0, _char.substrWidth)('dbcs', line, 3, 4).trim(); board.unread = (0, _char.substrWidth)('dbcs', line, 8, 2).trim() === 'ˇ'; board.name = (0, _char.substrWidth)('dbcs', line, 10, 12).trim(); board.category = (0, _char.substrWidth)('dbcs', line, 23, 4).trim(); board.flag = (0, _char.substrWidth)('dbcs', line, 28, 2).trim(); switch (board.flag) { case '□': board.title = (0, _char.substrWidth)('dbcs', line, 30).replace(/\s+$/, ''); board.folder = true; break; case '--': board.divider = true; break; case 'Σ': board.title = (0, _char.substrWidth)('dbcs', line, 30, 31).replace(/\s+$/, ''); board.users = (0, _char.substrWidth)('dbcs', line, 62, 5).trim(); board.admin = (0, _char.substrWidth)('dbcs', line, 67).trim(); board.folder = true; break; case '◎': board.title = (0, _char.substrWidth)('dbcs', line, 30, 31).replace(/\s+$/, ''); board.users = (0, _char.substrWidth)('dbcs', line, 62, 5).trim(); board.admin = (0, _char.substrWidth)('dbcs', line, 67).trim(); break; default: console.warn("Unknown board flag. line: \"".concat(line, "\"")); } return board; } }, { key: "fromClassLine", value: function fromClassLine(line) { var board = new Board(); board.id = +(0, _char.substrWidth)('dbcs', line, 15, 2); board.title = (0, _char.substrWidth)('dbcs', line, 20, 29).replace(/\s+$/, ''); board.admin = (0, _char.substrWidth)('dbcs', line, 61).trim(); board.folder = true; return board; } }, { key: "select", value: function select(bot) { return new BoardSelectQueryBuilder(bot); } }]); return Board; }(); exports.Board = Board; var WhereType; exports.WhereType = WhereType; (function (WhereType) { WhereType["Entry"] = "entry"; WhereType["Prefix"] = "prefix"; WhereType["Offset"] = "offset"; WhereType["Offsets"] = "offsets"; })(WhereType || (exports.WhereType = WhereType = {})); var Entry; exports.Entry = Entry; (function (Entry) { Entry["Class"] = "class"; Entry["Favorite"] = "favorite"; Entry["Hot"] = "hot"; })(Entry || (exports.Entry = Entry = {})); var BoardSelectQueryBuilder = /*#__PURE__*/ function (_SelectQueryBuilder) { (0, _inherits2["default"])(BoardSelectQueryBuilder, _SelectQueryBuilder); function BoardSelectQueryBuilder(bot) { var _this; (0, _classCallCheck2["default"])(this, BoardSelectQueryBuilder); _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(BoardSelectQueryBuilder).call(this)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "bot", void 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "entry", Entry.Class); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "prefix", ''); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "offsets", []); _this.bot = bot; return _this; } (0, _createClass2["default"])(BoardSelectQueryBuilder, [{ key: "where", value: function where(type, condition) { switch (type.toLowerCase()) { case WhereType.Entry: this.entry = condition.toLowerCase(); break; case WhereType.Prefix: this.prefix = condition; break; case WhereType.Offset: this.offsets.push(condition); break; case WhereType.Offsets: this.offsets = condition.slice(); break; default: throw new Error("Invalid type: ".concat(type)); break; } return this; } }, { key: "get", value: function () { var _get = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee() { var found, boards, i, line, board, stopLoop, _i, _line, _board; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(this.prefix !== '')) { _context.next = 4; break; } _context.next = 3; return this.getByPrefix(this.prefix); case 3: return _context.abrupt("return", _context.sent); case 4: _context.t0 = this.entry; _context.next = _context.t0 === Entry.Class ? 7 : _context.t0 === Entry.Favorite ? 11 : _context.t0 === Entry.Hot ? 15 : 19; break; case 7: _context.next = 9; return this.bot.enterBoardByOffset(this.offsets); case 9: found = _context.sent; return _context.abrupt("break", 19); case 11: _context.next = 13; return this.bot.enterFavorite(this.offsets); case 13: found = _context.sent; return _context.abrupt("break", 19); case 15: _context.next = 17; return this.bot.enterBoardByOffset([-1].concat((0, _toConsumableArray2["default"])(this.offsets))); case 17: found = _context.sent; return _context.abrupt("break", 19); case 19: boards = []; if (!found) { _context.next = 56; break; } if (!(this.entry === Entry.Class && this.offsets.length === 0)) { _context.next = 34; break; } i = 7; case 23: if (!(i < 23)) { _context.next = 32; break; } line = this.bot.getLine(i).str; if (!(line.trim() === '')) { _context.next = 27; break; } return _context.abrupt("break", 32); case 27: board = Board.fromClassLine(line); boards.push(board); case 29: i++; _context.next = 23; break; case 32: _context.next = 56; break; case 34: if (!true) { _context.next = 56; break; } stopLoop = false; _i = 3; case 37: if (!(_i < 23)) { _context.next = 50; break; } _line = this.bot.getLine(_i).str; if (!(_line.trim() === '')) { _context.next = 42; break; } stopLoop = true; return _context.abrupt("break", 50); case 42: _board = Board.fromLine(_line); if (!(_board.id !== boards.length + 1)) { _context.next = 46; break; } stopLoop = true; return _context.abrupt("break", 50); case 46: boards.push(_board); case 47: _i++; _context.next = 37; break; case 50: if (!stopLoop) { _context.next = 52; break; } return _context.abrupt("break", 56); case 52: _context.next = 54; return this.bot.send(_utils.keymap.PgDown); case 54: _context.next = 34; break; case 56: _context.next = 58; return this.bot.enterIndex(); case 58: return _context.abrupt("return", boards); case 59: case "end": return _context.stop(); } } }, _callee, this); })); function get() { return _get.apply(this, arguments); } return get; }() }, { key: "getOne", value: function () { var _getOne = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee2() { var res; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return this.get(); case 2: res = _context2.sent; return _context2.abrupt("return", res.length ? res[0] : void 0); case 4: case "end": return _context2.stop(); } } }, _callee2, this); })); function getOne() { return _getOne.apply(this, arguments); } return getOne; }() }, { key: "getByPrefix", value: function () { var _getByPrefix = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee3(prefix) { var boards, resultLine0, col, row, width, line, boardname, searchLine, searchInput; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return this.bot.send("s".concat(prefix, " ")); case 2: boards = []; resultLine0 = this.bot.getLine(3).str; if (!(resultLine0.toLowerCase().indexOf(prefix.toLowerCase()) === 0)) { _context3.next = 33; break; } col = 0, row = 0; /* TODO: Use other way instead of the constant 15. */ width = 15; while (width < resultLine0.length && resultLine0[width] !== ' ') { width += 1; } while (width < resultLine0.length && resultLine0[width] === ' ') { width += 1; } case 9: if (!true) { _context3.next = 31; break; } line = this.bot.getLine(row + 3).str; boardname = (0, _char.substrWidth)('dbcs', line, col * width, width).trim(); if (!(boardname !== '')) { _context3.next = 16; break; } boards.push(new Board(boardname)); _context3.next = 17; break; case 16: return _context3.abrupt("break", 31); case 17: row += 1; if (!(row == 20)) { _context3.next = 29; break; } col += 1; row = 0; /* TODO: Use other way instead of the constant 80. */ if (!((col + 1) * width > 80)) { _context3.next = 29; break; } if (!this.bot.getLine(23).str.includes('按任意鍵繼續')) { _context3.next = 28; break; } col = row = 0; _context3.next = 26; return this.bot.send(' '); case 26: _context3.next = 29; break; case 28: return _context3.abrupt("break", 31); case 29: _context3.next = 9; break; case 31: _context3.next = 36; break; case 33: searchLine = this.bot.getLine(1).str; searchInput = (0, _char.substrWidth)('dbcs', searchLine, 34, 15).trim(); if (searchInput.toLowerCase().indexOf(prefix.toLowerCase()) === 0) { boards.push(new Board(searchInput)); } case 36: _context3.next = 38; return this.bot.send(_utils.keymap.CtrlC); case 38: return _context3.abrupt("return", boards); case 39: case "end": return _context3.stop(); } } }, _callee3, this); })); function getByPrefix(_x) { return _getByPrefix.apply(this, arguments); } return getByPrefix; }() }]); return BoardSelectQueryBuilder; }(_SelectQueryBuilder2.SelectQueryBuilder); exports.BoardSelectQueryBuilder = BoardSelectQueryBuilder; var _default = Board; exports["default"] = _default;