From bc65ff575d4f40ef1865a3b8db520c6d4eb23805 Mon Sep 17 00:00:00 2001 From: blueShard-dev <63594396+blueShard-dev@users.noreply.github.com> Date: Sun, 28 Jun 2020 11:15:51 +0000 Subject: [PATCH] Add files via upload --- aion-0.1.0_alpha/Aion_Logo.png | Bin 0 -> 63995 bytes aion-0.1.0_alpha/aion_core/__init__.py | 143 ++ aion-0.1.0_alpha/aion_core/_error_codes.py | 120 ++ aion-0.1.0_alpha/aion_core/acph.py | 158 +++ aion-0.1.0_alpha/aion_core/config.py | 490 +++++++ aion-0.1.0_alpha/aion_core/language.py | 231 ++++ aion-0.1.0_alpha/aion_core/logging.py | 775 +++++++++++ aion-0.1.0_alpha/aion_core/plugin.py | 910 +++++++++++++ aion-0.1.0_alpha/aion_core/save.py | 91 ++ .../aion_core/shell/Aion_Logo.ico | Bin 0 -> 6909 bytes aion-0.1.0_alpha/aion_core/shell/shell.py | 228 ++++ .../aion_core/shell/shell_utils.py | 612 +++++++++ aion-0.1.0_alpha/aion_core/skill.py | 585 ++++++++ aion-0.1.0_alpha/aion_core/usb.py | 102 ++ aion-0.1.0_alpha/aion_core/utils.py | 1204 +++++++++++++++++ aion-0.1.0_alpha/aion_core/variable.py | 200 +++ .../etc/ACC/Aion Command Creator.py | 445 ++++++ aion-0.1.0_alpha/etc/ACC/acc_support.py | 91 ++ aion-0.1.0_alpha/etc/ACC/acc_test.py | 22 + aion-0.1.0_alpha/etc/ACC/config_example.cfg | 10 + aion-0.1.0_alpha/etc/Aion.pmdl | Bin 0 -> 10259 bytes aion-0.1.0_alpha/etc/uninstall.sh | 27 + aion_data/etc/install.sh | 11 + aion_data/language/de_DE.acph | 10 + aion_data/language/de_DE.lng | 19 + aion_data/language/en_US.acph | 10 + aion_data/language/en_US.lng | 19 + aion_data/plugins/run_after/run_after.xml | 2 + aion_data/plugins/run_before/run_before.xml | 2 + aion_data/skills/skills.py | 235 ++++ aion_data/skills/skills.xml | 10 + 31 files changed, 6762 insertions(+) create mode 100644 aion-0.1.0_alpha/Aion_Logo.png create mode 100644 aion-0.1.0_alpha/aion_core/__init__.py create mode 100644 aion-0.1.0_alpha/aion_core/_error_codes.py create mode 100644 aion-0.1.0_alpha/aion_core/acph.py create mode 100644 aion-0.1.0_alpha/aion_core/config.py create mode 100644 aion-0.1.0_alpha/aion_core/language.py create mode 100644 aion-0.1.0_alpha/aion_core/logging.py create mode 100644 aion-0.1.0_alpha/aion_core/plugin.py create mode 100644 aion-0.1.0_alpha/aion_core/save.py create mode 100644 aion-0.1.0_alpha/aion_core/shell/Aion_Logo.ico create mode 100644 aion-0.1.0_alpha/aion_core/shell/shell.py create mode 100644 aion-0.1.0_alpha/aion_core/shell/shell_utils.py create mode 100644 aion-0.1.0_alpha/aion_core/skill.py create mode 100644 aion-0.1.0_alpha/aion_core/usb.py create mode 100644 aion-0.1.0_alpha/aion_core/utils.py create mode 100644 aion-0.1.0_alpha/aion_core/variable.py create mode 100644 aion-0.1.0_alpha/etc/ACC/Aion Command Creator.py create mode 100644 aion-0.1.0_alpha/etc/ACC/acc_support.py create mode 100644 aion-0.1.0_alpha/etc/ACC/acc_test.py create mode 100644 aion-0.1.0_alpha/etc/ACC/config_example.cfg create mode 100644 aion-0.1.0_alpha/etc/Aion.pmdl create mode 100644 aion-0.1.0_alpha/etc/uninstall.sh create mode 100644 aion_data/etc/install.sh create mode 100644 aion_data/language/de_DE.acph create mode 100644 aion_data/language/de_DE.lng create mode 100644 aion_data/language/en_US.acph create mode 100644 aion_data/language/en_US.lng create mode 100644 aion_data/plugins/run_after/run_after.xml create mode 100644 aion_data/plugins/run_before/run_before.xml create mode 100644 aion_data/skills/skills.py create mode 100644 aion_data/skills/skills.xml diff --git a/aion-0.1.0_alpha/Aion_Logo.png b/aion-0.1.0_alpha/Aion_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9d0e67f7227000d249304e7f7677ddf663d7da5c GIT binary patch literal 63995 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 U^r@^)KplVn6PI)Kv*geJ4;8J5ApigX literal 0 HcmV?d00001 diff --git a/aion-0.1.0_alpha/aion_core/__init__.py b/aion-0.1.0_alpha/aion_core/__init__.py new file mode 100644 index 0000000..04a0d91 --- /dev/null +++ b/aion-0.1.0_alpha/aion_core/__init__.py @@ -0,0 +1,143 @@ +#!/usr/bin/python3 + +__author__ = "blueShard" +__license__ = "GPL-3.0" +__version__ = "0.1.0" + +try: + from .utils import aion_data_path, aion_path +except ImportError: + from utils import aion_data_path, aion_path + + +def speech_output(speech_output: str) -> None: + """ + plays a output of an artificial voice from the given words + + :param speech_output: str + the words to be said + syntax: + example: "This is an test" + :return: None + + :since: 0.1.0 + """ + try: + from .config import Aion + except ImportError: + from config import Aion + from os import system + + try: + tts_engine = Aion().get_tts_engine() + except IndexError: + Aion().reset() + tts_engine = Aion().get_tts_engine() + + if tts_engine == "espeak": + system("espeak -v" + Aion().get_language().split("_")[0] + " " + str(speech_output) + " stdout | aplay") + print("Sayed '" + str(speech_output) + "'") + elif tts_engine == "pico2wave": + system('pico2wave --lang=' + Aion().get_language().split("_")[0] + '-' + Aion().get_language().split("_")[1] + ' --wave=/tmp/aion.wav "' + str(speech_output) + "." + '"; aplay /tmp/aion.wav; rm /tmp/aion.wav') + print("Sayed '" + str(speech_output) + "'") + + +def start(sudo: bool = False) -> None: + """ + starts aion + + :param sudo: bool + says if 'aion' should run as sudo (True) or not (False) + syntax: + example: False + :return: None + + :since: 0.1.0 + """ + from os import system + if sudo is True: + system("sudo python3 " + aion_path + "/main.py") + else: + system("python3 " + aion_path + "/main.py") + + +class ExecuteAionFile: + + """ + base class for execution '.aion' files + + :since: 0.1.0 + """ + + def __init__(self, fname: str) -> None: + """ + makes the file available for all functions in this class and calls the '_main()' function + + :param fname: str + path of the file + syntax: + example: "/home/pi/test.aion" + :return: None + + :since: 0.1.0 + """ + self.fname = fname + + self._main() + + def _main(self) -> None: + """ + checks which type of an 'aion' file is the given file + + :return: None + + :since: 0.1.0 + """ + try: + from ._error_codes import init_no_file_type + from .utils import remove_space + except ImportError: + from _error_codes import init_no_file_type + from utils import remove_space + + for line in open(self.fname, "r"): + if line.isspace(): + continue + elif line.startswith("#"): + line = remove_space(line, "") + if line.startswith("#type:"): + line = line.replace("#type:", "") + if line.strip() == "skill": + self._skill() + elif "plugin" in line.strip(): + self._plugin() + else: + raise IndexError("Errno: " + init_no_file_type + " - Couldn't find file type in " + self.fname) + + def _plugin(self) -> None: + """ + execute the given file as plugin type + + :return: None + + :since: 0.1.0 + """ + try: + from .plugin import execute_aion_file_type_plugin + except ImportError: + from plugin import execute_aion_file_type_plugin + execute_aion_file_type_plugin(self.fname) + + def _skill(self) -> None: + """ + execute the given file as skill type + + :return: None + + :since: 0.1.0 + """ + try: + from .skill import execute_aion_file_type_skill + except ImportError: + from skill import execute_aion_file_type_skill + execute_aion_file_type_skill(self.fname) diff --git a/aion-0.1.0_alpha/aion_core/_error_codes.py b/aion-0.1.0_alpha/aion_core/_error_codes.py new file mode 100644 index 0000000..bc4c47e --- /dev/null +++ b/aion-0.1.0_alpha/aion_core/_error_codes.py @@ -0,0 +1,120 @@ +# __init__.py (01) + +init_no_file_type = "01792" + +# _error_codes.py (07) + +# _errors.py (04) + +# acph.py (57) + +acph_activate_phrase_exist = "57042" + +# config.py (40) + +config_no_hotword_file_file = "40863" +config_no_supported_listening_mode = "40518" +config_no_supported_listening_source = "40801" +config_no_supported_time_format = "40014" +config_no_supported_tts_engine = "40744" +config_name_config_is_used_as_root_name = "40026" +config_character_must_be_in_alphabet = "40955" + +config_root_tag_cannot_be_removed = "40471" +config_root_tag_cannot_be_updated = "40849" + +# language.py (68) + +language_lng_file_doesnt_exist = "16898" +language_entry_already_exist = "66873" +language_lng_file_already_exist = "68481" + +# logging.py (87) + +# save.py (83) + +save_save_not_found = "83160" +save_save_name_already_exist = "83923" + +# plugin.py (36) + +plugin_aion_plugin_file_not_found = "36134" +plugin_to_much_aion_files = "36278" +plugin_couldnt_find_key = "36896" +plugin_couldnt_find_plugin_type = "36132" +plugin_illegal_run_after_pseudonym = "36987" +plugin_run_after_pseudonym_already_exist = "36059" +plugin_illegal_run_before_pseudonym = "36165" +plugin_run_before_pseudonym_already_exist = "36919" +plugin_file_doesnt_exist_in_setup_dir = "36713" +plugin_directory_doesnt_exist_in_setup_dir = "36426" +plugin_run_after_additional_directories_already_exist = "36550" +plugin_run_before_additional_directories_already_exist = "36635" +plugin_python3_module_not_found = "36277" + +plugin_couldnt_find_plugin_dot_aion = "36184" + +plugin_author_must_be_str = "36534" +plugin_plugin_name_must_be_str = "36370" +plugin_main_file_must_be_str = "36938" +plugin_main_file_not_found = "36430" +plugin_main_file_name_must_be_plugin_name = "36276" +plugin_skill_must_be_dict = "36261" +plugin_plugin_methods_must_be_dict = "36358" +plugin_version_must_be_str = "36184" +plugin_additional_directories_must_be_list_or_tuple = "36512" +plugin_couldnt_find_additional_directories_directory = "36606" +plugin_description_must_be_str = "36716" +plugin_language_locales_must_be_list_or_tuple = "36351" +plugin_language_dict_must_be_dict = "36297" +plugin_language_dict_character_must_be_in_alphabet = "36756" +plugin_license_must_be_str = "36333" +plugin_required_python3_package_must_be_list_or_tuple = "36054" + +# skill.py (25) + +skill_author_must_be_str = "25662" +skill_language_locales_must_be_list_or_tuple = "25351" +skill_skill_name_must_be_str = "25432" +skill_main_file_must_be_str = "25586" +skill_main_file_not_found = "25439" +skill_main_file_name_must_be_skill_name = "25737" +skill_version_must_be_str = "25133" +skill_additional_directories_must_be_list_or_tuple = "25902" +skill_couldnt_find_additional_directories_directory = "25271" +skill_description_must_be_str = "25367" +skill_language_dict_must_be_dict = "25487" +skill_language_dict_character_must_be_in_alphabet = "25540" +skill_license_must_be_str = "25248" +skill_required_python3_package_must_be_list_or_tuple = "25780" +skill_activate_phrases_must_be_dict = "25161" +skill_activate_phrases_character_must_be_in_alphabet = "25559" + +skill_package_couldnt_find_directory = "25816" +skill_package_couldnt_find_aion_file = "25505" +skill_package_expected_one_aion_file = "25253" + +skill_couldnt_find_key = "25319" +skill_skill_already_exist = "25045" +skill_file_doesnt_exist = "25174" +skill_directory_doesnt_exist = "25974" +skill_directory_already_exist = "25819" +skill_couldnt_install_python3_package = "25082" + +skill_couldnt_find_skill_dot_aion = "25184" + +# usb.py (99) + +# utils.py (92) + +utils_unexpected_error = "92700" +utils_fname_doesnt_exist = "92029" +utils_couldnt_find_parent = "92613" +utils_dict_index_out_of_range = "92743" + +# variable.py (20) + +variable_get_value_variable_file_variable_doesnt_exist = "92481" +variable_get_value_user_variables_variable_doesnt_exist = "92255" +variable_remove_variable_variable_doesnt_exist = "92010" +variable_set_value_variable_doesnt_exist = "92603" diff --git a/aion-0.1.0_alpha/aion_core/acph.py b/aion-0.1.0_alpha/aion_core/acph.py new file mode 100644 index 0000000..f486ecd --- /dev/null +++ b/aion-0.1.0_alpha/aion_core/acph.py @@ -0,0 +1,158 @@ +#!/usr/bin/python3 + +try: + from .config import Aion as _Aion + from .utils import aion_data_path as _aion_data_path +except ImportError: + from config import Aion as _Aion + from utils import aion_data_path as _aion_data_path + + +def _acph_file() -> str: + """ + gets the activate phrase file for the current language + + :return: None + + :since: 0.1.0 + """ + from colorama import Fore + from os.path import isfile + if isfile(acph_directory + "/" + language + ".acph") is False: + print(Fore.RED + "didn't found acph file in your language. Using the default acph file (en_US)" + Fore.RESET) + return acph_directory + "/en_US.acph" + else: + return acph_directory + "/" + language + ".acph" + + +language = _Aion().get_language() +acph_directory = _aion_data_path + "/language" +acph_file = _acph_file() +supported_languages = ["de_DE", "en_US"] + + +def add_acph(language_locale: str, skill: str, acph_dict: dict = {}) -> None: + """ + adds an new entry(s) to from argument 'language_locale' given language + + :param language_locale: str + language locale from the language to which the entry(s) is/are to be added + syntax: + example: "de_DE" + :param skill: str + skill name to which the acph belongs + syntax: "" + example: "test_skill" + :param acph_dict: dict, optional + defines a word or a sentence from which a method is called + syntax: {: } + example: {"start test": "MyTestMethod"} + NOTE: in key 'activate_phrase' you can use the '__and__' statement. This checks if the words before and after '__and__' are in the sentence that the user has spoken in + :return: None + + :since: 0.1.0 + """ + try: + from ._error_codes import acph_activate_phrase_exist + from .utils import BaseXMLWriter + except ImportError: + from _error_codes import acph_activate_phrase_exist + from utils import BaseXMLWriter + + acph_writer = BaseXMLWriter(acph_directory + "/" + language_locale + ".acph") + for acph, method in acph_dict: + if exist_acph(language_locale, acph): + raise IndexError("Errno: " + acph_activate_phrase_exist + " - The activate phrase " + acph + " already exist") + acph_writer.add("", acph, skill=skill, method=method) + acph_writer.write() + + +def create_acph_file(language_locale: str, skill_acph_dict_dict: dict = {}) -> None: + """ + creates a new '.acph' file for given language locale with given skill_acph_dict_dict + + :param language_locale: str + language locale of language from which the new file is to be created + syntax: + example: "en_US" + :param skill_acph_dict_dict: dict, optional + skill name you want to add specific entries + syntax: {: {: }} + example: {"test_skill": {"start test": "MyTestMethod"}} + NOTE: in key 'activate_phrase' you can use the '__and__' statement. This checks if the words before and after '__and__' are in the sentence that the user has spoken in + :return: None + + :since: 0.1.0 + """ + try: + from .utils import BaseXMLBuilder + except ImportError: + from utils import BaseXMLBuilder + + acph_builder = BaseXMLBuilder(language_locale) + for skill, acph_dict in skill_acph_dict_dict.items(): + for acph, method in acph_dict.items(): + acph_builder.create_root_element(acph, skill=skill, method=method) + + acph_builder.write(acph_directory + "/" + language_locale + ".acph") + + +def delete_acph(language_locale: str, acph_list: list = []) -> None: + """ + deletes entries from '.acph' + + :param language_locale: str + language locale from (file) which the activate phases is being deleted + syntax: + example: "en_US" + :param acph_list: list, optional + name of the activate phases you want to remove + syntax: [] + example: ["test_acph"] + :return: None + + :since: 0.1.0 + """ + try: + from .utils import BaseXMLWriter + except ImportError: + from utils import BaseXMLWriter + + acph_writer = BaseXMLWriter(acph_directory + "/" + language_locale + ".acph") + for item in acph_list: + acph_writer.remove("", str(item)) + acph_writer.write() + + +def exist_acph(language_locale: str, acph: str) -> bool: + """ + checks if a entry exist + + :param language_locale: str + language locale from (file) which the activate phrase should be search + syntax: + example: "en_US" + :param acph: str + activate phrase you want to check if exists + syntax: + example: "start test" + :return: bool + returns True if acph exist / False if not + syntax: + example: False + + :since: 0.1.0 + """ + try: + from .utils import BaseXMLReader + except ImportError: + from utils import BaseXMLReader + + acph = acph.replace(" ", "_") + + acph_reader = BaseXMLReader(acph_directory + "/" + language_locale + ".acph") + for item in acph_reader.get_infos([""]).items().index(0): + if acph in item["childs"]: + return True + else: + return False diff --git a/aion-0.1.0_alpha/aion_core/config.py b/aion-0.1.0_alpha/aion_core/config.py new file mode 100644 index 0000000..6cf8cf4 --- /dev/null +++ b/aion-0.1.0_alpha/aion_core/config.py @@ -0,0 +1,490 @@ +#!/usr/bin/python3 + +try: + from .utils import aion_data_path as _aion_data_path, BaseXMLReader as _BaseXMLReader, BaseXMLWriter as _BaseXMLWriter +except ImportError: + from utils import aion_data_path as _aion_data_path, BaseXMLReader as _BaseXMLReader, BaseXMLWriter as _BaseXMLWriter + + +config_file = _aion_data_path + "/config.xml" + + +class Aion: + """ + get infos about all aion internal configs (and change them) + + :since: 0.1.0 + """ + + def __init__(self) -> None: + """ + set all class values + + :return: None + + :since: 0.1.0 + """ + self.all_listening_modes = ["auto", "manual"] + self.all_stt_engines = ["google", "pocketsphinx"] + self.all_time_formats = ["12", "24"] + self.all_tts_engines = ["pico2wave", "espeak"] + self.supported_languages = ["de_DE", "en_US"] + + self._aion_cfg_reader = _BaseXMLReader(config_file) + self._aion_cfg_writer = _BaseXMLWriter(config_file) + + def get_hotword_file(self) -> str: + """ + get set hotword file path + + :return: str + returns path of the hotword file + syntax: + example: "/usr/local/aion-/etc/Aion.pmdl" + + :since: 0.1.0 + """ + from glob import glob + for value_list in self._aion_cfg_reader.get_infos(["hotword_file"]).values(): + for config in value_list: + if config["parent"]["tag"] == "aion": + return glob(config["text"])[0] + + def get_language(self) -> str: + """ + get set language locale + + :return: str + returns language locale + syntax: + example: "en_US" + + :since: 0.1.0 + """ + for value_list in self._aion_cfg_reader.get_infos(["language"]).values(): + for config in value_list: + if config["parent"]["tag"] == "aion": + return config["text"] + + def get_listening_mode(self) -> str: + """ + get set listening mode + + :return: str + returns listening mode + syntax: + example: "auto" + + :since: 0.1.0 + """ + for value_list in self._aion_cfg_reader.get_infos(["listening_mode"]).values(): + for config in value_list: + if config["parent"]["tag"] == "aion": + return config["text"] + + def get_pid_manipulation_number(self) -> int: + """ + get set pid manipulation number + + :return: int + returns the pid manipulation number + syntax: + example: 4 + + :since: 0.1.0 + """ + for value_list in self._aion_cfg_reader.get_infos(["pid_manipulation_number"]).values(): + for config in value_list: + if config["parent"]["tag"] == "aion": + return int(config["text"]) + + def get_stt_engine(self) -> str: + """ + get set speech-to-text engine + + :return: str + returns speech-to-text engine + syntax: + example: "google" + + :since: 0.1.0 + """ + for value_list in self._aion_cfg_reader.get_infos(["listening_source"]).values(): + for config in value_list: + if config["parent"]["tag"] == "aion": + return config["text"] + + def get_time_format(self) -> int: + """ + get set time format + + :return: str + returns time format + syntax: