13 Commits
v2.2 ... dev

Author SHA1 Message Date
c2c0d47dbb Preparation for 2.7 2022-04-28 01:18:08 +02:00
c0076bf5aa Updated to v2.6
Внесены различные изменения в RPC и конфигурацию
2022-02-01 17:38:27 +02:00
09a3d66656 Updated to v2.6 2022-02-01 17:34:08 +02:00
504b748789 Updated to v2.6
Temporary fix for Python 3.10 RPC issue. (https://github.com/profitrollgame/AutoZoom/issues/1)
2022-02-01 17:32:46 +02:00
fe0a1a5202 Removed GitBook
Returned back to normal GitHub Wiki
2022-01-23 00:09:03 +02:00
4aa988f236 GitBook: [#4] Added other pages 2021-11-29 13:19:33 +00:00
3cb46f2b26 GitBook: [#3] Icons 2021-11-29 13:11:03 +00:00
0cdf5d8ce1 GitBook: [#1] Вики начала разбиваться на странички 2021-11-29 12:28:32 +00:00
25bf0064b7 Updated to v2.5 2021-11-05 18:47:43 +02:00
363de17c08 Update 2.4 2021-11-03 09:20:15 +02:00
66ec64fa30 Обновление v2.3 2021-08-01 11:14:33 +03:00
a573edc03a Merge branch 'master' of https://github.com/profitrollgame/AutoZoom 2021-05-08 01:28:45 +03:00
5d2da989d6 Обновление v2.2 2021-05-08 01:28:41 +03:00
26 changed files with 1018 additions and 691 deletions

View File

@@ -39,9 +39,15 @@ AutoZoom создан для автоматизации присоединени
2. Попробуйте запустить ваш `start.bat` в папке `AutoZoom`. Возможно, он сам отправит вас на страницу загрузки Python. 2. Попробуйте запустить ваш `start.bat` в папке `AutoZoom`. Возможно, он сам отправит вас на страницу загрузки Python.
Если же этого не произошло - сделать это можно вручную с официального сайта или из магазина приложений Если же этого не произошло - сделать это можно вручную с официального сайта или из магазина приложений
Microsoft Store (https://www.microsoft.com/ru-ru/p/python-37/9nj46sx7x90p?activetab=pivot:overviewtab&source=lp). Microsoft Store (https://www.microsoft.com/ru-ru/p/python-37/9nj46sx7x90p?activetab=pivot:overviewtab&source=lp).
В случае установки без MS Store - достаточно скачать инсталлер с оф. сайта Python (https://www.python.org/downloads/).
Для установки на Linux необходимо использовать стандартный менеджер пакетов (apt, yum, rpm и т.д.)
Инструкции по установке версий Python3 на Linux вы можете самостоятельно в зависимости от дистрибутива
и желаемой к установке версии Python3.
Для установки на Android (в данном случае - внутри Termux) нужно ввести `pkg install python`.
3. Дважды нажмите на `start.bat` и выберите пункт "Редактор" чтобы редактировать ваши уроки на любой 3. Дважды нажмите на `start.bat` и выберите пункт "Редактор" чтобы редактировать ваши уроки на любой
удобный день. Введите все нужные данные. Название конференции, дату, время, ссылку на приглашение. удобный день. Введите все нужные данные. Название конференции, дату, время, ссылку на приглашение.
В случае установки на Linux/Android - скрипт запуска будет `start.sh` и его можно запустить через `bash ./start.sh`
4. Теперь самая важная часть. Установите Zoom (https://zoom.us/download) на свой ПК. 4. Теперь самая важная часть. Установите Zoom (https://zoom.us/download) на свой ПК.
Запустите его и зарегистрируйтесь/войдите в аккаунт. При входе ОБЯЗАТЕЛЬНО Запустите его и зарегистрируйтесь/войдите в аккаунт. При входе ОБЯЗАТЕЛЬНО
@@ -143,4 +149,4 @@ AutoZoom и выбрать пункт "Настройки". Затем выбе
Приятного использования! Приятного использования!
P.S.: Отдельное спасибо Kusyaka за помощь в создании сего творения. P.S.: Отдельное спасибо Kusyaka за помощь в создании сего творения.
Без тебя, если честно, у меня бы ничего не вышло, дружище <3 Без тебя, если честно, у меня бы ничего не вышло, дружище <3

27
assets/colors.json Normal file
View File

@@ -0,0 +1,27 @@
{
"utility": {
"reset": "\u001b[0m",
"underline": "\u001b[4m",
"reverse": "\u001b[7m"
},
"default": {
"black": "\u001b[30m",
"blue": "\u001b[34m",
"green": "\u001b[32m",
"red": "\u001b[31m",
"yellow": "\u001b[33m",
"magenta": "\u001b[35m",
"cyan": "\u001b[36m",
"white": "\u001b[37m"
},
"bright": {
"black": "\u001b[30;1m",
"blue": "\u001b[34;1m",
"green": "\u001b[32;1m",
"red": "\u001b[31;1m",
"yellow": "\u001b[33;1m",
"magenta": "\u001b[35;1m",
"cyan": "\u001b[36;1m",
"white": "\u001b[37;1m"
}
}

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1 +1,2 @@
python daemon.py echo AutoZoom needs Python 3 to work. Please read README.md!
python3 daemon.py

189
daemon.py
View File

@@ -14,10 +14,10 @@ from random import randint
from pathlib import Path from pathlib import Path
from datetime import datetime, date, timedelta from datetime import datetime, date, timedelta
from functions import * from modules.functions import *
if getConfig("use_colors"): if getConfig("use_colors"):
from colors import * from modules.colors import *
appendLog('Colors imported') appendLog('Colors imported')
else: else:
RESET = '' RESET = ''
@@ -32,8 +32,7 @@ clear()
setTitle("Загрузка daemon...", sysname) setTitle("Загрузка daemon...", sysname)
appendLog('daemon.py start initialized', startup=True) appendLog('daemon.py start initialized', startup=True)
import libinstaller import modules.rpc as rpc
import rpc
if sysname == "windows": if sysname == "windows":
import easygui import easygui
@@ -44,12 +43,6 @@ import ast
import inputimeout import inputimeout
import telegram_send import telegram_send
if getOS() == "windows":
import winsound
from playsound import playsound
else:
from playsound import playsound
menu_choose = None menu_choose = None
try: try:
@@ -61,12 +54,12 @@ except Exception as exp:
def nowtime(seconds=True, noice=True, color=True): def nowtime(seconds=True, noice=True, color=True):
now = datetime.now() now = datetime.now()
if seconds == True: if seconds:
justnow = now.strftime("%H:%M:%S") justnow = now.strftime("%H:%M:%S")
else: else:
justnow = now.strftime("%H:%M") justnow = now.strftime("%H:%M")
if noice == True: if noice:
if not color: if not color:
beautiful = f'[{justnow}]' beautiful = f'[{justnow}]'
else: else:
@@ -76,7 +69,7 @@ def nowtime(seconds=True, noice=True, color=True):
beautiful = f'{justnow}' beautiful = f'{justnow}'
else: else:
beautiful = f'{CYAN}{justnow}{RESET}' beautiful = f'{CYAN}{justnow}{RESET}'
return beautiful return beautiful
def act(x): def act(x):
@@ -89,7 +82,7 @@ def waitStart(runTime, action):
startTime = time(*(map(int, runTime.split(':')))) startTime = time(*(map(int, runTime.split(':'))))
while startTime > datetime.today().time(): while startTime > datetime.today().time():
sleep(2) sleep(2)
return action return action
def getPair(line): def getPair(line):
@@ -103,19 +96,19 @@ def getLessons():
f.write("[]") f.write("[]")
f.close() f.close()
lessons_list = [] lessons_list = []
appendLog(f'Created lessons.json') appendLog(f'Created lessons.json')
else: else:
with open(files_folder+'lessons.json', encoding="utf-8") as json_file: with open(files_folder+'lessons.json', encoding="utf-8") as json_file:
lessons_list = json.load(json_file) lessons_list = json.load(json_file)
json_file.close() json_file.close()
appendLog('File lessons.json loaded') appendLog('File lessons.json loaded')
return lessons_list return lessons_list
def tgsend(enabled, message): def tgsend(enabled, message, video=None):
if enabled: if enabled:
if os.path.exists(files_folder+'telegram.conf'): if os.path.exists(files_folder+'telegram.conf'):
tg_file = open(files_folder+'telegram.conf', 'r', encoding="utf-8") tg_file = open(files_folder+'telegram.conf', 'r', encoding="utf-8")
@@ -124,14 +117,25 @@ def tgsend(enabled, message):
if tg_text != 'Not Configured': if tg_text != 'Not Configured':
try: try:
telegram_send.send(messages=[f"{message}"], parse_mode="markdown", conf=files_folder+"telegram.conf") if video is not None:
telegram_send.send(messages=[f"{message}"], videos=[f"{video}"], parse_mode="markdown", conf=files_folder+"telegram.conf")
else:
telegram_send.send(messages=[f"{message}"], parse_mode="markdown", conf=files_folder+"telegram.conf")
except Exception as excep: except Exception as excep:
appendLog(f'Failed to send TG message "{message}": {exp}') appendLog(f'Failed to send TG message "{message}": {exp}')
playSound("warning", nowtime()) playSound(getConfig("sound_warning"), nowtime())
print(f'{nowtime()} Не удалось отправить Telegram сообщение "{message}" (Ошибка: {exp})') print(f'{nowtime()} Не удалось отправить Telegram сообщение "{message}" (Ошибка: {exp})')
async def tgsendVideo(msg, video, video_new):
print(f"{nowtime()} Отправка записи конференции {CYAN}{msg}{RESET}.")
try:
tgsend(getConfig("telegram_enabled"), msg, video=video)
os.rename(video, video_new)
except Exception as exp:
tgsend(getConfig("telegram_enabled"), f"⚠ Отправка видео `{video}` прошла с ошибкой `{exp}`")
def main(source='deamon'): def main(source='deamon'):
global sysname global sysname
@@ -147,7 +151,7 @@ def main(source='deamon'):
except: except:
profilename = '' profilename = ''
pass pass
########################################## ##########################################
try: try:
@@ -206,14 +210,14 @@ def main(source='deamon'):
elif obs_choice.lower() in no_list: elif obs_choice.lower() in no_list:
setConfig("obs_exe", "Disabled") setConfig("obs_exe", "Disabled")
setConfig("obs_core", "Disabled") setConfig("obs_core", "Disabled")
clear() clear()
break break
else: else:
clear() clear()
continue continue
if not os.path.exists(files_folder+'telegram.conf'): if not os.path.exists(files_folder+'telegram.conf'):
clear() clear()
tg_choice = input(f'{RESET}Хотите использовать Telegram бота? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET}): ') tg_choice = input(f'{RESET}Хотите использовать Telegram бота? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET}): ')
@@ -224,7 +228,7 @@ def main(source='deamon'):
print(f'чтобы хорошо понимать что сейчас от вас нужно.') print(f'чтобы хорошо понимать что сейчас от вас нужно.')
none = input('\n > ') none = input('\n > ')
clear() clear()
while True: while True:
clear() clear()
@@ -235,16 +239,16 @@ def main(source='deamon'):
appendLog(f'Failed to configure Telegram Send: {exp}') appendLog(f'Failed to configure Telegram Send: {exp}')
clear() clear()
continue continue
telegram_send.send(messages=[f"🎊 Конфигурация правильна, всё работает!"], parse_mode="markdown", conf=f"{files_folder}telegram.conf") telegram_send.send(messages=[f"🎊 Конфигурация правильна, всё работает!"], parse_mode="markdown", conf=f"{files_folder}telegram.conf")
appendLog('Telegram Send successfully configured') appendLog('Telegram Send successfully configured')
clear() clear()
elif tg_choice.lower() in no_list: elif tg_choice.lower() in no_list:
with open(files_folder+'telegram.conf', 'w', encoding="utf-8") as f: with open(files_folder+'telegram.conf', 'w', encoding="utf-8") as f:
f.write('Not Configured') f.write('Not Configured')
f.close() f.close()
lessons_count = 0 lessons_count = 0
try: try:
@@ -273,7 +277,26 @@ def main(source='deamon'):
today = date.today().strftime("%d.%m.%Y") today = date.today().strftime("%d.%m.%Y")
if (today == lesson_date) or (getDayNum(today) == lesson_repeat_day): diff = ((datetime.strptime(today, "%d.%m.%Y") - datetime.strptime(lesson_date, "%d.%m.%Y")).days)
if getConfig("debug"):
print(f'{nowtime()} Конференция {CYAN}{lesson_name}{RESET}: Разница дней {BRED}{diff}{RESET}, Повторение {BRED}{lesson_repeat}{RESET}.')
if diff > 0 and not lesson_repeat:
if getConfig("remove_old"):
del lessons_list[lessons_list.index(les)]
saveJson(files_folder+'lessons.json', lessons_list)
appendLog(f'Old lesson named {lesson_name} removed')
if getConfig("debug"):
print(f'{nowtime()} Старая конференция {CYAN}{lesson_name}{RESET} за {CYAN}{lesson_date} {RESET}в {BRED}{lesson_time}{RESET} удалена.')
lessons_list = getLessons()
elif (today == lesson_date) or (getDayNum(today) == lesson_repeat_day):
print(f'{BBLACK}================================================{RESET}\n') print(f'{BBLACK}================================================{RESET}\n')
print(f'{nowtime()} Найдена конференция {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET}. Ждём начала...') print(f'{nowtime()} Найдена конференция {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET}. Ждём начала...')
@@ -295,14 +318,14 @@ def main(source='deamon'):
while i < 10: while i < 10:
lesson_url = lesson_url.replace(f"https://us0{i}web.zoom.us/j/", "zoommtg://zoom.us/join?action=join&confno=") lesson_url = lesson_url.replace(f"https://us0{i}web.zoom.us/j/", "zoommtg://zoom.us/join?action=join&confno=")
i += 1 i += 1
lesson_url = lesson_url.replace("&", "^&") lesson_url = lesson_url.replace("&", "^&")
lesson_url = lesson_url.replace("?pwd", "^&pwd") lesson_url = lesson_url.replace("?pwd", "^&pwd")
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Ориг. ссылка: {BRED}{lesson_url_original}{RESET}') print(f'{nowtime()} Ориг. ссылка: {BRED}{lesson_url_original}{RESET}')
print(f'{nowtime()} Измен. ссылка: {BRED}{lesson_url}{RESET}') print(f'{nowtime()} Измен. ссылка: {BRED}{lesson_url}{RESET}')
appendLog(f'Replaced link {lesson_url_original} with {lesson_url}') appendLog(f'Replaced link {lesson_url_original} with {lesson_url}')
os.system(f'start {lesson_url}') os.system(f'start {lesson_url}')
@@ -311,7 +334,7 @@ def main(source='deamon'):
if i == 0: if i == 0:
lesson_url = lesson_url.replace(f"https://zoom.us/j/", "zoommtg://zoom.us/join?action=join&confno=") lesson_url = lesson_url.replace(f"https://zoom.us/j/", "zoommtg://zoom.us/join?action=join&confno=")
while i < 10: while i < 10:
lesson_url = lesson_url.replace(f"https://us0{i}web.zoom.us/j/", "zoommtg://zoom.us/join?action=join&confno=") lesson_url = lesson_url.replace(f"https://us0{i}web.zoom.us/j/", "zoommtg://zoom.us/join?action=join&confno=")
i += 1 i += 1
@@ -321,7 +344,7 @@ def main(source='deamon'):
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Ориг. ссылка: {BRED}{lesson_url_original}{RESET}') print(f'{nowtime()} Ориг. ссылка: {BRED}{lesson_url_original}{RESET}')
print(f'{nowtime()} Измен. ссылка: {BRED}{lesson_url}{RESET}') print(f'{nowtime()} Измен. ссылка: {BRED}{lesson_url}{RESET}')
appendLog(f'Replaced link {lesson_url_original} with {lesson_url}') appendLog(f'Replaced link {lesson_url_original} with {lesson_url}')
if sysname == "android": if sysname == "android":
@@ -344,7 +367,7 @@ def main(source='deamon'):
if easteregg_number == 69420: if easteregg_number == 69420:
appendLog('Easteregg summoned') appendLog('Easteregg summoned')
webbrowser.open('https://www.pornhub.com/view_video.php?viewkey=ph5f3eb1e206aa8') webbrowser.open('https://www.pornhub.com/view_video.php?viewkey=ph5f3eb1e206aa8')
print(f'{nowtime()} Ждём {BRED}10 секунд{RESET} до отслеживания Zoom...') print(f'{nowtime()} Ждём {BRED}10 секунд{RESET} до отслеживания Zoom...')
time.sleep(10) time.sleep(10)
@@ -361,23 +384,23 @@ def main(source='deamon'):
if retries == 1: if retries == 1:
appendLog('Lesson delay found') appendLog('Lesson delay found')
time.sleep(5) time.sleep(5)
retries += 1 retries += 1
if getConfig("debug"): if getConfig("debug"):
if retries == 2: if retries == 2:
playSound("warning", nowtime()) playSound(getConfig("sound_warning"), nowtime())
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* обнаружена {profilename}") tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* обнаружена {profilename}")
if retries == 36: if retries == 36:
playSound("warning", nowtime()) playSound(getConfig("sound_warning"), nowtime())
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 3 минуты {profilename}") tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 3 минуты {profilename}")
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}3{RESET} минуты') print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}3{RESET} минуты')
appendLog(f'Lesson delay exceeded: {retries} retries') appendLog(f'Lesson delay exceeded: {retries} retries')
if retries == 120: if retries == 120:
playSound("warning", nowtime()) playSound(getConfig("sound_warning"), nowtime())
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 10 минут {profilename}") tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 10 минут {profilename}")
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}10{RESET} минут') print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}10{RESET} минут')
appendLog(f'Lesson delay exceeded: {retries} retries') appendLog(f'Lesson delay exceeded: {retries} retries')
@@ -385,17 +408,17 @@ def main(source='deamon'):
if retries == 360: if retries == 360:
if getConfig("debug"): if getConfig("debug"):
playSound("warning", nowtime()) playSound(getConfig("sound_warning"), nowtime())
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 30 минут, конференция сбошена {profilename}") tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 30 минут, конференция сбошена {profilename}")
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}30{RESET} минут, конференция сброшена') print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}30{RESET} минут, конференция сброшена')
else: else:
playSound("warning", nowtime()) playSound(getConfig("sound_warning"), nowtime())
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 30 минут, конференция сбошена {profilename}") tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 30 минут, конференция сбошена {profilename}")
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}30{RESET} минут, конференция сброшена') print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}30{RESET} минут, конференция сброшена')
appendLog(f'Lesson delay exceeded: {retries} retries') appendLog(f'Lesson delay exceeded: {retries} retries')
playSound("ended", nowtime()) playSound(getConfig("sound_ended"), nowtime())
if lesson_obs: if lesson_obs:
@@ -410,17 +433,17 @@ def main(source='deamon'):
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Не удалось остановить процесс OBS.') print(f'{nowtime()} Не удалось остановить процесс OBS.')
if not lesson_repeat: if not lesson_repeat:
del lessons_list[lessons_list.index(les)] del lessons_list[lessons_list.index(les)]
saveJson(files_folder+'lessons.json', lessons_list) saveJson(files_folder+'lessons.json', lessons_list)
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Конференция {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET} удалена.') print(f'{nowtime()} Конференция {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET} удалена.')
print(f'\n{BBLACK}================================================{RESET}\n\n') print(f'\n{BBLACK}================================================{RESET}\n\n')
firstshow = True firstshow = True
lessons_count = lessons_count+1 lessons_count = lessons_count+1
@@ -437,7 +460,7 @@ def main(source='deamon'):
try: try:
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Импортированы клавиши старта и остановки записи ({YELLOW}{getConfig("start")}{RESET} и {YELLOW}{getConfig("stop")}{RESET}).') print(f'{nowtime()} Импортированы клавиши старта и остановки записи ({YELLOW}{getConfig("start")}{RESET} и {YELLOW}{getConfig("stop")}{RESET}).')
start = getConfig("start") start = getConfig("start")
stop = getConfig("stop") stop = getConfig("stop")
except: except:
@@ -462,7 +485,7 @@ def main(source='deamon'):
setTitle(f'Идёт конференция "{lesson_name}"', sysname) setTitle(f'Идёт конференция "{lesson_name}"', sysname)
playSound("started", nowtime()) playSound(getConfig("sound_started"), nowtime())
tgsend(getConfig("telegram_enabled"), f"▶ Зашёл на конференцию *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}") tgsend(getConfig("telegram_enabled"), f"▶ Зашёл на конференцию *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}")
appendLog(f'Joined lesson {lesson_name} at {nowtime(False, False, False)}') appendLog(f'Joined lesson {lesson_name} at {nowtime(False, False, False)}')
@@ -473,14 +496,14 @@ def main(source='deamon'):
try: try:
obs_process = subprocess.Popen(getConfig("obs_exe"), cwd=getConfig("obs_core")) obs_process = subprocess.Popen(getConfig("obs_exe"), cwd=getConfig("obs_core"))
appendLog(f'Sent instruction to open OBS') appendLog(f'Sent instruction to open OBS')
time.sleep(5) time.sleep(getConfig("obs_delay"))
except Exception as exp: except Exception as exp:
appendLog(f'Failed to open OBS: {exp}') appendLog(f'Failed to open OBS: {exp}')
print(f'{nowtime()} Не удалось открыть OBS для записи.') print(f'{nowtime()} Не удалось открыть OBS для записи.')
else: else:
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Не включаем OBS для записи.') print(f'{nowtime()} Не включаем OBS для записи.')
firstshow = False firstshow = False
if lesson_obs: if lesson_obs:
@@ -490,13 +513,13 @@ def main(source='deamon'):
keyboard.release(start) keyboard.release(start)
record_now = True record_now = True
print(f'{nowtime()} Сигнал записи OBS отправлен.') print(f'{nowtime()} Сигнал записи OBS отправлен.')
playSound("recordstart", nowtime()) playSound(getConfig("sound_recordstart"), nowtime())
lesson_duration = (datetime.now() - lesson_start).total_seconds() lesson_duration = (datetime.now() - lesson_start).total_seconds()
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Zoom подключён. Конференция идёт уже {BGREEN}{str(lesson_duration)} сек{RESET}. ({BGREEN}{str(round(lesson_duration/60, 2))} мин{RESET}.)') print(f'{nowtime()} Zoom подключён. Конференция идёт уже {BGREEN}{str(lesson_duration)} сек{RESET}. ({BGREEN}{str(round(lesson_duration/60, 2))} мин{RESET}.)')
time.sleep(5) time.sleep(5)
continue continue
else: else:
@@ -505,34 +528,35 @@ def main(source='deamon'):
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} {BRED}Конференция не обнаружена! {RESET}Повторная проверка через {BRED}10 {RESET}секунд...') print(f'{nowtime()} {BRED}Конференция не обнаружена! {RESET}Повторная проверка через {BRED}10 {RESET}секунд...')
time.sleep(10) time.sleep(10)
continue continue
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Zoom отключился. Процесс {BRED}CptHost.exe{RESET} более не существует.') print(f'{nowtime()} Zoom отключился. Процесс {BRED}CptHost.exe{RESET} более не существует.')
appendLog(f'CptHost.exe not found, Zoom disconnected') appendLog(f'CptHost.exe not found, Zoom disconnected')
setTitle(f'Конференция "{lesson_name}" завершилась', sysname) setTitle(f'Конференция "{lesson_name}" завершилась', sysname)
if getConfig("debug"): if getConfig("debug"):
tgsend(getConfig("telegram_enabled"), f"◀ Конференция *{lesson_name}* длилась *{str(round(lesson_duration/60, 2))}* мин.") 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}.)') print(f'{nowtime()} Конференция длилась {BGREEN}{str(lesson_duration)} сек{RESET}. ({BGREEN}{str(round(lesson_duration/60, 2))} мин{RESET}.)')
fire_and_forget(tgsendVideo(f"{lesson_name}", "C:\\Users\\PC-Admin\\AutoZoom\\lessons\\meeting.mp4", f'C:\\Users\\PC-Admin\\AutoZoom\\lessons\\meeting_{datetime.now().strftime("%d.%m.%Y_%H-%M-%S")}.mp4'))
else: else:
tgsend(getConfig("telegram_enabled"), f"◀ Конференция *{lesson_name}* длилась *{str(int(lesson_duration/60))}* мин.") 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}.)') print(f'{nowtime()} Конференция длилась {BGREEN}{str(lesson_duration)} сек{RESET}. ({BGREEN}{str(int(lesson_duration/60))} мин{RESET}.)')
appendLog(f'Lesson {lesson_name} duration was {str(int(lesson_duration/60))} m. ({str(lesson_duration)} s.)') appendLog(f'Lesson {lesson_name} duration was {str(int(lesson_duration/60))} m. ({str(lesson_duration)} s.)')
playSound("ended", nowtime()) playSound(getConfig("sound_ended"), nowtime())
if lesson_obs: if lesson_obs:
keyboard.press(stop) keyboard.press(stop)
time.sleep(.25) time.sleep(.25)
keyboard.release(stop) keyboard.release(stop)
print(f'{nowtime()} Сигнал остановки записи через OBS отправлен.') print(f'{nowtime()} Сигнал остановки записи через OBS отправлен.')
playSound("recordstop", nowtime()) playSound(getConfig("sound_recordstop"), nowtime())
record_now = False record_now = False
time.sleep(3) time.sleep(3)
@@ -546,15 +570,15 @@ def main(source='deamon'):
if not lesson_repeat: if not lesson_repeat:
del lessons_list[lessons_list.index(les)] del lessons_list[lessons_list.index(les)]
saveJson(files_folder+'lessons.json', lessons_list) saveJson(files_folder+'lessons.json', lessons_list)
appendLog(f'Lesson named {lesson_name} removed') appendLog(f'Lesson named {lesson_name} removed')
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Конференция {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET} удалена.') print(f'{nowtime()} Конференция {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET} удалена.')
print(f'\n{BBLACK}================================================{RESET}\n\n') print(f'\n{BBLACK}================================================{RESET}\n\n')
firstshow = True firstshow = True
lessons_count = lessons_count+1 lessons_count = lessons_count+1
@@ -566,17 +590,17 @@ def main(source='deamon'):
lessons_list = getLessons() lessons_list = getLessons()
else: else:
playSound("started", nowtime()) playSound(getConfig("sound_started"), nowtime())
tgsend(getConfig("telegram_enabled"), f"▶ Присоединился к конференции *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}") tgsend(getConfig("telegram_enabled"), f"▶ Присоединился к конференции *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}")
appendLog(f'Joined lesson {lesson_name} at {nowtime(False, False, False)}') appendLog(f'Joined lesson {lesson_name} at {nowtime(False, False, False)}')
if not lesson_repeat: if not lesson_repeat:
del lessons_list[lessons_list.index(les)] del lessons_list[lessons_list.index(les)]
saveJson(files_folder+'lessons.json', lessons_list) saveJson(files_folder+'lessons.json', lessons_list)
appendLog(f'Lesson named {lesson_name} removed') appendLog(f'Lesson named {lesson_name} removed')
if getConfig("debug"): if getConfig("debug"):
print(f'{nowtime()} Конференция {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET} удалена.') print(f'{nowtime()} Конференция {CYAN}{lesson_name}{RESET} в {BRED}{lesson_time}{RESET} удалена.')
@@ -591,7 +615,7 @@ def main(source='deamon'):
print(f'{nowtime()} Ожидание конференции сброшено.') print(f'{nowtime()} Ожидание конференции сброшено.')
else: else:
print('') print('')
time.sleep(1) time.sleep(1)
pass pass
@@ -609,7 +633,7 @@ def main(source='deamon'):
appendLog(f'Shutting PC down in {str(getConfig("shutdown_timeout"))}') appendLog(f'Shutting PC down in {str(getConfig("shutdown_timeout"))}')
playSound("shutdown", nowtime()) playSound(getConfig("sound_shutdown"), nowtime())
end_unix = int(time.time())+getConfig("shutdown_timeout")*60 end_unix = int(time.time())+getConfig("shutdown_timeout")*60
rpc.shutdown(end_unix) rpc.shutdown(end_unix)
shutdown = inputimeout(prompt=f'{nowtime()} Нажмите {CYAN}Enter{RESET} чтобы предотвратить выключение ПК...', timeout=getConfig("shutdown_timeout")*60) shutdown = inputimeout(prompt=f'{nowtime()} Нажмите {CYAN}Enter{RESET} чтобы предотвратить выключение ПК...', timeout=getConfig("shutdown_timeout")*60)
@@ -624,6 +648,28 @@ def main(source='deamon'):
time.sleep(5) time.sleep(5)
appendLog('Shutting PC down') appendLog('Shutting PC down')
os.system("shutdown /s /t 1") os.system("shutdown /s /t 1")
elif getConfig("end_mode") == 'sleep':
try:
tgsend(getConfig("telegram_enabled"), f"⚠ Конференции кончились, отправление в сон {profilename}через {str(getConfig('shutdown_timeout'))} мин...")
print(f'{nowtime()} Ваш ПК автоматически заснёт через {BRED}{str(getConfig("shutdown_timeout"))} мин{RESET}.')
appendLog(f'Falling asleep in {str(getConfig("shutdown_timeout"))}')
playSound(getConfig("sound_shutdown"), nowtime())
end_unix = int(time.time())+getConfig("shutdown_timeout")*60
rpc.sleepmode(end_unix)
shutdown = inputimeout(prompt=f'{nowtime()} Нажмите {CYAN}Enter{RESET} чтобы предотвратить засыпание ПК...', timeout=getConfig("shutdown_timeout")*60)
appendLog('Sleep mode aborted')
clear()
except TimeoutOccurred:
clear()
print(f'{nowtime()} Время вышло, уводим ваш ПК в спящий режим...')
time.sleep(3)
tgsend(getConfig("telegram_enabled"), f"⚠ Время таймаута исткело, переводим ПК в спящий режим...")
time.sleep(5)
appendLog('Activating PC sleep mode')
os.system("rundll32.exe powrprof.dll, SetSuspendState Sleep")
# elif getConfig("end_mode") == 'restart': # elif getConfig("end_mode") == 'restart':
# from datetime import datetime, time # from datetime import datetime, time
# from time import sleep # from time import sleep
@@ -643,6 +689,7 @@ def main(source='deamon'):
rpc.disconnect() rpc.disconnect()
clear() clear()
sys.exit() sys.exit()
elif source == 'menu': elif source == 'menu':
appendLog(f'Waiting for any input') appendLog(f'Waiting for any input')
@@ -652,6 +699,7 @@ def main(source='deamon'):
clear() clear()
setTitle("AutoZoom (Главная)", sysname) setTitle("AutoZoom (Главная)", sysname)
return return
except KeyboardInterrupt: except KeyboardInterrupt:
if source == 'deamon': if source == 'deamon':
appendLog(f'Deamon stopped, waiting for any input') appendLog(f'Deamon stopped, waiting for any input')
@@ -661,6 +709,7 @@ def main(source='deamon'):
rpc.disconnect() rpc.disconnect()
clear() clear()
sys.exit() sys.exit()
elif source == 'menu': elif source == 'menu':
appendLog(f'Deamon stopped, waiting for any input') appendLog(f'Deamon stopped, waiting for any input')
@@ -671,7 +720,7 @@ def main(source='deamon'):
return return
if __name__ == '__main__': if __name__ == '__main__':
from functions import getOS, setTitle from modules.functions import getOS, setTitle
setTitle("AutoZoom (Демон)", getOS()) setTitle("AutoZoom (Демон)", getOS())
import sys import sys
clear() clear()

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/bin/bash
echo "Running AutoZoom daemon with Python 3. Please read README.md!" echo "AutoZoom needs Python 3 to work. Please read README.md!"
python3 daemon.py python3 daemon.py

