@sugarcube/plugin-twitter
Version:
Query the Twitter API as a SugarCube plugin.
103 lines (88 loc) • 2.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _dashp = require("dashp");
var _core = require("@sugarcube/core");
var _utils = require("@sugarcube/utils");
var _twitter = require("./twitter");
var _utils2 = require("./utils");
var _assertions = require("./assertions");
const querySource = "twitter_user";
const feedPlugin = async (envelope, {
log,
cfg,
stats
}) => {
const decisions = (0, _core.createFeatureDecisions)();
const users = _core.envelope.queriesByType(querySource, envelope).map(term => (0, _utils2.parseTwitterUser)(term));
const logCounter = (0, _utils.counter)(envelope.data.length, ({
cnt,
total,
percent
}) => log.debug(`Progress: ${cnt}/${total} units (${percent}%).`), {
threshold: 50,
steps: 25
});
log.debug(`Fetching the tweets for ${users.join(", ")}`);
const fetchTimeline = user => (0, _dashp.flowP)([(0, _dashp.tapP)(() => stats.count("total")), (0, _twitter.feed)(cfg), (0, _dashp.tapP)(rs => {
const fetched = rs.length;
stats.count("success");
stats.count("fetched", fetched);
log.info(`Fetched ${fetched} tweets for ${user}.`);
logCounter();
}), // Merge the query into the data unit.
results => results.map(r => {
const q = envelope.queries.find(({
type,
term
}) => {
const {
user: u
} = decisions.canNcube() ? r._sc_data : r;
return type === querySource && ((0, _utils2.parseTwitterUser)(term) === u.screen_name || (0, _utils2.parseTwitterUser)(term) === u.user_id);
});
if (q == null) return r;
const {
tags,
...query
} = q;
return Object.assign(r, {
_sc_queries: Array.isArray(r._sc_queries) ? r._sc_queries.concat(query) : [query]
}, Array.isArray(tags) && tags.length > 0 ? {
_sc_tags: Array.isArray(r._sc_tags) ? r._sc_tags.concat(tags) : tags
} : undefined);
}), (0, _dashp.caughtP)(e => {
const reason = (0, _twitter.parseApiErrors)(e);
stats.fail({
type: querySource,
term: user,
reason
});
return [];
})], user);
const results = await (0, _dashp.flatmapP)(fetchTimeline, users);
log.info(`Fetched ${results.length} tweets for ${users.length} users.`);
return _core.envelope.concatData(results, envelope);
};
const plugin = _core.plugin.liftManyA2([_assertions.assertCredentials, feedPlugin]);
plugin.desc = "Fetch the tweets of an user.";
plugin.source = {
name: querySource,
desc: "A twitter user name"
};
plugin.argv = {
"twitter.tweet_count": {
default: 200,
nargs: 1,
desc: "Number of tweets retrived"
},
"twitter.retweets": {
default: 1,
nargs: 1,
desc: "Include retweets"
}
};
var _default = plugin;
exports.default = _default;