From a2c43e750bfc84cafeeedd8166fcb1de0fa495ab Mon Sep 17 00:00:00 2001 From: Guilherme Brandt Date: Sat, 16 Feb 2019 00:15:39 -0200 Subject: [PATCH] Commit Inicial --- .gitignore | 126 +++++++++++++++++++++++++++++++++++++++++++++ __main__.py | 72 ++++++++++++++++++++++++++ build.cmd | 3 ++ config.yml | 3 ++ danger.yml | 28 ++++++++++ god.ico | Bin 0 -> 201582 bytes god/__init__.py | 23 +++++++++ god/checker.py | 77 +++++++++++++++++++++++++++ god/cli.py | 85 ++++++++++++++++++++++++++++++ god/config.py | 32 ++++++++++++ god/handler.py | 72 ++++++++++++++++++++++++++ god/interactive.py | 120 ++++++++++++++++++++++++++++++++++++++++++ god/log.py | 9 ++++ god/quotes.py | 28 ++++++++++ phrases.yml | 30 +++++++++++ requirements.txt | 3 ++ safe.yml | 11 ++++ 17 files changed, 722 insertions(+) create mode 100644 .gitignore create mode 100644 __main__.py create mode 100644 build.cmd create mode 100644 config.yml create mode 100644 danger.yml create mode 100644 god.ico create mode 100644 god/__init__.py create mode 100644 god/checker.py create mode 100644 god/cli.py create mode 100644 god/config.py create mode 100644 god/handler.py create mode 100644 god/interactive.py create mode 100644 god/log.py create mode 100644 god/quotes.py create mode 100644 phrases.yml create mode 100644 requirements.txt create mode 100644 safe.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..237d36f --- /dev/null +++ b/.gitignore @@ -0,0 +1,126 @@ + +# Created by https://www.gitignore.io/api/python +# Edit at https://www.gitignore.io/?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +### Python Patch ### +.venv/ + +# End of https://www.gitignore.io/api/python diff --git a/__main__.py b/__main__.py new file mode 100644 index 0000000..e7d34e5 --- /dev/null +++ b/__main__.py @@ -0,0 +1,72 @@ +import time + +import god +import god.interactive +import god.cli as cli +import god.log as log +import god.quotes as quotes +import god.config as config + + +def load_settings(): + cli.i_am("Carregando configurações...") + config.load() + cli.success("OK") + cli.print_settings() + + +def use_inet_phrases(): + cli.i_am("Pegando umas frases aleatórias...") + try: + n = quotes.load_inet() + cli.success("{} frases".format(n)) + except: + cli.error("Falhou :(") + use_stored_phrases() + + +def use_stored_phrases(): + cli.i_am("Usando frases aleatórias locais...") + n = quotes.load_local() + cli.success("Got {} phrases".format(n)) + + +def load_phrases(): + cli.i_am("Checando conexão com a internet...") + + if god.check_internet(): + cli.success("OK") + cli.list_begin() + use_inet_phrases() + cli.list_end() + else: + cli.error("Internet indisponível") + cli.list_begin() + use_stored_phrases() + cli.list_end() + + +def main(): + cli.clear() + cli.header() + + load_settings() + load_phrases() + + cli.success("Pronto.") + print() + cli.i_am("Iniciando ambiente interativo. Se divirta!") + time.sleep(2) + + cli.clear() + cli.interactive_header() + + god.start() + god.interactive.run() + + +if __name__ == "__main__": + try: + main() + except Exception as e: + log.error("main", e) diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..8d7b47c --- /dev/null +++ b/build.cmd @@ -0,0 +1,3 @@ +@echo off +pyinstaller --onefile -n god -i god.ico --add-data %PY_HOME%/Lib/site-packages/pyfiglet;./pyfiglet __main__.py god\__init__.py god\cli.py +pause \ No newline at end of file diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..552d68a --- /dev/null +++ b/config.yml @@ -0,0 +1,3 @@ +frequency: 30 +psname: notepad.exe +threshold: 1 diff --git a/danger.yml b/danger.yml new file mode 100644 index 0000000..9dc25e0 --- /dev/null +++ b/danger.yml @@ -0,0 +1,28 @@ +#=============================================================================== +# * danger.yml +#=============================================================================== +# Arquivo de configuração do God para situações em que o programa de +# monitoramento começa a ser usado. +# +# Obs.: Esse arquivo roda SÓ UMA VEZ, quando o programa é aberto pelo professor, +# Não conte com a execução contínua das instruções desse arquivo +#=============================================================================== +#------------------------------------------------------------------------------- +# Lista de processos que serão fechados (.exe é opcional) +#------------------------------------------------------------------------------- +kill: + - mspaint + - chrome + - osu! + - cs + - halflife + - Game +#------------------------------------------------------------------------------- +# Lista de linhas de comando que serão executadas +#------------------------------------------------------------------------------- +cmd: + #- start mspaint +#------------------------------------------------------------------------------- +# Flashbang: Abre um bloco de notas maximizado, pra esconder a tela +#------------------------------------------------------------------------------- +flashbang: false \ No newline at end of file diff --git a/god.ico b/god.ico new file mode 100644 index 0000000000000000000000000000000000000000..24c95ff07f1c7271702459ba8e7cb2b2ee26b21f GIT binary patch literal 201582 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 config.get("threshold"): + self.danger() + break + else: + self.safe() + + def danger(self): + if self.state != _GodState.ALERT: + self.state = _GodState.ALERT + handler.danger() + cli.clear() + cli.header('red') + cli.print_random_phrase() + cli.warning("Run, berg! Run!".center(cli.width())) + print() + cli.print_settings() + print(">", end=' ', flush=True) + + def safe(self): + if self.state == _GodState.ALERT: + self.state = _GodState.SAFE + handler.safe() + cli.clear() + cli.header() + cli.print_random_phrase() + cli.success("Back to business...".center(cli.width())) + print() + cli.print_settings() + print(">", end=' ', flush=True) + + def kill(self): + self.die = True + + def run(self): + try: + pythoncom.CoInitialize() + self.wmi = WMI() + + while not self.die: + self.check_memory() + time.sleep(1.0 / config.get("frequency")) + + pythoncom.CoUninitialize() + + except Exception as e: + log.error('memory_checker_thread', e) diff --git a/god/cli.py b/god/cli.py new file mode 100644 index 0000000..532ede4 --- /dev/null +++ b/god/cli.py @@ -0,0 +1,85 @@ +import os + +import god +import god.config as config +import god.quotes as quotes + +from termcolor import colored, cprint +from pyfiglet import Figlet + +_LIST_ITEM_MARKER = "~>" +_in_list = False + + +def width(): + return os.get_terminal_size().columns + + +def header(color='blue'): + f = Figlet(font='alligator2', justify='center', width=width()) + print() + print(colored(f.renderText('G o d'), color)) + print() + print(colored("v2.0.0".center(width()), color)) + print(flush=True) + + +def print_random_phrase(): + phrase, author = quotes.get_random() + text = ('"{}" ~ {}').format(phrase, author) + cprint(text.center(width()), 'yellow') + print(flush=True) + + +def print_settings(): + for key in config.DEFAULTS.keys(): + value = config.get(key) + print("\t", key, colored(':', 'cyan'), " \t", value, sep='') + print(flush=True) + + +def log(): + pass + + +def i_am(doing): + if _in_list: + print("\t", colored(_LIST_ITEM_MARKER, 'cyan'), end=' ') + print(colored(doing, 'yellow'), end=' ', flush=True) + + +def success(text): + print(colored(text, 'green'), flush=True) + + +def error(text): + print(colored(text, 'red'), flush=True) + + +def warning(text): + print(colored(text, 'yellow'), flush=True) + + +def info(text): + print(colored(text, 'blue'), flush=True) + + +def list_begin(): + global _in_list + _in_list = True + + +def list_end(): + global _in_list + _in_list = False + print() + + +def clear(): + os.system("cls || clear") + + +def interactive_header(): + header() + print_random_phrase() + print_settings() diff --git a/god/config.py b/god/config.py new file mode 100644 index 0000000..c20d57f --- /dev/null +++ b/god/config.py @@ -0,0 +1,32 @@ +import os.path +import yaml + +DEFAULTS = { + "psname": "notepad.exe", + "threshold": 1, + "frequency": 30 +} + +_config = {} + + +def load(cfg_file="config.yml"): + if not os.path.isfile(cfg_file): + return + + global _config + with open(cfg_file, "r") as file: + _config = yaml.load(file) or _config + + +def save(cfg_file="config.yml"): + with open(cfg_file, 'w') as file: + yaml.dump(_config, file, default_flow_style=False) + + +def get(key): + return _config[key] if key in _config else DEFAULTS[key] + + +def set(key, value): + _config[key] = value diff --git a/god/handler.py b/god/handler.py new file mode 100644 index 0000000..b00ca69 --- /dev/null +++ b/god/handler.py @@ -0,0 +1,72 @@ +import os +import yaml +import win32process +import win32con + +import god.cli as cli +import god.log as log + +from wmi import WMI + + +def flashbang_notepad(): + si = win32process.STARTUPINFO() + si.dwFlags = win32con.STARTF_USESHOWWINDOW + si.wShowWindow = win32con.SW_MAXIMIZE + win32process.CreateProcess( + None, + "notepad", + None, + None, + False, + 0, + None, + None, + si + ) + + +def kill_processes(list): + wmi = WMI() + for process_name in list: + if not process_name.endswith(".exe"): + process_name += ".exe" + + for process in wmi.Win32_Process(Name=process_name): + process.Terminate(1) + + +def danger(): + try: + with open('danger.yml', 'r') as danger_file: + danger_yml = yaml.load(danger_file) + + if 'flashbang' in danger_yml and danger_yml['flashbang']: + flashbang_notepad() + + if 'kill' in danger_yml and danger_yml['kill']: + kill_processes(danger_yml['kill']) + + if 'cmd' in danger_yml and danger_yml['cmd']: + for pname in danger_yml['cmd']: + os.system(pname) + + except Exception as e: + log.error("on_danger", e) + cli.error("OH GOD OH FUCK, I CAN'T RUN THE INSTRUCTIONS!!!!1!!1!!!") + cli.error("Flashbang it is, then.") + flashbang_notepad() + + +def safe(): + try: + with open('safe.yml', 'r') as safe_file: + safe_yml = yaml.load(safe_file) + + if 'cmd' in safe_yml and safe_yml['cmd']: + for pname in safe_yml['cmd']: + os.system(pname) + + except Exception as e: + log.error("on_safe", e) + cli.info("Hmmmmm, não tem instruções aqui...") diff --git a/god/interactive.py b/god/interactive.py new file mode 100644 index 0000000..9f5894e --- /dev/null +++ b/god/interactive.py @@ -0,0 +1,120 @@ +import re +import sys + +import god +import god.cli as cli +import god.log as log +import god.config as config + +from termcolor import colored, cprint + + +def no_arg(cmd_func): + def func_wrapper(*args): + if len(args) > 1: + cli.error("\tNão esperava parâmetros, mas OK.") + return cmd_func(*args) + return func_wrapper + + +def require_arg(cmd_func): + def func_wrapper(*args): + if len(args) != 1: + cli.error("\tSintaxe incorreta. Veja `help`.") + return None + else: + return cmd_func(*args) + return func_wrapper + + +def numeric(cmd_func): + def func_wrapper(*args): + if not args[0].isnumeric(): + cli.error("\tEsperava um número. Veja `help`.") + return None + else: + return cmd_func(int(args[0])) + return func_wrapper + + +@no_arg +def cmd_quit(): + god.stop() + sys.exit(0) + + +@no_arg +def cmd_help(): + print(colored(""" + GOD v2.0.0, by PD16 + + sm|threshold X : Define o limite de memória para X Kb + sp|process X : Define o processo monitorado para X + sf|frequency X : Define a frequência de atualização para X Hz + ss|save : Salva as configurações + cc|clear : Limpa a tela + h|help : Mostra a ajuda + q|quit|exit : Sai do programa + """, 'yellow')) + + +@no_arg +def cmd_save(): + config.save() + + +@no_arg +def cmd_clear(): + cli.clear() + cli.interactive_header() + + +@require_arg +@numeric +def cmd_threshold(value): + config.set('threshold', value) + cli.print_settings() + + +@require_arg +@numeric +def cmd_frequency(value): + config.set('frequency', value) + cli.print_settings() + + +@require_arg +def cmd_process(*parts): + psname = ' '.join(parts) + if not psname.endswith(".exe"): + psname += ".exe" + config.set('psname', psname) + cli.print_settings() + +_COMMAND_MAP = { + ('q', 'quit', 'exit'): cmd_quit, + ('h', 'help'): cmd_help, + ('ss', 'save'): cmd_save, + ('cc', 'clear'): cmd_clear, + ('sm', 'threshold'): cmd_threshold, + ('sf', 'frequency'): cmd_frequency, + ('sp', 'process'): cmd_process +} + + +def run(): + try: + while True: + line = input(colored("> ", 'cyan')).strip() + parts = re.split(r"\s+", line) + command = parts[0].lower() + + for alternatives in _COMMAND_MAP.keys(): + if command in alternatives: + _COMMAND_MAP[alternatives](*parts[1:]) + break + else: + cli.error( + f"\tComando não reconhecido `{command}`. Veja `help`.") + except Exception as e: + log.error("interactive", e) diff --git a/god/log.py b/god/log.py new file mode 100644 index 0000000..6395d6f --- /dev/null +++ b/god/log.py @@ -0,0 +1,9 @@ +import time +import os +import os.path + + +def error(location, exception): + with open("error.log", "a") as log_file: + timestamp = time.ctime(time.time()) + log_file.write(f"<{timestamp} at `{location}`> {exception}\n") diff --git a/god/quotes.py b/god/quotes.py new file mode 100644 index 0000000..88db698 --- /dev/null +++ b/god/quotes.py @@ -0,0 +1,28 @@ +import yaml +import random + +_nice_phrases = [] +_incredible_authors = [] + + +def load_inet(): + print("Frases da internet ainda não estão disponíveis.", end=' ') + return load_local() + + +def load_local(): + global _nice_phrases, _incredible_authors + + with open('phrases.yml', 'r', encoding='utf-8') as phrases_file: + phrases_yml = yaml.load(phrases_file) + _nice_phrases = phrases_yml['phrases'] + _incredible_authors = phrases_yml['authors'] + + return len(_nice_phrases) * len(_incredible_authors) + + +def get_random(): + phrase = random.choice(_nice_phrases) + author = random.choice(_incredible_authors) + + return phrase, author diff --git a/phrases.yml b/phrases.yml new file mode 100644 index 0000000..317a4f8 --- /dev/null +++ b/phrases.yml @@ -0,0 +1,30 @@ +#=============================================================================== +# * phrases.yml +#=============================================================================== +# Arquivo de configuração das frases aleatórias do God. +# +# As frases aparecem no formato `"frase" ~ autor` no programa, sorteando uma +# frase e um autor diferentes a cada vez. +#=============================================================================== +#------------------------------------------------------------------------------- +# Frases +#------------------------------------------------------------------------------- +phrases: + - Moe, moe, kyun! + - Quando eu morrer, quero virar um pinguim + - Pessoal, vamos? + - Omae wa mou shindeiru + - Nani?? + - Já se inscreveu no INOVA JOVEM?? + - "Lorem Ipsum (TODO: botar uma frase)" +#------------------------------------------------------------------------------- +# Autores +#------------------------------------------------------------------------------- +authors: + - Clarice Lispector + - Albert Einstein + - Miyamoto Musashi + - Paulo Vitor + - Bonoro + - Sakata Gintoki + - Tia Pat \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..260ff10 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +wmi +termcolor +pyyaml \ No newline at end of file diff --git a/safe.yml b/safe.yml new file mode 100644 index 0000000..7de3fde --- /dev/null +++ b/safe.yml @@ -0,0 +1,11 @@ +#=============================================================================== +# * safe.yml +#------------------------------------------------------------------------------- +# Arquivo de configuração do God para quando o programa de monitoramento volta +# a dormir (quando o prof. fechou) +#=============================================================================== +#------------------------------------------------------------------------------- +# Lista de linhas de comando que serão executadas +#------------------------------------------------------------------------------- +cmd: + - start mspaint \ No newline at end of file