|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|