5
install.bat Normal file
View File

@@ -0,0 +1,5 @@
echo AutoZoom needs Python 3 to work. Please read README.md!
python3 .\modules\install.py
python3 -m pip install -r requirements.txt
echo Run start.bat to proceed to AutoZoom.
pause

4
install.sh Normal file
View File

@@ -0,0 +1,4 @@
echo "AutoZoom needs Python 3 to work. Please read README.md!"
python3 ./modules/install.py
python3 -m pip install -r requirements.txt
echo "Run start.sh to proceed to AutoZoom."

View File

@@ -1,195 +0,0 @@
# -*- coding: utf-8 -*-
import os, sys
from colors import *
from functions import getConfig, setConfig, getOS, yes_list, no_list
from functions import appendLog
from subprocess import check_output
if getConfig("firstboot"):
if getOS() == "android":
while True:
os.system('clear')
confirmation = input(f'{BRED}Внимание! {RESET}AutoZoom практически не оптимизирован под {CYAN}Android{RESET}.\nПродолжая использовать программу на ОС кроме {CYAN}Windows {RESET}вы действуете на свой страх и риск.\nПолноценная поддержка операционной системы Android не планируется.\nДля хоть какой-то работы нужно установить Zoom\nи заранее его настроить.\n\nВведите {BGREEN}Да {RESET}если вас не пугает указанное выше.\nВведите {BRED}Нет {RESET}если вас это не устраивает, программа сама закроется.\n\n > ')
if confirmation.lower() in yes_list:
setConfig("firstboot", False)
setConfig("obs_core", "Disabled")
setConfig("obs_exe", "Disabled")
setConfig("use_rpc", False)
break
elif confirmation.lower() in no_list:
setConfig("firstboot", True)
sys.exit()
break
else:
continue
elif getOS() == "unix":
while True:
os.system('clear')
confirmation = input(f'{BRED}Внимание! {RESET}AutoZoom плохо оптимизирован под {CYAN}Linux {RESET}и {CYAN}MacOS{RESET}.\nПродолжая использовать программу на ОС кроме {CYAN}Windows {RESET}вы действуете на свой страх и риск.\nПолноценная поддержка UNIX систем реализована не будет.\nДля хоть какой-то работы нужно установить Zoom\nи заранее его настроить.\n\nВведите {BGREEN}Да {RESET}если вас не пугает указанное выше.\nВведите {BRED}Нет {RESET}если вас это не устраивает, программа сама закроется.\n\n > ')
if confirmation.lower() in yes_list:
setConfig("firstboot", False)
setConfig("obs_core", "Disabled")
setConfig("obs_exe", "Disabled")
break
elif confirmation.lower() in no_list:
setConfig("firstboot", True)
sys.exit()
break
else:
continue
elif getOS() == "windows":
setConfig("firstboot", False)
#########################################################
libs = []
###################################
if getOS() == "windows":
try:
import easygui
except ModuleNotFoundError:
appendLog("No module easygui")
libs.append("easygui")
###################################
try:
import tkinter
except ModuleNotFoundError:
appendLog("No module tkinter")
libs.append("tkinter")
###################################
try:
from swinlnk.swinlnk import SWinLnk
except ModuleNotFoundError:
appendLog("No module swinlnk")
libs.append("swinlnk")
###################################
try:
import keyboard
except ModuleNotFoundError:
appendLog("No module keyboard")
libs.append("keyboard")
###################################
try:
import ast
except ModuleNotFoundError:
appendLog("No module ast")
libs.append("ast")
###################################
try:
import inputimeout
except ModuleNotFoundError:
appendLog("No module inputimeout")
libs.append("inputimeout")
###################################
try:
import telegram_send
except ModuleNotFoundError:
appendLog("No module telegram_send")
libs.append("telegram_send")
###################################
try:
import wget
except ModuleNotFoundError:
appendLog("No module wget")
libs.append("wget")
###################################
try:
import requests
except ModuleNotFoundError:
appendLog("No module requests")
libs.append("requests")
###################################
if getOS() != "android":
try:
from playsound import playsound
except ModuleNotFoundError:
appendLog("No module playsound")
libs.append("playsound")
else:
try:
os.system('pkg install play-audio')
except:
appendLog("Could not install play-audio")
###################################
try:
from zipfile import ZipFile
except ModuleNotFoundError:
appendLog("No module zipfile")
libs.append("zipfile")
###################################
try:
import asyncio
except ModuleNotFoundError:
appendLog("No module asyncio")
libs.append("asyncio")
###################################
try:
import getpass
except ModuleNotFoundError:
appendLog("No module getpass")
libs.append("getpass")
###################################
try:
from pypresence import Presence
except ModuleNotFoundError:
appendLog("No module pypresence")
libs.append("pypresence")
###################################
if len(libs) > 0:
print("Не хватает нужных модулей, пробуем установить...\nЭто может занять некоторое время. Пожалуйста, не закрывайте программу.")
appendLog('Missing some modules, trying to install them')
for each in libs:
try:
if getConfig("debug"):
response = os.system('"{}" -m pip install -U '.format(sys.executable) + each)
else:
response = os.system('"{}" -m pip install -U '.format(sys.executable) + each + " -q --no-warn-script-location")
except:
response = os.system('"{}" -m pip install -U '.format(sys.executable) + each + " -q --no-warn-script-location")
print(f"{RESET}[{BGREEN}OK{RESET}] Установлен модуль {YELLOW}{each}{RESET}.")
appendLog(f'Module {each} installed')
if response != 0:
appendLog(f'Failed to install {each}')
sys.exit(f"{RESET}[{BRED}ERR{RESET}] Установка {YELLOW}{each} {RESET}провалилась.")
appendLog('Everything seems to be installed')
print(f"{RESET}[{BGREEN}OK{RESET}] Все модули были успешно установлены.")
try:
if getOS() == "windows":
import easygui
import tkinter
from swinlnk.swinlnk import SWinLnk
import keyboard
import ast
import inputimeout
import telegram_send
import wget
import requests
import asyncio
import getpass
if getOS() != "android":
from playsound import playsound
from zipfile import ZipFile
from pypresence import Presence
except ModuleNotFoundError:
sys.exit(f"\n#############################################################################\n{BGREEN} Пожалуйста, перезапустите программу для продолжения!{RESET}\n Если это сообщение видно не впервые - напишите {BRED}@profitroll {RESET}в {CYAN}Telegram {RESET}или\n включите {BRED}debug {RESET}в {BRED}files/config.json {RESET}и решите проблему самостоятельно.\n#############################################################################")
#########################################################

