Substreams
Sink Socials CLI Node.js
substreams-sink-socials
is the code template to build Substreams sinks in NodeJS that send blockchain data to different messaging platform.
📖 Documentation
Further resources
🚀 Quick start
Installation
npm install substreams-sink-socials
Features
- [x] includes Commander.js helper CLI for social config file option:
-c --config <string>
- [x] parses
YAML
andJSON
social config file - [x] handles rate limiting
- [x] format messages
Example
Config file example:
[
{
"entity": "Transfer",
"chat_ids": [
"some_chat_id"
],
"message": "This *{user_id}* made a transaction with id _{trx_id}_"
},
{
"entity": "Grants",
"chat_ids": [
"some_chat_id"
],
"message": "This {grant}"
}
]
Code example for Telegram:
import { setup, logger, commander } from "substreams-sink";
import { Social, EntityChanges } from "substreams-sink-socials";
import { z } from "zod";
import pkg from "./package.json" assert { type: "json" };
import { Telegram } from "./src/telegram";
// default telegram options
export const DEFAULT_TELEGRAM_API_TOKEN_ENV = 'TELEGRAM_API_TOKEN';
const TelegramConfigSchema = z.object({
parse_mode: z.enum(["MarkdownV2", "HTML"]).default("MarkdownV2"),
});
// Custom user options interface
interface ActionOptions extends commander.RunOptions {
config: string,
telegramApiTokenEnvvar: string,
telegramApiToken: string,
}
export async function action(manifest: string, moduleName: string, options: ActionOptions) {
const { emitter } = await setup(options, pkg);
// Get command options
const { config, telegramApiTokenEnvvar, telegramApiToken } = options;
// Social setup
let social: Social = new Social(config, TelegramConfigSchema, 1500);
// Telegram options
const telegram_api_token = telegramApiToken ?? process.env[telegramApiTokenEnvvar];
if (!telegram_api_token) {
logger.error('[telegram_api_token] is required');
process.exit(1);
}
// Initialize Telegram bot
const telegramBot = new Telegram(telegram_api_token);
// Run substreams
emitter.on("anyMessage", async (messages: EntityChanges) => {
await social.distributeMessages(messages, (chatId, message, config) => {
telegramBot.sendMessage(chatId, message, config);
});
});
await emitter.start();
}