gocqhttp-twitter-bot
Version:
GoCQHTTP Twitter Bot
141 lines • 4.71 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const path = require("path");
const commandLineUsage = require("command-line-usage");
const exampleConfig = require("../config.example.json");
const command_1 = require("./command");
const loggers_1 = require("./loggers");
const koishi_1 = require("./koishi");
const twitter_1 = require("./twitter");
const logger = loggers_1.getLogger();
const sections = [
{
header: 'GoCQHTTP Twitter Bot',
content: 'The QQ Bot that forwards twitters.',
},
{
header: 'Synopsis',
content: [
'$ twitter-bot {underline config.json}',
'$ twitter-bot {bold --help}',
],
},
{
header: 'Documentation',
content: [
'Project home: {underline https://github.com/CL-Jeremy/mirai-twitter-bot}',
'Example config: {underline https://git.io/JJ0jN}',
],
},
];
const usage = commandLineUsage(sections);
const args = process.argv.slice(2);
if (args.length === 0 || args[0] === 'help' || args[0] === '-h' || args[0] === '--help') {
console.log(usage);
process.exit(0);
}
const configPath = args[0];
let config;
try {
config = JSON.parse(fs.readFileSync(path.resolve(configPath), 'utf8'));
}
catch (e) {
console.log('Failed to parse config file: ', configPath);
console.log(usage);
process.exit(1);
}
const requiredFields = [
'twitter_consumer_key', 'twitter_consumer_secret', 'twitter_access_token_key', 'twitter_access_token_secret',
'cq_bot_qq', ...(config.mode || exampleConfig.mode) === 0 ? ['playwright_ws_spec_endpoint'] : [],
];
const warningFields = [
'cq_ws_host', 'cq_ws_port', 'cq_access_token',
...((_a = config.redis) !== null && _a !== void 0 ? _a : exampleConfig.redis) ? ['redis_host', 'redis_port', 'redis_expire_time'] : [],
];
const optionalFields = [
'lockfile', 'work_interval', 'webshot_delay', 'loglevel', 'mode', 'resume_on_start', 'redis',
].concat(warningFields);
if (requiredFields.some((value) => config[value] === undefined)) {
console.log(`${requiredFields.join(', ')} are required`);
process.exit(1);
}
optionalFields.forEach(key => {
if (config[key] === undefined || typeof (config[key]) !== typeof (exampleConfig[key])) {
if (warningFields.includes(key))
logger.warn(`${key} is undefined, use ${exampleConfig[key] || 'empty string'} as default`);
config[key] = exampleConfig[key];
}
});
loggers_1.setLogLevels(config.loglevel);
let lock;
if (fs.existsSync(path.resolve(config.lockfile))) {
try {
lock = JSON.parse(fs.readFileSync(path.resolve(config.lockfile), 'utf8'));
}
catch (err) {
logger.error(`Failed to parse lockfile ${config.lockfile}: `, err);
lock = {
workon: 0,
feed: [],
threads: {},
};
}
fs.access(path.resolve(config.lockfile), fs.constants.W_OK, err => {
if (err) {
logger.fatal(`cannot write lockfile ${path.resolve(config.lockfile)}, permission denied`);
process.exit(1);
}
});
}
else {
lock = {
workon: 0,
feed: [],
threads: {},
};
try {
fs.writeFileSync(path.resolve(config.lockfile), JSON.stringify(lock));
}
catch (err) {
logger.fatal(`cannot write lockfile ${path.resolve(config.lockfile)}, permission denied`);
process.exit(1);
}
}
if (!config.resume_on_start) {
Object.keys(lock.threads).forEach(key => {
lock.threads[key].offset = '-1';
});
}
const qq = new koishi_1.default({
access_token: config.cq_access_token,
host: config.cq_ws_host,
port: config.cq_ws_port,
bot_id: config.cq_bot_qq,
list: (c, a, cb) => command_1.list(c, a, cb, lock),
sub: (c, a, cb) => command_1.sub(c, a, cb, lock, config.lockfile),
unsub: (c, a, cb) => command_1.unsub(c, a, cb, lock, config.lockfile),
});
const worker = new twitter_1.default({
consumerKey: config.twitter_consumer_key,
consumerSecret: config.twitter_consumer_secret,
accessTokenKey: config.twitter_access_token_key,
accessTokenSecret: config.twitter_access_token_secret,
lock,
lockfile: config.lockfile,
workInterval: config.work_interval,
bot: qq,
webshotDelay: config.webshot_delay,
mode: config.mode,
wsUrl: config.playwright_ws_spec_endpoint,
redis: !config.redis ? undefined : {
redisHost: config.redis_host,
redisPort: config.redis_port,
redisExpireTime: config.redis_expire_time,
},
});
worker.launch();
qq.connect();
//# sourceMappingURL=main.js.map