4
locales/_default.json Normal file
View File

@@ -0,0 +1,4 @@
{
"avail_de": "AutoZoom ist auf Deutsch verfügbar. Sprache von Englisch auf Deutsch ändern?",
"avail_uk": "AutoZoom доступний українською. Змінити мову з англійської на українську?"
}

0
locales/de.json Normal file
View File

74
locales/en.json Normal file
View File

@@ -0,0 +1,74 @@
{
"answer_yes": ["y", "yes", "yep"],
"answer_no": ["n", "no", "nope"],
"functions": {
"compatability": "For Windows only!",
"winsound_error": "{0} Could not play winsound sound \"{1}\" (Error: {2})",
"playsound_error": "{0} Could not play playsound sound \"{1}\" (Error: {2})"
},
"rpc": {
"connection_error": "Module {0}Discord RPC {1}could not connect.\nYour {2}Discord {3}client might be closed.",
"connection_error_detailed": "Module {0}Discord RPC {1}could not connect.\nYour {2}Discord {3}client might be closed.\nError: {4}{5}",
"presence": {
"waiting": {
"smalltext": "Waiting",
"state": "Awaiting meeting «{0}»",
"details": "Meeting hasn't started"
},
"meeting": {
"smalltext": "Meeting",
"state": "Listening to «{0}»",
"details": "Ongoing meeting"
},
"menu": {
"smalltext": "Main menu",
"state": "Options list opened",
"details": "In the menus"
},
"shutdown": {
"smalltext": "Shutting down",
"state": "Countdown before auto-shutdown",
"details": "PC shutdown"
},
"sleep": {
"smalltext": "Sleeping mode",
"state": "Countdown before auto-sleep",
"details": "PC sleep mode"
},
"settings": {
"smalltext": "Settings",
"state": "Settings opened",
"details": "In the menus"
},
"debugmenu": {
"smalltext": "Debug",
"state": "Debug menu opened",
"details": "In the dev menu"
},
"editor": {
"smalltext": "Editor",
"state": "Meetings editor opened",
"details": "In the menus"
},
"updating": {
"smalltext": "Updater",
"state": "Updates center opened",
"details": "In the menus"
},
"support": {
"smalltext": "Support",
"state": "Help menu opened",
"details": "In the menus"
},
"ended": {
"smalltext": "Waiting",
"state": "Awaiting instructions",
"details": "All metings are over"
},
"debug": {
"smalltext": "Debug",
"state": "Discord RPC module is running in testing mode",
"details": "Debug mode"}
}
}
}

