diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index 3e270eb..912f2f7 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -21,13 +21,12 @@ import sqlite3 import time import twisted +import config import uuid - - - + class SiriProtocolHandler(Siri): - __not_recognized = {"de-DE": u"Entschuldigung, ich verstehe \"{0}\" nicht.", "en-US": u"Sorry I don't understand {0}", "fr-FR": u"Désolé je ne comprends pas ce que \"{0}\" veut dire."} - __websearch = {"de-DE": u"Websuche", "en-US": u"Websearch", "fr-FR": u"Rechercher sur le Web"} + __not_recognized = {"de-DE": u"Entschuldigung, ich verstehe \"{0}\" nicht.", "en-US": u"Sorry, I don't understand ‘{0}’.", "fr-FR": u"Désolé je ne comprends pas ce que \"{0}\" veut dire.", "zh-CN": u"对不起,我不知道“{0}”是什么意思。"} + __websearch = {"de-DE": u"Websuche", "en-US": u"Search the web", "fr-FR": u"Rechercher sur le Web", "zh-CN": u"搜索网页"} __scheduling_interval_timeout__ = 20 __timeout_delay = 10 @@ -319,6 +318,14 @@ def received_plist(self, plist): self.assistant.timeZoneId = objProperties['timeZoneId'] self.assistant.language = objProperties['language'] self.assistant.region = objProperties['region'] + #Here it is possible to support more languages combined with anyvoice package + #We can make assumption that the region will define the language. + if config.forcelanguage==True: + #Chinese Example + if self.assistant.region=="zh-CN": + self.assistant.language = "zh-CN" + self.logger.debug("Forced language to {0}".format(self.assistant.language)) + #Record the user firstName and nickName try: self.assistant.firstName = objProperties["meCards"][0]["properties"]["firstName"].encode("utf-8") @@ -334,7 +341,7 @@ def received_plist(self, plist): c.close() except: self.send_plist({"class":"CommandFailed", "properties": {"reason":"Database error", "errorCode":2, "callbacks":[]}, "aceId": str(uuid.uuid4()), "refId": plist['aceId'], "group":"com.apple.ace.system"}) - self.logger.error("Database Error on setting assistant data") + self.logger.error("Error on setting assistant data") else: self.send_plist({"class":"CommandFailed", "properties": {"reason":"Assistant to set data not found", "errorCode":2, "callbacks":[]}, "aceId": str(uuid.uuid4()), "refId": plist['aceId'], "group":"com.apple.ace.system"}) self.logger.warning("Trying to set assistant data without having a valid assistant") diff --git a/SiriServer.py b/SiriServer.py index 13e1296..9e7a796 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -13,11 +13,13 @@ exit(-1) from SiriProtocolHandler import SiriProtocolHandler -from optparse import OptionParser +#switched to argparse due to optionparser is a depriciated module and connot handle empty argument values +import argparse from os.path import exists from socket import gethostname import PluginManager import db +import config import logging import sys @@ -46,12 +48,12 @@ def __init__(self): self.numberOfConnections = 0 self.sessionCert = None self.sessionCACert = None - self.dbConnection = None + self.dbConnection = None def buildProtocol(self, addr): return SiriProtocolHandler(self, addr) - def startFactory(self): + def startFactory(self): logging.getLogger().info("Loading Session Certificates") caFile = open("keys/SessionCACert.pem") self.sessionCACert = crypto.load_certificate(crypto.FILETYPE_PEM,caFile.read()) @@ -188,24 +190,30 @@ def create_self_signed_cert(): def main(): - parser = OptionParser() - parser.add_option('-l', '--loglevel', default='info', dest='logLevel', help='This sets the logging level you have these options: debug, info, warning, error, critical \t\tThe standard value is info') - parser.add_option('-p', '--port', default=4443, type='int', dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') - parser.add_option('--logfile', default=None, dest='logfile', help='Log to a file instead of stdout.') - (options, _) = parser.parse_args() + parser = argparse.ArgumentParser(description='SiriServerCore\n') + parser.add_argument('-l', '--loglevel', default='info', dest='logLevel', help='This sets the logging level you have these options: debug, info, warning, error, critical \t\tThe standard value is info') + parser.add_argument('-p', '--port', default=4443, type=int, dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') + parser.add_argument('--logfile', default=None, dest='logfile', help='Log to a file instead of stdout.') + parser.add_argument('-f', '--forcelanguage', action='store_true', default=False, dest='forcelanguage', help='Force the server use language by region of device and ignore the Siri Settings language. Usefull with anyvoice cydia package. Adds functionallity for unsupported languages') + options = parser.parse_args() x = logging.getLogger() - x.setLevel(log_levels[options.logLevel]) - + x.setLevel(log_levels[options.logLevel]) if options.logfile != None: - h = logging.FileHandler(options.logfile) + h = logging.FileHandler(options.logfile) else: - h = logging.StreamHandler() - + h = logging.StreamHandler() + f = logging.Formatter(u"%(levelname)s %(message)s") h.setFormatter(f) x.addHandler(h) + if options.forcelanguage != False: + config.forcelanguage=True + x.info("Forcing languages to device region and ignoring Siri Languge settings") + else: + config.forcelanguage=False + create_self_signed_cert() try: diff --git a/config.py b/config.py new file mode 100644 index 0000000..2096f94 --- /dev/null +++ b/config.py @@ -0,0 +1,5 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +#This can be used as a module to set some config values for all classes +#It is not thread safe! But is safe for per server run values +forcelanguage=False \ No newline at end of file