UNPKG

substreams-sink-slack

Version:
132 lines (125 loc) 4.07 kB
#!/usr/bin/env node "use strict"; // 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);