0
locales/uk.json Normal file
View File

121
main.py
View File

@@ -9,34 +9,76 @@ import platform
import subprocess import subprocess
from pathlib import Path from pathlib import Path
from functions import * from modules.functions import *
appendLog('main.py start initialized', startup=True) appendLog('main.py start initialized', startup=True)
setTitle("", getOS()) setTitle("", getOS())
if getConfig("firstboot"):
if getOS() == "android":
while True:
os.system('clear')
confirmation = input(f'{BRED}Внимание! {RESET}AutoZoom практически не оптимизирован под {CYAN}Android{RESET}.\nПродолжая использовать программу на ОС кроме {CYAN}Windows {RESET}вы действуете на свой страх и риск.\nПолноценная поддержка операционной системы Android не планируется.\nДля хоть какой-то работы нужно установить Zoom\nи заранее его настроить.\n\nВведите {BGREEN}Да {RESET}если вас не пугает указанное выше.\nВведите {BRED}Нет {RESET}если вас это не устраивает, программа сама закроется.\n\n > ')
if confirmation.lower() in yes_list:
setConfig("firstboot", False)
setConfig("obs_core", "Disabled")
setConfig("obs_exe", "Disabled")
setConfig("use_rpc", False)
break
elif confirmation.lower() in no_list:
setConfig("firstboot", True)
sys.exit()
break
else:
continue
elif getOS() == "unix":
while True:
os.system('clear')
confirmation = input(f'{BRED}Внимание! {RESET}AutoZoom плохо оптимизирован под {CYAN}Linux {RESET}и {CYAN}MacOS{RESET}.\nПродолжая использовать программу на ОС кроме {CYAN}Windows {RESET}вы действуете на свой страх и риск.\nПолноценная поддержка UNIX систем реализована не будет.\nДля хоть какой-то работы нужно установить Zoom\nи заранее его настроить.\n\nВведите {BGREEN}Да {RESET}если вас не пугает указанное выше.\nВведите {BRED}Нет {RESET}если вас это не устраивает, программа сама закроется.\n\n > ')
if confirmation.lower() in yes_list:
setConfig("firstboot", False)
setConfig("obs_core", "Disabled")
setConfig("obs_exe", "Disabled")
break
elif confirmation.lower() in no_list:
setConfig("firstboot", True)
sys.exit()
break
else:
continue
elif getOS() == "windows":
setConfig("firstboot", False)
from daemon import main from daemon import main
import settings import modules.settings as settings
import editor import modules.editor as editor
import rpc import modules.rpc as rpc
if getConfig("use_colors"): if getConfig("use_colors"):
from colors import * from modules.colors import *
else: else:
RESET = '' RESET = ''
BLACK = RED = GREEN = YELLOW = BLUE = MAGENTA = CYAN = WHITE = '' BLACK = RED = GREEN = YELLOW = BLUE = MAGENTA = CYAN = WHITE = ''
BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = '' BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = ''
ULINE = REVERSE = '' ULINE = REVERSE = ''
import libinstaller
import wget import wget
import requests import requests
import keyboard import keyboard
import getpass import getpass
from zipfile import ZipFile from zipfile import ZipFile
version = 2.1 version = 2.7
path = Path(__file__).resolve().parent path = Path(__file__).resolve().parent
def mainMenu(): def mainMenu():
@@ -63,7 +105,7 @@ def mainMenu():
except Exception as exp: except Exception as exp:
appendLog(f'Version number load failed {exp}') appendLog(f'Version number load failed {exp}')
setTitle("Ошибка загрузки данных", getOS()) setTitle("Ошибка загрузки данных", getOS())
print(f'Не удалось загрузить данные о последней версии.\nПроверьте подключение к сети и повторите попытку.\n\nСтатус сервера центра обновлений:\n{BRED}https://status.end-play.xyz/786373747{RESET}') print(f'Не удалось загрузить данные о последней версии.\nПроверьте подключение к сети и повторите попытку.\n\nСтатус сервера центра обновлений:\n{BRED}https://stats.uptimerobot.com/OqwR9iAqBg{RESET}')
todo = input(f'\nВведите {BRED}ignore {RESET}чтобы выключить проверку обновлений и продолжить\nлибо введите что угодно иное чтобы закрыть программу.\n\n > {BRED}') todo = input(f'\nВведите {BRED}ignore {RESET}чтобы выключить проверку обновлений и продолжить\nлибо введите что угодно иное чтобы закрыть программу.\n\n > {BRED}')
@@ -167,8 +209,10 @@ def helpMenu():
print(f' {BRED}3.{RESET} Центр поддержки') print(f' {BRED}3.{RESET} Центр поддержки')
print(f' {BRED}4.{RESET} Telegram проекта') print(f' {BRED}4.{RESET} Telegram проекта')
print(f' {BRED}5.{RESET} Связаться с автором') print(f' {BRED}5.{RESET} Связаться с автором')
print(f' {BRED}6.{RESET} Сводка информации') print(f' {BRED}6.{RESET} Поддержать проект')
print(f' {BRED}7.{RESET} В главное меню') print(f' {BRED}7.{RESET} Список поддержавших')
print(f' {BRED}8.{RESET} Сводка информации')
print(f' {BRED}9.{RESET} В главное меню')
help_choose = input(f'\n > {BRED}') help_choose = input(f'\n > {BRED}')
@@ -222,7 +266,27 @@ def helpMenu():
appendLog(f'Failed to open AutoZoom\'s developer Telegram: {exp}') appendLog(f'Failed to open AutoZoom\'s developer Telegram: {exp}')
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://t.me/profitroll{RESET}\n\n > ') none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://t.me/profitroll{RESET}\n\n > ')
clear() clear()
if help_choose == '6': elif help_choose == '6':
try:
clear()
appendLog('Opened AutoZoom\'s donation page')
webbrowser.open("https://www.end-play.xyz/autozoom/donate")
except Exception as exp:
clear()
appendLog(f'Failed to open AutoZoom\'s donation page: {exp}')
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://www.end-play.xyz/autozoom/donate{RESET}\n\n > ')
clear()
elif help_choose == '7':
try:
clear()
print(f'{BBLACK}»{RESET} Список поддержавших проект:\n\n{(requests.get("https://www.end-play.xyz/AutoZoomDonors.txt").content.decode("utf-8")).replace("-", RESET+""+BRED)}{RESET}')
except Exception as exp:
clear()
appendLog(f'Failed to load donation list {exp}')
print(f'{RESET}Не удалось загрузить данные о списке поддержавших проект.\nВы можете посмотреть его самостоятельно: {BRED}https://www.end-play.xyz/AutoZoomDonors.txt')
none = input('\n > ')
clear()
if help_choose == '8':
clear() clear()
if getState("RBTray.exe"): if getState("RBTray.exe"):
@@ -257,7 +321,7 @@ def helpMenu():
print(f' {BBLACK}{RESET} Discord RPC: {dsrpc}') print(f' {BBLACK}{RESET} Discord RPC: {dsrpc}')
none = input('\n > ') none = input('\n > ')
clear() clear()
elif help_choose == '7': elif help_choose == '9':
rpc.inMenu() rpc.inMenu()
clear() clear()
setTitle("AutoZoom (Главная)", getOS()) setTitle("AutoZoom (Главная)", getOS())
@@ -282,10 +346,12 @@ def devMenu():
print(f' {BRED}1.{RESET} PlaySound test') print(f' {BRED}1.{RESET} PlaySound test')
print(f' {BRED}2.{RESET} WinSound test') print(f' {BRED}2.{RESET} WinSound test')
print(f' {BRED}3.{RESET} Play-audio test') print(f' {BRED}3.{RESET} Play-audio test')
print(f' {BRED}4.{RESET} OS check test') print(f' {BRED}4.{RESET} playSound function test')
print(f' {BRED}5.{RESET} Telegram test') print(f' {BRED}5.{RESET} OS check test')
print(f' {BRED}6.{RESET} Color test') print(f' {BRED}6.{RESET} Telegram test')
print(f' {BRED}7.{RESET} Exit to menu') print(f' {BRED}7.{RESET} Zoom meeting test')
print(f' {BRED}8.{RESET} Color test')
print(f' {BRED}9.{RESET} Exit to menu')
choose = input(f'\n > {BRED}') choose = input(f'\n > {BRED}')
@@ -304,17 +370,27 @@ def devMenu():
continue continue
elif choose == '4': elif choose == '4':
playSound("debug")
continue
elif choose == '5':
clear() clear()
none = input(f'{RESET}{getOS()}\n\n > ') none = input(f'{RESET}{getOS()}\n\n > ')
continue continue
elif choose == '5': elif choose == '6':
clear() clear()
import telegram_send import telegram_send
telegram_send.send(messages=["Telegram message test"], parse_mode="markdown", conf=files_folder+"telegram.conf") telegram_send.send(messages=["Telegram message test"], parse_mode="markdown", conf=files_folder+"telegram.conf")
continue continue
elif choose == '6': elif choose == '7':
clear()
print(editor.debugLesson())
none = input(f'{RESET}\n > ')
continue
elif choose == '8':
clear() clear()
print(f'{BLACK}███{RED}███{GREEN}███{YELLOW}███{BLUE}███{MAGENTA}███{CYAN}███{WHITE}███') print(f'{BLACK}███{RED}███{GREEN}███{YELLOW}███{BLUE}███{MAGENTA}███{CYAN}███{WHITE}███')
print(f'{BBLACK}███{BRED}███{BGREEN}███{BYELLOW}███{BBLUE}███{BMAGENTA}███{BCYAN}███{BWHITE}███') print(f'{BBLACK}███{BRED}███{BGREEN}███{BYELLOW}███{BBLUE}███{BMAGENTA}███{BCYAN}███{BWHITE}███')
@@ -324,7 +400,7 @@ def devMenu():
none = input(RESET+'\n > ') none = input(RESET+'\n > ')
continue continue
elif choose == '7': elif choose == '9':
rpc.inMenu() rpc.inMenu()
clear() clear()
setTitle("AutoZoom (Главная)", getOS()) setTitle("AutoZoom (Главная)", getOS())
@@ -382,6 +458,7 @@ def updater(serv_ver, version):
print(f' {BRED}1.{RESET} Установить') print(f' {BRED}1.{RESET} Установить')
print(f' {BRED}2.{RESET} Отменить') print(f' {BRED}2.{RESET} Отменить')
updater_decide = input(f'\n > {BRED}') updater_decide = input(f'\n > {BRED}')
print(RESET)
if updater_decide == '1': if updater_decide == '1':
appendLog('Trying to update AutoZoom') appendLog('Trying to update AutoZoom')
@@ -427,7 +504,7 @@ def updater(serv_ver, version):
appendLog('Changelog loaded') appendLog('Changelog loaded')
clear() clear()
print(f'{RESET}{changelog_text}\n') print(f'{RESET}{changelog_text}\n')
print(changelog.text) print(changelog.content.decode('utf-8'))
print(changelog_footer) print(changelog_footer)
none = input('\n > ') none = input('\n > ')
continue continue
@@ -454,7 +531,7 @@ def updater(serv_ver, version):
return return
if __name__ == '__main__': if __name__ == '__main__':
from functions import getConfig from modules.functions import getConfig
from daemon import clear, getOS, setTitle from daemon import clear, getOS, setTitle
import time import time
setTitle("Загрузка main...", getOS()) setTitle("Загрузка main...", getOS())

