2ch
Version:
A JavaScript library for comfortable 2ch watching.
93 lines (81 loc) • 2.5 kB
JavaScript
(function() {
var Bbs, util, _;
_ = require('lodash');
util = require('./util');
module.exports = Bbs = (function() {
function Bbs(bbsMenu, name) {
this.bbsMenu = bbsMenu;
this.name = name;
}
Bbs.prototype.getThreadUrl = function(number) {
return "" + (this.bbsMenu.getBbsUrl(this.name)) + "dat/" + number + ".dat";
};
Bbs.prototype.fetch = function(done) {
var url;
url = this.bbsMenu.getBbsUrl(this.name) + 'subject.txt';
return util.requestGet(url).end(done);
};
Bbs.prototype.fetchThreadHeader = function(query, done) {
var _this = this;
if (this.bbsMenu.updatedAt != null) {
return this._fetchThreadHeader(query, done);
} else {
return this.bbsMenu.update(function(error) {
var url;
if (error) {
return done(error);
}
url = _this.bbsMenu.getBbsUrl(_this.name);
if (url == null) {
return done(new Error('Unknown BBS name: ' + _this.name));
}
return _this._fetchThreadHeader(query, done);
});
}
};
Bbs.prototype.searchThreadHeader = function(query, text) {
var headers, matches, re, reStr,
_this = this;
if (_.isRegExp(query)) {
query = query.toString().replace(/^\/|\/[igm]*$/g, '');
reStr = "^([0-9]+)\\.dat<>(.*" + query + ".*) \\(([0-9]+)\\)$";
} else {
query = util.escapeRegExpChars(query);
reStr = "^([0-9]+)\\.dat<>(" + query + ") \\(([0-9]+)\\)$";
}
matches = text.match(new RegExp(reStr, 'img'));
if (!matches) {
return null;
}
re = new RegExp(reStr, 'im');
headers = matches.map(function(m) {
var match;
match = re.exec(m);
return {
number: Number(match[1]),
title: match[2],
count: Number(match[3])
};
});
headers = _.sortBy(headers, function(h) {
return h.count;
}).filter(function(h) {
return h.count < 1000;
});
headers.reverse();
return headers[0];
};
Bbs.prototype._fetchThreadHeader = function(query, done) {
var _this = this;
return this.fetch(function(error, res) {
var header;
if (error) {
return done(error);
}
header = _this.searchThreadHeader(query, res.body.text);
return done(null, header);
});
};
return Bbs;
})();
}).call(this);