From 5b9f7944982ffb4270ff2b83131afb49d58cd975 Mon Sep 17 00:00:00 2001 From: burzuf Date: Sun, 22 Mar 2020 12:24:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1?= =?UTF-8?q?=D0=B4=20=D1=82=D1=80=D0=B8=D0=B3=D0=B3=D0=B5=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D1=8D=D0=BA=D1=88=D0=B5=D0=BD=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8.=20=D0=9F=D1=80=D0=B5=D0=B4=D0=B2=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=BD=D0=B0=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=20=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5?= =?UTF-8?q?=D1=80=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B5=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 13 ++- db_init.py | 7 ++ db_routing.py | 34 ++++++-- scenarioManger.py | 23 +++++ actions.py => triggers.py | 174 +++++++++++++++++++------------------- 5 files changed, 154 insertions(+), 97 deletions(-) create mode 100644 db_init.py create mode 100644 scenarioManger.py rename actions.py => triggers.py (97%) 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) + +# сценарии должны хранить логины и пароль +# запилить бота, возврат темы и отправителя в словаре.