View File

@@ -1,5 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# def col(color, type="util"):
# if type is "util":
# type="utility"
# elif type is "br":
# type="bright"
# elif type is "def":
# type="default"
RESET = '\u001b[0m' RESET = '\u001b[0m'
BLACK = '\u001b[30m' BLACK = '\u001b[30m'

View File

@@ -1,10 +1,10 @@
import rpc import modules.rpc as rpc
from functions import * from modules.functions import *
from datetime import datetime, date, timedelta from datetime import datetime, date, timedelta
from daemon import getLessons, getConfig from daemon import getLessons, getConfig
if getConfig("use_colors"): if getConfig("use_colors"):
from colors import * from modules.colors import *
appendLog('Colors imported') appendLog('Colors imported')
else: else:
RESET = '' RESET = ''
@@ -30,7 +30,7 @@ def listLessons(from_where='remove'):
repeat = 'Вкл.' repeat = 'Вкл.'
else: else:
repeat = 'Выкл.' repeat = 'Выкл.'
if les[1]["record"]: if les[1]["record"]:
record = 'Вкл.' record = 'Вкл.'
else: else:
@@ -40,7 +40,7 @@ def listLessons(from_where='remove'):
repeat_day = getDay(les[1]["repeat_day"]) repeat_day = getDay(les[1]["repeat_day"])
except: except:
repeat_day = 'Не повторяется' repeat_day = 'Не повторяется'
length = len(str(les[0])) length = len(str(les[0]))
spacer_all = 6 * ' ' spacer_all = 6 * ' '
@@ -58,15 +58,18 @@ def listLessons(from_where='remove'):
if from_where == 'editor': if from_where == 'editor':
none = input('\n\n > ') none = input('\n\n > ')
except KeyboardInterrupt: except KeyboardInterrupt:
clear() clear()
return return
def sortLessons(dictionary): def sortLessons(dictionary):
dictionary.sort(key = lambda x: datetime.strptime(x['time'], '%H:%M')) if getConfig("debug"):
dictionary.sort(key = lambda x: datetime.strptime(x['date'], '%d.%m.%Y')) print(dictionary)
dictionary.sort(key = lambda x: datetime.strptime(x["time"], '%H:%M'))
dictionary.sort(key = lambda x: datetime.strptime(x["date"], '%d.%m.%Y'))
appendLog('Lessons dictionary sorted') appendLog('Lessons dictionary sorted')
@@ -95,6 +98,7 @@ def addLesson():
lessons_got = getLessons() lessons_got = getLessons()
lessname = input(f'{RESET}Введите (своё) имя конференции:\n{BBLACK}Нужно лишь для отображения в Discord и самом AutoZoom{RESET}\n\n > {CYAN}') lessname = input(f'{RESET}Введите (своё) имя конференции:\n{BBLACK}Нужно лишь для отображения в Discord и самом AutoZoom{RESET}\n\n > {CYAN}')
lessname = strCleaner(lessname)
local_lessons.update({"name": lessname}) local_lessons.update({"name": lessname})
while True: while True:
@@ -140,9 +144,9 @@ def addLesson():
finallessdate = lessdate finallessdate = lessdate
except: except:
continue continue
local_lessons.update({"date": finallessdate}) local_lessons.update({"date": finallessdate})
break break
except: except:
continue continue
@@ -172,7 +176,7 @@ def addLesson():
else: else:
conflictles += f', {CYAN}{lesson["name"]}{RESET}' conflictles += f', {CYAN}{lesson["name"]}{RESET}'
confstr = 'конференциями' confstr = 'конференциями'
if conflict: if conflict:
while True: while True:
clear() clear()
@@ -188,7 +192,7 @@ def addLesson():
else: else:
continue continue
if abort == "restart": if abort == "restart":
continue continue
else: else:
@@ -204,6 +208,7 @@ def addLesson():
clear() clear()
lesslink = input(f'{RESET}Введите ссылку на конференцию:\n{BBLACK}Формат: {BRED}https://us01web.zoom.us/j/ИДЕНТИФИКАТОР?pwd=ПАРОЛЬ{RESET}\n{BBLACK}Либо введите {YELLOW}1 {BBLACK}для добавления по номеру и паролю{RESET}\n\n > {BRED}').replace(" ", "") lesslink = input(f'{RESET}Введите ссылку на конференцию:\n{BBLACK}Формат: {BRED}https://us01web.zoom.us/j/ИДЕНТИФИКАТОР?pwd=ПАРОЛЬ{RESET}\n{BBLACK}Либо введите {YELLOW}1 {BBLACK}для добавления по номеру и паролю{RESET}\n\n > {BRED}').replace(" ", "")
lesslink = strCleaner(lesslink)
if lesslink.replace(' ', '') == '1': if lesslink.replace(' ', '') == '1':
clear() clear()
@@ -252,7 +257,7 @@ def addLesson():
finallessrecord = False finallessrecord = False
local_lessons.update({"record": finallessrecord}) local_lessons.update({"record": finallessrecord})
break break
lessons_got.append(dict(local_lessons)) lessons_got.append(dict(local_lessons))
sortLessons(lessons_got) sortLessons(lessons_got)
@@ -294,7 +299,7 @@ def editLesson():
except: except:
clear() clear()
continue continue
try: try:
probe = lessons_got[edi]["name"] probe = lessons_got[edi]["name"]
break break
@@ -309,6 +314,8 @@ def editLesson():
clear() clear()
lessname = input(f'{RESET}Введите (своё) имя конференции:\n{BBLACK}Нужно лишь для отображения в Discord и самом AutoZoom{RESET}\n\nОригинальное имя: {CYAN}{lessons_got[edi]["name"]}{RESET}\n\n > {CYAN}') lessname = input(f'{RESET}Введите (своё) имя конференции:\n{BBLACK}Нужно лишь для отображения в Discord и самом AutoZoom{RESET}\n\nОригинальное имя: {CYAN}{lessons_got[edi]["name"]}{RESET}\n\n > {CYAN}')
lessname = strCleaner(lessname)
if lessname == '': if lessname == '':
lessname = lessons_got[edi]["name"] lessname = lessons_got[edi]["name"]
local_lessons.update({"name": lessname}) local_lessons.update({"name": lessname})
@@ -357,63 +364,79 @@ def editLesson():
finallessdate = lessdate finallessdate = lessdate
except: except:
continue continue
local_lessons.update({"date": finallessdate}) local_lessons.update({"date": finallessdate})
break break
except: except:
continue continue
while True: while True:
clear() clear()
try: try:
lesstime = input(f'{RESET}Введите время конференции ({BRED}ЧЧ:ММ{RESET}):\n\nОригинальное время: {BRED}{lessons_got[edi]["time"]}{RESET}\n\n > {BRED}') lesstime = input(f'{RESET}Введите время конференции ({BRED}ЧЧ:ММ{RESET}):\n\nОригинальное время: {BRED}{lessons_got[edi]["time"]}{RESET}\n\n > {BRED}')
finallesstime = (datetime.strptime(lesstime, "%H:%M"))
local_lessons.update({"time": lesstime})
abort = "skip"
conflict = False
conflictles = ''
confstr = 'конференцией'
try: if lesstime == '':
finallesstime = lessons_got[edi]["time"]
for lesson in lessons_got: lesstime = lessons_got[edi]["time"]
if lesson["date"] == finallessdate and lesson["time"] == lesstime: local_lessons.update({"time": lesstime})
conflict = True
else:
try:
finallesstime = (datetime.strptime(lesstime, "%H:%M"))
finallesstime = lesstime
local_lessons.update({"time": lesstime})
abort = "skip"
conflict = False
conflictles = ''
confstr = 'конференцией'
try:
for lesson in lessons_got:
if conflictles == '': if lesson["date"] == finallessdate and lesson["time"] == lesstime:
conflictles = f'{CYAN}{lesson["name"]}{RESET}' conflict = True
confstr = 'конференцией'
else:
conflictles += f', {CYAN}{lesson["name"]}{RESET}'
confstr = 'конференциями'
if conflict:
while True:
clear()
choice = input(f'{RESET}Время и дата конференции совпадают с {confstr} {conflictles}.\nДобавить ещё одну конференцию на то же время? ({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n\n > ')
if choice.lower() in yes_list:
abort = "bypass"
break
elif choice.lower() in no_list:
abort = "restart"
break
else:
continue
if abort == "restart": if conflictles == '':
conflictles = f'{CYAN}{lesson["name"]}{RESET}'
confstr = 'конференцией'
else:
conflictles += f', {CYAN}{lesson["name"]}{RESET}'
confstr = 'конференциями'
if conflict:
while True:
clear()
choice = input(f'{RESET}Время и дата конференции совпадают с {confstr} {conflictles}.\nДобавить ещё одну конференцию на то же время? ({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n\n > ')
if choice.lower() in yes_list:
abort = "bypass"
break
elif choice.lower() in no_list:
abort = "restart"
break
else:
continue
if abort == "restart":
continue
else:
break
except Exception as exp:
none = input(exp)
pass
except:
continue continue
else:
break
except Exception as exp:
none = input(exp)
pass
break break
except: except:
@@ -421,6 +444,7 @@ def editLesson():
clear() clear()
lesslink = input(f'{RESET}Введите ссылку на конференцию:\n{BBLACK}Формат: {BRED}https://us01web.zoom.us/j/ИДЕНТИФИКАТОР?pwd=ПАРОЛЬ{RESET}\n{BBLACK}Либо введите {YELLOW}1 {BBLACK}для добавления по номеру и паролю{RESET}\n\n > {BRED}').replace(" ", "") lesslink = input(f'{RESET}Введите ссылку на конференцию:\n{BBLACK}Формат: {BRED}https://us01web.zoom.us/j/ИДЕНТИФИКАТОР?pwd=ПАРОЛЬ{RESET}\n{BBLACK}Либо введите {YELLOW}1 {BBLACK}для добавления по номеру и паролю{RESET}\n\n > {BRED}').replace(" ", "")
lesslink = strCleaner(lesslink)
if lesslink.replace(' ', '') == '1': if lesslink.replace(' ', '') == '1':
clear() clear()
@@ -428,10 +452,10 @@ def editLesson():
clear() clear()
lesspasswd = input(f'{RESET}Введите код доступа (пароль) конференции:\n\n > {BRED}') lesspasswd = input(f'{RESET}Введите код доступа (пароль) конференции:\n\n > {BRED}')
lesslink = f'https://us01web.zoom.us/j/{lessid.replace(" ", "")}?pwd={lesspasswd.replace(" ", "")}' lesslink = f'https://us01web.zoom.us/j/{lessid.replace(" ", "")}?pwd={lesspasswd.replace(" ", "")}'
if lesslink == '': if lesslink == '':
lesslink = lessons_got[edi]["link"] lesslink = lessons_got[edi]["link"]
local_lessons.update({"link": lesslink}) local_lessons.update({"link": lesslink})
while True: while True:
@@ -492,7 +516,7 @@ def editLesson():
finallessrecord = False finallessrecord = False
local_lessons.update({"record": finallessrecord}) local_lessons.update({"record": finallessrecord})
break break
del lessons_got[edi] del lessons_got[edi]
lessons_got.append(dict(local_lessons)) lessons_got.append(dict(local_lessons))
sortLessons(lessons_got) sortLessons(lessons_got)
@@ -529,7 +553,7 @@ def removeLesson():
except: except:
clear() clear()
continue continue
try: try:
del_name = lessons_local[rem]["name"] del_name = lessons_local[rem]["name"]
del_date = lessons_local[rem]["date"] del_date = lessons_local[rem]["date"]
@@ -541,7 +565,7 @@ def removeLesson():
time.sleep(3) time.sleep(3)
clear() clear()
continue continue
sortLessons(lessons_local) sortLessons(lessons_local)
saveJson(files_folder+'lessons.json', lessons_local) saveJson(files_folder+'lessons.json', lessons_local)
clear() clear()
@@ -567,7 +591,7 @@ def removeAllLessons():
with open(files_folder+'lessons.json', 'w', encoding="utf-8") as f: with open(files_folder+'lessons.json', 'w', encoding="utf-8") as f:
f.write("[]") f.write("[]")
f.close() f.close()
appendLog('All lessons removed') appendLog('All lessons removed')
clear() clear()
none = input('Все конференции были удалены.\n\n > ') none = input('Все конференции были удалены.\n\n > ')
@@ -587,6 +611,32 @@ def removeAllLessons():
return return
def debugLesson():
try:
from profile import debuglink, name
appendLog('Debug link added to the list')
local_lessons = {}
lessons_got = getLessons()
local_lessons.update({"name": "Debug Lesson"})
local_lessons.update({"date": date.today().strftime("%d.%m.%Y")})
local_lessons.update({"time": "00:00"})
local_lessons.update({"link": debuglink})
local_lessons.update({"repeat": False})
local_lessons.update({"repeat_day": None})
local_lessons.update({"record": True})
lessons_got.append(dict(local_lessons))
sortLessons(lessons_got)
saveJson(files_folder+'lessons.json', lessons_got)
return f"{RESET}Конференция для отладки профиля {CYAN}{name} {RESET}была добавлена."
except:
return f"{RESET}Для отладки нужен профиль {BRED}profile.py {RESET}со ссылкой на конференцию {BRED}debuglink {RESET}и именем {BRED}name{RESET}."
def editor(): def editor():
try: try:
setTitle("AutoZoom (Редактор)", getOS()) setTitle("AutoZoom (Редактор)", getOS())
@@ -634,7 +684,7 @@ def editor():
mainMenu() mainMenu()
else: else:
continue continue
except KeyboardInterrupt: except KeyboardInterrupt:
appendLog('Exiting back to main menu') appendLog('Exiting back to main menu')
rpc.inMenu() rpc.inMenu()

