diff --git a/__init__.py b/__init__.py index e498557..4157050 100644 --- a/__init__.py +++ b/__init__.py @@ -6,7 +6,9 @@ from flask import render_template, request, redirect, url_for from flask_login import LoginManager, login_user, login_required, logout_user, current_user import db_routing +from db_init import db_fill from db_routing import app, db +from scenarioManger import Executor login_manager = LoginManager(app) @@ -63,12 +65,14 @@ def workshop(): if request.method == 'POST': if 'NewScenarioName' in request.form: newScenarioName = request.form['NewScenarioName'] - triggerName = request.form['TriggerID'] + triggerID = request.form['TriggerID'] triggerArgs = request.form['TriggerArgs'] - actionName = request.form['ActionID'] + actionID = request.form['ActionID'] actionArgs = request.form['ActionArgs'] - db_routing.add_scenario(current_user.get_id(), newScenarioName, triggerName, triggerArgs, actionName, - actionArgs) + new_scenario = db_routing.add_scenario(current_user.get_id(), newScenarioName, triggerID, triggerArgs, + actionID, + actionArgs) + Executor(new_scenario) return redirect(url_for('workshop')) if 'TGUsername' in request.form: @@ -131,4 +135,5 @@ def verify_password(username, password): if __name__ == '__main__': if not os.path.exists('./data.db'): db.create_all() + db_fill() app.run() diff --git a/db_init.py b/db_init.py new file mode 100644 index 0000000..36921df --- /dev/null +++ b/db_init.py @@ -0,0 +1,7 @@ +from db_routing import add_trigger, add_action + + +def db_fill(): + add_trigger('Будильник', 'alarm_clock') + add_trigger('Проверить почту', 'check_email') + diff --git a/db_routing.py b/db_routing.py index bf30fdb..47d546b 100644 --- a/db_routing.py +++ b/db_routing.py @@ -66,6 +66,20 @@ def add_user(user_name, passw_hash): return False +def add_trigger(name, def_name): + new_trigger = Trigger(name=name, def_name=def_name) + db.session.add(new_trigger) + db.session.commit() + return new_trigger + + +def add_action(name, def_name): + new_action = Action(name=name, def_name=def_name) + db.session.add(new_action) + db.session.commit() + return new_action + + def add_scenario(owner_id, scenario_name, trigger_id, trigger_args, action_id, action_args): new_scenario = Scenario(owner_id=owner_id, scenario_name=scenario_name, trigger_id=trigger_id, trigger_args=trigger_args, action_id=action_id, action_args=action_args) @@ -81,14 +95,22 @@ def get_user(id=None, username=None): return User.query.filter_by(username=username).first() -def get_trigers(): - triggers_list = Trigger.query.all() - return triggers_list +def get_trigers(id=None): + if id is None: + triggers_list = Trigger.query.all() + return triggers_list + else: + trigger = Trigger.query.filter_by(id=id).first() + return trigger -def get_actions(): - actions_list = Action.query.all() - return actions_list +def get_actions(id=None): + if id is None: + actions_list = Action.query.all() + return actions_list + else: + action = Action.query.filter_by(id=id).first() + return action def get_user_scripts(current_user_id): diff --git a/scenarioManger.py b/scenarioManger.py new file mode 100644 index 0000000..aec1bbd --- /dev/null +++ b/scenarioManger.py @@ -0,0 +1,23 @@ +from threading import Thread +from triggers import * +import db_routing + + +class Executor(Thread): + def __init__(self, scenario): + threading.Thread.__init__(self) + self.sceanrio_id = scenario.id + self.trigger_def = db_routing.get_trigers(scenario.id).def_name + self.trigger_args = scenario.trigger_args + self.action_def = db_routing.get_actions(scenario.id).def_name + self.action_args = scenario.action_args + + def execute(self): + self.trigger_def(self.trigger_args) + self.action_def.def_name(self.action_args) + + def run(self): + thread = Thread(target=self.execute) + thread.start() + thread.join() + db_routing.delete_scenario(self.sceanrio_id) diff --git a/actions.py b/triggers.py similarity index 97% rename from actions.py rename to triggers.py index c75b4e6..bbf4053 100644 --- a/actions.py +++ b/triggers.py @@ -1,87 +1,87 @@ -# Парсер почты -import datetime -import email -import imaplib -# будильник -import threading -import time - -# То, что нужно будет передавать функциям - -# Инициализация будильника -userName = 'Denis' -year_Alarm_Clock = 2020 -month_Alarm_Clock = 3 -day_Alarm_Clock = 19 -hour_Alarm_Clock = 12 -min_Alarm_Clock = 49 -sec_Alarm_Clock = 0 -# Инициализация парсера почты -gmail_user = '' # Login -gmail_pass = '' # Password - - -# Сами функции - -# Будильник -def alarm_clock(year_Alarm_Clock, month_Alarm_Clock, day_Alarm_Clock, hour_Alarm_Clock, min_Alarm_Clock, - sec_Alarm_Clock): - dt = datetime.datetime(year_Alarm_Clock, month_Alarm_Clock, day_Alarm_Clock, hour_Alarm_Clock, min_Alarm_Clock, - sec_Alarm_Clock) - diff = (dt - datetime.datetime.now()).total_seconds() - try: - time.sleep(diff) - print('сообщение в телегу текст') - except: - print('Нельзя поставить будильник в прошлое') - return - - -# проверка почты на новое письмо gmail -# Нужно включить https://myaccount.google.com/lesssecureapps и https://mail.google.com/mail/u/2/#settings/fwdandpop - -def check_email(gmail_user, gmail_pass): - mail = imaplib.IMAP4_SSL('imap.gmail.com', 993) - mail.login(gmail_user, gmail_pass) - mail.list() - count_Email_Start = (mail.select("inbox")[1][0]).decode('utf-8') - while True: - mail.list() - count_Email_Current = (mail.select("inbox")[1][0]).decode('utf-8') - if count_Email_Current > count_Email_Start: - result, data = mail.search(None, "ALL") - ids = data[0] # Получаем сроку номеров писем - id_list = ids.split() # Разделяем ID писем - latest_email_id = id_list[-1] # Берем последний ID - result, data = mail.fetch(latest_email_id, "(RFC822)") # Получаем тело письма (RFC822) для данного ID - raw_email = data[0][1] - email_message = email.message_from_bytes(raw_email) - email_message_From = email_message['From'] - email_message_From = email_message_From[email_message_From.index('<'):email_message_From.index('>')] - email_message_From = email_message_From[1:] - print('Отправить сообщение в телегу о том, что занят') - print('Отправить "от кого" ', email_message_From) - count_Email_Start = count_Email_Current - time.sleep(15) # частота проверки нового письма - - -# Чтобы запустить будильник 1, Парсер 2 -Mode = 2 - -# Для создания потока будильника передаются: -# Id юзера который поставил будильник, и значения времени которые он поставил. Поток создаётся с именем(id) юзера -if __name__ == '__main__': - if Mode == 1: - Clock_Thread = threading.Thread( - target=alarm_clock, name=userName, args=(year_Alarm_Clock, - month_Alarm_Clock, - day_Alarm_Clock, - hour_Alarm_Clock, - min_Alarm_Clock, - sec_Alarm_Clock)) - Clock_Thread.start() - if Mode == 2: - check_email(gmail_user, gmail_pass) - -# сценарии должны хранить логины и пароль -# запилить бота, возврат темы и отправителя в словаре. +# Парсер почты +import datetime +import email +import imaplib +# будильник +import threading +import time + +# То, что нужно будет передавать функциям + +# Инициализация будильника +userName = 'Denis' +year_Alarm_Clock = 2020 +month_Alarm_Clock = 3 +day_Alarm_Clock = 19 +hour_Alarm_Clock = 12 +min_Alarm_Clock = 49 +sec_Alarm_Clock = 0 +# Инициализация парсера почты +gmail_user = '' # Login +gmail_pass = '' # Password + + +# Сами функции + +# Будильник +def alarm_clock(year_Alarm_Clock, month_Alarm_Clock, day_Alarm_Clock, hour_Alarm_Clock, min_Alarm_Clock, + sec_Alarm_Clock): + dt = datetime.datetime(year_Alarm_Clock, month_Alarm_Clock, day_Alarm_Clock, hour_Alarm_Clock, min_Alarm_Clock, + sec_Alarm_Clock) + diff = (dt - datetime.datetime.now()).total_seconds() + try: + time.sleep(diff) + print('сообщение в телегу текст') + except: + print('Нельзя поставить будильник в прошлое') + return + + +# проверка почты на новое письмо gmail +# Нужно включить https://myaccount.google.com/lesssecureapps и https://mail.google.com/mail/u/2/#settings/fwdandpop + +def check_email(gmail_user, gmail_pass): + mail = imaplib.IMAP4_SSL('imap.gmail.com', 993) + mail.login(gmail_user, gmail_pass) + mail.list() + count_Email_Start = (mail.select("inbox")[1][0]).decode('utf-8') + while True: + mail.list() + count_Email_Current = (mail.select("inbox")[1][0]).decode('utf-8') + if count_Email_Current > count_Email_Start: + result, data = mail.search(None, "ALL") + ids = data[0] # Получаем сроку номеров писем + id_list = ids.split() # Разделяем ID писем + latest_email_id = id_list[-1] # Берем последний ID + result, data = mail.fetch(latest_email_id, "(RFC822)") # Получаем тело письма (RFC822) для данного ID + raw_email = data[0][1] + email_message = email.message_from_bytes(raw_email) + email_message_From = email_message['From'] + email_message_From = email_message_From[email_message_From.index('<'):email_message_From.index('>')] + email_message_From = email_message_From[1:] + print('Отправить сообщение в телегу о том, что занят') + print('Отправить "от кого" ', email_message_From) + count_Email_Start = count_Email_Current + time.sleep(15) # частота проверки нового письма + + +# Чтобы запустить будильник 1, Парсер 2 +Mode = 2 + +# Для создания потока будильника передаются: +# Id юзера который поставил будильник, и значения времени которые он поставил. Поток создаётся с именем(id) юзера +if __name__ == '__main__': + if Mode == 1: + Clock_Thread = threading.Thread( + target=alarm_clock, name=userName, args=(year_Alarm_Clock, + month_Alarm_Clock, + day_Alarm_Clock, + hour_Alarm_Clock, + min_Alarm_Clock, + sec_Alarm_Clock)) + Clock_Thread.start() + if Mode == 2: + check_email(gmail_user, gmail_pass) + +# сценарии должны хранить логины и пароль +# запилить бота, возврат темы и отправителя в словаре.