@deadlock-delegate/twitter-bot
Version:
Twitter bot plugin for core
102 lines (101 loc) • 5.15 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const core_kernel_1 = require("@arkecosystem/core-kernel");
const twit_1 = __importDefault(require("twit"));
const constants_1 = require("./constants");
let LAST_ACTIVE_DELEGATES_CACHED = [];
let Bot = class Bot {
start(options) {
this.twit = new twit_1.default({
consumer_key: options.consumerKey,
consumer_secret: options.consumerSecret,
access_token: options.accessToken,
access_token_secret: options.accessTokenSecret,
timeout_ms: 5 * 1000,
});
this.emitter.listen(core_kernel_1.Enums.BlockEvent.Applied, {
handle: async (payload) => {
const previouslyActiveDelegates = LAST_ACTIVE_DELEGATES_CACHED;
const latestDelegates = (await this.triggers.call("getActiveDelegates", {}));
if (!latestDelegates)
return;
const newActiveDelegates = latestDelegates.map((wallet) => wallet.getAttribute("delegate.username"));
if (previouslyActiveDelegates.length == 0) {
LAST_ACTIVE_DELEGATES_CACHED = newActiveDelegates;
return;
}
const droppedOutDelegates = previouslyActiveDelegates.filter((x) => !newActiveDelegates.includes(x));
const newDelegates = newActiveDelegates.filter((x) => !previouslyActiveDelegates.includes(x));
if (droppedOutDelegates.length === 0 && newDelegates.length === 0) {
return;
}
const block = this.stateStore.getLastBlock();
const { round } = core_kernel_1.Utils.roundCalculator.calculateRound(block.data.height);
let TW_DEV_PREFIX = "";
if (this.app.network() !== "mainnet") {
TW_DEV_PREFIX = "[TEST] ";
}
for (const delegate of droppedOutDelegates) {
this.logger.debug(`${constants_1.LOG_PREFIX} Tweeting about removed forging delegate ${delegate} in round ${round}`);
this.tweet(`${TW_DEV_PREFIX}🚨 ${delegate} removed from active block producer position in round ${round}`);
}
for (const delegate of newDelegates) {
console.log(`${constants_1.LOG_PREFIX} Tweeting about a new forging delegate ${delegate} in round ${round}`);
this.tweet(`${TW_DEV_PREFIX}👏 ${delegate} elected to be an active block producer in round ${round}`);
}
// cache new active delegates for the next round so we know which ones change
LAST_ACTIVE_DELEGATES_CACHED = newActiveDelegates;
return;
},
});
}
async tweet(status) {
if (!this.twit) {
this.logger.error(`${constants_1.LOG_PREFIX} Twit is not initialized`);
return;
}
try {
await this.twit.post("statuses/update", { status: status });
}
catch (err) {
this.logger.error(`${constants_1.LOG_PREFIX} Error posting tweet: ${err}`);
}
}
};
__decorate([
core_kernel_1.Container.inject(core_kernel_1.Container.Identifiers.EventDispatcherService),
__metadata("design:type", Object)
], Bot.prototype, "emitter", void 0);
__decorate([
core_kernel_1.Container.inject(core_kernel_1.Container.Identifiers.LogService),
__metadata("design:type", Object)
], Bot.prototype, "logger", void 0);
__decorate([
core_kernel_1.Container.inject(core_kernel_1.Container.Identifiers.TriggerService),
__metadata("design:type", core_kernel_1.Services.Triggers.Triggers)
], Bot.prototype, "triggers", void 0);
__decorate([
core_kernel_1.Container.inject(core_kernel_1.Container.Identifiers.StateStore),
__metadata("design:type", Object)
], Bot.prototype, "stateStore", void 0);
__decorate([
core_kernel_1.Container.inject(core_kernel_1.Container.Identifiers.Application),
__metadata("design:type", Object)
], Bot.prototype, "app", void 0);
Bot = __decorate([
core_kernel_1.Container.injectable()
], Bot);
exports.default = Bot;
//# sourceMappingURL=bot.js.map