View File

@@ -1,14 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pip from socket import send_fds
import time import time
import json import json
import os import os
import shutil import shutil
import gzip import gzip
import getpass import getpass
import keyboard
from modules.telegram import telegramSendText
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
import asyncio, threading
from subprocess import check_output from subprocess import check_output
path = Path(__file__).resolve().parent path = Path(__file__).resolve().parent
@@ -16,28 +19,121 @@ sounds_folder = str(Path(str(path)+"/sounds/")) + os.sep
files_folder = str(Path(str(path)+"/files/")) + os.sep files_folder = str(Path(str(path)+"/files/")) + os.sep
logs_folder = str(Path(str(path)+"/logs/")) + os.sep logs_folder = str(Path(str(path)+"/logs/")) + os.sep
yes_list = ['y', 'yes', 'д', 'да'] yes_list = ['y', 'yes', 'т', 'так', 'j', 'ja']
no_list = ['n', 'no', 'н', 'нет'] no_list = ['n', 'no', 'н', 'ні', 'nein']
default_config = { default_config = {
"firstboot": True, "firstrun": True,
"debug": False, "debug": False,
"shutdown_timeout": 30, "update_check": True,
"shutdown_enabled": False, "logging": {
"start": "shift+f7", "enabled": True,
"stop": "shift+f8", "rotate_size": 512
"telegram_enabled": False, },
"use_colors": True, "meetings": {
"run_fullscreen": False, "remove_old": True
"use_rpc": True, },
"sounds": True, "meeting_end": {
"end_mode": "shutdown", "mode": "shutdown",
"obs_exe": None, "shutdown": {
"obs_core": None, "timeout": 30
"update_check": True, }
"write_logs": True, },
"log_size": 512 "obs": {
"enabled": False,
"path_bin": None,
"path_core": None,
"delay": 10,
"video": {
"send": False,
"path": None,
"filename": None
},
"keybinds": {
"record_start": "shift+f7",
"record_stop": "shift+f8"
}
},
"telegram": {
"enabled": False,
"token": None,
"user_id": None
},
"appearance": {
"theme": "dark",
"colors": True,
"fullscreen": False
},
"rpc": {
"enabled": True,
"app_id": "800049969960058882"
},
"sounds": {
"enabled": True,
"sounds": {
"meeting_ended": "ended",
"record_start": "recordstart",
"record_stop": "recordstop",
"shutdown": "shutdown",
"meeting_started": "started",
"meeting_warning": "warning"
}
},
"binds": {
"app_start": {
"commands": [],
"keymaps": [],
"messages": []
},
"app_end": {
"commands": [],
"keymaps": [],
"messages": []
},
"queue_start": {
"commands": [],
"keymaps": [],
"messages": []
},
"queue_end": {
"commands": [],
"keymaps": [],
"messages": []
},
"meeting_start": {
"commands": [],
"keymaps": [],
"messages": []
},
"meeting_end": {
"commands": [],
"keymaps": [],
"messages": []
}
} }
# "start": "shift+f7",
# "stop": "shift+f8",
# "telegram_enabled": False,
# "use_colors": True,
# "run_fullscreen": False,
# "rpc_use": True,
# "rpc_id": "800049969960058882",
# "sounds": True,
# "end_mode": "shutdown",
# "obs_exe": None,
# "obs_core": None,
# "obs_delay": 10,
# "write_logs": True,
# "log_size": 512,
# "sound_ended": "ended",
# "sound_recordstart": "recordstart",
# "sound_recordstop": "recordstop",
# "sound_shutdown": "shutdown",
# "sound_started": "started",
# "sound_warning": "warning"
# "shutdown_timeout": 30,
# "shutdown_enabled": False,
}
# Функция возвращающая надпись Windows Only # Функция возвращающая надпись Windows Only
@@ -70,6 +166,17 @@ else:
clear = lambda: os.system('clear') clear = lambda: os.system('clear')
# Импортирование игралки звуков
try:
if getOS() == "windows":
import winsound
from playsound import playsound
elif getOS() == "unix":
from playsound import playsound
except:
pass
# Установка заголовка окна cmd.exe # Установка заголовка окна cmd.exe
def setTitle(title, system): def setTitle(title, system):
if system == "windows": if system == "windows":
@@ -96,15 +203,15 @@ def checkSize():
log = os.stat(logs_folder + 'latest.log') log = os.stat(logs_folder + 'latest.log')
if (log.st_size / 1024) > getConfig("log_size"): if (log.st_size / 1024) > getConfig("log_size"):
with open(logs_folder + 'latest.log', 'rb') as f_in: with open(logs_folder + 'latest.log', 'rb', encoding='utf-8') as f_in:
with gzip.open(f'{logs_folder}{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.zip', 'wb') as f_out: with gzip.open(f'{logs_folder}{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.zip', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out) shutil.copyfileobj(f_in, f_out)
if getConfig("debug"): if getConfig("debug"):
print(f'Copied {logs_folder}{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.zip') print(f'Copied {logs_folder}{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.zip')
open(logs_folder + 'latest.log', 'w').close()
open(logs_folder + 'latest.log', 'w', encoding='utf-8').close()
i = 2 i = 2
except FileNotFoundError: except FileNotFoundError:
@@ -113,13 +220,13 @@ def checkSize():
time.sleep(2) time.sleep(2)
try: try:
log = open(logs_folder + 'latest.log', 'a') log = open(logs_folder + 'latest.log', 'a', encoding='utf-8')
open(logs_folder + 'latest.log', 'a').close() open(logs_folder + 'latest.log', 'a', encoding='utf-8').close()
except: except:
try: try:
os.mkdir(logs_folder) os.mkdir(logs_folder)
log = open(logs_folder + 'latest.log', 'a') log = open(logs_folder + 'latest.log', 'a', encoding='utf-8')
open(logs_folder + 'latest.log', 'a').close() open(logs_folder + 'latest.log', 'a', encoding='utf-8').close()
except: except:
if getConfig("debug"): if getConfig("debug"):
time.sleep(2) time.sleep(2)
@@ -138,13 +245,13 @@ def appendLog(message, startup=False, shutdown=False):
checkSize() checkSize()
try: try:
log = open(logs_folder + 'latest.log', 'a') log = open(logs_folder + 'latest.log', 'a', encoding='utf-8')
open(logs_folder + 'latest.log', 'a').close() open(logs_folder + 'latest.log', 'a', encoding='utf-8').close()
except: except:
try: try:
os.mkdir(logs_folder) os.mkdir(logs_folder)
log = open(logs_folder + 'latest.log', 'a') log = open(logs_folder + 'latest.log', 'a', encoding='utf-8')
open(logs_folder + 'latest.log', 'a').close() open(logs_folder + 'latest.log', 'a', encoding='utf-8').close()
except: except:
time.sleep(2) time.sleep(2)
print('Log file could not be created') print('Log file could not be created')
@@ -185,7 +292,7 @@ def playSound(soundname, timing=''):
if getConfig("debug"): if getConfig("debug"):
print(f'{timing} Не удалось проиграть playsound звук "{soundname}" (Ошибка: {exp})') print(f'{timing} Не удалось проиграть playsound звук "{soundname}" (Ошибка: {exp})')
elif getOS() == "android": elif getOS() == "android":
try: try:
@@ -193,7 +300,7 @@ def playSound(soundname, timing=''):
except Exception as exp: except Exception as exp:
appendLog(f'Could not play play-audio: {exp}') appendLog(f'Could not play play-audio: {exp}')
else: else:
try: try:
@@ -206,6 +313,33 @@ def playSound(soundname, timing=''):
print(f'{timing} Не удалось проиграть playsound звук "{soundname}" (Ошибка: {exp})') print(f'{timing} Не удалось проиграть playsound звук "{soundname}" (Ошибка: {exp})')
# Функция удаления ненужного мусора из строки
def strCleaner(string):
output = string.replace('"', '\"').replace('\n', '')
appendLog(f"String cleaned: {output}")
return output
# Load json to dict
def jsonLoad(filename):
"""Loads arg1 as json and returns its contents"""
with open(filename, "r", encoding='utf8') as file:
output = json.load(file)
file.close()
return output
# Save json dict to filename
def jsonSave(contents, filename):
"""Dumps dict/list arg1 to file arg2"""
with open(filename, "w", encoding='utf8') as file:
json.dump(contents, file, ensure_ascii=False, indent=4)
file.close()
return
# Функция добавления переменных, если их нет # Функция добавления переменных, если их нет
def repairConfig(some_dic): def repairConfig(some_dic):
@@ -249,7 +383,7 @@ def setConfig(some_var, some_val):
try: try:
config_list[some_var] = some_val config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list) saveJson(files_folder+'config.json', config_list)
appendLog(f'Changed variable "{somevar}" to {some_val}') appendLog(f'Changed variable "{some_var}" to {some_val}')
except: except:
@@ -259,7 +393,7 @@ def setConfig(some_var, some_val):
json_file.close() json_file.close()
config_list[some_var] = some_val config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list) saveJson(files_folder+'config.json', config_list)
appendLog(f'Changed variable "{somevar}" to {some_val}') appendLog(f'Changed variable "{some_var}" to {some_val}')
except: except:
pass pass
@@ -296,13 +430,13 @@ def setConfig(some_var, some_val):
json_file.close() json_file.close()
config_list[some_var] = some_val config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list) saveJson(files_folder+'config.json', config_list)
appendLog(f'Changed variable "{somevar}" to {some_val}') appendLog(f'Changed variable "{some_var}" to {some_val}')
except: except:
config_list[some_var] = some_val config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list) saveJson(files_folder+'config.json', config_list)
appendLog(f'Changed variable "{somevar}" to {some_val}') appendLog(f'Changed variable "{some_var}" to {some_val}')
except: except:
return "Error" return "Error"
@@ -333,10 +467,14 @@ def getConfig(some_var):
except: except:
try: try:
repairConfig(config_list) try:
config_list = json.load(json_file) setConfig(some_var, default_config[some_var])
json_file.close() return default_config[some_var]
return config_list[some_var] except:
repairConfig(config_list)
config_list = json.load(json_file)
json_file.close()
return config_list[some_var]
except: except:
return default_config[some_var] return default_config[some_var]
except: except:
@@ -383,7 +521,7 @@ def getState(process="CptHost.exe"):
return True return True
else: else:
return False return False
except Exception as exp: except Exception as exp:
appendLog(f'Failed to get state using tasklist: {exp}') appendLog(f'Failed to get state using tasklist: {exp}')
@@ -399,4 +537,68 @@ def getState(process="CptHost.exe"):
def saveJson(filename, value): def saveJson(filename, value):
with open(filename, 'w', encoding="utf-8") as f: with open(filename, 'w', encoding="utf-8") as f:
json.dump(value, f, indent=4, ensure_ascii=False) json.dump(value, f, indent=4, ensure_ascii=False)
f.close() f.close()
# Fire some function
_loop = None
def fire_and_forget(coro):
global _loop
if _loop is None:
_loop = asyncio.new_event_loop()
threading.Thread(target=_loop.run_forever, daemon=True).start()
_loop.call_soon_threadsafe(asyncio.create_task, coro)
def configSet(key: str, value, *args: str):
"""Set key to a value
Args:
* key (str): The last key of the keys path.
* value (str/int/float/list/dict/None): Some needed value.
* *args (str): Path to key like: dict[args][key].
"""
this_dict = jsonLoad(f"{files_folder}config.json")
string = "this_dict"
for arg in args:
string += f'["{arg}"]'
if type(value) in [str]:
string += f'["{key}"] = "{value}"'
else:
string += f'["{key}"] = {value}'
exec(string)
jsonSave(this_dict, f"{files_folder}config.json")
return
def configGet(key: str, *args: str):
"""Get value of the config key
Args:
* key (str): The last key of the keys path.
* *args (str): Path to key like: dict[args][key].
Returns:
* any: Value of provided key
"""
this_dict = jsonLoad(f"{files_folder}config.json")
this_key = this_dict
for dict_key in args:
this_key = this_key[dict_key]
return this_key[key]
async def execBind(action: str, kind="command"):
"""Execute binded action
Args:
* action (str): Bind, command or message.
* kind (str, optional): "keybind", "command" or "message". Defaults to "command".
"""
if kind == "message":
telegramSendText(message=action)
elif kind == "keybind":
keyboard.press_and_release(action)
else:
os.system(action)
return

