New feature! %1 - send game anotations to players
This commit is contained in:
pare
61d6ffcbb6
commit
e158eb862e
S'han modificat 3 arxius amb 217 adicions i 8 eliminacions
|
@ -20,6 +20,10 @@ To list on going games:
|
||||||
|
|
||||||
@your_bot_username games
|
@your_bot_username games
|
||||||
|
|
||||||
|
To get any game anotations, in ex. game 1:
|
||||||
|
|
||||||
|
@your_bot_username send 1
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
|
|
||||||
- **Python 3**
|
- **Python 3**
|
||||||
|
@ -41,6 +45,7 @@ Within Python Virtual Environment:
|
||||||
|
|
||||||
![board](board.png)
|
![board](board.png)
|
||||||
|
|
||||||
20.11.2020 - New feature! added link to on going games in games list
|
20.11.2020 - New feature! Added link to on going games in games list
|
||||||
21.11.2020 - New feature! Added a warning to player in turn when has been captured one of its pieces
|
21.11.2020 - New feature! Added a warning to player in turn when has been captured one of its pieces
|
||||||
23.11.2020 - New feature! Now all moves are saved to file (with san anotation).
|
23.11.2020 - New feature! Now all moves are saved to file (with san anotation).
|
||||||
|
25.11.2020 - New feature! Get any game anotations via email.
|
||||||
|
|
161
mastochess.py
161
mastochess.py
|
@ -6,6 +6,14 @@ import re
|
||||||
import unidecode
|
import unidecode
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from mastodon import Mastodon
|
from mastodon import Mastodon
|
||||||
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
from email.mime.text import MIMEText
|
||||||
|
from email.mime.base import MIMEBase
|
||||||
|
from email import encoders
|
||||||
|
import smtplib
|
||||||
|
from smtplib import SMTPException, SMTPAuthenticationError, SMTPConnectError, SMTPRecipientsRefused
|
||||||
|
import socket
|
||||||
|
from socket import gaierror
|
||||||
import psycopg2
|
import psycopg2
|
||||||
import chess
|
import chess
|
||||||
import chess.svg
|
import chess.svg
|
||||||
|
@ -159,7 +167,7 @@ def get_notification_data():
|
||||||
|
|
||||||
url_lst = []
|
url_lst = []
|
||||||
|
|
||||||
search_text = ['fi','mou','nova','jocs']
|
search_text = ['fi','mou','nova','jocs', 'envia']
|
||||||
|
|
||||||
conn = None
|
conn = None
|
||||||
|
|
||||||
|
@ -511,7 +519,7 @@ def save_annotation():
|
||||||
|
|
||||||
moved_piece_name = get_moved_piece_name(moved_piece)
|
moved_piece_name = get_moved_piece_name(moved_piece)
|
||||||
|
|
||||||
game_file = "anotations/" + str(game_id)
|
game_file = "anotations/" + str(game_id) + ".txt"
|
||||||
|
|
||||||
if moved_piece_name == 'P':
|
if moved_piece_name == 'P':
|
||||||
|
|
||||||
|
@ -569,6 +577,108 @@ def save_annotation():
|
||||||
|
|
||||||
f.write(line_data)
|
f.write(line_data)
|
||||||
|
|
||||||
|
def get_email_address(username):
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
conn = None
|
||||||
|
|
||||||
|
conn = psycopg2.connect(database = mastodon_db, user = mastodon_db_user, password = "", host = "/var/run/postgresql", port = "5432")
|
||||||
|
|
||||||
|
cur = conn.cursor()
|
||||||
|
|
||||||
|
cur.execute("select email from users where account_id = (select id from accounts where username = (%s) and domain is null)", (username,))
|
||||||
|
|
||||||
|
row = cur.fetchone()
|
||||||
|
|
||||||
|
username_email = row[0]
|
||||||
|
|
||||||
|
cur.close()
|
||||||
|
|
||||||
|
return username_email
|
||||||
|
|
||||||
|
except (Exception, psycopg2.DatabaseError) as error:
|
||||||
|
|
||||||
|
sys.exit(error)
|
||||||
|
|
||||||
|
finally:
|
||||||
|
|
||||||
|
if conn is not None:
|
||||||
|
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
def send_anotation(game_id):
|
||||||
|
|
||||||
|
emailed = False
|
||||||
|
|
||||||
|
game_found = False
|
||||||
|
|
||||||
|
username_email = get_email_address(username)
|
||||||
|
|
||||||
|
# Create message object instance
|
||||||
|
msg = MIMEMultipart()
|
||||||
|
|
||||||
|
# Declare message elements
|
||||||
|
msg['From'] = smtp_user_login
|
||||||
|
msg['To'] = username_email
|
||||||
|
msg['Subject'] = "Anotaciones partida n." + game_id
|
||||||
|
|
||||||
|
# Attach the game anotation
|
||||||
|
file_to_attach = "anotations/" + game_id + ".txt"
|
||||||
|
try:
|
||||||
|
|
||||||
|
attachment = open(file_to_attach, 'rb')
|
||||||
|
|
||||||
|
game_found = True
|
||||||
|
|
||||||
|
except FileNotFoundError as not_found_error:
|
||||||
|
|
||||||
|
print(not_found_error)
|
||||||
|
return (emailed, game_id, game_found)
|
||||||
|
|
||||||
|
obj = MIMEBase('application', 'octet-stream')
|
||||||
|
obj.set_payload(attachment.read())
|
||||||
|
encoders.encode_base64(obj)
|
||||||
|
obj.add_header('Content-Disposition', "attachment; filename= "+file_to_attach)
|
||||||
|
|
||||||
|
# Add the message body to the object instance
|
||||||
|
msg.attach(obj)
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
# Create the server connection
|
||||||
|
server = smtplib.SMTP(smtp_host)
|
||||||
|
# Switch the connection over to TLS encryption
|
||||||
|
server.starttls()
|
||||||
|
# Authenticate with the server
|
||||||
|
server.login(smtp_user_login, smtp_user_password)
|
||||||
|
# Send the message
|
||||||
|
server.sendmail(msg['From'], msg['To'], msg.as_string())
|
||||||
|
# Disconnect
|
||||||
|
server.quit()
|
||||||
|
|
||||||
|
print("Successfully sent game anotations to %s" % msg['To'])
|
||||||
|
emailed = True
|
||||||
|
return (emailed, game_id, game_found)
|
||||||
|
|
||||||
|
except SMTPAuthenticationError as auth_error:
|
||||||
|
|
||||||
|
print(auth_error)
|
||||||
|
pass
|
||||||
|
return emailed
|
||||||
|
|
||||||
|
except socket.gaierror as socket_error:
|
||||||
|
|
||||||
|
print(socket_error)
|
||||||
|
pass
|
||||||
|
return emailed
|
||||||
|
|
||||||
|
except SMTPRecipientsRefused as recip_error:
|
||||||
|
|
||||||
|
print(recip_error)
|
||||||
|
pass
|
||||||
|
return emailed
|
||||||
|
|
||||||
def close_game():
|
def close_game():
|
||||||
|
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
|
@ -874,6 +984,10 @@ def replying():
|
||||||
|
|
||||||
reply = True
|
reply = True
|
||||||
|
|
||||||
|
elif query_word[0:5] == 'envia':
|
||||||
|
|
||||||
|
reply = True
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
reply = False
|
reply = False
|
||||||
|
@ -921,6 +1035,15 @@ def db_config():
|
||||||
|
|
||||||
return (mastodon_db, mastodon_db_user, chess_db, chess_db_user)
|
return (mastodon_db, mastodon_db_user, chess_db, chess_db_user)
|
||||||
|
|
||||||
|
def smtp_config():
|
||||||
|
|
||||||
|
smtp_filepath = "config/smtp_config.txt"
|
||||||
|
smtp_host = get_parameter("smtp_host", smtp_filepath)
|
||||||
|
smtp_user_login = get_parameter("smtp_user_login", smtp_filepath)
|
||||||
|
smtp_user_password = get_parameter("smtp_user_password", smtp_filepath)
|
||||||
|
|
||||||
|
return (smtp_host, smtp_user_login, smtp_user_password)
|
||||||
|
|
||||||
def get_parameter( parameter, file_path ):
|
def get_parameter( parameter, file_path ):
|
||||||
|
|
||||||
if not os.path.isfile(file_path):
|
if not os.path.isfile(file_path):
|
||||||
|
@ -964,6 +1087,8 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
mastodon_db, mastodon_db_user, chess_db, chess_db_user = db_config()
|
mastodon_db, mastodon_db_user, chess_db, chess_db_user = db_config()
|
||||||
|
|
||||||
|
smtp_host, smtp_user_login, smtp_user_password = smtp_config()
|
||||||
|
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
|
|
||||||
create_dir()
|
create_dir()
|
||||||
|
@ -1067,7 +1192,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
toot_text += '\n'
|
toot_text += '\n'
|
||||||
|
|
||||||
toot_text += '#escacs' + '\n'
|
toot_text += 'partida: ' + str(game_id) + ' ' + '#escacs' + '\n'
|
||||||
|
|
||||||
image_id = mastodon.media_post(board_file, "image/png").id
|
image_id = mastodon.media_post(board_file, "image/png").id
|
||||||
|
|
||||||
|
@ -1079,6 +1204,30 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
update_replies(status_id, username, now)
|
update_replies(status_id, username, now)
|
||||||
|
|
||||||
|
elif query_word[0:5] == 'envia':
|
||||||
|
|
||||||
|
query_word_length = len(query_word)
|
||||||
|
|
||||||
|
send_game = query_word[6:query_word_length].replace(' ', '')
|
||||||
|
|
||||||
|
emailed, game_id, game_found = send_anotation(send_game)
|
||||||
|
|
||||||
|
if emailed == False and game_found == True:
|
||||||
|
|
||||||
|
toot_text = "@"+username + " error al enviar les anotacions :-("
|
||||||
|
|
||||||
|
elif emailed == True and game_found == True:
|
||||||
|
|
||||||
|
toot_text = "@"+username + " les anotaciones de la partida n." + str(game_id) + " enviades amb èxit!"
|
||||||
|
|
||||||
|
elif emailed == False and game_found == False:
|
||||||
|
|
||||||
|
toot_text = "@"+username + " la partida n." + str(game_id) + " no existeix..."
|
||||||
|
|
||||||
|
mastodon.status_post(toot_text, in_reply_to_id=status_id,visibility=visibility)
|
||||||
|
|
||||||
|
update_replies(status_id, username, now)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
update_replies(status_id, username, now)
|
update_replies(status_id, username, now)
|
||||||
|
@ -1099,7 +1248,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
toot_text += '\n'
|
toot_text += '\n'
|
||||||
|
|
||||||
toot_text += '#escacs' + '\n'
|
toot_text += 'partida: ' + str(game_id) + ' ' + '#escacs' + '\n'
|
||||||
|
|
||||||
board = chess.Board(on_going_game)
|
board = chess.Board(on_going_game)
|
||||||
|
|
||||||
|
@ -1203,7 +1352,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
toot_text += "\n* has perdut " + piece_name + "!\n"
|
toot_text += "\n* has perdut " + piece_name + "!\n"
|
||||||
|
|
||||||
toot_text += '\n#escacs' + '\n'
|
toot_text += '\npartida: ' + str(game_id) + ' ' + '#escacs' + '\n'
|
||||||
|
|
||||||
if username == white_user:
|
if username == white_user:
|
||||||
|
|
||||||
|
@ -1370,7 +1519,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
toot_text += '\n'
|
toot_text += '\n'
|
||||||
|
|
||||||
toot_text += '#escacs' + '\n'
|
toot_text += 'partida: ' + str(game_id) + ' ' + '#escacs' + '\n'
|
||||||
|
|
||||||
board = chess.Board(on_going_game)
|
board = chess.Board(on_going_game)
|
||||||
|
|
||||||
|
|
55
smtp_setup.py
Normal file
55
smtp_setup.py
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import getpass
|
||||||
|
import fileinput,re
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def create_dir():
|
||||||
|
if not os.path.exists('config'):
|
||||||
|
os.makedirs('config')
|
||||||
|
|
||||||
|
def create_file():
|
||||||
|
if not os.path.exists('config/smtp_config.txt'):
|
||||||
|
with open('config/smtp_config.txt', 'w'): pass
|
||||||
|
print(smtp_filepath + " created!")
|
||||||
|
|
||||||
|
def write_parameter( parameter, smtp_filepath ):
|
||||||
|
print("\n")
|
||||||
|
print("Setting up SMTP parameters...")
|
||||||
|
smtp_host = input("Enter SMTP hostname: ")
|
||||||
|
smtp_user_login = input("Enter SMTP user login, ex. user@" + smtp_host +"? ")
|
||||||
|
smtp_user_password = getpass.getpass("SMTP user password? ")
|
||||||
|
with open(smtp_filepath, "w") as text_file:
|
||||||
|
print("smtp_host: {}".format(smtp_host), file=text_file)
|
||||||
|
print("smtp_user_login: {}".format(smtp_user_login), file=text_file)
|
||||||
|
print("smtp_user_password: {}".format(smtp_user_password), file=text_file)
|
||||||
|
|
||||||
|
# Returns the parameter from the specified file
|
||||||
|
def get_parameter( parameter, smtp_filepath ):
|
||||||
|
# Check if file exists
|
||||||
|
if not os.path.isfile(smtp_filepath):
|
||||||
|
print("File %s not found, creating it."%smtp_filepath)
|
||||||
|
create_dir()
|
||||||
|
create_file()
|
||||||
|
write_parameter( parameter, smtp_filepath )
|
||||||
|
print("\n")
|
||||||
|
print("SMTP setup done!\n")
|
||||||
|
|
||||||
|
# Find parameter in file
|
||||||
|
with open( smtp_filepath ) as f:
|
||||||
|
for line in f:
|
||||||
|
if line.startswith( parameter ):
|
||||||
|
return line.replace(parameter + ":", "").strip()
|
||||||
|
|
||||||
|
# Cannot find parameter, exit
|
||||||
|
print(file_path + " Missing parameter %s "%parameter)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
# Load secrets from secrets file
|
||||||
|
smtp_filepath = "config/smtp_config.txt"
|
||||||
|
smtp_host = get_parameter("smtp_host", smtp_filepath)
|
||||||
|
smtp_user_login = get_parameter("smtp_user_login", smtp_filepath)
|
||||||
|
smtp_user_pass = get_parameter("smtp_user_pass", smtp_filepath)
|
||||||
|
|
Loading…
Referencia en una nova incidència