substreams-sink-slack
Version:
Substreams slack sink module
132 lines (125 loc) • 4.07 kB
JavaScript
;
// bin/cli.ts
var import_substreams_sink3 = require("substreams-sink");
var import_substreams_sink_socials2 = require("substreams-sink-socials");
// index.ts
var import_substreams = require("substreams");
var import_substreams_sink2 = require("substreams-sink");
var import_substreams_sink_socials = require("substreams-sink-socials");
// src/slack.ts
var import_substreams_sink = require("substreams-sink");
var import_web_api = require("@slack/web-api");
var import_zod = require("zod");
var SlackConfigSchema = import_zod.z.object({});
var Slack = class {
client;
constructor(token) {
this.client = new import_web_api.WebClient(token, {
retryConfig: import_web_api.retryPolicies.fiveRetriesInFiveMinutes
});
}
async sendMessage(chatId, message, _) {
try {
await this.client.chat.postMessage({
text: message,
channel: chatId
});
} catch (error) {
if (error.code === import_web_api.ErrorCode.PlatformError) {
import_substreams_sink.logger.error(error);
} else {
import_substreams_sink.logger.error("failed to send message");
}
}
}
};
// package.json
var package_default = {
name: "substreams-sink-slack",
version: "0.1.0",
description: "Substreams slack sink module",
main: "dist/index.js",
types: "dist/index.d.ts",
bin: {
"substreams-sink-slack": "dist/bin/cli.js"
},
repository: "git@github.com:pinax-network/substreams-sink-slack.git",
keywords: [
"substreams",
"streamingfast",
"firehose",
"thegraph",
"pinax"
],
author: {
name: "Charles",
email: "charles@pinax.network"
},
files: [
"dist"
],
contributors: [
{
name: "Denis",
email: "denis@pinax.network"
},
{
name: "Charles",
email: "charles@pinax.network"
}
],
license: "MIT OR Apache-2.0",
scripts: {
prepublishOnly: "tsc",
build: "tsup index.ts bin/cli.ts --dts",
pkg: "ncc build bin/cli.ts -o build && pkg dist/bin/cli.js --target linux-x64,mac-x64,win-x64,mac-arm64 --output substreams-sink-slack"
},
dependencies: {
"@slack/web-api": "^6.8.1",
commander: "^10.0.0",
dotenv: "^16.0.3",
substreams: "0.7.x",
"substreams-sink": "0.4.x",
"substreams-sink-socials": "^0.0.4",
winston: "^3.8.2",
zod: "^3.21.4"
},
devDependencies: {
"@tsconfig/recommended": "latest",
"@vercel/ncc": "latest",
pkg: "latest",
tsup: "latest",
typescript: "latest"
}
};
// index.ts
import_substreams_sink2.logger.setName(package_default.name);
var DEFAULT_SLACK_API_TOKEN_ENV = "SLACK_API_TOKEN";
async function action(manifest, moduleName, options) {
const spkg = await (0, import_substreams.download)(manifest);
const { config, slackApiTokenEnvvar, slackApiToken } = options;
let social = new import_substreams_sink_socials.Social(config, SlackConfigSchema);
const slack_api_token = slackApiToken ?? process.env[slackApiTokenEnvvar];
if (!slack_api_token) {
import_substreams_sink2.logger.error("[slack_api_token] is required");
process.exit(1);
}
const slackBot = new Slack(slack_api_token);
const substreams = (0, import_substreams_sink2.run)(spkg, moduleName, options);
substreams.on("anyMessage", async (messages) => {
await social.distributeMessages(messages, (chatId, message, config2) => {
slackBot.sendMessage(chatId, message, config2);
});
});
substreams.start(options.delayBeforeStart);
}
// bin/cli.ts
var program = import_substreams_sink3.cli.program(package_default);
var command = import_substreams_sink3.cli.run(program, package_default);
import_substreams_sink_socials2.cli.addSocialConfigOption(command);
command.option("--slack-api-token <string>", "API token for the Slack bot");
command.option("--slack-api-token-envvar <string>", "Environnement variable name of the API token for the Slack bot", DEFAULT_SLACK_API_TOKEN_ENV);
command.action(action);
program.parse();
import_substreams_sink_socials2.cli.validateSocialConfigOption(command);