seopardy/seopardy.py

105 lines
3.1 KiB
Python
Executable File

#!/usr/bin/python
# Licensed under GPLv3
# Written by Sebastian Lohff (seba@someserver.de)
# http://seba-geek.de/projects/seopardy/
from __future__ import print_function
import argparse
import yaml
import sys
from PySide import QtGui, QtCore
from music import MusicBox
from question import Questions, QuestionException
from gamestate import GameState
from game import SeopardyGame
from config import check_config
from buttonreader import get_input, InputException
def _parser():
parser = argparse.ArgumentParser(description="Sebas jeopardy/beopardy clone")
parser.add_argument("--gamestate", action="store", default=None, help="Gamestate to load to recover a crashed game")
parser.add_argument("--conf", action="store", default="seopardy.conf", help="Path to config file")
parser.add_argument("--no-cwd", action="store_true", default=False, help="Do not change working directory to question folder")
parser.add_argument("-v", "--verbose", action="store_true", default=False, help="Be more verbose, print filenames of missing files")
parser.add_argument("questions", action="store", help="Path to questionfile")
return parser
if __name__ == '__main__':
parser = _parser()
args = parser.parse_args()
questions = None
try:
questions = Questions(args.questions, appendPath=not args.no_cwd, verbose=args.verbose)
except QuestionException as e:
print(e.message, file=sys.stderr)
sys.exit(1)
# start gui
app = QtGui.QApplication([sys.argv[0]])
QtCore.QCoreApplication.setApplicationName("Seopardy")
# check and load config file
config = None
try:
config = yaml.safe_load(open(args.conf))
except IOError as e:
print("Error: Could not load config: %s" % (e,), file=sys.stderr)
sys.exit(1)
except yaml.scanner.ScannerError as e:
print("Error: Could not parse config file: %s" % (e,), file=sys.stderr)
sys.exit(1)
check_config(config)
# create or load gamestate
gamestate = None
if args.gamestate:
sstream = None
try:
sstream = open(args.gamestate, "r")
except IOError as e:
print("Error: Could not load gamestate: %s" % (e,), file=sys.stderr)
sys.exit(1)
gamestate = GameState.load(sstream, config["savedir"])
else:
gamestate = GameState(config["savedir"])
# init music box
MusicBox.init()
for name, path in config["music"].iteritems():
if path:
if not MusicBox.add_music(name, path):
print("Error: Could not load music %s (file %s)" % (name, path), file=sys.stderr)
sys.exit(1)
# BUG workaround: phonon is on 100% volume for some machines. try playing one song and immediately stopping it
MusicBox.play_music(MusicBox.media.keys()[0])
MusicBox.stop_music()
# create and start input threads
inputs = []
if config["playerInput"] is not None:
for playerInput in config["playerInput"]:
args = playerInput.get("Args", [])
if args is None:
args = []
try:
inp = get_input(playerInput["Type"], args, app)
inputs.append(inp)
except InputException as e:
print("Error: %s" % e, file=sys.stderr)
sys.exit(1)
inputs[-1].start()
# create board
board = SeopardyGame(questions, gamestate, inputs)
board.show()
app.exec_()
sys.exit()