├── .dockerignore ├── .gitignore ├── Dockerfile ├── Jenkinsfile ├── README.md ├── app.py ├── env.sample ├── install ├── install_docker.sh ├── redditwatcher ├── requirements.txt ├── screenshot.png └── version.py /.dockerignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | screenshot.png 3 | .git/ 4 | .gitignore 5 | install* 6 | redditwatcher 7 | __pycache__/ 8 | README.md 9 | env.sample 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | venv/ 2 | env 3 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:alpine3.6 2 | 3 | WORKDIR /usr/src/redditwatcher 4 | COPY . . 5 | 6 | RUN pip install -r requirements.txt 7 | 8 | ENTRYPOINT ["python", "./app.py"] 9 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | pipeline { 2 | agent any 3 | environment { 4 | BUILD_VERSION = '$(python3 -c \'from version import VERSION; print(VERSION,end="")\')' 5 | DOCKER_REPOSITORY = 'trstringer/redditwatcher' 6 | } 7 | stages { 8 | stage('Build') { 9 | environment { 10 | REDDITWATCHER_CLIENTID = credentials('REDDITWATCHER_CLIENTID') 11 | REDDITWATCHER_CLIENTSECRET = credentials('REDDITWATCHER_CLIENTSECRET') 12 | } 13 | steps { 14 | echo "building..." 15 | sh "docker build -t ${env.DOCKER_REPOSITORY}:${env.BUILD_VERSION} -t ${env.DOCKER_REPOSITORY}:latest ." 16 | sh "docker run -d -e REDDITWATCHER_CLIENTID=${env.REDDITWATCHER_CLIENTID} -e REDDITWATCHER_CLIENTSECRET=${env.REDDITWATCHER_CLIENTSECRET} --name rw ${env.DOCKER_REPOSITORY}:${env.BUILD_VERSION} linux" 17 | } 18 | } 19 | stage('Test') { 20 | steps { 21 | sh "sleep 2" 22 | sh "docker logs rw" 23 | sh "docker ps | grep rw" 24 | } 25 | } 26 | stage('Deliver') { 27 | when { 28 | expression { 29 | currentBuild.result == null || currentBuild.result == 'SUCCESS' 30 | } 31 | } 32 | steps { 33 | echo "pushing image to container registry..." 34 | sh "docker push ${env.DOCKER_REPOSITORY}:${env.BUILD_VERSION}" 35 | sh "docker push ${env.DOCKER_REPOSITORY}:latest" 36 | } 37 | } 38 | } 39 | post { 40 | always { 41 | sh "docker stop rw || true" 42 | sh "docker rm rw || true" 43 | sh "docker image prune -f" 44 | } 45 | failure { 46 | mail bcc: '', body: 'redditwatcher build failed', cc: '', from: '', replyTo: '', subject: ' Build failed', to: 'github@trstringer.com' 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RedditWatcher 2 | 3 | Listens to a stream of reddit submissions 4 | 5 | ![screenshot](./screenshot.png) 6 | 7 | ## Installation 8 | 9 | 1. `git clone https://github.com/tstringer/redditwatcher.git` 10 | 2. `cd redditwatcher` 11 | 3. `./install` 12 | 13 | :bulb: You must [register a reddit app](https://www.reddit.com/prefs/apps/) and then define `REDDITWATCHER_CLIENTID` and `REDDITWATCHER_CLIENTSECRET` environment variables to their appropriate values 14 | 15 | ## Installation (Docker) 16 | 17 | Ensure that you are running the Docker daemon, and run `. ./install_docker.sh`. 18 | 19 | Define the following environment variables (i.e. place them in your `~/.bashrc`): 20 | 21 | - `REDDITWATCHER_CLIENTID` 22 | - `REDDITWATCHER_CLIENTSECRET` 23 | 24 | *Note: these credentials are retrieved from the app registration from the Installation step 25 | 26 | ## Usage 27 | 28 | RedditWatcher takes a list of unnamed arguments that are the subreddits you want to stream 29 | 30 | ``` 31 | redditwatcher python javascript learnpython 32 | ``` 33 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import sys 3 | import os 4 | import praw 5 | from version import VERSION 6 | 7 | 8 | def main(): 9 | 10 | if len(sys.argv) < 2: 11 | print('You must specify a subreddit or multiple subreddits (or --version)') 12 | sys.exit(1) 13 | 14 | if sys.argv[1] in ['--version', '-v']: 15 | print('redditwatcher v{}'.format(VERSION)) 16 | sys.exit(0) 17 | 18 | reddit = praw.Reddit( 19 | client_id=os.environ['REDDITWATCHER_CLIENTID'], 20 | client_secret=os.environ['REDDITWATCHER_CLIENTSECRET'], 21 | user_agent='redditwatcher' 22 | ) 23 | 24 | try: 25 | for submission in ( 26 | reddit.subreddit(subreddits(sys.argv)).stream.submissions()): 27 | display_submission(submission) 28 | sys.stdout.flush() 29 | except KeyboardInterrupt: 30 | pass 31 | 32 | 33 | def subreddits(args): 34 | return '+'.join(args[1:]) 35 | 36 | 37 | def display_submission(submission): 38 | created = datetime.fromtimestamp(submission.created_utc) 39 | adjusted_hour = created.hour if created.hour <= 12 else created.hour - 12 40 | if adjusted_hour == 0: 41 | adjusted_hour = 12 42 | adjusted_minute = str(created.minute).rjust(2, '0') 43 | 44 | print('\n/r/{} [{}] {}\n ========> {}'.format( 45 | submission.subreddit.display_name, 46 | '{}/{} {}:{} {}'.format( 47 | created.month, created.day, 48 | adjusted_hour, adjusted_minute, 49 | created.strftime('%P') 50 | ), 51 | submission.shortlink, 52 | submission.title 53 | )) 54 | 55 | 56 | if __name__ == '__main__': 57 | main() 58 | -------------------------------------------------------------------------------- /env.sample: -------------------------------------------------------------------------------- 1 | REDDITWATCHER_CLIENTID= 2 | REDDITWATCHER_CLIENTSECRET= 3 | -------------------------------------------------------------------------------- /install: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | SCRIPT_DIR=$(realpath $(dirname "$0")) 4 | 5 | sed 's|RWDIR|'$SCRIPT_DIR'|g' $SCRIPT_DIR/redditwatcher > ~/.local/bin/redditwatcher 6 | chmod 755 ~/.local/bin/redditwatcher 7 | 8 | cd $SCRIPT_DIR 9 | python3 -m venv venv 10 | . venv/bin/activate 11 | pip install -r requirements.txt 12 | deactivate 13 | -------------------------------------------------------------------------------- /install_docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | setup() { 4 | REDDITWATCHER_DEF=" 5 | redditwatcher() { 6 | docker pull trstringer/redditwatcher:latest >> /dev/null 7 | docker run --rm \\ 8 | -e REDDITWATCHER_CLIENTID=\$REDDITWATCHER_CLIENTID \\ 9 | -e REDDITWATCHER_CLIENTSECRET=\$REDDITWATCHER_CLIENTSECRET \\ 10 | -v /etc/localtime:/etc/localtime:ro \\ 11 | trstringer/redditwatcher:latest \"\$@\" 12 | }" 13 | 14 | if [[ -z $REDDITWATCHER_CLIENTID ]]; then 15 | printf 'please enter your reddit client id: ' 16 | read REDDITWATCHER_CLIENTID 17 | fi 18 | 19 | if [[ -z $REDDITWATCHER_CLIENTSECRET ]]; then 20 | printf 'please enter your reddit secret: ' 21 | read REDDITWATCHER_CLIENTSECRET 22 | fi 23 | 24 | grep "source ~/.redditwatcher" ~/.bashrc >> /dev/null 25 | if [ $? -ne 0 ]; then 26 | printf "adding .redditwatcher sourcing to bashrc..." 27 | printf "\nsource ~/.redditwatcher" >> ~/.bashrc 28 | else 29 | printf ".redditwatcher sourcing already in bashrc..." 30 | fi 31 | 32 | printf "export REDDITWATCHER_CLIENTID=$REDDITWATCHER_CLIENTID" > ~/.redditwatcher 33 | printf "\nexport REDDITWATCHER_CLIENTSECRET=$REDDITWATCHER_CLIENTSECRET" >> ~/.redditwatcher 34 | printf "\n$REDDITWATCHER_DEF" >> ~/.redditwatcher 35 | . ~/.bashrc 36 | } 37 | 38 | setup 39 | -------------------------------------------------------------------------------- /redditwatcher: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | . RWDIR/venv/bin/activate 4 | python RWDIR/app/app.py "$@" 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | colorama==0.3.7 2 | praw==4.4.0 3 | prawcore==0.7.0 4 | requests==2.12.5 5 | update-checker==0.16 6 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trstringer/redditwatcher/549ea293d89bf18e5aed0cadbe797f9ece93c720/screenshot.png -------------------------------------------------------------------------------- /version.py: -------------------------------------------------------------------------------- 1 | """Version identifier""" 2 | 3 | VERSION = '1.0.6' 4 | --------------------------------------------------------------------------------