о проекте - 项目介绍 - परियोजना के बारे में - プロジェクトについて - acerca del proyecto - about project
Important
My best learning project to apply technology - from MVP to Enterprise Level 🚀
Telegram-Forwarder (UNIX-way) - forwards (or copies) messages from monitored channels and groups to target ones according to specified rules to obtain thematic digests.
How to clone project with submodules
$ git clone https://github.com/comerc/budva43.git $ git submodule init $ git submodule update
Prepere dependencies
How to Dev Start
Direct install TDLib on host machine for best dev experience or use DevContainer (some restrictions) for build on Ubuntu.
With direct TDLib
Install by instruction with this options:
- Install built TDLib to /usr/local instead of placing the files to td/tdlib.
- Choose which compiler you want to use to build TDLib: clang (recommended)
With DevContainer
only first time:
...then "Reopen in Container"
Applied Technologies
- Dev Containers
- testcontainers
- mockery
- easyjson
- Docker Compose
- docker multi-stage build
- zsh + ohmyzsh
- golangci-lint + revive
- Makefile
- editorconfig
- git submodule
- goreleaser
- todo-highlight
- git-graph
- Redis
- go-clean-architecture
- SOLID
- DRY
- KISS
- YAGNI
- Dependency Injection
- design-patterns
- Notations Start & Run
- Graceful Shutdown
- Front Controller (microservice)
- CQRS
- samber/lo
- uptrace/bun
- gqlgen
- Grafana + Prometheus
- ClickHouse
- fiber
- zelenin/go-tdlib
- Code Style
- samber/mo
- samber/do
- samber/oops
- samber/slog-*
- testing: Time & Concurrency https://danp.net/posts/synctest-experiment/
- spf13/cobra
- go.mod replace
- comerc/spylog
- go test -race WARNING LC_DYSYMTAB golang/go#61229
- voidint/g
- go mod vendor
- vmihailenco/msgpack
- temporal
- anycable
- gocritic
- OpenTelemetry
- gostackparse
- grafana-loki
- pplog
- pprof
- time.AfterFunc() & context.AfterFunc()
- init() - dependency chain: config -> log -> spylog
- closures (currying and partial application)
- tail recursion
- errors.Is & errors.As
- generics
- PUB/SUB
- table (call-)tests
- integration tests
- separate config for e2e tests
- dynamic config engine.yml
- structured logs and errors
- termAutomator
- codecov.io
- snapshot tests
- LocalAI
- go-prompt
- Gemma for NLP?
- uber-go/automaxprocs
- uber-go/goleak
- magefile/mage
- oklog/ulid
- Go to Implementation
- jq
- task
- unused-interface-methods
- BDD
- godog
- grpc
- fuzz-test?
- error-log-or-return
- go-table-test-navigator
- jba/templatecheck
- OCP-VS-YAGNI
- github.com/urfave/cli
- CatBoost
- XGBoost
- LightGBM
- https://github.com/uber-go/nilaway
.env
Register an application to obtain an api_id and api_hash
# ./config/.private/.env BUDVA43__TELEGRAM__API_ID=1234567 BUDVA43__TELEGRAM__API_HASH=XXXXXXX BUDVA43__TELEGRAM__PHONE_NUMBER=+78901234567
Config example
./config/app.yml ./config/engine.yml
First start for Telegram auth
$ task engine $ task facade
Examples for go-tdlib
Details
// How to add InlineKeyboardButton row := make([]*client.InlineKeyboardButton, 0) row = append(row, &client.InlineKeyboardButton{ Text: "123", Type: &client.InlineKeyboardButtonTypeUrl{ Url: "https://google.com", }, }) rows := make([][]*client.InlineKeyboardButton, 0) rows = append(rows, row) _, err := tdlibClient.SendMessage(&client.SendMessageRequest{ ChatId: dstChatId, InputMessageContent: &client.InputMessageText{ Text: formattedText, DisableWebPagePreview: true, ClearDraft: true, }, ReplyMarkup: &client.ReplyMarkupInlineKeyboard{ Rows: rows, }, })
Inspired by
- marperia/fwdbot
- wcsiu/telegram-client-demo + article
- Создание и развертывание ретранслятора Telegram каналов, используя Python и Heroku
Filters Mode for Forward...
Exclude #COIN
Include #TSLA
case #COIN
Check +
Other -
To -
case #TSLA
Check -
Other -
To +
case #ARK
Check -
Other +
To -
Test-plan for Config...
- Text
- Forward.SendCopy (or forward)
- and edit sync for double copy
- Forward.CopyOnce (edit sync)
- Forward.Indelible (delete sync)
- Filters Mode (see above)
- Forward.IncludeSubmatch
- ReplaceMyselfLinks + DeleteExternal
- ReplaceFragments (and not equal len)
- Sources.Link + Title
- Sources.Sign
- AutoAnswers
- MediaAlbum
- Forward.SendCopy (or forward)
- Forward.CopyOnce (edit sync)
- Forward.Indelible (delete sync)
Task Autocompletion
To enable command autocompletion in Task, add to your ~/.zshrc:
# Task completion eval "$(task --completion zsh)"
Then reload your shell:
Or restart your terminal.
Now when you type task and press Tab, you'll get a list of available tasks.