| |
| |
| |
| |
| |
| |
| from __future__ import print_function |
| import praw |
| import requests |
| import socket |
| import time |
| from datetime import datetime |
| import argparse |
|
|
| import tensorflow_chessbot |
| from helper_functions_chessbot import * |
| from helper_functions import shortenFEN |
| from cfb_helpers import * |
|
|
| def generateResponseMessage(submission, predictor): |
| print("\n---\nImage URL: %s" % submission.url) |
| |
| |
| fen, certainty, visualize_link = predictor.makePrediction(submission.url) |
|
|
| if fen is None: |
| print("> %s - Couldn't generate FEN, skipping..." % datetime.now()) |
| print("\n---\n") |
| return None |
| |
| fen = shortenFEN(fen) |
| print("Predicted FEN: %s" % fen) |
| print("Certainty: %.4f%%" % (certainty*100)) |
|
|
| |
| side = getSideToPlay(submission.title, fen) |
| |
| msg = generateMessage(fen, certainty, side, visualize_link) |
| print("fen: %s\nside: %s\n" % (fen, side)) |
| return msg |
|
|
|
|
| def processSubmission(submission, cfb, predictor, args, reply_wait_time=10): |
| |
| if isPotentialChessboardTopic(submission): |
| if not previouslyRepliedTo(submission, cfb): |
| |
| response = generateResponseMessage(submission, predictor) |
| if response is None: |
| logMessage(submission,"[NO-FEN]") |
| return |
|
|
| |
| if not args.dry: |
| logMessage(submission,"[REPLIED]") |
| submission.reply(response) |
| else: |
| logMessage(submission,"[DRY-RUN-REPLIED]") |
|
|
| |
| waitWithComments(reply_wait_time) |
| else: |
| logMessage(submission,"[SKIP]") |
|
|
| else: |
| logMessage(submission) |
| time.sleep(1) |
|
|
| def main(args): |
| resetTensorflowGraph() |
| running = True |
| reddit = praw.Reddit('CFB') |
| cfb = reddit.user.me() |
| subreddit = reddit.subreddit('chess+chessbeginners+AnarchyChess+betterchess+chesspuzzles') |
| predictor = tensorflow_chessbot.ChessboardPredictor() |
|
|
| while running: |
| |
| stream = subreddit.stream.submissions() |
| try: |
| for submission in stream: |
| processSubmission(submission, cfb, predictor, args) |
| except (socket.error, requests.exceptions.ReadTimeout, |
| requests.packages.urllib3.exceptions.ReadTimeoutError, |
| requests.exceptions.ConnectionError) as e: |
| print( |
| "> %s - Connection error, skipping and continuing in 30 seconds: %s" % ( |
| datetime.now(), e)) |
| time.sleep(30) |
| continue |
| except Exception as e: |
| print("Unknown Error, skipping and continuing in 30 seconds:",e) |
| time.sleep(30) |
| continue |
| except KeyboardInterrupt: |
| print("Keyboard Interrupt: Exiting...") |
| running = False |
| break |
|
|
| predictor.close() |
| print('Finished') |
|
|
| def resetTensorflowGraph(): |
| """WIP needed to restart predictor after an error""" |
| import tensorflow as tf |
| print('Reset TF graph') |
| tf.reset_default_graph() |
|
|
| def runSpecificSubmission(args): |
| resetTensorflowGraph() |
| reddit = praw.Reddit('CFB') |
| cfb = reddit.user.me() |
| predictor = tensorflow_chessbot.ChessboardPredictor() |
|
|
| submission = reddit.submission(args.sub) |
| print("URL: ", submission.url) |
| if submission: |
| print('Processing...') |
| processSubmission(submission, cfb, predictor, args) |
|
|
| predictor.close() |
| print('Done') |
|
|
| def dryRunTest(submission='5tuerh'): |
| resetTensorflowGraph() |
| reddit = praw.Reddit('CFB') |
| predictor = tensorflow_chessbot.ChessboardPredictor() |
|
|
| |
| submission = reddit.submission(submission) |
| print('Loading %s' % submission.id) |
| |
| if isPotentialChessboardTopic(submission): |
| |
| response = generateResponseMessage(submission, predictor) |
| print("RESPONSE:\n") |
| print('-----------------------------') |
| print(response) |
| print('-----------------------------') |
| else: |
| print('Submission not considered chessboard topic') |
|
|
| predictor.close() |
| print('Finished') |
|
|
| |
|
|
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--dry', help='dry run (don\'t actually submit replies)', |
| action="store_true", default=False) |
| parser.add_argument('--test', help='Dry run test on pre-existing comment)', |
| action="store_true", default=False) |
| parser.add_argument('--sub', help='Pass submission string to process') |
| args = parser.parse_args() |
| if args.test: |
| print('Doing dry run test on submission') |
| if args.sub: |
| dryRunTest(args.sub) |
| else: |
| dryRunTest() |
| elif args.sub is not None: |
| runSpecificSubmission(args) |
| else: |
| main(args) |
|
|