From 768d53de85291895b1d5b726919cb6c2eb4974cc Mon Sep 17 00:00:00 2001 From: Sathyajith Bhat Date: Fri, 30 Jul 2021 20:12:54 +0300 Subject: [PATCH 1/9] cleanup some code --- source-code/chapter-3/python-app/README.md | 5 ----- .../chapter-3/python-app/last_updated.txt | 1 + source-code/chapter-4/exercise-1/README.md | 2 +- source-code/chapter-4/exercise-2/README.md | 2 +- source-code/chapter-4/exercise-3/README.md | 2 +- source-code/chapter-5/exercise-1/README.md | 2 +- .../Dockerfile | 10 ++++----- .../docker-subreddit-fetcher-volume/README.md | 22 ++++++++++++++----- .../constants.py | 14 +++++++----- .../docker-subreddit-fetcher-volume/main.py | 22 ------------------- .../docker-subreddit-fetcher-volume/newsbot | 0 .../telegram.py | 2 +- 12 files changed, 36 insertions(+), 48 deletions(-) create mode 100644 source-code/chapter-3/python-app/last_updated.txt delete mode 100644 source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/main.py delete mode 100644 source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/newsbot diff --git a/source-code/chapter-3/python-app/README.md b/source-code/chapter-3/python-app/README.md index 082e758..4498390 100644 --- a/source-code/chapter-3/python-app/README.md +++ b/source-code/chapter-3/python-app/README.md @@ -19,8 +19,3 @@ Refer to the [book repo](https://github.com/apress/practical-docker-with-python) where `` is the [Telegram Bot API](https://core.telegram.org/bots/api) token - -### Credits - -- [Ken](https://github.com/KenStoneBlue) for letting me know that I didn't add requirements! -- [Karan](https://github.com/mr-karan) for initial work diff --git a/source-code/chapter-3/python-app/last_updated.txt b/source-code/chapter-3/python-app/last_updated.txt new file mode 100644 index 0000000..53ff476 --- /dev/null +++ b/source-code/chapter-3/python-app/last_updated.txt @@ -0,0 +1 @@ +232420721 \ No newline at end of file diff --git a/source-code/chapter-4/exercise-1/README.md b/source-code/chapter-4/exercise-1/README.md index 95dac57..4957d1a 100644 --- a/source-code/chapter-4/exercise-1/README.md +++ b/source-code/chapter-4/exercise-1/README.md @@ -1,3 +1,3 @@ ### README -This exercise contains the source code for the first exercise of chapter 4. At the start of the chapter, we introduced a simple Dockerfile that did not build due to syntax errors. Here, you’ll fix the Dockerfile and add some of the instructions that you learned about in this chapter. +This directory contains the source code for the first exercise of chapter 4. At the start of the chapter, we introduced a simple Dockerfile that did not build due to syntax errors. Here, you’ll fix the Dockerfile and add some of the instructions that you learned about in this chapter. diff --git a/source-code/chapter-4/exercise-2/README.md b/source-code/chapter-4/exercise-2/README.md index d3e955f..05da1fc 100644 --- a/source-code/chapter-4/exercise-2/README.md +++ b/source-code/chapter-4/exercise-2/README.md @@ -1,6 +1,6 @@ ### README -This exercise contains the source code for the second exercise of chapter 4. In this exercise, you will build two Docker images +This directory contains the source code for the second exercise of chapter 4. In this exercise, you will build two Docker images - Using the standard build process using python:3 as the base image (present in [docker-multi-stage/standard-build](docker-multi-stage/standard-build) directory. - Using Multi-Stage builds (present [docker-multi-stage/multistage-build](docker-multi-stage/multistage-build) directory. diff --git a/source-code/chapter-4/exercise-3/README.md b/source-code/chapter-4/exercise-3/README.md index 82bdd0b..295e28e 100644 --- a/source-code/chapter-4/exercise-3/README.md +++ b/source-code/chapter-4/exercise-3/README.md @@ -1,6 +1,6 @@ ### README -This exercise contains the source code for the third exercise of chapter 4. In this exercise, we compose a Dockerfile for Newsbot and then use the Dockerfile to build a Docker image and run the container. +This directory contains the source code for the third exercise of chapter 4. In this exercise, we compose a Dockerfile for Newsbot and then use the Dockerfile to build a Docker image and run the container. ### Building the Docker image diff --git a/source-code/chapter-5/exercise-1/README.md b/source-code/chapter-5/exercise-1/README.md index ab610e7..9bc786e 100644 --- a/source-code/chapter-5/exercise-1/README.md +++ b/source-code/chapter-5/exercise-1/README.md @@ -1,3 +1,3 @@ ### README -This exercise contains the source code for the first exercise of chapter 5. In this exercise, we build an nginx Docker image with a Docker volume attached, which contains a custom nginx configuration. Toward the second part of the exercise, we will attach a bind mount and a volume containing a static web page and a custom nginx configuration. The intent of the exercise is help the readers understand how to leverage volumes and bind mounts to make local development easy. +This directory contains the source code for the first exercise of chapter 5. In this exercise, we build an nginx Docker image with a Docker volume attached, which contains a custom nginx configuration. Toward the second part of the exercise, we will attach a bind mount and a volume containing a static web page and a custom nginx configuration. The intent of the exercise is help the readers understand how to leverage volumes and bind mounts to make local development easy. diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/Dockerfile b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/Dockerfile index 719519f..d7cfaa0 100644 --- a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/Dockerfile +++ b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/Dockerfile @@ -1,15 +1,13 @@ FROM python:3-alpine RUN apk add gcc musl-dev python3-dev libffi-dev openssl-dev - -COPY * /apps/subredditfetcher/ WORKDIR /apps/subredditfetcher/ +COPY . . -RUN ["mkdir", "/apps/subredditfetcher/data/"] -RUN ["pip", "install", "-r", "requirements.txt"] -RUN ["python", "one_time.py"] +RUN mkdir -p /apps/subredditfetcher/data/ && \ + pip install -r requirements.txt && \ + python one_time.py VOLUME [ "/apps/subredditfetcher/data" ] -ENV NBT_ACCESS_TOKEN="495637361:AAHIhiDTX1UeX17KJy0-FsMZEqEtCFYfcP8" CMD ["python", "newsbot.py"] diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/README.md b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/README.md index 0aea875..4498390 100644 --- a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/README.md +++ b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/README.md @@ -1,9 +1,21 @@ -[![Stories in Ready](https://badge.waffle.io/SathyaBhat/themnewsbot.png?label=ready&title=Ready)](https://waffle.io/SathyaBhat/themnewsbot) # themnewsbot -News bot for telegram : https://web.telegram.org/#/im?p=@ThemNewsBot
-Bot posts top submissions from a subreddit +Telegram bot which fetches Bot posts top submissions from a subreddit. NewsBot is used to demo a short, simple Python project in my book, [Practical Docker With Python](https://www.apress.com/gp/book/9781484237830). -ToDo : +Refer to the [book repo](https://github.com/apress/practical-docker-with-python) for other exercises using this code. + +### Getting started + +- Clone the repo or download the code +- Install the requirements with pip + + pip3 install -r requirements.txt + +- Set the environment variable `NBT_ACCESS_TOKEN` where the value is the Bot token generated using Telegram BotFather. + - See instructions on how to generate the token in Chapter 3 or [refer to this guide](https://core.telegram.org/bots/api#authorizing-your-bot) + - See this guide on [how to set environment variables](https://core.telegram.org/bots/api#authorizing-your-bot) +- Start the bot + python newsbot.py + +where `` is the [Telegram Bot API](https://core.telegram.org/bots/api) token -- Check our [waffle board](https://waffle.io/SathyaBhat/themnewsbot) diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/constants.py b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/constants.py index cb189fe..092cde6 100644 --- a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/constants.py +++ b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/constants.py @@ -1,11 +1,15 @@ __author__ = 'Sathyajith' -import os +from os import environ +from sys import exit ERR_NO_SOURCE = 'No sources defined! Set a source using /source list, of, sub, reddits' skip_list = [] sources_dict = {} +UPDATE_PERIOD = 1 +FALSE_RESPONSE = {"ok": False} -BOT_KEY = os.environ['NBT_ACCESS_TOKEN'] -API_BASE = 'https://api.telegram.org/bot' -UPDATE_PERIOD = 6 -FALSE_RESPONSE = {"ok": False} \ No newline at end of file +BOT_KEY = environ.get('NBT_ACCESS_TOKEN') +if not BOT_KEY: + print("Telegram access token not set, exiting.") + exit(1) +API_BASE = f'https://api.telegram.org/bot{BOT_KEY}' \ No newline at end of file diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/main.py b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/main.py deleted file mode 100644 index bacc165..0000000 --- a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/main.py +++ /dev/null @@ -1,22 +0,0 @@ -from flask import Flask -from newsbot import * -from states import States - -bot = Flask(__name__) - - -@bot.route('/index') -def index(): - return 'Thou shalt not pass!' - - -@bot.route('/telegram-update', methods=['POST']) -def telegram_update(): - handle_incoming_messages(States.last_updated_id) - - -if __name__ == '__main__': - States.last_updated_id = get_last_updated() - bot.run() - - diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/newsbot b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/newsbot deleted file mode 100644 index e69de29..0000000 diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/telegram.py b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/telegram.py index 766e9e3..0ce8c39 100644 --- a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/telegram.py +++ b/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/telegram.py @@ -13,7 +13,7 @@ def get_updates(last_updated): - log.debug('Checking for requests, last updated passed is: {}'.format(last_updated)) + log.debug(f'Checking for requests, last updated passed is: {last_updated}') sleep(UPDATE_PERIOD) response = requests.get(API_BASE + BOT_KEY + '/getUpdates', params={'offset': last_updated+1}) json_response = FALSE_RESPONSE From 8056cc0e5951e7bc431575c046d0090758ba0c03 Mon Sep 17 00:00:00 2001 From: Sathyajith Bhat Date: Fri, 30 Jul 2021 20:13:16 +0300 Subject: [PATCH 2/9] rename dir --- .../Dockerfile | 0 .../LICENSE | 0 .../README.md | 0 .../constants.py | 0 .../data/newsbot.db | Bin .../last_updated.txt | 0 .../models.py | 0 .../newsbot.py | 0 .../one_time.py | 0 .../reddit.py | 0 .../requirements.txt | 0 .../states.py | 0 .../telegram.py | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/Dockerfile (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/LICENSE (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/README.md (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/constants.py (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/data/newsbot.db (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/last_updated.txt (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/models.py (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/newsbot.py (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/one_time.py (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/reddit.py (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/requirements.txt (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/states.py (100%) rename source-code/chapter-5/exercise-2/{docker-subreddit-fetcher-volume => newsbot}/telegram.py (100%) diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/Dockerfile b/source-code/chapter-5/exercise-2/newsbot/Dockerfile similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/Dockerfile rename to source-code/chapter-5/exercise-2/newsbot/Dockerfile diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/LICENSE b/source-code/chapter-5/exercise-2/newsbot/LICENSE similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/LICENSE rename to source-code/chapter-5/exercise-2/newsbot/LICENSE diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/README.md b/source-code/chapter-5/exercise-2/newsbot/README.md similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/README.md rename to source-code/chapter-5/exercise-2/newsbot/README.md diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/constants.py b/source-code/chapter-5/exercise-2/newsbot/constants.py similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/constants.py rename to source-code/chapter-5/exercise-2/newsbot/constants.py diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/data/newsbot.db b/source-code/chapter-5/exercise-2/newsbot/data/newsbot.db similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/data/newsbot.db rename to source-code/chapter-5/exercise-2/newsbot/data/newsbot.db diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/last_updated.txt b/source-code/chapter-5/exercise-2/newsbot/last_updated.txt similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/last_updated.txt rename to source-code/chapter-5/exercise-2/newsbot/last_updated.txt diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/models.py b/source-code/chapter-5/exercise-2/newsbot/models.py similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/models.py rename to source-code/chapter-5/exercise-2/newsbot/models.py diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/newsbot.py b/source-code/chapter-5/exercise-2/newsbot/newsbot.py similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/newsbot.py rename to source-code/chapter-5/exercise-2/newsbot/newsbot.py diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/one_time.py b/source-code/chapter-5/exercise-2/newsbot/one_time.py similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/one_time.py rename to source-code/chapter-5/exercise-2/newsbot/one_time.py diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/reddit.py b/source-code/chapter-5/exercise-2/newsbot/reddit.py similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/reddit.py rename to source-code/chapter-5/exercise-2/newsbot/reddit.py diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/requirements.txt b/source-code/chapter-5/exercise-2/newsbot/requirements.txt similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/requirements.txt rename to source-code/chapter-5/exercise-2/newsbot/requirements.txt diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/states.py b/source-code/chapter-5/exercise-2/newsbot/states.py similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/states.py rename to source-code/chapter-5/exercise-2/newsbot/states.py diff --git a/source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/telegram.py b/source-code/chapter-5/exercise-2/newsbot/telegram.py similarity index 100% rename from source-code/chapter-5/exercise-2/docker-subreddit-fetcher-volume/telegram.py rename to source-code/chapter-5/exercise-2/newsbot/telegram.py From 4a8fb0669357789160d569dbf7599bcafcfa6cf6 Mon Sep 17 00:00:00 2001 From: Sathyajith Bhat Date: Fri, 30 Jul 2021 23:48:43 +0300 Subject: [PATCH 3/9] clean up code --- .../chapter-5/exercise-2/newsbot/Dockerfile | 8 +--- .../chapter-5/exercise-2/newsbot/newsbot.py | 7 ++-- .../chapter-5/exercise-2/newsbot/one_time.py | 4 -- .../chapter-5/exercise-2/newsbot/reddit.py | 17 +++------ .../exercise-2/newsbot/requirements.txt | 2 +- .../chapter-5/exercise-2/newsbot/states.py | 3 +- .../chapter-5/exercise-2/newsbot/telegram.py | 37 ++++++++++--------- 7 files changed, 34 insertions(+), 44 deletions(-) diff --git a/source-code/chapter-5/exercise-2/newsbot/Dockerfile b/source-code/chapter-5/exercise-2/newsbot/Dockerfile index d7cfaa0..7590f98 100644 --- a/source-code/chapter-5/exercise-2/newsbot/Dockerfile +++ b/source-code/chapter-5/exercise-2/newsbot/Dockerfile @@ -4,10 +4,6 @@ RUN apk add gcc musl-dev python3-dev libffi-dev openssl-dev WORKDIR /apps/subredditfetcher/ COPY . . -RUN mkdir -p /apps/subredditfetcher/data/ && \ - pip install -r requirements.txt && \ - python one_time.py - -VOLUME [ "/apps/subredditfetcher/data" ] - +RUN pip install -r requirements.txt +VOLUME ["/data"] CMD ["python", "newsbot.py"] diff --git a/source-code/chapter-5/exercise-2/newsbot/newsbot.py b/source-code/chapter-5/exercise-2/newsbot/newsbot.py index 1314864..09ba5b0 100644 --- a/source-code/chapter-5/exercise-2/newsbot/newsbot.py +++ b/source-code/chapter-5/exercise-2/newsbot/newsbot.py @@ -1,6 +1,6 @@ from states import States, log from telegram import handle_incoming_messages - +from one_time import create_tables def get_last_updated(): try: @@ -12,13 +12,14 @@ def get_last_updated(): f.close() except FileNotFoundError: last_updated = 0 - log.debug('Last updated id: {0}'.format(last_updated)) + log.debug(f'Last updated id: {last_updated}') return last_updated if __name__ == '__main__': try: - log.debug('Starting up') + log.info('Starting newsbot') + create_tables() States.last_updated = get_last_updated() while True: handle_incoming_messages(States.last_updated) diff --git a/source-code/chapter-5/exercise-2/newsbot/one_time.py b/source-code/chapter-5/exercise-2/newsbot/one_time.py index f7074d9..acc9a43 100644 --- a/source-code/chapter-5/exercise-2/newsbot/one_time.py +++ b/source-code/chapter-5/exercise-2/newsbot/one_time.py @@ -1,11 +1,7 @@ from models import * - def create_tables(): db.connect() db.create_tables([Source, Request, Message], True) db.close() - -if __name__ == '__main__': - create_tables() diff --git a/source-code/chapter-5/exercise-2/newsbot/reddit.py b/source-code/chapter-5/exercise-2/newsbot/reddit.py index 31f8dff..7f065eb 100644 --- a/source-code/chapter-5/exercise-2/newsbot/reddit.py +++ b/source-code/chapter-5/exercise-2/newsbot/reddit.py @@ -4,35 +4,30 @@ __author__ = 'Sathyajith' -def summarize(url): - log.info('Not yet implemented!') - return url - - def get_latest_news(sub_reddits): log.debug('Fetching news from reddit') - r = praw.Reddit(user_agent='SubReddit Newsfetcher Bot', + r = praw.Reddit(user_agent='NewsBot', client_id='ralalsYuEJXKDg', client_secret="16DD-6O7VVaYVMlkUPZWLhdluhU") r.read_only = True # Can change the subreddit or add more. sub_reddits = clean_up_subreddits(sub_reddits) - log.info('Fetching subreddits: {0}'.format(sub_reddits)) + log.info('Fetching subreddits: {sub_reddits}') submissions = r.subreddit(sub_reddits).hot(limit=5) submission_content = '' try: for post in submissions: - submission_content += summarize(post.title + ' - ' + post.url) + '\n\n' + submission_content += post.title + ' - ' + post.url + '\n\n' except praw.errors.Forbidden: - log.debug('subreddit {0} is private'.format(sub_reddits)) + log.debug(f'subreddit {sub_reddits} is private') submission_content = "Sorry couldn't fetch; subreddit is private" except praw.errors.InvalidSubreddit: - log.debug('Subreddit {} is invalid or doesn''t exist.'.format(sub_reddits)) + log.debug(f'Subreddit {sub_reddits} is invalid or doesn''t exist') submission_content = "Sorry couldn't fetch; subreddit doesn't seem to exist" return submission_content def clean_up_subreddits(sub_reddits): - log.debug('Got subreddits to clean: {0}'.format(sub_reddits)) + log.debug(f'Got subreddits to clean: {sub_reddits}') return sub_reddits.strip().replace(" ", "").replace(',', '+') diff --git a/source-code/chapter-5/exercise-2/newsbot/requirements.txt b/source-code/chapter-5/exercise-2/newsbot/requirements.txt index 7a49e7e..a78486a 100644 --- a/source-code/chapter-5/exercise-2/newsbot/requirements.txt +++ b/source-code/chapter-5/exercise-2/newsbot/requirements.txt @@ -1,2 +1,2 @@ -praw peewee==2.10.2 +praw==7.4.0 \ No newline at end of file diff --git a/source-code/chapter-5/exercise-2/newsbot/states.py b/source-code/chapter-5/exercise-2/newsbot/states.py index ff7daaa..09f3904 100644 --- a/source-code/chapter-5/exercise-2/newsbot/states.py +++ b/source-code/chapter-5/exercise-2/newsbot/states.py @@ -4,7 +4,6 @@ class States(object): last_updated_id = '' -logging.basicConfig(level=logging.DEBUG, +logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(asctime)s - %(funcName)s - %(message)s') - log = logging.getLogger('nbt') \ No newline at end of file diff --git a/source-code/chapter-5/exercise-2/newsbot/telegram.py b/source-code/chapter-5/exercise-2/newsbot/telegram.py index 0ce8c39..2b29297 100644 --- a/source-code/chapter-5/exercise-2/newsbot/telegram.py +++ b/source-code/chapter-5/exercise-2/newsbot/telegram.py @@ -13,9 +13,9 @@ def get_updates(last_updated): - log.debug(f'Checking for requests, last updated passed is: {last_updated}') + log.debug('Checking for requests, last updated passed is: {last_updated}') sleep(UPDATE_PERIOD) - response = requests.get(API_BASE + BOT_KEY + '/getUpdates', params={'offset': last_updated+1}) + response = requests.get(f"{API_BASE}/getUpdates", params={'offset': last_updated+1}) json_response = FALSE_RESPONSE if response.status_code != 200: # wait for a bit, try again @@ -26,14 +26,14 @@ def get_updates(last_updated): except ValueError: sleep(UPDATE_PERIOD*20) get_updates(last_updated) - log.info('received response: {}'.format(json_response)) + log.info(f"received response: {json_response}") return json_response def post_message(chat_id, text): - log.info('posting {} to {}'.format(text, chat_id)) + log.debug(f"posting {text} to {chat_id}") payload = {'chat_id': chat_id, 'text': text} - requests.post(API_BASE + BOT_KEY + '/sendMessage', data=payload) + requests.post(f"{API_BASE}/sendMessage", data=payload) def handle_incoming_messages(last_updated): @@ -41,7 +41,10 @@ def handle_incoming_messages(last_updated): split_chat_text = [] if r['ok']: for req in r['result']: - chat_sender_id = req['message']['chat']['id'] + if 'message' in req: + chat_sender_id = req['message']['chat']['id'] + else: + chat_sender_id = req['edited_message']['chat']['id'] try: chat_text = req['message']['text'] split_chat_text = chat_text.split() @@ -49,33 +52,34 @@ def handle_incoming_messages(last_updated): chat_text = '' split_chat_text.append(chat_text) log.debug('Looks like no chat text was detected... moving on') - try: + + if 'message' in req: person_id = req['message']['from']['id'] - except KeyError: - pass + else: + person_id = req['edited_message']['from']['id'] - log.info('Chat text received: {0}'.format(chat_text)) + log.info(f"Chat text received: {chat_text}") r = re.search('(source+)(.*)', chat_text) if (r is not None and r.group(1) == 'source'): if r.group(2): sources_dict[person_id] = r.group(2) - log.info('Sources set for {0} to {1}'.format(person_id, sources_dict[person_id])) + log.info(f'Sources set for {person_id} to {sources_dict[person_id]}') with db.atomic() as txn: try: sources = Source.create(person_id=person_id, fetch_from=sources_dict[person_id]) - log.info('Inserted row id: {0}'.format(sources.person_id)) + log.debug(f'Inserted row id: {sources.person_id}') except peewee.IntegrityError: sources = Source.update(fetch_from=sources_dict[person_id]).where(person_id == person_id) rows_updated = sources.execute() - log.info('Updated {0} rows, query obj {1}'.format(rows_updated, sources)) + log.info(f'Updated {rows_updated} rows') txn.commit() post_message(person_id, 'Sources set as {0}!'.format(r.group(2))) else: post_message(person_id, 'We need a comma separated list of subreddits! No subreddit, no news :-(') if chat_text == '/stop': - log.debug('Added {0} to skip list'.format(chat_sender_id)) + log.debug(f'Added {chat_sender_id} to skip list') skip_list.append(chat_sender_id) post_message(chat_sender_id, "Ok, we won't send you any more messages.") @@ -83,8 +87,7 @@ def handle_incoming_messages(last_updated): helptext = ''' Hi! This is a News Bot which fetches news from subreddits. Use "/source" to select a subreddit source. Example "/source programming,games" fetches news from r/programming, r/games. - Use "/fetch for the bot to go ahead and fetch the news. At the moment, bot will fetch total of 5 posts from all sub reddits - I will have this configurable soon. + Use "/fetch for the bot to go ahead and fetch the news. At the moment, bot will fetch total of 5 posts from the selected subreddit. ''' post_message(chat_sender_id, helptext) @@ -102,5 +105,5 @@ def handle_incoming_messages(last_updated): f.write(str(last_updated)) States.last_updated = last_updated log.debug( - 'Updated last_updated to {0}'.format(last_updated)) + 'Updated last_updated to {last_updated}') f.close() From f53710e3bc9f3c792578a82ceb06363e020e4281 Mon Sep 17 00:00:00 2001 From: Sathyajith Bhat Date: Fri, 30 Jul 2021 23:50:37 +0300 Subject: [PATCH 4/9] minor corrections to text --- source-code/chapter-3/python-app/telegram.py | 2 +- source-code/chapter-5/exercise-2/newsbot/telegram.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source-code/chapter-3/python-app/telegram.py b/source-code/chapter-3/python-app/telegram.py index f7fb8e5..a6931fb 100644 --- a/source-code/chapter-3/python-app/telegram.py +++ b/source-code/chapter-3/python-app/telegram.py @@ -10,7 +10,7 @@ def get_updates(last_updated): - log.debug('Checking for requests, last updated passed is: {last_updated}') + log.info('Checking for requests, last updated passed is: {last_updated}') sleep(UPDATE_PERIOD) response = requests.get(f"{API_BASE}/getUpdates", params={'offset': last_updated+1}) json_response = FALSE_RESPONSE diff --git a/source-code/chapter-5/exercise-2/newsbot/telegram.py b/source-code/chapter-5/exercise-2/newsbot/telegram.py index 2b29297..d0fa464 100644 --- a/source-code/chapter-5/exercise-2/newsbot/telegram.py +++ b/source-code/chapter-5/exercise-2/newsbot/telegram.py @@ -105,5 +105,5 @@ def handle_incoming_messages(last_updated): f.write(str(last_updated)) States.last_updated = last_updated log.debug( - 'Updated last_updated to {last_updated}') + f'Updated last_updated to {last_updated}') f.close() From 6c4dc030be11b0110edd26d59b7b7d3c57463b11 Mon Sep 17 00:00:00 2001 From: Sathyajith Bhat Date: Mon, 2 Aug 2021 00:15:04 +0300 Subject: [PATCH 5/9] rename dir --- .../Dockerfile | 0 .../LICENSE | 0 .../constants.py | 0 .../docker-compose.yml | 0 .../last_updated.txt | 0 .../main.py | 0 .../models.py | 0 .../newsbot.db | Bin .../newsbot.py | 0 .../one_time.py | 0 .../reddit.py | 0 .../requirements.txt | 0 .../states.py | 0 .../telegram.py | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/Dockerfile (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/LICENSE (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/constants.py (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/docker-compose.yml (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/last_updated.txt (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/main.py (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/models.py (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/newsbot.db (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/newsbot.py (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/one_time.py (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/reddit.py (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/requirements.txt (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/states.py (100%) rename source-code/chapter-6/exercise-1/{docker-subreddit-fetcher-network => newsbot}/telegram.py (100%) diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/Dockerfile b/source-code/chapter-6/exercise-1/newsbot/Dockerfile similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/Dockerfile rename to source-code/chapter-6/exercise-1/newsbot/Dockerfile diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/LICENSE b/source-code/chapter-6/exercise-1/newsbot/LICENSE similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/LICENSE rename to source-code/chapter-6/exercise-1/newsbot/LICENSE diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/constants.py b/source-code/chapter-6/exercise-1/newsbot/constants.py similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/constants.py rename to source-code/chapter-6/exercise-1/newsbot/constants.py diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/docker-compose.yml b/source-code/chapter-6/exercise-1/newsbot/docker-compose.yml similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/docker-compose.yml rename to source-code/chapter-6/exercise-1/newsbot/docker-compose.yml diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/last_updated.txt b/source-code/chapter-6/exercise-1/newsbot/last_updated.txt similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/last_updated.txt rename to source-code/chapter-6/exercise-1/newsbot/last_updated.txt diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/main.py b/source-code/chapter-6/exercise-1/newsbot/main.py similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/main.py rename to source-code/chapter-6/exercise-1/newsbot/main.py diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/models.py b/source-code/chapter-6/exercise-1/newsbot/models.py similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/models.py rename to source-code/chapter-6/exercise-1/newsbot/models.py diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/newsbot.db b/source-code/chapter-6/exercise-1/newsbot/newsbot.db similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/newsbot.db rename to source-code/chapter-6/exercise-1/newsbot/newsbot.db diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/newsbot.py b/source-code/chapter-6/exercise-1/newsbot/newsbot.py similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/newsbot.py rename to source-code/chapter-6/exercise-1/newsbot/newsbot.py diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/one_time.py b/source-code/chapter-6/exercise-1/newsbot/one_time.py similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/one_time.py rename to source-code/chapter-6/exercise-1/newsbot/one_time.py diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/reddit.py b/source-code/chapter-6/exercise-1/newsbot/reddit.py similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/reddit.py rename to source-code/chapter-6/exercise-1/newsbot/reddit.py diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/requirements.txt b/source-code/chapter-6/exercise-1/newsbot/requirements.txt similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/requirements.txt rename to source-code/chapter-6/exercise-1/newsbot/requirements.txt diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/states.py b/source-code/chapter-6/exercise-1/newsbot/states.py similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/states.py rename to source-code/chapter-6/exercise-1/newsbot/states.py diff --git a/source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/telegram.py b/source-code/chapter-6/exercise-1/newsbot/telegram.py similarity index 100% rename from source-code/chapter-6/exercise-1/docker-subreddit-fetcher-network/telegram.py rename to source-code/chapter-6/exercise-1/newsbot/telegram.py From 5cb78764ce5032ac4d768621e324925310d3d72d Mon Sep 17 00:00:00 2001 From: Sathyajith Bhat Date: Sun, 8 Aug 2021 22:35:25 +0300 Subject: [PATCH 6/9] chapters 6 & 7 revamped --- .../chapter-5/exercise-2/newsbot/telegram.py | 3 +- .../chapter-6/exercise-1/newsbot/Dockerfile | 12 +- .../chapter-6/exercise-1/newsbot/constants.py | 14 ++- .../exercise-1/newsbot/docker-compose.yml | 23 ---- .../chapter-6/exercise-1/newsbot/main.py | 22 ---- .../chapter-6/exercise-1/newsbot/models.py | 6 +- .../chapter-6/exercise-1/newsbot/newsbot.py | 17 ++- .../chapter-6/exercise-1/newsbot/one_time.py | 11 -- .../chapter-6/exercise-1/newsbot/reddit.py | 17 +-- .../exercise-1/newsbot/requirements.txt | 3 +- .../chapter-6/exercise-1/newsbot/telegram.py | 53 +++++---- .../docker-compose-adminer/Dockerfile | 13 --- .../exercise-1/docker-compose-adminer/LICENSE | 22 ---- .../docker-compose-adminer/constants.py | 11 -- .../docker-compose-adminer/docker-compose.yml | 37 +++---- .../docker-compose-adminer/last_updated.txt | 1 - .../exercise-1/docker-compose-adminer/main.py | 22 ---- .../docker-compose-adminer/models.py | 24 ---- .../docker-compose-adminer/newsbot.db | Bin 24576 -> 0 bytes .../docker-compose-adminer/newsbot.py | 46 -------- .../docker-compose-adminer/one_time.py | 11 -- .../docker-compose-adminer/reddit.py | 38 ------- .../docker-compose-adminer/requirements.txt | 3 - .../docker-compose-adminer/states.py | 10 -- .../docker-compose-adminer/telegram.py | 103 ------------------ 25 files changed, 78 insertions(+), 444 deletions(-) delete mode 100644 source-code/chapter-6/exercise-1/newsbot/docker-compose.yml delete mode 100644 source-code/chapter-6/exercise-1/newsbot/main.py delete mode 100644 source-code/chapter-6/exercise-1/newsbot/one_time.py delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/Dockerfile delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/LICENSE delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/constants.py delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/last_updated.txt delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/main.py delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/models.py delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/newsbot.db delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/newsbot.py delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/one_time.py delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/reddit.py delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/requirements.txt delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/states.py delete mode 100644 source-code/chapter-7/exercise-1/docker-compose-adminer/telegram.py diff --git a/source-code/chapter-5/exercise-2/newsbot/telegram.py b/source-code/chapter-5/exercise-2/newsbot/telegram.py index d0fa464..0a5bcb2 100644 --- a/source-code/chapter-5/exercise-2/newsbot/telegram.py +++ b/source-code/chapter-5/exercise-2/newsbot/telegram.py @@ -74,7 +74,6 @@ def handle_incoming_messages(last_updated): rows_updated = sources.execute() log.info(f'Updated {rows_updated} rows') txn.commit() - post_message(person_id, 'Sources set as {0}!'.format(r.group(2))) else: post_message(person_id, 'We need a comma separated list of subreddits! No subreddit, no news :-(') @@ -98,7 +97,7 @@ def handle_incoming_messages(last_updated): summarized_news = get_latest_news(sub_reddits) post_message(person_id, summarized_news) except peewee.DoesNotExist: - post_message(person_id, 'Could not find a saved subreddit, please try setting sources with /source') + post_message(person_id, ERR_NO_SOURCE) last_updated = req['update_id'] with open('last_updated.txt', 'w') as f: diff --git a/source-code/chapter-6/exercise-1/newsbot/Dockerfile b/source-code/chapter-6/exercise-1/newsbot/Dockerfile index b92eb0d..7d69914 100644 --- a/source-code/chapter-6/exercise-1/newsbot/Dockerfile +++ b/source-code/chapter-6/exercise-1/newsbot/Dockerfile @@ -1,11 +1,9 @@ FROM python:3-alpine -RUN apk add gcc musl-dev python3-dev libffi-dev openssl-dev -COPY * /apps/subredditfetcher/ -WORKDIR /apps/subredditfetcher/ - -VOLUME [ "/apps/subredditfetcher" ] -RUN ["pip", "install", "-r", "requirements.txt"] -ENV NBT_ACCESS_TOKEN="495637361:AAHIhiDTX1UeX17KJy0-FsMZEqEtCFYfcP8" +RUN apk add gcc musl-dev python3-dev libffi-dev openssl-dev cargo +WORKDIR /apps/subredditfetcher/ +COPY . . +RUN pip install --upgrade pip && pip install -r requirements.txt +VOLUME ["/data"] CMD ["python", "newsbot.py"] diff --git a/source-code/chapter-6/exercise-1/newsbot/constants.py b/source-code/chapter-6/exercise-1/newsbot/constants.py index cb189fe..092cde6 100644 --- a/source-code/chapter-6/exercise-1/newsbot/constants.py +++ b/source-code/chapter-6/exercise-1/newsbot/constants.py @@ -1,11 +1,15 @@ __author__ = 'Sathyajith' -import os +from os import environ +from sys import exit ERR_NO_SOURCE = 'No sources defined! Set a source using /source list, of, sub, reddits' skip_list = [] sources_dict = {} +UPDATE_PERIOD = 1 +FALSE_RESPONSE = {"ok": False} -BOT_KEY = os.environ['NBT_ACCESS_TOKEN'] -API_BASE = 'https://api.telegram.org/bot' -UPDATE_PERIOD = 6 -FALSE_RESPONSE = {"ok": False} \ No newline at end of file +BOT_KEY = environ.get('NBT_ACCESS_TOKEN') +if not BOT_KEY: + print("Telegram access token not set, exiting.") + exit(1) +API_BASE = f'https://api.telegram.org/bot{BOT_KEY}' \ No newline at end of file diff --git a/source-code/chapter-6/exercise-1/newsbot/docker-compose.yml b/source-code/chapter-6/exercise-1/newsbot/docker-compose.yml deleted file mode 100644 index 2c0a4e5..0000000 --- a/source-code/chapter-6/exercise-1/newsbot/docker-compose.yml +++ /dev/null @@ -1,23 +0,0 @@ -version: '3' -services: - app: - build: . - depends_on: - - mysql - restart: "on-failure" - volumes: - - "appdata:/apps/subredditfetcher" - mysql: - image: mysql - volumes: - - "dbdata:/var/lib/mysql" - environment: - - MYSQL_ROOT_PASSWORD=dontusethisinprod - adminer: - image: adminer - ports: - - "8080:8080" - -volumes: - dbdata: - appdata: diff --git a/source-code/chapter-6/exercise-1/newsbot/main.py b/source-code/chapter-6/exercise-1/newsbot/main.py deleted file mode 100644 index bacc165..0000000 --- a/source-code/chapter-6/exercise-1/newsbot/main.py +++ /dev/null @@ -1,22 +0,0 @@ -from flask import Flask -from newsbot import * -from states import States - -bot = Flask(__name__) - - -@bot.route('/index') -def index(): - return 'Thou shalt not pass!' - - -@bot.route('/telegram-update', methods=['POST']) -def telegram_update(): - handle_incoming_messages(States.last_updated_id) - - -if __name__ == '__main__': - States.last_updated_id = get_last_updated() - bot.run() - - diff --git a/source-code/chapter-6/exercise-1/newsbot/models.py b/source-code/chapter-6/exercise-1/newsbot/models.py index a7834ba..ec73558 100644 --- a/source-code/chapter-6/exercise-1/newsbot/models.py +++ b/source-code/chapter-6/exercise-1/newsbot/models.py @@ -1,6 +1,8 @@ -from peewee import * -# db = SqliteDatabase('newsbot.db') +from peewee import Model, PrimaryKeyField, IntegerField, CharField, DateTimeField, MySQLDatabase + + db = MySQLDatabase(host="mysql", port=3306, user="root", password="dontusethisinprod", database="newsbot") + class BaseModel(Model): class Meta: database = db diff --git a/source-code/chapter-6/exercise-1/newsbot/newsbot.py b/source-code/chapter-6/exercise-1/newsbot/newsbot.py index 659bc41..020aba5 100644 --- a/source-code/chapter-6/exercise-1/newsbot/newsbot.py +++ b/source-code/chapter-6/exercise-1/newsbot/newsbot.py @@ -2,8 +2,7 @@ from telegram import handle_incoming_messages from models import * from time import sleep - -import sys +from peewee import OperationalError import pymysql @@ -28,14 +27,12 @@ def get_last_updated(): log.info('Checking on dbs') try: db.connect() - except OperationalError as o: - print("Could not connect to db, please check db parameters") - sys.exit(-1) - except InternalError as e: - # 1049 is MySQL error code for db doesn't exist - so we create it. - db_connection = pymysql.connect(host='mysql', user= 'root', password='dontusethisinprod') - db_connection.cursor().execute('CREATE DATABASE newsbot') - db_connection.close() + except OperationalError as e: + error_code, message = e.args[0], e.args[1] + if error_code == 1049: + db_connection = pymysql.connect(host='mysql', user= 'root', password='dontusethisinprod') + db_connection.cursor().execute('CREATE DATABASE newsbot') + db_connection.close() db.create_tables([Source, Request, Message], True) try: diff --git a/source-code/chapter-6/exercise-1/newsbot/one_time.py b/source-code/chapter-6/exercise-1/newsbot/one_time.py deleted file mode 100644 index f7074d9..0000000 --- a/source-code/chapter-6/exercise-1/newsbot/one_time.py +++ /dev/null @@ -1,11 +0,0 @@ - -from models import * - - -def create_tables(): - db.connect() - db.create_tables([Source, Request, Message], True) - db.close() - -if __name__ == '__main__': - create_tables() diff --git a/source-code/chapter-6/exercise-1/newsbot/reddit.py b/source-code/chapter-6/exercise-1/newsbot/reddit.py index 31f8dff..7f065eb 100644 --- a/source-code/chapter-6/exercise-1/newsbot/reddit.py +++ b/source-code/chapter-6/exercise-1/newsbot/reddit.py @@ -4,35 +4,30 @@ __author__ = 'Sathyajith' -def summarize(url): - log.info('Not yet implemented!') - return url - - def get_latest_news(sub_reddits): log.debug('Fetching news from reddit') - r = praw.Reddit(user_agent='SubReddit Newsfetcher Bot', + r = praw.Reddit(user_agent='NewsBot', client_id='ralalsYuEJXKDg', client_secret="16DD-6O7VVaYVMlkUPZWLhdluhU") r.read_only = True # Can change the subreddit or add more. sub_reddits = clean_up_subreddits(sub_reddits) - log.info('Fetching subreddits: {0}'.format(sub_reddits)) + log.info('Fetching subreddits: {sub_reddits}') submissions = r.subreddit(sub_reddits).hot(limit=5) submission_content = '' try: for post in submissions: - submission_content += summarize(post.title + ' - ' + post.url) + '\n\n' + submission_content += post.title + ' - ' + post.url + '\n\n' except praw.errors.Forbidden: - log.debug('subreddit {0} is private'.format(sub_reddits)) + log.debug(f'subreddit {sub_reddits} is private') submission_content = "Sorry couldn't fetch; subreddit is private" except praw.errors.InvalidSubreddit: - log.debug('Subreddit {} is invalid or doesn''t exist.'.format(sub_reddits)) + log.debug(f'Subreddit {sub_reddits} is invalid or doesn''t exist') submission_content = "Sorry couldn't fetch; subreddit doesn't seem to exist" return submission_content def clean_up_subreddits(sub_reddits): - log.debug('Got subreddits to clean: {0}'.format(sub_reddits)) + log.debug(f'Got subreddits to clean: {sub_reddits}') return sub_reddits.strip().replace(" ", "").replace(',', '+') diff --git a/source-code/chapter-6/exercise-1/newsbot/requirements.txt b/source-code/chapter-6/exercise-1/newsbot/requirements.txt index 8854d79..0d19ff9 100644 --- a/source-code/chapter-6/exercise-1/newsbot/requirements.txt +++ b/source-code/chapter-6/exercise-1/newsbot/requirements.txt @@ -1,3 +1,4 @@ -praw peewee==2.10.2 +praw==7.4.0 PyMySQL +cryptography \ No newline at end of file diff --git a/source-code/chapter-6/exercise-1/newsbot/telegram.py b/source-code/chapter-6/exercise-1/newsbot/telegram.py index 5e150c7..d852d72 100644 --- a/source-code/chapter-6/exercise-1/newsbot/telegram.py +++ b/source-code/chapter-6/exercise-1/newsbot/telegram.py @@ -6,15 +6,16 @@ from constants import * from reddit import get_latest_news from models import * +import peewee __author__ = 'Sathyajith' db = MySQLDatabase(host="mysql", port=3306, user="root", password="dontusethisinprod", database="newsbot") def get_updates(last_updated): - log.debug('Checking for requests, last updated passed is: {}'.format(last_updated)) + log.debug('Checking for requests, last updated passed is: {last_updated}') sleep(UPDATE_PERIOD) - response = requests.get(API_BASE + BOT_KEY + '/getUpdates', params={'offset': last_updated+1}) + response = requests.get(f"{API_BASE}/getUpdates", params={'offset': last_updated+1}) json_response = FALSE_RESPONSE if response.status_code != 200: # wait for a bit, try again @@ -25,14 +26,14 @@ def get_updates(last_updated): except ValueError: sleep(UPDATE_PERIOD*20) get_updates(last_updated) - log.info('received response: {}'.format(json_response)) + log.info(f"received response: {json_response}") return json_response def post_message(chat_id, text): - log.info('posting {} to {}'.format(text, chat_id)) + log.debug(f"posting {text} to {chat_id}") payload = {'chat_id': chat_id, 'text': text} - requests.post(API_BASE + BOT_KEY + '/sendMessage', data=payload) + requests.post(f"{API_BASE}/sendMessage", data=payload) def handle_incoming_messages(last_updated): @@ -40,7 +41,10 @@ def handle_incoming_messages(last_updated): split_chat_text = [] if r['ok']: for req in r['result']: - chat_sender_id = req['message']['chat']['id'] + if 'message' in req: + chat_sender_id = req['message']['chat']['id'] + else: + chat_sender_id = req['edited_message']['chat']['id'] try: chat_text = req['message']['text'] split_chat_text = chat_text.split() @@ -48,30 +52,33 @@ def handle_incoming_messages(last_updated): chat_text = '' split_chat_text.append(chat_text) log.debug('Looks like no chat text was detected... moving on') - try: + + if 'message' in req: person_id = req['message']['from']['id'] - except KeyError: - pass + else: + person_id = req['edited_message']['from']['id'] - log.info('Chat text received: {0}'.format(chat_text)) + log.info(f"Chat text received: {chat_text}") r = re.search('(source+)(.*)', chat_text) if (r is not None and r.group(1) == 'source'): if r.group(2): sources_dict[person_id] = r.group(2) - log.info('Sources set for {0} to {1}'.format(person_id, sources_dict[person_id])) - try: - sources = Source.create(person_id = person_id, fetch_from = sources_dict[person_id]) - except IntegrityError: - sources = Source.get(person_id = person_id) - sources.fetch_from = sources_dict[person_id] - sources.save() - log.info(sources.person_id) + log.info(f'Sources set for {person_id} to {sources_dict[person_id]}') + with db.atomic() as txn: + try: + sources = Source.create(person_id=person_id, fetch_from=sources_dict[person_id]) + log.debug(f'Inserted row id: {sources.person_id}') + except peewee.IntegrityError: + sources = Source.update(fetch_from=sources_dict[person_id]).where(person_id == person_id) + rows_updated = sources.execute() + log.info(f'Updated {rows_updated} rows') + txn.commit() post_message(person_id, 'Sources set as {0}!'.format(r.group(2))) else: post_message(person_id, 'We need a comma separated list of subreddits! No subreddit, no news :-(') if chat_text == '/stop': - log.debug('Added {0} to skip list'.format(chat_sender_id)) + log.debug(f'Added {chat_sender_id} to skip list') skip_list.append(chat_sender_id) post_message(chat_sender_id, "Ok, we won't send you any more messages.") @@ -79,19 +86,17 @@ def handle_incoming_messages(last_updated): helptext = ''' Hi! This is a News Bot which fetches news from subreddits. Use "/source" to select a subreddit source. Example "/source programming,games" fetches news from r/programming, r/games. - Use "/fetch for the bot to go ahead and fetch the news. At the moment, bot will fetch total of 5 posts from all sub reddits - I will have this configurable soon. + Use "/fetch for the bot to go ahead and fetch the news. At the moment, bot will fetch total of 5 posts from the selected subreddit. ''' post_message(chat_sender_id, helptext) if split_chat_text[0] == '/fetch' and (person_id not in skip_list): post_message(person_id, 'Hang on, fetching your news..') - try: sub_reddits = Source.get(person_id = person_id).fetch_from.strip() summarized_news = get_latest_news(sub_reddits) post_message(person_id, summarized_news) - except: + except peewee.DoesNotExist: post_message(person_id, ERR_NO_SOURCE) last_updated = req['update_id'] @@ -99,5 +104,5 @@ def handle_incoming_messages(last_updated): f.write(str(last_updated)) States.last_updated = last_updated log.debug( - 'Updated last_updated to {0}'.format(last_updated)) + f'Updated last_updated to {last_updated}') f.close() diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/Dockerfile b/source-code/chapter-7/exercise-1/docker-compose-adminer/Dockerfile deleted file mode 100644 index 29069bc..0000000 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM python:3-alpine - -RUN apk add gcc musl-dev python3-dev libffi-dev openssl-dev -COPY * /apps/subredditfetcher/ -WORKDIR /apps/subredditfetcher/ - -VOLUME [ "/apps/subredditfetcher" ] -RUN ["pip", "install", "-r", "requirements.txt"] -# RUN ["python", "one_time.py"] - -ENV NBT_ACCESS_TOKEN="495637361:AAHIhiDTX1UeX17KJy0-FsMZEqEtCFYfcP8" - -CMD ["python", "newsbot.py"] diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/LICENSE b/source-code/chapter-7/exercise-1/docker-compose-adminer/LICENSE deleted file mode 100644 index 210b49e..0000000 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Sathya - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/constants.py b/source-code/chapter-7/exercise-1/docker-compose-adminer/constants.py deleted file mode 100644 index cb189fe..0000000 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/constants.py +++ /dev/null @@ -1,11 +0,0 @@ -__author__ = 'Sathyajith' - -import os -ERR_NO_SOURCE = 'No sources defined! Set a source using /source list, of, sub, reddits' -skip_list = [] -sources_dict = {} - -BOT_KEY = os.environ['NBT_ACCESS_TOKEN'] -API_BASE = 'https://api.telegram.org/bot' -UPDATE_PERIOD = 6 -FALSE_RESPONSE = {"ok": False} \ No newline at end of file diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml b/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml index 2c0a4e5..7d84980 100644 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml +++ b/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml @@ -1,23 +1,16 @@ -version: '3' -services: - app: - build: . - depends_on: - - mysql - restart: "on-failure" - volumes: - - "appdata:/apps/subredditfetcher" - mysql: - image: mysql - volumes: - - "dbdata:/var/lib/mysql" - environment: - - MYSQL_ROOT_PASSWORD=dontusethisinprod - adminer: - image: adminer - ports: - - "8080:8080" +services: + mysql: + image: mysql + environment: + MYSQL_ROOT_PASSWORD: dontusethisinprod + ports: + - 3306:3306 + volumes: + - dbdata:/var/lib/mysql + adminer: + image: adminer + ports: + - 8080:8080 -volumes: - dbdata: - appdata: +volumes: + dbdata: \ No newline at end of file diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/last_updated.txt b/source-code/chapter-7/exercise-1/docker-compose-adminer/last_updated.txt deleted file mode 100644 index 97702fb..0000000 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/last_updated.txt +++ /dev/null @@ -1 +0,0 @@ -865610176 \ No newline at end of file diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/main.py b/source-code/chapter-7/exercise-1/docker-compose-adminer/main.py deleted file mode 100644 index bacc165..0000000 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/main.py +++ /dev/null @@ -1,22 +0,0 @@ -from flask import Flask -from newsbot import * -from states import States - -bot = Flask(__name__) - - -@bot.route('/index') -def index(): - return 'Thou shalt not pass!' - - -@bot.route('/telegram-update', methods=['POST']) -def telegram_update(): - handle_incoming_messages(States.last_updated_id) - - -if __name__ == '__main__': - States.last_updated_id = get_last_updated() - bot.run() - - diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/models.py b/source-code/chapter-7/exercise-1/docker-compose-adminer/models.py deleted file mode 100644 index a7834ba..0000000 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/models.py +++ /dev/null @@ -1,24 +0,0 @@ -from peewee import * -# db = SqliteDatabase('newsbot.db') -db = MySQLDatabase(host="mysql", port=3306, user="root", password="dontusethisinprod", database="newsbot") -class BaseModel(Model): - class Meta: - database = db - -class Source(BaseModel): - person_id = PrimaryKeyField() - fetch_from = CharField() - - -class Request(BaseModel): - id = PrimaryKeyField() - from_id = IntegerField(index=True) - request_text = CharField() - received_time = DateTimeField() - - -class Message(BaseModel): - id = PrimaryKeyField() - sent_to_id = IntegerField(index=True) - sent_message = CharField() - sent_time = DateTimeField() diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/newsbot.db b/source-code/chapter-7/exercise-1/docker-compose-adminer/newsbot.db deleted file mode 100644 index 2c5e1e7b54da58fe57075c8384cc77f2a1de9519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 zcmeI%&u-H&9KdmB{WneO#;uxqv2t1k0s-0qPLwrb)w&KshUh6Oty>~3Ei~CQY2r|L z18%$xHy(p$;0Z{9%`h2dUI31v;H@5||j%K^zyqESroosp1UQ{NlOP-djtu}q0D^;ph>+4Y(ni*%Z z{AzHfHW`1Hu*@TFgs(%MFE3V?@tUC1UOg3DsJzARCW|OP|O7`Y@(@#PG0R#|0009ILKmY**5I_Kd3=3=}v9bTp@EayH1Q0*~ z0R#|0009ILKmY**gy8(2uK)oA5I_I{1Q0*~0R#|00DhDcT9u`Ab Date: Sun, 8 Aug 2021 22:37:33 +0300 Subject: [PATCH 7/9] rename exercise 2 folder --- .../Dockerfile | 0 .../LICENSE | 0 .../constants.py | 0 .../docker-compose.yml | 0 .../last_updated.txt | 0 .../main.py | 0 .../models.py | 0 .../newsbot.db | Bin .../newsbot.py | 0 .../one_time.py | 0 .../reddit.py | 0 .../requirements.txt | 0 .../states.py | 0 .../telegram.py | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/Dockerfile (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/LICENSE (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/constants.py (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/docker-compose.yml (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/last_updated.txt (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/main.py (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/models.py (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/newsbot.db (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/newsbot.py (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/one_time.py (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/reddit.py (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/requirements.txt (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/states.py (100%) rename source-code/chapter-7/exercise-2/{subreddit-fetcher-compose => newsbot-compose}/telegram.py (100%) diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/Dockerfile b/source-code/chapter-7/exercise-2/newsbot-compose/Dockerfile similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/Dockerfile rename to source-code/chapter-7/exercise-2/newsbot-compose/Dockerfile diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/LICENSE b/source-code/chapter-7/exercise-2/newsbot-compose/LICENSE similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/LICENSE rename to source-code/chapter-7/exercise-2/newsbot-compose/LICENSE diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/constants.py b/source-code/chapter-7/exercise-2/newsbot-compose/constants.py similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/constants.py rename to source-code/chapter-7/exercise-2/newsbot-compose/constants.py diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/docker-compose.yml b/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/docker-compose.yml rename to source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/last_updated.txt b/source-code/chapter-7/exercise-2/newsbot-compose/last_updated.txt similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/last_updated.txt rename to source-code/chapter-7/exercise-2/newsbot-compose/last_updated.txt diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/main.py b/source-code/chapter-7/exercise-2/newsbot-compose/main.py similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/main.py rename to source-code/chapter-7/exercise-2/newsbot-compose/main.py diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/models.py b/source-code/chapter-7/exercise-2/newsbot-compose/models.py similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/models.py rename to source-code/chapter-7/exercise-2/newsbot-compose/models.py diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/newsbot.db b/source-code/chapter-7/exercise-2/newsbot-compose/newsbot.db similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/newsbot.db rename to source-code/chapter-7/exercise-2/newsbot-compose/newsbot.db diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/newsbot.py b/source-code/chapter-7/exercise-2/newsbot-compose/newsbot.py similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/newsbot.py rename to source-code/chapter-7/exercise-2/newsbot-compose/newsbot.py diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/one_time.py b/source-code/chapter-7/exercise-2/newsbot-compose/one_time.py similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/one_time.py rename to source-code/chapter-7/exercise-2/newsbot-compose/one_time.py diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/reddit.py b/source-code/chapter-7/exercise-2/newsbot-compose/reddit.py similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/reddit.py rename to source-code/chapter-7/exercise-2/newsbot-compose/reddit.py diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/requirements.txt b/source-code/chapter-7/exercise-2/newsbot-compose/requirements.txt similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/requirements.txt rename to source-code/chapter-7/exercise-2/newsbot-compose/requirements.txt diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/states.py b/source-code/chapter-7/exercise-2/newsbot-compose/states.py similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/states.py rename to source-code/chapter-7/exercise-2/newsbot-compose/states.py diff --git a/source-code/chapter-7/exercise-2/subreddit-fetcher-compose/telegram.py b/source-code/chapter-7/exercise-2/newsbot-compose/telegram.py similarity index 100% rename from source-code/chapter-7/exercise-2/subreddit-fetcher-compose/telegram.py rename to source-code/chapter-7/exercise-2/newsbot-compose/telegram.py From 63878914a83359c95302406769e75d1df053208e Mon Sep 17 00:00:00 2001 From: Sathyajith Bhat Date: Mon, 9 Aug 2021 22:43:52 +0300 Subject: [PATCH 8/9] revamp newsbot --- .../docker-compose-adminer/docker-compose.yml | 4 +- .../exercise-2/newsbot-compose/Dockerfile | 12 ++-- .../exercise-2/newsbot-compose/constants.py | 14 +++-- .../newsbot-compose/docker-compose.yml | 46 +++++++-------- .../exercise-2/newsbot-compose/main.py | 22 -------- .../exercise-2/newsbot-compose/models.py | 6 +- .../exercise-2/newsbot-compose/newsbot.db | Bin 24576 -> 0 bytes .../exercise-2/newsbot-compose/newsbot.py | 17 +++--- .../exercise-2/newsbot-compose/one_time.py | 11 ---- .../exercise-2/newsbot-compose/reddit.py | 17 ++---- .../newsbot-compose/requirements.txt | 3 +- .../exercise-2/newsbot-compose/telegram.py | 53 ++++++++++-------- 12 files changed, 87 insertions(+), 118 deletions(-) delete mode 100644 source-code/chapter-7/exercise-2/newsbot-compose/main.py delete mode 100644 source-code/chapter-7/exercise-2/newsbot-compose/newsbot.db delete mode 100644 source-code/chapter-7/exercise-2/newsbot-compose/one_time.py diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml b/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml index 7d84980..c7eb317 100644 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml +++ b/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml @@ -11,6 +11,6 @@ services: image: adminer ports: - 8080:8080 - + volumes: - dbdata: \ No newline at end of file + dbdata: \ No newline at end of file diff --git a/source-code/chapter-7/exercise-2/newsbot-compose/Dockerfile b/source-code/chapter-7/exercise-2/newsbot-compose/Dockerfile index 29069bc..7d69914 100644 --- a/source-code/chapter-7/exercise-2/newsbot-compose/Dockerfile +++ b/source-code/chapter-7/exercise-2/newsbot-compose/Dockerfile @@ -1,13 +1,9 @@ FROM python:3-alpine -RUN apk add gcc musl-dev python3-dev libffi-dev openssl-dev -COPY * /apps/subredditfetcher/ +RUN apk add gcc musl-dev python3-dev libffi-dev openssl-dev cargo WORKDIR /apps/subredditfetcher/ +COPY . . -VOLUME [ "/apps/subredditfetcher" ] -RUN ["pip", "install", "-r", "requirements.txt"] -# RUN ["python", "one_time.py"] - -ENV NBT_ACCESS_TOKEN="495637361:AAHIhiDTX1UeX17KJy0-FsMZEqEtCFYfcP8" - +RUN pip install --upgrade pip && pip install -r requirements.txt +VOLUME ["/data"] CMD ["python", "newsbot.py"] diff --git a/source-code/chapter-7/exercise-2/newsbot-compose/constants.py b/source-code/chapter-7/exercise-2/newsbot-compose/constants.py index cb189fe..092cde6 100644 --- a/source-code/chapter-7/exercise-2/newsbot-compose/constants.py +++ b/source-code/chapter-7/exercise-2/newsbot-compose/constants.py @@ -1,11 +1,15 @@ __author__ = 'Sathyajith' -import os +from os import environ +from sys import exit ERR_NO_SOURCE = 'No sources defined! Set a source using /source list, of, sub, reddits' skip_list = [] sources_dict = {} +UPDATE_PERIOD = 1 +FALSE_RESPONSE = {"ok": False} -BOT_KEY = os.environ['NBT_ACCESS_TOKEN'] -API_BASE = 'https://api.telegram.org/bot' -UPDATE_PERIOD = 6 -FALSE_RESPONSE = {"ok": False} \ No newline at end of file +BOT_KEY = environ.get('NBT_ACCESS_TOKEN') +if not BOT_KEY: + print("Telegram access token not set, exiting.") + exit(1) +API_BASE = f'https://api.telegram.org/bot{BOT_KEY}' \ No newline at end of file diff --git a/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml b/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml index 2c0a4e5..b6ef1a7 100644 --- a/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml +++ b/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml @@ -1,23 +1,25 @@ -version: '3' -services: - app: - build: . - depends_on: - - mysql - restart: "on-failure" - volumes: - - "appdata:/apps/subredditfetcher" - mysql: - image: mysql - volumes: - - "dbdata:/var/lib/mysql" - environment: - - MYSQL_ROOT_PASSWORD=dontusethisinprod - adminer: - image: adminer - ports: - - "8080:8080" +services: + newsbot: + build: . + depends_on: + - mysql + restart: "on-failure" + environment: + - NBT_ACCESS_TOKEN=${NBT_ACCESS_TOKEN} + networks: + - newsbot + + mysql: + image: mysql + volumes: + - newsbot-db:/var/lib/mysql + environment: + - MYSQL_ROOT_PASSWORD=dontusethisinprod + networks: + - newsbot + +volumes: + newsbot-db: -volumes: - dbdata: - appdata: +networks: + newsbot: \ No newline at end of file diff --git a/source-code/chapter-7/exercise-2/newsbot-compose/main.py b/source-code/chapter-7/exercise-2/newsbot-compose/main.py deleted file mode 100644 index bacc165..0000000 --- a/source-code/chapter-7/exercise-2/newsbot-compose/main.py +++ /dev/null @@ -1,22 +0,0 @@ -from flask import Flask -from newsbot import * -from states import States - -bot = Flask(__name__) - - -@bot.route('/index') -def index(): - return 'Thou shalt not pass!' - - -@bot.route('/telegram-update', methods=['POST']) -def telegram_update(): - handle_incoming_messages(States.last_updated_id) - - -if __name__ == '__main__': - States.last_updated_id = get_last_updated() - bot.run() - - diff --git a/source-code/chapter-7/exercise-2/newsbot-compose/models.py b/source-code/chapter-7/exercise-2/newsbot-compose/models.py index a7834ba..ec73558 100644 --- a/source-code/chapter-7/exercise-2/newsbot-compose/models.py +++ b/source-code/chapter-7/exercise-2/newsbot-compose/models.py @@ -1,6 +1,8 @@ -from peewee import * -# db = SqliteDatabase('newsbot.db') +from peewee import Model, PrimaryKeyField, IntegerField, CharField, DateTimeField, MySQLDatabase + + db = MySQLDatabase(host="mysql", port=3306, user="root", password="dontusethisinprod", database="newsbot") + class BaseModel(Model): class Meta: database = db diff --git a/source-code/chapter-7/exercise-2/newsbot-compose/newsbot.db b/source-code/chapter-7/exercise-2/newsbot-compose/newsbot.db deleted file mode 100644 index 2c5e1e7b54da58fe57075c8384cc77f2a1de9519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 zcmeI%&u-H&9KdmB{WneO#;uxqv2t1k0s-0qPLwrb)w&KshUh6Oty>~3Ei~CQY2r|L z18%$xHy(p$;0Z{9%`h2dUI31v;H@5||j%K^zyqESroosp1UQ{NlOP-djtu}q0D^;ph>+4Y(ni*%Z z{AzHfHW`1Hu*@TFgs(%MFE3V?@tUC1UOg3DsJzARCW|OP|O7`Y@(@#PG0R#|0009ILKmY**5I_Kd3=3=}v9bTp@EayH1Q0*~ z0R#|0009ILKmY**gy8(2uK)oA5I_I{1Q0*~0R#|00DhDcT9u`Ab Date: Tue, 10 Aug 2021 21:20:54 +0300 Subject: [PATCH 9/9] update compose files --- .../docker-compose-adminer/docker-compose.yml | 2 +- .../docker-compose.adminer.yml | 34 +++++++++++++++++++ .../newsbot-compose/docker-compose.yml | 4 +-- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.adminer.yml diff --git a/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml b/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml index c7eb317..4fa85f5 100644 --- a/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml +++ b/source-code/chapter-7/exercise-1/docker-compose-adminer/docker-compose.yml @@ -2,7 +2,7 @@ services: mysql: image: mysql environment: - MYSQL_ROOT_PASSWORD: dontusethisinprod + MYSQL_ROOT_PASSWORD: dontusethisinprod ports: - 3306:3306 volumes: diff --git a/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.adminer.yml b/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.adminer.yml new file mode 100644 index 0000000..8132d37 --- /dev/null +++ b/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.adminer.yml @@ -0,0 +1,34 @@ +services: + newsbot: + build: . + depends_on: + - mysql + restart: "on-failure" + environment: + NBT_ACCESS_TOKEN: ${NBT_ACCESS_TOKEN} + networks: + - newsbot + + mysql: + image: mysql + volumes: + - newsbot-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: dontusethisinprod + + networks: + - newsbot + + adminer: + image: adminer + ports: + - 8080:8080 + networks: + - newsbot + +volumes: + newsbot-db: + + +networks: + newsbot: \ No newline at end of file diff --git a/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml b/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml index b6ef1a7..20561bc 100644 --- a/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml +++ b/source-code/chapter-7/exercise-2/newsbot-compose/docker-compose.yml @@ -5,7 +5,7 @@ services: - mysql restart: "on-failure" environment: - - NBT_ACCESS_TOKEN=${NBT_ACCESS_TOKEN} + NBT_ACCESS_TOKEN: ${NBT_ACCESS_TOKEN} networks: - newsbot @@ -14,7 +14,7 @@ services: volumes: - newsbot-db:/var/lib/mysql environment: - - MYSQL_ROOT_PASSWORD=dontusethisinprod + MYSQL_ROOT_PASSWORD: dontusethisinprod networks: - newsbot