• Stars
    star
    198
  • Rank 196,898 (Top 4 %)
  • Language
    Rust
  • License
    MIT License
  • Created almost 5 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🐂 El Monitorro is a high-performance feed reader as a Telegram bot. It supports RSS, Atom and JSON feeds

+++ title = "El Monitorro" sort_by = "weight" +++

paypal

El Monitorro

El Monitorro is RSS, Atom and JSON feed reader as a Telegram bot.

It's available at @el_monitorro_bot.

Usage

Commands

/start - show the bot's description and contact information

/subscribe url - subscribe to feed

/unsubscribe url - unsubscribe from feed

/list_subscriptions - list your subscriptions

/help - show available commands

/set_timezone - set your timezone. All received dates will be converted to this timezone. It should be offset in minutes from UTC. For example, if you live in UTC +10 timezone, offset is equal to 600

/get_timezone - get your timezone

/set_template url template - set a template for all received items for the specified subscription. All new updates will be converted to the format defined by this subscription. Supported fields you can use for templates:
- bot_feed_name - name of the feed
- bot_feed_link - url of the feed
- bot_item_name - name of the item
- bot_item_link - url of the item
- bot_item_description - description of the item
- bot_date - publication date of the feed

Example: /set_template https://www.badykov.com/feed.xml {{bot_feed_name}}


    {{bot_item_name}}


    {{bot_date}}


    {{bot_item_link}}

Also, there are some helpers for templates:
- `substring` helper that can be used to limit the number of characters. For example, {{substring bot_item_description 100}}
- `create_link` helper. This helper creates an html link. For example, {{create_link bot_item_name bot_item_link}} or {{create_link "custom_name" bot_item_link}}
- `italic` helper. Usage: {{italic bot_item_description}}
- `bold` helper. Usage:  {{bold bot_item_name}}

/get_template url - get a template for the subscription

/remove_template url - remove the template

/set_global_template - set global template. This template will be used for all subscriptions. If the subscription has its own template, the subscription template will be used. See /set_template for available fields.

/remove_global_template - remove global template

/get_global_template - get global template

/get_filter url - get a filter for the subscription

/set_filter url filter - set filter, for example, /set_filter https://www.badykov.com/feed.xml telegram,bots. You'll start receiving posts only containing words in the filter. Use `!word` to stop receiving messages containing the specified `word`. You can combine regular filter words with ! filter words. For example, `!bot,telegram`

/remove_filter url - remove filter

/set_global_filter filter - set global filter

/get_global_filter - get a global filter

/remove_global_filter - remove global filter

/info - shows the number of subscriptions and chats. it's available only for the admin (`ADMIN_TELEGRAM_ID`)

/set_content_fields url fields - changes content hash fields of the specified feed. it's available only for the admin (`ADMIN_TELEGRAM_ID`).
Example: /set_content_fields https://www.badykov.com/feed.xml author,title

By default content hash is calculated from title and url.

Available fields:
    - link
    - title
    - publication_date
    - guid
    - description
    - author

/toggle_preview_enabled - disable or enable previews

/get_preview_enabled - check if previews are enabled for the current chat. by default, previews are enabled

Common info

  • Feed updates check interval is 1 minute.
  • Unread items delivery interval is 1 minute.
  • The number of subscriptions is limited to 20.

The bot works in private chats, groups and channels. A couple of channels created with el monitorro:

Setup

Manual setup

You can deploy your instance of el_monitorro by:

  1. Set postgres db url (DATABASE_URL) and telegram bot token (TELEGRAM_BOT_TOKEN) to .env file in the root directory. For example:
DATABASE_URL=postgres://admin:pass@localhost/el_monitorro
TELEGRAM_BOT_TOKEN=MYTOKEN
  1. Setup database by running:
diesel database setup

You'll need diesel-cli for this

  1. Start the bot
  • Start the command bot
RUST_LOG=info RUST_BACKTRACE=1 cargo run --bin el_monitorro
  • Start the sync binary
RUST_LOG=info RUST_BACKTRACE=1 cargo run --bin sync
  • Start the delivery binary
RUST_LOG=info RUST_BACKTRACE=1 cargo run --bin deliver
  • If you don't want to store all feed items that were synced and feeds without any subscriptions, start the cleaner binary
RUST_LOG=info RUST_BACKTRACE=1 cargo run --bin cleaner

Running all services from a single binary

Set ALL_BINARIES to run all binaries (clean, commands, deliver, sync) in the same binary:

ALL_BINARIES=true

Configuration

All configuration is done through env variables

