From 8e29452fe4884c2a5cfcb10e3aac48ae0e97cdc6 Mon Sep 17 00:00:00 2001 From: daniel Date: Mon, 17 Jun 2019 20:10:03 +0200 Subject: [PATCH] added reading character from google sheet and fixed some bugs surrounding rolling skills from the character sheet --- .gitignore | 2 ++ chat/chat_commands.py | 24 ++++++++------------ main.py | 10 ++++---- users/sheet_reader.py | 53 +++++++++++++++++++++++++++++++++++++++++++ users/users.py | 20 ++++++++++++---- 5 files changed, 87 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index f3a6164..7852260 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,5 @@ dmypy.json # End of https://www.gitignore.io/api/python +credentials.json +token.pickle diff --git a/chat/chat_commands.py b/chat/chat_commands.py index 90f682d..df5724f 100644 --- a/chat/chat_commands.py +++ b/chat/chat_commands.py @@ -5,16 +5,14 @@ import re class CommandHandler: - def __init__(self): + def __init__(self, skill_dict): self.commands = { '/roll': self.custom_roll, '/r': self.custom_roll, '/whisper': self.whisper, '/w': self.whisper } - self.skill_map = {'Tera': {'Akrobatik': 25, - 'Arkane Kunde': 10} - } + self.skill_dict = skill_dict def handle(self, char, content): message = content.strip('\n') @@ -43,10 +41,7 @@ class CommandHandler: return response.build_dice_roll(char, ' '.join(message), eyes, result) def skill_roll(self, char, message): - print(char) - print(message) - print(self.skill_map) - if char not in self.skill_map: + if char not in self.skill_dict: return response.build_system_message(char, 'Ungültiger Charakter: {}'.format(char)) pattern = '(?P[a-zA-ZäöüÄÖÜß .&]+)(?P(?:\s*(?:\+|\-)\s*\d+)*)(?P[nrs]?)' @@ -55,12 +50,14 @@ class CommandHandler: return response.build_system_message(char, 'Unültige Formatierung des Befehls: {}'.format(message)) - skills = self.skill_map[char] - if match.group('skill')[1:] not in skills: + skills = self.skill_dict[char] + skill = match.group('skill')[1:] + skill = skill.rstrip(' ') + if skill not in skills: return response.build_system_message(char, - '{} hat die Fertigkeit {} nicht.'.format(char, match.group('skill'))) + '{} hat die Fertigkeit {} nicht.'.format(char, skill)) - skill = skills[match.group('skill')[1:]] + value = skills[skill] type_ = match.group('type') if len(type_) == 0 or type_ == 'n': type_ = dice.RollTypes.NORMAL @@ -68,10 +65,9 @@ class CommandHandler: type_ = dice.RollTypes.RISKY else: type_ = dice.RollTypes.SAFE - eyes, result = dice.skill_roll(skill, + eyes, result = dice.skill_roll(value, match.group('maths'), type_) - print(eyes, result) return response.build_dice_roll(char, message, eyes, result) def whisper(self, char, message): diff --git a/main.py b/main.py index 89d6c13..56be7d4 100755 --- a/main.py +++ b/main.py @@ -15,13 +15,14 @@ from users.users import UserManager sio = socketio.Server() app = socketio.WSGIApp(sio) actor_manager = ActorManager() -command_handler = CommandHandler() user_manager = UserManager() +command_handler = CommandHandler(user_manager.skill_dict) @sio.on('connect') def connect(sid, environ): print("CONNECTED: {}".format(sid)) + sio.emit(Events.SYSTEM_MESSAGE.value, {'sender': 'System', 'message': 'Verbunden!'}, room=sid) for user in user_manager.get_users(): sio.emit(Events.USER_ADDED.value, user, room=sid) @@ -53,10 +54,11 @@ def message(sid, data): if user_manager.has_user(data['old']): user_manager.remove_user(sid) sio.emit(Events.USER_REMOVED.value, data['old']) - user_manager.add_user(data['new']['characterName'], sid) + name, loaded = user_manager.add_user(data['new']['characterName'], sid) d = data['new'] - d['characterLoaded'] = True - d['skills'] = 'Akrobatik\nArkane Kunde\nSeefahrt' + d['characterLoaded'] = loaded + if loaded: + d['skills'] = user_manager.get_skills(name) sio.emit(Events.USER_EDITED.value, d, room=sid) sio.emit(Events.USER_ADDED.value, data['new']['characterName']) diff --git a/users/sheet_reader.py b/users/sheet_reader.py index e69de29..50133bd 100644 --- a/users/sheet_reader.py +++ b/users/sheet_reader.py @@ -0,0 +1,53 @@ +from __future__ import print_function +import pickle +import os.path +from googleapiclient.discovery import build +from google_auth_oauthlib.flow import InstalledAppFlow +from google.auth.transport.requests import Request + +# If modifying these scopes, delete the file token.pickle. +SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'] + +# The ID and range of a sample spreadsheet. +SPREADSHEET_ID = '1aICR-owH6CENOJ7l5gnCZTYo9z1b-ddzi0fx0cKkvfI' +RANGES = ['A12:C29', 'H12:J29', 'O20:Q23'] + +def load_character(character): + """Shows basic usage of the Sheets API. + Prints values from a sample spreadsheet. + """ + creds = None + # The file token.pickle stores the user's access and refresh tokens, and is + # created automatically when the authorization flow completes for the first + # time. + if os.path.exists('token.pickle'): + with open('token.pickle', 'rb') as token: + creds = pickle.load(token) + # If there are no (valid) credentials available, let the user log in. + if not creds or not creds.valid: + if creds and creds.expired and creds.refresh_token: + creds.refresh(Request()) + else: + flow = InstalledAppFlow.from_client_secrets_file( + 'credentials.json', SCOPES) + creds = flow.run_local_server() + # Save the credentials for the next run + with open('token.pickle', 'wb') as token: + pickle.dump(creds, token) + + service = build('sheets', 'v4', credentials=creds) + + # Call the Sheets API + sheet = service.spreadsheets() + values = [] + ranges = ['{}!{}'.format(character, r) for r in RANGES] + result = sheet.values().batchGet(spreadsheetId=SPREADSHEET_ID, + ranges=ranges).execute() + skills = dict() + for r in result.get('valueRanges', []): + for v in r.get('values', []): + if v: + skills[v[0]] = int(v[2]) + + return skills + diff --git a/users/users.py b/users/users.py index 6dccfe3..cf83a25 100644 --- a/users/users.py +++ b/users/users.py @@ -1,18 +1,26 @@ import chat.response as response +import users.sheet_reader as sheet_reader class UserManager: def __init__(self): self.users = dict() - self.skill_map = dict() + self.skill_dict = dict() def add_user(self, name, sid): self.users[sid] = name - print("ADDED USER, USERS NOW IS:", self.users) - return name + if name not in self.skill_dict: + try: + self.skill_dict[name] = sheet_reader.load_character(name) + loaded = True + except Exception as e: + print(e) + loaded = False + else: + loaded = True + return name, loaded def remove_user(self, sid): - print("REMOVING USER:", sid) if sid in self.users: return self.users.pop(sid) @@ -22,3 +30,7 @@ class UserManager: def get_users(self): return self.users.values() + def get_skills(self, name): + if name in self.skill_dict: + skills = self.skill_dict[name] + return '\n'.join(skills.keys())