{"id":29840827,"url":"https://github.com/tikerlade/saveleisure","last_synced_at":"2025-07-29T14:32:55.186Z","repository":{"id":55474507,"uuid":"300739545","full_name":"tikerlade/SaveLeisure","owner":"tikerlade","description":"Telegram bot that will save interesting information that you send to it and which you want to read / watch later. Such information as a blogpost, film, book. ","archived":false,"fork":false,"pushed_at":"2021-01-11T16:35:35.000Z","size":4875,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2023-05-19T13:27:35.466Z","etag":null,"topics":["black","bot","python","telegram-bot","travis-ci"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tikerlade.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-10-02T21:25:51.000Z","updated_at":"2020-12-19T10:12:42.000Z","dependencies_parsed_at":"2022-08-15T01:10:36.562Z","dependency_job_id":null,"html_url":"https://github.com/tikerlade/SaveLeisure","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/tikerlade/SaveLeisure","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikerlade%2FSaveLeisure","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikerlade%2FSaveLeisure/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikerlade%2FSaveLeisure/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikerlade%2FSaveLeisure/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tikerlade","download_url":"https://codeload.github.com/tikerlade/SaveLeisure/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikerlade%2FSaveLeisure/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267703088,"owners_count":24130464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["black","bot","python","telegram-bot","travis-ci"],"created_at":"2025-07-29T14:32:51.827Z","updated_at":"2025-07-29T14:32:55.160Z","avatar_url":"https://github.com/tikerlade.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\n# [SaveLeisure](http://t.me/SaveLeisureBot) :robot:\n\n[comment]: \u003c\u003e ([![codecov]\u0026#40;https://codecov.io/gh/tikerlade/SaveLeisure/branch/main/graph/badge.svg?token=I8T7ALFRTX\u0026#41;]\u0026#40;https://codecov.io/gh/tikerlade/SaveLeisure\u0026#41;)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\n\n\nTelegram bot that will save interesting information that you send to it and which you want to read / watch later. Such information as a blogpost :page_with_curl:, film :movie_camera: or book :books:.\n\n\u003cimg src=\"https://github.com/tikerlade/SaveLeisure/blob/main/pics/adding_item.gif\" width=\"243\" height=\"500\"\u003e\n\n## Current stage :watch:\nThis is a bot :robot: for automation your basic routine of sending staff that you want to read :soon: to your **Saved Messages** which will shortly become a mess :dizzy_face: where you can't find anything.\n\nAll functions listed below except `Forwarding` are reachable from inline keyboads after `/start` command or texting to bot.\n\n* `Forwarding` - forward article that you like to bot and save it with appropriate category\n* `/start` - start a conversation with this bot\\n\"\n* `/help` - here you are\\n\"\n* `/new` - add new item to your list\\n\"\n* `/get` - get items from your added items\\n\"\n* `/unread` - mark listed items as unread\\n\"\n* `/stats` - will give you general statistics\\n\"\n* `/end` - end current conversation\\n\\n\"\n* `/new` \u0026 `/get` will give you options :gear_selector: to set everything as you need.\\n\\n\"\n\n\":warning: Developing is still in progress :warning:\"\n\n## Running locally :computer:\nTo run this bot locally you need to\n\n```shell script\ngit clone https://github.com/tikerlade/SaveLeisure.git\ncd SaveLeisure\npython -m venv env\nsource env/bin/activate\npip install -r requirements.txt\n// Here initialize database\npython bot/main.py --local\n```\n\n1. Clone this repository\n2. Enable virtual environment \u0026 install requirements\n3. :warning: Initialize database\n4. :warning: Run bot with local parameter\n\n\n\u003e Bot :robot: is available by the following [link](http://t.me/SaveLeisureBot)\n\n## Конструирование ПО\n**Определение проблемы**\n\nВ мессенджере Telegram все нужные сообщения можно сохранять в отдельный диалог *Saved Messages*. Также туда можно загрузить неограниченное количество файлов, то есть мессенджер предоставляет бесконечное облако. \n\nМногие люди пользуются этой функцией, пересылая сообщения в этот диалог, чтобы в будущем снова к ним обратиться. Зачастую, на поиск нужного сообщения в диалоге уходит очень много времени.  \n\nРешить эту проблему поможет Telegram бот, который расширяет функционал диалога *Saved Messages*. Мы можем отправить/переслать боту сообщение (это может быть название книги, ссылка на статью, фильм и так далее), а он спросит нас, к какой категории относится это сообщение, и сохранит данные. Когда нам снова захочется обратиться к данным, мы можем запросить их у бота, выбрав категорию и количество пересланных сообщений.\n\n**Выработка требований**\n\nПользовательские истории:\n\n 1. Я как пользователь Telegram, узнав об интересном фильме/книге или узнав полезную информацию, хочу сохранить название или сделать заметку соответственно, чтобы в нужный момент легко найти фильм/книгу или интересующую запись.\n 2. Как пользователь Telegram, которому написали название фильма/книги, заинтересовав при этом описанием, я хочу сохранить название, переслав сообщение в диалог с ботом SaveLeisure, чтобы после быстро найти интересующий фильм или книгу, не вспоминая слова, по которым можно отыскать это в диалоге с человеком.\n\n**Разработка архитектуры и детальное проектирование**\n\n 1. System Context diagram\n\u003cimg src=\"https://i.imgur.com/FbwfdM5.png\" width=\"161\" height=\"471\"\u003e\n\n 2. Container diagram\n \u003cimg src=\"https://i.imgur.com/tPhWYWU.png\" width=\"681\" height=\"726\"\u003e\n\n\n\n**Кодирование и отладка**\n\nВесь код написан на языке Python. Использовались следующие технологии:\n* [python-telegram-bot](https://python-telegram-bot.readthedocs.io/en/stable/index.html) - библиотека для написания бота от Telegram\n* [heroku](https://dashboard.heroku.com/apps) - хостинг, для работы бота\n* [PostgreSQL](https://www.postgresql.org/) - база данных\n\n\n\n**Тестирование**\nНекоторые Unit и Integration тесты находятся в директории tests. Их можно собрать и запустить как и любой .py файл.\nТестовые сценарии, которые использовались при мануальном тестировании:\n| # | Action |  Expected result | Status\n| --- | --- | --- | --- |\n| 1 |Открыть бота в первый раз| Бот присылает приветственное сообщение | Passed :heavy_check_mark:\n| 2 | Отправить боту команду /start | Бот присылает содержимое команды /help - полезную информацию | Passed :heavy_check_mark:\n| 3 | Отправить боту команду /new или нажать на кнопку Add new item | Бот присылает сообщение, в котором просит выбрать категорию информации, которую мы хотим сохранить | Passed :heavy_check_mark:\n| 4 | Выбрать категорию |  Бот просит отправить ему информацию | Passed :heavy_check_mark:\n| 5 | Отправить боту сообщение | Бот отправляет сообщение о том, что информация сохранена и предлагает дальнейшие действия | Passed :heavy_check_mark:\n| 6 | В главном меню бота выбрать Get my items | Бот предлагает выбрать категорию информации для вывода | Passed :heavy_check_mark:\n| 7 | Выбрать категорию | Бот предлагает ввести количество сообщений, который он должен переслать | Passed :heavy_check_mark:\n| 8 | Ввести количество | Бот пересылает нужное количество сообщений | Passed :heavy_check_mark:\n| 9 | Ввести /unread | Бот не удаляет пересланные сообщения из БД | Passed :heavy_check_mark:\n| 10 | Выйти из бота | Бот присылает сообщение bye-bye | Passed :heavy_check_mark:\n| 11 | Переслать боту сообщение из другого диалога | Бот предлагает выбрать категорию, к которой относится выбранное сообщение | Passed :heavy_check_mark:\n| 12 | Выбрать категорию | Бот сохраняет данные | Passed :heavy_check_mark:\n| 13 | Нажать на кнопку Information или ввести /info | Бот сохраняет данные | Passed :heavy_check_mark:\n\n**Сборка**\n\nЧтобы запустить бота локально, придется немного попотеть :smile:.\n1. Склонировать репозиторий.\n2. Обеспечить виртуально окружение и установить необходимые средства.\n3. Инициализировать базы данных.\n4. Запустить бота с параметром --local.\n```shell script\ngit clone https://github.com/tikerlade/SaveLeisure.git\ncd SaveLeisure\npython -m venv env\nsource env/bin/activate\npip install -r requirements.txt\n// Here initialize database\npython bot/main.py --local\n```\nЧтобы не ломать себе жизнь, можете просто открыть бота по ссылке:\n\u003e Bot :robot: is available by the following [link](http://t.me/SaveLeisureBot)\n\n**Участники проекта**\n| Имя | Telegram | \n| --- | --- |\n| Кузнецов Иван |[@kuznetsof_ivan](http://t.me/kuznetsof_ivan)|\n| Чучин Дмитрий  | [@CapitanJamesFlint](http://t.me/CapitanJamesFlint)|\n| Шевелев Роман | [@rmnshv](http://t.me/rmnshv)| \n| Егоров Матвей | [@mattopewd](http://t.me/mattopewd)| \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftikerlade%2Fsaveleisure","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftikerlade%2Fsaveleisure","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftikerlade%2Fsaveleisure/lists"}