Name Required Default value Example / Description
DATABASE_URL yes -- postgres://postgres:postgres@localhost/el_monitorro
TELEGRAM_BOT_TOKEN yes -- 6666618370:AAGx5YhNQvUG4eUcQXN-OB_a09ZzYl6aaaa
DATABASE_POOL_SIZE no 5 The maximum number of connections for global connection pool (global per binary except if ALL_BINARIES is set to true).
ALL_BINARIES no -- If this var is set, all services will be started in the main binary
TELEGRAM_BOT_HANDLE no -- This value is used during parsing of commands. If you set autocompletion menu for your bot, the bot will understand commands like /subscribe@handle along with just /subscribe
SUBSCRIPTION_LIMIT no 20
FILTER_LIMIT no 20 The maximum number of filter words that can be set per subscription or as the global filter
SYNC_INTERVAL_SECONDS no 60 The bot tries to sync feeds every SYNC_INTERVAL_SECONDS seconds
SYNC_WORKERS_NUMBER no 1 The number of workers to sync feeds
DELIVER_INTERVAL_SECONDS no 60 The bot tries to deliver new feed items every DELIVER_INTERVAL_SECONDS seconds
DELIVER_WORKERS_NUMBER no 1 The number of workers to deliver updates
CLEAN_INTERVAL_SECONDS no 3600 The bot cleans old feed items and feeds without subscriptions every CLEAN_INTERVAL_SECONDS seconds
CLEAN_WORKERS_NUMBER no 1 The number of workers to remove old data
OWNER_TELEGRAM_ID no -- If this value is set, the bot will process commands only from the specified user id
REQUEST_TIMEOUT no 5 Timeout in seconds for feed syncing requests
ADMIN_TELEGRAM_ID no -- If this value is set, /info command with stats is available for ADMIN_TELEGRAM_ID

Deployment suggestions

It's recommended to use a self hosted PostgreSQL instance but if it's not possible there are free services that can host it fo you:

Using docker image

The image is published on docker hub under ayratbadykov/el_monitorro. It accepts additional env variables:

  • SETUP_DB - if this variable is not empty, diesel database setup is run. It creates DB and runs migrations.
  • RUN_MIGRATION - if this variable is not empty, diesel migration run is run. It just runs migrations.
  • BOT_BINARY - depending on this variable, docker container will run one of four binaries. Possible values are commands, sync, deliver, cleaner. To run all services in the main binary, set:
RUN_MIGRATION=true
BOT_BINARY=commands
ALL_BINARIES=true

Run the docker container:

docker run --env-file ./.env --network host -t ayratbadykov/el_monitorro:latest

Notes:

  • --network host is used so the docker container can access a host network if you're running Postgres on the same machine

You can check out an example of docker-compose file in the root directory of the project.

Creating a docker image from the latest master branch

Run the following command in the el_monitorro directory to build the image from the master branch:

docker build ./ -t ayratbadykov/el_monitorro:latest

More Repositories

1

fang

Background processing for Rust
Rust
608
star
2

frankenstein

Telegram bot API client for Rust
Rust
258
star
3

mix.el

Emacs Minor Mode for Mix, a build tool that ships with Elixir
Emacs Lisp
34
star
4

hornet

Hornet is a simple library for stress testing
Elixir
33
star
5

ton

TON (The Open Network) SDK
Elixir
27
star
6

cryptopunk

Hierarchical deterministic wallet for Elixir
Elixir
24
star
7

clope

Elixir implementation of CLOPE: A Fast and Effective Clustering Algorithm for Transactional Data
Elixir
22
star
8

treasure_hunter

The project for hacking your crypto wallet
Elixir
17
star
9

cargo-mode

Emacs minor mode which allows to dynamically select cargo command
Emacs Lisp
17
star
10

dot-emacs

My Emacs configuration
Emacs Lisp
15
star
11

ex_secp256k1

Rust Nif that wraps a couple functions from the libsecp256k1 rust library
Elixir
14
star
12

company-elixir

company-mode completion backend for Elixir.
Emacs Lisp
12
star
13

rock

Elixir implementation of ROCK: A Robust Clustering Algorithm for Categorical Attributes
Elixir
11
star
14

cronenberg

Simple cron command entry parser
Rust
11
star
15

braindump

WIP braindump
Emacs Lisp
10
star
16

eth_bloom

Ethereum's bloom filter implementation in elixir
Elixir
6
star
17

ex_riak_cs

Riak CS API wrapper for Elixir
Elixir
5
star
18

cortex-dark

Dark theme for Braindump (Hugo)
SCSS
5
star
19

ex_pbkdf2

Password-Based Key Derivation Function v2 (PBKDF2) for Elixir by a Rust-based NIF
Elixir
4
star
20

foogold

A tool for trying your luck with random bitcoin mnemonics
Rust
4
star
21

cafezinho

Rust NIF for Ed25519 curve functions.
Elixir
2
star
22

geth_reorg_sim

Dockerfile
2
star
23

ayrat555.github.io

Personal blog
HTML
2
star
24

mnemoniac

Implementation of BIP-39 which describes generation of mnemonic codes or mnemonic sentences
Elixir
2
star
25

ex_keccak

Elixir
1
star
26

ex_bech32

Nif for Bech32 format encoding and decoding (used for native segregated witness output addresses in btc).
Elixir
1
star
27

evil_crc32c

"Evil" version of the crc32c algorithm
Elixir
1
star
28

tiny_evm

Tiny EVM - test assignment for the Mana project (https://github.com/poanetwork/mana) candidates
Elixir
1
star
29

ex_base58

Rust NIF for Base58 encoding and decoding with support of Bitcoin, Ripple, Monero and Flickr alphabets.
Elixir
1
star