23
modules/install.py Normal file
View File

@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
import os
from modules.functions import getOS, appendLog
libs = ["keyboard", "ast", "inputimeout", "telegram_send", "wget", "requests", "zipfile", "asyncio", "getpass", "pypresence"]
if getOS() == "windows":
libs.append("easygui")
libs.append("tkinter")
libs.append("swinlnk")
if getOS() != "android":
libs.append("playsound")
else:
try:
if not "play-audio" in os.popen('pkg list-all').read():
os.system('pkg install play-audio')
except:
appendLog("Could not install play-audio")
with open('requirements.txt', 'w', encoding='utf-8') as f:
f.writelines('\n'.join(libs))

145
modules/rpc.py Normal file
View File

@@ -0,0 +1,145 @@
# -*- coding: utf-8 -*-
import time
import os
import sys
from modules.colors import *
from modules.functions import *
version = '2.7'
from pypresence import Presence
client_id = getConfig("rpc_id")
try:
RPC = Presence(client_id,pipe=0)
except Exception as exp:
appendLog(f'Discord RPC failed to initialize status due to {exp}')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.\nОшибка: {BRED}{exp}{RESET}')
time.sleep(1)
connected = False
rpc_dict = {
"large_image": "1024_cover",
"small_image": {
"waiting": "status_waiting",
"meeting": "status_lesson",
"menu": "status_menu",
"shutdown": "status_shutdown",
"settings": "status_settings",
"debug": "status_debug",
"editor": "status_editing",
"updating": "status_updating",
"support": "status_support"
},
"large_text": "AutoZoom • v%version%\nhttp://bit.ly/auto_zoom"
}
if getConfig("rpc_use") and getOS != "android":
try:
RPC.connect()
connected = True
except:
pass
else:
connected = False
def disconnect():
global connected
if getConfig("rpc_use") and getOS != "android":
try:
RPC.close()
connected = False
appendLog('Discord RPC disconnected')
except:
appendLog('Discord RPC failed to disconnect')
def connect():
global connected
try:
RPC.connect()
connected = True
appendLog('Discord RPC connected')
except:
appendLog('Discord RPC failed to connect')
def reset():
if getConfig("rpc_use") and getOS != "android":
RPC.clear()
appendLog('Discord RPC status cleared')
def changePresence(sml_img, sml_txt, stt, dtls, start=None, end=None):
try:
if getConfig("rpc_use") and getOS != "android":
if connected == False:
connect()
RPC.update(
large_image=rpc_dict["large_image"],
small_image=rpc_dict["small_image"][sml_img],
large_text=rpc_dict["large_text"].replace("%version%", str(version)),
small_text=sml_txt,
state=stt,
details=dtls,
start=start,
end=end
)
appendLog(f'Discord RPC changed: (Small image: {sml_img}, Small text: {sml_txt}, State: {stt}, Details: {dtls}, Start: {str(start)}, End: {str(end)})')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except Exception as exp:
appendLog(f'Discord RPC failed to change status due to {exp}')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.\nОшибка: {BRED}{exp}{RESET}')
time.sleep(1)
def waitLesson(meeting, start):
changePresence("waiting", "Ожидание", f"Ждём начала «{meeting}»", "Конференция не началась", start=start)
def onLesson(meeting, start):
changePresence("meeting", "Конференция", f"Слушаем «{meeting}»", "Идёт конференция", start=start)
def inMenu():
changePresence("menu", "Главное меню", "Открыт список опций", "В главном меню")
def shutdown(end):
changePresence("shutdown", "Выключение", "Отсчёт до авто-выключения", "Выключение ПК", end=end)
def sleepmode(end):
changePresence("shutdown", "Спящий режим", "Отсчёт до авто-засыпания", "Спящий режим ПК", end=end)
def inSettings():
changePresence("settings", "Настройки", "Открыты настройки", "В главном меню")
def inDebug():
changePresence("debug", "Отладка", "Открыто меню отладки", "В меню разработчика")
def inEditor():
changePresence("editor", "Редактор", "Открыт редактор", "В главном меню")
def inUpdater():
changePresence("updating", "Обновление", "Открыт центр обновлений", "В главном меню")
def inHelp():
changePresence("support", "Помощь", "Открыта помощь", "В главном меню")
def lessonEnded():
changePresence("waiting", "Ожидание", "Ждём указаний", "Все конференции закончились")
if __name__ == "__main__":
changePresence("settings", "Отладка", "Модуль Discord RPC запущен в режиме тестирования", "Режим отладки")

View File

