This repository has been archived on 2024-10-14. You can view files and clone it, but cannot push or open issues or pull requests.
AutoZoom/daemon.py

1293 lines
60 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
import subprocess
import contextlib
import importlib
import time
import datetime
import os
import pathlib
import json
import getopt
import sys
import winsound
from random import randint
from pathlib import Path
from datetime import datetime, date, timedelta
from functions import *
if getConfig("use_colors"):
from colors import *
else:
RESET = ''
BLACK = RED = GREEN = YELLOW = BLUE = MAGENTA = CYAN = WHITE = ''
BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = ''
ULINE = REVERSE = ''
if os.name == 'nt':
clear = lambda: os.system('cls')
else:
clear = lambda: os.system('clear')
clear()
os.system("title Загрузка daemon...")
import libinstaller
import easygui
import tkinter
import keyboard
import ast
import inputimeout
import telegram_send
menu_choose = None
try:
from inputimeout import inputimeout, TimeoutOccurred
except:
print(f'[{YELLOW}WARN{RESET}] Не удалось импортировать классы "inputimeout" и "TimeoutOccurred" из модуля "inputimeout"')
def nowtime(seconds=True, noice=True, color=True):
now = datetime.now()
if seconds == True:
justnow = now.strftime("%H:%M:%S")
else:
justnow = now.strftime("%H:%M")
if noice == True:
if not color:
beautiful = f'[{justnow}]'
else:
beautiful = f'[{CYAN}{justnow}{RESET}]'
else:
if not color:
beautiful = f'{justnow}'
else:
beautiful = f'{CYAN}{justnow}{RESET}'
return beautiful
def act(x):
return x+10
def waitStart(runTime, action):
from datetime import datetime, time
from time import sleep
startTime = time(*(map(int, runTime.split(':'))))
while startTime > datetime.today().time():
sleep(2)
return action
def getPair(line):
key, sep, value = line.strip().partition(" ")
return int(key), value
def getLessons():
if not os.path.exists(files_folder+'lessons.json'):
with open(files_folder+'lessons.json', 'w', encoding="utf-8") as f:
f.write("[]")
f.close()
lessons_list = []
else:
with open(files_folder+'lessons.json', encoding="utf-8") as json_file:
lessons_list = json.load(json_file)
json_file.close()
return lessons_list
def getState():
output = os.popen('wmic process get description, processid').read()
if "CptHost.exe" in output:
return True
else:
return False
def listLessons(from_where='remove'):
try:
if from_where == 'editor':
print(f'{RESET}Полный список запланированных конференций:\n')
print(f'{BBLACK}================================================{RESET}')
for les in enumerate(getLessons()):
if les[1]["repeat"]:
repeat = 'Вкл.'
else:
repeat = 'Выкл.'
if les[1]["record"]:
record = 'Вкл.'
else:
record = 'Выкл.'
try:
repeat_day = getDay(les[1]["repeat_day"])
except:
repeat_day = 'Не повторяется'
length = len(str(les[0]))
spacer_all = 6 * ' '
spacer_ind = (5 - length) * ' '
print(f'{spacer_all}Имя: {YELLOW}{les[1]["name"]}{RESET}')
print(f'{spacer_all}Дата: {YELLOW}{les[1]["date"]}{RESET}')
print(f'{spacer_all}Время: {YELLOW}{les[1]["time"]}{RESET}')
print(f' {GREEN}{les[0]}{RESET}{spacer_ind}Ссылка: {YELLOW}{les[1]["link"]}{RESET}')
print(f'{spacer_all}Повтор: {YELLOW}{repeat}{RESET}')
print(f'{spacer_all}День: {YELLOW}{repeat_day}{RESET}')
print(f'{spacer_all}Запись: {YELLOW}{record}{RESET}')
print(f'{BBLACK}================================================{RESET}')
if from_where == 'editor':
none = input('\n\n > ')
except KeyboardInterrupt:
clear()
return
def sortLessons(dictionary):
dictionary.sort(key = lambda x: datetime.strptime(x['time'], '%H:%M'))
dictionary.sort(key = lambda x: datetime.strptime(x['date'], '%d.%m.%Y'))
def getDayNum(day):
output = datetime.strptime(day, "%d.%m.%Y").isoweekday()
return output
def getDay(number):
if number == 1:
return 'Понедельник'
if number == 2:
return 'Вторник'
if number == 3:
return 'Среда'
if number == 4:
return 'Четверг'
if number == 5:
return 'Пятница'
if number == 6:
return 'Суббота'
if number == 7:
return 'Воскресенье'
def addLesson():
try:
local_lessons = {}
lessons_got = getLessons()
lessname = input(f'{RESET}Введите (своё) имя конференции:\n\n > {CYAN}')
local_lessons.update({"name": lessname})
while True:
clear()
today = date.today()
today_1 = date.today() + timedelta(days=1)
today_2 = date.today() + timedelta(days=2)
today_3 = date.today() + timedelta(days=3)
today_4 = date.today() + timedelta(days=4)
today_5 = date.today() + timedelta(days=5)
today_6 = date.today() + timedelta(days=6)
print(f'{RESET}Введите дату урока или номер дня ({BRED}ДД.ММ.ГГГГ{RESET}):\n')
print(f' {BRED}1.{RESET} {today.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}2.{RESET} {today_1.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_1.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}3.{RESET} {today_2.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_2.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}4.{RESET} {today_3.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_3.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}5.{RESET} {today_4.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_4.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}6.{RESET} {today_5.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_5.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}7.{RESET} {today_6.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_6.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
try:
lessdate = input(f'\n > {BRED}')
if lessdate == '':
finallessdate = lessons_got[edi]["date"]
elif lessdate == '1':
finallessdate = today.strftime("%d.%m.%Y")
elif lessdate == '2':
finallessdate = today_1.strftime("%d.%m.%Y")
elif lessdate == '3':
finallessdate = today_2.strftime("%d.%m.%Y")
elif lessdate == '4':
finallessdate = today_3.strftime("%d.%m.%Y")
elif lessdate == '5':
finallessdate = today_4.strftime("%d.%m.%Y")
elif lessdate == '6':
finallessdate = today_5.strftime("%d.%m.%Y")
elif lessdate == '7':
finallessdate = today_6.strftime("%d.%m.%Y")
else:
try:
test = (datetime.strptime(lessdate, "%d.%m.%Y"))
finallessdate = lessdate
except:
continue
local_lessons.update({"date": finallessdate})
break
except:
continue
while True:
clear()
try:
lesstime = input(f'{RESET}Введите время конференции ({BRED}ЧЧ:ММ{RESET}):\n\n > {BRED}')
finallesstime = (datetime.strptime(lesstime, "%H:%M"))
local_lessons.update({"time": lesstime})
break
except:
continue
clear()
lesslink = input(f'{RESET}Введите ссылку на конференцию:\n\n > {BRED}')
local_lessons.update({"link": lesslink})
while True:
clear()
repeat = input(f'{RESET}Повторять эту конференцию ({getDay(getDayNum(finallessdate))})? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n\n > ')
if repeat.lower() in ['y', 'yes', 'д', 'да']:
finalrepeat = True
finalrepeatday = getDayNum(finallessdate)
local_lessons.update({"repeat": finalrepeat})
local_lessons.update({"repeat_day": finalrepeatday})
break
elif repeat.lower() in ['n', 'no', 'н', 'нет']:
finalrepeat = False
finalrepeatday = None
local_lessons.update({"repeat": finalrepeat})
local_lessons.update({"repeat_day": finalrepeatday})
break
else:
continue
while True:
clear()
lessrecord = input(f'Записать эту конференцию? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n\n > ')
if lessrecord.lower() in ['y', 'yes', 'д', 'да']:
finallessrecord = True
local_lessons.update({"record": finallessrecord})
break
elif lessrecord.lower() in ['n', 'no', 'н', 'нет']:
finallessrecord = False
local_lessons.update({"record": finallessrecord})
break
else:
continue
lessons_got.append(dict(local_lessons))
sortLessons(lessons_got)
saveJson(files_folder+'lessons.json', lessons_got)
clear()
print(f'Добавлен урок {CYAN}{local_lessons["name"]}{RESET} за {BRED}{local_lessons["date"]}{RESET} на время {BRED}{local_lessons["time"]}{RESET}.')
none = input('\n > ')
except KeyboardInterrupt:
clear()
return
def editLesson():
try:
local_lessons = {}
lessons_got = getLessons()
while True:
print(f'{RESET}Выберите номер (индекс) для изменения:\n')
listLessons()
lessons_got = getLessons()
print(f'\nДля отмены операции введите {BRED}c{RESET} или {BRED}cancel{RESET}')
edi = input(f'\n > {BGREEN}')
if not isinstance(edi, int):
if edi.lower() == 'c' or edi.lower() == 'cancel':
clear()
return
try:
edi = int(edi)
except:
clear()
continue
try:
probe = lessons_got[edi]["name"]
break
except:
clear()
print(f'{RESET}Выберите {ULINE}правильный{RESET} индекс (номер) для изменения.')
time.sleep(3)
clear()
continue
break
clear()
lessname = input(f'{RESET}Введите (своё) имя конференции:\n\nОригинальное имя: {CYAN}{lessons_got[edi]["name"]}{RESET}\n\n > {CYAN}')
if lessname == '':
lessname = lessons_got[edi]["name"]
local_lessons.update({"name": lessname})
while True:
clear()
today = date.today()
today_1 = date.today() + timedelta(days=1)
today_2 = date.today() + timedelta(days=2)
today_3 = date.today() + timedelta(days=3)
today_4 = date.today() + timedelta(days=4)
today_5 = date.today() + timedelta(days=5)
today_6 = date.today() + timedelta(days=6)
print(f'{RESET}Введите дату урока или номер дня ({BRED}ДД.ММ.ГГГГ{RESET}):\n')
print(f' {BRED}1.{RESET} {today.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}2.{RESET} {today_1.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_1.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}3.{RESET} {today_2.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_2.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}4.{RESET} {today_3.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_3.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}5.{RESET} {today_4.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_4.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}6.{RESET} {today_5.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_5.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}7.{RESET} {today_6.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_6.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f'\nОригинальная дата: {BRED}{lessons_got[edi]["date"]}{RESET}')
try:
lessdate = input(f'\n > {BRED}')
if lessdate == '':
finallessdate = lessons_got[edi]["date"]
elif lessdate == '1':
finallessdate = today.strftime("%d.%m.%Y")
elif lessdate == '2':
finallessdate = today_1.strftime("%d.%m.%Y")
elif lessdate == '3':
finallessdate = today_2.strftime("%d.%m.%Y")
elif lessdate == '4':
finallessdate = today_3.strftime("%d.%m.%Y")
elif lessdate == '5':
finallessdate = today_4.strftime("%d.%m.%Y")
elif lessdate == '6':
finallessdate = today_5.strftime("%d.%m.%Y")
elif lessdate == '7':
finallessdate = today_6.strftime("%d.%m.%Y")
else:
try:
test = (datetime.strptime(lessdate, "%d.%m.%Y"))
finallessdate = lessdate
except:
continue
local_lessons.update({"date": finallessdate})
break
except:
continue
while True:
clear()
try:
lesstime = input(f'{RESET}Введите время конференции ({BRED}ЧЧ:ММ{RESET}):\n\nОригинальное время: {BRED}{lessons_got[edi]["time"]}{RESET}\n\n > {BRED}')
if lesstime == '':
finallesstime = lessons_got[edi]["time"]
lesstime = lessons_got[edi]["time"]
else:
try:
finallesstime = (datetime.strptime(lesstime, "%H:%M"))
finallesstime = lesstime
except:
continue
local_lessons.update({"time": lesstime})
break
except:
continue
clear()
lesslink = input(f'{RESET}Введите ссылку на конференцию\n\nОригинальная ссылка: {BRED}{lessons_got[edi]["link"]}{RESET}\n\n > {BRED}')
if lesslink == '':
lesslink = lessons_got[edi]["link"]
local_lessons.update({"link": lesslink})
while True:
clear()
try:
lessrepeatday = getDay(lessons_got[edi]["repeat_day"])
except:
lessrepeatday = 'Не повторяется'
print(f'{RESET}Повторять эту конференцию ({YELLOW}{getDay(getDayNum(finallessdate))}{RESET})? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})')
print(f'\nОригинальное значение: {BRED}{lessrepeatday}{RESET}')
repeat = input('\n > ')
if repeat.lower() in ['y', 'yes', 'д', 'да']:
finalrepeat = True
finalrepeatday = getDayNum(finallessdate)
local_lessons.update({"repeat": finalrepeat})
local_lessons.update({"repeat_day": finalrepeatday})
break
elif repeat.lower() in ['n', 'no', 'н', 'нет']:
finalrepeat = False
local_lessons.update({"repeat": finalrepeat})
break
elif repeat == '':
finalrepeat = lessons_got[edi]["repeat"]
local_lessons.update({"repeat": finalrepeat})
try:
finalrepeatday = lessons_got[edi]["repeat_day"]
local_lessons.update({"repeat_day": finalrepeatday})
except:
pass
break
else:
continue
while True:
clear()
print(f'Записать эту конференцию? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})')
print(f'\nОригинальное значение: {BRED}{lessons_got[edi]["record"]}{RESET}')
lessrecord = input('\n > ')
if lessrecord.lower() in ['y', 'yes', 'д', 'да']:
finallessrecord = True
local_lessons.update({"record": finallessrecord})
break
elif lessrecord.lower() in ['n', 'no', 'н', 'нет']:
finallessrecord = False
local_lessons.update({"record": finallessrecord})
break
elif lessrecord == '':
finallessrecord = lessons_got[edi]["record"]
local_lessons.update({"record": finallessrecord})
break
else:
continue
del lessons_got[edi]
lessons_got.append(dict(local_lessons))
sortLessons(lessons_got)
saveJson(files_folder+'lessons.json', lessons_got)
clear()
print(f'Изменён урок {CYAN}{lessname}{RESET} за {BRED}{finallessdate}{RESET} на время {BRED}{finallesstime}{RESET}.')
none = input('\n > ')
except KeyboardInterrupt:
clear()
return
def removeLesson():
try:
while True:
print(f'{RESET}Выберите номер (индекс) для удаления:\n')
listLessons()
lessons_local = getLessons()
print(f'\n{BBLACK}Для отмены операции введите {BRED}c{BBLACK} или {BRED}cancel{RESET}')
rem = input(f'\n > {BRED}')
if rem.lower() == 'c' or rem.lower() == 'cancel':
clear()
break
else:
try:
rem = int(rem)
except:
clear()
continue
try:
del_name = lessons_local[rem]["name"]
del_date = lessons_local[rem]["date"]
del_time = lessons_local[rem]["time"]
del lessons_local[rem]
except:
clear()
print(f'{RESET}Выберите {ULINE}правильный{RESET} индекс (номер) для удаления.')
time.sleep(3)
clear()
continue
sortLessons(lessons_local)
saveJson(files_folder+'lessons.json', lessons_local)
clear()
print(f'{RESET}Удалён урок {CYAN}{del_name}{RESET} за {BRED}{del_date}{RESET} на время {BRED}{del_time}{RESET}.')
none = input('\n > ')
break
except KeyboardInterrupt:
clear()
return
def removeAllLessons():
try:
while True:
clear()
removeall = input(f'{RESET}Вы уверены что хотите удалить все конференции? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n{BRED}Внимание!{RESET} Это действие нельзя обратить!\nВаши настройки затронуты НЕ будут.\n\n > ')
if removeall.lower() in ['y', 'yes', 'д', 'да']:
with open(files_folder+'lessons.json', 'w', encoding="utf-8") as f:
f.write("[]")
f.close()
clear()
none = input('Все уроки были удалены.\n\n > ')
clear()
break
elif removeall.lower() in ['n', 'no', 'н', 'нет']:
clear()
break
else:
continue
except KeyboardInterrupt:
clear()
return
import rpc
def editor():
try:
os.system("title AutoZoom (Редактор)")
from main import mainMenu
while True:
clear()
print(f'{BBLACK}»{RESET} Меню редактора\n')
print(f' {BRED}1.{RESET} Добавить урок')
print(f' {BRED}2.{RESET} Изменить урок')
print(f' {BRED}3.{RESET} Удалить урок')
print(f' {BRED}4.{RESET} Посмотреть уроки')
print(f' {BRED}5.{RESET} Удалить все уроки')
print(f' {BRED}6.{RESET} В главное меню')
editor_choose = input(f'\n > {BRED}')
if editor_choose == '1':
clear()
addLesson()
elif editor_choose == '2':
clear()
editLesson()
elif editor_choose == '3':
clear()
removeLesson()
elif editor_choose == '4':
clear()
listLessons(from_where = 'editor')
elif editor_choose == '5':
clear()
removeAllLessons()
elif editor_choose == '6':
rpc.inMenu()
clear()
os.system("title AutoZoom (Главная)")
mainMenu()
else:
continue
except KeyboardInterrupt:
rpc.inMenu()
clear()
return
def tgsend(enabled, message):
if enabled:
if os.path.exists(files_folder+'telegram.conf'):
tg_file = open(files_folder+'telegram.conf', 'r', encoding="utf-8")
tg_text = tg_file.read()
if tg_text != 'Not Configured':
telegram_send.send(messages=[f"{message}"], parse_mode="markdown", conf=files_folder+"telegram.conf")
def playSound(soundname):
if getConfig("sounds"):
winsound.PlaySound(sounds_folder+soundname+".wav", winsound.SND_FILENAME)
def settings():
try:
while True:
os.system("title AutoZoom (Настройки)")
clear()
if getConfig("debug"):
debug_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("debug"):
debug_val = f'{BRED}Выкл.{RESET}'
else:
debug_val = f'{BRED}ERROR{RESET}'
if getConfig("run_fullscreen"):
fullscreen_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("run_fullscreen"):
fullscreen_val = f'{BRED}Выкл.{RESET}'
else:
fullscreen_val = f'{BRED}ERROR{RESET}'
if getConfig("sounds"):
sounds_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("sounds"):
sounds_val = f'{BRED}Выкл.{RESET}'
else:
sounds_val = f'{BRED}ERROR{RESET}'
if getConfig("obs_exe") and getConfig("obs_core") not in [None, 'Disabled']:
obs_val = f'{BGREEN}Вкл.{RESET}'
else:
obs_val = f'{BRED}Выкл.{RESET}'
# Пока слишком много ошибок
# if getConfig("use_rpc"):
# rpc_val = f'{BGREEN}Вкл.{RESET}'
# elif not getConfig("use_rpc"):
# rpc_val = f'{BRED}Выкл.{RESET}'
# else:
# rpc_val = f'{BRED}ERROR{RESET}'
if getConfig("use_colors"):
color_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("use_colors"):
color_val = f'{BRED}Выкл.{RESET}'
else:
color_val = f'{BRED}ERROR{RESET}'
if getConfig("shutdown_enabled"):
shutdown_en_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("shutdown_enabled"):
shutdown_en_val = f'{BRED}Выкл.{RESET}'
else:
shutdown_en_val = f'{BRED}ERROR{RESET}'
if os.path.exists(files_folder+'telegram.conf'):
tg_file = open(files_folder+'telegram.conf', 'r', encoding="utf-8")
tg_text = tg_file.read()
if tg_text != 'Not Configured':
tg_var = f'{BGREEN}Настроен{RESET}'
else:
tg_var = f'{BRED}Не настроен{RESET}'
else:
tg_var = f'{BRED}Не настроен{RESET}'
if getConfig("telegram_enabled"):
telegram_en_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("debug"):
telegram_en_val = f'{BRED}Выкл.{RESET}'
else:
telegram_en_val = f'{BRED}ERROR{RESET}'
shutdown_time_val = getConfig("shutdown_timeout")
start_val = getConfig("start")
stop_val = getConfig("stop")
print(f'{RESET}{BBLACK}»{RESET} Настройки\n')
print(f' {BRED}1.{RESET} Режим отладки ({debug_val})')
print(f' {BBLACK}Не рекомендуем включать его без необходимости\n')
print(f' {BRED}2.{RESET} Цветной вывод ({color_val})')
print(f' {BBLACK}Отображение цветных текстов в меню и выводе (нужен перезапуск)\n')
print(f' {BRED}3.{RESET} Полный экран ({fullscreen_val})')
print(f' {BBLACK}Эмулировать вызов полного экрана при запуске (окно должно быть в фокусе)\n')
print(f' {BRED}4.{RESET} Звуковые сигналы ({sounds_val})')
print(f' {BBLACK}Воспроизводить звуки при начале/конце уроков и записи видео\n')
print(f' {BRED}5.{RESET} Запись через OBS ({obs_val})')
print(f' {BBLACK}Возможность записи уроков через OBS\n')
# Пока слишком много ошибок
# print(f' {BRED}3.{RESET} Discord RPC ({rpc_val})')
# print(f' {BBLACK}Показывать какой идёт урок и какое меню открыто (нужен перезапуск)\n')
print(f' {BRED}6.{RESET} Автовыключение ({shutdown_en_val})')
print(f' {BBLACK}Когда уроки закончатся компьютер выключится\n')
print(f' {BRED}7.{RESET} Таймаут выключения ({YELLOW}{shutdown_time_val} мин.{RESET})')
print(f' {BBLACK}Время в минутах после которого ПК будет выключен\n')
print(f' {BRED}8.{RESET} Начать запись ({YELLOW}{start_val}{RESET})')
print(f' {BBLACK}Комбинация клавиш для начала записи через OBS (см. документацию)\n')
print(f' {BRED}9.{RESET} Остановить запись ({YELLOW}{stop_val}{RESET})')
print(f' {BBLACK}Комбинация клавиш для остановки записи через OBS (см. документацию)\n')
print(f' {BRED}10.{RESET} Отправлять уведомления ({telegram_en_val})')
print(f' {BBLACK}Ваш бот отправит сообщениия о начале/конце урока и выключении ПК\n')
print(f' {BRED}11.{RESET} Настроить Telegram бота ({tg_var})')
print(f' {BBLACK}Настроить на вашем ПК бота для ЛС (см. документацию)\n')
print(f' {BRED}12.{RESET} Сбросить все настройки')
print(f' {BBLACK}Восстановить настройки по умолчанию\n')
print(f' {BRED}13.{RESET} В главное меню')
print(f' {BBLACK}Выйти без внесения изменений{RESET}\n')
print(f' {BBLACK}Для переключения параметров Вкл/Выкл просто введите номер\n Если окно приложения слишком мелкое - увеличьте его или листайте это меню{RESET}')
settings_choose = input(f'\n > {BRED}')
if settings_choose == '1':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
config_list["debug"] = not getConfig("debug")
saveJson(files_folder+'config.json', config_list)
clear()
continue
elif settings_choose == '2':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
config_list["use_colors"] = not getConfig("use_colors")
saveJson(files_folder+'config.json', config_list)
clear()
continue
elif settings_choose == '3':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
config_list["run_fullscreen"] = not getConfig("run_fullscreen")
saveJson(files_folder+'config.json', config_list)
clear()
continue
elif settings_choose == '4':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
config_list["sounds"] = not getConfig("sounds")
saveJson(files_folder+'config.json', config_list)
clear()
continue
elif settings_choose == '5':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
if getConfig("obs_core") and getConfig("obs_exe") not in [None, 'Disabled']:
config_list["obs_core"] = 'Disabled'
config_list["obs_exe"] = 'Disabled'
else:
clear()
obs_choice = input(f'{RESET}Хотите использовать запись через OBS? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET}): ')
if obs_choice.lower() in ['y', 'yes', 'д', 'да']:
while True:
try:
filename = easygui.fileopenbox('Выберите путь до obs32.exe или obs64.exe')
if filename.find("obs64.exe") != -1:
config_list["obs_exe"] = filename
config_list["obs_core"] = filename[:-9]
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-9]}{RESET}')
time.sleep(3)
break
elif filename.find("obs32.exe") != -1:
config_list["obs_exe"] = filename
config_list["obs_core"] = filename[:-9]
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-9]}{RESET}')
time.sleep(3)
break
elif filename.find("obs.exe") != -1:
f.write(filename)
config_list["obs_exe"] = filename
config_list["obs_core"] = filename[:-7]
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-7]}{RESET}')
time.sleep(3)
break
else:
easygui.msgbox("Неверный путь")
break
except:
none = input('Вы не выбрали верный путь для OBS.\n\n > ')
clear()
break
saveJson(files_folder+'config.json', config_list)
clear()
continue
# Пока слишком много ошибок
# elif settings_choose == '3':
# with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
# config_list = json.load(json_file)
# config_list["use_rpc"] = not getConfig("use_rpc")
# saveJson(files_folder+'config.json', config_list)
# clear()
# continue
elif settings_choose == '6':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
config_list["shutdown_enabled"] = not getConfig("shutdown_enabled")
saveJson(files_folder+'config.json', config_list)
clear()
continue
elif settings_choose == '7':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
try:
clear()
config_list["shutdown_timeout"] = int(input(f'{RESET}Введите через сколько минут после конференции выключать ПК:\n\n > {BRED}'))
saveJson(files_folder+'config.json', config_list)
continue
except:
clear()
print(f'{RESET}Нужно использовать целое число.')
time.sleep(2)
continue
continue
elif settings_choose == '8':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
try:
clear()
config_list["start"] = input(f'{RESET}Введите комбинацию клавиш для начала записи OBS:\nЭта комбинация должна быть идентична оной в самом OBS!\n\n > {YELLOW}')
saveJson(files_folder+'config.json', config_list)
continue
except:
clear()
print(f'{RESET}Нужно использовать комбинацию клавиш в виде текста.')
time.sleep(2)
continue
continue
elif settings_choose == '9':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
try:
clear()
config_list["stop"] = input(f'{RESET}Введите комбинацию клавиш для остановки записи OBS:\nЭта комбинация должна быть идентична оной в самом OBS!\n\n > {YELLOW}')
saveJson(files_folder+'config.json', config_list)
continue
except:
clear()
print(f'{RESET}Нужно использовать комбинацию клавиш в виде текста.')
time.sleep(2)
continue
continue
elif settings_choose == '10':
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
config_list["telegram_enabled"] = not getConfig("telegram_enabled")
saveJson(files_folder+'config.json', config_list)
clear()
continue
elif settings_choose == '11':
clear()
print(f'{RESET}Пожалуйста, прочтите инструкцию по установке Telegram бота в {BRED}README.txt{RESET}')
print(f'или в документации/инструкции что в разделе {CYAN}Помощь{RESET} главного меню')
print(f'чтобы хорошо понимать что сейчас от вас нужно.')
none = input('\n > ')
while True:
clear()
try:
telegram_send.configure(files_folder+'telegram.conf', channel=False, group=False, fm_integration=False)
break
except:
clear()
continue
telegram_send.send(messages=[f"🎊 Конфигурация правильна, всё работает!"], parse_mode="markdown", conf=f"{files_folder}telegram.conf")
clear()
continue
elif settings_choose == '12':
while True:
clear()
reset_decision = input(f'{RESET}Вы уверены что хотите сбросить настройки? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n\n{BRED}Внимание!{RESET} Это действие нельзя обратить!\nВаш список конференций затронут НЕ будет.\n\n > ')
if reset_decision.lower() in ['y', 'yes', 'д', 'да']:
temp_config_list = {}
temp_config_list["debug"] = False
temp_config_list["shutdown_timeout"] = 30
temp_config_list["shutdown_enabled"] = True
temp_config_list["start"] = "shift+f7"
temp_config_list["stop"] = "shift+f8"
temp_config_list["telegram_enabled"] = False
temp_config_list["use_colors"] = True
temp_config_list["run_fullscreen"] = False
temp_config_list["use_rpc"] = True
temp_config_list["sounds"] = True
temp_config_list["end_mode"] = "shutdown"
temp_config_list["obs_exe"] = None
temp_config_list["obs_core"] = None
saveJson(files_folder+'config.json', temp_config_list)
clear()
none = input(f'{RESET}Все настройки были сброшены до стандартных.\n\n > ')
clear()
break
elif reset_decision.lower() in ['n', 'no', 'н', 'нет']:
clear()
break
else:
clear()
continue
continue
clear()
continue
elif settings_choose == '13':
rpc.inMenu()
clear()
os.system("title AutoZoom (Главная)")
return
except KeyboardInterrupt:
rpc.inMenu()
clear()
return
def main(source='deamon'):
##########################################
# Возможность профилей сделана для себя
# и не планируется как фича, однако
# вы можете присобачить сюда что хотите.
try:
from profile import profilename
except:
profilename = ''
pass
##########################################
try:
import time
from main import mainMenu
clear()
os.system("title AutoZoom (Демон)")
import webbrowser
if (getConfig("obs_core") or getConfig("obs_exe")) == None:
clear()
while True:
obs_choice = input(f'{RESET}Хотите использовать запись через OBS? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET}): ')
if obs_choice.lower() in ['y', 'yes', 'д', 'да']:
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
while True:
try:
filename = easygui.fileopenbox('Выберите путь до obs32.exe или obs64.exe')
if filename.find("obs64.exe") != -1:
config_list["obs_exe"] = filename
config_list["obs_core"] = filename[:-9]
saveJson(files_folder+'config.json', config_list)
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-9]}{RESET}')
time.sleep(3)
break
elif filename.find("obs32.exe") != -1:
config_list["obs_exe"] = filename
config_list["obs_core"] = filename[:-9]
saveJson(files_folder+'config.json', config_list)
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-9]}{RESET}')
time.sleep(3)
break
elif filename.find("obs.exe") != -1:
config_list["obs_exe"] = filename
config_list["obs_core"] = filename[:-7]
saveJson(files_folder+'config.json', config_list)
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-7]}{RESET}')
time.sleep(3)
break
else:
easygui.msgbox("Неверный путь")
continue
break
except:
none = input('Вы не выбрали верный путь для OBS.\n\n > ')
config_list["obs_exe"] = 'Disabled'
config_list["obs_core"] = 'Disabled'
saveJson(files_folder+'config.json', config_list)
clear()
break
break
elif obs_choice.lower() in ['n', 'no', 'н', 'нет']:
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
config_list["obs_exe"] = 'Disabled'
config_list["obs_core"] = 'Disabled'
saveJson(files_folder+'config.json', config_list)
json_file.close()
clear()
break
else:
clear()
continue
if not os.path.exists(files_folder+'telegram.conf'):
clear()
tg_choice = input(f'{RESET}Хотите использовать Telegram бота? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET}): ')
if tg_choice.lower() in ['y', 'yes', 'д', 'да']:
clear()
print(f'Пожалуйста, прочтите инструкцию по установке Telegram бота в {BRED}README.txt{RESET}')
print(f'или в документации/инструкции что в разделе {CYAN}Помощь{RESET} главного меню')
print(f'чтобы хорошо понимать что сейчас от вас нужно.')
none = input('\n > ')
clear()
while True:
clear()
try:
telegram_send.configure(files_folder+'telegram.conf', channel=False, group=False, fm_integration=False)
break
except:
clear()
continue
telegram_send.send(messages=[f"🎊 Конфигурация правильна, всё работает!"], parse_mode="markdown", conf=f"{files_folder}telegram.conf")
clear()
elif tg_choice.lower() in ['n', 'no', 'н', 'нет']:
with open(files_folder+'telegram.conf', 'w', encoding="utf-8") as f:
f.write('Not Configured')
f.close()
lessons_count = 0
try:
if getConfig("debug"):
print(f'{nowtime()} Конфигурация импортирована\n')
except:
print(f'{nowtime()} Конфигурация {BRED}отсутсвует{RESET}, выключаем отладку\n')
for les in getLessons():
try:
lessons_list = getLessons()
lesson_name = les["name"]
lesson_date = les["date"]
lesson_time = les["time"]
lesson_url = les["link"]
lesson_obs = les["record"]
lesson_repeat = les["repeat"]
try:
lesson_repeat_day = les["repeat_day"]
except:
lesson_repeat_day = 'Не повторяется'
today = date.today().strftime("%d.%m.%Y")
if (today == lesson_date) or (getDayNum(today) == lesson_repeat_day):
print(f'{BBLACK}================================================{RESET}\n')
print(f'{nowtime()} Найден урок {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET}. Ждём начала...')
waiting_time_unix = int(time.time())
rpc.waitLesson(lesson_name, waiting_time_unix)
waitStart(lesson_time, lambda: act(100))
webbrowser.open(lesson_url)
easteregg_number = randint(1, 100000)
if easteregg_number == 69420:
webbrowser.open('https://www.pornhub.com/view_video.php?viewkey=ph5f3eb1e206aa8')
print(f'{nowtime()} Ждём {BRED}10 секунд{RESET} до отслеживания Zoom...')
time.sleep(10)
while not getState():
if getConfig("debug"):
print(f'{nowtime()} Урок задерживается, ждём...')
time.sleep(5)
continue
record_now = False
lesson_duration = 0
firstshow = True
if lesson_obs:
try:
if getConfig("debug"):
print(f'{nowtime()} Импортированы клавиши старта и остановки записи ({YELLOW}{getConfig("start")}{RESET} и {YELLOW}{getConfig("stop")}{RESET}).')
start = getConfig("start")
stop = getConfig("stop")
except:
start = 'shift+f7'
stop = 'shift+f8'
if getConfig("debug"):
print(f'{nowtime()} Используем стандартные клавиши старта и остановки записи ({YELLOW}{start}{RESET} и {YELLOW}{stop}{RESET}).')
i = 0
while True:
while i < 3:
if getState():
if firstshow:
start_time_unix = int(time.time())
print(f'{nowtime()} Захвачен текущий урок в Zoom.')
playSound("started")
tgsend(getConfig("telegram_enabled"), f"▶ Зашёл на урок *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}")
rpc.onLesson(lesson_name, start_time_unix)
if lesson_obs:
try:
obs_process = subprocess.Popen(getConfig("obs_exe"), cwd=getConfig("obs_core"))
time.sleep(5)
except:
print(f'{nowtime()} Не удалось открыть OBS для записи.')
else:
if getConfig("debug"):
print(f'{nowtime()} Не включаем OBS для записи.')
firstshow = False
if lesson_obs:
if not record_now:
keyboard.press(start)
time.sleep(.25)
keyboard.release(start)
record_now = True
print(f'{nowtime()} Сигнал записи OBS отправлен.')
playSound("recordstart")
lesson_duration = lesson_duration + 5
if getConfig("debug"):
print(f'{nowtime()} Zoom подключён. Урок идёт уже {BGREEN}{str(lesson_duration)} сек{RESET}. ({BGREEN}{str(round(lesson_duration/60, 2))} мин{RESET}.)')
time.sleep(5)
continue
else:
i += 1
if getConfig("debug"):
print(f'{nowtime()} {BRED}Урок не обнаружен! {RESET}Повторная проверка через {BRED}10 {RESET}секунд...')
time.sleep(10)
continue
if getConfig("debug"):
print(f'{nowtime()} Zoom отключился. Процесс {BRED}CptHost.exe{RESET} более не существует.')
if getConfig("debug"):
tgsend(getConfig("telegram_enabled"), f"◀ Урок *{lesson_name}* длился *{str(round(lesson_duration/60, 2))}* мин.")
print(f'{nowtime()} Урок длился {BGREEN}{str(lesson_duration)} сек{RESET}. ({BGREEN}{str(round(lesson_duration/60, 2))} мин{RESET}.)')
else:
tgsend(getConfig("telegram_enabled"), f"◀ Урок *{lesson_name}* длился *{str(int(lesson_duration/60))}* мин.")
print(f'{nowtime()} Урок длился {BGREEN}{str(lesson_duration)} сек{RESET}. ({BGREEN}{str(int(lesson_duration/60))} мин{RESET}.)')
playSound("ended")
if lesson_obs:
keyboard.press(stop)
time.sleep(.25)
keyboard.release(stop)
print(f'{nowtime()} Сигнал остановки записи через OBS отправлен.')
playSound("recordstop")
record_now = False
time.sleep(3)
try:
obs_process.terminate()
except:
if getConfig("debug"):
print(f'{nowtime()} Не удалось остановить процесс OBS.')
if not lesson_repeat:
del lessons_list[lessons_list.index(les)]
saveJson(files_folder+'lessons.json', lessons_list)
if getConfig("debug"):
print(f'{nowtime()} Урок {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET} удалён.')
print(f'\n{BBLACK}================================================{RESET}\n\n')
firstshow = True
lessons_count = lessons_count+1
break
record_now = False
lessons_list = getLessons()
except KeyboardInterrupt:
if getConfig("debug"):
print(f'{nowtime()} Ожидание урока сброшено.')
else:
print('')
time.sleep(1)
pass
time.sleep(3)
print(f'{nowtime()} Уроков нет или же все в списке закончились.')
if lessons_count > 0:
if getConfig("shutdown_enabled"):
if getConfig("end_mode") == 'shutdown':
try:
tgsend(getConfig("telegram_enabled"), f"⚠ Уроки кончились, автовыключение {profilename}через {nowtime(False, False, False)} мин...")
print(f'{nowtime()} Ваш ПК автоматически выключится через {BRED}{str(getConfig("shutdown_timeout"))} мин{RESET}.')
playSound("shutdown")
end_unix = int(time.time())+getConfig("shutdown_timeout")*60
rpc.shutdown(end_unix)
shutdown = inputimeout(prompt=f'{nowtime()} Нажмите {CYAN}Enter{RESET} чтобы предотвратить выключение ПК...', timeout=getConfig("shutdown_timeout")*60)
clear()
except TimeoutOccurred:
clear()
print(f'{nowtime()} Время вышло, выключаем ваш ПК...')
time.sleep(3)
tgsend(getConfig("telegram_enabled"), f"⚠ Время таймаута исткело, выключаем ваш ПК...")
time.sleep(5)
os.system("shutdown /s /t 1")
# elif getConfig("end_mode") == 'restart':
# from datetime import datetime, time
# from time import sleep
# runTime = "00:00"
# startTime = time(*(map(int, runTime.split(':'))))
# tomorrow = date.today()+timedelta(days=1)
# timestamp = (tomorrow - date(1970, 1, 1)).total_seconds()
# while startTime.total_seconds() > timestamp: #(date.today() + timedelta(days=1)).time():
# sleep(2)
if source == 'deamon':
exit = input(f'{nowtime()} Программа завершена! Нажмите {CYAN}Enter{RESET} чтобы выйти...')
rpc.disconnect()
clear()
sys.exit()
elif source == 'menu':
exit = input(f'{nowtime()} Программа завершена! Нажмите {CYAN}Enter{RESET} чтобы вернуться в меню...')
rpc.inMenu()
clear()
os.system("title AutoZoom (Главная)")
return
except KeyboardInterrupt:
if source == 'deamon':
exit = input(f'{nowtime()} Программа остановлена! Нажмите {CYAN}Enter{RESET} чтобы выйти...')
rpc.disconnect()
clear()
sys.exit()
elif source == 'menu':
exit = input(f'{nowtime()} Программа остановлена! Нажмите {CYAN}Enter{RESET} чтобы вернуться в меню...')
rpc.inMenu()
clear()
return
if __name__ == '__main__':
os.system("title AutoZoom (Демон)")
import sys
clear()
main()