@@ -1,12 +1,12 @@
import rpc import modules.rpc as rpc
import pathlib import pathlib
import shutil import shutil
from functions import * import telegram_send
#from daemon import from modules.functions import *
if getConfig("use_colors"): if getConfig("use_colors"):
from colors import * from modules.colors import *
appendLog('Colors imported') appendLog('Colors imported')
else: else:
RESET = '' RESET = ''
@@ -115,14 +115,14 @@ def settings():
clear() clear()
continue continue
elif settings_choose == '2': elif settings_choose == '2':
setConfig("use_colors", not getConfig("use_colors")) setConfig("use_colors", not getConfig("use_colors"))
appendLog(f'Changed option "use_colors" to {getConfig("use_colors")}') appendLog(f'Changed option "use_colors" to {getConfig("use_colors")}')
clear() clear()
continue continue
elif settings_choose == '3': elif settings_choose == '3':
if sysname == 'windows': if sysname == 'windows':
setConfig("run_fullscreen", not getConfig("run_fullscreen")) setConfig("run_fullscreen", not getConfig("run_fullscreen"))
@@ -130,7 +130,7 @@ def settings():
clear() clear()
continue continue
elif settings_choose == '4': elif settings_choose == '4':
setConfig("sounds", not getConfig("sounds")) setConfig("sounds", not getConfig("sounds"))
appendLog(f'Changed option "sounds" to {getConfig("sounds")}') appendLog(f'Changed option "sounds" to {getConfig("sounds")}')
@@ -152,6 +152,7 @@ def settings():
if obs_choice.lower() in yes_list: if obs_choice.lower() in yes_list:
while True: while True:
try: try:
import easygui
filename = easygui.fileopenbox('Выберите путь до obs32.exe или obs64.exe') filename = easygui.fileopenbox('Выберите путь до obs32.exe или obs64.exe')
if filename.find("obs64.exe") != -1: if filename.find("obs64.exe") != -1:
setConfig("obs_exe", filename) setConfig("obs_exe", filename)
@@ -174,25 +175,30 @@ def settings():
else: else:
easygui.msgbox("Неверный путь") easygui.msgbox("Неверный путь")
break break
except NameError:
appendLog(f'Module "easygui" is not imported')
none = input('Модуль "easygui" не импортирован.\n\n > ')
clear()
break
except Exception as exp: except Exception as exp:
appendLog(f'Could not select OBS path: {exp}') appendLog(f'Could not select OBS path: {exp}')
none = input('Вы не выбрали верный путь для OBS.\n\n > ') none = input('Вы не выбрали верный путь для OBS.\n\n > ')
clear() clear()
break break
appendLog(f'Changed option "obs_exe" to {getConfig("obs_exe")}') appendLog(f'Changed option "obs_exe" to {getConfig("obs_exe")}')
appendLog(f'Changed option "obs_core" to {getConfig("obs_core")}') appendLog(f'Changed option "obs_core" to {getConfig("obs_core")}')
clear() clear()
continue continue
elif settings_choose == '6': elif settings_choose == '6':
setConfig("shutdown_enabled", not getConfig("shutdown_enabled")) setConfig("shutdown_enabled", not getConfig("shutdown_enabled"))
appendLog(f'Changed option "shutdown_enabled" to {getConfig("shutdown_enabled")}') appendLog(f'Changed option "shutdown_enabled" to {getConfig("shutdown_enabled")}')
clear() clear()
continue continue
elif settings_choose == '7': elif settings_choose == '7':
clear() clear()
settings2() settings2()
@@ -202,7 +208,7 @@ def settings():
clear() clear()
setTitle("AutoZoom (Главная)", sysname) setTitle("AutoZoom (Главная)", sysname)
return return
except KeyboardInterrupt: except KeyboardInterrupt:
rpc.inMenu() rpc.inMenu()
clear() clear()
@@ -218,7 +224,7 @@ def settings2():
setTitle("AutoZoom (Настройки)", sysname) setTitle("AutoZoom (Настройки)", sysname)
clear() clear()
if getConfig("use_colors"): if getConfig("use_colors"):
color_val = f'{BGREEN}Вкл.{RESET}' color_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("use_colors"): elif not getConfig("use_colors"):
@@ -235,21 +241,21 @@ def settings2():
tg_var = f'{BRED}Не настроен{RESET}' tg_var = f'{BRED}Не настроен{RESET}'
else: else:
tg_var = f'{BRED}Не настроен{RESET}' tg_var = f'{BRED}Не настроен{RESET}'
if getConfig("telegram_enabled"): if getConfig("telegram_enabled"):
telegram_en_val = f'{BGREEN}Вкл.{RESET}' telegram_en_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("telegram_enabled"): elif not getConfig("telegram_enabled"):
telegram_en_val = f'{BRED}Выкл.{RESET}' telegram_en_val = f'{BRED}Выкл.{RESET}'
else: else:
telegram_en_val = f'{BRED}ERROR{RESET}' telegram_en_val = f'{BRED}ERROR{RESET}'
if getConfig("update_check"): if getConfig("update_check"):
update_val = f'{BGREEN}Вкл.{RESET}' update_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("update_check"): elif not getConfig("update_check"):
update_val = f'{BRED}Выкл.{RESET}' update_val = f'{BRED}Выкл.{RESET}'
else: else:
update_val = f'{BRED}ERROR{RESET}' update_val = f'{BRED}ERROR{RESET}'
shutdown_time_val = getConfig("shutdown_timeout") shutdown_time_val = getConfig("shutdown_timeout")
start_val = getConfig("start") start_val = getConfig("start")
stop_val = getConfig("stop") stop_val = getConfig("stop")
@@ -298,9 +304,9 @@ def settings2():
print(f'{RESET}Нужно использовать целое число.') print(f'{RESET}Нужно использовать целое число.')
time.sleep(2) time.sleep(2)
continue continue
continue continue
elif settings_choose == '2': elif settings_choose == '2':
if sysname == 'windows': if sysname == 'windows':
@@ -317,10 +323,10 @@ def settings2():
print(f'{RESET}Нужно использовать комбинацию клавиш в виде текста.') print(f'{RESET}Нужно использовать комбинацию клавиш в виде текста.')
time.sleep(2) time.sleep(2)
continue continue
clear() clear()
continue continue
elif settings_choose == '3': elif settings_choose == '3':
if sysname == 'windows': if sysname == 'windows':
@@ -337,18 +343,18 @@ def settings2():
print(f'{RESET}Нужно использовать комбинацию клавиш в виде текста.') print(f'{RESET}Нужно использовать комбинацию клавиш в виде текста.')
time.sleep(2) time.sleep(2)
continue continue
clear() clear()
continue continue
elif settings_choose == '4': elif settings_choose == '4':
setConfig("telegram_enabled", not getConfig("telegram_enabled")) setConfig("telegram_enabled", not getConfig("telegram_enabled"))
appendLog(f'Changed option "telegram_enabled" to {getConfig("telegram_enabled")}') appendLog(f'Changed option "telegram_enabled" to {getConfig("telegram_enabled")}')
clear() clear()
continue continue
elif settings_choose == '5': elif settings_choose == '5':
clear() clear()
@@ -367,30 +373,30 @@ def settings2():
except: except:
clear() clear()
continue continue
telegram_send.send(messages=[f"🎊 Конфигурация правильна, всё работает!"], parse_mode="markdown", conf=f"{files_folder}telegram.conf") telegram_send.send(messages=[f"🎊 Конфигурация правильна, всё работает!"], parse_mode="markdown", conf=f"{files_folder}telegram.conf")
appendLog('Telegram Send successfully configured') appendLog('Telegram Send successfully configured')
clear() clear()
continue continue
elif settings_choose == '6': elif settings_choose == '6':
setConfig("update_check", not getConfig("update_check")) setConfig("update_check", not getConfig("update_check"))
appendLog(f'Changed option "update_check" to {getConfig("update_check")}') appendLog(f'Changed option "update_check" to {getConfig("update_check")}')
clear() clear()
continue continue
elif settings_choose == '7': elif settings_choose == '7':
appendLog('Going to settings page 3') appendLog('Going to settings page 3')
clear() clear()
settings3() settings3()
elif settings_choose == '8': elif settings_choose == '8':
appendLog('Returned to settings page 1') appendLog('Returned to settings page 1')
clear() clear()
return return
except KeyboardInterrupt: except KeyboardInterrupt:
rpc.inMenu() rpc.inMenu()
clear() clear()
@@ -405,14 +411,21 @@ def settings3():
setTitle("AutoZoom (Настройки)", sysname) setTitle("AutoZoom (Настройки)", sysname)
clear() clear()
if getConfig("write_logs"): if getConfig("write_logs"):
logs_val = f'{BGREEN}Вкл.{RESET}' logs_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("write_logs"): elif not getConfig("write_logs"):
logs_val = f'{BRED}Выкл.{RESET}' logs_val = f'{BRED}Выкл.{RESET}'
else: else:
logs_val = f'{BRED}ERROR{RESET}' logs_val = f'{BRED}ERROR{RESET}'
if getConfig("remove_old"):
remove_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("remove_old"):
remove_val = f'{BRED}Выкл.{RESET}'
else:
remove_val = f'{BRED}ERROR{RESET}'
shutdown_time_val = getConfig("shutdown_timeout") shutdown_time_val = getConfig("shutdown_timeout")
start_val = getConfig("start") start_val = getConfig("start")
stop_val = getConfig("stop") stop_val = getConfig("stop")
@@ -425,13 +438,22 @@ def settings3():
print(f' {BRED}2.{RESET} Размер лога действий ({YELLOW}{str(getConfig("log_size"))} Кб{RESET})') print(f' {BRED}2.{RESET} Размер лога действий ({YELLOW}{str(getConfig("log_size"))} Кб{RESET})')
print(f' {BBLACK}Размер файла лога превышая который он будет упакован в архив\n') print(f' {BBLACK}Размер файла лога превышая который он будет упакован в архив\n')
print(f' {BRED}3.{RESET} Добавить в автозапуск') print(f' {BRED}3.{RESET} Задержка до записи OBS ({YELLOW}{str(getConfig("obs_delay"))} сек.{RESET})')
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Автоматически запускать демона при входе в систему\n') print(f' {BBLACK}Через сколько секунд будет отправлен сигнал записи экрана\n')
print(f' {BRED}4.{RESET} Сбросить все настройки') print(f' {BRED}4.{RESET} Добавить в автозапуск')
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Автоматически запускать демона при входе в систему\n')
print(f' {BRED}5.{RESET} Удалять старые конференции ({remove_val})')
print(f' {BBLACK}Автоматически удалять одноразовые конференции которые были до дня запуска\n')
print(f' {BRED}6.{RESET} Кастомизация звуков и RPC')
print(f' {BBLACK}Изменить звуковые файлы и APPLICATION ID используемого Discord RPC\n')
print(f' {BRED}7.{RESET} Сбросить все настройки')
print(f' {BBLACK}Восстановить настройки по умолчанию\n') print(f' {BBLACK}Восстановить настройки по умолчанию\n')
print(f' {BRED}5.{RESET} Назад') print(f' {BRED}8.{RESET} Назад')
print(f' {BBLACK}Вернуться на предыдущую страницу{RESET}\n') print(f' {BBLACK}Вернуться на предыдущую страницу{RESET}\n')
print(f' {BBLACK}Для переключения параметров Вкл/Выкл просто введите номер{RESET}') #\n Если окно приложения слишком мелкое - увеличьте его или листайте это меню{RESET}') print(f' {BBLACK}Для переключения параметров Вкл/Выкл просто введите номер{RESET}') #\n Если окно приложения слишком мелкое - увеличьте его или листайте это меню{RESET}')
@@ -453,11 +475,27 @@ def settings3():
print(f'{RESET}Нужно использовать целое число.') print(f'{RESET}Нужно использовать целое число.')
time.sleep(2) time.sleep(2)
continue continue
appendLog(f'Changed option "log_size" to {getConfig["log_size"]}') appendLog(f'Changed option "log_size" to {getConfig["log_size"]}')
continue continue
if settings_choose == '3': if settings_choose == '3':
try:
clear()
log_size_value = int(input(f'{RESET}Введите через сколько секунд отправлять сигнал записи:\n\n > {BRED}'))
setConfig("obs_delay", log_size_value)
continue
except:
clear()
print(f'{RESET}Нужно использовать целое число.')
time.sleep(2)
continue
appendLog(f'Changed option "obs_delay" to {getConfig["obs_delay"]}')
continue
if settings_choose == '4':
if sysname == "windows": if sysname == "windows":
@@ -468,18 +506,18 @@ def settings3():
shutil.copyfile('daemon.bat', 'startdaemon.bat') shutil.copyfile('daemon.bat', 'startdaemon.bat')
with open('startdaemon.bat', 'r') as f : with open('startdaemon.bat', 'r', encoding='utf-8') as f :
filedata = f.read() filedata = f.read()
filedata = filedata.replace('python daemon.py', f'python {path}\\daemon.py') filedata = filedata.replace('python daemon.py', f'python {path}\\daemon.py')
with open('startdaemon.bat', 'w') as f: with open('startdaemon.bat', 'w', encoding="utf-8") as f:
f.write(filedata) f.write(filedata)
f.close() f.close()
swl.create_lnk(f'{path}\\startdaemon.bat', f'{pathlib.Path.home()}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\AutoZoomDaemon.lnk') swl.create_lnk(f'{path}\\startdaemon.bat', f'{pathlib.Path.home()}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\AutoZoomDaemon.lnk')
appendLog('Autorun script added') appendLog('Autorun script added')
none = input(f'Демон AutoZoom был добавлен в автозапуск.\nПуть: {BRED}{pathlib.Path.home()}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\AutoZoomDaemon.lnk{RESET}\n\n > ') none = input(f'{RESET}Демон AutoZoom был добавлен в автозапуск.\nПуть: {BRED}{pathlib.Path.home()}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\AutoZoomDaemon.lnk{RESET}\n\n > ')
continue continue
except Exception as exp: except Exception as exp:
@@ -487,13 +525,22 @@ def settings3():
none = input(f'Не удалось добавить в автозапуск:\n{BRED}{exp}{RESET}\n\n > ') none = input(f'Не удалось добавить в автозапуск:\n{BRED}{exp}{RESET}\n\n > ')
appendLog(f'Could not add autorun: {exp}') appendLog(f'Could not add autorun: {exp}')
continue continue
continue continue
else: else:
continue continue
elif settings_choose == '5':
setConfig("remove_old", not getConfig("remove_old"))
appendLog(f'Changed option "remove_old" to {getConfig("remove_old")}')
elif settings_choose == '6':
appendLog('Going to customize page')
clear()
#customize()
elif settings_choose == '4': elif settings_choose == '7':
appendLog('Resetting configuration') appendLog('Resetting configuration')
while True: while True:
@@ -502,7 +549,7 @@ def settings3():
if reset_decision.lower() in yes_list: if reset_decision.lower() in yes_list:
from functions import default_config from modules.functions import default_config
saveJson(files_folder+'config.json', default_config) saveJson(files_folder+'config.json', default_config)
appendLog('Configuration dropped to default') appendLog('Configuration dropped to default')
@@ -521,17 +568,17 @@ def settings3():
else: else:
clear() clear()
continue continue
continue continue
clear() clear()
continue continue
elif settings_choose == '5': elif settings_choose == '8':
appendLog('Returned to settings page 2') appendLog('Returned to settings page 2')
clear() clear()
return return
except KeyboardInterrupt: except KeyboardInterrupt:
rpc.inMenu() rpc.inMenu()
clear() clear()

27
modules/telegram.py Normal file
View File

@@ -0,0 +1,27 @@
import time
import requests
from modules.functions import configGet, configSet
def telegramSendText(message, force=False, token=configGet("token", "telegram")):
if configGet("enabled", "telegram") or force:
try:
requests.post(f'https://api.telegram.org/bot{token}/sendMessage?chat_id={configGet("user_id", "telegram")}&text={message}&parse_mode=markdown')
except:
pass
def telegramLink(token):
try:
code =
while True:
answer = requests.post(f"https://api.telegram.org/bot{token}/getUpdates").json()
for entry in answer["result"]:
if "message" in entry:
if str(code) in entry["message"]["text"]:
telegramSendText("Бот успешно привязан к AutoZoom!", force=True, token=token)
configSet("user_id", entry["message"]["from"]["id"], "telegram")
print(f"Бот успешно привязан к аккаунту {entry['message']['from']['first_name']}!")
return {"success": True, "user_id": entry["message"]["from"]["id"]}
time.sleep(1)
except KeyboardInterrupt:
return {"success": False, "user_id": None}

247
rpc.py
View File

@@ -1,247 +0,0 @@
# -*- coding: utf-8 -*-
import time
import os
import sys
from colors import *
from functions import *
version = '2.1'
import libinstaller
from pypresence import Presence
client_id = '800049969960058882'
RPC = Presence(client_id,pipe=0)
connected = False
if getConfig("use_rpc") and getOS != "android":
try:
RPC.connect()
connected = True
except:
pass
else:
connected = False
def disconnect():
global connected
if getConfig("use_rpc") and getOS != "android":
try:
RPC.close()
connected = False
appendLog('Discord RPC disconnected')
except:
appendLog('Discord RPC failed to disconnect')
def connect():
global connected
try:
RPC.connect()
connected = True
appendLog('Discord RPC connected')
except:
appendLog('Discord RPC failed to connect')
def reset():
if getConfig("use_rpc") and getOS != "android":
RPC.clear()
appendLog('Discord RPC status cleared')
def waitLesson(lesson, start):
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_waiting', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Ожидание', state=f'Ждём начала «{lesson}»', details='Конференция не началась', start=start)
appendLog(f'Discord RPC changed to waitLesson (Lesson: {lesson}, Start: {start})')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def onLesson(lesson, start):
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_lesson', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Конференция', state=f'Слушаем «{lesson}»', details='Идёт конференция', start=start)
appendLog(f'Discord RPC changed to onLesson (Lesson: {lesson}, Start: {start})')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def inMenu():
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_menu', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Главное меню', state='Открыт список опций', details='В главном меню')
appendLog('Discord RPC changed to inMenu')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def shutdown(end):
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_shutdown', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Выключение', state='Отсчёт до авто-выключения', details='Выключение ПК', end=end)
appendLog(f'Discord RPC changed to shutdown (End: {end})')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def inSettings():
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_settings', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Настройки', state='Открыты настройки', details='В главном меню')
appendLog('Discord RPC changed to inSettings')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def inDebug():
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_debug', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Отладка', state='Открыто меню отладки', details='В меню разработчика')
appendLog('Discord RPC changed to inDebug')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def inEditor():
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_editing', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Редактор', state='Открыт редактор', details='В главном меню')
appendLog('Discord RPC changed to inEditor')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def inUpdater():
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_updating', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Обновление', state='Открыт центр обновлений', details='В главном меню')
appendLog('Discord RPC changed to inUpdater')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def inHelp():
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_support', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Помощь', state='Открыта помощь', details='В главном меню')
appendLog('Discord RPC changed to inHelp')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
def lessonEnded():
try:
if getConfig("use_rpc") and getOS != "android":
if connected == False:
connect()
RPC.update(large_image='1024_cover', small_image='status_waiting', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Ожидание', state=f'Ждём указаний', details='Все конференции закончились')
appendLog('Discord RPC changed to lessonEnded')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
except AssertionError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)
if __name__ == "__main__":
try:
RPC.connect()
RPC.update(large_image='1024_cover', small_image='status_settings', large_text=f'AutoZoom • v{version}\nhttp://bit.ly/auto_zoom', small_text='Отладка', state='Модуль Discord RPC запущен в режиме тестирования', details='Режим отладки')
appendLog('Discord RPC changed to debug')
except AttributeError:
appendLog('Discord RPC failed to change status')
if getConfig("debug"):
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
time.sleep(1)

View File

@@ -1,3 +1,3 @@
echo AutoZoom needs Python 3 to work. Please read README.md! echo AutoZoom needs Python 3 to work. Please read README.md!
python main.py python3 main.py
pause pause

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/bin/bash
echo "AutoZoom needs Python 3 to work. Please read README.md!" echo "AutoZoom needs Python 3 to work. Please read README.md!"
python3 main.py python3 main.py

10
themes/dark.json Normal file
View File

@@ -0,0 +1,10 @@
{
"windows": {
"foreground": "7",
"background": "0"
},
"linux": {
"foreground": "white",
"background": "black"
}
}

10
themes/light.json Normal file
View File

@@ -0,0 +1,10 @@
{
"windows": {
"foreground": "0",
"background": "f"
},
"linux": {
"foreground": "black",
"background": "white"
}
}